Disclaimer: I am fairly ignorant, and most of what I know comes from being too stubborn to quit on rewriting an existing sheet for my own use. With that said, I have been steadily improving my sheet and what follows is just some basic stuff I have learned from what I have gone through. First, you have 10 columns, so I put a blank line in the html to show the row line break. That is something I had to do for my own sanity. If you have many rows, it is hard to find a specific row item if you can't easily find the row breaks. That is because when you specify rows (in this case 10) in css, it will just keep throwing things into that many columns until it runs out of items. If I had put in 21 entries, the last would show up under the name text box. If you need a blank spot in a row, you can throw in a spot filler in html like: <div class='space-holder'></div> The entries I used for the text are header entries, so already make the text bold. The number indicates the size of header. I reference the class in the css to make the background yellow. You can use html color code to put any color there you want. You can set the css to automatically stretch/shrink cells, but I have taken to setting widths (possibly a bad habit on my part) because I like things to keep their spacing. As far as I can tell, the following things are true when messing with input fields for a character sheet: 1. An input field will make a text input if you use a custom type, so it doesn't have to be type="text". This allows you to use custom labels to reference in css. 2. A number field (type="number") can't have the width altered, will ignore grid column width, and will overlap the next column to the right. 3. A text field will work fine for numbers, you just don't have the little up and down arrows. <div class='stats-grid-container' > <h4 class='statlabel' >Name</h4> <h4 class='statlabel' >Move</h4> <h4 class='statlabel' >W.S.</h4> <h4 class='statlabel' >B.S.</h4> <h4 class='statlabel' >S.</h4> <h4 class='statlabel' >T.</h4> <h4 class='statlabel' >W.</h4> <h4 class='statlabel' >A.</h4> <h4 class='statlabel' >L.D.</h4> <h4 class='statlabel' >S.V.</h4> <input class='name' type='text' value='' name='attr_character_name' /> <input class='stats' type='text' value='0' name='attr_movement' /> <input class='stats' type='text' value='0' name='attr_weaponskill' /> <input class='stats' type='text' value='0' name='attr_ballisticskill' /> <input class='stats' type='text' value='0' name='attr_strength' /> <input class='stats' type='text' value='0' name='attr_toughness' /> <input class='stats' type='text' value='0' name='attr_wounds' /> <input class='stats' type='text' value='0' name='attr_attacks' /> <input class='stats' type='text' value='0' name='attr_leadership' /> <input class='stats' type='text' value='0' name='attr_save' /> </div> .sheet-stats-grid-container{ display: grid; grid-template-columns: 213px 42px 42px 42px 42px 42px 42px 42px 42px 42px } .sheet-statlabel{ background: yellow; text-align: center; } .sheet-stats{ width: 40px; } I'll try to upload a screenshot in a bit. I made a test game, and this is that row on a character sheet, complete with the Roll20 randomly generated name (gotta love those...). Most everything else you want to do is a spin off of that. Repeating sections are done in a similar way. Figure out how many columns you need, write your html with enough class/type references to do what you need in css, set up the css grid size, and then set anything you need within. You can even set a grid within one of the grid cells if you need. I mention that, because you may eventually find some of your stats will need 2 boxes, one for current and one for max with some sort of divider in between.