Card Creator Documentation
An in-depth guide for using the Card Creator tool to design custom Frosthaven class cards. This documentation covers everything from basic actions to advanced styling and token configuration.
Introduction
On this page you will find detailed explanations of all commands and syntax options available in the Card Creator.
Note: The Card Creator currently has a few issues with rendering certain elements in browsers other than Chrome. If you encounter any problems, please try using Chrome for the best experience.
Getting Started
Before you begin creating your cards, it’s recommended to set up some base info and define some properties. These properties will be used to customize the look of your custom class. These steps aren’t strictly required, but they can help reinforce the thematic identity of your class.
Base Info
The base info section is where you can define all the aspects of your class that don’t involve the cards themselves, such as the info presented on the class mat.
Here is a brief overview of the properties you can define:
| Property | Description |
|---|---|
|
The name of your custom class. |
|
The race of your class. |
|
The HP level of your class. This can be set to Low, Medium, or High (case sensitive!). |
|
The name of your class given to it based on its icon. |
|
The complexity of your class. This can be set to any number between 1 and 5. |
|
The melee value of your class. This can be set to any number between 1 and 5. |
|
The ranged value of your class. This can be set to any number between 1 and 5. |
|
The mobility value of your class. This can be set to any number between 1 and 5. |
|
The support value of your class. This can be set to any number between 1 and 5. |
|
The defense value of your class. This can be set to any number between 1 and 5. |
|
The control value of your class. This can be set to any number between 1 and 5. |
|
The elemental affinities of your class. This can be set to a comma-separated list of elements that your class is proficient in, or none. Viable Elements are "fire", "ice", "wind", "earth", "light", "dark", "wild". |
|
The size of the background image for your class on the banner in the class list. This banner can also be seen at the top of the page. This is set to a pixel amount. Note: The image that this uses will be set later, when making a TTS mod. |
|
The position of the background image for your class on the banner in the class list. This is based from the top left corner, and is set to two pixel amounts, one for the x-axis and one for the y-axis. |
|
The development status of your class. This can be set to any of the following: "Concept", "Alpha", "Beta", "Released". |
|
A link to the Discord channel for your class. |
|
Whether your class is public or not. This can be set to true or false. Note: A public class can be viewed by anyone, but it can’t be edited by anyone except those who have been given edit access. |
|
You can enter discord user IDs here to allow those users to edit the class. This is useful for collaborative projects. |
Creating a Deck
To create a deck, head to the "Decks" tab in the Card Creator and click the "Add" button. This will create a new deck for your class. You can then open this deck by clicking its name in the list, or the "Cards" button next to the deck.
Deck Building
Once a deck is created, and you have opened it by either clicking on it, or clicking the "Cards" button next to it, you’ll be brought to the screen you’ll be spending the majority of your time in. This is the deck building screen.
Immediately, you’ll be able to see two buttons, "Show starting deck" and "Show advanced deck". Once you’ve started creating cards, you can use these buttons to see the entire level 1/X spread, and the entire level 2-9 spread, respectively.
Below that are four more buttons: "Deck Properties", "Deck Stats", "Card Style", and "Templates". Clicking any of these will open its respective window.
One thing to note about the following sections is that for some of the options (especially the color properties), it’ll be easier to see what they do once you’ve actually started creating cards. You can either skip to the Adding Cards section to start creating cards, or continue reading to see what each section does.
Deck Properties
The "Deck Properties" section is where you can view and set various properties for the deck. This includes the name of the deck, a link to the class icon, and links to different class tokens, allowing you to add custom images to cards (this is explained in more detail in Basic Actions and Custom Actions). Custom class icons can also be scaled with two separate properties: one for inline size and one for main action size, as explained in Syntax.
Card Style
The "Card Style Editor" section is where you can modify how your cards look. This editor window is split into 3 main sections: Base Colors, Detail Colors, and Card Back Colors.
Before delving into the specifics of each, you might notice an option at the top to choose whether you want to use the Frosthaven or Gloomhaven (2nd edition) template as your card base. You might also notice that you can add more card styles to your deck by pressing the + button and cycling between them with the ← and → buttons, allowing you to style multiple variants for the same deck separately. We will elaborate on how to use a specific style later in Syntax.
Base Colors
In the Base Colors sub-menu, you have access to several core card styling options, and for most projects, you will not need much more than that. You can adjust the color of the background texture that overlays the background image, the colors of the top banner where the card name appears, and the side banners. You can also change the color of the outer frame, the lines that separate objects, and the backgrounds of boxes such as optional text blocks and element consumptions. If you are using a Frosthaven-based template, you can also modify the color of the runes on the sides of the card.
When using the color picker, pressing the label at the bottom where it says RGB will cycle through different color definitions: RGB → HSL → HEX → RGB. This can be useful depending on which color format you prefer to work with. Note that this behavior is browser-dependent, and not all of these options may be available in every browser.
Most of these visual elements also have an Img button that allows you to upload a custom design for that element, replacing the default one. You can always return to the default asset by pressing the Default button.
Warning: Using Img to change the card’s main background is not the recommended workflow. For background changes, use the method in Detail Colors.
Detail Colors
In the Detail Colors section, some options repeat settings that are already available in the Base Colors tab, so do not worry about that. Among the new options is the ability to tint the top action, bottom action, and initiative separately. You can also add a custom background URL for the card and adjust it using Left and Top for positioning, along with Opacity and Scale. There is also granular control over how the class icon sits in the top-right corner of the card.
Card Back Colors
In the Card Back Colors section, you can adjust the background texture color on the back of the card, the colors of the top and side banners, the color of the decorative element, and the color of the outer frame. You can also adjust the color of the class icon, although you will only see that change if you linked an image for it in the Deck Properties menu. If you are using a Frosthaven-based template, you can also modify the color of the runes on the sides of the card.
Templates
The "Templates" section is intended to make complex layouts reusable. Instead of rewriting the same advanced object structure each time, you can define it once and reference it later by keyword.
For example, the advanced banner/grouping pattern shown in Banners and Object Grouping can be represented as a reusable object call in your card script:
- banner:
- bannerContent:
# put content for the banner here
- otherContent:
# put content for the rest of the action here
When you open the Templates page, you will see 3 columns:
-
Left: all templates you have already defined.
-
Middle: a live preview of how the selected template appears on a card.
-
Right: the editor where you define and modify the template code.
To add a new template, use the button at the bottom-left of the Templates page. After pressing it, choose the template name/keyword. This keyword is what you will use in other scripts when referencing that template.
Template edits in the right-side editor are saved automatically. By default, a template object is shared between top and bottom actions. If your layout needs different implementations for each half (as shown in Banners and Object Grouping), disable "Object is same on top and bottom" and edit each version separately.
Variables
Templates support injected variables using the notation !<variable-name>. This lets a template expose placeholders that you fill at the call site. In the Banners and Object Grouping advanced example, the two comment areas (put any content supposed to be in the banner in here and put content for the rest of the action here) are the exact spots replaced by variables in the short template-call example above: !bannerContent replaces the banner content area, and !otherContent replaces the rest of action area.
Templates also support inline variables with the syntax @{variableName} or @{variableName:defaultValue}. These can be used anywhere inside the template to inject a value, and the default is used when the card does not provide one.
For example, a template could contain:
- attack: @{attackValue:2}
- custom: 'If this attack does more than %damage%@{attackValue:2}, die.'
color: @{tint:red}
And then a card could use that template like this:
- template1:
attackValue: 6
tint: rgb(100, 100, 100)
Deck Stats
The "Deck Stats" section shows a quick overview of the elements that are present in the deck. This is useful for keeping track of how many infusions and consumptions are in the deck. This section also displays the initiatives of all the cards in the deck. This can help with balancing.
Adding Cards
While inside the deck building screen, you can add cards to the deck by clicking the "Add Card" button. This will create a new card in the deck. You can then edit this card by clicking on it. This will bring it into focus next to the text box containing its code.
This state, where the card is in focus, is also the best way to see the changes you make in the previous properties sections, because the card updates in real time.
Exporting Cards
To export a high-quality spread image of your cards:
-
Head to the TTS Mods section (even if you are only interested in exporting cards and not creating a full mod) and create a new mod linked to the deck you are working on.
-
In the mod, find the Starting Deck section under Assets and click Upload on the Ability Cards image. If your deck has level 2–9 cards, do the same for the Advanced Deck section.
-
Once uploaded, a high-quality spread image will be generated and displayed on the right side of the page. This image can be copied or downloaded and used anywhere.
Print and Play (PnP) with Bleed
For high-quality Print and Play exports with bleed, you can use your browser’s developer tools to capture individual cards or the full spread. This is an advanced workflow that requires a little familiarity with browser dev tools.
Steps:
-
Open the deck in the Card Creator and navigate to the Starting Deck (or Advanced Deck) spread view.
-
Open your browser’s developer tools by pressing F12.
-
Right-click the frame of any card on the spread and choose Inspect. This will highlight that element in the dev tools panel.
-
In the element tree, look 1 or 2 levels above the inspected element for the element with class
test0 bleed. Select it. -
In the Styles panel on the right:
-
Disable the
widthproperty. -
Set
heightto563px. -
Disable the
overflowproperty.
-
-
Now select the
ccWrapperelement that sits directly belowtest0 bleedin the tree. -
In its styles, disable both the
leftandtopproperties. -
You are now ready to capture. Decide what you want to export:
-
To capture a single card, inspect any card frame and find its
baseclass element. -
To capture the entire spread, find the
puppeteerWrapperelement instead.
-
-
With your target element selected in the dev tools, press Ctrl+Shift+P and type
Node. Select Capture node screenshot from the list. The image will be downloaded automatically.
Tips for better quality:
-
In the dev tools toolbar at the top, set the Dimensions field to your native screen resolution.
-
Set DPR (Device Pixel Ratio) to 3 or higher for a sharper output. Going above 3 may require some extra fiddling depending on your browser.
Syntax
The syntax of the Card Creator uses simple commands to render icons and values. Commands typically follow this structure:
- command: [value]
Modifiers can be added to fine-tune placement, styling, or functionality. Sections below break down each command group.
NOTE: For many examples on card structure and syntax, including all the examples shown in this documentation, feel free to browse the "Example Syntax" class present in the tool. The classes are ordered alphabetically, so the "Example Syntax" class will be found around the letter E.
Tip: It can also be useful to look through other published classes to see how different creators structure cards, solve layout problems, and build their own visual style.
Tab Hierarchy
The structure of a card is based on indentation. Every sub-block or modifier must be indented with exactly 2 spaces more than its parent. This tells the system which modifiers belong to which command. For the purposes of this guide, "parent" refers to the block that is one level higher in the hierarchy.
For example:
- attack: 3
margin: 5px 0px 0px 0px
In this example, the "margin" modifier is indented 2 spaces relative to the "- attack: 3" command, indicating that it applies specifically to that action.
Here is a more complex example:
- group:
- attack: 3
- divider
margin: 10px 0px
- move: 2
- divider
- optional:
- consume: [dark,light]
- heal: 2
sub:
- range: 3
- wild
noLine: true
flexDirection: column
In this example, we have utilized a "group" block to contain multiple actions. Each action is indented 2 spaces relative to the "group" command. This indicates that they all belong to that outer block. The hierarchy continues with the "divider" and "optional" blocks, each containing their own sub-blocks.
A more detailed explanation of each block type is provided in the following sections.
Remember: use 2 spaces per level of indentation to maintain the proper hierarchy.
General Structure Overview
When you create and focus a new card, you will immediately be greeted with a basic structure like this:
name: New Card
initiative: 0
level: 1
top:
actions:
- ''
bottom:
actions:
- ''
If you want to change the base actions (the attack 2 for top and move 2 for bottom), you can modify the following parameters:
baseAttack:
actions:
- ''
baseMove:
actions:
- ''
As you can see, there are already a few things you can control. Changing the name of the card, its level, or its initiative is as easy as modifying the value. There are also a few modifiers outside the main action block:
-
number: Xsets manual card order in editor.Xis card ID/position. Cards withoutnumberappear at end. -
style: Xapplies alternate style ID from Card Style. Use values such as0,1,2, and so on. -
corner:adds custom information and iconography to bottom-left corner of card.
Finally, let us continue with the main block defined by:
top:
actions:
- ''
bottom:
actions:
- ''
Any action the card defines, as discussed in Basic Actions, goes into the actions segment. However, there are also several modifiers for a top or bottom action that go outside that block.
These include:
-
infuse: [elements…]to add a mandatory infusion box at the top level of the action. -
duration: [value]to add either a "round" or "persistent" duration icon. -
lost: trueto mark the action as lost. -
remove: trueto mark the action as unrecoverable. -
xp: [value]to add global XP to that half of the card.
These modifiers and/or icons go before the actions block, since they apply to the entire half of the card. For more detail on these properties, see Other Common Card Properties.
Basic Actions
This section covers the core actions used to define a card’s abilities.
| Syntax | Description | Example | Result |
|---|---|---|---|
|
Creates an attack ability with a value of [value]. |
|
|
|
Creates a move ability with a value of [value]. |
|
|
|
Creates a teleport ability with a value of [value]. |
|
|
|
Creates a shield ability with a value of [value]. |
|
|
|
Creates a retaliate ability with a value of [value]. |
|
|
|
Creates a loot ability with a value of [value]. |
|
|
|
Creates a heal ability with a value of [value]. |
|
|
|
Creates a class token ability using the token linked to the specified index. |
|
|
Conditions
Conditions modify abilities and can be used with or without an associated value. The available conditions are:
-
bane
-
blind
-
bless
-
brittle
-
chill
-
curse
-
disarm
-
dodge
-
empower
-
enfeeble
-
immobilize
-
impair
-
infect
-
invisible
-
muddle
-
pierce
-
poison
-
pull
-
push
-
regenerate
-
rupture
-
safeguard
-
strengthen
-
stun
-
swing
-
taunt
-
ward
-
wound
| Syntax | Description | Example | Result |
|---|---|---|---|
|
Renders a condition icon. |
|
|
|
Renders a condition icon with an optional value. |
|
|
Elements
Elements represent various thematic or mechanical attributes. They support single values, consumption markers, and infuse modifiers.
Tip: You can write a consume icon inline by appending c to the element name, e.g. firec will render a consume fire icon. This works for any element (e.g. icec, windc).
Available elements include:
-
earth
-
fire
-
air (or wind)
-
ice
-
light
-
dark
-
wild
Using multiple elements separated by '/' will generate an “or” condition.
| Syntax | Description | Example | Result |
|---|---|---|---|
|
Renders the icon for the given element. |
|
|
|
Renders a list of element icons with an added consume marker (usually used within an optional block). |
|
|
|
Adds a mandatory box with a list of specified elements. (Note: As a modifier, do not prefix with a '-') |
|
[! |
|
Lets you customize the default position and styling of the infuse action. |
|
The infuse action will be pushed down by 5px. |
Note: The square brackets in the consume and infuse examples are required in the syntax.
Note: For infusion, this will only work at the first indentation level. This means that either bottom: or top: should be its direct parent. infuseStyle: should sit directly below infuse:, but it should share the same parent block.
Custom Actions
There is a special block for custom actions, which allows you to write any text you want. This block is useful for creating unique abilities or actions that don’t fit into the predefined categories.
Within these blocks, you can insert any of the common icons, such as conditions or elements, to further customize your text. This includes any class tokens that you’ve linked in the properties section.
The syntax for inserting these icons is: %iconName%.
Here are some examples of custom actions:
| Syntax | Description | Example | Result |
|---|---|---|---|
|
Creates a custom action with the specified text. |
|
Text |
|
Creates a custom action with the specified text. |
|
Text with |
|
Creates a custom action with the specified text. |
|
Text with |
|
Creates a custom action with the specified text. |
|
Text with |
Icon Modifiers
These suffix modifiers can be applied to any icon name. Add the modifier to the end of the icon name, for example %move-s%.
| Modifier | Description | Example | Result |
|---|---|---|---|
|
Removes the icon’s shadow. |
|
|
|
Inverts the icon’s color. |
|
Sub Blocks
Sub Blocks are the blocks that house the extra properties of an action. These are things like range, target, and other modifiers that can be applied to an action. These blocks are always indented 2 spaces from their parent action, like so:
- attack: 3
sub:
- target: 2
- range: 3
- pierce: 1
In this example, the "sub" block contains the "target", "range", and "pierce" modifiers. These are all indented 2 spaces from the "attack" command, indicating that they are all part of that action.
Alongside all existing conditions, the available attributes you can put in a sub block are:
-
target
-
range
-
custom
Optional Blocks
Optional blocks represent abilities, or augments to abilities that come with a cost. The most frequent example of an optional block is an elemental consumption. This would be represented as follows:
- attack: 3
- optional:
- consume: [earth]
- custom: '+2 %attack%'
The above will render an attack 3 ability with an optional block that consumes earth and adds +2 attack. Sometimes, an optional block may be used to represent an extra ability, rather than an augment to an ability (without being attached to it), in this case we use the modifier "noLine". An example of this would be:
- move: 3
- divider
- optional:
- consume: [earth]
- heal: 2
noLine: true
In this example, we have a move 3 ability with an optional block that allows consuming earth to perform an additional heal 2. The noLine modifier is used to prevent a line from being drawn between the move and heal abilities, since in this case they are separate abilities.
Mandatory Blocks
Mandatory blocks are used to represent abilities that must be performed if that action is being played. Outside elemental infusion (which is created automatically with the infuse modifier), mandatory blocks are most often used to force a negative action to occur. An example of this would be:
- attack: 3
- divider
- mandatory:
- curse:
sub:
- self
In this example, we have an attack 3 ability with a mandatory block that means the player has to curse themselves.
An extension of the mandatory block is the Mode Blocks section.
Tokens
The tokens block creates token slots. Each number in the provided array represents the XP that the token slot provides.
| Syntax | Description | Example | Result |
|---|---|---|---|
|
Creates token slots with XP values where there is '1' in the array. |
|
Renders token slots accordingly. |
Token Modifiers
Modifiers for tokens allow you to control how token slots are arranged.
| Modifier | Description | Example | Result |
|---|---|---|---|
|
Forces tokens to render in a specific layout: either 3 or 4 tokens on 1 or 2 lines. Other numbers follow predefined arrangements (1–2 tokens on one line, 5–6 tokens on two lines). |
- tokens: [0,1,0,1] |
Renders tokens in a single line. |
Area of Effect
The area of effect block is used to create a hex pattern. This takes the following form:
- hex: et_st_eh
h: invert(0.28) sepia(1) saturate(9.5) hue-rotate(340deg) brightness(0.82) contrast(1.1)
In this example, we have an area of effect block that creates a hex pattern of two hexes in front of the player and another orange hex below them. Each letter in the string represents a hex, and the order of the letters determines the order of the hexes. The letters are as follows:
-
e: no hex rendered (used for positioning other hexes)
-
t: target
-
s: self
-
a: ally
-
b: blank
-
x: enhancement dot hex
-
_: start new row
You may also use some letters for custom colored hexes, which you can color using CSS styling as shown in the example. These letters include d, h, f, and c.
To place icons on hexes, use the hexIcons modifier on the hex object. You can target any visible hex letter in the pattern, including a (ally), b (blank), t (target), s (self), and custom hexes such as h, c, d, and f. When placing an icon on a hex, it is usually best to remove the default shadow; see Icon Modifiers. You can do that by adding -s to the icon name, as in classToken0-s. The simplest form maps a hex letter directly to an icon name:
- hex: a
hexIcons:
a: classToken0-s
If you need more control, you can use an object instead. This gives the same result by default, but also lets you adjust the icon with dx, dy, and scale:
- hex: a
hexIcons:
a: {icon: classToken0-s, dx: 0, dy: 0, scale: 1}
Any of those extra properties can be omitted, and the default values will be used.
Summons
Summons are a special type of action that can be created using the "summon" block. This is one of the more complex blocks, as it has a lot of properties that can be set. Here is an example of a basic summon block:
- custom: 'Summon Example Summon'
- summon:
name: 'Example Summon'
stats: [5,2,3,'-']
image:
url: "https://example.com/image.png"
size: 100%
position: '0px 0px'
special:
- shield: 1
width: 100px
Note: This specific block’s properties require a double indentation (4 spaces).
In this example, we have a custom action that creates a summon called "Example Summon". This summon has 5 health, 2 move, 3 attack, and no range. The summon also has an image, which is set to a URL, and has various properties to position the image in the image box. It also has 1 shield defined in the special box (optional). Finally, the width of the special area is set to 100 pixels.
Here are all the properties that can be set for a summon:
| Property | Description | Example | Result |
|---|---|---|---|
|
The name of the summon. |
|
The summon will be called "Example Summon" in TTS. |
|
The stats of the summon. This should be an array of 4 numbers, in the order of health, move, attack, range. |
|
The summon will have 5 health, 2 move, 3 attack, and no range. |
|
The image of the summon. This should be an object with the properties "url", "size", and "position". This will also be used for the TTS standee. |
|
The summon will have an image from the URL "https://example.com/image.png", with a size of 100%, and a position of 0px 0px. |
|
The possible enhancements on the summon. This should be an array of the possible enhancements, or "none" if there is no enhancement for that attribute. The array follows the same order as the stats array. |
|
The summon will have a square enhancement for health and attack, and no enhancement for move and range. |
|
The special abilities of the summon. These are things like shield, retaliate, or other abilities that the summon performs. It will show up to the right of the stats. |
|
The summon will have a shield 1 ability. |
|
The background color of the special area. This should be in rgb form as shown in the example. |
|
The background of the special area will be red with 50% opacity. |
|
The width of the special area. This should be in pixels. |
|
The special area will be 100 pixels wide. |
There are further properties that can be set for a summon. These extra properties won’t change the appearance of the card, but will change the behavior of the summon in TTS. These properties are:
| Property | Description | Example | Result |
|---|---|---|---|
|
The attributes of the summon. This is used for things like whether the summon is flying or has a shield. Setting this will make the attributes appear under the standee’s health. |
|
The summon will have a shield value of 1. |
|
The effects of the summon. This is used for things like whether the summon wounds on attacks. Setting this will make the effects appear under the standee’s health. |
|
The summon standee will show that they wound on their attacks. |
|
The text that appears on the summon standee. This can be anything you want, and will appear under the effects. This text can include icons like range and attack, but the syntax is different. To include an icon, include {e.IconName} in the text, where "iconName" is the name of the icon you want to include. |
|
The summon standee will show "This is some example text with |
|
The immunities of the summon. This is something like if the summon is immune to poison. |
|
The summon will be immune to poison. |
|
The color of the health bar on the summon standee. This should be in hex form as shown in the example. |
|
The health bar on the summon standee will be red. |
|
The color of the health text on the summon standee. This should be in hex form as shown in the example. |
|
The health text on the summon standee will be white. |
For a summon to operate correctly in TTS, it needs a detailed stats block in addition to its name. This block uses a nested object format and allows you to define richer stat information than the simple array, including attack effects and movement type:
- summon:
name: 'Example Summon'
stats:
health: 2
attack:
value: 1
effects:
- "Muddle"
movement: 2
movementType: "Fly"
range: 3
In this example, the summon has 2 health, a move of 2, a range of 3, and an attack of 1 that inflicts Muddle. The movementType is set to "Fly", which means the summon will be treated as a flying unit in TTS. The effects array inside attack accepts condition name strings and will display them on the standee in TTS.
Named Abilities
Named ability blocks are used to create a small banner in the top left corner of the card. This is useful when you have certain keyword abilities that have special rules defined on the class mat. A starter class that uses this is Mindthief, with its "augment" abilities. Note: this block only refers to the corner containing the keyword, not the banner containing the abilities. For help with the abilities banner, see the Advanced Styling section.
In order to use this block, it should be placed at the base level of the action, with only "top:" or "bottom:" as a parent. Here is an example:
- top:
namedAbility:
name: Augment
Mode Blocks
The mode block can be used to create something akin to Blinkblade’s fast or slow abilities. Here is an example of how to use the mode block:
- mode:
- attack: 2
icon: '%classToken0%'
In this example, we have a mode block that contains an attack 2 ability, and an icon of the class token.
The mode block has a couple of special properties that can be set. These are:
| Property | Description | Example | Result |
|---|---|---|---|
|
The stuff that appears in the smaller box of the mode. |
|
The icon of the class token will appear in the smaller box of the mode. |
|
If set to true, the mode will be reversed. This means that the smaller box will be on the right, and the larger box will be on the left. |
|
The mode will be reversed. |
|
Sets the background color of the mode block. Accepts any valid CSS |
|
The mode block background will be marine-blue. |
|
The background color of the left box. This will usually be in rgb form as shown in the example. |
|
The left box will have a red background with 50% opacity. |
|
The background color of the right box. This will usually be in rgb form as shown in the example. |
|
The right box will have a green background with 50% opacity. |
|
The background color of the border between the two boxes. This will usually be in rgb form as shown in the example. |
|
The border between the two boxes will be blue with 50% opacity. |
|
Moves the divider between the icon segment and the content segment by [value]. |
|
The divider between the icon segment and the content segment will be moved by 27pt. |
|
same as dividerIndent. |
|
The icon segment will be 40px wide. |
Other Common Card Properties
Before we get into more advanced styling options, here are some common properties for an action and how they can be used. Do note that all of these properties should be a direct child of the "bottom:" or "top:" block, just like the "infuse:" block.
| Syntax | Description | Example | Result |
|---|---|---|---|
|
Sets the duration of the action. This can be either "round" or "persistent". |
|
The |
|
Sets whether the card is lost. This can be either "true" or "false". |
|
The action will have an |
|
Sets whether the card is unrecoverable or not. This can be either "true" or "false". |
|
The action will have an |
|
Sets the XP value of the action. This can be any number. |
|
The XP value |
|
(TTS only) Adds a custom snap point at the given coordinates. Place it as a direct child of |
|
A snap point will be placed at coordinates 326px, 159px on the card in TTS. |
Styles & Modifiers
Modifiers allow you to fine-tune the placement, size, and appearance of each block. To apply modifiers, ensure each block is defined as an object (i.e. using a colon after the block name).
These style modifiers can be applied to any block, and should not have a hyphen in front of them. For example, to apply a modifier to an attack action, you would write:
- attack: 3
margin: 5px 0px 0px 0px
fontSize: 10px
Common Style Modifiers
| Modifier | Description | Example | Result |
|---|---|---|---|
|
Sets the margin around the block. This has a variety of ways to be set, as shown in the following examples. |
|
The first example will set the margin to 5px on the top, 0px on the right, 0px on the bottom, and 5px on the left. The second example will set the margin to 5px on the top, 0px on the sides, and 10px on the bottom. The third example will set the margin to 5px on the top and bottom, and 0px on the sides. The last example will set the margin to 5px on all sides. |
|
Sets the padding around the block. This has a variety of ways to be set, as shown in the following examples. |
|
The first example will set the padding to 5px on the top, 0px on the right, 0px on the bottom, and 5px on the left. The second example will set the padding to 5px on the top, 0px on the sides, and 10px on the bottom. The third example will set the padding to 5px on the top and bottom, and 0px on the sides. The last example will set the padding to 5px on all sides. |
Note: Padding is similar to margin, but they have separate use cases. Taking an optional block as an example, setting padding on the block will increase the amount of space that the block itself takes up, while setting margin will increase the space between the block and the action above it. You can think of padding as the space inside the block, while margin is the space outside the block.
More Style Modifiers
There are many more style modifiers that can be applied to blocks. Here are the remaining ones:
| Modifier | Description | Example | Result |
|---|---|---|---|
|
Sets the font size of the text in the block. This can be any number, and will be set in pixels. |
|
The font size of the text in the block will be 10px. |
|
Sets the height of the block. This can be any number, and will be set in pixels. |
|
The height of the block will be 10px. |
|
Sets the width of the block. This can be any number, and will be set in pixels. |
|
The width of the block will be 100px. |
|
Sets the display type of the block. This can be set to anything that is valid in CSS, but in almost every case, you don’t want to change this. |
|
The block will be set to display as a flexbox. |
|
Sets the direction that the content in the block will follow. This can be set to "row" or "column". Row will put the content in a row, while column will put the content in a column. |
|
The content in the block will be set to display in a column. |
|
Sets the background color of the block. This can be set to any color that is valid in CSS, including rgb, and rgba. |
|
The background color of the block will be set to red with 50% opacity. |
|
Sets the color of the text in the block. This can be set to any color that is valid in CSS, including rgb, and rgba. |
|
The color of the text in the block will be set to red with 50% opacity. |
|
Sets the spacing between words in the block. This can be set to any number, and will be set in pixels. |
|
The spacing between words in the block will be set to 5px. |
|
Sets the height of each line in the block. This can be set to any number, and will be set in pixels. This is useful for making the text more readable. |
|
The height of each line in the block will be set to 5px. |
|
Sets the gap between the items in the block. This can be set to any number, and will be set in pixels. This is useful for more advanced blocks that we’ll get into later. |
|
The gap between the items in the block will be set to 5px. |
|
Applies style modifiers specifically to icons within the block. |
|
Icons in the block will use a font size of 28pt. |
Position
To change a block’s position, orientation, or size, use the following modifiers:
| Modifier | Description | Example | Result |
|---|---|---|---|
|
Sets positioning mode: |
|
The block will be positioned absolutely. |
|
Adjusts vertical placement from the top edge of the parent or relative container. |
|
Adjusts vertical placement from the top edge, placing the block 10px down. |
|
Adjusts horizontal placement from the left edge. |
|
Adjusts horizontal placement from the left edge, placing the block 10px to the right. |
|
Applies CSS transformations (e.g., rotate, scale). Refer to https://developer.mozilla.org/en-US/docs/Web/CSS/transform for more info. |
|
Doubles the size of the block. |
You can also use additional CSS properties beyond the list above. Viable options include background, display, clipPath, opacity, zIndex, filter, alignContent, justifyContent, alignItems, and textAlign.
Refer to https://developer.mozilla.org/en-US/docs/Web/CSS for more info.
Other Controls
Above the code editor, there are several controls that help you work with card code more efficiently.
| Control | Description |
|---|---|
|
Disables or enables line wrapping, which can help avoid side scrolling when working with longer lines. |
|
Hides or shows the line numbers in the editor. |
|
Enables or disables folding for a parent block and all of its children. |
|
Lets you search for a keyword and optionally replace it. |
|
Add |
|
Changes the editor theme from dark to light. |
|
Disables or enables manual drag-and-drop positioning of elements on the card. |
|
Deletes the current card. |
Advanced Styling
This section covers two advanced styling topics: special text styling inside text-based blocks, and layout techniques for banners and grouped actions.
Special Text Styling
Inside text-based blocks such as custom, you can use a few special formatting helpers. %nbspX% inserts multiple spaces, where X is the number of spaces to add, and %lf% inserts a line break.
In addition, within - custom: text blocks, you can also wrap parts of a line (or the full line) in a %p_% <your text> %p% block to apply CSS paragraph styles. On its own, this block does nothing, but when paired with style settings it can modify the selected text segment. Separate each CSS setting with ;. For valid style properties, see Mozilla’s CSS reference: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference
Example:
- custom: 'This is a normal text followed by %p_font-weight:bold;font-size:20pt;color:#ff0000%a red bold text that is 20pt.%p%'
Shorthand for bold and italic:
You can quickly make text bold or italic without using the %p_% block. Wrap your text with %b%…%be% for bold and %i%…%ie% for italic. For example: %b%Bold text%be% and %i%Italic text%ie%.
Banners and Object Grouping
A banner is a styled area of the card, usually near the top, that visually groups related actions or information into a separate section. On official cards, this is often used to make a cluster of actions stand out from the rest of the card. The main block we use to create this kind of layout is the group block, which lets you place actions together for horizontal stacking or easier positioning. Here’s an advanced example of how we can recreate a banner-like layout using the group block:
top:
actions:
- group:
- group:
- group:
#-----------------------
# put any content supposed to be in the banner in here
#-----------------------
flexDirection: column
# - divider: # <===== Optional divider line that spans across the bottom of the banner
# position: absolute
# bottom: -5px
# transform: scaleX(300)
background: rgba(0,0,0,50%)
position: relative
left: 0px
paddingTop: 30px
paddingBottom: 10px
marginBottom: 5px
#-----------------------
# put content for the rest of the action here
#-----------------------
flexDirection: column
position: absolute
top: -20px
bottom:
actions:
- group:
- group:
- group:
#-----------------------
# put any content supposed to be in the banner in here
#-----------------------
flexDirection: column
- divider:
position: absolute
bottom: -5px
transform: scaleX(300)
background: rgba(0,0,0,50%)
clipPath: polygon(0% 0%, 0% 100%, 100% 100%, 100% 21px, calc(100% - 68px) 21px, calc(100% - 60px) 0, 60% 0%, 57% 20px, 56% 23px, 44.5% 23px, 43% 20px, 40.2% 0)
position: relative
left: 0px
paddingTop: 30px
paddingBottom: 10px
marginBottom: 5px
#-----------------------
# put content for the rest of the action here
#-----------------------
flexDirection: column
position: absolute
top: -23px
In this example, the layout is split into separate top: and bottom: implementations so each half can have an independent banner shape and alignment:
-
The outer
groupacts as the container for both the banner region and the non-banner action content. -
The nested
group → groupstructure creates a dedicated banner wrapper, while the innermostgroupis where banner content should be placed. -
flexDirection: columnis used on the inner content groups so banner content stacks vertically instead of the default row behavior. -
background: rgba(0,0,0,50%)applies the translucent banner fill. -
paddingTopandpaddingBottomcontrol the internal vertical spacing inside the banner, andmarginBottomseparates banner content from the rest of the action. -
In the
top:example,position: absolutewithtop: -20pxaligns the banner cleanly behind the frame. -
In the
bottom:example, thedivider(withposition: absolute,bottom: -5px, andtransform: scaleX(300)) creates a long separator line at the lower edge of the banner (this is commented out in the top part but can be used there too). -
Also in the
bottom:example,clipPathdefines a custom polygon silhouette for the banner to not overlap with the initiative box and the base move box. -
The final
top: -23pxon the non-banner content in thebottom:half compensates for the custom clipped banner geometry and aligns the banner to the card separator line cleanly.
The principles shown here can be applied to many different scenarios, and using a combination of everything shown so far, there is a lot of freedom available to you to create the card you want. Remember, you are able to access the example syntax class to see some examples of how to use these blocks, and how they can be combined to create the desired effect. Otherwise, experiment a little with the blocks, and see what you can come up with!
Tabletop Simulator Mod
When the time has come to export your class to Tabletop Simulator, there are a couple of things you need to do to make sure that your class works as intended. This section will cover the steps you need to take to make sure that your class works in Tabletop Simulator.
The very first step will be to create a mod for your class on the "TTS Mods" page. This page works very similarly to the "Decks" page, but instead of creating cards, you’re creating mods for your class.
Assets
Once you have created and opened a new mod, the main brunt of the work comes down to getting the various assets for your class sorted. This is all done within the mod that you created on the site.
At the top of the mod page, there are a few things to fill in before getting to the assets.
The first thing to do is to switch on the "Active Mod" toggle. This toggle is how TTS will know which mod to use when importing the class. In some cases, you’ll have multiple mods for the same class (for example if the class has two decks), and you’ll be able to import both decks by importing one, and then changing the active mod to the other.
After this you have the Mod Name and the Deck Index. The mod name can be set to anything you want, it’s just so you know which mod is which in the list of mods on the class creator website. The deck index is the index of the deck you want to import. This is usually 0, but if you have multiple decks, you can set this to the index of the deck you want to import.
Some people like to make a new deck for every version of the class they make, so they can keep track of changes, and if you’re doing this, you’ll need to change the deck index to the index of the deck you want to import. This starts at 0, and goes up by 1 for every new deck you make, so if you have 3 decks, you’ll have deck indexes 0, 1, and 2 (in the order they appear on the "Decks" page).
Now come the assets themselves.
Starting Deck
The first thing to do is to add the starting deck to the mod. This can be done in two ways, but the second way will be covered in Third Party Card Spreads. For those who have created their class on the site, the starting deck will be created for you, and automatically saved. All you have to do is click the "Upload Image" button in the starting deck section. If you want to download an image of the starting deck, you can do so by clicking the "Download Image" button.
Note: Downloading an image of the deck can be done without uploading it first, if you want to download an image of the deck before uploading it.
You’ll notice beneath the image of the card spread two input boxes for the number of cards in each row and the number of rows. If you’re using the site to create your class, these will be filled in for you, but if you’re using a third party card spread, you’ll need to fill these in yourself.
Finally, the last input box allows you to manually set snap points on the cards. This is an advanced feature, and will not need to be used often. In order to set these, click the "Add snap" button. This will begin the process of adding snap points. From there, just click the image of the spread in the locations where you want snap points to exist. You’ll be able to see them show up as red dots. When done, click "Close add".
Note: Snap points are automatically generated for token tracks, you do not need to add these yourself.
Advanced Deck
The advanced deck section is for the level 2-9 cards of the class. All the instructions for the starting deck apply here.
The Rest of the Easy Stuff
There are a few more assets that are as simple to add as clicking "Upload Image". These are:
-
The ability card back
-
The character token bag
-
The character token
-
The tuckbox
-
The class envelope
-
The icon for the classlist
These can also be linked to manually, if you have the URLs for the images.
Manually Linked Assets
There are a few assets that need to be manually linked to. These are:
-
The class mat front
-
The class mat back
-
The standee
-
The character sheet
-
The attack modifier deck
-
The perk reminder deck
In the case of the character sheet and the perks, you can use Sammy’s tool to create these. This is linked to underneath their input boxes. For the rest, you’ll need to upload the images to a hosting site, and then link to them in the input boxes.
With the perks (both the AMD and the reminders), a list of the perks is needed. The AMD list should look something like the following, but in order of left to right reading through your specific perk cards:
Attack Modifier (+0)
Attack Modifier (+1) (Wound)
Attack Modifier (+1) (Poison)
Attack Modifier (+1) (Muddle) rolling
Attack Modifer (ice-earth) rolling
The "Attack Modifier" part is required, as is the "rolling" part if the perk is a rolling modifier. The rest is up to you, but it should communicate clearly to the player what the perk does.
The perk reminder list should look something like the following:
Perk Reminder long rest
Perk Reminder short rest
Perk Reminder refresh
The "Perk Reminder" part is required, but the rest is up to you. This should communicate clearly to the player what the perk reminder does.
Final Options
There are a few final options that can be changed.
First we have the HP bar color, HP bar text color, and HP bar placement. These are all pretty self explanatory, and are used to change the color of the health bar on the standee, the color of the text on the health bar, and the placement of the health bar on the standee. The colors can be set using hex codes, and the placement is set to a number, with the default being 320.
Then there are all the character sheet and perk LUA scripts. These can be gotten from Sammy’s tool when you make the character sheet and the perks. They should just be copy and pasted into the input boxes.
Finally, there is the option to add a custom standee script. This is for any extra scripting you want to add to the standee, such as a second HP bar. This is an advanced feature, and will not be needed for most classes.
Importing
In order to import the class into TTS, you will first need to subscribe to the following mod on the Steam Workshop: https://steamcommunity.com/sharedfiles/filedetails/?id=3163711044
Once you have subscribed to the mod, you can open TTS, and create a new game. In the game, you’ll need to go to the "Workshop" tab, and search for the mod you just subscribed to. Once you’ve found it, click the "Load" button, and the mod will be loaded into your game. Within this you will see a tile that allows you to enter a class name and generate the bag.
Enter the name of the class you want to import, and click the button. This will create a bag with all the assets you need to play the class in TTS.
To upload this bag as your own Steam Workshop mod so that others can download and play your class, follow these steps:
-
Delete the class import tile
-
Go to the "Modding" tab and then "Workshop Upload"
-
Fill in the details for your mod, including the name, and thumbnail image
-
Click "Upload"
-
This will give you a big long number, which is the ID of your mod. You can use this to share your mod with others. The link to your mod will just be https://steamcommunity.com/sharedfiles/filedetails/?id= followed by the ID of your mod.
Third Party Card Spreads
If you’re not using the site to create your class, and instead just want to use it to import your class into TTS, you can still do this. Rather than using the "Upload Image" buttons, you’ll need to manually link to the images of your assets. Ensure that the level 1/X cards are separate from the level 2-9 cards, and that you’ve inputted the correct number of rows and columns for each card spread.
Once this is done, there is one extra step needed, that normally would be done for you. This is naming all the cards for import into TTS. Next to each image of the card spread, you’ll see a large input box. This is where you need to input the name of the card. This should be the name of the card, followed by the initiative value in brackets, and then the level of the card, in square brackets. For example, "Mighty Attack (48) [1]". This should just be in a list, with each card on a new line, similar to the perk list.
Other than having to manually link all the images, and name all the cards, the process is the same as if you were using the site to create your class.
Finish
And that’s it! You’ve now created a class, and imported it into Tabletop Simulator. If you have any questions, feel free to ask in the Discord, and someone will be able to help you out. Have fun playing your new class!
