Merge branch 'master' into 55-creatures-compendium

This commit is contained in:
Johannes Loher 2021-08-18 21:29:40 +02:00
commit 040c0f8069
37 changed files with 820 additions and 590 deletions

View file

@ -2,7 +2,7 @@
"private": true,
"name": "dungeonslayers4",
"description": "An implementation of the Dungeonslayers 4 game system for Foundry Virtual Tabletop.",
"version": "1.1.3",
"version": "1.2.1",
"license": "https://git.f3l.de/dungeonslayers/ds4#licensing",
"homepage": "https://git.f3l.de/dungeonslayers/ds4",
"repository": {
@ -52,33 +52,32 @@
"postinstall": "husky install"
},
"devDependencies": {
"@league-of-foundry-developers/foundry-vtt-types": "^0.8.8-5",
"@rollup/plugin-node-resolve": "^13.0.0",
"@types/fs-extra": "^9.0.12",
"@types/jest": "^26.0.24",
"@typescript-eslint/eslint-plugin": "^4.28.2",
"@typescript-eslint/parser": "^4.28.2",
"chalk": "^4.1.1",
"eslint": "^7.30.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-jest": "^24.3.6",
"eslint-plugin-prettier": "^3.4.0",
"fs-extra": "^10.0.0",
"gulp": "^4.0.2",
"gulp-sass": "^5.0.0",
"husky": "^7.0.1",
"jest": "^27.0.6",
"jest-junit": "^12.2.0",
"lint-staged": "^11.0.0",
"prettier": "^2.3.2",
"rollup": "^2.53.1",
"rollup-plugin-typescript2": "^0.30.0",
"sass": "1.35.2",
"semver": "^7.3.5",
"ts-jest": "^27.0.3",
"tslib": "^2.3.0",
"typescript": "^4.3.5",
"yargs": "^17.0.1"
"@league-of-foundry-developers/foundry-vtt-types": "0.8.8-8",
"@types/fs-extra": "9.0.12",
"@types/jest": "27.0.1",
"@typescript-eslint/eslint-plugin": "4.29.2",
"@typescript-eslint/parser": "4.29.2",
"chalk": "4.1.2",
"eslint": "7.32.0",
"eslint-config-prettier": "8.3.0",
"eslint-plugin-jest": "24.4.0",
"eslint-plugin-prettier": "3.4.0",
"fs-extra": "10.0.0",
"gulp": "4.0.2",
"gulp-sass": "5.0.0",
"husky": "7.0.1",
"jest": "27.0.6",
"jest-junit": "12.2.0",
"lint-staged": "11.1.2",
"prettier": "2.3.2",
"rollup": "2.56.2",
"rollup-plugin-typescript2": "0.30.0",
"sass": "1.38.0",
"semver": "7.3.5",
"ts-jest": "27.0.5",
"tslib": "2.3.1",
"typescript": "4.3.5",
"yargs": "17.1.1"
},
"lint-staged": {
"*.ts": "eslint --cache --fix",

4
renovate.json Normal file
View file

@ -0,0 +1,4 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:base", ":automergeAll", ":automergeBranch", ":prHourlyLimitNone", ":prConcurrentLimitNone"]
}

3
renovate.json.license Normal file
View file

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-License-Identifier: MIT

View file

@ -3,7 +3,6 @@
// SPDX-License-Identifier: MIT
const typescript = require("rollup-plugin-typescript2");
const { nodeResolve } = require("@rollup/plugin-node-resolve");
module.exports = {
input: "src/module/ds4.ts",
@ -12,5 +11,5 @@ module.exports = {
format: "es",
sourcemap: true,
},
plugins: [nodeResolve(), typescript({})],
plugins: [typescript({})],
};

View file

@ -1,10 +1,11 @@
{
"DS4.UserInteractionAddItem": "Neu",
"DS4.UserInteractionEditItem": "Bearbeiten",
"DS4.UserInteractionDeleteItem": "Löschen",
"DS4.UserInteractionAddEffect": "Neuer Effekt",
"DS4.UserInteractionEditEffect": "Effekt bearbeiten",
"DS4.UserInteractionDeleteEffect": "Effekt löschen",
"DS4.UserInteractionAdd": "Neu",
"DS4.UserInteractionAddItemTitle": "Item Erstellen",
"DS4.UserInteractionEditItemTitle": "Item Bearbeiten",
"DS4.UserInteractionDeleteItemTitle": "Item Löschen",
"DS4.UserInteractionAddEffectTitle": "Effekt Erstellen",
"DS4.UserInteractionEditEffectTitle": "Effekt Bearbeiten",
"DS4.UserInteractionDeleteEffectTitle": "Effekt Löschen",
"DS4.DocumentImageAltText": "Bild von {name}",
"DS4.RollableImageRollableTitle": "Für {name} würfeln",
"DS4.DiceOverlayImageAltText": "Bild eines W20",
@ -18,7 +19,6 @@
"DS4.HeadingAbilities": "Fähigkeiten",
"DS4.HeadingSpells": "Zaubersprüche",
"DS4.HeadingDescription": "Beschreibung",
"DS4.HeadingSpecialCreatureAbilities": "Besondere Fähigkeiten",
"DS4.AttackType": "Angriffsart",
"DS4.AttackTypeAbbr": "AA",
"DS4.DialogAttackTypeSelection": "Welche Angriffsart?",
@ -121,6 +121,10 @@
"DS4.SpellMinimumLevelsSorcerer": "Zugangsstufe für Schwarzmagier",
"DS4.SpellMinimumLevelsSorcererAbbr": "Zugangsstufe Sch",
"DS4.SpellPrice": "Preis (Gold)",
"DS4.EffectEnabled": "Aktiv",
"DS4.EffectEnabledAbbr": "A",
"DS4.EffectLabel": "Bezeichnung",
"DS4.EffectSourceName": "Quelle",
"DS4.ActorName": "Name",
"DS4.ActorImageAltText": "Bild des Aktors",
"DS4.ActorTypeCharacter": "Charakter",
@ -207,7 +211,7 @@
"DS4.CreatureBaseInfoSizeCategory": "Größenkategorie",
"DS4.CreatureBaseInfoExperiencePoints": "Erfahrungspunkte",
"DS4.CreatureBaseInfoDescription": "Beschreibung",
"DS4.WarningManageActiveEffectOnOwnedItem": "Das Verwalten von aktiven Effekten innerhalb eines besessen Items wird derzeit nicht unterstützt und wird in einem nachfolgenden Update hinzugefügt.",
"DS4.WarningManageActiveEffectOnOwnedItem": "Das Verwalten von aktiven Effekten innerhalb eines besessen Items wird derzeit nicht unterstützt und wird in einem nachfolgenden Update hinzugefügt. Falls Sie eigentlich den auf den Aktor übertragenen Effekt verwalten wollen, können Sie dies im 'Effekte'-Tab des Aktorbogens tun.",
"DS4.WarningActorCannotOwnItem": "Der Aktor '{actorName}' vom Typ '{actorType}' kann das Item '{itemName}' vom Typ '{itemType}' nicht besitzen.",
"DS4.ErrorDiceCoupFumbleOverlap": "Es gibt eine Überlappung zwischen Patzern und Immersiegen.",
"DS4.ErrorSlayingDiceRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.",
@ -253,6 +257,7 @@
"DS4.ErrorActorDoesNotHaveItem": "Der Aktor '{actor}' hat kein Item mit der ID '{id}'.",
"DS4.ErrorUnexpectedError": "Es gab einen unerwarteten Fehler im Dungeonslayers 4 System. Für mehr Details schauen Sie bitte in die Konsole (F12).",
"DS4.ErrorItemDoesNotHaveEffect": "Das Item '{item}' hat keinen Effekt mit der ID '{id}'.",
"DS4.ErrorActorDoesNotHaveEffect": "Der Aktor '{actor}' hat keinen Effekt mit der ID '{id}'.",
"DS4.DialogRollOptionsCheckTargetNumberLabel": "Probenwert",
"DS4.DialogRollOptionsGMModifierLabel": "SL-Modifikator",
"DS4.DialogRollOptionsMaximumCoupResultLabel": "Immersieg bis",
@ -295,5 +300,17 @@
"DS4.ChecksWorkMechanism": "Mechanismus Öffnen",
"DS4.ActorCheckFlavor": "{actor} würfelt eine {check} Probe.",
"DS4.ActorGenericCheckFlavor": "{actor} würfelt eine Probe gegen {attribute} + {trait}.",
"DS4.CheckTooltip": "{check} Probe würfeln"
"DS4.CheckTooltip": "{check} Probe würfeln",
"DS4.NewWeaponName": "Neue Waffe",
"DS4.NewArmorName": "Neue Panzerung",
"DS4.NewShieldName": "Neuer Schild",
"DS4.NewSpellName": "Neuer Zauberspruch",
"DS4.NewEquipmentName": "Neue Ausrüstung",
"DS4.NewLootName": "Neue Beute",
"DS4.NewTalentName": "Neues Talent",
"DS4.NewRacialAbilityName": "Neue Volksfähigkeit",
"DS4.NewLanguageName": "Neue Sprache",
"DS4.NewAlphabetName": "Neue Schriftzeichen",
"DS4.NewSpecialCreatureAbilityName": "Neue Besondere Kreaturenfähigkeit",
"DS4.NewEffectLabel": "Neuer Effekt"
}

View file

@ -1,10 +1,11 @@
{
"DS4.UserInteractionAddItem": "Add item",
"DS4.UserInteractionEditItem": "Edit item",
"DS4.UserInteractionDeleteItem": "Delete item",
"DS4.UserInteractionAddEffect": "Add Effect",
"DS4.UserInteractionEditEffect": "Edit Effect",
"DS4.UserInteractionDeleteEffect": "Delete Effect",
"DS4.UserInteractionAdd": "Add",
"DS4.UserInteractionAddItemTitle": "Create Item",
"DS4.UserInteractionEditItemTitle": "Edit Item",
"DS4.UserInteractionDeleteItemTitle": "Delete Item",
"DS4.UserInteractionAddEffectTitle": "Create Effect",
"DS4.UserInteractionEditEffectTitle": "Edit Effect",
"DS4.UserInteractionDeleteEffectTitle": "Delete Effect",
"DS4.DocumentImageAltText": "Image of {name}",
"DS4.RollableImageRollableTitle": "Roll for {name}",
"DS4.DiceOverlayImageAltText": "Image of a d20",
@ -18,7 +19,6 @@
"DS4.HeadingAbilities": "Abilities",
"DS4.HeadingSpells": "Spells",
"DS4.HeadingDescription": "Description",
"DS4.HeadingSpecialCreatureAbilities": "Special Abilities",
"DS4.AttackType": "Attack Type",
"DS4.AttackTypeAbbr": "AT",
"DS4.DialogAttackTypeSelection": "Which Attack Type?",
@ -121,6 +121,10 @@
"DS4.SpellMinimumLevelsSorcerer": "Minimum level for Sorcerers",
"DS4.SpellMinimumLevelsSorcererAbbr": "Min lvl SRC",
"DS4.SpellPrice": "Price (Gold)",
"DS4.EffectEnabled": "Enabled",
"DS4.EffectEnabledAbbr": "E",
"DS4.EffectLabel": "Label",
"DS4.EffectSourceName": "Source",
"DS4.ActorName": "Name",
"DS4.ActorImageAltText": "Image of the Actor",
"DS4.ActorTypeCharacter": "Character",
@ -207,7 +211,7 @@
"DS4.CreatureBaseInfoSizeCategory": "Size Category",
"DS4.CreatureBaseInfoExperiencePoints": "Experience Points",
"DS4.CreatureBaseInfoDescription": "Description",
"DS4.WarningManageActiveEffectOnOwnedItem": "Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update.",
"DS4.WarningManageActiveEffectOnOwnedItem": "Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update. If you actually want to manage the effect that has been transferred to the actor, you can do so in the 'Effects' tab in the actor sheet.",
"DS4.WarningActorCannotOwnItem": "The actor '{actorName}' of type '{actorType}' cannot own the item '{itemName}' of type '{itemType}'.",
"DS4.ErrorDiceCoupFumbleOverlap": "There is an overlap between Fumbles and Coups.",
"DS4.ErrorSlayingDiceRecursionLimitExceeded": "Maximum recursion depth for slaying dice roll exceeded.",
@ -253,6 +257,7 @@
"DS4.ErrorActorDoesNotHaveItem": "The actor '{actor}' does not have any item with the id '{id}'.",
"DS4.ErrorUnexpectedError": "There was an unexpected error in the Dungeonslayers 4 system. For more details, please take a look at the console (F12).",
"DS4.ErrorItemDoesNotHaveEffect": "The item '{item}' does not have any effect with the id '{id}'.",
"DS4.ErrorActorDoesNotHaveEffect": "The actor '{actor}' does not have any effect with the id '{id}'.",
"DS4.DialogRollOptionsCheckTargetNumberLabel": "Check Target Number",
"DS4.DialogRollOptionsGMModifierLabel": "Game Master Modifier",
"DS4.DialogRollOptionsMaximumCoupResultLabel": "Coup to",
@ -295,5 +300,17 @@
"DS4.ChecksWorkMechanism": "Work Mechanism",
"DS4.ActorCheckFlavor": "{actor} rolls a {check} check.",
"DS4.ActorGenericCheckFlavor": "{actor} rolls a check against {attribute} + {trait}.",
"DS4.CheckTooltip": "Roll a {check} check"
"DS4.CheckTooltip": "Roll a {check} check",
"DS4.NewWeaponName": "New Weapon",
"DS4.NewArmorName": "New Armor",
"DS4.NewShieldName": "New Shield",
"DS4.NewSpellName": "New Spell",
"DS4.NewEquipmentName": "New Equipment",
"DS4.NewLootName": "New Loot",
"DS4.NewTalentName": "New Talent",
"DS4.NewRacialAbilityName": "New Racial Ability",
"DS4.NewLanguageName": "New Language",
"DS4.NewAlphabetName": "New Alphabet",
"DS4.NewSpecialCreatureAbilityName": "New Special Creature Ability",
"DS4.NewEffectLabel": "New Effect"
}

View file

@ -3,6 +3,7 @@
// SPDX-License-Identifier: MIT
import { DS4Actor } from "./actor/actor";
import { getGame } from "./helpers";
declare global {
interface DocumentClassConfig {
@ -10,7 +11,18 @@ declare global {
}
}
type PromisedType<T> = T extends Promise<infer U> ? U : T;
export class DS4ActiveEffect extends ActiveEffect {
/**
* A fallback icon that can be used if no icon is defined for the effect.
*/
static FALLBACK_ICON = "icons/svg/aura.svg";
/**
* A cached reference to the source document to avoid recurring database lookups
*/
protected source: PromisedType<ReturnType<typeof fromUuid>> | undefined = undefined;
/** @override */
apply(actor: DS4Actor, change: foundry.data.ActiveEffectData["changes"][number]): unknown {
change.value = Roll.replaceFormulaData(change.value, actor.data);
@ -21,4 +33,25 @@ export class DS4ActiveEffect extends ActiveEffect {
}
return super.apply(actor, change);
}
/**
* Gets the current source name based on the cached source object.
*/
async getCurrentSourceName(): Promise<string> {
const game = getGame();
const origin = await this.getSource();
if (origin === null) return game.i18n.localize("None");
return origin.name ?? game.i18n.localize("Unknown");
}
/**
* Gets the source document for this effect. Uses the cached {@link DS4ActiveEffect#origin} if it has already been
* set.
*/
protected async getSource(): ReturnType<typeof fromUuid> {
if (this.source === undefined) {
this.source = this.data.origin !== undefined ? await fromUuid(this.data.origin) : null;
}
return this.source;
}
}

View file

@ -5,16 +5,17 @@
//
// SPDX-License-Identifier: MIT
import { DS4ActiveEffect } from "../../active-effect";
import { ModifiableDataBaseTotal } from "../../common/common-data";
import { DS4 } from "../../config";
import { getCanvas, getGame } from "../../helpers";
import { DS4Item } from "../../item/item";
import { DS4Settings, getDS4Settings } from "../../settings";
import notifications from "../../ui/notifications";
import { enforce } from "../../utils";
import { isCheck } from "../actor-data-properties";
/**
* The base Sheet class for all DS4 Actors
* The base sheet class for all {@link DS4Actor}s.
*/
export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetData> {
/** @override */
@ -22,15 +23,7 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["ds4", "sheet", "actor"],
height: 620,
scrollY: [
".values",
".inventory",
".spells",
".abilities",
".profile",
".biography",
".special-creature-abilities",
],
scrollY: [".values", ".inventory", ".spells", ".abilities", ".effects", ".biography", ".description"],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "values" }],
dragDrop: [
{ dragSelector: ".item-list .item", dropSelector: null },
@ -46,29 +39,36 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
return `${basePath}/${this.actor.data.type}-sheet.hbs`;
}
/**
* This method returns the data for the template of the actor sheet.
* It explicitly adds the items of the object sorted by type in the
* object itemsByType.
* @returns The data fed to the template of the actor sheet
*/
/** @override */
async getData(): Promise<DS4ActorSheetData> {
const itemsByType = Object.fromEntries(
Object.entries(this.actor.itemTypes).map(([itemType, items]) => {
return [itemType, items.map((item) => item.data).sort((a, b) => (a.sort || 0) - (b.sort || 0))];
}),
);
const enrichedEffectPromises = this.actor.effects.map(async (effect) => {
return {
...effect.toObject(),
icon: effect.data.icon ?? DS4ActiveEffect.FALLBACK_ICON,
sourceName: await effect.getCurrentSourceName(),
};
});
const enrichedEffects = await Promise.all(enrichedEffectPromises);
const data = {
...this.addTooltipsToData(await super.getData()),
// Add the localization config to the data:
config: DS4,
// Add the items explicitly sorted by type to the data:
itemsByType,
enrichedEffects,
settings: getDS4Settings(),
};
return data;
}
/**
* Adds tooltips to the attributes, traits, and combatValues of the actor data of the given {@link ActorSheet.Data}.
*/
protected addTooltipsToData(data: ActorSheet.Data): ActorSheet.Data {
const valueGroups = [data.data.data.attributes, data.data.data.traits, data.data.data.combatValues];
@ -80,6 +80,9 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
return data;
}
/**
* Generates a tooltip for a given attribute, trait, or combatValue.
*/
protected getTooltipForValue(value: ModifiableDataBaseTotal<number>): string {
return `${value.base} (${getGame().i18n.localize("DS4.TooltipBaseValue")}) + ${
value.mod
@ -92,144 +95,209 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
activateListeners(html: JQuery): void {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
// Add Inventory Item
html.find(".item-create").on("click", this.onItemCreate.bind(this));
html.find(".control-item").on("click", this.onControlItem.bind(this));
html.find(".change-item").on("change", this.onChangeItem.bind(this));
// Update Inventory Item
html.find(".item-edit").on("click", (ev) => {
const li = $(ev.currentTarget).parents(".item");
const id = li.data("itemId");
const item = this.actor.items.get(id);
if (!item) {
throw new Error(getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
}
if (!item.sheet) {
throw new Error(getGame().i18n.localize("DS4.ErrorUnexpectedError"));
}
item.sheet.render(true);
});
// Delete Inventory Item
html.find(".item-delete").on("click", (ev) => {
const li = $(ev.currentTarget).parents(".item");
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")]);
li.slideUp(200, () => this.render(false));
});
html.find(".item-change").on("change", this.onItemChange.bind(this));
html.find(".control-effect").on("click", this.onControlEffect.bind(this));
html.find(".change-effect").on("change", this.onChangeEffect.bind(this));
html.find(".rollable-item").on("click", this.onRollItem.bind(this));
html.find(".rollable-check").on("click", this.onRollCheck.bind(this));
}
/**
* Handle creating a new embedded Item for the actor using initial data defined in the HTML dataset
* Handles a click on an element of this sheet to control an embedded item of the actor corresponding to this sheet.
*
* @param event - The originating click event
*/
protected onItemCreate(event: JQuery.ClickEvent): void {
protected onControlItem(event: JQuery.ClickEvent): void {
event.preventDefault();
const header = event.currentTarget;
const { type, ...data } = foundry.utils.deepClone(header.dataset);
const name = `New ${type.capitalize()}`;
const a = event.currentTarget;
switch (a.dataset["action"]) {
case "create":
return this.onCreateItem(event);
case "edit":
return this.onEditItem(event);
case "delete":
return this.onDeleteItem(event);
}
}
/**
* Creates a new embedded item using the initial data defined in the HTML dataset of the clicked element.
*
* @param event - The originating click event
*/
protected onCreateItem(event: JQuery.ClickEvent): void {
const { type, ...data } = foundry.utils.deepClone(event.currentTarget.dataset);
const name = getGame().i18n.localize(`DS4.New${type.capitalize()}Name`);
const itemData = {
name: name,
type: type,
data: data,
};
DS4Item.create(itemData, { parent: this.actor });
Item.create(itemData, { parent: this.actor });
}
/**
* Handle changes to properties of an Owned Item from within character sheet.
* Can currently properly bind: see getValue().
* Assumes the item property is given as the value of the HTML element property 'data-property'.
* @param ev - The originating change event
* Opens the sheet of the embedded item corresponding to the clicked element.
*
* @param event - The originating click event
*/
protected onItemChange(ev: JQuery.ChangeEvent): void {
ev.preventDefault();
const el: HTMLFormElement = $(ev.currentTarget).get(0);
const id = $(ev.currentTarget).parents(".item").data("itemId");
protected onEditItem(event: JQuery.ClickEvent): void {
const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.Item.selector)
.data(embeddedDocumentListEntryProperties.Item.idDataAttribute);
const item = this.actor.items.get(id);
if (!item) {
throw new Error(getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
}
const itemObject = item.toObject();
const property: string | undefined = $(ev.currentTarget).data("property");
// Early return:
// Disabled => do nothing
if (el.disabled || el.getAttribute("disabled")) return;
// name not given => raise
if (property === undefined) {
throw TypeError("HTML element does not provide 'data-property' attribute");
}
// Set new value
const newValue = this.getValue(el);
foundry.utils.setProperty(itemObject, property, newValue);
item.update(itemObject);
enforce(item, getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
enforce(item.sheet);
item.sheet.render(true);
}
/**
* Collect the value of a form element depending on the element's type
* The value is parsed to:
* - Checkbox: boolean
* - Text input: string
* - Number: number
* @param el - The input element to collect the value of
* Deletes the embedded item corresponding to the clicked element.
*
* @param event - The originating click event
*/
private getValue(el: HTMLFormElement): boolean | string | number {
// One needs to differentiate between e.g. checkboxes (value="on") and select boxes etc.
// Checkbox:
if (el.type === "checkbox") {
const value: boolean = el.checked;
return value;
protected onDeleteItem(event: JQuery.ClickEvent): void {
const li = $(event.currentTarget).parents(embeddedDocumentListEntryProperties.Item.selector);
this.actor.deleteEmbeddedDocuments("Item", [li.data(embeddedDocumentListEntryProperties.Item.idDataAttribute)]);
li.slideUp(200, () => this.render(false));
}
/**
* Applies a change to a property of an embedded item depending on the `data-property` attribute of the
* {@link HTMLInputElement} that has been changed and its new value.
*
* @param event - The originating change event
*/
protected onChangeItem(event: JQuery.ChangeEvent): void {
return this.onChangeEmbeddedDocument(event, "Item");
}
/**
* Handles a click on an element of this sheet to control an embedded effect of the actor corresponding to this
* sheet.
*
* @param event - The originating click event
*/
protected onControlEffect(event: JQuery.ClickEvent): void {
event.preventDefault();
const a = event.currentTarget;
switch (a.dataset["action"]) {
case "create":
return this.onCreateEffect();
case "edit":
return this.onEditEffect(event);
case "delete":
return this.onDeleteEffect(event);
}
}
// Text input:
else if (el.type === "text") {
const value: string = el.value;
return value;
}
/**
* Creates a new embedded effect.
*
* @param event - The originating click event
*/
protected onCreateEffect(): void {
const effectData = {
label: getGame().i18n.localize(`DS4.NewEffectLabel`),
icon: "icons/svg/aura.svg",
origin: this.actor.uuid,
};
ActiveEffect.create(effectData, { parent: this.actor });
}
// Numbers:
else if (el.type === "number") {
const value = Number(el.value.trim());
return value;
}
/**
* Opens the sheet of the embedded effect corresponding to the clicked element.
*
* @param event - The originating click event
*/
protected onEditEffect(event: JQuery.ClickEvent): void {
const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.ActiveEffect.selector)
.data(embeddedDocumentListEntryProperties.ActiveEffect.idDataAttribute);
const effect = this.actor.effects.get(id);
enforce(effect, getGame().i18n.format("DS4.ErrorActorDoesNotHaveEffect", { id, actor: this.actor.name }));
effect.sheet.render(true);
}
// // Ranges:
// else if (el.type === "range") {
// const value: string = el.value.trim();
// return value;
// }
/**
* Deletes the embedded item corresponding to the clicked element.
*
* @param event - The originating click event
*/
protected onDeleteEffect(event: JQuery.ClickEvent): void {
const li = $(event.currentTarget).parents(embeddedDocumentListEntryProperties.ActiveEffect.selector);
const id = li.data(embeddedDocumentListEntryProperties.ActiveEffect.idDataAttribute);
this.actor.deleteEmbeddedDocuments("ActiveEffect", [id]);
li.slideUp(200, () => this.render(false));
}
// // Radio Checkboxes (untested, cf. FormDataExtended.process)
// else if (el.type === "radio") {
// const chosen: HTMLFormElement = el.find((r: HTMLFormElement) => r["checked"]);
// const value: string = chosen ? chosen.value : null;
// return value;
// }
/**
* Applies a change to a property of an embedded effect depending on the `data-property` attribute of the
* {@link HTMLInputElement} that has been changed and its new value.
*
* @param event - The originating change event
*/
protected onChangeEffect(event: JQuery.ChangeEvent): void {
return this.onChangeEmbeddedDocument(event, "ActiveEffect");
}
// // Multi-Select (untested, cf. FormDataExtended.process)
// else if (el.type === "select-multiple") {
// const value: Array<string> = [];
// el.options.array.forEach((opt: HTMLOptionElement) => {
// if (opt.selected) value.push(opt.value);
// });
// return value;
/**
* Applies a change to a property of an embedded document of the actor belonging to this sheet. The change depends
* on the `data-property` attribute of the {@link HTMLInputElement} that has been changed and its new value.
*
* @param event - The originating change event
* @param documentName - The name of the embedded document to be changed.
*/
protected onChangeEmbeddedDocument(event: JQuery.ChangeEvent, documentName: "Item" | "ActiveEffect"): void {
event.preventDefault();
const element = $(event.currentTarget).get(0);
enforce(element instanceof HTMLInputElement);
if (element.disabled) return;
// unsupported:
else {
throw new TypeError("Binding of item property to this type of HTML element not supported; given: " + el);
const effectElement = element.closest(embeddedDocumentListEntryProperties[documentName].selector);
enforce(effectElement instanceof HTMLElement);
const id = effectElement.dataset[embeddedDocumentListEntryProperties[documentName].idDataAttribute];
const property = element.dataset["property"];
enforce(property !== undefined, TypeError("HTML element does not provide 'data-property' attribute"));
const newValue = this.parseValue(element);
this.actor.updateEmbeddedDocuments(documentName, [{ _id: id, [property]: newValue }]);
}
/**
* Parses the value of the given {@link HTMLInputElement} depending on the element's type
* The value is parsed to:
* - checkbox: `boolean`, if the attribute `data-inverted` is set to a truthy value, the parsed value is inverted
* - text input: `string`
* - number: `number`
*
* @param element - The input element to parse the value from
*/
protected parseValue(element: HTMLInputElement): boolean | string | number {
switch (element.type) {
case "checkbox": {
const inverted = Boolean(element.dataset["inverted"]);
const value: boolean = element.checked;
return inverted ? !value : value;
}
case "text": {
const value: string = element.value;
return value;
}
case "number": {
const value = Number(element.value.trim());
return value;
}
default: {
throw new TypeError(
"Binding of item property to this type of HTML element not supported; given: " + element,
);
}
}
}
@ -239,11 +307,11 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
*/
protected onRollItem(event: JQuery.ClickEvent): void {
event.preventDefault();
const id = $(event.currentTarget).parents(".item").data("itemId");
const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.Item.selector)
.data(embeddedDocumentListEntryProperties.Item.idDataAttribute);
const item = this.actor.items.get(id);
if (!item) {
throw new Error(getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
}
enforce(item, getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
item.roll().catch((e) => notifications.error(e, { log: true }));
}
@ -265,7 +333,7 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
const check = target.dataset.check;
if (!check) return super._onDragStart(event);
if (!isCheck(check)) throw new Error(getGame().i18n.format("DS4.ErrorCannotDragMissingCheck", { check }));
enforce(isCheck(check), getGame().i18n.format("DS4.ErrorCannotDragMissingCheck", { check }));
const dragData = {
actorId: this.actor.id,
@ -280,7 +348,7 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
/** @override */
protected async _onDropItem(event: DragEvent, data: ActorSheet.DropData.Item): Promise<unknown> {
const item = await DS4Item.fromDropData(data);
const item = await Item.fromDropData(data);
if (item && !this.actor.canOwnItemType(item.data.type)) {
notifications.warn(
getGame().i18n.format("DS4.WarningActorCannotOwnItem", {
@ -299,5 +367,27 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
interface DS4ActorSheetData extends ActorSheet.Data<ActorSheet.Options> {
config: typeof DS4;
itemsByType: Record<string, foundry.data.ItemData[]>;
enrichedEffects: EnrichedActiveEffectDataSource[];
settings: DS4Settings;
}
type ActiveEffectDataSource = foundry.data.ActiveEffectData["_source"];
interface EnrichedActiveEffectDataSource extends ActiveEffectDataSource {
icon: string;
sourceName: string;
}
/**
* This object contains information about specific properties embedded document list entries for each different type.
*/
const embeddedDocumentListEntryProperties = Object.freeze({
ActiveEffect: {
selector: ".effect",
idDataAttribute: "effectId",
},
Item: {
selector: ".item",
idDataAttribute: "itemId",
},
});

View file

@ -8,30 +8,33 @@ export default async function registerHandlebarsPartials(): Promise<void> {
const templatePaths = [
"systems/ds4/templates/sheets/actor/components/actor-header.hbs",
"systems/ds4/templates/sheets/actor/components/actor-progression.hbs",
"systems/ds4/templates/sheets/actor/components/add-button.hbs",
"systems/ds4/templates/sheets/actor/components/biography.hbs",
"systems/ds4/templates/sheets/actor/components/character-properties.hbs",
"systems/ds4/templates/sheets/actor/components/check.hbs",
"systems/ds4/templates/sheets/actor/components/checks.hbs",
"systems/ds4/templates/sheets/actor/components/combat-value.hbs",
"systems/ds4/templates/sheets/actor/components/combat-values.hbs",
"systems/ds4/templates/sheets/actor/components/control-button-group.hbs",
"systems/ds4/templates/sheets/actor/components/core-value.hbs",
"systems/ds4/templates/sheets/actor/components/core-values.hbs",
"systems/ds4/templates/sheets/actor/components/creature-properties.hbs",
"systems/ds4/templates/sheets/actor/components/currency.hbs",
"systems/ds4/templates/sheets/actor/components/effect-list-entry.hbs",
"systems/ds4/templates/sheets/actor/components/effect-list-header.hbs",
"systems/ds4/templates/sheets/actor/components/item-list-entry.hbs",
"systems/ds4/templates/sheets/actor/components/item-list-header.hbs",
"systems/ds4/templates/sheets/actor/components/items-overview.hbs",
"systems/ds4/templates/sheets/actor/components/overview-add-button.hbs",
"systems/ds4/templates/sheets/actor/components/overview-control-buttons.hbs",
"systems/ds4/templates/sheets/actor/components/profile.hbs",
"systems/ds4/templates/sheets/actor/components/rollable-image.hbs",
"systems/ds4/templates/sheets/actor/components/talent-rank-equation.hbs",
"systems/ds4/templates/sheets/actor/tabs/abilities.hbs",
"systems/ds4/templates/sheets/actor/tabs/biography.hbs",
"systems/ds4/templates/sheets/actor/tabs/character-abilities.hbs",
"systems/ds4/templates/sheets/actor/tabs/character-inventory.hbs",
"systems/ds4/templates/sheets/actor/tabs/creature-abilities.hbs",
"systems/ds4/templates/sheets/actor/tabs/creature-inventory.hbs",
"systems/ds4/templates/sheets/actor/tabs/description.hbs",
"systems/ds4/templates/sheets/actor/tabs/special-creature-abilities.hbs",
"systems/ds4/templates/sheets/actor/tabs/effects.hbs",
"systems/ds4/templates/sheets/actor/tabs/spells.hbs",
"systems/ds4/templates/sheets/actor/tabs/values.hbs",
"systems/ds4/templates/sheets/item/components/body.hbs",

View file

@ -15,3 +15,7 @@ export function getGame(): Game {
}
return game;
}
export function getGameSafe(): Game | undefined {
return game instanceof Game ? game : undefined;
}

View file

@ -99,8 +99,9 @@ export class DS4ItemSheet extends ItemSheet<ItemSheet.Options, DS4ItemSheetData>
*/
protected async createActiveEffect(): Promise<ActiveEffect | undefined> {
const createData = {
label: "New Effect",
label: getGame().i18n.localize(`DS4.NewEffectLabel`),
icon: "icons/svg/aura.svg",
origin: this.item.uuid,
};
return ActiveEffect.create(createData, { parent: this.item });

View file

@ -38,7 +38,7 @@ async function getOrCreateRollItemMacro(itemData: foundry.data.ItemData["_source
}
/**
* Executes the roll item macro for the given itemId.
* Executes the roll item macro for the item associated to the given `itemId`.
*/
export async function rollItem(itemId: string): Promise<void> {
const actor = getActiveActor();

View file

@ -5,10 +5,12 @@
import { getGame } from "./helpers";
export function registerSystemSettings(): void {
const game = getGame();
/**
* Track the migrations version of the latest migration that has been applied
*/
getGame().settings.register("ds4", "systemMigrationVersion", {
game.settings.register("ds4", "systemMigrationVersion", {
name: "System Migration Version",
scope: "world",
config: false,
@ -16,7 +18,7 @@ export function registerSystemSettings(): void {
default: -1,
});
getGame().settings.register("ds4", "useSlayingDiceForAutomatedChecks", {
game.settings.register("ds4", "useSlayingDiceForAutomatedChecks", {
name: "DS4.SettingUseSlayingDiceForAutomatedChecksName",
hint: "DS4.SettingUseSlayingDiceForAutomatedChecksHint",
scope: "world",
@ -25,7 +27,7 @@ export function registerSystemSettings(): void {
default: false,
});
getGame().settings.register("ds4", "showSlayerPoints", {
game.settings.register("ds4", "showSlayerPoints", {
name: "DS4.SettingShowSlayerPointsName",
hint: "DS4.SettingShowSlayerPointsHint",
scope: "world",
@ -42,9 +44,10 @@ export interface DS4Settings {
}
export function getDS4Settings(): DS4Settings {
const game = getGame();
return {
systemMigrationVersion: getGame().settings.get("ds4", "systemMigrationVersion"),
useSlayingDiceForAutomatedChecks: getGame().settings.get("ds4", "useSlayingDiceForAutomatedChecks"),
showSlayerPoints: getGame().settings.get("ds4", "showSlayerPoints"),
systemMigrationVersion: game.settings.get("ds4", "systemMigrationVersion"),
useSlayingDiceForAutomatedChecks: game.settings.get("ds4", "useSlayingDiceForAutomatedChecks"),
showSlayerPoints: game.settings.get("ds4", "showSlayerPoints"),
};
}

24
src/module/utils.ts Normal file
View file

@ -0,0 +1,24 @@
// SPDX-FileCopyrightText: 2021 Johannes Loher
//
// SPDX-License-Identifier: MIT
import { getGameSafe } from "./helpers";
/**
* Tests if the given `value` is truthy.
*
* If it is not truthy, an {@link Error} is thrown, which depends on the given `message` parameter:
* - If `message` is a string`, it is used to construct a new {@link Error} which then is thrown.
* - If `message` is an instance of {@link Error}, it is thrown.
* - If `message` is `undefined`, an {@link Error} with a default message is thrown.
*/
export function enforce(value: unknown, message?: string | Error): asserts value {
if (!value) {
if (!message) {
message =
getGameSafe()?.i18n.localize("DS4.ErrorUnexpectedError") ??
"There was an unexpected error in the Dungeonslayers 4 system. For more details, please take a look at the console (F12).";
}
throw message instanceof Error ? message : new Error(message);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: 2021 Johannes Loher
*
* SPDX-License-Identifier: MIT
*/
.ds4-control-button-group {
display: flex;
text-align: center;
width: 100%;
padding: 0 calc(1em / 3);
&__button {
flex: 1;
}
}

View file

@ -8,7 +8,7 @@
@use "../utils/mixins";
@use "../utils/variables";
.ds4-item-list {
.ds4-embedded-document-list {
@include mixins.mark-invalid-or-disabled-input;
$row-height: 1.75em;
@ -23,24 +23,51 @@
&--weapon {
grid-template-columns: $row-height $row-height 3ch 3fr $row-height 1fr 3ch 5fr 5ch;
:nth-child(9n + 1),
:nth-child(9n + 5),
:nth-child(9n + 6),
:nth-child(9n + 7) {
justify-self: center;
}
}
&--armor {
grid-template-columns: $row-height $row-height 3ch 3fr 1fr 1fr 3ch 5fr 5ch;
:nth-child(9n + 1),
:nth-child(9n + 7) {
justify-self: center;
}
}
&--shield {
grid-template-columns: $row-height $row-height 3ch 1fr 3ch 3fr 5ch;
:nth-child(7n + 1),
:nth-child(7n + 5) {
justify-self: center;
}
}
&--equipment {
grid-template-columns: $row-height $row-height 3ch 1fr 10ch 3fr 5ch;
:nth-child(7n + 1) {
justify-self: center;
}
}
&--loot {
grid-template-columns: $row-height 3ch 1fr 10ch 3fr 5ch;
}
&--spell {
grid-template-columns: $row-height $row-height 2fr $row-height 1fr 1fr 1fr 1fr 5ch;
:nth-child(9n + 1),
:nth-child(9n + 4),
:nth-child(9n + 6),
:nth-child(9n + 7),
:nth-child(9n + 8) {
justify-self: center;
}
}
&--talent {
grid-template-columns: $row-height 1fr 21ch 3fr 5ch;
:nth-child(9n + 3) {
justify-self: center;
}
}
&--racial-ability,
&--language,
@ -49,6 +76,13 @@
grid-template-columns: $row-height 1fr 3fr 5ch;
}
&--effect {
grid-template-columns: $row-height $row-height 3fr 2fr 5ch;
:nth-child(5n + 1) {
justify-self: center;
}
}
&__row {
display: contents; // TODO: Once chromium supports `grid-template-columns: subgrid` (https://bugs.chromium.org/p/chromium/issues/detail?id=618969), switch to `display: grid; grid: 1/-1; grid-template-columns: subgrid`
@ -96,17 +130,9 @@
text-overflow: ellipsis;
}
}
&__control-buttons {
display: grid;
grid-template-columns: 1fr 1fr;
text-align: center;
width: 100%;
padding: 0 calc(1em / 3);
}
}
.ds4-item-list-title {
.ds4-embedded-document-list-title {
border-bottom: variables.$border-groove;
font-weight: bold;
margin-bottom: 0;

View file

@ -29,12 +29,13 @@
@include meta.load-css("components/checks");
@include meta.load-css("components/combat_value");
@include meta.load-css("components/combat_values");
@include meta.load-css("components/control_button_group");
@include meta.load-css("components/core_value");
@include meta.load-css("components/core_values");
@include meta.load-css("components/currency");
@include meta.load-css("components/description");
@include meta.load-css("components/embedded_document_list");
@include meta.load-css("components/forms");
@include meta.load-css("components/item_list");
@include meta.load-css("components/profile");
@include meta.load-css("components/rollable_image");
@include meta.load-css("components/sheet_tab_nav");

View file

@ -1,11 +1,10 @@
{
"name": "ds4",
"title": "Dungeonslayers 4",
"description": "The Dungeonslayers 4 system for FoundryVTT. Dungeonslayers by Christian Kennig is licensed under CC BY-NC-SA 3.0 (https://creativecommons.org/licenses/by-nc-sa/3.0/). The icons by the authors of Game-icons.net are licensed under CC BY 3.0 (https://creativecommons.org/licenses/by/3.0/). The creature images by Devin Night (https://immortalnights.com/) and are licensed under the terms described at https://immortalnights.com/tokens/token-usage-rights/.",
"version": "1.1.3",
"description": "The Dungeonslayers 4 system for FoundryVTT. Dungeonslayers by Christian Kennig is licensed under CC BY-NC-SA 3.0 (https://creativecommons.org/licenses/by-nc-sa/3.0/). The icons by the authors of Game-icons.net are licensed under CC BY 3.0 (https://creativecommons.org/licenses/by/3.0/). The token images by Devin Night (https://immortalnights.com/) and are licensed under the terms described at https://immortalnights.com/tokens/token-usage-rights/.",
"version": "1.2.1",
"minimumCoreVersion": "0.8.8",
"compatibleCoreVersion": "0.8.8",
"templateVersion": 6,
"author": "Johannes Loher, Gesina Schwalbe, Oliver Rümpelein, Siegfried Krug, Max Tharr, Sascha Martens",
"authors": [
{
@ -93,7 +92,7 @@
"primaryTokenAttribute": "combatValues.hitPoints",
"url": "https://git.f3l.de/dungeonslayers/ds4",
"manifest": "https://git.f3l.de/dungeonslayers/ds4/-/raw/latest/src/system.json?inline=false",
"download": "https://git.f3l.de/dungeonslayers/ds4/-/jobs/artifacts/1.1.3/download?job=build",
"download": "https://git.f3l.de/dungeonslayers/ds4/-/jobs/artifacts/1.2.1/download?job=build",
"license": "https://git.f3l.de/dungeonslayers/ds4#licensing",
"initiative": "@combatValues.initiative.total",
"manifestPlusVersion": "1.0.0",

View file

@ -18,6 +18,7 @@ SPDX-License-Identifier: MIT
<a class="ds4-sheet-tab-nav__item item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="abilities">{{localize 'DS4.HeadingAbilities'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="effects">{{localize 'DS4.HeadingEffects'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="biography">{{localize 'DS4.HeadingBiography'}}</a>
</nav>
@ -35,7 +36,10 @@ SPDX-License-Identifier: MIT
{{> systems/ds4/templates/sheets/actor/tabs/spells.hbs}}
{{!-- Abilities Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/abilities.hbs}}
{{> systems/ds4/templates/sheets/actor/tabs/character-abilities.hbs}}
{{!-- Effects Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/effects.hbs}}
{{!-- Biography Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/biography.hbs}}

View file

@ -0,0 +1,20 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!
!-- Render an "add" button.
!-- @param documentType: The type of document this button controls, item or effect
!-- @param title: The title to use for the link element (will be localized)
!-- @param type: An optional property to use as data-type attribute
}}
<div>
<a class="control-{{documentType}}" title="{{localize title}}" data-action="create" {{#if type}}data-type="{{type}}"
{{/if}}>
<i class="fas fa-plus"></i>
{{localize "DS4.UserInteractionAdd"}}
</a>
</div>

View file

@ -0,0 +1,20 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render a group of an "edit" and a "delete" button.
!-- The current item is defined by the a corresponding id attribute of the parent li element.
!-- @param documentType: The type of document that is controlled by this button group, item or effect
!-- @param editTitle: The title to use for the edit link element (will be localized)
!-- @param deleteTitle: The title to use for the delete link element (will be localized)
--}}
<div class="ds4-control-button-group">
<a class="ds4-control-button-group__button control-{{documentType}}" data-action="edit"
title="{{localize editTitle}}"><i class="fas fa-edit"></i></a>
<a class="ds4-control-button-group__button control-{{documentType}}" data-action="delete"
title="{{localize deleteTitle}}"><i class="fas fa-trash"></i></a>
</div>

View file

@ -10,7 +10,7 @@ SPDX-License-Identifier: MIT
<div class="ds4-currency">
{{#each data.data.currency as |value key|}}
<label for="data.currency.{{key}}" class="flex05">{{lookup ../config.i18n.characterCurrency key}}</label>
<input class="ds4-currency__value ds4-currency__value--{{key}} item-change" type="number" min="0" step="1"
<input class="ds4-currency__value ds4-currency__value--{{key}} change-item" type="number" min="0" step="1"
name="data.currency.{{key}}" id="data.currency.{{key}}" value="{{value}}" data-dtype="Number" />
{{/each}}
</div>

View file

@ -0,0 +1,31 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render an effect list entry row.
!-- @param effectData: The data of the item.
--}}
<li class="ds4-embedded-document-list__row effect" data-effect-id="{{effectData._id}}">
{{!-- enabled --}}
<input class="ds4-embedded-document-list__editable ds4-embedded-document-list__editable--checkbox change-effect" type="checkbox" {{checked
(ne effectData.disabled true)}} data-dtype="Boolean" data-property="disabled" data-inverted="true"
title="{{localize 'DS4.EffectEnabled'}}">
{{!-- icon --}}
{{> systems/ds4/templates/sheets/actor/components/rollable-image.hbs rollable=false src=effectData.icon
alt=(localize "DS4.EffectIconAltText" label=effectData.label) title=effectData.label}}
{{!-- label --}}
<div title="{{effectData.label}}">{{effectData.label}}</div>
{{!-- source name --}}
<div>{{effectData.sourceName}}</div>
{{!-- control button group --}}
{{> systems/ds4/templates/sheets/actor/components/control-button-group.hbs documentType="effect"
editTitle="DS4.UserInteractionEditEffectTitle" deleteTitle="DS4.UserInteractionDeleteEffectTitle"}}
</li>

View file

@ -0,0 +1,26 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render an effect list header row.
--}}
<li class="ds4-embedded-document-list__row ds4-embedded-document-list__row--header">
{{!-- enabled --}}
<div title="{{localize 'DS4.EffectEnabled'}}">{{localize 'DS4.EffectEnabledAbbr'}}</div>
{{!-- icon --}}
<div></div>
{{!-- label --}}
<div>{{localize 'DS4.EffectLabel'}}</div>
{{!-- source name --}}
<div>{{localize 'DS4.EffectSourceName'}}</div>
{{!-- control buttons placeholder --}}
<div></div>
</li>

View file

@ -15,10 +15,10 @@ SPDX-License-Identifier: MIT
!-- @param hideDescription: A flag to disable the description column.
!-- @param @partial-block: Custom column headers can be passed using the partial block.
--}}
<li class="ds4-item-list__row item" data-item-id="{{itemData._id}}">
<li class="ds4-embedded-document-list__row item" data-item-id="{{itemData._id}}">
{{!-- equipped --}}
{{#if isEquipable}}
<input class="ds4-item-list__editable ds4-item-list__editable--checkbox item-change" type="checkbox" {{checked
<input class="ds4-embedded-document-list__editable ds4-embedded-document-list__editable--checkbox change-item" type="checkbox" {{checked
itemData.data.equipped}} data-dtype="Boolean" data-property="data.equipped"
title="{{localize 'DS4.ItemEquipped'}}">
{{/if}}
@ -30,12 +30,12 @@ SPDX-License-Identifier: MIT
{{!-- amount --}}
{{#if hasQuantity}}
<input class="ds4-item-list__editable item-change" type="number" min="0" step="1" value="{{itemData.data.quantity}}"
<input class="ds4-embedded-document-list__editable change-item" type="number" min="0" step="1" value="{{itemData.data.quantity}}"
data-dtype="Number" data-property="data.quantity" title="{{localize 'DS4.Quantity'}}" />
{{/if}}
{{!-- name --}}
<input class="ds4-item-list__editable item-change" type="text" value="{{itemData.name}}" data-dtype="String"
<input class="ds4-embedded-document-list__editable change-item" type="text" value="{{itemData.name}}" data-dtype="String"
data-property="name" title="{{htmlToPlainText itemData.data.description}}" />
{{!-- item type specifics --}}
@ -45,11 +45,11 @@ SPDX-License-Identifier: MIT
{{!-- description --}}
{{#unless hideDescription}}
<div class="ds4-item-list__description" title="{{htmlToPlainText itemData.data.description}}">
<div class="ds4-embedded-document-list__description" title="{{htmlToPlainText itemData.data.description}}">
{{{itemData.data.description}}}</div>
{{/unless}}
{{!-- control buttons --}}
{{> systems/ds4/templates/sheets/actor/components/overview-control-buttons.hbs
class="ds4-item-list__control-buttons" }}
{{!-- control button group --}}
{{> systems/ds4/templates/sheets/actor/components/control-button-group.hbs documentType="item"
editTitle="DS4.UserInteractionEditItemTitle" deleteTitle="DS4.UserInteractionDeleteItemTitle"}}
</li>

View file

@ -14,7 +14,7 @@ SPDX-License-Identifier: MIT
!-- @param hideDescription: A flag to disable the description column.
!-- @param @partial-block: Custom column headers can be passed using the partial block.
--}}
<li class="ds4-item-list__row ds4-item-list__row--header">
<li class="ds4-embedded-document-list__row ds4-embedded-document-list__row--header">
{{!-- equipped --}}
{{#if isEquipable}}
<div title="{{localize 'DS4.ItemEquipped'}}">{{localize 'DS4.ItemEquippedAbbr'}}</div>

View file

@ -7,12 +7,12 @@ SPDX-License-Identifier: MIT
--}}
{{!-- WEAPONS --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeWeaponPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeWeaponPlural'}}</h4>
{{#unless (isEmpty itemsByType.weapon)}}
<ol class="ds4-item-list ds4-item-list--weapon item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--weapon item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- attack type --}}
<div class="ds4-item-list__image" title="{{localize 'DS4.AttackType'}}">{{localize 'DS4.AttackTypeAbbr'}}</div>
<div class="ds4-embedded-document-list__image" title="{{localize 'DS4.AttackType'}}">{{localize 'DS4.AttackTypeAbbr'}}</div>
{{!-- weapon bonus --}}
<div title="{{localize 'DS4.WeaponBonus'}}">
@ -29,7 +29,7 @@ SPDX-License-Identifier: MIT
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true
hasQuantity=true}}
{{!-- attack type --}}
<img class="ds4-item-list__image" src="{{lookup ../../config.icons.attackTypes itemData.data.attackType}}"
<img class="ds4-embedded-document-list__image" src="{{lookup ../../config.icons.attackTypes itemData.data.attackType}}"
title="{{lookup ../../config.i18n.attackTypes itemData.data.attackType}}" />
{{!-- weapon bonus --}}
@ -41,12 +41,13 @@ SPDX-License-Identifier: MIT
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='weapon'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='weapon'}}
{{!-- ARMOR --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeArmorPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeArmorPlural'}}</h4>
{{#unless (isEmpty itemsByType.armor)}}
<ol class="ds4-item-list ds4-item-list--armor item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--armor item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- armor material type --}}
<div title="{{localize 'DS4.ArmorMaterialType'}}">{{localize 'DS4.ArmorMaterialTypeAbbr'}}</div>
@ -79,12 +80,13 @@ SPDX-License-Identifier: MIT
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='armor'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='armor'}}
{{!-- SHIELD --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeShieldPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeShieldPlural'}}</h4>
{{#unless (isEmpty itemsByType.shield)}}
<ol class="ds4-item-list ds4-item-list--shield item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--shield item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- armor value --}}
<div title="{{localize 'DS4.ArmorValue'}}">
@ -100,12 +102,13 @@ SPDX-License-Identifier: MIT
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='shield'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='shield'}}
{{!-- EQUIPMENT --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeEquipmentPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeEquipmentPlural'}}</h4>
{{#unless (isEmpty itemsByType.equipment)}}
<ol class="ds4-item-list ds4-item-list--equipment item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--equipment item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- storage location --}}
<div>{{localize 'DS4.StorageLocation'}}</div>
@ -114,18 +117,19 @@ SPDX-License-Identifier: MIT
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true
hasQuantity=true}}
{{!-- storage location --}}
<input class="ds4-item-list__editable item-change" type="text" value="{{itemData.data.storageLocation}}"
<input class="ds4-embedded-document-list__editable change-item" type="text" value="{{itemData.data.storageLocation}}"
data-dtype="String" data-property="data.storageLocation" title="{{localize 'DS4.StorageLocation'}}">
{{/systems/ds4/templates/sheets/actor/components/item-list-entry.hbs}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='equipment'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='equipment'}}
{{!-- LOOT --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeLootPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeLootPlural'}}</h4>
{{#unless (isEmpty itemsByType.loot)}}
<ol class="ds4-item-list ds4-item-list--loot item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--loot item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs hasQuantity=true}}
{{!-- storage location --}}
<div>{{localize 'DS4.StorageLocation'}}</div>
@ -133,10 +137,11 @@ SPDX-License-Identifier: MIT
{{#each itemsByType.loot as |itemData id|}}
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData hasQuantity=true}}
{{!-- storage location --}}
<input class="ds4-item-list__editable item-change" type="text" value="{{itemData.data.storageLocation}}"
<input class="ds4-embedded-document-list__editable change-item" type="text" value="{{itemData.data.storageLocation}}"
data-dtype="String" data-property="data.storageLocation" title="{{localize 'DS4.StorageLocation'}}">
{{/systems/ds4/templates/sheets/actor/components/item-list-entry.hbs}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='loot'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='loot'}}

View file

@ -1,17 +0,0 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!
!-- Render an "add" button for adding an item of given data type.
!-- @param dataType: hand over the dataType to the partial as hash parameter
}}
<div class="item-controls">
<a class="item-control item-create" title="Create item" data-type="{{dataType}}">
<i class="fas fa-plus"></i>
{{localize "DS4.UserInteractionAddItem"}}
</a>
</div>

View file

@ -1,17 +0,0 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render a group of an "edit" and a "delete" button for the current item.
!-- The current item is defined by the data-item-id HTML property of the parent li element.
!-- @param class: Additional CSS class(es) for the controls
--}}
<div class="item-controls {{class}}">
<a class="item-control item-edit" title="{{localize 'DS4.UserInteractionEditItem'}}"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="{{localize 'DS4.UserInteractionDeleteItem'}}"><i
class="fas fa-trash"></i></a>
</div>

View file

@ -18,7 +18,7 @@ disable the input element
!-- @param localizeString: The string to use as key for the localized tooltip
--}}
{{#*inline "talentRankValue"}}
<input class="ds4-talent-rank-equation__value item-change" data-dtype="Number" type="number" min="0" step="1" {{#if (eq
<input class="ds4-talent-rank-equation__value change-item" data-dtype="Number" type="number" min="0" step="1" {{#if (eq
property 'base' ) }}max="{{talentRank.max}}" {{/if}} {{disabled}} data-property="data.rank.{{property}}"
value="{{lookup talentRank property}}" title="{{localize localizeString}}" />
{{/inline}}

View file

@ -17,9 +17,9 @@ SPDX-License-Identifier: MIT
<nav class="ds4-sheet-tab-nav sheet-tabs tabs" data-group="primary">
<a class="ds4-sheet-tab-nav__item item" data-tab="values">{{localize 'DS4.HeadingValues'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="special-creature-abilities">{{localize
'DS4.HeadingSpecialCreatureAbilities'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="abilities">{{localize 'DS4.HeadingAbilities'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="effects">{{localize 'DS4.HeadingEffects'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="description">{{localize 'DS4.HeadingDescription'}}</a>
</nav>
@ -31,12 +31,15 @@ SPDX-License-Identifier: MIT
{{!-- Inventory Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/creature-inventory.hbs}}
{{!-- Special Creature Abilities Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/special-creature-abilities.hbs}}
{{!-- Spells Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/spells.hbs}}
{{!-- Abilities Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/creature-abilities.hbs}}
{{!-- Effects Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/effects.hbs}}
{{!-- Description Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/description.hbs}}
</section>

View file

@ -7,9 +7,9 @@ SPDX-License-Identifier: MIT
<div class="tab abilities" data-group="primary" data-tab="abilities">
{{!-- TALENT --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeTalentPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeTalentPlural'}}</h4>
{{#unless (isEmpty itemsByType.talent)}}
<ol class="ds4-item-list ds4-item-list--talent item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--talent item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{!-- rank --}}
<div>{{localize 'DS4.TalentRank'}}</div>
@ -22,41 +22,45 @@ SPDX-License-Identifier: MIT
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='talent'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='talent'}}
{{!-- RACIAL ABILITY --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeRacialAbilityPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeRacialAbilityPlural'}}</h4>
{{#unless (isEmpty itemsByType.racialAbility)}}
<ol class="ds4-item-list ds4-item-list--racial-ability item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--racial-ability item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.racialAbility as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='racialAbility'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='racialAbility'}}
{{!-- LANGUAGE --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeLanguagePlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeLanguagePlural'}}</h4>
{{#unless (isEmpty itemsByType.language)}}
<ol class="ds4-item-list ds4-item-list--language item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--language item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.language as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='language'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='language'}}
{{!-- ALPHABET --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeAlphabetPlural'}}</h4>
<h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeAlphabetPlural'}}</h4>
{{#unless (isEmpty itemsByType.alphabet)}}
<ol class="ds4-item-list ds4-item-list--alphabet item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--alphabet item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.alphabet as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='alphabet'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='alphabet'}}
</div>

View file

@ -5,14 +5,15 @@ SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
<div class="tab special-creature-abilities" data-group="primary" data-tab="special-creature-abilities">
<div class="tab abilities" data-group="primary" data-tab="abilities">
{{#unless (isEmpty itemsByType.specialCreatureAbility)}}
<ol class="ds4-item-list ds4-item-list--special-creature-ability item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--special-creature-ability item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.specialCreatureAbility as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='specialCreatureAbility'}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='specialCreatureAbility'}}
</div>

View file

@ -0,0 +1,19 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
<div class="tab effects" data-group="primary" data-tab="effects">
{{#unless (isEmpty data.effects)}}
<ol class="ds4-embedded-document-list ds4-embedded-document-list--effect">
{{> systems/ds4/templates/sheets/actor/components/effect-list-header.hbs}}
{{#each enrichedEffects as |effectData id| }}
{{> systems/ds4/templates/sheets/actor/components/effect-list-entry.hbs effectData=effectData}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddEffectTitle'
documentType='effect'}}
</div>

View file

@ -51,7 +51,7 @@ titleKey=titleKey}}
<div class="tab spells" data-group="primary" data-tab="spells">
{{#unless (isEmpty itemsByType.spell)}}
<ol class="ds4-item-list ds4-item-list--spell item-list">
<ol class="ds4-embedded-document-list ds4-embedded-document-list--spell item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hideDescription=true}}
{{!-- spell type --}}
<div title="{{localize 'DS4.SpellType'}}">{{localize 'DS4.SpellTypeAbbr'}}</div>
@ -72,11 +72,11 @@ titleKey=titleKey}}
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true
hideDescription=true}}
{{!-- spell type --}}
<img class="ds4-item-list__image" src="{{lookup ../../config.icons.spellTypes itemData.data.spellType}}"
<img class="ds4-embedded-document-list__image" src="{{lookup ../../config.icons.spellTypes itemData.data.spellType}}"
title="{{lookup ../../config.i18n.spellTypes itemData.data.spellType}}" />
{{!-- spell bonus --}}
<input class="ds4-item-list__editable item-change" type="text" data-dtype="String" data-property="data.bonus"
<input class="ds4-embedded-document-list__editable change-item" type="text" data-dtype="String" data-property="data.bonus"
value="{{itemData.data.bonus}}" title="{{localize 'DS4.SpellBonus'}}" />
{{!-- max. distance --}}
@ -93,5 +93,6 @@ titleKey=titleKey}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='spell' }}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='spell'}}
</div>

View file

@ -12,17 +12,18 @@ SPDX-License-Identifier: MIT
<div class="effect-image"></div>
<div class="effect-name">Name</div>
<div class="effect-controls">
<a class="effect-control" data-action="create" title="{{localize 'DS4.UserInteractionAddEffect'}}">
<i class="fas fa-plus"></i> {{localize 'DS4.UserInteractionAddEffect'}}</a>
<a class="effect-control" data-action="create" title="{{localize 'DS4.UserInteractionAddEffectTitle'}}">
<i class="fas fa-plus"></i> {{localize 'DS4.UserInteractionAdd'}}</a>
</div>
</li>
{{#each item.effects as |effect id|}}
<li class="effect flexrow" data-effect-id="{{effect.id}}">
<h4 class="effect-name">{{effect.data.label}}</h4>
<div class="effect-controls">
<a class="effect-control" data-action="edit" title="{{localize 'DS4.UserInteractionEditEffect'}}">
<a class="effect-control" data-action="edit" title="{{localize 'DS4.UserInteractionEditEffectTitle'}}">
<i class="fas fa-edit"></i></a>
<a class="effect-control" data-action="delete" title="{{localize 'DS4.UserInteractionDeleteEffect'}}">
<a class="effect-control" data-action="delete"
title="{{localize 'DS4.UserInteractionDeleteEffectTitle'}}">
<i class="fas fa-trash"></i></a>
</div>
</li>

476
yarn.lock
View file

@ -420,9 +420,9 @@ __metadata:
languageName: node
linkType: hard
"@eslint/eslintrc@npm:^0.4.2":
version: 0.4.2
resolution: "@eslint/eslintrc@npm:0.4.2"
"@eslint/eslintrc@npm:^0.4.3":
version: 0.4.3
resolution: "@eslint/eslintrc@npm:0.4.3"
dependencies:
ajv: ^6.12.4
debug: ^4.1.1
@ -433,7 +433,7 @@ __metadata:
js-yaml: ^3.13.1
minimatch: ^3.0.4
strip-json-comments: ^3.1.1
checksum: 60b66ce4257bf5c36a920dea83a056102fef746e7afd7100a6fe245a126ff455f67f4948e75d28ed73090bff8f8556b6a996e74a124911ca703440bc245dbc23
checksum: fa916db689fac96c749571f03f931448d896ce07c3da40079082f28621f52defa36cc0c88bfcdd8d19b9981a6549c3a9a3977953db2f6945aba1135bb83a3d35
languageName: node
linkType: hard
@ -663,19 +663,6 @@ __metadata:
languageName: node
linkType: hard
"@jest/types@npm:^26.6.2":
version: 26.6.2
resolution: "@jest/types@npm:26.6.2"
dependencies:
"@types/istanbul-lib-coverage": ^2.0.0
"@types/istanbul-reports": ^3.0.0
"@types/node": "*"
"@types/yargs": ^15.0.0
chalk: ^4.0.0
checksum: 5c511d7807f414b298299ae4a053abf265f39984942e0eefdfb17a7986a36f1047e0fd9a6f785bdddbf7343a5737595dfabe148719a80e118dd77486502009cc
languageName: node
linkType: hard
"@jest/types@npm:^27.0.6":
version: 27.0.6
resolution: "@jest/types@npm:27.0.6"
@ -689,19 +676,19 @@ __metadata:
languageName: node
linkType: hard
"@league-of-foundry-developers/foundry-vtt-types@npm:^0.8.8-5":
version: 0.8.8-5
resolution: "@league-of-foundry-developers/foundry-vtt-types@npm:0.8.8-5"
"@league-of-foundry-developers/foundry-vtt-types@npm:0.8.8-8":
version: 0.8.8-8
resolution: "@league-of-foundry-developers/foundry-vtt-types@npm:0.8.8-8"
dependencies:
"@types/jquery": ~3.5.5
"@types/simple-peer": ~9.11.0
"@types/jquery": ~3.5.6
"@types/simple-peer": ~9.11.1
handlebars: 4.7.7
pixi-particles: 4.3.1
pixi.js: 5.3.4
socket.io-client: 4.1.2
tinymce: 5.8.1
typescript: ^4.1.6
checksum: e5f06d5bd68403cf79ed367bcfcc2eade250dc00800e1ede33357515ba9cd437336e0c1388c316501087ac5bce8b36731782e2509683d9186e1387283ed83e35
typescript: ^4.3.5
checksum: e327a47b2f0a18ab05bbc8703c596aed4d35f3b12aff3252b5facbcc6b993a88034f233fcf446d0925176c7e8d5b15546ec97e0df10d1e9689e11b4e19ab1e3a
languageName: node
linkType: hard
@ -1122,35 +1109,6 @@ __metadata:
languageName: node
linkType: hard
"@rollup/plugin-node-resolve@npm:^13.0.0":
version: 13.0.0
resolution: "@rollup/plugin-node-resolve@npm:13.0.0"
dependencies:
"@rollup/pluginutils": ^3.1.0
"@types/resolve": 1.17.1
builtin-modules: ^3.1.0
deepmerge: ^4.2.2
is-module: ^1.0.0
resolve: ^1.19.0
peerDependencies:
rollup: ^2.42.0
checksum: 4b323e8ad5f1245449cd44b4857ed94a8dd3b998178ce139e74542c216a5abeb5a9e44885f3809ac747296a108f0562f986f9561055e76d1b0b268cf788a5c83
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^3.1.0":
version: 3.1.0
resolution: "@rollup/pluginutils@npm:3.1.0"
dependencies:
"@types/estree": 0.0.39
estree-walker: ^1.0.1
picomatch: ^2.2.2
peerDependencies:
rollup: ^1.20.0||^2.0.0
checksum: 45da6411e045d1b034242a8144f4a5e8c02ff1b68a2e0857807f5bb4b091c416f2015e075057f0f0dec200e7b35efe6ed4e301b43e365cedea09192f01a6839b
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^4.1.0":
version: 4.1.0
resolution: "@rollup/pluginutils@npm:4.1.0"
@ -1236,14 +1194,7 @@ __metadata:
languageName: node
linkType: hard
"@types/estree@npm:0.0.39":
version: 0.0.39
resolution: "@types/estree@npm:0.0.39"
checksum: 43e5361de39969def145f32f4599391ab13055ec94841f1633a7cfe10f0e8a940ebf0e9a4b2770454a6bddd034b57e7e0d51a4d565cb2714ee2accf10a7718be
languageName: node
linkType: hard
"@types/fs-extra@npm:^9.0.12":
"@types/fs-extra@npm:9.0.12":
version: 9.0.12
resolution: "@types/fs-extra@npm:9.0.12"
dependencies:
@ -1286,17 +1237,17 @@ __metadata:
languageName: node
linkType: hard
"@types/jest@npm:^26.0.24":
version: 26.0.24
resolution: "@types/jest@npm:26.0.24"
"@types/jest@npm:27.0.1":
version: 27.0.1
resolution: "@types/jest@npm:27.0.1"
dependencies:
jest-diff: ^26.0.0
pretty-format: ^26.0.0
checksum: e5d3651c1edf197011d19ee8f4bacd52667fa673d1b2ffbfbce624208d643fd4372ebb31fa8a1d89843a7705f142e38076e25e1e7b67f3aacafd6ae8bc77cbcf
jest-diff: ^27.0.0
pretty-format: ^27.0.0
checksum: 5f2382b5800e736a1fb805b5ce35dc9276b978ab24225f3d3da0c5f74789a528cd8e2b085e3a157a12b1395038f137f7e1babd18c4b55c54c25f5db1d4ea3153
languageName: node
linkType: hard
"@types/jquery@npm:~3.5.5":
"@types/jquery@npm:~3.5.6":
version: 3.5.6
resolution: "@types/jquery@npm:3.5.6"
dependencies:
@ -1333,16 +1284,7 @@ __metadata:
languageName: node
linkType: hard
"@types/resolve@npm:1.17.1":
version: 1.17.1
resolution: "@types/resolve@npm:1.17.1"
dependencies:
"@types/node": "*"
checksum: 8e72a73574f9489760662498c1ad512a8d4084a5db15f327e0d785cb277bb0a3146cd049241a8e3268bd0ed204ad3ee7b4a6b4622ef681e70547be9af258ca6a
languageName: node
linkType: hard
"@types/simple-peer@npm:~9.11.0":
"@types/simple-peer@npm:~9.11.1":
version: 9.11.1
resolution: "@types/simple-peer@npm:9.11.1"
dependencies:
@ -1372,15 +1314,6 @@ __metadata:
languageName: node
linkType: hard
"@types/yargs@npm:^15.0.0":
version: 15.0.13
resolution: "@types/yargs@npm:15.0.13"
dependencies:
"@types/yargs-parser": "*"
checksum: fa1a5b0a07dbbff1657a27d1191d586632412d170321000f6f417f279547a8c191d7058dbf4d4187c188a5a1aeb2473ddb25fe316b206fccdfe1de6fad976619
languageName: node
linkType: hard
"@types/yargs@npm:^16.0.0":
version: 16.0.3
resolution: "@types/yargs@npm:16.0.3"
@ -1390,12 +1323,12 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/eslint-plugin@npm:^4.28.2":
version: 4.28.2
resolution: "@typescript-eslint/eslint-plugin@npm:4.28.2"
"@typescript-eslint/eslint-plugin@npm:4.29.2":
version: 4.29.2
resolution: "@typescript-eslint/eslint-plugin@npm:4.29.2"
dependencies:
"@typescript-eslint/experimental-utils": 4.28.2
"@typescript-eslint/scope-manager": 4.28.2
"@typescript-eslint/experimental-utils": 4.29.2
"@typescript-eslint/scope-manager": 4.29.2
debug: ^4.3.1
functional-red-black-tree: ^1.0.1
regexpp: ^3.1.0
@ -1407,23 +1340,23 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
checksum: 6af8ea7665d5eaf0bafe241d71e3a85df07c0c82e59f530bd6627e0371e66a2d4a517cacd00d030680fe13d423b065c53185d3f48daa174fea316f024b1ab545
checksum: 5ea5fc49a7569cb4a636ae71c5521908e74d3e504a6898977a67bba0a50756ebff63446f81424a8c427629095b6fa1bd014fdf8bd541a459bf5e6461890bfb2c
languageName: node
linkType: hard
"@typescript-eslint/experimental-utils@npm:4.28.2":
version: 4.28.2
resolution: "@typescript-eslint/experimental-utils@npm:4.28.2"
"@typescript-eslint/experimental-utils@npm:4.29.2":
version: 4.29.2
resolution: "@typescript-eslint/experimental-utils@npm:4.29.2"
dependencies:
"@types/json-schema": ^7.0.7
"@typescript-eslint/scope-manager": 4.28.2
"@typescript-eslint/types": 4.28.2
"@typescript-eslint/typescript-estree": 4.28.2
"@typescript-eslint/scope-manager": 4.29.2
"@typescript-eslint/types": 4.29.2
"@typescript-eslint/typescript-estree": 4.29.2
eslint-scope: ^5.1.1
eslint-utils: ^3.0.0
peerDependencies:
eslint: "*"
checksum: 5b3fed818af9882ae54bf258351c2740a92aa0bb5a85478ce1d4d957e594882ece42048149b1a1a8500023c1d334d9846048bc96f309ed60715232be8ef5d1a8
checksum: c92c7ae0c8395f06f77367b73c2a65de4f703d1fea54372ba7792eba0356e2e1f4d2102ca1a03f27ecad6e43e414d3b67cc227931a28c341d92a039a6e0ffd7d
languageName: node
linkType: hard
@ -1443,20 +1376,20 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/parser@npm:^4.28.2":
version: 4.28.2
resolution: "@typescript-eslint/parser@npm:4.28.2"
"@typescript-eslint/parser@npm:4.29.2":
version: 4.29.2
resolution: "@typescript-eslint/parser@npm:4.29.2"
dependencies:
"@typescript-eslint/scope-manager": 4.28.2
"@typescript-eslint/types": 4.28.2
"@typescript-eslint/typescript-estree": 4.28.2
"@typescript-eslint/scope-manager": 4.29.2
"@typescript-eslint/types": 4.29.2
"@typescript-eslint/typescript-estree": 4.29.2
debug: ^4.3.1
peerDependencies:
eslint: ^5.0.0 || ^6.0.0 || ^7.0.0
peerDependenciesMeta:
typescript:
optional: true
checksum: 4d71ddbe039007f366b6e9deca12183e45ea165053a29b64e8e4534451a134fe664fd3bf8ec06951e2afe8b5fd14143fb2ef3182a9ee8d2b20a89a3c0f4f2529
checksum: a836810bf6611cc1d66aa8d99fefd865e56f75d1bd49387f36d90c339f43c236894d7f7b7cdb343d389f95d592a1db3f4f0b096f8be9641d4164f1ccb0046212
languageName: node
linkType: hard
@ -1470,13 +1403,13 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/scope-manager@npm:4.28.2":
version: 4.28.2
resolution: "@typescript-eslint/scope-manager@npm:4.28.2"
"@typescript-eslint/scope-manager@npm:4.29.2":
version: 4.29.2
resolution: "@typescript-eslint/scope-manager@npm:4.29.2"
dependencies:
"@typescript-eslint/types": 4.28.2
"@typescript-eslint/visitor-keys": 4.28.2
checksum: 31c30f428ba50087fc6a8dacc00b4d007d6653f1ea261a468e0a5425d730c5bf1e87bea581494862687c294d1f2ace30813f919800a05190fa332db6cd192bef
"@typescript-eslint/types": 4.29.2
"@typescript-eslint/visitor-keys": 4.29.2
checksum: 136c22579df2a3ad550f0e8b92d0b18b61facda27364715d1db9721c12aa079191f7917396eeb89fe72f98c17a4d2ec6494fee4dc95bffbc91d6f93df06f1efe
languageName: node
linkType: hard
@ -1487,10 +1420,10 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/types@npm:4.28.2":
version: 4.28.2
resolution: "@typescript-eslint/types@npm:4.28.2"
checksum: 9f5e6bf3df4540adf8eb1f83909bac778257f60a6ef7fcafa7df5224949839a63dba61fe4b58de538ffe17517e88ff6b29f691209f80a55df87935bac6349f69
"@typescript-eslint/types@npm:4.29.2":
version: 4.29.2
resolution: "@typescript-eslint/types@npm:4.29.2"
checksum: 31e4438afcb2aed8c24d9aeb8d65f46ea2bea6b35f796b77de399977b39516a515f8307f8596fff3568b9852664d72d03fd58f55cc346c66d5841c10f230fa5a
languageName: node
linkType: hard
@ -1512,12 +1445,12 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/typescript-estree@npm:4.28.2":
version: 4.28.2
resolution: "@typescript-eslint/typescript-estree@npm:4.28.2"
"@typescript-eslint/typescript-estree@npm:4.29.2":
version: 4.29.2
resolution: "@typescript-eslint/typescript-estree@npm:4.29.2"
dependencies:
"@typescript-eslint/types": 4.28.2
"@typescript-eslint/visitor-keys": 4.28.2
"@typescript-eslint/types": 4.29.2
"@typescript-eslint/visitor-keys": 4.29.2
debug: ^4.3.1
globby: ^11.0.3
is-glob: ^4.0.1
@ -1526,7 +1459,7 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
checksum: 4fe36863b8af9808ee86b3cf64d6076a8b9a3224f9e1c17650d06ea46d80225b7e94903f71e7330a682b84eb1045189f1f09dc896165e9cab36714d24992ee84
checksum: 74cc09a05ee5b26948ec0f8054397b8f6f43b57169e04ae404a6573a48f58ca321cabb4332f9779a294890b623802b4fa8d9c637771652ef1f9c57aa95157508
languageName: node
linkType: hard
@ -1540,13 +1473,13 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/visitor-keys@npm:4.28.2":
version: 4.28.2
resolution: "@typescript-eslint/visitor-keys@npm:4.28.2"
"@typescript-eslint/visitor-keys@npm:4.29.2":
version: 4.29.2
resolution: "@typescript-eslint/visitor-keys@npm:4.29.2"
dependencies:
"@typescript-eslint/types": 4.28.2
"@typescript-eslint/types": 4.29.2
eslint-visitor-keys: ^2.0.0
checksum: cec563831f563bb057f00045104db7ed92576755065d7563607c5f3581e5588fe8b83229767cd81763136aeb663dd49b99e7ee24decfbfc5fc7bd7b36bb1a525
checksum: 30e1eef4f29e52193441240c2dfcc583d19691657bda4c93494cac7c728db47182b76d742239ad36323b5d5289073aaf88defd0e309c01405abd422ef272c53b
languageName: node
linkType: hard
@ -2210,20 +2143,13 @@ __metadata:
languageName: node
linkType: hard
"buffer-from@npm:1.x, buffer-from@npm:^1.0.0":
"buffer-from@npm:^1.0.0":
version: 1.1.1
resolution: "buffer-from@npm:1.1.1"
checksum: 540ceb79c4f5bfcadaabbc18324fa84c50dc52905084be7c03596a339cf5a88513bee6831ce9b36ddd046fab09257a7c80686e129d0559a0cfd141da196ad956
languageName: node
linkType: hard
"builtin-modules@npm:^3.1.0":
version: 3.2.0
resolution: "builtin-modules@npm:3.2.0"
checksum: f0e7240f70ae472a0a0167bf76d2e828c73028fe60be8cd229939c38a27527ea68c92f700553dac1316fa124af3037bc7a765ca0e029a03d2e9201dfb372ea24
languageName: node
linkType: hard
"cacache@npm:^15.0.5":
version: 15.2.0
resolution: "cacache@npm:15.2.0"
@ -2311,6 +2237,16 @@ __metadata:
languageName: node
linkType: hard
"chalk@npm:4.1.2":
version: 4.1.2
resolution: "chalk@npm:4.1.2"
dependencies:
ansi-styles: ^4.1.0
supports-color: ^7.1.0
checksum: e3901b97d953991712bf0b941d586175be7ca5da56a97d25187e07453c6b26cae0ac8d9c7aa9e87e7c5c986fff870771b3a8e2705b3becda868829e2e12c2a65
languageName: node
linkType: hard
"chalk@npm:^2.0.0":
version: 2.4.2
resolution: "chalk@npm:2.4.2"
@ -2904,13 +2840,6 @@ __metadata:
languageName: node
linkType: hard
"diff-sequences@npm:^26.6.2":
version: 26.6.2
resolution: "diff-sequences@npm:26.6.2"
checksum: dd1eb6e52f0a200228b836876a69c90690003b8991cf7d9264d6e6063acde8fe852084b6a196f2a13f169d309e30c24c457e9c8db617aed186c665efb50af1d8
languageName: node
linkType: hard
"diff-sequences@npm:^27.0.6":
version: 27.0.6
resolution: "diff-sequences@npm:27.0.6"
@ -2949,33 +2878,32 @@ __metadata:
version: 0.0.0-use.local
resolution: "dungeonslayers4@workspace:."
dependencies:
"@league-of-foundry-developers/foundry-vtt-types": ^0.8.8-5
"@rollup/plugin-node-resolve": ^13.0.0
"@types/fs-extra": ^9.0.12
"@types/jest": ^26.0.24
"@typescript-eslint/eslint-plugin": ^4.28.2
"@typescript-eslint/parser": ^4.28.2
chalk: ^4.1.1
eslint: ^7.30.0
eslint-config-prettier: ^8.3.0
eslint-plugin-jest: ^24.3.6
eslint-plugin-prettier: ^3.4.0
fs-extra: ^10.0.0
gulp: ^4.0.2
gulp-sass: ^5.0.0
husky: ^7.0.1
jest: ^27.0.6
jest-junit: ^12.2.0
lint-staged: ^11.0.0
prettier: ^2.3.2
rollup: ^2.53.1
rollup-plugin-typescript2: ^0.30.0
sass: 1.35.2
semver: ^7.3.5
ts-jest: ^27.0.3
tslib: ^2.3.0
typescript: ^4.3.5
yargs: ^17.0.1
"@league-of-foundry-developers/foundry-vtt-types": 0.8.8-8
"@types/fs-extra": 9.0.12
"@types/jest": 27.0.1
"@typescript-eslint/eslint-plugin": 4.29.2
"@typescript-eslint/parser": 4.29.2
chalk: 4.1.2
eslint: 7.32.0
eslint-config-prettier: 8.3.0
eslint-plugin-jest: 24.4.0
eslint-plugin-prettier: 3.4.0
fs-extra: 10.0.0
gulp: 4.0.2
gulp-sass: 5.0.0
husky: 7.0.1
jest: 27.0.6
jest-junit: 12.2.0
lint-staged: 11.1.2
prettier: 2.3.2
rollup: 2.56.2
rollup-plugin-typescript2: 0.30.0
sass: 1.38.0
semver: 7.3.5
ts-jest: 27.0.5
tslib: 2.3.1
typescript: 4.3.5
yargs: 17.1.1
languageName: unknown
linkType: soft
@ -3203,7 +3131,7 @@ __metadata:
languageName: node
linkType: hard
"eslint-config-prettier@npm:^8.3.0":
"eslint-config-prettier@npm:8.3.0":
version: 8.3.0
resolution: "eslint-config-prettier@npm:8.3.0"
peerDependencies:
@ -3214,9 +3142,9 @@ __metadata:
languageName: node
linkType: hard
"eslint-plugin-jest@npm:^24.3.6":
version: 24.3.6
resolution: "eslint-plugin-jest@npm:24.3.6"
"eslint-plugin-jest@npm:24.4.0":
version: 24.4.0
resolution: "eslint-plugin-jest@npm:24.4.0"
dependencies:
"@typescript-eslint/experimental-utils": ^4.0.1
peerDependencies:
@ -3225,11 +3153,11 @@ __metadata:
peerDependenciesMeta:
"@typescript-eslint/eslint-plugin":
optional: true
checksum: 13f4522cd838a6a356a080f76424579a58aa2f9b4f4b3fdd3713278718496c62ba3d8f53c0fb6ad6fd96ca6cfd6ee728f7dd51893b91eccfb4396b832f757afb
checksum: 189a78413943822ad3b58e13906960815dca790035ed00eab796fe465b6f48855b7e2f40a1d30c5fa34bf205d9baa27fdf47cc58c9f402f7d7c358cd3dea8698
languageName: node
linkType: hard
"eslint-plugin-prettier@npm:^3.4.0":
"eslint-plugin-prettier@npm:3.4.0":
version: 3.4.0
resolution: "eslint-plugin-prettier@npm:3.4.0"
dependencies:
@ -3288,12 +3216,12 @@ __metadata:
languageName: node
linkType: hard
"eslint@npm:^7.30.0":
version: 7.30.0
resolution: "eslint@npm:7.30.0"
"eslint@npm:7.32.0":
version: 7.32.0
resolution: "eslint@npm:7.32.0"
dependencies:
"@babel/code-frame": 7.12.11
"@eslint/eslintrc": ^0.4.2
"@eslint/eslintrc": ^0.4.3
"@humanwhocodes/config-array": ^0.5.0
ajv: ^6.10.0
chalk: ^4.0.0
@ -3334,7 +3262,7 @@ __metadata:
v8-compile-cache: ^2.0.3
bin:
eslint: bin/eslint.js
checksum: 028048847e0252d6c972ac612fe37be55822ae2255d10d1bf68255749f7ae1364b2aa538cd95f3bc4d951fc7d36195e46b62fe8d215297ef9a6a8aeb8ca28a90
checksum: e25f9159d3b6b7e826b190ebb38accf3ec1513e1811bd7df2e8de83313370d266b8b6a571491a9f092d254fc53b2c5cde14dd2196cf046e22970ef037a4c7f3d
languageName: node
linkType: hard
@ -3391,13 +3319,6 @@ __metadata:
languageName: node
linkType: hard
"estree-walker@npm:^1.0.1":
version: 1.0.1
resolution: "estree-walker@npm:1.0.1"
checksum: 85e7cee763e9125a7d8a947b3a06a8b9282873936df220dd0d791d9b3315e45e40ab096b43ba71bdc99140c11a6d23fdcf686642dc119a7b2d6181004fdb24d2
languageName: node
linkType: hard
"estree-walker@npm:^2.0.1":
version: 2.0.2
resolution: "estree-walker@npm:2.0.2"
@ -3785,6 +3706,17 @@ __metadata:
languageName: node
linkType: hard
"fs-extra@npm:10.0.0":
version: 10.0.0
resolution: "fs-extra@npm:10.0.0"
dependencies:
graceful-fs: ^4.2.0
jsonfile: ^6.0.1
universalify: ^2.0.0
checksum: 84632d143fe3125b8c3c2b1fedbbdfcfb84fc3e087522b4e138cc07edf574619925713a6609f6d5e53ede2e31ab319c7d528ea4a4a770ba6622a16bf4447cd8b
languageName: node
linkType: hard
"fs-extra@npm:8.1.0":
version: 8.1.0
resolution: "fs-extra@npm:8.1.0"
@ -3796,17 +3728,6 @@ __metadata:
languageName: node
linkType: hard
"fs-extra@npm:^10.0.0":
version: 10.0.0
resolution: "fs-extra@npm:10.0.0"
dependencies:
graceful-fs: ^4.2.0
jsonfile: ^6.0.1
universalify: ^2.0.0
checksum: 84632d143fe3125b8c3c2b1fedbbdfcfb84fc3e087522b4e138cc07edf574619925713a6609f6d5e53ede2e31ab319c7d528ea4a4a770ba6622a16bf4447cd8b
languageName: node
linkType: hard
"fs-minipass@npm:^2.0.0":
version: 2.1.0
resolution: "fs-minipass@npm:2.1.0"
@ -4125,7 +4046,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"gulp-sass@npm:^5.0.0":
"gulp-sass@npm:5.0.0":
version: 5.0.0
resolution: "gulp-sass@npm:5.0.0"
dependencies:
@ -4140,7 +4061,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"gulp@npm:^4.0.2":
"gulp@npm:4.0.2":
version: 4.0.2
resolution: "gulp@npm:4.0.2"
dependencies:
@ -4340,7 +4261,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"husky@npm:^7.0.1":
"husky@npm:7.0.1":
version: 7.0.1
resolution: "husky@npm:7.0.1"
bin:
@ -4667,13 +4588,6 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"is-module@npm:^1.0.0":
version: 1.0.0
resolution: "is-module@npm:1.0.0"
checksum: 2cbd41e2760874130b76aee84cc53120c4feef0d0f196fa665326857b444c8549909cc840f3f3a59652a7e8df46146a77f6c0f3f70a578704e03670975843e74
languageName: node
linkType: hard
"is-negated-glob@npm:^1.0.0":
version: 1.0.0
resolution: "is-negated-glob@npm:1.0.0"
@ -4988,19 +4902,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"jest-diff@npm:^26.0.0":
version: 26.6.2
resolution: "jest-diff@npm:26.6.2"
dependencies:
chalk: ^4.0.0
diff-sequences: ^26.6.2
jest-get-type: ^26.3.0
pretty-format: ^26.6.2
checksum: 05d0f1bdba147a026eab4121a73a69ee3df21aec59ecd34659d665ee0663e518636650b435d248974ab5aceb345de9bfcc035efd01df723fe788756a07c8d046
languageName: node
linkType: hard
"jest-diff@npm:^27.0.6":
"jest-diff@npm:^27.0.0, jest-diff@npm:^27.0.6":
version: 27.0.6
resolution: "jest-diff@npm:27.0.6"
dependencies:
@ -5063,13 +4965,6 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"jest-get-type@npm:^26.3.0":
version: 26.3.0
resolution: "jest-get-type@npm:26.3.0"
checksum: fc3e2d2b90cca74597c4ad6234c2fcc2ccb62894d0f7afe22fc55b5d93a2f02d3080ccef50f09c979d4b5a060bc76c4343911556d75ed9e892e0ebda6d54c44b
languageName: node
linkType: hard
"jest-get-type@npm:^27.0.6":
version: 27.0.6
resolution: "jest-get-type@npm:27.0.6"
@ -5127,7 +5022,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"jest-junit@npm:^12.2.0":
"jest-junit@npm:12.2.0":
version: 12.2.0
resolution: "jest-junit@npm:12.2.0"
dependencies:
@ -5395,7 +5290,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"jest@npm:^27.0.6":
"jest@npm:27.0.6":
version: 27.0.6
resolution: "jest@npm:27.0.6"
dependencies:
@ -5678,16 +5573,15 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"lint-staged@npm:^11.0.0":
version: 11.0.0
resolution: "lint-staged@npm:11.0.0"
"lint-staged@npm:11.1.2":
version: 11.1.2
resolution: "lint-staged@npm:11.1.2"
dependencies:
chalk: ^4.1.1
cli-truncate: ^2.1.0
commander: ^7.2.0
cosmiconfig: ^7.0.0
debug: ^4.3.1
dedent: ^0.7.0
enquirer: ^2.3.6
execa: ^5.0.0
listr2: ^3.8.2
@ -5699,7 +5593,7 @@ fsevents@^1.2.7:
stringify-object: ^3.3.0
bin:
lint-staged: bin/lint-staged.js
checksum: e5d9c38f468fae090939d150f8a1676ca208e50c714f20c9957a16833eeae20ca9676c8679883d0a005fda58375581c26352e18a2227d6449a29adaca650f957
checksum: 0c44f4fbd9360cb68a7c80475a2c37c01adc60c3598cc0beafc27d48f49be7d696e01f2a4b96eef0d6aba3fbe547861a434910ba80ec96fda30b6b21375ae937
languageName: node
linkType: hard
@ -6057,7 +5951,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"mkdirp@npm:1.x, mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
version: 1.0.4
resolution: "mkdirp@npm:1.0.4"
bin:
@ -6777,7 +6671,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"prettier@npm:^2.3.2":
"prettier@npm:2.3.2":
version: 2.3.2
resolution: "prettier@npm:2.3.2"
bin:
@ -6786,19 +6680,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"pretty-format@npm:^26.0.0, pretty-format@npm:^26.6.2":
version: 26.6.2
resolution: "pretty-format@npm:26.6.2"
dependencies:
"@jest/types": ^26.6.2
ansi-regex: ^5.0.0
ansi-styles: ^4.0.0
react-is: ^17.0.1
checksum: 5ad34fc128218485732cf0271d396158a00584708fc97bf063c1c3c000fe14da572e9a1d3d7b92d95c5e24965434656c56ed0e45804dea2435ca59a1f86f1b07
languageName: node
linkType: hard
"pretty-format@npm:^27.0.6":
"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.6":
version: 27.0.6
resolution: "pretty-format@npm:27.0.6"
dependencies:
@ -7140,7 +7022,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"resolve@1.20.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0":
"resolve@1.20.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.4.0":
version: 1.20.0
resolution: "resolve@npm:1.20.0"
dependencies:
@ -7150,7 +7032,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"resolve@patch:resolve@1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.1.6#builtin<compat/resolve>, resolve@patch:resolve@^1.1.7#builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.4.0#builtin<compat/resolve>":
"resolve@patch:resolve@1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.1.6#builtin<compat/resolve>, resolve@patch:resolve@^1.1.7#builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.4.0#builtin<compat/resolve>":
version: 1.20.0
resolution: "resolve@patch:resolve@npm%3A1.20.0#builtin<compat/resolve>::version=1.20.0&hash=3388aa"
dependencies:
@ -7212,7 +7094,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"rollup-plugin-typescript2@npm:^0.30.0":
"rollup-plugin-typescript2@npm:0.30.0":
version: 0.30.0
resolution: "rollup-plugin-typescript2@npm:0.30.0"
dependencies:
@ -7228,9 +7110,9 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"rollup@npm:^2.53.1":
version: 2.53.1
resolution: "rollup@npm:2.53.1"
"rollup@npm:2.56.2":
version: 2.56.2
resolution: "rollup@npm:2.56.2"
dependencies:
fsevents: ~2.3.2
dependenciesMeta:
@ -7238,7 +7120,7 @@ fsevents@^1.2.7:
optional: true
bin:
rollup: dist/bin/rollup
checksum: 7c63a7251e87715795a4141371f4f7b31ce46c7dd8273a0f4b5240977eb7ecaddd1e8d0fdaf8eabfc7cf73075cc9d83e03c67b89e56f31a2e85cf1089e9fc34f
checksum: babe2dce8eec8c130915baa54b0d62260fa4691ca9f2a989a2685b4e72761e701d53c374efa51a59a4c3f59a3c667ca5c8ac0e0de9a294ad50d1c1271d2d5199
languageName: node
linkType: hard
@ -7283,14 +7165,14 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"sass@npm:1.35.2":
version: 1.35.2
resolution: "sass@npm:1.35.2"
"sass@npm:1.38.0":
version: 1.38.0
resolution: "sass@npm:1.38.0"
dependencies:
chokidar: ">=3.0.0 <4.0.0"
bin:
sass: sass.js
checksum: d102e3fd6e6aa1a61f9c765fb31ff701d78ef05cf256ebb9ed80994c86638dcc8cc71832df1a1f71edce427cf823449c2fc43618b29ad51a8ca5bf93349ccaf4
checksum: ce6da83497f56daab29bc9ed316cbfd18111c1c0afa466912e8c7815c8f006620595b8d3c5db632e9f09366691c2d8fc5f8faa8eb9532ae3bd0364c2ae7c6a93
languageName: node
linkType: hard
@ -7328,7 +7210,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"semver@npm:7.x, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5":
"semver@npm:7.3.5, semver@npm:7.x, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5":
version: 7.3.5
resolution: "semver@npm:7.3.5"
dependencies:
@ -8066,26 +7948,34 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"ts-jest@npm:^27.0.3":
version: 27.0.3
resolution: "ts-jest@npm:27.0.3"
"ts-jest@npm:27.0.5":
version: 27.0.5
resolution: "ts-jest@npm:27.0.5"
dependencies:
bs-logger: 0.x
buffer-from: 1.x
fast-json-stable-stringify: 2.x
jest-util: ^27.0.0
json5: 2.x
lodash: 4.x
make-error: 1.x
mkdirp: 1.x
semver: 7.x
yargs-parser: 20.x
peerDependencies:
"@babel/core": ">=7.0.0-beta.0 <8"
"@types/jest": ^27.0.0
babel-jest: ">=27.0.0 <28"
jest: ^27.0.0
typescript: ">=3.8 <5.0"
peerDependenciesMeta:
"@babel/core":
optional: true
"@types/jest":
optional: true
babel-jest:
optional: true
bin:
ts-jest: cli.js
checksum: a63f3a8620a16335d745f22377a9cc118129d28a5b122c609a7c6aabbb8048c85733c771a0dd39b136e8a75401473409452bdd3c5b9e3b85317c2e3f3ac03267
checksum: 0f7479a6c967f192d9be8bf8ac75498f41cc03964ed7fa6f3ae826080bf8ddb1e2f1e59cda34342a99c44c2fff4b7350019dd4f963fa059af694de4196054576
languageName: node
linkType: hard
@ -8096,6 +7986,13 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"tslib@npm:2.3.1":
version: 2.3.1
resolution: "tslib@npm:2.3.1"
checksum: 5ae2f209c5127bad284974c78916f02c72082615f65889a7ed0c7ca6d5f935c30338a0ee7310e1d9652dabc7b7507fd2905035487446d09d45fc1f19de71cf05
languageName: node
linkType: hard
"tslib@npm:^1.8.1, tslib@npm:^1.9.0":
version: 1.14.1
resolution: "tslib@npm:1.14.1"
@ -8103,13 +8000,6 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"tslib@npm:^2.3.0":
version: 2.3.0
resolution: "tslib@npm:2.3.0"
checksum: 7b4fc9feff0f704743c3760f5d8d708f6417fac6458159e63df3a6b1100f0736e3b99edb9fe370f274ad15160a1f49ff05cb49402534c818ff552c48e38c3e6e
languageName: node
linkType: hard
"tsutils@npm:^3.21.0":
version: 3.21.0
resolution: "tsutils@npm:3.21.0"
@ -8190,7 +8080,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"typescript@^4.1.6, typescript@^4.3.5":
"typescript@4.3.5, typescript@^4.3.5":
version: 4.3.5
resolution: "typescript@npm:4.3.5"
bin:
@ -8200,7 +8090,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"typescript@patch:typescript@^4.1.6#builtin<compat/typescript>, typescript@patch:typescript@^4.3.5#builtin<compat/typescript>":
"typescript@patch:typescript@4.3.5#builtin<compat/typescript>, typescript@patch:typescript@^4.3.5#builtin<compat/typescript>":
version: 4.3.5
resolution: "typescript@patch:typescript@npm%3A4.3.5#builtin<compat/typescript>::version=4.3.5&hash=ddfc1b"
bin:
@ -8752,6 +8642,21 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"yargs@npm:17.1.1":
version: 17.1.1
resolution: "yargs@npm:17.1.1"
dependencies:
cliui: ^7.0.2
escalade: ^3.1.1
get-caller-file: ^2.0.5
require-directory: ^2.1.1
string-width: ^4.2.0
y18n: ^5.0.5
yargs-parser: ^20.2.2
checksum: c2a16b61eb0db8882becd0aa382a5c59b87afcd17b35dd7077b3c9d83f77a3ad3de1526e4f1cf940f9481d7ce537e883af7c16879c33258724a09bc43a04e8ea
languageName: node
linkType: hard
"yargs@npm:^16.0.3":
version: 16.2.0
resolution: "yargs@npm:16.2.0"
@ -8767,21 +8672,6 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"yargs@npm:^17.0.1":
version: 17.0.1
resolution: "yargs@npm:17.0.1"
dependencies:
cliui: ^7.0.2
escalade: ^3.1.1
get-caller-file: ^2.0.5
require-directory: ^2.1.1
string-width: ^4.2.0
y18n: ^5.0.5
yargs-parser: ^20.2.2
checksum: a7969b48d2dea129a7d4fcc3f13e88d4f94bacbd24f720b2ce19946fa9facc42cfed89c059d953091241f4e9e9000ed9dbf86e4bb4b6ceb3a26af10ddebdd0b2
languageName: node
linkType: hard
"yargs@npm:^7.1.0":
version: 7.1.2
resolution: "yargs@npm:7.1.2"