Character Vault
Any Concept / Any System
Compendium
Your System Come To Life
Roll20 for Android
Streamlined for your Tablet
Roll20 for iPad
Streamlined for your Tablet

Personal tools

Difference between revisions of "Sheet Author Tips"

From Roll20 Wiki

Jump to: navigation, search
(more links)
(Statblock Importer: list more sheets with importers)
 
(84 intermediate revisions by 3 users not shown)
Line 1: Line 1:
''Main Article:'' '''[[Building Character Sheets]]'''
+
{{revdate}}{{BCS}} {{NavSheetDoc}}
  
This is a collection of more advanced Sheet Author Tips that doesn't fit the other pages. Most of the suggestions& ideas are taken from the forums.
+
This is a collection of more advanced [[Sheet Author]] Tips that currently doesn't fit on the [[:Category:Character_Sheet_Creation|other pages relating to character sheet creation & editing]]. Most of the suggestions & ideas are taken from the Roll20 forums, or discussions among Sheet Authors.
 +
 
 +
'''[[Sheet Author]]''' is a badge people who have created & submitted [[CS|character sheets]] to Roll20 get.
  
 
__TOC__
 
__TOC__
Line 10: Line 12:
 
Some Highlights:
 
Some Highlights:
  
* [[Building_Character_Sheets#Common_Mistakes| Common Mistakes]]
+
* '''[[Character Sheet Development/Tools]]''' - community recommendations
* [[Building_Character_Sheets#Best_Practices| Best Practices]]
+
* [[Character Sheet Development/Common Mistakes|Common Mistakes]]
 +
* [[Building_Character_Sheets#Best_Practices|Best Practices]]
 
* [[Building_Character_Sheets#Advanced_Sheet_Options|Advanced Sheet Options]]
 
* [[Building_Character_Sheets#Advanced_Sheet_Options|Advanced Sheet Options]]
  
==[[Custom Sheet Sandbox]]==
+
==[[Custom Sheet Sandbox|Sheet Sandbox]]==
 
Using the [[Custom Sheet Sandbox|Sheet Sandbox]] while editing/developing character sheets is much more effective and quicker than the normal [[Building_Character_Sheets#The_Sheet_Editor|Sheet Editor]].
 
Using the [[Custom Sheet Sandbox|Sheet Sandbox]] while editing/developing character sheets is much more effective and quicker than the normal [[Building_Character_Sheets#The_Sheet_Editor|Sheet Editor]].
 +
 +
Alongside it, most authors use a text editor such as [[VS Code]].
 +
 +
'''Recommended Plugin: [[Roll20 Autouploader]]''' -- [[Browser#Plugins|browser plugin]] that can autoupload & update your sheet code in the sheet sandbox, so you don't have to do it manually each time. Can also do same for API scripts.
 +
 +
==Tools==
 +
See '''[[Character Sheet Development/Tools]]''' for community recommendations on sheet dev tools.
 +
 +
==Code Validation==
 +
It's a good idea to use a validator to check your code for mistakes in your code. Many IDE & text editors can install such extensions automatically, but given that Roll20 does a few things their own way, by default a HTML validator would complain about lot of things that aren't wrong, but just isn't accepted as standard HTML, such as <code><button type="roll"></button></code>.
 +
 +
* '''HTML''': [https://validator.w3.org/ W3C's HTML Validator]
 +
** initially give many warnings and errors on roll20-specific things, but you can filter away things that aren't wrong, and the list of error is quickly reduced to a manageable amount
 +
** [https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML Debugging HTML]
 +
* '''CSS''': [https://jigsaw.w3.org/css-validator/ W3C's CSS Validator]
 +
** [https://developer.mozilla.org/en-US/docs/Lear==Roll20 Autouploader==
 +
{{main|Roll20 Autouploader}}
 +
{{:Roll20 Autouploader}}n/CSS/Building_blocks/Debugging_CSS Debugging CSS]
 +
* '''JavaScript'''(for sheetworkers & API): [https://closure-compiler.appspot.com/home Closure Compiler for JS]
 +
* '''JSON'''(for [[i18n|translation files]] & [[sheet.json]]: [https://jsonlint.com/?code= jsonlint.com]
  
 
==Frameworks==
 
==Frameworks==
Beyond just using HTML/CSS directly, you could use some pre-processors that can speed up the development, instead of directly writing HMTL/CSS. Here is a few suggestion, used by some sheet authors including Roll20 themselves.   
+
Beyond just using HTML/CSS directly, you could use some pre-processors, language extensions, or frameworks that can speed up the sheet development, instead of directly writing HTML/CSS. Here are a few suggestions, used by a good number of sheet authors, including Roll20's teams working on the official sheets.   
 +
 
 +
:''Use PUG & SASS/SCSS & JavaScript to make sheets. PUG & SCSS are the two most useful things I've ever learned for sheet development. Character sheets which use to take hundred+ hours takes now 20-40 thanks to PUG which is a JavaScript based language to write HTML. You'll save yourself a lot of redundant work by just using the power of loops & variables if nothing else.''
  
===PUG & SCSS===
+
:''Troubleshooting becomes much easier when you need to fix just one line in a loop rather than a dozen copy/paste html snippets.''
Suggestion by [https://app.roll20.net/users/557736 Cassie]
+
  
Use PUG & SCSS & JavaScript to make sheets. PUG & SCSS are the two most useful things I've ever learned for sheet development. Character sheets which use to take hundred+ hours takes now 20-40 thanks to PUG which is a Javascript based language to write HTML. You'll save yourself a lot of redundant work by just using the power of loops & variables if nothing else.
+
:''PUG and SCSS can be used to simply split up the HTML & CSS files into smaller, more manageable files, which can then simply be compiled into their end results when it's time to use the sheet in a game.''
  
Troubleshooting becomes much easier when you need to fix just one line in a loop rather than a dozen copy/paste html snippets.
+
:''These are compiled languages so you'll need to do that. Easily done via terminal if your tech savy, or [https://prepros.io/ prepros.io] if you're not.''
  
These are compiled languages so you'll need to do that. Easily done via terminal if your tech savy or https://prepros.io/ if you're not.
+
===PUG===
 +
{{:PUGjs}}
 +
 
 +
=== SASS ===
 +
{{:SASS}}
  
 
=== Handlebars ===
 
=== Handlebars ===
 
Suggestion by [https://app.roll20.net/users/2322441 Primal Zed]
 
Suggestion by [https://app.roll20.net/users/2322441 Primal Zed]
  
[https://app.roll20.net/forum/post/8380005/sheet-templating-with-handlebars Forum thread]
+
{{forum|post/8380005/sheet-templating-with-handlebars thread}}
  
 
'''Pros:'''
 
'''Pros:'''
Line 49: Line 77:
 
** For advanced use: Repeat Helper
 
** For advanced use: Repeat Helper
 
* Requires Node.js installation and some command lines
 
* Requires Node.js installation and some command lines
 +
 +
=== Bootstrap===
 +
There are a number of sheets in the {{repo|Roll20/roll20-character-sheets repository}} that have been built with [https://getbootstrap.com/ Bootstrap], but using it for sheet development is a bit on the heavy side, and can have a higher bar to get started with than only using pre-prosessors like PUG and SASS.
  
 
==Git/GitHub==
 
==Git/GitHub==
Line 54: Line 85:
 
* [[Short Git Guide]] - A guide to using the command line version of Git to work on your computer, instead of GitHub Desktop
 
* [[Short Git Guide]] - A guide to using the command line version of Git to work on your computer, instead of GitHub Desktop
  
===Install Pull to GitHub===
+
===Install the Pull App to GitHub===
  
[https://wei.github.io/pull/#basic-setup Pull] is a GitHub bot GiGs found, and it can automatically keep your fork updated to Roll20 main repo.
+
{{warning|Be sure to create separate branches on your fork for editing since the PULL bot might overwrite your <code>master</code>-branch when syncing with the Roll20 repository. Use at your own risk.}}
 +
[https://wei.github.io/pull/#basic-setup Pull App] is a GitHub bot that can automatically watch and pull in Roll20's upstream default <code>master</code>-branch to your fork using hard reset every few hours. You can also manually trigger it anytime.
  
So many pull request get rejected or delayed due to a failure to keep GitHub forks in sync with the master repo. This will automate that for you.
+
Failure to keep your GitHub fork in sync with the master repo can create merge conflicts causing a pull request to be rejected or delayed. The Pull App can help automate this process and keep your fork in sync with Roll20's <code>master</code>-branch.
  
It's recommended to manually run the bot before each time you start on a new thing, to avoid it performing updates when Roll20 is in the middle of merging new pull requests. This caused lot of problems when people had it to automatically update repos. 
+
'''While the Pull App will sync in the background every few hours, it is recommended that you manually run the bot before creating a branch for editing to ensure your fork's <code>master</code>-branch is in sync with Roll20's most current <code>master</code>-branch.'''
  
 
===Use Branches in GitHub===
 
===Use Branches in GitHub===
  
Do not make changes to your GitHub master. Instead make a branch from master to do all upgrades there. Submit pull request to the Roll20 repo directly from a branch. This is a safe way to do version control and will improve the integrity of your work.
+
Do not make changes to your GitHub <code>master</code>-branch. Instead make a branch from <code>master</code> to do all upgrades there. Submit pull request to the Roll20 repo directly from a branch. This is a safe way to do version control and will improve the integrity of your work.
  
==Pattern Libraries & Components==
 
Suggestion by [https://app.roll20.net/users/557736 Cassie]
 
  
A pattern library can be your best friend if you want to make multiple sheets. Component style programming will let you save styles to be reused between sheets. With my last project I put work into my [https://github.com/clevett/roll20-SheetTemplate Sheet Template]. This saves me a good deal of time by not needing to start from scratch every time. Its a slow work in progress were I'm reinventing much of [https://getbootstrap.com/ Bootstrap].
 
  
=== Helpful Functions ===
+
==Pattern Libraries & Components==
 
+
{{main|Character Sheet Development/Pattern Libraries}}
<pre data-language="javascript">
+
//Convert Integers to be Negative
+
const convertIntegerNegative = number => number > 0 ? -Math.abs(number) : number
+
 
+
//Convert an object with negative numbers
+
const convertIntegersNegatives = numbers => {
+
  numbers => {
+
    for (let [key, value] of Object.entries(numbers)) {
+
      numbers[key] = convertIntegerNegative(value);
+
    }
+
    return numbers
+
  }
+
}
+
 
+
//Pass in eventinfo.triggerName
+
const findRepeatingField = trigger => trigger.split('_')[1]
+
 
+
//Pass in eventinfo.triggerName
+
const getReprowid = trigger => {
+
  const split = trigger.split('_');
+
  return `${split[0]}_${split[1]}_${split[2]}`
+
}
+
 
+
//Pass in an object keep that has the repeating section
+
//Example repeating_weapon_-m1czg68yzicwhfdpyys_name
+
const getReprowAttribute = key => {
+
  const getReprowid = processingFunctions.getReprowid(key)
+
  return key.split(`${getReprowid}_`)[1]
+
}
+
 
+
//Provide the function with an array of keys to find transations for
+
//Example ['strenght', 'agility', 'willpower']
+
const getTranslations = translationKeys => {
+
  let translations = {}
+
  translationKeys.forEach(key => translations[`${key}`] = getTranslationByKey(key))
+
  return translations
+
}
+
 
+
const parseInteger = string => parseInt(string) || 0
+
  
//Use for convernting the result of getAttrs from strings into integers
+
{{:Character Sheet Development/Pattern Libraries}}
const parseIntegers = numbers => {
+
  for (let [key, value] of Object.entries(numbers)) {
+
      numbers[key] = parseInt(value) || 0
+
  }
+
  return numbers 
+
}
+
  
const setAttributes = (update, silent) => silent && typeof update === 'object' ? setAttrs(update, {silent:true}) : typeof update === 'object' ? setAttrs(update) : console.error(`${update} is not an object`)
+
==Advanced Sheet Features==
  
//returns strength from @{strenght}
+
===Statblock Importer===
const sliceAttr = attribute => attribute.slice(2, -1)
+
Some sheets have integrated options to import sheets to Roll20, such as for plaintext or <code>.json</code> statblocks.
  
const sumIntegers = numbers => numbers.reduce((a,b) => a + b, 0)
+
Existing Sheets with integrated import functions, by format:
</pre>
+
* '''json'''
 +
** [[Official_Savage_Worlds#JSON_Importer|Official Savage Worlds]] - json importer
 +
** [https://github.com/Roll20/roll20-character-sheets/tree/master/Fate Fate by Evil Hat] json import/export for character stats
 +
** {{sheet-gh|Mythras/src/scripts/import.js Mythras}} json importer
 +
** [https://github.com/Roll20/roll20-character-sheets/tree/master/Rolemaster-Standard-System Rolemaster Standard System] - Json importer for NPC statblocks, with example JSON import included.
 +
** [https://github.com/Roll20/roll20-character-sheets/tree/master/RolemasterUnified RolemasterUnified] json importer
 +
* '''herolabs'''
 +
** [[Mutants & Masterminds 3E Official#Hero_Labs_Importer|Mutants & Masterminds 3E Official]] - herolab importer
 +
** [[Pathfinder Community Sheet#HeroLab Character import|Pathfinder Community Sheet]] - herolab importer
 +
* '''plaintext/other'''
 +
** [https://github.com/Roll20/roll20-character-sheets/tree/master/ChroniquesOublieesContemporain ChroniquesOublieesContemporain] import statblocks by copying text from pdfs. More info [https://stephaned68.github.io/ChroniquesContemporaines/import-statblock here]
 +
** [https://github.com/Roll20/roll20-character-sheets/tree/master/Naheulbeuk Naheulbeuk] importer
 +
** {{sheet-gh|Shadowrun5thEdition Shadowrun5thEdition}} & {{sheet-gh|Shadowrun5th Shadowrun5th}} both have Chummer importers
 +
** [[GeneFunk2090]] statblock importer
 +
** [https://github.com/Roll20/roll20-character-sheets/tree/master/Only-War-Enhanced Only-War-Enhanced] sourcecode has unfinished importer
  
=== Sheet Versioning===
 
It can be beneficial to use a visible sheet version on a sheet, so people know when the sheet have updated. Also using sheet version will make it easier for you and others to track the state of the sheet and possible changelog.
 
  
If you have complex stat & sheetworkers in you sheet and make changes to them, it can be beneficial to add sheet versioning sheetworker that updates things for character using older version of the sheet to a new one.
+
Some sheets have instead a separate [[API]] for this purpose, such as [https://github.com/Roll20/roll20-api-scripts/tree/master/Earthdawn%20(FASA%20Official)%20character%20sheet%20companion Earthdawn by FASA character sheet companion], [[Script:HL-Import]] and
 +
[[Script:HeroLabImporter]].
  
An example would be to update an attribute name with a typo, to one with the correct spelling. The sheet versioning would next time a sheet is opened notice it is a older version, and then perform the sheet update transferring the attribute values of the old attribute to the new one, while it would do nothing on sheet that are already the latest version.
+
See also: [[Character Sheets/Import]]
  
[https://app.roll20.net/forum/permalink/8664931/ Forum post] by {{user profile|157788|GiGs}}, explaining a sheet versioning script, found in this [https://gist.github.com/G-G-G/52b96cff0b827c42f9d04ab411fb42e8 gist]{{github}}
+
===GM Screen===
===Improved Sheetworker diagnostics===
+
Sometimes just an NPC sheet isn't enough, and it would be beneficial for the GM to have a GM Screen built into the sheet.
[https://github.com/shdwjk/TheAaronSheet TheAaronSheet] contains a number of helpful sheetworker functions like simplifying repeating sections, but it also has a improved debugging settings that can help making various dev console messages more distinct.
+
  
===Sheet Changelog and notification===
+
===Changelog and Update Notification inside Sheet===
 
[[File:GURPS-sheet-update-notice.png|right|thumb|350px|The GURPS sheet displaying the latest sheet update notice.]]
 
[[File:GURPS-sheet-update-notice.png|right|thumb|350px|The GURPS sheet displaying the latest sheet update notice.]]
If you a lots of changes to a sheet, or want to make sure that the users of the sheet are informed of the updates, you could integrate the sheet changelog & notice into the sheet, so everyone will know of the changes, & can dismiss them at will. Alternatively the changelog can be placed on a tab somewhere
+
If you a lots of changes to a sheet, or want to make sure that all users of the sheet are informed of the updates, you could integrate the sheet changelog & notification into the sheet, so next time they open a sheet their sheet they seem the update notice, & can dismiss them at will.
  
The team behind the [[GURPS]] character sheet is an example of incorporating a comprehensive changelog into the sheet, with a collapsible notice of the latest update/message from the sheet authors.
+
Alternatively, the changelog could be placed on a separate tab, such as folded it into the '''Settings'''-tab
<br>
+
<br>
+
<br>
+
<br>
+
<br>
+
=== Documentation ===
+
The "instructions" section of the sheet.json is a bit unwieldy to fill out, so it might be easier to place any larger documentation here on the Roll20 Wiki.
+
  
If the character sheet have several tabs or is long, the wiki could better fit more preview images of the sheet rather than having something complicated on github.
+
The team behind the [[GURPS]] character sheet is a great example of incorporating a comprehensive changelog into the sheet, with a collapsible notice of the latest update/message from the sheet authors, and is non-obstructive even when not dismissed.
 +
* {{repo|Roll20/roll20-character-sheets/tree/master/GURPS GURPS 4E sourcecode}}
 +
* https://app.roll20.net/forum/post/10732652/notifying-users-of-changes-to-sheet
 +
<br clear="right">
  
 
==Sharing code/collaboration==
 
==Sharing code/collaboration==
Line 159: Line 151:
  
 
The "Revisions" tab of a gist shows clearly code changes between revisions, so tracking what have changed makes things easier for you and others.
 
The "Revisions" tab of a gist shows clearly code changes between revisions, so tracking what have changed makes things easier for you and others.
 +
 +
* [http://hilite.me/ hilite.me] can be used to convert your code to pretty html-formatted code that's very clear when copypasted to the [[forums]]. (Trick by [[Aaron|The Aaron]])
  
 
=Related Pages=
 
=Related Pages=
 +
* [[Custom Sheet Sandbox|Sheet Sandbox]] – the better editor to use when you code your character sheets
 +
* [[Javascript:Best Practices]]
 +
* [[Sheet Author's Journey]] - tutorial
 
* [[Andreas Guide to Sheet Development]] - general advice & mentions of things to consider when developing sheets
 
* [[Andreas Guide to Sheet Development]] - general advice & mentions of things to consider when developing sheets
 
* [[Building Character Sheets]] - main article
 
* [[Building Character Sheets]] - main article
Line 171: Line 168:
 
==See Also==
 
==See Also==
 
* Community
 
* Community
** [https://app.roll20.net/forum/category/277980 Roll20 Forums - Character Sheets & Compendiums] - Best place for discussing Sheets with other Sheet Creators, and to get current info
+
** {{forum|category/277980 Roll20 Forums - Character Sheets & Compendiums}} - Best place for discussing Sheets with other [[Sheet Authors]], and to get clatest info
 
** [https://discordapp.com/invite/sMsv5KD Unofficial Roll20 Discord] - The Discord server have two channels for discussing Character Sheet Creation, and many active Sheet Authors are present.
 
** [https://discordapp.com/invite/sMsv5KD Unofficial Roll20 Discord] - The Discord server have two channels for discussing Character Sheet Creation, and many active Sheet Authors are present.
 
* [https://google.github.io/styleguide/htmlcssguide.html Google's HTML/CSS Styleguide]
 
* [https://google.github.io/styleguide/htmlcssguide.html Google's HTML/CSS Styleguide]
 
* [https://css-tricks.com/css-style-guides/ css-tricks.com Style Guides collection]
 
* [https://css-tricks.com/css-style-guides/ css-tricks.com Style Guides collection]
* Sheet Templates/Examples
+
** [https://developer.mozilla.org/en-US/docs/Web/CSS/:is is() pseudo-class]
** [https://github.com/Roll20/roll20-character-sheets/tree/master/kitchensink Roll20's character sheet] Roll20's template
+
* [[Character_Sheet_Development/Sheet_Templates|Sheet Templates/Examples]]
** [https://github.com/clevett/SheetTemplate Cassie's sheet template] by Cassie (Uses PUG/SCSS so not recommended for beginners)
+
* {{yt.be|k6wDQJnGJCk PT1 coding a Roll20 Character Sheet}} 40min (April 2021)
** [https://github.com/Anduh/Roll20-grid-template CSS Grid sheet template] by Anduh
+
** [https://github.com/joesinghaus/Blades-template Sheet template based on Blades in the Dark] by Jakob
+
 
+
 
<br>
 
<br>
 
[[Category:Sheetworker]]
 
[[Category:Sheetworker]]
 
[[Category:Character Sheet Creation]]
 
[[Category:Character Sheet Creation]]
 +
[[Category:Character Sheet Development]]
 +
[[Category:Tips]]
 +
[[Category:External Tools]]

Latest revision as of 11:47, 18 June 2022


This is a collection of more advanced Sheet Author Tips that currently doesn't fit on the other pages relating to character sheet creation & editing. Most of the suggestions & ideas are taken from the Roll20 forums, or discussions among Sheet Authors.

Sheet Author is a badge people who have created & submitted character sheets to Roll20 get.

Contents


[edit] Read the documentation

Give the Building Character Sheets-article a full read, as it contains lots of information on the specific quirks & pitfalls of how Roll20 character sheets works compared to default HTML/CSS/JavaScript. Even if you know how things work.

Some Highlights:

[edit] Sheet Sandbox

Using the Sheet Sandbox while editing/developing character sheets is much more effective and quicker than the normal Sheet Editor.

Alongside it, most authors use a text editor such as VS Code.

Recommended Plugin: Roll20 Autouploader -- browser plugin that can autoupload & update your sheet code in the sheet sandbox, so you don't have to do it manually each time. Can also do same for API scripts.

[edit] Tools

See Character Sheet Development/Tools for community recommendations on sheet dev tools.

[edit] Code Validation

It's a good idea to use a validator to check your code for mistakes in your code. Many IDE & text editors can install such extensions automatically, but given that Roll20 does a few things their own way, by default a HTML validator would complain about lot of things that aren't wrong, but just isn't accepted as standard HTML, such as <button type="roll"></button>.

Main Page: Roll20 Autouploader

Autouploader in action

Roll20 API and Sheet Autouploader is a Chromium extension that will automate the uploading of code to your Sheet Sandbox, created by Scott C..

This streamlines Character Sheet Development, removing the need to manually upload the files when you want to test changes. The extension will eventually work with API Development as well.


It should work on all chromium browsers except for Brave, which has disabled the chromium features that the extension relies on. n/CSS/Building_blocks/Debugging_CSS Debugging CSS]

[edit] Frameworks

Beyond just using HTML/CSS directly, you could use some pre-processors, language extensions, or frameworks that can speed up the sheet development, instead of directly writing HTML/CSS. Here are a few suggestions, used by a good number of sheet authors, including Roll20's teams working on the official sheets.

Use PUG & SASS/SCSS & JavaScript to make sheets. PUG & SCSS are the two most useful things I've ever learned for sheet development. Character sheets which use to take hundred+ hours takes now 20-40 thanks to PUG which is a JavaScript based language to write HTML. You'll save yourself a lot of redundant work by just using the power of loops & variables if nothing else.
Troubleshooting becomes much easier when you need to fix just one line in a loop rather than a dozen copy/paste html snippets.
PUG and SCSS can be used to simply split up the HTML & CSS files into smaller, more manageable files, which can then simply be compiled into their end results when it's time to use the sheet in a game.
These are compiled languages so you'll need to do that. Easily done via terminal if your tech savy, or prepros.io if you're not.

[edit] PUG

PUG is a template engine for generating HTML, where you can use various features & tool to write code more efficiently, such as using variables and loops, and has a simpler syntax.

//- Comment that only appears in PUG
- var pages = ["character", "skills", "inventory", "magic", "familiar", "background", "campaign", "vehicle", "settings"];
div
  span Page selection
  select(name="attr_sheetTab")
    each tab in pages
      option(value=`${tab}`)= tab[0].toUpperCase() + tab.slice(1)

Result HTML:

<div>
     <span>Page selection</span><select name="attr_sheetTab">
        <option value="character">Character</option>
        <option value="skills">Skills</option>
        <option value="inventory">Inventory</option>
        <option value="magic">Magic</option>
        <option value="familiar">Familiar</option>
        <option value="background">Background</option>
        <option value="campaign">Campaign</option>
        <option value="vehicle">Vehicle</option>
        <option value="settings">Settings</option>
    </select>
</div>

PUGjs.org

Examples, Sheets, & Sheet template made with PUG:


[edit] SASS

SASS/SCSS is a widely used CSS extension language. It's CSS Compatible, so you can start using it by writing plain CSS first, and slowly including more SASS features, while keeping it familiar & looking mostly like CSS.

One of the things you can do it to nest your code, saving you from repeating yourself with things like needing to add .charsheet in from of every class.

/*-------------------------------------------*/
/*-----Main Settings and hide classes--------*/
// comments with two slashes won't appear in the resulting .css,  which is handy for writing extra comments thaat aren't relevant to the css.
// SCSS enables nesting of classes, saving time in writing, and making it easier to read/organize the CSS. There are also tother features,but this is the main one I've started to use, as it helps with reading the scss/css. One can start from pure css, and then bit by bit simplify/refactor it to use more scss features
.charsheet {
	.main-settings {
	    display: none;
		position: relative;
		margin-left: 0;
		
		.container {
			width: 850px;
		}
		.input-row {
			label {
				display: inline-block;
				width: auto;
			}
			input {
				margin-right: 30px;
			}
			select {
				width: 45%;
				margin-right: 15px;
			}
		}
	}
  input.main-options.options-flag + span,/*displays the cog icon*/
  input[type=radio]:checked ~ .master-container input.options-flag + span {
      font-family: pictos;
      font-style: normal;
  }
}

resulting CSS:

/*-------------------------------------------*/
/*-----Main Settings and hide classes--------*/
.charsheet .main-settings {
  display: none;
  position: relative;
  margin-left: 0;
}
.charsheet .main-settings .container {
  width: 850px;
}
.charsheet .main-settings .input-row label {
  display: inline-block;
  width: auto;
}
.charsheet .main-settings .input-row input {
  margin-right: 30px;
}
.charsheet .main-settings .input-row select {
  width: 45%;
  margin-right: 15px;
}
.charsheet input.main-options.options-flag + span,
.charsheet input[type=radio]:checked ~ .master-container input.options-flag + span {
  font-family: pictos;
  font-style: normal;
}

Examples, Sheets, & Sheet template made with SASS:


[edit] Handlebars

Suggestion by Primal Zed

thread(Forum)

Pros:

  • Looks like HTML (or whatever file type you're templating), with handlebars blocks added in
  • Inject data values anywhere directly into the HTML
  • Can yield benefit with little effort - sheet authors can use as much or as little as they want
  • Handlebars blocks have opening and close tags similar to HTML
  • Easy to add new templates for re-use and organization

Cons:

  • Involves new syntax to learn and helpers to understand
    • Built-In Helpers
    • For advanced use: Additional Helpers
    • For advanced use: Repeat Helper
  • Requires Node.js installation and some command lines

[edit] Bootstrap

There are a number of sheets in the repository that have been built with Bootstrap, but using it for sheet development is a bit on the heavy side, and can have a higher bar to get started with than only using pre-prosessors like PUG and SASS.

[edit] Git/GitHub

[edit] Install the Pull App to GitHub

Pull App is a GitHub bot that can automatically watch and pull in Roll20's upstream default master-branch to your fork using hard reset every few hours. You can also manually trigger it anytime.

Failure to keep your GitHub fork in sync with the master repo can create merge conflicts causing a pull request to be rejected or delayed. The Pull App can help automate this process and keep your fork in sync with Roll20's master-branch.

While the Pull App will sync in the background every few hours, it is recommended that you manually run the bot before creating a branch for editing to ensure your fork's master-branch is in sync with Roll20's most current master-branch.

[edit] Use Branches in GitHub

Do not make changes to your GitHub master-branch. Instead make a branch from master to do all upgrades there. Submit pull request to the Roll20 repo directly from a branch. This is a safe way to do version control and will improve the integrity of your work.


[edit] Pattern Libraries & Components

Main Page: Character Sheet Development/Pattern Libraries



[edit] Advanced Sheet Features

[edit] Statblock Importer

Some sheets have integrated options to import sheets to Roll20, such as for plaintext or .json statblocks.

Existing Sheets with integrated import functions, by format:


Some sheets have instead a separate API for this purpose, such as Earthdawn by FASA character sheet companion, Script:HL-Import and Script:HeroLabImporter.

See also: Character Sheets/Import

[edit] GM Screen

Sometimes just an NPC sheet isn't enough, and it would be beneficial for the GM to have a GM Screen built into the sheet.

[edit] Changelog and Update Notification inside Sheet

The GURPS sheet displaying the latest sheet update notice.

If you a lots of changes to a sheet, or want to make sure that all users of the sheet are informed of the updates, you could integrate the sheet changelog & notification into the sheet, so next time they open a sheet their sheet they seem the update notice, & can dismiss them at will.

Alternatively, the changelog could be placed on a separate tab, such as folded it into the Settings-tab

The team behind the GURPS character sheet is a great example of incorporating a comprehensive changelog into the sheet, with a collapsible notice of the latest update/message from the sheet authors, and is non-obstructive even when not dismissed.


[edit] Sharing code/collaboration

If you need to share larger parts of a sheets code with others on the Roll20 forums or somewhere else quickly, using GitHub Gist to share the full sheet is a smart alternative to Dropbox/Google Drive/Pastebin.

The "Revisions" tab of a gist shows clearly code changes between revisions, so tracking what have changed makes things easier for you and others.

  • hilite.me can be used to convert your code to pretty html-formatted code that's very clear when copypasted to the forums. (Trick by The Aaron)

[edit] Related Pages

[edit] See Also