Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

Roll buttons missing in Firefox

1456790357
Ada L.
Marketplace Creator
Sheet Author
API Scripter
My players and I are experiencing an issue with roll buttons not showing up on character sheets in Firefox. We're using a custom sheet that I've made for our game system, but I don't think that the HTML or CSS itself is the issue. When I inspect the repeating item elements in the Firefox debugging tools, the roll button element just isn't there at all in the DOM tree. So it's not like there's just some funny styling going on that is "hiding" the buttons. Here are some screenshots to illustrate my issue: Chrome: The roll buttons appear just fine. Firefox: The buttons are not present, not even in the DOM. The section of HTML for the roll buttons:
1456813612
Pat S.
Forum Champion
Sheet Author
Sorry you are having problems with the sheet but let's do a quick run through to collect some information. Could you please carefully work through the first three steps of our guide to Solving Technical Issues ? Step 1: Make sure to use the right browser Please check if these issues persist when using both Chrome and Firefox. Step 2: Ensure that there are no extensions/addons interfering with Roll20 Please disable all add-ons/extensions and anti-virus programs. Step 3: Clear your cache If none of the above succeeds, please thoroughly work through Step 4 . (Don't forget the complete Console Log!)
1457137986
Ada L.
Marketplace Creator
Sheet Author
API Scripter
I don't know what specs my players have (the ones using Firefox are having the same issue), but here's all my Firefox information for Step 4: Web Browser: Firefox Browser Version:39.0 Operating system: Windows 7 Javascript: enabled Anti-virus: AVG Free Extensions/plugins: none Console Log: "Someone just connected." app.js:42:28577 "It's us?" app.js:42:28679 mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create opentok.min.js:52:7278 70 app.js:29:19079 "TOUCH SUPPORTED: false" app.js:30:11283 "USING WEBGL ACCELERATION..." app.js:30:12104 "WEBGL STARTUP SUCCESS" app.js:30:12693 Use of getPreventDefault() is deprecated. &nbsp;Use defaultPrevented instead. jquery.min.js:2:0 "select" app.js:25:2160 "Switch mode to select" app.js:25:4006 "Initializing new dice engine with randomness..." app.js:40:23922 "Using random entropy" app.js:40:23999 "Compiling sheet..." app.js:43:22742 "Found webworker script" app.js:43:23564 Loading mixed (insecure) display content "<a href="http://imgsrv.roll20.net/?src=th03.deviantart.net/fs70/PRE/i/2015/012/7/d/vault_filly_by_cazra-d8doquo.png" rel="nofollow">http://imgsrv.roll20.net/?src=th03.deviantart.net/fs70/PRE/i/2015/012/7/d/vault_filly_by_cazra-d8doquo.png</a>" on a secure page[Learn More] jquery.min.js:2:0 Loading mixed (insecure) display content "<a href="http://imgsrv.roll20.net/?src=neonairgames.net/img/vaultFilly/VaultFilly_bloodied.png" rel="nofollow">http://imgsrv.roll20.net/?src=neonairgames.net/img/vaultFilly/VaultFilly_bloodied.png</a>" on a secure page[Learn More] jquery.min.js:2:0 Loading mixed (insecure) display content "<a href="http://imgsrv.roll20.net/?src=neonairgames.net/img/vaultFilly/VaultFilly_critical.png" rel="nofollow">http://imgsrv.roll20.net/?src=neonairgames.net/img/vaultFilly/VaultFilly_critical.png</a>" on a secure page[Learn More] jquery.min.js:2:0 Loading mixed (insecure) display content "<a href="http://imgsrv.roll20.net/?src=neonairgames.net/img/vaultFilly/VaultFilly_sidelined.png" rel="nofollow">http://imgsrv.roll20.net/?src=neonairgames.net/img/vaultFilly/VaultFilly_sidelined.png</a>" on a secure page[Learn More] jquery.min.js:2:0 "Finding sheet rolls..." app.js:43:23989 Use of getAttributeNode() is deprecated. Use getAttribute() instead. jquery.min.js:2:0 "SHEET ERROR: Specified a disabled input without a valid formula in the value attribute." app.js:43:25881 Use of attributes' nodeValue attribute is deprecated. Use value instead. app.js:43:0 "window resize" app.js:45:4725 "Final set zoom!" app.js:30:25405 "UPDATE GL SIZE!" app.js:30:5833 "Final set zoom!" app.js:30:25405 "tuts loaded" tutorial_tips.js:7:2 "Starting up WEB WORKER" sheetsandboxworker.js:210:2 "Final page load." app.js:36:10927 "Refresh jukebox List!" app.js:45:9217 "Auth'ed." app.js:35:23932 "Go post auth!" app.js:35:24129 "initial setup" app.js:35:24274 "Refresh jukebox List!" app.js:45:9217 "Heard playingplaylist change to -K-9dFp-Vjo4JNstjAX2" app.js:36:9759 "-K9FTazU43OYVVrvT_cn" app.js:36:10468 "PLAYING TRACK" app.js:36:10513 "Refresh jukebox List!" app.js:45:9217 "Got players value..." app.js:35:24516 "joining game..." app.js:35:31024 "Player -JZkphs0i4eeouqQ5eNp is offline..." app.js:34:5935 "Global Volume: 0=0" app.js:34:13265 "Player -JeqwI_lkhn6awvsRTyv is offline..." app.js:34:5935 "Player -JfPo25zZbJYvLIwXGpN is offline..." app.js:34:5935 "Player -JfQbiZZIkh6qysWXqss is offline..." app.js:34:5935 "Player -JfQsZW7jHDBLsvwhoUR is offline..." app.js:34:5935 "Player -Jfz4SYGBDYSfilq1zfC is offline..." app.js:34:5935 "Player -Jfz5n8qBS5dd2bO0tEX is offline..." app.js:34:5935 "Player -Jhff7gVv1xokptBdEhI is offline..." app.js:34:5935 "Player -Jm5xkHK6wpQEbAzx4Ft is offline..." app.js:34:5935 "Deferred finish joining..." app.js:35:31114 "Firebase Online" app.js:29:20385 "refershing page listings!" app.js:38:30199 "Refresh jukebox List!" app.js:45:9217 "Full load page!" app.js:33:14013 "We have 37 pages" app.js:35:25319 "Scan for new plays!" app.js:36:8423 "handle page changes" app.js:35:25859 false app.js:35:25940 "initiatlizing video chat" app.js:42:25157 "Connecting to WebRTC" app.js:42:25675 "Refresh jukebox List!" app.js:45:9217 Loading mixed (insecure) display content "<a href="http://api.soundcloud.com/tracks/225341472/stream?client_id=bbee575fe431e873910d2a874e013989" rel="nofollow">http://api.soundcloud.com/tracks/225341472/stream?client_id=bbee575fe431e873910d2a874e013989</a>" on a secure page[Learn More] editor "Do refresh link cache!" app.js:32:6623 "refershing page listings!" app.js:38:30199 "init active page!" app.js:35:30025 "activate page!" app.js:33:16175 "FULLY ACTIVATE VIEWS FOR PAGE." app.js:33:16407 "Refresh Journal List!" app.js:43:6586 "Search took 18ms" app.js:43:5438 "Descending into madness..." app.js:40:18416 "Graphics: 1" app.js:33:15354 "Paths: 1" app.js:33:15550 "refershing page listings!" app.js:38:30199 "Reorder by ZORDER" app.js:33:19019 "Swapping <a href="https://s3.amazonaws.com/files.d20.io/images/15781376/Dbm6Dvp94PxrVF2exi05Rg/med.jpg?14541293855" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/15781376/Dbm6Dvp94PxrVF2exi05Rg/med.jpg?14541293855</a> to <a href="https://s3.amazonaws.com/files.d20.io/images/15781376/Dbm6Dvp94PxrVF2exi05Rg/max.jpg?14541293855" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/15781376/Dbm6Dvp94PxrVF2exi05Rg/max.jpg?14541293855</a>" app.js:32:30287 "Reorder by ZORDER" app.js:33:19019 "setting src" app.js:32:30448 "window resize" app.js:45:4725 "Final set zoom!" app.js:30:25405 "UPDATE GL SIZE!" app.js:30:5833 "Final set zoom!" app.js:30:25405 "Connected to session" app.js:42:27269 "Someone just connected." app.js:42:28577 "It's us?" app.js:42:28679 "Show Character View Dialog!" app.js:37:5164 "--- RENDER CHARACTIVE VIEW ----" app.js:36:25454 "CLICKED" app.js:36:21541 "Redoing charsheet html" app.js:36:27542 "71ms to end of html" app.js:36:28121 "Really updating character sheet values" app.js:36:28229 "Setting up repeating sections took until 39ms" app.js:36:30292 "Updating ALL VALUES" app.js:36:31262 "Finding list of dirty attributes took until 41ms" app.js:36:31463 "Querytest took until 42ms" app.js:36:31752 "Set values took until 270ms" app.js:37:1236 "Appending to sheetform" app.js:37:1351 "Appending to screen took until 275ms" app.js:37:1429 "Took 276ms" app.js:37:1542 "Really updating character sheet values" app.js:36:28229 "Setting up repeating sections took until 5ms" app.js:36:30292 "Finding list of dirty attributes took until 6ms" app.js:36:31463 "Querytest took until 8ms" app.js:36:31752 "Set values took until 12ms" app.js:37:1236 "Took 13ms" app.js:37:1542 "CLICKED" app.js:36:21541 Loading mixed (insecure) display content "<a href="http://imgsrv.roll20.net/?src=i336.photobucket.com/albums/n346/Hymnodi/Useful%2520stuff/FALLOUT2.png" rel="nofollow">http://imgsrv.roll20.net/?src=i336.photobucket.com/albums/n346/Hymnodi/Useful%2520stuff/FALLOUT2.png</a>" on a secure page[Learn More] jquery.min.js:2:0 GET&nbsp; <a href="http://imgsrv.roll20.net/" rel="nofollow">http://imgsrv.roll20.net/</a> [Mixed Content] [HTTP/1.1 200 OK 629ms] "CLICKED"
1457138001

Edited 1457138785
Ada L.
Marketplace Creator
Sheet Author
API Scripter
The line&nbsp; "SHEET ERROR: Specified a disabled input without a valid formula in the value attribute." app.js:43:25881 looks suspicious. The same error appears in the Chrome console log though, but the roll buttons work fine. I realized that error message isn't related. That was just because the name field was a read-only &lt;input&gt; element, instead of using the new read-only &lt;span&gt; fields. I changed the name field to a read-only &lt;span&gt; field and that fixed that error message. The issue with the missing roll buttons on Firefox persists though.
1457159531
Lithl
Pro
Sheet Author
API Scripter
It is far more likely that there's an issue in the CSS causing a hiccup in one browser over another than the problem being in the HTML. Sharing your CSS would be helpful.
1457192385

Edited 1457192455
Ada L.
Marketplace Creator
Sheet Author
API Scripter
Here is my HTML: &lt;div class="all"&gt; &lt;div class="statsHeader"&gt; &lt;div class="cornerNW"&gt;&lt;/div&gt; &lt;div style="width:50px;"&gt; &lt;div class="borderTitle"&gt;STATS&lt;/div&gt; &lt;/div&gt; &lt;div class="cornerNE"&gt; &lt;div class="labelLeft"&gt;XP Spent:&lt;/div&gt; &lt;div class="xp_fields flowLayout"&gt; &lt;span name="attr_xpSpent"&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="cornerNE"&gt; &lt;div class="labelLeft"&gt;Fortitude&lt;/div&gt; &lt;div class="flowLayout"&gt; &lt;input type="number" class="shortNum" name="attr_fortitude"/&gt;/ &lt;span name="attr_fortitude_max"&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="cornerNE"&gt; &lt;div class="labelLeft"&gt;Willpower&lt;/div&gt; &lt;div class="sheet-flowLayout"&gt; &lt;input type="number" name="attr_willpower"/&gt;/ &lt;span name="attr_willpower_max"&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="cornerNE"&gt; &lt;div class="labelLeft"&gt;Valor&lt;/div&gt; &lt;div class="sheet-flowLayout"&gt; &lt;input type="number" name="attr_valor"/&gt;/ &lt;span name="attr_valor_max"&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="tabContainer"&gt; &lt;!--This is just used to reserve space for the tabs' contents, which are asolutely positioned to here.--&gt; &lt;/div&gt; &lt;div class="tabsFooter"&gt; &lt;div class="cornerSW"&gt;&lt;/div&gt; &lt;input type="radio" class="tabRadio" name="tab" id="sheet-tab_special" checked&gt; &lt;div class="tab"&gt; &lt;label for="sheet-tab_special"&gt;S.P.E.C.I.A.L.&lt;/label&gt; &lt;/div&gt; &lt;div class="tabContents special"&gt; &lt;div class="sheet-2colrow"&gt; &lt;div class="sheet-col statusImage"&gt; &lt;input type="radio" name="attr_statusImage" value="healthy" checked&gt; &lt;img src="<a href="http://th03.deviantart.net/fs70/PRE/i/2015/012/7/d/vault_filly_by_cazra-d8doquo.png" rel="nofollow">http://th03.deviantart.net/fs70/PRE/i/2015/012/7/d/vault_filly_by_cazra-d8doquo.png</a>"&gt; &lt;input type="radio" name="attr_statusImage" value="bloodied"&gt; &lt;img src="<a href="http://neonairgames.net/img/vaultFilly/VaultFilly_bloodied.png" rel="nofollow">http://neonairgames.net/img/vaultFilly/VaultFilly_bloodied.png</a>"&gt; &lt;input type="radio" name="attr_statusImage" value="critical"&gt; &lt;img src="<a href="http://neonairgames.net/img/vaultFilly/VaultFilly_critical.png" rel="nofollow">http://neonairgames.net/img/vaultFilly/VaultFilly_critical.png</a>"&gt; &lt;input type="radio" name="attr_statusImage" value="sidelined"&gt; &lt;img src="<a href="http://neonairgames.net/img/vaultFilly/VaultFilly_sidelined.png" rel="nofollow">http://neonairgames.net/img/vaultFilly/VaultFilly_sidelined.png</a>"&gt; &lt;/div&gt; &lt;div class="sheet-col statsPanel"&gt; &lt;div class="panel"&gt; &lt;h2&gt;General&lt;/h2&gt; &lt;div class="field"&gt; &lt;label&gt;Name&lt;/label&gt;&lt;span name="attr_character_name"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class="field"&gt; &lt;label&gt;Race&lt;/label&gt;&lt;input type="text" name="attr_race"/&gt; &lt;/div&gt; &lt;div class="field"&gt; &lt;label&gt;Guiding Element&lt;/label&gt; &lt;select name="attr_guiding_elem"&gt; &lt;option value="def"&gt;Select&lt;/option&gt; &lt;option value="generosity"&gt;Generosity&lt;/option&gt; &lt;option value="honesty"&gt;Honesty&lt;/option&gt; &lt;option value="kindness"&gt;Kindness&lt;/option&gt; &lt;option value="laughter"&gt;Laughter&lt;/option&gt; &lt;option value="loyalty"&gt;Loyalty&lt;/option&gt; &lt;option value="magic"&gt;Magic&lt;/option&gt; &lt;/select&gt; &lt;/div&gt; &lt;div class="field"&gt; &lt;label&gt;Fatal Flaw&lt;/label&gt;&lt;input type="text" name="attr_flaw"&gt; &lt;/div&gt; &lt;div class="field"&gt; &lt;label&gt;Background Theme&lt;/label&gt;&lt;input type="text" name="attr_bgTheme"&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="panel"&gt; &lt;h2&gt;Attributes&lt;/h2&gt; &lt;div class="primaryAttr"&gt; &lt;div class="label"&gt; MIND &lt;/div&gt; &lt;div&gt; &lt;input type="number" name="attr_mind" value="1" /&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="primaryAttr"&gt; &lt;div class="label"&gt; BODY &lt;/div&gt; &lt;div&gt; &lt;input type="number" name="attr_body" value="1" /&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="primaryAttr"&gt; &lt;div class="label"&gt; HEART &lt;/div&gt; &lt;div&gt; &lt;input type="number" name="attr_heart" value="1" /&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="panel"&gt; &lt;h2&gt;Description&lt;/h2&gt; &lt;textarea name="attr_description" rows="4"&gt;&lt;/textarea&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="spacer"&gt;&lt;/div&gt; &lt;input type="radio" class="tabRadio" name="tab" id="sheet-tab_skills"&gt; &lt;div class="tab"&gt; &lt;label for="sheet-tab_skills"&gt;SKILLS/PERKS&lt;/label&gt; &lt;/div&gt; &lt;div class="tabContents skills"&gt; &lt;div class="sheet-2colrow stretchY relativePos"&gt; &lt;!-- Skills --&gt; &lt;div class="col stretchY scrollingY overflowX"&gt; &lt;h2&gt;SKILLS&lt;/h2&gt; &lt;div class="panel skillsList"&gt; &lt;h2&gt;MIND&lt;/h2&gt; &lt;div class="table"&gt; &lt;fieldset name="skillsMind" class="repeating_skillsMind"&gt; &lt;!--A div is created for each instance which we can use as a row.--&gt; &lt;div class="tableRow"&gt; &lt;div&gt; &lt;input type="text" name="attr_skillM"/&gt; &lt;/div&gt; &lt;div class="rankBox trained" title="Trained"&gt; &lt;input type="checkbox" name="attr_skillMT" value="1"/&gt; &lt;div&gt;T&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox improved" title="Improved"&gt; &lt;input type="checkbox" name="attr_skillMI" value="1"/&gt; &lt;div&gt;I&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox greater" title="Greater"&gt; &lt;input type="checkbox" name="attr_skillMG" value="1"/&gt; &lt;div&gt;G&lt;/div&gt; &lt;/div&gt; &lt;div class="rollSkill"&gt; &lt;input class="skillMod" type="number" name="attr_skillMAdv" value="0" title="Advantages"/&gt; &lt;input class="skillMod" type="number" name="attr_skillMDis" value="0" title="Drawbacks"/&gt; &lt;input class="skillMod" type="number" name="attr_skillMMisc" value="0" title="Misc. Modifier"/&gt; &lt;button type="roll" value="!r @{skillM}"&gt;&lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="conditionalMods"&gt; &lt;span&gt;Conditional Modifiers:&lt;/span&gt; &lt;input type="text" name="attr_skillMConds" /&gt; &lt;/div&gt; &lt;/fieldset&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="panel skillsList"&gt; &lt;h2&gt;BODY&lt;/h2&gt; &lt;div class="table"&gt; &lt;fieldset name="skillsBody" class="repeating_skillsBody"&gt; &lt;!--A div is created for each instance which we can use as a row.--&gt; &lt;div class="tableRow"&gt; &lt;div&gt; &lt;input type="text" name="attr_skillB"/&gt; &lt;/div&gt; &lt;div class="rankBox trained" title="Trained"&gt; &lt;input type="checkbox" name="attr_skillBT" value="1"/&gt; &lt;div&gt;T&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox improved" title="Improved"&gt; &lt;input type="checkbox" name="attr_skillBI" value="1"/&gt; &lt;div&gt;I&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox greater" title="Greater"&gt; &lt;input type="checkbox" name="attr_skillBG" value="1"/&gt; &lt;div&gt;G&lt;/div&gt; &lt;/div&gt; &lt;div class="rollSkill"&gt; &lt;input class="skillMod" type="number" name="attr_skillBAdv" value="0" title="Advantages"/&gt; &lt;input class="skillMod" type="number" name="attr_skillBDis" value="0" title="Drawbacks"/&gt; &lt;input class="skillMod" type="number" name="attr_skillBMisc" value="0" title="Misc. Modifier"/&gt; &lt;button type="roll" value="!r @{skillB}"&gt;&lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="conditionalMods"&gt; &lt;span&gt;Conditional Modifiers:&lt;/span&gt; &lt;input type="text" name="attr_skillBConds" /&gt; &lt;/div&gt; &lt;/fieldset&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="panel skillsList"&gt; &lt;h2&gt;HEART&lt;/h2&gt; &lt;div class="table"&gt; &lt;fieldset name="skillsHeart" class="repeating_skillsHeart"&gt; &lt;!--A div is created for each instance which we can use as a row.--&gt; &lt;div class="tableRow"&gt; &lt;div&gt; &lt;input type="text" name="attr_skillH"/&gt; &lt;/div&gt; &lt;div class="rankBox trained" title="Trained"&gt; &lt;input type="checkbox" name="attr_skillHT" value="1"/&gt; &lt;div&gt;T&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox improved" title="Improved"&gt; &lt;input type="checkbox" name="attr_skillHI" value="1"/&gt; &lt;div&gt;I&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox greater" title="Greater"&gt; &lt;input type="checkbox" name="attr_skillHG" value="1"/&gt; &lt;div&gt;G&lt;/div&gt; &lt;/div&gt; &lt;div class="rollSkill"&gt; &lt;input class="skillMod" type="number" name="attr_skillHAdv" value="0" title="Advantages"/&gt; &lt;input class="skillMod" type="number" name="attr_skillHDis" value="0" title="Drawbacks"/&gt; &lt;input class="skillMod" type="number" name="attr_skillHMisc" value="0" title="Misc. Modifier"/&gt; &lt;button type="roll" value="!r @{skillH}"&gt;&lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="conditionalMods"&gt; &lt;span&gt;Conditional Modifiers:&lt;/span&gt; &lt;input type="text" name="attr_skillHConds" /&gt; &lt;/div&gt; &lt;/fieldset&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;!-- Edges --&gt; &lt;div class="col stretchY scrollingY"&gt; &lt;h2&gt;PERKS&lt;/h2&gt; &lt;div class="panel edgesList"&gt; &lt;h2&gt;Built-in&lt;/h2&gt; &lt;div class="table"&gt; &lt;div class="tableRow"&gt; &lt;div&gt; Determined &lt;/div&gt; &lt;div class="rankBox trained" title="Taken"&gt; &lt;input type="checkbox" name="attr_edgeDetermined" value="1"/&gt; &lt;div&gt;T&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox improved" title="Improved"&gt; &lt;input type="checkbox" name="attr_edgeDeterminedI" value="1"/&gt; &lt;div&gt;I&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox greater" title="Greater"&gt; &lt;input type="checkbox" name="attr_edgeDeterminedG" value="1"/&gt; &lt;div&gt;G&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="tableRow"&gt; &lt;div&gt; Vitality &lt;/div&gt; &lt;div class="rankBox trained" title="Taken"&gt; &lt;input type="checkbox" name="attr_edgeVitality" value="1"/&gt; &lt;div&gt;T&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox improved" title="Improved"&gt; &lt;input type="checkbox" name="attr_edgeVitalityI" value="1"/&gt; &lt;div&gt;I&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox greater" title="Greater"&gt; &lt;input type="checkbox" name="attr_edgeVitalityG" value="1"/&gt; &lt;div&gt;G&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="tableRow"&gt; &lt;div&gt; Noble Soul &lt;/div&gt; &lt;div class="rankBox trained" title="Taken"&gt; &lt;input type="checkbox" name="attr_edgeNobleSoul" value="1"/&gt; &lt;div&gt;T&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox improved" title="Improved"&gt; &lt;input type="checkbox" name="attr_edgeNobleSoulI" value="1"/&gt; &lt;div&gt;I&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox greater" title="Greater"&gt; &lt;input type="checkbox" name="attr_edgeNobleSoulG" value="1"/&gt; &lt;div&gt;G&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="panel edgesList"&gt; &lt;h2&gt;Custom&lt;/h2&gt; &lt;div class="table"&gt; &lt;fieldset name="edges" class="repeating_edges"&gt; &lt;!--A div is created for each instance which we can use as a row.--&gt; &lt;div class="tableRow"&gt; &lt;div&gt; &lt;input type="text" name="attr_edge"/&gt; &lt;/div&gt; &lt;div class="rankBox trained" title="Taken"&gt; &lt;input type="checkbox" name="attr_edgeT" value="1"/&gt; &lt;div&gt;T&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox improved" title="Improved"&gt; &lt;input type="checkbox" name="attr_edgeI" value="1"/&gt; &lt;div&gt;I&lt;/div&gt; &lt;/div&gt; &lt;div class="rankBox greater" title="Greater"&gt; &lt;input type="checkbox" name="attr_edgeG" value="1"/&gt; &lt;div&gt;G&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/fieldset&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="spacer"&gt;&lt;/div&gt; &lt;input type="radio" class="tabRadio" name="tab" id="sheet-tab_perks"&gt; &lt;div class="tab"&gt; &lt;label for="sheet-tab_perks"&gt;MAGIC&lt;/label&gt; &lt;/div&gt; &lt;div class="tabContents magic"&gt; &lt;div class="stretchY scrollingY"&gt; &lt;div class="spellsList"&gt; &lt;fieldset name="spells" class="repeating_spells"&gt; &lt;div class="panel"&gt; &lt;div style="display: inline-block;"&gt; &lt;div class="rankBox" title="Prepared?"&gt; &lt;input type="checkbox" name="attr_spellPrepared"/&gt; &lt;div&gt;P&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="display: inline-block; vertical-align: text-top; width: 90%;"&gt; &lt;h2&gt; &lt;input type="text" name="attr_spellName" placeholder="Spell name"/&gt; Lv. &lt;input type="number" name="attr_spellLevel" disabled="true" value="(@{spellTarget} + @{spellRange} + @{spellDuration} + @{spellEffectsTotal} + @{spellSubjectsTotal})"/&gt; &lt;/h2&gt; &lt;div class="spellBody"&gt; Target: &lt;select name="attr_spellTarget"&gt; &lt;option value=1&gt;Individual&lt;/option&gt; &lt;option value=2&gt;Group&lt;/option&gt; &lt;option value=4&gt;Area&lt;/option&gt; &lt;option value=8&gt;Mass&lt;/option&gt; &lt;/select&gt; Range: &lt;select name="attr_spellRange"&gt; &lt;option value=1&gt;Contact&lt;/option&gt; &lt;option value=2&gt;Seen&lt;/option&gt; &lt;option value=4&gt;Known&lt;/option&gt; &lt;option value=8&gt;Unknown&lt;/option&gt; &lt;/select&gt; Duration: &lt;select name="attr_spellDuration"&gt; &lt;option value=1&gt;Immediate&lt;/option&gt; &lt;option value=2&gt;Sustained&lt;/option&gt; &lt;option value=4&gt;Temporary&lt;/option&gt; &lt;option value=8&gt;Persistent&lt;/option&gt; &lt;/select&gt; &lt;br/&gt; &lt;div style="display: inline-block;"&gt; Effects: &lt;/div&gt; &lt;div style="display: inline-block; vertical-align: text-top;"&gt; &lt;input type="hidden" name="attr_spellEffectsTotal" disabled="true" value="(@{spellAnimate} + @{spellCombine} + @{spellDeceive} + @{spellDiminish} + @{spellForge} + @{spellModify} + @{spellReveal} + @{spellSeparate})"/&gt; &lt;table class="layoutTable"&gt; &lt;tr&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellAnimate" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Animate &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellCombine" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Combine &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellDeceive" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Deceive &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellDiminish" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Diminish &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellForge" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Forge &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellModify" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Modify &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellReveal" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Reveal &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellSeparate" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Separate &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/div&gt; &lt;br/&gt; &lt;div style="display: inline-block;"&gt; Subjects: &lt;/div&gt; &lt;div style="display: inline-block; vertical-align: text-top;"&gt; &lt;input type="hidden" name="attr_spellSubjectsTotal" disabled="true" value="(@{spellAir} + @{spellAnimal} + @{spellBody} + @{spellConstruct} + @{spellEarth} + @{spellEnergy} + @{spellForce} + @{spellHeat} + @{spellLight} + @{spellMagic} + @{spellMind} + @{spellPlant} + @{spellShadow} + @{spellSound} + @{spellSpace} + @{spellTime} + @{spellWater} + @{spellWeather})"/&gt; &lt;table class="layoutTable"&gt; &lt;tr&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellAir" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Air &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellAnimal" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Animal &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellBody" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Body &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellConstruct" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Construct &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellEarth" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Earth &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellEnergy" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Energy &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellForce" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Force &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellHeat" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Heat &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellLight" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Light &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellMagic" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Magic &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellMind" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Mind &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellPlant" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Plant &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellShadow" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Shadow &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellSound" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Sound &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellSpace" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Space &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellTime" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Time &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellWater" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Water &lt;/td&gt; &lt;td&gt; &lt;div class="rankBox"&gt; &lt;input type="checkbox" name="attr_spellWeather" value="1"/&gt; &lt;div&gt; &lt;/div&gt; &lt;/div&gt; Weather &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/div&gt; &lt;!-- End effects and subjects --&gt; &lt;textarea name="attr_spellDescription" rows="3" placeholder="Spell description"&gt;&lt;/textarea&gt; &lt;/div&gt; &lt;!-- End spellBody --&gt; &lt;/div&gt; &lt;/div&gt; &lt;!-- End panel --&gt; &lt;/fieldset&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="spacer"&gt;&lt;/div&gt; &lt;input type="radio" class="tabRadio" name="tab" id="sheet-tab_inventory"&gt; &lt;div class="tab"&gt; &lt;label for="sheet-tab_inventory"&gt;INVENTORY&lt;/label&gt; &lt;/div&gt; &lt;div class="tabContents inventory"&gt; &lt;div class="panel"&gt; &lt;div class="field caps"&gt; &lt;label&gt;Caps&lt;/label&gt; &lt;input type="number" name="attr_caps"&gt; &lt;/div&gt; &lt;label&gt;Equipped&lt;/label&gt; &lt;textarea rows="6" name="attr_equipped"&gt;&lt;/textarea&gt; &lt;label&gt;Inventory&lt;/label&gt; &lt;textarea rows="12" name="attr_inventory"&gt;&lt;/textarea&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="spacer"&gt;&lt;/div&gt; &lt;input type="radio" class="tabRadio" name="tab" id="sheet-tab_general"&gt; &lt;div class="tab"&gt; &lt;label for="sheet-tab_general"&gt;GENERAL&lt;/label&gt; &lt;/div&gt; &lt;div class="tabContents general"&gt; &lt;div class="panel"&gt; &lt;div class="sheet-2colrow"&gt; &lt;div class="sheet-col"&gt; &lt;label&gt;Notes&lt;/label&gt; &lt;textarea rows="20" name="attr_notes"&gt;&lt;/textarea&gt; &lt;/div&gt; &lt;div class="sheet-col"&gt; &lt;label&gt;Special Talent/Signature Move&lt;/label&gt; &lt;textarea rows="10" name="attr_notes2"&gt;&lt;/textarea&gt; &lt;label&gt;Pet/Companion&lt;/label&gt; &lt;textarea rows="10" name="attr_pet"&gt;&lt;/textarea&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="cornerSE"&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;span name='attr_debug' style="display:none;"&gt;&lt;/span&gt; &lt;script type="text/worker"&gt; var Asem = function(initCount, cb) { this.count = initCount; this.cb = cb; this.hasFired = false; }; _.extend(Asem.prototype, { signal: function() { this.count--; if(this.count &lt;= 0 && !this.hasFired) { this.hasFired = true; this.cb(); } }, wait: function() { this.count++; } }); /** * Gets the specified attributes and parses them as an integer or 0. */ function parseAttrs(attrs, cb) { getAttrs(attrs, function(values) { _.each(attrs, function(attr) { values[attr] = parseInt(values[attr]) || 0; }); cb(values); }); } function updateFortMax() { parseAttrs(['body', 'heart', 'edgeVitality', 'edgeVitalityI', 'edgeVitalityG', 'fortitudeOtherMods'], function(values) { var fortMax = 10*values.body + 5*(values.heart + values.edgeVitality + values.edgeVitalityI + values.edgeVitalityG) + values.fortitudeOtherMods; setAttrs({ fortitude_max: fortMax }); }); } function updateWillMax() { parseAttrs(['mind', 'heart', 'edgeDetermined', 'edgeDeterminedI', 'edgeDeterminedG', 'willpowerOtherMods'], function(values) { var willMax = 10*values.mind + 5*(values.heart + values.edgeDetermined + values.edgeDeterminedI + values.edgeDeterminedG) + values.willpowerOtherMods; setAttrs({ willpower_max: willMax }); }); } function updateValorMax() { parseAttrs(['heart', 'edgeNobleSoul', 'edgeNobleSoulI', 'edgeNobleSoulG'], function(values) { var valorMax = values.heart + values.edgeNobleSoul + values.edgeNobleSoulI + values.edgeNobleSoulG; setAttrs({ valor_max: valorMax }); }); } function updateHealthGraphic() { parseAttrs(['fortitude', 'fortitude_max', 'willpower', 'willpower_max'], function(values) { if(values.fortitude_max === 0 || values.willpower_max === 0) { setAttrs({ statusImage: 'healthy' }); } else { var alpha = Math.min(values.fortitude/values.fortitude_max, values.willpower/values.willpower_max); if(alpha &gt; 0.5) { setAttrs({ statusImage: 'healthy' }); } else if(alpha &gt; 0.25) { setAttrs({ statusImage: 'bloodied' }); } else if(alpha &gt; 0) { setAttrs({ statusImage: 'critical' }); } else { setAttrs({ statusImage: 'sidelined' }); } } }); } function updateXpSpent() { var xpSpent = 0; var asem = new Asem(1, function() { setAttrs({ xpSpent: xpSpent }); }); // Mind skill training getSectionIDs('repeating_skillsMind', function(ids) { _.each(ids, function(id) { var baseAttr = 'repeating_skillsMind_' + id +'_'; parseAttrs([baseAttr + 'skillMT', baseAttr + 'skillMI', baseAttr + 'skillMG'], function(values) { xpSpent += 5*values[baseAttr + 'skillMT'] + 10*values[baseAttr + 'skillMI'] + 15*values[baseAttr + 'skillMG']; asem.signal(); }); asem.wait(); }) asem.signal(); }); asem.wait(); // Body skill training getSectionIDs('repeating_skillsBody', function(ids) { _.each(ids, function(id) { var baseAttr = 'repeating_skillsBody_' + id +'_'; parseAttrs([baseAttr + 'skillBT', baseAttr + 'skillBI', baseAttr + 'skillBG'], function(values) { xpSpent += 5*values[baseAttr + 'skillBT'] + 10*values[baseAttr + 'skillBI'] + 15*values[baseAttr + 'skillBG']; asem.signal(); }); asem.wait(); }) asem.signal(); }); asem.wait(); // Heart skill training getSectionIDs('repeating_skillsHeart', function(ids) { _.each(ids, function(id) { var baseAttr = 'repeating_skillsHeart_' + id +'_'; parseAttrs([baseAttr + 'skillHT', baseAttr + 'skillHI', baseAttr + 'skillHG'], function(values) { xpSpent += 5*values[baseAttr + 'skillHT'] + 10*values[baseAttr + 'skillHI'] + 15*values[baseAttr + 'skillHG']; asem.signal(); }); asem.wait(); }) asem.signal(); }); asem.wait(); // Built-in Edges parseAttrs(['edgeDetermined', 'edgeDeterminedI', 'edgeDeterminedG', 'edgeVitality', 'edgeVitalityI', 'edgeVitalityG', 'edgeNobleSoul', 'edgeNobleSoulI', 'edgeNobleSoulG'], function(values) { xpSpent += 5*values.edgeDetermined + 10*values.edgeDeterminedI + 15*values.edgeDeterminedG; xpSpent += 5*values.edgeVitality + 10*values.edgeVitalityI + 15*values.edgeVitalityG; xpSpent += 5*values.edgeNobleSoul + 10*values.edgeNobleSoulI + 15*values.edgeNobleSoulG; asem.signal(); }); asem.wait(); // Custom edges getSectionIDs('repeating_edges', function(ids) { _.each(ids, function(id) { var baseAttr = 'repeating_edges_' + id + '_'; parseAttrs([baseAttr + 'edgeT', baseAttr + 'edgeI', baseAttr + 'edgeG'], function(values) { setAttrs({ debug: JSON.stringify(values) }); xpSpent += 5*values[baseAttr + 'edgeT'] + 10*values[baseAttr + 'edgeI'] + 15*values[baseAttr + 'edgeG']; asem.signal(); }); asem.wait(); }); asem.signal(); }); asem.wait(); asem.signal(); } on('change:body change:heart change:edgeVitality change:edgeVitalityI change:edgeVitalityG change:fortitudeOtherMods', function() { updateFortMax(); }); on('change:mind change:heart change:edgeDetermined change:edgeDeterminedI change:edgeDeterminedG', function() { updateWillMax(); }); on('change:heart change:edgeNobleSoul change:edgeNobleSoulI change:edgeNobleSoulG', function() { updateValorMax(); }); on('change:fortitude change:fortitude_max change:willpower change:willpower_max', function() { updateHealthGraphic(); }); on('change:repeating_skillsMind:skillMT change:repeating_skillsMind:skillMI change:repeating_skillsMind:skillMG ' + 'change:repeating_skillsBody:skillBT change:repeating_skillsBody:skillBI change:repeating_skillsBody:skillBG ' + 'change:repeating_skillsHeart:skillHT change:repeating_skillsHeart:skillHI change:repeating_skillsHeart:skillHG ' + 'change:edgeDetermined change:edgeDeterminedI change:edgeDeterminedG ' + 'change:edgeVitality change:edgeVitalityI change:edgeVitalityG ' + 'change:edgeNobleSoul change:edgeNobleSoulI change:edgeNobleSoulG ' + 'change:repeating_edges:edgeT change:repeating_edges:edgeI change:repeating_edges:edgeG', function() { updateXpSpent(); }); on('sheet:opened', function() { updateFortMax(); updateWillMax(); updateValorMax(); updateXpSpent(); }); &lt;/script&gt; &lt;rolltemplate class="sheet-rolltemplate-skillcheck"&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt; {{charName}} -&gt; {{skillName}} &lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; {{#untrained}} &lt;td class="skillcheck-untrained"&gt;Untrained&lt;/td&gt; {{/untrained}} {{#trained}} &lt;td class="skillcheck-trained"&gt;Trained&lt;/td&gt; {{/trained}} {{#improved}} &lt;td class="skillcheck-improved"&gt;Improved&lt;/td&gt; {{/improved}} {{#greater}} &lt;td class="skillcheck-greater"&gt;Greater&lt;/td&gt; {{/greater}} &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Result: {{result}}&lt;/td&gt; &lt;/tr&gt; {{#notes}} &lt;tr&gt; &lt;td&gt; &lt;div&gt;Notes:&lt;/div&gt; &lt;div&gt;{{notes}}&lt;/div&gt; &lt;/td&gt; &lt;/tr&gt; {{/notes}} &lt;/tbody&gt; &lt;/table&gt; &lt;/rolltemplate&gt;
1457192472
Ada L.
Marketplace Creator
Sheet Author
API Scripter
Here is my CSS: .charsheet { &nbsp; &nbsp; background-image: url("<a href="http://i336.photobucket.com/albums/n346/Hymnodi/Useful%20stuff/FALLOUT2.png" rel="nofollow">http://i336.photobucket.com/albums/n346/Hymnodi/Useful%20stuff/FALLOUT2.png</a>"); &nbsp; &nbsp; &nbsp; min-width: 9in; } .charsheet * { &nbsp; &nbsp; border-color: #22ff88; &nbsp; &nbsp; color: #22ff88; } .charsheet input, select, textarea { &nbsp; &nbsp; background: rgba(0,0,0,0.5); } .charsheet input[type="number"] { &nbsp; &nbsp; text-align: center; &nbsp;&nbsp; } .charsheet input[type="text"], input[type="number"], select { &nbsp; &nbsp; border: none; &nbsp;&nbsp; &nbsp; &nbsp; padding: 0px; } .charsheet input[type=number]::-webkit-inner-spin-button,&nbsp; .charsheet input[type=number]::-webkit-outer-spin-button {&nbsp; &nbsp; -webkit-appearance: none;&nbsp; &nbsp; margin: 0;&nbsp; } .charsheet select { &nbsp; &nbsp; height: 1.5em; &nbsp;&nbsp; } .charsheet textarea { &nbsp; &nbsp; height: auto; &nbsp; &nbsp; resize: none; &nbsp; &nbsp; width: 90%; } /* Set the color of input placeholder text. */ .charsheet ::-webkit-input-placeholder { &nbsp; &nbsp;color: #22ff88; &nbsp; &nbsp;opacity: 0.5; } ::-moz-placeholder { /* Mozilla Firefox 19+ */ &nbsp; &nbsp;color: #22ff88; &nbsp; &nbsp;opacity: 0.5; } .charsheet button { &nbsp; &nbsp; background-color: #22ff88; &nbsp; &nbsp; background-image: none; &nbsp; &nbsp; border-radius: 10px; &nbsp; &nbsp; color: #000000; } .charsheet .sheet-relativePos { &nbsp; &nbsp; position: relative; &nbsp;&nbsp; } .charsheet .sheet-all { &nbsp; &nbsp;margin: 10px; } .charsheet .sheet-statsHeader { &nbsp; &nbsp; border-width: 2; &nbsp; &nbsp; display: table; &nbsp; &nbsp; height: 30px; &nbsp;&nbsp; &nbsp; &nbsp; width: 100%; } &nbsp; &nbsp; .charsheet .sheet-statsHeader .sheet-borderTitle { &nbsp; &nbsp; &nbsp; &nbsp;font-size: 1.5em; &nbsp; &nbsp; &nbsp; &nbsp;transform: translate(0, -100%); &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-statsHeader &gt; div { &nbsp; &nbsp; &nbsp; &nbsp; display: table-cell; &nbsp; &nbsp; &nbsp; &nbsp; padding-left: 1em; &nbsp; &nbsp; &nbsp; &nbsp; padding-right: 0.5em; &nbsp; &nbsp; &nbsp; &nbsp; vertical-align: bottom; &nbsp; &nbsp; } .charsheet .sheet-tabContainer, .charsheet .sheet-tabContents { &nbsp; &nbsp; height: 480px; &nbsp; &nbsp; &nbsp; margin-bottom: 10px; &nbsp; &nbsp; margin-top: 10px; } &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; .charsheet .sheet-tabsFooter { &nbsp; &nbsp; border-width: 2; &nbsp; &nbsp; display: table; &nbsp; &nbsp; height: 30px; &nbsp;&nbsp; &nbsp; &nbsp; position: relative; &nbsp; &nbsp; width: 100%; } &nbsp; &nbsp; .charsheet .sheet-tabsFooter &gt; div:not(.sheet-tabContents) { &nbsp; &nbsp; &nbsp; &nbsp; display: table-cell; &nbsp; &nbsp; &nbsp; &nbsp; padding-left: 1em; &nbsp; &nbsp; &nbsp; &nbsp; padding-right: 0.5em; &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-tabsFooter &gt; .sheet-tab &gt; label { &nbsp; &nbsp; &nbsp; &nbsp; display: inline-block; &nbsp; &nbsp; &nbsp; &nbsp; float: none; &nbsp; &nbsp; &nbsp; &nbsp; height: 30px; &nbsp; &nbsp; &nbsp; &nbsp; margin-bottom: -10px; &nbsp; &nbsp; &nbsp; &nbsp; padding-top: 5px; &nbsp; &nbsp; &nbsp; &nbsp; vertical-align: middle; &nbsp; &nbsp; &nbsp; &nbsp; width: 100%; &nbsp; &nbsp; } &nbsp; &nbsp; .charsheet .sheet-tabsFooter .sheet-spacer { &nbsp; &nbsp; &nbsp; &nbsp; border-bottom: solid; &nbsp; &nbsp; &nbsp; &nbsp; width: 32px; &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-tabsFooter .sheet-tab { &nbsp; &nbsp; &nbsp; &nbsp; transform: translate(0, 50%); &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-tabsFooter .sheet-tab:hover { &nbsp; &nbsp; &nbsp; &nbsp; border: dotted 1px; &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .charsheet .sheet-tabsFooter input.sheet-tabRadio:checked + .sheet-tab { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; border: solid; &nbsp; &nbsp; &nbsp; &nbsp; } /* Don't show the radio buttons for the tabs. Instead the user checks the tabs by clicking their labels. */ .charsheet input.sheet-tabRadio { &nbsp; &nbsp; opacity: 0; &nbsp; &nbsp; width: 0px; } /* Position the tabs' contents over the tab container. */ .charsheet .sheet-tabContents { &nbsp; &nbsp; bottom: 30px; &nbsp; &nbsp; display: none; &nbsp; &nbsp; left: 0px; &nbsp; &nbsp; position: absolute; &nbsp; &nbsp; right: 0px; } &nbsp; &nbsp; /* &nbsp; &nbsp; Only display the tab whose label is checked. &nbsp; &nbsp; */ &nbsp; &nbsp; .charsheet .sheet-tabRadio:checked + .sheet-tab + .sheet-tabContents { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display: block; &nbsp; &nbsp; } .charsheet .sheet-cornerNW { &nbsp; &nbsp; border-left: solid; &nbsp;&nbsp; &nbsp; &nbsp; border-top: solid; } .charsheet .sheet-cornerNE { &nbsp; &nbsp; border-right: solid; &nbsp; &nbsp; border-top: solid; } .charsheet .sheet-cornerSW { &nbsp; &nbsp; border-bottom: solid; &nbsp; &nbsp; border-left: solid; } .charsheet .sheet-cornerSE { &nbsp; &nbsp; border-bottom: solid; &nbsp; &nbsp; border-right: solid; } .charsheet .sheet-labelLeft { &nbsp; &nbsp; display: inline-block; &nbsp; &nbsp; font-weight: bold; &nbsp; &nbsp; padding-right: 4px; } .charsheet .sheet-flowLayout { &nbsp; &nbsp; display: inline-block; &nbsp;&nbsp; } .charsheet .sheet-panel { &nbsp; &nbsp; border: solid; &nbsp;&nbsp; &nbsp; &nbsp; border-left-color: transparent; &nbsp; &nbsp; border-radius: 16px; &nbsp; &nbsp; border-right-color: transparent; &nbsp; &nbsp; padding: 10px; // &nbsp; &nbsp;position: relative; } .charsheet .sheet-panel h2 { &nbsp; &nbsp; border-bottom: solid 1px; &nbsp; &nbsp; &nbsp; line-height: 1em; &nbsp; &nbsp; margin-bottom: 0.5em; } .charsheet .sheet-panel h2 input { &nbsp; &nbsp; font-size: 1em; } .charsheet .sheet-field { &nbsp; &nbsp; margin-bottom: 10px; &nbsp;&nbsp; } .charsheet .sheet-field label { &nbsp; &nbsp; float: left; &nbsp; &nbsp; margin: 0px; &nbsp; &nbsp; text-align: left; &nbsp; &nbsp; width: 100px;&nbsp; } .charsheet .sheet-scrollingY { &nbsp; &nbsp; overflow-y: auto; &nbsp;&nbsp; } .charsheet .sheet-overflowX { &nbsp; &nbsp; overflow-x: visible; &nbsp;&nbsp; } .charsheet .sheet-stretchY { &nbsp; &nbsp; height: 100%; &nbsp;&nbsp; } /* SPECIAL tab styles */ .charsheet .sheet-tabContents.sheet-special .sheet-statusImage { &nbsp; &nbsp; height: 100%; &nbsp;&nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-tabContents.sheet-special .sheet-statusImage input { &nbsp; &nbsp; &nbsp; &nbsp; height: 0px; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opacity: 0; &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-tabContents.sheet-special .sheet-statusImage img { &nbsp; &nbsp; &nbsp; &nbsp; display: none; &nbsp;&nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; .charsheet .sheet-tabContents.sheet-special .sheet-statusImage input[type="radio"]:checked + img { &nbsp; &nbsp; &nbsp; &nbsp; display: block; &nbsp;&nbsp; &nbsp; &nbsp; } .charsheet .sheet-tabContents.sheet-special .sheet-panel { &nbsp; &nbsp; margin-bottom: 10px; &nbsp; &nbsp; width: 90%; } .charsheet .sheet-tabContents.sheet-special .sheet-primaryAttr { &nbsp; &nbsp; display: inline-block; &nbsp; &nbsp; width: 100px; &nbsp;&nbsp; } .charsheet .sheet-tabContents.sheet-special .sheet-primaryAttr div { &nbsp; &nbsp; margin-left: auto; &nbsp; &nbsp; margin-right: auto; &nbsp; &nbsp; width: 50%; } .charsheet .sheet-tabContents.sheet-special .sheet-primaryAttr .sheet-label { &nbsp; &nbsp; font-size: 1.5em; &nbsp; &nbsp; margin-bottom: 5px; } /* SKILLS tab styles */ .charsheet .sheet-tabContents.sheet-skills .sheet-panel { &nbsp; &nbsp; margin-bottom: 10px; &nbsp; &nbsp; width: 90%; } .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList .table { &nbsp; &nbsp; border-spacing: 32px 0px; &nbsp; &nbsp; display: table; } .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList input[type=text] { &nbsp; &nbsp; width: 140px } .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList input[type=number].sheet-skillMod { &nbsp; &nbsp; width: 28px } .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList .sheet-rollSkill button { &nbsp; &nbsp; display: none; &nbsp; &nbsp; height: 20px; } .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList .sheet-rollSkill input:in-range + button { &nbsp; &nbsp; display: inline; } &nbsp; &nbsp; .charsheet .sheet-rankBox { &nbsp; &nbsp; &nbsp; &nbsp; border: solid 1px; &nbsp; &nbsp; &nbsp; &nbsp; display: inline-block; &nbsp; &nbsp; &nbsp; &nbsp; height: 20px; &nbsp; &nbsp; &nbsp; &nbsp; position: relative; &nbsp; &nbsp; &nbsp; &nbsp; width: 20px; &nbsp;&nbsp; &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-rankBox input[type="checkbox"] { &nbsp; &nbsp; &nbsp; &nbsp; height: 100%; &nbsp; &nbsp; &nbsp; &nbsp; left: 0px; &nbsp; &nbsp; &nbsp; &nbsp; opacity: 0.0; &nbsp; &nbsp; &nbsp; &nbsp; position: absolute; &nbsp; &nbsp; &nbsp; &nbsp; top: 0px; &nbsp; &nbsp; &nbsp; &nbsp; width: 100%; &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-rankBox input[type="checkbox"] + div { &nbsp; &nbsp; &nbsp; &nbsp; background-color: rgba(0,0,0,0.5); &nbsp; &nbsp; &nbsp; &nbsp; height: 100%; &nbsp; &nbsp; &nbsp; &nbsp; text-align: center; &nbsp; &nbsp; &nbsp; &nbsp; width: 100%; &nbsp; &nbsp; } &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; .charsheet .sheet-rankBox input[type="checkbox"]:checked + div { &nbsp; &nbsp; &nbsp; &nbsp; background-color: #22ff88; &nbsp; &nbsp; &nbsp; &nbsp; color: #000000; &nbsp; &nbsp; } .charsheet div.sheet-tableRow { &nbsp; &nbsp; display: table-row; &nbsp;&nbsp; } .charsheet div.sheet-tableRow &gt; div { &nbsp; &nbsp; display: table-cell; } .charsheet .sheet-conditionalMods { &nbsp; &nbsp; margin-left: 1em; &nbsp; &nbsp; margin-top: 2px; } .charsheet .sheet-conditionalMods * { &nbsp; &nbsp; font-size: 0.8em; } .charsheet .sheet-conditionalMods input { &nbsp; &nbsp; width: 60%; } /* MAGIC tab styles */ .charsheet .sheet-tabContents.sheet-magic .sheet-panel { &nbsp; &nbsp; margin-bottom: 10px; &nbsp; &nbsp; width: 90%; } .charsheet .sheet-tabContents.sheet-magic .sheet-spellsList select { &nbsp; &nbsp; font-size: 1em; &nbsp; &nbsp; width: 100px; } .charsheet .sheet-tabContents.sheet-magic .sheet-spellsList h2 input { &nbsp; &nbsp; font-size: 0.8em; } .charsheet .sheet-tabContents.sheet-magic .sheet-spellsList .sheet-spellBody { &nbsp; &nbsp; font-size: 0.8em; } /* INVENTORY tab styles */ .charsheet .sheet-tabContents.sheet-inventory .sheet-panel { &nbsp; &nbsp; margin-bottom: 10px; &nbsp; &nbsp; width: 90%; } .charsheet .sheet-tabContents.sheet-inventory .sheet-field.sheet-caps label { &nbsp; &nbsp; width: 50px; } .charsheet .sheet-tabContents.sheet-inventory .sheet-field.sheet-caps input { &nbsp; &nbsp; width: 50px; } /* General tab styles */ .charsheet .sheet-tabContents.sheet-general .sheet-panel { &nbsp; &nbsp; margin-bottom: 10px; &nbsp; &nbsp; width: 90%; } .charsheet input[value="test"] { &nbsp; &nbsp; &nbsp; &nbsp;border: solid 2px red; } .charsheet input.sheet-hiddenNumber { &nbsp; &nbsp; display: none; &nbsp; &nbsp; height: 0px; } /* scrollbar styles */ .charsheet { &nbsp; &nbsp; overflow: scroll; } .charsheet ::-webkit-scrollbar { &nbsp; &nbsp; width: 10px; &nbsp;&nbsp; } .charsheet ::-webkit-scrollbar-track { &nbsp; &nbsp; background: rgba(0, 0, 0, 0.5); &nbsp; &nbsp; border-radius: 5px; } .charsheet ::-webkit-scrollbar-thumb { &nbsp; &nbsp; background: #22ff88; &nbsp; &nbsp; border-radius: 5px; }
1457195659
Ada L.
Marketplace Creator
Sheet Author
API Scripter
On the topic of CSS, is there any chance that LESS support will be provided for character sheet styles in the future? It would make character sheet styles much tidier and make CSS hiccups less much likely.
1457229179
Ada L.
Marketplace Creator
Sheet Author
API Scripter
As an experiment, I removed all the CSS from my sheet to see if the buttons would still not be there. The results: the buttons do show up in Firefox without the CSS. So, it does look like I've derped something up with my CSS. :/
1457233167
vÍnce
Pro
Sheet Author
Try changing your css from .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList .sheet-rollSkill button { display: none; height: 20px; } .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList .sheet-rollSkill input:in-range + button { display: inline; } to .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList .sheet-rollSkill button { height: 20px; } .charsheet .sheet-tabContents.sheet-skills .sheet-skillsList .sheet-rollSkill input:in-range + button { display: inline-block; }
1457234648
Ada L.
Marketplace Creator
Sheet Author
API Scripter
That did the trick. Thanks! I actually also removed that entire second CSS rule too. It wasn't actually doing anything.
1457391979
Phil B.
Forum Champion
Sheet Author
Thanks for the help Vince, the Sheet Master. Stephen, this sheet looks really nice. If it's for a game system, that is publicly available and that we don't already support, you should consider submitting it to our repo so we can officially add it to the list, and share all of your hard work.&nbsp;<a href="https://github.com/Roll20/roll20-character-sheets" rel="nofollow">https://github.com/Roll20/roll20-character-sheets</a>
1457484538
Ada L.
Marketplace Creator
Sheet Author
API Scripter
It's for the Roleplaying is Magic 4th edition system, but for a Fallout-type campaign setting.&nbsp; <a href="http://roleplayingismagic.com/" rel="nofollow">http://roleplayingismagic.com/</a>
1457557197
Phil B.
Forum Champion
Sheet Author
We do not currently have any sheets for that system, you should definitely create a pull request on our character sheet repo and share your creation with the community. Since, you said, it's styled specifically for your campaign you might want to change the style to be a little more neutral on the version you submit to the repo, if you end up doing it (I definitely think you should, it looks like you put a lot of work into it).