A new sheet arrives

This is terrifying.
This commit is contained in:
morgdalaine
2021-11-18 10:57:07 -06:00
parent f6e095569b
commit c3bca66164
79 changed files with 18765 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
const gulp = require("gulp");
const pug = require("gulp-pug");
const sass = require('gulp-sass')(require('sass'));
gulp.task("scss", () => {
return gulp.src("./scss/arc.scss")
.pipe(sass({
outputStyle: "expanded"
}).on("error", sass.logError))
.pipe(gulp.dest("../"))
})
gulp.task("html", function () {
return gulp.src("./pug/arc.pug")
.pipe(pug({
pretty: true,
locals: require("../translation.json")
}))
.pipe(gulp.dest("../"))
})
gulp.task("watch", gulp.series(["scss", "html"], () => {
gulp.watch("./scss/**/*.scss", gulp.series(["scss"]))
gulp.watch(["./pug/**/*.pug","./js/**/*.js"], gulp.series(["html"]))
}))
gulp.task("build", gulp.series(["scss", "html"]))
+125
View File
@@ -0,0 +1,125 @@
on("sheet:opened", () => {
getAttrs(["sheet_type"], (updateAttrs) => {
if (!updateAttrs.sheet_type) {
updateAttrs.sheet_type = "character";
}
setAttrs(updateAttrs);
});
});
// NOTE: The API sets export_show to "on";
// it does not trigger the event handler
on("sheet:opened change:export", (eventInfo) => {
getAttrs(["export"], (val) => {
const updateAttrs = {};
updateAttrs.export_show = val.export ? "on" : "0";
setAttrs(updateAttrs);
});
});
[1, 2, 3].forEach((l) => {
on(`change:repeating_bonds:level_${l}`, (eventInfo) => {
if (eventInfo.sourceType == "player") {
let updateAttrs = {};
let changed = parseInt(eventInfo.sourceAttribute.slice(-1));
// fill major bonds below
for (let f = changed - 1; f > 0; f--) {
updateAttrs[`repeating_bonds_level_${f}`] = 4;
}
// clear major bonds above
for (let c = changed + 1; c <= 3; c++) {
updateAttrs[`repeating_bonds_level_${c}`] = 0;
}
setAttrs(updateAttrs);
}
});
});
GLOBAL__HEALTH.forEach(s => on(`change:${s} change:${s}_max`, eventInfo =>
currentMax(s, eventInfo)));
const currentMax = (attr, eventInfo) => {
if (eventInfo.sourceType == "player") {
let updateAttrs = {};
let attr_max = `${attr}_max`;
getAttrs([attr, attr_max], val => {
const current = parseInt(val[attr]) || 0;
const maximum = parseInt(val[attr_max]) || 0;
const newCurr = (current > maximum)
? maximum
: Math.max(0, current);
updateAttrs[attr] = newCurr;
updateAttrs[attr_max] = Math.max(0, maximum);
setAttrs(updateAttrs);
});
}
};
on("change:repeating_inventory:name", (eventInfo) => {
const id = eventInfo.sourceAttribute.split("_")[2];
const updateAttrs = {};
const name = eventInfo.newValue.trim();
let translation = getTranslationByKey(name)
if (translation) {
updateAttrs[`repeating_inventory_${id}_name`] = translation;
const searchInputs = _.difference(GLOBAL__INVENTORY_INPUTS, ["name"]);
_.each(searchInputs, (key) => {
const attr = `repeating_inventory_${id}_${key}`;
const i18n = `${name}_${key}`;
// check if property exists in global
if (GLOBAL__INVENTORY[name][key]) {
updateAttrs[attr] = GLOBAL__INVENTORY[name][key];
}
// check if translation exists
else if (getTranslationByKey(i18n)) {
updateAttrs[attr] = getTranslationByKey(i18n);
}
});
log(updateAttrs)
setAttrs(updateAttrs, { silent: true });
}
});
on("clicked:repeating_inventory:item-expand-toggle", (eventInfo) => {
const id = eventInfo.sourceAttribute.split("_")[2];
getAttrs([`repeating_inventory_${id}_item_expand`], (val) => {
setAttrs({
[`repeating_inventory_${id}_item_expand`]: val[`repeating_inventory_${id}_item_expand`] === "0" ? "on" : "0"
});
});
});
GLOBAL__SKILLS.forEach((skill) => {
on(`clicked:${skill}`, initiateSkillRoll);
});
on("sheet:opened", () => {
getAttrs(["version"], (updateAttrs) => {
// Logic to determine what updates need to be done
if (!updateAttrs.version) {
// set sheet version if it doesn't exist
updateAttrs.version = "1.0";
}
setAttrs(updateAttrs);
});
});
on("sheet:opened", () => {
var updateAttrs = {}
for (i = 0; i < GLOBAL__HEALTH.length; i++) {
var key = `${GLOBAL__HEALTH[i]}`;
var translation = `${key}_i18n`;
updateAttrs[translation] = getTranslationByKey(key);
}
setAttrs(updateAttrs);
});
+418
View File
@@ -0,0 +1,418 @@
const GLOBAL__HEALTH = [ "blood", "guts" ];
const GLOBAL__APPROACHES = [ "creative", "careful", "concerted" ];
const GLOBAL__SKILLS = [
"academic", "culture", "observe", "tactics",
"charisma", "guile", "impose", "insight",
"acrobatics", "coordination", "physique", "weaponry",
"artistry", "survival", "tinker", "trade",
"arcana", "focus"
];
const GLOBAL__DIFFICULTIES = [ "tn_modifier+0", "tn_modifier-1", "tn_modifier-2", "tn_modifier-3", "tn_modifier+1", "tn_modifier+2", "tn_modifier+3" ];
const GLOBAL__APPROACH_QUERY = `[[?{Approach|${GLOBAL__APPROACHES.map((app, i) => `${getTranslationByKey(app)}, ${i}`).join("|")}}]]`;
const GLOBAL__DIFFICULTY_QUERY = `[[?{Modifiers|${GLOBAL__DIFFICULTIES.map((dif, i) => `${getTranslationByKey(dif)}, ${i}`).join("|")}}]]`;
const GLOBAL__DIFFICULTY_EFFECTS = {
"tn_modifier+0": +0,
"tn_modifier-1": -1,
"tn_modifier-2": -2,
"tn_modifier-3": -3,
"tn_modifier+1": +1,
"tn_modifier+2": +2,
"tn_modifier+3": +3,
};
const GLOBAL__INVENTORY_INPUTS = [
"name",
"type",
"description",
"first_boon",
"second_boon",
"complexity",
"base_effect",
"enhanced",
"ritual"
];
const GLOBAL__INVENTORY = {
combat_scowling_face: {
type: "damage_and_defense",
complexity: 0,
},
combat_pitchfork: {
type: "damage_and_defense",
complexity: 0,
},
combat_memories_of_hardship: {
type: "damage_and_defense",
complexity: 0,
},
combat_iron_briefs: {
type: "damage_and_defense",
complexity: 0,
},
combat_booming_voice: {
type: "damage_and_defense",
complexity: 0,
},
combat_well_rounded_education: {
type: "damage_and_defense",
complexity: 0,
},
combat_darts: {
type: "damage_and_defense",
complexity: 0,
},
combat_dagger: {
type: "damage_and_defense",
complexity: 0,
},
combat_self_esteem: {
type: "damage_and_defense",
complexity: 0,
},
combat_studden_leather_armor: {
type: "damage_and_defense",
complexity: 0,
},
combat_devastating_vocabulary: {
type: "damage_and_defense",
complexity: 0,
},
combat_critical_thinking: {
type: "damage_and_defense",
complexity: 0,
},
combat_sturdy_sword: {
type: "damage_and_defense",
complexity: 0,
},
combat_crossbow: {
type: "damage_and_defense",
complexity: 0,
},
combat_plate_armor: {
type: "damage_and_defense",
complexity: 0,
},
combat_love_letter: {
type: "damage_and_defense",
complexity: 0,
},
combat_cunning_wit: {
type: "damage_and_defense",
complexity: 0,
},
combat_flaming_sword: {
type: "damage_and_defense",
complexity: 0,
},
supplies_rations: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_artisans_tools: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_crowbar_and_lantern: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_rope_and_carpet: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_bedroll: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_backpack: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_thieves_tools: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_fine_clothes: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_traps: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_tent: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_fishing_pole: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_live_hen: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_board_games: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_alchemists_tools: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_encyclopeida: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_spyglass: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_coded_letters: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_horse: {
type: "supplies_and_sundries",
complexity: 0,
},
oddities_seashell_horn: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_dead_donkey: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_ancient_ring: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_songbird: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_human_teeth: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_hat: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_monkey_head: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_heavy_crown: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_giant_serpent_scales: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_silk_dress: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_tyrant_pants: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_shadow_mirror: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_darkvision_glasses: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_divine_blood: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_seeds: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_potion_brawn: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_troll_flesh: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_telepathic_yak: {
type: "oddities_and_valuables",
complexity: 0,
},
spells_trinket: {
type: "spells_and_techniques",
complexity: 0,
},
spells_trick_of_the_light: {
type: "spells_and_techniques",
complexity: 0,
},
spells_soundshift: {
type: "spells_and_techniques",
complexity: 0,
},
spells_lifebringer: {
type: "spells_and_techniques",
complexity: 0,
},
spells_whisper: {
type: "spells_and_techniques",
complexity: 0,
},
spells_bind_weapon: {
type: "spells_and_techniques",
complexity: 0,
},
spells_unmask_the_self: {
type: "spells_and_techniques",
complexity: 0,
},
spells_secret_door: {
type: "spells_and_techniques",
complexity: 0,
},
spells_burn_the_past: {
type: "spells_and_techniques",
complexity: 0,
},
spells_master_of_elements: {
type: "spells_and_techniques",
complexity: 0,
},
spells_little_escapologist: {
type: "spells_and_techniques",
complexity: 0,
},
spells_pierce_the_veil: {
type: "spells_and_techniques",
complexity: 0,
},
spells_manic_hands: {
type: "spells_and_techniques",
complexity: 0,
},
spells_shadowbind: {
type: "spells_and_techniques",
complexity: 0,
},
spells_compel: {
type: "spells_and_techniques",
complexity: 0,
},
spells_windstep: {
type: "spells_and_techniques",
complexity: 0,
},
spells_blackout: {
type: "spells_and_techniques",
complexity: 0,
},
spells_spirit_pact: {
type: "spells_and_techniques",
complexity: 0,
},
spells_from_dust_to_dust: {
type: "spells_and_techniques",
complexity: 0,
},
spells_true_miracle: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_only_ones_who_know: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_uncanny_alarm: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_weave_through_water: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_memory_seed: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_flowmotion: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_saving_grace: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_inspiration: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_bind_magic: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_stonewall: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_heartpiercer: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_deadly_focus: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_redo: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_turn_the_tide: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_dispel: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_interdiction: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_fluorescent_transcendence: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_netherwave: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_become_one: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_defy_the_fates: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_doompause: {
type: "spells_and_techniques",
complexity: 0,
},
};
+81
View File
@@ -0,0 +1,81 @@
// thank you Scott C!
const initiateSkillRoll = async function (event) {
let skill = event.triggerName.replace(/clicked:/, "");
// figure out which approach to use -- so ask
let approachRoll = await startRoll(`!&template:default} {{query=${GLOBAL__APPROACH_QUERY}}}`);
// note that values for the query options above line up with their indexes in GLOBAL__APPROACHES
// also, this is an API message: it won't be visible to any user
// because it's so generic, it shouldn't trigger any API scripts
// finish approachRoll immediately vecause we aren't going to computee
// any values from it -- it's just a dummy roll
finishRoll(approachRoll.rollId);
// same song for difficulty
let difficultyRoll = await startRoll(`!&template:default} {{query=${GLOBAL__DIFFICULTY_QUERY}}}`);
finishRoll(difficultyRoll.rollId);
// parse the results
let approachValue = approachRoll.results.query.result;
let approach = GLOBAL__APPROACHES[approachValue];
let difficultyValue = difficultyRoll.results.query.result;
let difficulty = GLOBAL__DIFFICULTIES[difficultyValue];
let i18nApproach = getTranslationByKey(approach);
let i18nSkill = getTranslationByKey(skill);
let i18nDifficulty = getTranslationByKey("difficulty");
let i18nModifier = getTranslationByKey("modifier");
let finalTemplate = [
`&{template:skills}`,
`{{character_name=@{character_name}}}`,
`{{verb=^{tests}}}`,
`{{type=skill-test}}`,
`{{skill=${skill}}}`,
`{{roll=[[1d6]]}}`,
`{{flawless=[[1d6]]}}`,
`{{flawless=[[1d6]]}}`,
`{{TN=[[@{${skill}}[${i18nSkill}] + @{${approach}}[${i18nApproach}] +`,
`${GLOBAL__DIFFICULTY_EFFECTS[difficulty]}[${i18nModifier}]]]}}`,
`{{title=${approach}}}`,
`{{difficulty=${difficulty}}}`
].join("");
// now that we have all the helprmation, make the roll
let finalRoll = await startRoll(finalTemplate);
finishRoll(finalRoll.rollId);
};
// Functions added for code to make sense, not needed for getting regular and repeating sections.
// converts a value to a number, it's default value, or 0.
const value = function(val, def) {
return (+val||def||0);
};
// ===== PARAMETERS ==========
// destinations : the name of the attribute that stores the total quantity
// can be a single attribute, or an array: ["total_cost", "total_weight"]
// If more than one, the matching fields must be in the same order.
//
// section : name of repeating fieldset, without the repeating_
//
// fields : the name of the attribute field to be summed
// destination and fields both can be a single attribute: "weight"
// or an array of attributes: ["weight","number","equipped"]
const repeatingSum = (destinations, section, fields) => {
if (!Array.isArray(destinations)) destinations = [destinations.replace(/\s/g, "").split(",")];
if (!Array.isArray(fields)) fields = [fields.replace(/\s/g, "").split(",")];
getSectionIDs(`repeating_${section}`, idArray => {
const attrArray = idArray.reduce((m, id) => [...m, ...(fields.map(field => `repeating_${section}_${id}_${field}`))], []);
getAttrs([...attrArray], v => {
const getValue = (section, id, field) => v[`repeating_${section}_${id}_${field}`] === "on" ? 1 : parseFloat(v[`repeating_${section}_${id}_${field}`]) || 0;
const commonMultipliers = (fields.length <= destinations.length) ? [] : fields.splice(destinations.length, fields.length - destinations.length);
const output = {};
destinations.forEach((destination, index) => {
output[destination] = idArray.reduce((total, id) => total + getValue(section, id, fields[index]) * commonMultipliers.reduce((subtotal, mult) => subtotal * getValue(section, id, mult), 1), 0);
});
setAttrs(output);
});
});
};
+8822
View File
File diff suppressed because it is too large Load Diff
+37
View File
@@ -0,0 +1,37 @@
{
"name": "arc",
"version": "1.0.0",
"description": "Roll20 character sheet for ARC: Doom Tabletop RPG",
"main": "arc.html",
"scripts": {
"build": "gulp build",
"watch": "gulp watch"
},
"author": "Morgdalaine",
"funding": [
{
"type": "patreon",
"url": "https://www.patreon.com/morgdalaine"
},
{
"type": "ko-fi",
"url": "https://ko-fi.com/morgdalaine"
}
],
"repository": {
"type": "git",
"url": "https://github.com/morgdalaine/arc-doom-ttrpg",
"directory": "ARC/source"
},
"keywords": [
"Roll20"
],
"license": "MIT",
"devDependencies": {
"gulp": "4.0.2",
"gulp-pug": "5.0.0",
"gulp-sass": "5.0.0",
"pug": "3.0.2",
"sass": "1.37.0"
}
}
BIN
View File
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
include components/common/elements
include components/common/functions
include components/common/inputs
include components/common/popups
include components/approaches
include components/background
include components/bonds
include components/consequences
include components/experience
include components/header
include components/health
include components/inventory
include components/skills
include components/toolbar
include meta/data
.arc
+hidden({ name: "version", value: "1.0" })
+hidden({ name: "sheet_type", value: "character" })
+hidden({ name: "setting_tooltips", value: 1 })
+toolbar
+header
main.arc__layout
+hidden({ name: "sheet_type" })
include layouts/character
//- Roll Templates
include layouts/roll-template
//- Sheet Workers
script(type="text/worker")
include ../js/globals.js
include ../js/sheetworkers.js
include ../js/eventhandlers.js
+18
View File
@@ -0,0 +1,18 @@
mixin approaches
article.approaches
each app in data.approaches
+approach(app)
+approach-popup(app)
mixin approach(type)
+help(type)
section.approach
.approach__label
+span({ data_i18n: type }).approach__label--span
.approach__value
+number({ name: type, min: 0, max: 3 }).approach__value--input
mixin approach-popup(type)
+popup({ name: type, title: "approach" })
+span({ data_i18n: `${type}_description` })
+18
View File
@@ -0,0 +1,18 @@
mixin background
article.background
section.background__differences
+label({ data_i18n: "makes_them_different", for: "different" }).background--label
+textarea({ name: "different", id: "different" })
section.background__rumors
+label({ data_i18n: "three_rumors" }).background--label
fieldset.repeating_rumors
.background__rumors--wrapper
+textbox({ name: "rumor" }).background__rumors--input
section.background__lesson
+label({ data_i18n: "painful_lesson", for: "lesson" }).background--label
+textarea({ name: "lesson", id: "lesson" })
//- section.portrait
//- +label({ data_i18n: "portrait" }).background--label
//- .portrait__image
//- +img({ name: "character_avatar" }).portrait__image--img
+26
View File
@@ -0,0 +1,26 @@
mixin bonds
article.bonds
.bonds__header
+span({ data_i18n: "bonds" }).bonds__header--span
+help("bonds")
fieldset.repeating_bonds
+relationship
+popup({ name: "bonds", title: "bonds" })
+span({ data_i18n: "bonds_description" })
mixin relationship
article.bond
.bond__with
+textbox({ name: "relationship", data_i18n_placeholder: "name_placeholder" }).bond__with--input
section.bond__levels
each lvl in range(3)
+bond-levels(lvl)
mixin bond-levels(lvl)
.bond__container
.bond__major
+hidden({ name: `level_${lvl}`, value: 0 }).bond__control
+radio({ name: `level_${lvl}`, value: 0, checked: true }).bond__minor.reset
each minor in [4, 3, 2, 1]
+radio({ name: `level_${lvl}`, value: minor, title: minor }).bond__minor
@@ -0,0 +1,92 @@
//- create [tag] with properties
//- [tag] is passed in the obj but removed to prevent adding it to the final html
//- [data_i18n] is shorthand for data-i18n
//- [data_i18n_title] allows for translated title on :hover
//- [name] is prepended with attr_
//- [title] defaults to the attribute @{...}
//- [locals] adds text programmatically instead of writing it yourself
mixin tag(obj)
- const tag = obj.tag;
- obj = handleTag(obj);
#{tag}&attributes(obj)(class!=attributes.class)=locals[obj["data-i18n"]]
block
mixin span(obj)
- obj.tag = "span";
+tag(obj)&attributes(attributes)
block
mixin label(obj)
- obj.tag = "label";
+tag(obj)&attributes(attributes)
block
mixin h1(obj)
- obj.tag = "h1";
+tag(obj)&attributes(attributes)
block
mixin h2(obj)
- obj.tag = "h2";
+tag(obj)&attributes(attributes)
block
mixin h3(obj)
- obj.tag = "h3";
+tag(obj)&attributes(attributes)
block
mixin h4(obj)
- obj.tag = "h4";
+tag(obj)&attributes(attributes)
block
mixin h5(obj)
- obj.tag = "h5";
+tag(obj)&attributes(attributes)
block
mixin img(obj)
- obj.tag = "img"
- obj.title = obj.src;
- obj.src = `${data.assets.folder}${data.assets[obj.src]}`;
+tag(obj)&attributes(attributes)
mixin div(obj)
- obj.tag = "div";
+tag(obj)&attributes(attributes)
block
mixin section(obj)
- obj.tag = "section";
+tag(obj)&attributes(attributes)
block
mixin article(obj)
- obj.tag = "article";
+tag(obj)&attributes(attributes)
block
mixin button(obj)
if obj.type === "action"
- obj.name = `act_${obj.name}`;
else
- obj.type = "roll";
- obj.title = obj.title || `%{${obj.name}}`;
- obj.name = `roll_${obj.name}`;
if !obj["data-i18n"]
- obj["data-i18n"] = obj.data_i18n ? obj.data_i18n : null;
- obj.data_i18n = null;
button&attributes(obj)(class!=attributes.class)
block
mixin action(obj)
- obj.type = "action";
+button(obj)&attributes(attributes)
block
mixin roll(obj)
- obj.type = "roll";
+button(obj)&attributes(attributes)
block
@@ -0,0 +1,64 @@
-
const
range = (length) => [...Array(length).keys()].map(n => n + 1);
//- handle input object transformation
- function handleInput(obj) {
- // only set default title for specific inputs
- if (obj.type !== "hidden" && obj.type !== "checkbox") {
- obj.title = obj.title || `@{${obj.name}}`;
- }
- // default number placeholder to 0
- if (obj.type === "number") {
- obj.placeholder = obj.placeholder || 0;
- }
- // set data-i18n to value when unavailable
- if (obj.type === "select") {
- obj.data_i18n = obj.data_i18n || obj.value
- }
- // handle data-i18n-title and clear title
- if (obj.data_i18n_title) {
- obj["data-i18n-title"] = obj.data_i18n_title;
- obj.data_i18n_title = null;
- obj.title = null;
- }
- // handle data-i18n-placeholder
- if (obj.data_i18n_placeholder) {
- obj["data-i18n-placeholder"] = obj.data_i18n_placeholder;
- obj.data_i18n_placeholder = null;
- }
- obj.name = `attr_${obj.name}`;
- return obj;
- };
//- handle element object transformation
- function handleTag(obj) {
- obj.tag = null;
- // set default title for attributes
- if (obj.name) {
- obj.title = obj.title || `@{${obj.name}}`;
- obj.name = `attr_${obj.name}`;
- }
- // handle data-i18n-title and clear title
- if (obj.data_i18n_title) {
- obj["data-i18n-title"] = obj.data_i18n_title;
- obj.data_i18n_title = null;
- obj.title = null;
- }
- // handle data-i18n
- if (obj.data_i18n) {
- obj["data-i18n"] = obj.data_i18n;
- obj.data_i18n = null;
- }
- // handle data-i18n-vars
- if (obj.data_i18n_vars) {
- obj["data-i18n-vars"] = obj.data_i18n_vars;
- obj.data_i18n_vars = null;
- }
- // handle data-i18n-value
- if (obj.data_i18n_value) {
- obj["data-i18n-value"] = obj.data_i18n_value;
- obj.data_i18n_value = null;
- }
- return obj;
- }
+65
View File
@@ -0,0 +1,65 @@
//- base mixin for all inputs
//- [name] is prepended with attr_
//- [title] defaults to the attribute @{...}
//- [id] is prepended with attr_ or left null to remove from html
//- the reference for calling it in chat and custom macros
//- (class!=attributes.class) allows you to pass classes with +input({}).class
mixin input(obj)
- obj = handleInput(obj);
input&attributes(obj)(class!=attributes.class)
mixin checkbox(obj)
- obj.type = "checkbox";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin radio(obj)
- obj.type = "radio";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin textbox(obj)
- obj.type = "text";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin number(obj)
- obj.type = "number";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin textarea(obj)
- obj = handleInput(obj);
textarea&attributes(obj)(class!=attributes.class)
mixin hidden(obj)
- obj.type = "hidden";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin select(obj)
- obj = handleInput(obj);
select&attributes(obj)(class!=attributes.class)
if block
block
else
+option({ value: "empty select, pebkac", selected: true})
mixin option(obj)
- obj.tag = "option";
- obj.data_i18n = obj.data_i18n || obj.value;
+tag(obj)&attributes(obj)
mixin textarea(obj)
- obj = handleInput(obj);
textarea&attributes(obj)(class!=attributes.class spellcheck="false")
mixin fill-in-radios(obj)
+div({ class: obj.class }).radio__ranks
+radio({ name: obj.name, value: 0, checked: true, class: obj.class }).radio__rank.reset
each x in range(obj.max)
+radio({ name: obj.name, value: x, class: obj.class }).radio__rank
mixin alt-radios
.fill-in__container
.fill-in__major
+hidden({ name: `test`, value: 0 }).fill-in__control
+radio({ name: `test`, value: 0, checked: true }).fill-in__minor.reset
each minor in [4, 3, 2, 1]
+radio({ name: `test`, value: minor, title: minor }).fill-in__minor
+23
View File
@@ -0,0 +1,23 @@
mixin help(name)
+hidden({ name: "setting_tooltips" }).toggle-tooltip
div&attributes(attributes).help
+label({ }).help__label
- name = `show_${name}`;
+checkbox({ name }).help__label--input
+img({ src: "help" }).help__label--icon
mixin popup(obj)
- obj.header = obj.header || obj.name;
- obj.name = `show_${obj.name}`;
+hidden({ name: obj.name, value: 0}).toggle-popup
article.popup(class!=attributes.class)
.popup__title
+span({ data_i18n: obj.title }).popup__title--span
label.popup__close
+checkbox({ name: obj.name }).popup__close--btn
+img({ src: "close" }).popup__close--symbol
.popup__header
+span({ data_i18n: obj.header }).popup__header--span
.popup__content
block
+31
View File
@@ -0,0 +1,31 @@
mixin fallen-consequences
-
const roll__consequences = [
`&{template:fallen}`,
`{{character_name=@{character_name}}}`,
`{{title=^{fallen_consequences}}}`,
`{{verb=^{chooses}}}`,
`{{action=^{life}}}`,
`{{type=fallen}}`,
`{{consequence=[[1d6]]}}`,
].join("");
article.consequences
.consequences__header
+span({ data_i18n: "fallen_heroes" }).consequences__header--span
+help("consequences")
section.consequences__grid
+div({ data_i18n: "1d6" }).consequences__grid--header
.consequences__roll
+roll({ name: "consequence", value: roll__consequences }).consequences__roll--btn
+span({ data_i18n: "consequence" }).consequences__roll--span
each side in range(6)
- let name = `fallen_consequence_${side}`;
label.consequence__die
+checkbox({ name, value: 1, id: name }).consequence__die--input
.consequence__die--span=side
.consequence__die--square
+label({ data_i18n: name, for: name }).consequence__description
+popup({ name: "consequences", title: "life_and_death", header: "fallen_heroes" })
+span({ data_i18n: "fallen_heroes_description" })
+14
View File
@@ -0,0 +1,14 @@
mixin experience
article.experience
.experience__header
+span({ data_i18n: "xp" }).experience__header--span
+help("xp")
.experience__total
+input({ type: "number", name: "xp_max", min: 0 }).experience__total--input
+span({ data_i18n: "xp_total" }).experience__total--span
.experience__spent
+input({ type: "number", name: "xp", min: 0}).experience__spent--input
+span({ data_i18n: "xp_spent" }).experience__spent--span
+popup({ name: "xp", title: "xp", header: "experience" })
+span({ data_i18n: "xp_description" })
+21
View File
@@ -0,0 +1,21 @@
mixin header
header.arc__header.header
+hidden({ name: "sheet_type" })
article.header__character.character
.header__title
+label({ for: "pc_id_character_name" }).header__title--label
+h2({ data_i18n: "character_name" }).header__title--header
+textbox({ name: "character_name", id: "pc_id_character_name" }).header__title--input
.header__pronouns
+label({ for: "pronouns" }).header__pronouns--label
+h3({ data_i18n: "pronouns" }).header__pronouns--header
+textbox({ name: "pronouns", id: "pronouns" }).header__pronouns--input
.header__player
+label({ for: "player_name" }).header__player--label
+h3({ data_i18n: "player_name" }).header__player--header
+textbox({ name: "player_name", id: "player_name" }).header__player--input
article.header__npc.npc
+textbox({ name: "character_name", id: "npc_id_character_name" }).header__npc--input
article.header__name
.header__name
+span({ name: "character_name" }).header__name--span
+65
View File
@@ -0,0 +1,65 @@
mixin health
article.healths
+health-section("blood")
+health-section("guts")
+rests
mixin health-section(type)
section.health
.health__type
+span({ data_i18n: type }).health__type--span
+help(type)
//- .health__plus
//- span +
.health__mod
+span({ data_i18n: "mod" }).health__mod--span
+number({ name: `${type}_mod`, min: 0 }).health__mod--input
//- .health__equals
//- span="=".health__equals
.health__max
+span({ data_i18n: "max" }).health__max--span
+number({ name: `${type}_max`, min: 0 }).health__max--input
.health__current
+span({ data_i18n: "current" }).health__current--span
+number({ name: type, min: 0 }).health__current--input
- var title = (type == "blood" ? "physical_health" : "combat_health" )
+popup({ name: type, title })
+span({ data_i18n: `${type}_description` })
mixin rests
section.rests
-
const roll__short_rest = [
`&{template:recover}`,
`{{character_name=@{character_name}}}`,
`{{action=^{short_rest}}}`,
`{{verb=^{takes_a_rest}}}`,
`{{type=short-rest}}`,
`{{blood=[[1d6]]}}`,
`{{guts=[[1d6]]}}`
].join("");
-
const roll__long_rest = [
`&{template:recover}`,
`{{character_name=@{character_name}}}`,
`{{action=^{long_rest}}}`,
`{{type=long-rest}}`,
`{{verb=^{takes_a_rest}}}`,
`{{blood=[[2d6+@{blood_mod}[BLOOD]]]}}`,
`{{guts=[[2d6+@{guts_mod}[GUTS]]]}}`
].join("");
.rests__spacer
hr.rests__spacer--line
.rests__short
+roll({ name: "short_rest", value: roll__short_rest }).rests__short--button
+span({ data_i18n: "short_rest" }).rests__short--span
.rests__spacer
hr.rests__spacer--line
.rests__long
+roll({ name: "long_rest", value: roll__long_rest }).rests__long--button
+span({ data_i18n: "long_rest" }).rests__long--span
.rests__spacer
hr.rests__spacer--line
+114
View File
@@ -0,0 +1,114 @@
mixin inventory
article.inventory
datalist(id="datalist__inventory")
each item in data.inventory.items
option(value=item, data-i18n=item)
.inventory__header
+span({ data_i18n: "inventory" }).inventory__header--span
+help("inventory")
.inventory__type
+span({ data_i18n: "item_type" }).inventory__type--span
.inventory__qty
+span({ data_i18n: "item_quantity" }).inventory__qty--span
.inventory__edit
.inventory__items
fieldset.repeating_inventory
+item
+popup({ name: "inventory", title: "inventory" })
+span({ data_i18n: "inventory_description" })
mixin item
.item__wrapper
+hidden({ name: "item_expand", value: "0" })
+hidden({ name: "type" }).item__block--toggle
section.item
- let universals = Object.assign([], data.inventory.inputs.universal);
- universals = universals.sort((x, y) => { return x.sort - y.sort });
section.item__block.item__universal
each field in universals
+item-input(field)
.item__expand
+action({ name: "item-expand-toggle" }).item__expand--btn
+img({ src: "edit" }).item__expand--img
+img({ src: "close" }).item__close--img
+item-details
mixin item-details
section.item--details
each itemType in data.inventory.types
- let fields = [...data.inventory.inputs[itemType]];
- fields = fields.sort((x, y) => { return x.sort - y.sort });
+section({ class: `item__${itemType}` }).item__block
each field in fields
+item-input(field)
mixin item-input(obj)
- const field = Object.assign({}, obj);
- field.sort = null;
- field.id = `id_item_${field.name}`;
+div({ class: `item--${field.name}` })
if field.type === "select"
+field-select-block(field)
else
+field-block(field)
mixin field-block(obj)
- const data_i18n = obj.label || null;
- const data_i18n_title = obj.label_title || null;
.field
if data_i18n
+label({ data_i18n_title, for: obj.id }).field__label
+span({ data_i18n }).field__label--span
- obj.label = null;
- obj.label_title = null;
- obj.class = `field--${obj.type}`;
if (obj.type === "radios")
+fill-in-radios(obj)
else if (obj.type === "textarea")
- obj.type = null;
+textarea(obj)
else
+input(obj)
mixin field-select-block(obj)
- const data_i18n = obj.label || null;
.field
if data_i18n
+label({ data_i18n_title, for: obj.id }).field__label
+span({ data_i18n }).field__label--span
- const options = obj.options;
- obj.options = null;
+select(obj).field--select
each opt in options
+option(opt)
//- not used
mixin inventory-totals
footer.inventory__totals
.inventory__totals--empty
.inventory__totals--empty
.inventory__totals--pool
+number({ name: "inventory_points_max", min: 0 })
.inventory__totals--spent
+number({ name: "inventory_points", min: 0 })
.inventory__totals--empty
.inventory__totals--pool
+span({ data_i18n: "item_pool" })
.inventory__totals--spent
+span({ data_i18n: "item_pool" })
//- not used
mixin type-checkboxes
+label({ for: "supplies" }).item__is-supplies
+radio({ name: "type", value: "supplies", id: "supplies" }).item__type--radio
.item__type--square
+label({ for: "damage-defense" }).item__is-damage-defense
+radio({ name: "type", value: "damage", id: "damage-defense" }).item__type--radio
.item__type--square
+label({ for: "spell-technique" }).item__is-spell-technique
+radio({ name: "type", value: "spell", id: "spell-technique" }).item__type--radio
.item__type--square
+38
View File
@@ -0,0 +1,38 @@
mixin skills
article.skills
.skills__header
+span({ data_i18n: "skills" }).skills__header--span
+help("skills")
each skills, category in data.skills
header.skill-category__header
+span({ data_i18n: category }).skill-category__header--span
//- +help(`${category}_popup`)
hr.skill-category__header--line
//- +category-popup(category)
each skill in skills
+skill(skill)
+popup({ name: "skills", title: "skill", header: "skill_info" })
+span({ data_i18n: "skill_description" })
mixin category-popup(cat)
+popup({ name: cat, title: "skill_check" })
+span({ data_i18n: `${cat}_description` })
mixin skill(skill)
.skill__button
+action({ name: skill }).skill__button--btn
+span({ data_i18n: skill }).skill__button--span
+help(`${skill}`)
+skill-popup(skill)
+fill-in-radios({ name: skill, max: 3, class: "skill" })
//- .skill__ranks
//- +radio({ name: skill, value: 0, checked: true }).skill__rank.reset
//- each x in range(3)
//- +radio({ name: skill, value: x }).skill__rank
mixin skill-popup(skill)
+popup({ name: skill, title: "skill_info", header: skill })
+span({ data_i18n: `${skill}_description` })
+49
View File
@@ -0,0 +1,49 @@
mixin toolbar
nav.toolbar
.toolbar__labels
label.toolbar__glossary
+checkbox({ name: "show_glossary" })
+img({ src: "book" }).toolbar__glossary--icon g
label.toolbar__settings
+checkbox({ name: "show_settings" })
+img({ src: "settings" }).toolbar__settings--icon
label.toolbar__version
+span({ data_i18n: "version" }).toolbar__version--text
+span({ name: "version" }).toolbar__version--number
+glossary
+settings
mixin glossary
+popup({ name: "glossary", title: "quick_overview", header: "_" }).glossary
article.glossary--wrapper
each content in data.glossary
details
summary.glossary__entry
hr.glossary__entry--line
+h3({ data_i18n: content }).glossary__entry--header
hr.glossary__entry--line
.glossary__definition
+span({ data_i18n: `${content}_description` })
mixin settings
+popup({ name: "settings", title: "settings", header: "_" }).settings
article.settings--wrapper
section.settings__mode
+h3({ data_i18n: "sheet_mode" }).settings__mode--header
+select({ name: "sheet_type" }).settings__tooltips--select
each option in data.settings.sheet_type
+option(option)
section.settings__theme
+h3({ data_i18n: "theme" }).settings__theme--header
+span({ data_i18n: "use_sync" }).settings__theme--span
section.settings__tooltips
+h3({ data_i18n: "tooltips" }).settings__tooltips--header
+select({ name: "setting_tooltips" }).settings__tooltips--select
each option in data.settings.tooltips
+option(option)
section.settings__export
+roll({ data_i18n: "export_character", name: "api_export", value: "!arc .export @{character_id}" }).settings__export--btn
+hidden({ name: "export_show", value: "0" }).settings__export--toggle
+textarea({ name: "export", rows: 6, data_i18n_placeholder: "requires_arc_api" }).settings__export--json
+span({ data_i18n: "requires_arc_api" }).settings__export--span
+11
View File
@@ -0,0 +1,11 @@
article.arc__layout--left
+health
+approaches
+skills
+inventory
aside.arc__layout--right.character
+background
+bonds
+experience
+fallen-consequences
+97
View File
@@ -0,0 +1,97 @@
mixin tags(array)
each tag in array
| {{##{ tag }}}
if block
block
each tag in array.reverse()
| {{/#{ tag }}}
mixin roll-template-sentence
.sheet-arc__sentence
+tags(["character_name"])
.sheet-arc__sentence--name(class=`{{type}}`) {{ character_name }}
+tags(["verb"])
.sheet-arc__sentence--verb(class=`{{type}}`) {{ verb }}
+tags(["action"])
.sheet-arc__sentence--action(class=`{{type}}`) {{ action }}
rolltemplate.sheet-rolltemplate-recover
.sheet-arc__container
.sheet-arc__banner(class=`{{type}}`)
.sheet-arc__content(class=`{{type}}`)
+roll-template-sentence
.sheet-arc__recover(class=`{{type}}`)
.sheet-arc__recover--arrow &#x25B6;
.sheet-arc__recover--text
+span({ data_i18n: "recovery_{{type}}",
data_i18n_vars: "{{blood}}|{{guts}}" })
.sheet-arc__footnote
span.sheet-arc__footnote--mark &#x203B;
+span({ data_i18n: "update_character_sheet" }).sheet-arc__footnote--span
rolltemplate.sheet-rolltemplate-fallen
.sheet-arc__container
.sheet-arc__banner(class=`{{type}}`)
.sheet-arc__content(class=`{{type}}`)
+roll-template-sentence
.sheet-arc__fallen(class=`{{type}}`)
.sheet-arc__fallen--roll
span {{ consequence }}
each con in range(6)
+tags([`rollTotal() consequence ${con}`])
.sheet-arc__fallen--text
+span({ data_i18n: `fallen_consequence_${con}` })
.sheet-arc__footnote
span.sheet-arc__footnote--mark &#x203B;
+span({ data_i18n: "update_character_sheet" }).sheet-arc__footnote--span
rolltemplate.sheet-rolltemplate-skills
.sheet-arc__container
.sheet-arc__banner(class=`{{type}}`)
+tags(["rollLess() roll TN"])
span.sheet-display-control.sheet-success
+tags(["rollTotal() roll TN"])
span.sheet-display-control.sheet-tie
+tags(["rollGreater() roll TN"])
span.sheet-display-control.sheet-fail
.sheet-arc__content(class=`{{type}}`)
+roll-template-sentence
.sheet-arc__approach-skill(class=`{{type}}`)
.sheet-arc__approach-skill--arrow &#x25B6;
.sheet-arc__approach-skill--approach(class=`{{title}}`)
+div({ data_i18n: `{{skill}}` }).sheet-arc__approach-skill--text
.sheet-arc__results
//- text for success | tie | fail
.sheet-arc__results--text
+tags(["rollLess() roll TN"])
.sheet-arc__success
+span({ data_i18n: "roll_success" }).sheet-arc__success--span
+tags(["rollTotal() roll TN"])
.sheet-arc__tie
+span({ data_i18n: "roll_tie" }).sheet-arc__tie--span
+tags(["rollGreater() roll TN"])
.sheet-arc__fail
+span({ data_i18n: "roll_fail" }).sheet-arc__fail--span
//- dice results
.sheet-arc__results--values
+div({ data_i18n: "roll" }).sheet-arc__roll--header
+div({ data_i18n: "versus" }).sheet-arc__versus--header
+div({ data_i18n: "tn" }).sheet-arc__tn--header
each roll in range(6)
+tags([`rollTotal() roll ${roll}`])
.sheet-arc__roll--value
img(src=`https://raw.githubusercontent.com/morgdalaine/arc-momatoes/main/api-script/ARC/assets/die_${roll}.png`)
| {{roll}}
.sheet-arc__versus--value
+tags(["rollLess() roll TN"])
span.sheet-arc__versus--symbol.sheet-success="<"
+tags(["rollTotal() roll TN"])
span.sheet-arc__versus--symbol.sheet-tie="="
+tags(["rollGreater() roll TN"])
span.sheet-arc__versus--symbol.sheet-fail=">"
.sheet-arc__tn--value {{TN}}
+291
View File
@@ -0,0 +1,291 @@
-
const data = {
assets: {
folder: "https://raw.githubusercontent.com/morgdalaine/arc-momatoes/main/character-sheet/ARC/assets/",
add: "add.svg",
book: "book.svg",
close: "close.svg",
delete: "delete.svg",
download: "download.svg",
drag: "drag.svg",
edit: "edit.svg",
export: "export.svg",
help: "help.svg",
lock: "lock.svg",
move: "move.svg",
save: "save.svg",
settings: "settings.svg",
unlock: "unlock.svg",
bg_check_success: "bg_check_success.png",
bg_check_tie: "bg_check_tie.png",
bg_check_fail: "bg_check_fail.png",
bg_long_rest: "bg_long_rest.png",
bg_short_rest: "bg_short_rest.png",
tab_long_rest: "tab_long_rest.png",
tab_short_rest: "tab_short_rest.png",
tab_skill_check: "tab_skill_check.png",
text_careful: "text_careful.svg",
text_concerted: "text_concerted.svg",
text_creative: "text_creative.svg",
},
settings: {
sheet_type: [
{
value: "character",
data_i18n: "character_mode",
selected: true
},
{
value: "npc",
data_i18n: "npc_mode"
}
],
tooltips: [
{
value: "1",
data_i18n: "tooltip_show",
selected: true
},
{
value: "0",
data_i18n: "tooltip_hide"
}
]
},
glossary: [
"advantage",
"attack",
"complexity",
"conflict",
"consequence",
"damage",
"difficulty_modifier",
"doom",
"doomsday_clock",
"focus",
"group_skill_check",
"initiative_category",
"learning_spells_and_techniques",
"moment",
"movement_in_conflict",
"omen",
"opportunity",
"rest",
"ritual",
"skill_check",
"spells_and_techniques",
"spells_and_techniques_in_conflict",
"stand_ground",
"threshold_number",
"turn"
],
approaches: [ "creative", "careful", "concerted" ],
skills: {
knowledge: [ "academic", "culture", "observe", "tactics" ],
social: [ "charisma", "guile", "impose", "insight" ],
physical: [ "acrobatics", "coordination", "physique", "weaponry" ],
practical: [ "artistry", "survival", "tinker", "trade" ],
prowess: [ "arcana", "focus" ],
},
inventory: {
types: [ "supplies_and_sundries", "oddities_and_valuables", "damage_and_defense", "spells_and_techniques" ],
inputs: {
universal: [
{
sort: 1,
name: "name",
type: "text",
list: "datalist__inventory",
data_i18n_placeholder: "name_placeholder",
},
{
sort: 2,
name: "type",
type: "select",
options: [
{ data_i18n: "select_placeholder", value: "none", selected: true },
{ value: "supplies_and_sundries" },
{ value: "oddities_and_valuables" },
{ value: "damage_and_defense" },
{ value: "spells_and_techniques" },
]
},
{
sort: 3,
name: "quantity",
type: "number",
placeholder: "0",
min: 0,
}
],
supplies_and_sundries: [
{
sort: 4,
label: "description",
name: "description",
type: "text",
data_i18n_placeholder: "description_placeholder",
}
],
oddities_and_valuables: [
{
sort: 4,
label: "description",
name: "description",
type: "text",
data_i18n_placeholder: "description_placeholder",
}
],
damage_and_defense: [
{
sort: 4,
label: "boon",
name: "first_boon",
type: "textarea",
data_i18n_placeholder: "boon_placeholder",
},
{
sort: 5,
label: "boon",
name: "second_boon",
type: "textarea",
data_i18n_placeholder: "boon_placeholder",
},
{
sort: 6,
label: "description",
name: "description",
type: "text",
data_i18n_placeholder: "description_placeholder",
},
],
spells_and_techniques: [
{
sort: 4,
label: "complexity",
name: "complexity",
type: "radios",
class: "complexity",
max: 4,
},
{
sort: 5,
label: "base_effect",
name: "base_effect",
type: "textarea",
//- data_i18n_placeholder: "base_effect_placeholder",
},
{
sort: 6,
label: "enhanced",
name: "enhanced",
type: "textarea",
//- data_i18n_placeholder: "enhanced_placeholder",
},
{
sort: 7,
label: "ritual",
name: "ritual",
type: "textarea",
//- data_i18n_placeholder: "ritual_placeholder",
},
],
},
items: [
"combat_scowling_face",
"combat_pitchfork",
"combat_memories_of_hardship",
"combat_iron_briefs",
"combat_booming_voice",
"combat_well_rounded_education",
"combat_darts",
"combat_dagger",
"combat_self_esteem",
"combat_studden_leather_armor",
"combat_devastating_vocabulary",
"combat_critical_thinking",
"combat_sturdy_sword",
"combat_crossbow",
"combat_plate_armor",
"combat_love_letter",
"combat_cunning_wit",
"combat_flaming_sword",
"supplies_rations",
"supplies_artisans_tools",
"supplies_crowbar_and_lantern",
"supplies_rope_and_carpet",
"supplies_bedroll",
"supplies_backpack",
"supplies_thieves_tools",
"supplies_fine_clothes",
"supplies_traps",
"supplies_tent",
"supplies_fishing_pole",
"supplies_live_hen",
"supplies_board_games",
"supplies_alchemists_tools",
"supplies_encyclopeida",
"supplies_spyglass",
"supplies_coded_letters",
"supplies_horse",
"oddities_seashell_horn",
"oddities_dead_donkey",
"oddities_ancient_ring",
"oddities_songbird",
"oddities_human_teeth",
"oddities_hat",
"oddities_monkey_head",
"oddities_heavy_crown",
"oddities_giant_serpent_scales",
"oddities_silk_dress",
"oddities_tyrant_pants",
"oddities_shadow_mirror",
"oddities_darkvision_glasses",
"oddities_divine_blood",
"oddities_seeds",
"oddities_potion_brawn",
"oddities_troll_flesh",
"oddities_telepathic_yak",
"spells_trinket",
"spells_trick_of_the_light",
"spells_soundshift",
"spells_lifebringer",
"spells_whisper",
"spells_bind_weapon",
"spells_unmask_the_self",
"spells_secret_door",
"spells_burn_the_past",
"spells_master_of_elements",
"spells_little_escapologist",
"spells_pierce_the_veil",
"spells_manic_hands",
"spells_shadowbind",
"spells_compel",
"spells_windstep",
"spells_blackout",
"spells_spirit_pact",
"spells_from_dust_to_dust",
"spells_true_miracle",
"techniques_only_ones_who_know",
"techniques_uncanny_alarm",
"techniques_weave_through_water",
"techniques_memory_seed",
"techniques_flowmotion",
"techniques_saving_grace",
"techniques_inspiration",
"techniques_bind_magic",
"techniques_stonewall",
"techniques_heart_piercer",
"techniques_deadly_focus",
"techniques_redo",
"techniques_turn_the_tide",
"techniques_dispel",
"techniques_interdiction",
"techniques_fluorescent_transcendence",
"techniques_netherwave",
"techniques_become_one",
"techniques_defy_the_fates",
"techniques_doompause",
]
}
}
+80
View File
@@ -0,0 +1,80 @@
.arc {
@import "meta/reset";
// @import "meta/unset";
}
// shared variables and mixins
@import "meta/variables";
@import "meta/breakpoints";
@import "components/common/mixins";
@import "components/common/popups";
html {
font-size: 13px !important;
}
.ui-dialog {
.charsheet {
padding: 0px !important;
button[type=roll] {
&::before {
font-family: unset;
content: unset;
}
}
input {
height: unset;
width: 100%;
&[type=number] {
width: 100%;
}
}
}
}
@include repeatingSectionsButtons;
input[name*="sheet_type"] {
&[value="character"] {
~ .npc {
display: none;
}
}
&[value="npc"] {
~ .character {
display: none;
}
}
}
.arc {
position: relative;
font-family: $primary-sans-serif;
font-size: 13px;
@import "meta/buttons";
@import "components/common/inputs";
@media (prefers-color-scheme: light) {
color: $primary-color-light;
background: $primary-background-light;
}
@media (prefers-color-scheme: dark) {
color: $primary-color-dark;
background: $primary-background-dark;
}
h2 { font-size: 1.5rem; }
h3 { font-size: 1.17rem; }
h4 { font-size: 1rem; }
h5 {
font-size: 1rem;
text-transform: uppercase;
}
// Components
@import "components/toolbar";
@import "components/header";
}
@import "layouts/character";
@import "layouts/roll-template";
+52
View File
@@ -0,0 +1,52 @@
.approaches {
display: flex;
flex-direction: row;
justify-content: center;
width: 100%;
}
.approach {
display: flex;
flex-direction: row;
width: 25%;
align-items: center;
&__label {
&--span {
font-family: $primary-serif;
white-space: nowrap;
text-transform: uppercase;
writing-mode: vertical-rl;
@include rotate(180deg);
}
}
&__value {
display: flex;
align-items: center;
justify-content: center;
border: 5px double transparent;
border-radius: 50%;
aspect-ratio: 1 / 1;
width: 100%;
@media (prefers-color-scheme: light) {
border-color: $primary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-accent-dark;
}
&--input[type="number"] {
@include square(100%);
padding: 0;
font-size: 4rem;
@media only screen and (max-width: $large) {
font-size: 3rem;
}
@media only screen and (max-width: $medium) {
font-size: 2rem;
}
}
}
}
+40
View File
@@ -0,0 +1,40 @@
.background {
display: grid;
grid-template-rows: repeat(3, auto);
row-gap: 8px;
height: fit-content;
padding: 8px;
@media (prefers-color-scheme: light) {
background: linear-gradient($tertiary-background-light 75%, transparent);
}
@media (prefers-color-scheme: dark) {
background: linear-gradient($tertiary-background-dark 75%, transparent);
}
&--label {
font-size: 1.2rem;
font-variant-caps: small-caps;
cursor: pointer;
}
&__rumors {
&--wrapper {
margin: 8px 0;
}
}
}
.portrait {
display: none;
justify-content: center;
align-items: center;
&__avi {
display: flex;
justify-content: center;
align-items: center;
position: relative;
&--img {
position: absolute;
}
}
}
+118
View File
@@ -0,0 +1,118 @@
.bonds {
&__header {
@include sectionHeader;
}
}
.bond {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 1rem;
margin-bottom: 1rem;
&__with {
grid-column: 1 / 2;
}
&__levels {
grid-column: 2 / 3;
display: grid;
grid-template-columns: repeat(3, 1fr);
column-gap: 2px;
align-content: center;
}
&__container {
border: 2px solid transparent;
@include square(31px);
@media (prefers-color-scheme: light) {
border-color: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $secondary-accent-dark;
}
}
&__major {
display: grid;
gap: 1px;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
grid-template-areas:
"minor1 minor2"
"minor4 minor3";
@include square(27px);
@media (prefers-color-scheme: light) {
background: linear-gradient($secondary-accent-light, $secondary-accent-light) center/100% 1px no-repeat, repeating-linear-gradient(to right, transparent 0 13px, $secondary-accent-light 0 14px);
}
@media (prefers-color-scheme: dark) {
background: linear-gradient($secondary-accent-dark, $secondary-accent-dark) center/100% 1px no-repeat, repeating-linear-gradient(to right,transparent 0 13px, $secondary-accent-dark 0 14px);
}
}
}
.bond__minor {
border: 1px solid transparent;
background: transparent;
@include square(13px);
cursor: pointer;
box-sizing: border-box;
appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
&.reset { grid-area: minor1; }
&[value="1"] { grid-area: minor1; }
&[value="2"] { grid-area: minor2; }
&[value="3"] { grid-area: minor3; }
&[value="4"] { grid-area: minor4; }
&:checked { display: none; }
}
.bond__control {
&:not([value="0"]) ~ .bond__minor[value="1"] {
grid-area: minor2;
}
&:is([value="2"], [value="3"], [value="4"]) ~ .bond__minor[value="2"] {
grid-area: minor3;
}
&:is([value="3"], [value="4"]) ~ .bond__minor[value="3"] {
grid-area: minor4;
}
}
@media (prefers-color-scheme: light) {
.bond__minor.reset,
.bond__minor:not(.reset):checked ~ .bond__minor {
background: $secondary-highlight-light;
}
}
@media (prefers-color-scheme: dark) {
.bond__minor.reset,
.bond__minor:not(.reset):checked ~ .bond__minor {
background: $secondary-highlight-dark;
}
}
@media only screen and (max-width: $large) {
.bond {
display: flex;
flex-direction: column;
&__levels {
display: flex;
justify-content: center;
}
}
input.bond__with--input[type=text] {
padding-left: 0;
text-align: center;
font-size: 1.2rem;
}
}
// @media only screen and (max-width: $medium) {
// }
// @media only screen and (max-width: $small) {
// }
@@ -0,0 +1,90 @@
.consequences {
&__header {
@include sectionHeader;
}
&__grid {
display: grid;
grid-template-columns: auto 1fr;
gap: 0.5rem;
align-items: center;
justify-items: center;
&--header {
padding: 0 1rem;
text-align: center;
font-size: 1.17rem;
}
}
&__roll {
justify-self: start;
@include rollButton;
&--span {
text-transform: uppercase;
text-align: left;
font-size: 1.17rem;
}
}
}
.consequence {
&__die {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
cursor: pointer;
&--span {
position: relative;
top: 4px;
font-size: 1.17rem;
font-weight: bold;
z-index: 1;
@media (prefers-color-scheme: light) {
color: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
color: $secondary-accent-dark;
}
}
&--input {
display: none;
&:checked {
+ .consequence__die--span {
@media (prefers-color-scheme: light) {
color: $secondary-color-light;
}
@media (prefers-color-scheme: dark) {
color: $secondary-color-dark;
}
}
~ .consequence__die--square {
@media (prefers-color-scheme: light) {
background: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
background: $secondary-accent-dark;
}
}
}
}
&--square {
position: absolute;
border: 2px solid transparent;
@include square(24px);
@media (prefers-color-scheme: light) {
border-color: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $secondary-accent-dark;
}
}
}
&__description {
display: flex;
align-items: start;
font-variant-caps: small-caps;
width: 100%;
min-height: 4rem;
cursor: pointer;
}
}
+43
View File
@@ -0,0 +1,43 @@
.experience {
width: 100%;
display: grid;
grid-template-columns: auto 1fr 1fr;
gap: 0.5rem;
&__header {
grid-row: 1;
grid-column: 1 / 2;
@include sectionHeader;
}
&__total, &__spent {
display: flex;
flex-direction: column;
&--input {
border: none;
font-size: 2rem;
}
&--span {
margin-top: 4px;
text-align: center;
text-transform: uppercase;
font-size: 0.8rem;
}
}
&__total--input {
border: 5px solid transparent;
@media (prefers-color-scheme: light) {
border-color: $secondary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $secondary-border-dark;
}
}
&__spent--input {
border: 5px double transparent;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
}
+147
View File
@@ -0,0 +1,147 @@
.header {
&__character {
display: grid;
grid-template-columns: 3fr 2fr;
grid-template-rows: auto auto;
grid-gap: 0.5rem;
}
&__npc {
display: flex;
align-items: center;
&--input {
text-align: center;
font-size: 2rem;
font-family: $primary-serif;
padding-left: 0 !important;
}
}
&__title {
grid-row: 1 / 3;
display: flex;
flex-wrap: wrap;
align-content: space-between;
&--header {
font-family: $primary-serif;
text-transform: uppercase;
}
&--input[type=text] {
font-size: 2rem;
}
}
&__pronouns, &__player {
&--input {
font-size: 1rem;
font-family: $primary-serif;
padding: 0.5rem;
}
}
&__pronouns {
grid-row: 1;
grid-column: 2 / 3;
}
&__player {
grid-row: 2;
grid-column: 2 / 3;
}
&__name {
display: none;
&--span {
font-size: 2rem;
font-family: $primary-serif;
text-transform: uppercase;
}
}
@media only screen and (max-width: $medium) {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: 1fr auto auto;
&__title, &__pronouns, &__player {
&--label {
padding-bottom: 1rem;
text-align: center;
}
&--input {
text-align: center;
}
}
&__title {
grid-row: 1;
grid-column: 1 / 3;
}
&__pronouns {
grid-row: 2;
grid-column: 1 / 2;
}
&__player {
grid-row: 2;
grid-column: 2 / 3;
}
}
@media only screen and (max-width: $small) {
&__character.character, &__npc.npc {
display: none;
}
&__name {
display: flex;
justify-content: center;
}
}
}
@media (prefers-color-scheme: light) {
.header {
&__title {
&--input {
border-color: $primary-accent-light;
}
&--header {
color: $primary-accent-light !important;
}
}
&__pronouns, &__player {
&--input {
border-color: $primary-accent-light;
}
}
&__name {
color: $primary-accent-light !important;
}
&__npc--input {
border-color: $primary-accent-light;
}
}
}
@media (prefers-color-scheme: dark) {
.header {
&__title {
&--input {
border-color: $primary-accent-dark;
}
&--header {
color: $primary-accent-dark !important;
}
}
&__pronouns, &__player {
&--input {
border-color: $primary-accent-dark;
}
}
&__name {
color: $primary-accent-dark !important;
}
&__npc--input {
border-color: $primary-accent-dark;
}
}
}
+227
View File
@@ -0,0 +1,227 @@
.healths {
display: grid;
grid-template-columns: 1fr;
justify-content: center;
@include fill-x;
row-gap: 0.5rem;
}
.rests {
display: grid;
grid-template-columns: repeat(2, 1fr auto ) 1fr;
width: 100%;
&__spacer {
align-self: center;
&--line {
border-bottom: 2px solid transparent;
}
}
&__short, &__long {
&--span {
font-family: $primary-serif;
font-size: 1.2rem;
font-weight: bold;
text-align: center;
text-transform: uppercase;
padding: 0 1rem;
}
}
&__short {
grid-column: 2 / 3;
&--button {
border: 2px solid transparent;
}
}
&__long {
grid-column: 4 / 5;
&--button {
border: 2px solid transparent;
}
}
}
.health {
display: flex;
flex-direction: row;
justify-content: center;
@include fill-x;
&__type, &__mod, &__max, &__current {
display: flex;
flex-direction: column;
justify-content: center;
border: 5px double transparent;
width: 6rem;
&--span {
padding: 0.2rem 0;
text-align: center;
text-transform: uppercase;
white-space: nowrap;
}
}
&__mod, &__max, &__current {
&--span {
font-size: 0.7rem;
}
&--input {
font-size: 1.2rem;
}
}
&__type {
flex-direction: row;
justify-content: start;
&--span {
margin-right: 0.5rem;
}
}
}
@media only screen and (max-width: $medium) {
.healths {
justify-items: center;
}
.health {
display: grid;
grid-template-columns: repeat(3, 1fr);
width: 80%;
&__type, &__mod, &__max, &__current {
border-width: 3px;
}
&__type {
grid-row: 1 / 2;
grid-column: 1 / 4;
justify-content: center;
width: auto;
border: none;
&--span {
font-size: 1.2rem;
text-align: left;
letter-spacing: 0.5rem;
}
}
&__mod, &__max, &__current {
grid-row: 2 / 3;
width: auto;
}
&__mod {
grid-column: 1 / 2;
}
&__max {
grid-column: 2 / 3;
}
&__current {
grid-column: 3 / 4;
}
}
}
@media only screen and (max-width: $small) {
.rests {
grid-template-columns: auto;
row-gap: 0.5rem;
&__spacer {
display: none;
}
&__short, &__long {
&--button {
width: 100%;
}
}
&__short {
grid-column: auto;
}
&__long {
grid-column: auto;
}
}
}
@media (prefers-color-scheme: light) {
.rests {
&__spacer {
&--line {
border-color: $primary-border-light;
}
}
&__short, &__long {
&--button:hover {
border-color: $primary-highlight-light;
background: $primary-highlight-light;
color: $primary-color-light;
}
}
&__short {
&--button {
border-color: $primary-border-light;
background: $primary-border-light;
color: $secondary-color-light;
}
}
&__long {
&--button {
border-color: $primary-border-light;
background: $primary-background-light;
color: $primary-border-light;
}
}
}
.health {
&__type {
background: $primary-background-light;
}
&__mod, &__max {
background: $secondary-background-light;
}
&__current {
background: $primary-background-light;
border-color: $primary-border-light;
}
}
}
@media (prefers-color-scheme: dark) {
.rests {
&__spacer {
&--line {
border-color: $primary-border-dark;
}
}
&__short, &__long {
&--button:hover {
border-color: $primary-highlight-dark;
background: $primary-highlight-dark;
color: $primary-color-dark;
}
}
&__short {
&--button {
border-color: $primary-border-dark;
background: $primary-border-dark;
color: $secondary-color-dark;
}
}
&__long {
&--button {
border-color: $primary-border-dark;
background: $primary-background-dark;
color: $primary-border-dark;
}
}
}
.health {
&__type {
background: $primary-background-dark;
}
&__mod, &__max {
background: $secondary-background-dark;
}
&__current {
background: $primary-background-dark;
border-color: $primary-border-dark;
}
}
}
+254
View File
@@ -0,0 +1,254 @@
.inventory {
display: grid;
grid-template-columns: repeat(3, 1fr);
row-gap: 8px;
width: 100%;
align-items: flex-end;
&__header {
grid-row: 1;
grid-column: 1 / 2;
white-space: nowrap;
@include sectionHeader;
}
&__type, &__short-desc, &__qty {
&--span {
font-variant-caps: small-caps;
}
}
&__type {
grid-row: 1;
grid-column: 2 / 3;
display: flex;
justify-content: center;
// &--supplies, &--defense, &--spells {
// grid-row: 1;
// @include rotate(-45deg);
// }
// &--supplies {
// grid-column: 2 / 3;
// }
// &--defense {
// grid-column: 3 / 4;
// }
// &--spells {
// grid-column: 4 / 5;
// }
}
&__qty {
grid-row: 1;
grid-column: 3 / 4;
text-align: center;
width: 100%;
margin-right: 8px;
}
&__items {
grid-row: 2;
grid-column: 1 / 6;
padding: 0 8px;
}
}
input[name*="item_expand"] {
&[value="0"] {
~ .item--details {
display: none;
}
~ .item .item__expand--img {
display: inline;
}
~ .item .item__universal {
.item--type {
display: none;
}
}
}
&[value="on"] {
~ .item .item__close--img {
display: inline;
}
~ .item .item__universal {
grid-template-columns: 1fr auto;
.item--quantity {
grid-row: 2 / 3;
}
.item__expand {
grid-column: 2 / 3;
}
}
}
}
.item {
margin: 4px 0;
&__wrapper {
margin: 4px 0;
padding: 0 4px;
border: 2px solid transparent;
@media (prefers-color-scheme: light) {
border-color: $primary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-accent-dark;
}
}
&--details {
display: flex;
flex-direction: column;
margin: 8px 0;
}
&__block {
grid-template-columns: repeat(4, 1fr);
gap: 0.5rem;
}
&__universal {
display: grid;
grid-template-columns: 1fr repeat(2, auto);
}
}
$itemTypes: "supplies_and_sundries", "oddities_and_valuables", "damage_and_defense", "spells_and_techniques";
@each $name in $itemTypes {
.item__#{$name} {
display: none;
}
.item__block--toggle {
&[value="#{$name}"] {
~ .item--details .item__#{$name} {
display: grid;
@media only screen and (max-width: $medium) {
display: flex;
flex-direction: column;
}
}
}
}
}
.item {
&--name, &--type, &--quantity {
.field { grid-template-rows: auto; }
}
&--name {
grid-row: 1 / 2;
grid-column: 1 / 2;
}
&--quantity {
grid-row: 1 / 2;
grid-column: 2 / 3;
.field--number {
font-size: 1.2rem;
padding: 0.2rem;
width: 3.5rem;
height: 3rem;
border: none;
border-bottom: 2px double transparent;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
}
&--type {
grid-row: 2 / 3;
grid-column: 1 / 2;
}
&__expand {
grid-row: 1 / 2;
grid-column: 3 / 4;
display: flex;
align-items: center;
justify-content: center;
width: 3.5rem;
margin: 0 4px;
&--img {
display: none;
cursor: pointer;
@include square(20px);
@include imgHover;
}
}
&__close--img {
display: none;
cursor: pointer;
@include square(20px);
@include imgHover;
}
&--description {
grid-column: 1 / 5;
}
&--first_boon {
grid-row: 2;
grid-column: 1 / 3;
}
&--second_boon {
grid-row: 2;
grid-column: 3 / 5;
}
&--complexity {
grid-row: 2;
grid-column: 3 / 5;
margin: 0.5rem 0;
.field {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
}
@include fill-in-radios;
.radio__rank {
border: 1px solid $primary-accent-light;
background: $primary-accent-light;
}
.radio__rank.reset {
background: $primary-accent-light;
}
}
&--base_effect {
grid-row: 2 / 5;
grid-column: 1 / 3;
.field--textarea { height: 100%; }
}
&--enhanced {
grid-row: 3 / 4;
grid-column: 3 / 5;
}
&--ritual {
grid-row: 4 / 5;
grid-column: 3 / 5;
}
}
.field {
display: grid;
grid-template-rows: auto 1fr;
@include square(100%);
&__label {
&--span {
text-transform: uppercase;
font-size: 0.8rem;
}
}
&--text, &--number, &--select, &--textarea {
width: 100%;
}
&--textarea {
font-family: $primary-serif;
}
}
@media only screen and (max-width: $small) {
.item {
&--complexity {
.field {
flex-direction: column;
}
}
}
}
+113
View File
@@ -0,0 +1,113 @@
.skills {
width: 100%;
display: grid;
grid-template-columns: repeat(4, auto);
align-items: center;
&__header {
grid-column: 1 / 5;
@include sectionHeader;
}
&__category {
display: grid;
}
}
.skill-category {
&__header {
grid-column: 1 / 5;
display: grid;
grid-template-columns: auto 2rem 1fr;
margin: 1rem 0;
&--span {
grid-column: 1;
margin-right: 0.5rem;
text-transform: uppercase;
white-space: nowrap;
}
&--line {
grid-column: 3;
border-bottom: 2px solid transparent;
align-self: center;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
}
}
.skill__button {
display: flex;
flex-direction: row;
@include rollButton;
&__ranks {
display: flex;
align-self: center;
}
&__popup {
grid-column: 3;
}
}
.skills {
@include fill-in-radios;
.radio__rank {
border: 1px solid transparent;
border-radius: 50%;
}
@media (prefers-color-scheme: light) {
.radio__rank {
border-color: $primary-accent-light;
background: $primary-accent-light;
}
.radio__rank.reset {
background: $primary-accent-light;
}
}
@media (prefers-color-scheme: dark) {
.radio__rank {
border-color: $primary-accent-dark;
background: $primary-accent-dark;
}
.radio__rank.reset {
background: $primary-accent-dark;
}
}
}
@media only screen and (max-width: $small) {
.skills {
grid-template-columns: repeat(2, auto);
&__header {
grid-column: 1 / 3;
}
.radio__ranks {
justify-content: flex-end;
}
.radio__rank {
@include square(1.5rem);
}
}
.skill-category {
&__header {
grid-column: 1 / 3;
&--span {
font-size: 1.2rem;
}
}
}
.skill__button {
&--span {
font-size: 1.5rem;
}
}
}
+202
View File
@@ -0,0 +1,202 @@
.toolbar {
display: flex;
justify-content: flex-end;
&__labels {
display: inline-flex;
gap: 1rem;
align-items: center;
}
&__glossary, &__settings {
font-weight: normal;
padding: 0;
margin: 0;
white-space: nowrap;
cursor: pointer;
&--icon {
@include square(24px);
opacity: 0.5;
}
}
&__glossary {
input[type=checkbox] {
display: none;
&:checked + .toolbar__glossary--icon {
opacity: 1;
}
}
&--icon {
font-family: "pictos three";
}
}
&__settings {
input[type=checkbox] {
display: none;
&:checked + .toolbar__settings--icon {
opacity: 1;
}
}
&--icon {
font-family: pictos;
}
}
&__version {
display: inline-flex;
align-items: center;
opacity: 0.5;
white-space: nowrap;
&--text, &--number {
margin: 0 0.5rem;
font-variant: small-caps;
line-height: 2.5rem;
font-family: $primary-serif;
}
&--text::after {
content: ":";
}
}
.settings, .glossary {
left: auto;
right: 5rem;
}
.settings {
width: 250px !important;
&--wrapper {
padding: 0 0.5rem 0.5rem;
}
&__mode, &__theme, &__tooltips, &__export {
margin-top: 0.5rem;
&--header {
font-family: $primary-serif;
text-transform: uppercase;
}
&--span {
display: block;
margin: 1rem 0 0 0.5rem;
opacity: 0.5;
}
}
&__export {
&--span {
margin: 1rem 0 0 0.5rem;
opacity: 0.5;
}
&--btn {
font-size: 1.17rem;
font-family: $primary-serif;
font-weight: bold;
text-transform: uppercase;
}
&--json {
resize: none;
border: none;
font-size: 0.7rem;
line-height: 1rem;
margin-top: 0.5rem;
padding: 0;
white-space: normal;
font-family: $primary-monospace;
}
}
}
.settings__export--toggle {
&[value="0"] {
~ .settings__export--json { display: none; }
~ .settings__export--span { display: block; }
}
&[value="on"] {
~ .settings__export--json { display: block; }
~ .settings__export--span { display: none; }
}
}
.glossary {
width: 75% !important;
height: 75% !important;
&--wrapper {
margin-top: 2rem;
}
&__entry {
display: grid;
grid-template-columns: 1fr auto 1fr;
height: 2rem;
align-items: center;
cursor: pointer;
&--line {
border-bottom: 2px solid transparent;
margin: 0 1rem;
}
&--header {
font-family: $primary-serif;
text-transform: uppercase;
}
}
&__definition {
padding: 0 1.5rem;
text-align: justify;
@include firstLetter;
}
}
}
@media (prefers-color-scheme: light) {
.toolbar {
.settings {
&__mode, &__theme, &__tooltips {
&--header {
color: $primary-accent-light;
}
}
&__export{
&--btn {
color: $primary-accent-light;
}
&--json {
background: $tertiary-background-light;
}
}
}
.glossary {
&__entry {
&--line {
border-color: $primary-highlight-light;
}
&--header {
color: $primary-accent-light;
}
}
}
}
}
@media (prefers-color-scheme: dark) {
.toolbar {
.settings {
&__mode, &__theme, &__tooltips {
&--header {
color: $primary-accent-dark;
}
}
&__export{
&--btn {
color: $primary-accent-dark;
}
&--json {
background: $tertiary-background-dark;
}
}
}
.glossary {
&__entry {
&--line {
border-color: $primary-highlight-dark;
}
&--header {
color: $primary-accent-dark;
}
}
}
}
}
@@ -0,0 +1,45 @@
input, textarea, select {
box-sizing: border-box; // Opera/IE 8+
-moz-box-sizing: border-box; // Firefox, other Gecko
-webkit-box-sizing: border-box; // Safari/Chrome, other WebKit
font-family: $primary-sans-serif;
font-size: 1rem;
background: none;
border: none;
border-bottom: 2px solid transparent;
border-radius: 0;
text-decoration: none;
line-height: 1.5rem;
@include fill-x;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
input[type=text] {
height:3rem;
padding: 0;
padding-left: 1rem;
}
textarea {
resize: none;
min-height: 5rem;
max-height: 15rem;
overflow-y: scroll;
padding-top: 0.5rem;
padding-left: 1rem;
}
select {
height:3rem;
}
input[type='checkbox'].hide-element,
input[type='radio'].hide-element,
.hide-element {
display: none;
}
+204
View File
@@ -0,0 +1,204 @@
@mixin sectionHeader {
display: flex;
&--span {
font-size: 1.33rem;
margin-right: 0.5rem;
}
}
@mixin fill-x {
width: -moz-available; // WebKit-based browsers will ignore this.
width: -webkit-fill-available; // Mozilla-based browsers will ignore this.
// width: stretch;
}
@mixin fill-y {
height: -moz-available; // WebKit-based browsers will ignore this.
height: -webkit-fill-available; // Mozilla-based browsers will ignore this.
// height: fill-available;
height: 40px;
}
@mixin rotate($deg: -90deg) {
transform: rotate($deg);
// Legacy vendor prefixes
-webkit-transform: rotate($deg); // Safari
-moz-transform: rotate($deg); // Firefox
-ms-transform: rotate($deg); // IE
-o-transform: rotate($deg); // Opera
}
@mixin square($length: 1rem) {
width: $length;
height: $length;
}
@mixin contentImage($img) {
background-image: url("#{$root-url}#{$img}");
background-size: 18px;
background-repeat: no-repeat;
@include square(18px);
}
@mixin firstLetter {
&::first-letter {
font-family: $primary-serif;
font-size: 1.5rem;
font-weight: bold;
}
}
@mixin imgHover {
opacity: 0.5;
&:hover {
opacity: 1;
}
}
@mixin rollButton {
&--btn {
text-align: left;
white-space: nowrap;
margin-right: 0.5rem;
border: 1px solid transparent;
padding: 4px;
&:hover {
font-weight: bold;
@media (prefers-color-scheme: light) {
background: $primary-highlight-light;
border-color: $primary-highlight-light
}
@media (prefers-color-scheme: dark) {
background: $primary-highlight-dark;
border-color: $primary-highlight-dark
}
}
}
}
@mixin repeatingSectionsButtons {
.ui-dialog .charsheet {
.repcontainer .repitem .itemcontrol {
.repcontrol_move, .repcontrol_del {
@include contentImage("unlock.svg");
font-size: 0;
&:hover {
background-color: transparent;
opacity: 1;
}
}
.repcontrol_move {
@include contentImage("move.svg");
opacity: 0.5;
}
.repcontrol_del {
@include contentImage("delete.svg");
opacity: 0.5;
}
}
.repcontainer.ui-sortable.editmode[data-groupname*="repeating_"] {
~ .repcontrol[data-groupname*="repeating_"] {
.repcontrol_edit {
font-size: 0;
opacity: 0.5;
@include contentImage("unlock.svg");
}
}
}
.repcontrol_add, .repcontrol_edit {
display: flex;
justify-content: center;
align-items: center;
padding: 0.25rem 1rem;
margin: 0.5rem 0.25rem;
box-shadow: none;
outline: none;
color: $jet;
font-family: $primary-serif;
font-weight: normal;
font-size: 0px;
letter-spacing: 0.04em;
text-shadow: none;
&::before, &::after {
visibility: visible;
font-family: $primary-serif;
text-transform: uppercase;
font-size: 14px;
line-height: 20px;
letter-spacing: 0.04em;
color: $jet;
}
&:hover {
background-color: transparent;
opacity: 1;
}
}
.repcontrol_add {
@include contentImage("add.svg");
opacity: 0.5;
float: left;
}
.repcontrol_edit {
@include contentImage("lock.svg");
opacity: 0.5;
}
}
}
@mixin fill-in-radios {
.radio__ranks {
display: flex;
}
.radio__rank {
order: 1;
@include square(13px);
margin: 0 0.25rem;
appearance: none;
-webkit-appearance: none;
cursor: pointer;
&:hover {
@media (prefers-color-scheme: light) {
background-color: $primary-highlight-light;
}
@media (prefers-color-scheme: dark) {
background-color: $primary-highlight-dark;
}
}
}
.radio__rank:checked {
display: none;
}
.radio__rank:checked ~ .radio__rank {
order: 3;
background-color: transparent;
&:hover {
@media (prefers-color-scheme: light) {
background-color: $primary-highlight-light;
}
@media (prefers-color-scheme: dark) {
background-color: $primary-highlight-dark;
}
}
}
.radio__rank.reset {
order: 2;
&:hover {
@media (prefers-color-scheme: light) {
background-color: $primary-highlight-light;
}
@media (prefers-color-scheme: dark) {
background-color: $primary-highlight-dark;
}
}
}
}
+152
View File
@@ -0,0 +1,152 @@
.toggle-popup[value="0"] + .popup {
display: none;
}
.toggle-tooltip[value="0"] + .help {
display: none;
}
.popup {
display: inline-flex;
flex-direction: column;
position: fixed;
top: 7rem;
left: 4rem;
border: 2px solid transparent;
padding: 0.5rem;
width: 50%;
z-index: 1000;
min-width: 255px;
box-shadow: 5px 5px 6px rgba($jet, 0.2);
&__title {
display: flex;
justify-content: center;
margin-top: -1.5rem;
height: 2rem;
align-items: end;
text-align: center;
&--span {
padding: 0.2rem 0.5rem;
border: 2px solid transparent;
font-family: $primary-serif;
text-transform: uppercase;
}
}
&__close {
white-space: nowrap;
cursor: pointer;
height: 2rem;
position: absolute;
right: 1rem;
width: fit-content !important;
&:hover {
transition: all 1s;
@include rotate(360deg);
}
&--btn {
display: none !important;
}
&--symbol {
float: right;
@include square(18px);
@include imgHover;
}
}
&__header {
font-family: $primary-serif;
text-transform: uppercase;
padding-bottom: 8px;
@include sectionHeader;
}
&__content {
overflow-y: scroll;
@include firstLetter;
}
}
.help {
@include square(12px);
&__label {
&--input{
display: none !important;
}
&--icon {
@include square(12px);
cursor: help;
@include imgHover;
}
}
}
@media (prefers-color-scheme: light) {
.popup {
border-color: $primary-highlight-light;
background: $primary-background-light !important;
color: $jet;
&__title {
&--span {
color: $primary-color-light;
background: $primary-highlight-light;
border-color: $primary-highlight-light;
}
}
&__header {
&--span {
color: $primary-accent-light;
}
}
&__close:hover {
color: $primary-accent-light;
fill: $primary-accent-light;
}
}
}
@media (prefers-color-scheme: light) {
.popup {
border-color: $primary-highlight-light;
background: $primary-background-light !important;
color: $jet;
&__title {
&--span {
color: $primary-color-light;
background: $primary-highlight-light;
border-color: $primary-highlight-light;
}
}
&__header {
&--span {
color: $primary-accent-light;
}
}
&__close:hover {
color: $primary-accent-light;
fill: $primary-accent-light;
}
}
}
@media (prefers-color-scheme: dark) {
.popup {
border-color: $primary-highlight-dark;
background: $primary-background-dark !important;
color: $jet;
&__title {
&--span {
color: $primary-color-dark;
background: $primary-highlight-dark;
border-color: $primary-highlight-dark;
}
}
&__header {
&--span {
color: $primary-accent-dark;
}
}
&__close:hover {
color: $primary-accent-dark;
fill: $primary-accent-dark;
}
}
}
+24
View File
@@ -0,0 +1,24 @@
.arc {
.arc__layout {
&--left {
display: grid;
grid-template-rows: repeat(4, auto) 1fr;
row-gap: 24px;
height: fit-content;
}
&--right {
display: grid;
grid-template-rows: repeat(4, auto);
row-gap: 24px;
height: fit-content;
}
@import "../components/health";
@import "../components/approaches";
@import "../components/skills";
@import "../components/background";
@import "../components/bonds";
@import "../components/experience";
@import "../components/consequences";
@import "../components/inventory";
}
}
+423
View File
@@ -0,0 +1,423 @@
@mixin templateContainer {
width: 100%;
max-width: 400px;
.sheet-arc {
&__container {
display: grid;
box-sizing: border-box;
gap: 0;
padding: 4px;
border: 1px solid transparent;
}
&__banner {
height: 30px;
background-repeat: no-repeat;
background-size: contain;
height: 30px;
&.sheet-short-rest {
background-image: url("#{$root-url}tab_short_rest.png");
}
&.sheet-long-rest {
background-image: url("#{$root-url}tab_long_rest.png");
}
&.sheet-skill-test {
background-image: url("#{$root-url}tab_skill_check.png");
}
}
&__content {
display: grid;
grid-template-rows: auto 1fr;
row-gap: 12px;
background-repeat: no-repeat;
background-size: cover;
padding: 24px 8px 16px 8px;
min-height: 200px;
&.sheet-short-rest {
background-image: url("#{$root-url}bg_short_rest.png");
}
&.sheet-long-rest {
background-image: url("#{$root-url}bg_long_rest.png");
}
&.sheet-skill-test {
grid-template-rows: auto auto 1fr;
}
&.sheet-fallen {
background-image: url("#{$root-url}bg_fallen.png");
}
}
&__sentence {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: baseline;
padding: 4px;
&--name {
font-family: $secondary-serif;
font-size: 3em;
color: $primary-accent-light;
text-align: left;
line-height: 1em;
font-weight: 900;
}
&--verb {
font-family: $primary-sans-serif;
font-size: 1.33em;
padding: 0 0.25em;
text-align: left;
font-style: oblique;
&.sheet-short-rest {
color: $short-rest-primary-color;
}
&.sheet-long-rest {
color: $long-rest-primary-color;
}
&.sheet-skill-test {
color: $skill-test-primary-color;
}
&.sheet-fallen {
color: $fallen-primary-color;
}
}
&--action {
font-family: $primary-sans-serif;
font-size: 2em;
font-weight: bold;
text-align: left;
font-style: oblique;
text-transform: lowercase;
&.sheet-short-rest {
color: $short-rest-primary-color;
}
&.sheet-long-rest {
color: $long-rest-primary-color;
}
&.sheet-skill-test {
color: $skill-test-primary-color;
}
&.sheet-fallen {
color: $fallen-primary-color;
}
&::after {
content: ".";
}
}
}
&__footnote {
font-family: $secondary-serif;
text-align: end;
margin: 4px 0;
&--span { font-size: 0.8em; }
}
}
}
%sheetResult {
flex: none;
order: 1;
flex-grow: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
%inlinerollresult {
font-style: normal;
background: transparent;
border: 0px solid transparent;
box-sizing: border-box;
--box-shadow-color: transparent;
box-shadow: none;
cursor: help;
}
%fullfail {
background: transparent;
border-color:transparent;
box-sizing: border-box;
--box-shadow-color:transparent;
border-radius: 0;
}
%fullcrit {
background:transparent;
border-color:transparent;
box-sizing: border-box;
--box-shadow-color:transparent;
border-radius: 0;
background: none;
}
.sheet-rolltemplate {
&-recover,
&-skills,
&-fallen {
@include templateContainer;
}
}
.sheet-rolltemplate-recover {
.sheet-arc {
&__recover {
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
column-gap: 4px;
font-family: $primary-sans-serif;
&--arrow, &--text {
line-height: 1.8em;
}
&.sheet-short-rest {
color: $primary-color-light;
.inlinerollresult {
border-color: $primary-color-light;
}
}
&.sheet-long-rest {
color: $secondary-color-light;
.inlinerollresult {
border-color: $tertiary-background-light;
}
}
.inlinerollresult {
@extend %inlinerollresult;
padding: 0 4px;
font-family: $primary-sans-serif;
font-weight: bold;
font-size: 1.33em;
border-bottom: 2px solid transparent;
}
}
}
}
.sheet-rolltemplate-fallen {
.sheet-arc {
&__fallen {
display: grid;
grid-template-columns: auto 1fr;
align-items: flex-start;
column-gap: 4px;
font-family: $secondary-serif;
font-style: italic;
&--roll, &--text {
line-height: 1.8em;
}
&--text {
font-family: $primary-sans-serif;
}
&.sheet-fallen {
color: $secondary-color-light;
}
.inlinerollresult {
@extend %inlinerollresult;
padding: 0 4px;
font-weight: bold;
font-size: 3em;
}
}
}
}
.sheet-rolltemplate-skills {
.sheet-display-control {
display: none;
&.sheet-success ~ .sheet-arc__content {
&.sheet-skill-test {
background-image: url("#{$root-url}bg_check_success.png");
}
.sheet-arc__roll--value {
box-shadow: 0 0 4px 4px $skill-test-success-border;
border-color: $skill-test-success-shadow;
}
}
&.sheet-tie ~ .sheet-arc__content {
&.sheet-skill-test {
background-image: url("#{$root-url}bg_check_tie.png");
}
.sheet-arc__roll--value {
border: 1px solid $skill-test-tie-border;
box-shadow: 0px 0px 4px 4px $skill-test-tie-shadow;
}
}
&.sheet-fail ~ .sheet-arc__content {
&.sheet-skill-test {
background-image: url("#{$root-url}bg_check_fail.png");
}
.sheet-arc__roll--value {
border: 1px solid $skill-test-fail-border;
box-shadow: 0px 0px 4px 4px $skill-test-fail-shadow;
}
}
}
.sheet-arc {
&__approach-skill {
display: grid;
grid-template-columns: auto 1fr;
grid-template-rows: 35px auto 1fr;
align-items: center;
column-gap: 4px;
font-family: $primary-sans-serif;
&--arrow {
grid-row: 1 / 3;
grid-column: 1 / 2;
color: $secondary-color-light;
}
&--approach {
background-repeat: no-repeat;
background-size: contain;
height: 35px;
&.sheet-creative {
background-image: url("#{$root-url}text_creative.svg");
}
&.sheet-careful {
background-image: url("#{$root-url}text_careful.svg");
}
&.sheet-concerted {
background-image: url("#{$root-url}text_concerted.svg");
}
}
&--text {
font-family: $secondary-serif;
font-size: 2em;
text-transform: uppercase;
color: $secondary-color-light;
&::before {
content: "& ";
font-family: $secondary-serif;
color: $primary-accent-light;
}
}
}
&__results {
display: grid;
grid-template-columns: 1fr auto;
column-gap: 4px;
align-content: center;
&--text {
grid-column: 1 / 2;
display: flex;
align-items: flex-end;
justify-content: flex-start;
}
&--values {
grid-column: 2 / 3;
display: grid;
grid-template-columns: 1fr auto 1fr;
grid-template-rows: auto 1fr;
row-gap: 4px;
align-content: center;
}
}
// sheet-arc__results--text
&__success, &__tie, &__fail {
font-size: 2em;
line-height: 1em;
font-family: $primary-sans-serif;
&--span {
white-space: nowrap;
padding-right: 8px;
}
}
&__success--span {
color: $skill-test-success-color;
}
&__tie--span {
color: $skill-test-tie-color;
}
&__fail--span {
color: $skill-test-fail-color;
}
// sheet-arc__results--values
&__flawless, &__roll, &__versus, &__tn {
display: flex;
flex-direction: column;
&--header {
grid-row: 1 / 2;
display: flex;
justify-content: center;
font-family: $primary-sans-serif;
color: $secondary-border-light;
}
}
&__flawless, &__roll, &__tn {
&--value {
grid-row: 2 / 3;
font-family: serif;
height: 42px;
width: 42px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
.inlinerollresult {
@extend %inlinerollresult;
font-size: 36px;
line-height: 36px;
position: absolute;
bottom: 0;
}
}
}
&__roll {
&--header {
color: $secondary-color-light;
}
&--value {
color: transparent;
}
}
&__tn {
&--value {
border: 1px solid $skill-test-threshold-border;
box-shadow: 0 0 4px 4px $skill-test-threshold-shadow;
color: $skill-test-threshold-color;
background: rgba($skill-test-threshold-background, 0.7);
}
}
&__versus {
&--value {
grid-row: 2 / 3 ;
display: flex;
align-items: center;
justify-content: center;
z-index: 1;
}
&--symbol {
position: absolute;
font-family: $primary-sans-serif;
font-weight: bold;
text-align: center;
font-size: 24px;
padding: 2px;
color: $secondary-color-light;
@include square(18px);
&.sheet-success {
background: $skill-test-success-symbol;
}
&.sheet-tie {
background: $skill-test-tie-symbol;
}
&.sheet-fail {
background: $skill-test-fail-symbol;
}
}
}
}
}
+135
View File
@@ -0,0 +1,135 @@
.arc {
max-width: $xlarge;
display: grid;
grid-template-columns: 1rem 1fr 1rem;
grid-template-rows: auto auto 1fr;
row-gap: 1rem;
.toolbar {
grid-row: 1;
grid-column: 2;
}
&__header {
grid-row: 2;
grid-column: 2;
}
&__layout {
grid-column: 2;
grid-row: 3;
display: grid;
grid-template-columns: 3fr 2fr;
column-gap: 1rem;
width: 100%;
justify-content: center;
&--left {
grid-row: 1 / 2;
grid-column: 1 / 2;
.healths {
grid-row: 1;
}
.approaches {
grid-row: 2;
}
.skills {
grid-row: 3;
}
.inventory {
grid-row: 4;
}
}
&--right {
grid-row: 1 / 2;
grid-column: 2 / 3;
.background {
grid-row: 1;
}
.bonds {
grid-row: 2;
}
.experience {
grid-row: 3;
}
.consequences {
grid-row: 4;
}
}
}
input[name*="sheet_type"] {
&[value="npc"] {
~ .arc__layout {
grid-template-columns: auto;
}
~ .arc__layout--right {
display: none;
}
}
}
}
@media only screen and (max-width: $medium) {
.arc {
display: grid;
grid-template-columns: 1rem 1fr 1rem;
grid-template-rows: auto auto 1fr;
row-gap: 1rem;
.toolbar {
grid-row: 1;
grid-column: 2;
}
&__header {
grid-row: 2;
grid-column: 2;
}
&__layout {
grid-column: 2;
grid-row: 3;
display: grid;
grid-template-columns: auto;
width: 100%;
&--left {
grid-row: 1;
grid-column: 1;
.healths {
grid-row: 1;
}
.approaches {
grid-row: 2;
}
.skills {
grid-row: 3;
}
.inventory {
grid-row: 4;
}
}
&--right {
grid-column: 1;
grid-row: 2;
.background {
grid-row: 1;
}
.bonds {
grid-row: 2;
}
.experience {
grid-row: 3;
}
.consequences {
grid-row: 4;
}
}
}
}
}
+17
View File
@@ -0,0 +1,17 @@
button[type=roll], button[type=action] {
font-size: 1rem;
outline: none;
border: none;
border-radius: 0;
margin: 0;
padding: 0;
text-shadow: none;
box-shadow: none;
background: none;
&::before {
font-family: none;
content: none;
}
}
+87
View File
@@ -0,0 +1,87 @@
* {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
height: unset;
width: unset;
padding: unset;
margin: unset;
font-family: unset;
font-size: 1rem;
font-weight: unset;
line-height: unset;
color: unset;
border: unset;
border-radius: unset;
background: unset;
background-color: unset;
}
h1, h2, h3, h4, h5 {
font-size: unset;
line-height: unset;
color: unset;
}
label, input, input[type=number],
select, textarea, button, button[type=roll] {
display: unset;
width: unset;
height: unset;
padding: unset;
margin-bottom: unset;
font-family: unset;
font-size: unset;
font-weight: unset;
line-height: unset;
color: unset;
border: unset;
border-radius: unset;
background: unset;
background-color: unset;
box-shadow: unset;
}
button[type=roll] {
&::before {
display: none;
}
}
input[disabled], select[disabled], textarea[disabled],
input[readonly], select[readonly], textarea[readonly] {
background-color: unset;
border-color: unset;
}
fieldset {
background: transparent;
}
span {
word-break: break-word;
}
// Firefox
input[type=number] {
text-align: center;
width: 100%;
-moz-appearance: textfield;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
}
.btn:hover {
background-position: 0 0;
background-color: transparent;
}
+93
View File
@@ -0,0 +1,93 @@
// BREAKPOINTS
$xlarge: 960px;
$large: 720px;
$medium: 540px;
$small: 375px;
// FONTS
@import url("https://fonts.googleapis.com/css?family=Josefin+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css?family=Piazzolla:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css?family=Playfair+Display:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css?family=Fira+Code&display=swap");
$primary-sans-serif: "Josefin Sans", sans-serif;
$primary-serif: "Piazzolla", serif;
$secondary-serif: "Playfair Display", serif;
$primary-monospace: "Fira Code", monospace;
// ASSETS
// Icons made by Pixel Perfect
// https://flaticon.com/authors/pixel-perfect
$root-url: "https://raw.githubusercontent.com/morgdalaine/arc-momatoes/main/character-sheet/ARC/assets/";
// COLORS
// https://coolors.co/171212-32635b-358b6d-82a677-dabb3d-efdd86-acb7b1-eaebe8-f6f7f6-fefeff
$ash: #acb7b1;
$asparagus: #82a677;
$buff: #efdd86;
$cultured: #f6f7f6;
$emerald: #358b6d;
$jet: #171212;
$lionet: #dabb3d;
$myrtle: #32635b;
$platinum: #eaebe8;
$snow: #fefeff;
// LIGHT
$primary-color-light: $jet; // JET
$secondary-color-light: $snow; // SNOW
$primary-accent-light: $lionet; // LIONET
$primary-highlight-light: $buff; // BUFF
$primary-border-light: $ash; // ASH
$primary-background-light: $snow; // SNOW
$secondary-accent-light: $myrtle; // MYRTLE
$secondary-highlight-light: $emerald; // EMERALD
$secondary-border-light: $platinum; // PLATINUM
$secondary-background-light: $platinum; // PLATINUM
$tertiary-background-light: $cultured; // CULTURED
// DARK
$primary-color-dark: $jet; // JET
$secondary-color-dark: $snow; // SNOW
$primary-accent-dark: $lionet; // LIONET
$primary-highlight-dark: $buff; // BUFF
$primary-border-dark: $ash; // ASH
$primary-background-dark: $snow; // SNOW
$secondary-accent-dark: $myrtle; // MYRTLE
$secondary-highlight-dark: $emerald; // EMERALD
$secondary-border-dark: $platinum; // PLATINUM
$secondary-background-dark: $platinum; // PLATINUM
$tertiary-background-dark: $cultured; // CULTURED
// ROLL TEMPLATE
$fallen-primary-color: $snow;
$long-rest-primary-color: $asparagus;
$short-rest-primary-color: $myrtle;
$skill-test-primary-color: $snow;
$skill-test-success-color: $lionet;
$skill-test-success-border: #7f690b;
$skill-test-success-shadow: #7f690b;
$skill-test-success-symbol: #7f690b;
$skill-test-tie-color: #89a57d;
$skill-test-tie-border: #2b4434;
$skill-test-tie-shadow: #2b4434;
$skill-test-tie-symbol: #2b4434;
$skill-test-fail-color: $ash;
$skill-test-fail-border: #3c2f27;
$skill-test-fail-shadow: #3c2f27;
$skill-test-fail-symbol: #314d3c;
$skill-test-threshold-color: #6a878e;
$skill-test-threshold-background: #192120;
$skill-test-threshold-border: #394143;
$skill-test-threshold-shadow: #2b3639;