diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..2312dc58 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..582a71cb --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +node_modules +package-lock.json +package.json +.github +*.hbs \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..6de9e5d0 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +{ + "trailingComma": "none", + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": true, + "quoteProps": "consistent", + "bracketSpacing": true, + "arrowParens": "avoid", + "printWidth": 120, + "endOfLine": "lf", + "bracketSameLine": true +} diff --git a/README.md b/README.md index 1d2dab80..3a4cf1fd 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,47 @@ # Daggerheart + #### For Foundry VTT + This is a repo for a Foundry VTT implementation of daggerheart. It is not associated with critical role or darrington press. # Table Of Contents + - [Overview](#overview) - [Developer Guide](#developer-guide) # Overview # Developer Guide + +#### Coding Practises + +##### Branches And Pull Requests + +During pre-release development, we are making use of `main` as the development branch. Once release is getting closer we will instead be making a `dev` branch to base development from to make `main` more stable. + +When you work on an issue or feature, start from `main` and make a new branch. Branches should be topically named and with the associated Issue number if it relates to an Issue. EX: `#6/Level-Up-Bugginess`. + +--- + +Once you're finished with an issue or feature, open a Pull Request on Github for that branch. + +The Reviewers Team will be approving submissions. This is mainly since we have a wide spread of experience with system building and the system itself, and we do want the system to become something great. As time goes on, more collaborators are likely to be added as reviewers. + #### Setup + - Open a terminal in the directory with the repo `cd //` -- NOTE: The repo should be placed in the system files are or somewhere else and a link (if on linux) is placed in the system directory +- NOTE: The repo should be placed in the system files are or somewhere else and a link (if on linux) is placed in the system directory - NOTE: Linux link can be made using `ln -snf daggerheart` inside the system folder - - Install npm `npm install` - Update package.json to match your profile + ``` "start": "concurrently \"rollup -c --watch\" \"node C:/FoundryDev/resources/app/main.js --dataPath=C:/FoundryDevFiles --noupnp\" \"gulp\"", "start-test": "node C:/FoundryDev/resources/app/main.js --dataPath=C:/FoundryDevFiles && rollup -c --watch && gulp", ``` + - Replace `C:/FoundryDev/resources/app/main.js` with `////` - The main is likely in `/resouces/app/main.js` - Replace `--dataPath=C:/FoundryDevFiles` with `////` @@ -29,5 +49,4 @@ or darrington press. Now you should be able to build the app using `npm start` [Foundry VTT Website][1] - [1]: https://foundryvtt.com/ diff --git a/daggerheart.mjs b/daggerheart.mjs index bf567a79..de8cbe4f 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -17,11 +17,14 @@ Hooks.once('init', () => { game.system.api = { applications, models, - documents, - } - - CONFIG.statusEffects = Object.values(SYSTEM.GENERAL.conditions).map(x => ({ ...x, name: game.i18n.localize(x.name) })); - + documents + }; + + CONFIG.statusEffects = Object.values(SYSTEM.GENERAL.conditions).map(x => ({ + ...x, + name: game.i18n.localize(x.name) + })); + CONFIG.Item.documentClass = documents.DhpItem; CONFIG.Item.dataModels = { ancestry: models.DhpAncestry, @@ -29,49 +32,49 @@ Hooks.once('init', () => { class: models.DhpClass, subclass: models.DhpSubclass, feature: models.DhpFeature, - domainCard: models.DhpDomainCard, + domainCard: models.DhpDomainCard, miscellaneous: models.DhpMiscellaneous, consumable: models.DhpConsumable, weapon: models.DhpWeapon, - armor: models.DhpArmor, + armor: models.DhpArmor }; const { Items, Actors } = foundry.documents.collections; - Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet); - Items.registerSheet(SYSTEM.id, applications.DhpAncestry, {types: ["ancestry"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpCommunity, {types: ["community"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpClassSheet, {types: ["class"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpSubclass, {types: ["subclass"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpFeatureSheet, {types: ["feature"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpDomainCardSheet, {types: ["domainCard"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpMiscellaneous, {types: ["miscellaneous"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpConsumable, {types: ["consumable"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpWeapon, {types: ["weapon"], makeDefault: true}); - Items.registerSheet(SYSTEM.id, applications.DhpArmor, {types: ["armor"], makeDefault: true}); + Items.unregisterSheet('core', foundry.appv1.sheets.ItemSheet); + Items.registerSheet(SYSTEM.id, applications.DhpAncestry, { types: ['ancestry'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpCommunity, { types: ['community'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpClassSheet, { types: ['class'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpSubclass, { types: ['subclass'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpFeatureSheet, { types: ['feature'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpDomainCardSheet, { types: ['domainCard'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpMiscellaneous, { types: ['miscellaneous'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpConsumable, { types: ['consumable'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpWeapon, { types: ['weapon'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.DhpArmor, { types: ['armor'], makeDefault: true }); CONFIG.Actor.documentClass = documents.DhpActor; CONFIG.Actor.dataModels = { pc: models.DhpPC, adversary: models.DhpAdversary, - environment: models.DhpEnvironment, + environment: models.DhpEnvironment }; - Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet); - Actors.registerSheet(SYSTEM.id, applications.DhpPCSheet, {types: ["pc"], makeDefault: true}); - Actors.registerSheet(SYSTEM.id, applications.DhpAdversarySheet, {types: ["adversary"], makeDefault: true}); - Actors.registerSheet(SYSTEM.id, applications.DhpEnvironment, {types: ["environment"], makeDefault: true}); + Actors.unregisterSheet('core', foundry.appv1.sheets.ActorSheet); + Actors.registerSheet(SYSTEM.id, applications.DhpPCSheet, { types: ['pc'], makeDefault: true }); + Actors.registerSheet(SYSTEM.id, applications.DhpAdversarySheet, { types: ['adversary'], makeDefault: true }); + Actors.registerSheet(SYSTEM.id, applications.DhpEnvironment, { types: ['environment'], makeDefault: true }); CONFIG.Combat.dataModels = { - base: models.DhpCombat, + base: models.DhpCombat }; CONFIG.Combatant.dataModels = { - base: models.DhpCombatant, + base: models.DhpCombatant }; - CONFIG.ChatMessage.dataModels ={ + CONFIG.ChatMessage.dataModels = { dualityRoll: models.DhpDualityRoll, adversaryRoll: models.DhpAdversaryRoll, - abilityUse: models.DhpAbilityUse, + abilityUse: models.DhpAbilityUse }; CONFIG.ChatMessage.documentClass = applications.DhpChatMessage; @@ -90,22 +93,24 @@ Hooks.once('init', () => { return preloadHandlebarsTemplates(); }); -Hooks.once('dicesoniceready', () => { - -}); +Hooks.once('dicesoniceready', () => {}); Hooks.on(socketEvent.GMUpdate, async (action, uuid, update) => { - if(game.user.isGM){ + if (game.user.isGM) { const document = uuid ? await fromUuid(uuid) : null; - switch(action){ + switch (action) { case GMUpdateEvent.UpdateDocument: - if(document && update){ + if (document && update) { await document.update(update); } break; case GMUpdateEvent.UpdateFear: - if(game.user.isGM){ - await game.settings.set(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear, Math.max(Math.min(update, 6), 0)); + if (game.user.isGM) { + await game.settings.set( + SYSTEM.id, + SYSTEM.SETTINGS.gameSettings.Resources.Fear, + Math.max(Math.min(update, 6), 0) + ); Hooks.callAll(socketEvent.DhpFearUpdate); await game.socket.emit(`system.${SYSTEM.id}`, { action: socketEvent.DhpFearUpdate }); } @@ -114,27 +119,27 @@ Hooks.on(socketEvent.GMUpdate, async (action, uuid, update) => { } }); -const preloadHandlebarsTemplates = async function() { +const preloadHandlebarsTemplates = async function () { return foundry.applications.handlebars.loadTemplates([ - "systems/daggerheart/templates/sheets/parts/attributes.hbs", - "systems/daggerheart/templates/sheets/parts/defense.hbs", - "systems/daggerheart/templates/sheets/parts/armor.hbs", - "systems/daggerheart/templates/sheets/parts/experience.hbs", - "systems/daggerheart/templates/sheets/parts/features.hbs", - "systems/daggerheart/templates/sheets/parts/gold.hbs", - "systems/daggerheart/templates/sheets/parts/health.hbs", - "systems/daggerheart/templates/sheets/parts/hope.hbs", - "systems/daggerheart/templates/sheets/parts/inventory.hbs", - "systems/daggerheart/templates/sheets/parts/weapons.hbs", - "systems/daggerheart/templates/sheets/parts/domainCard.hbs", - "systems/daggerheart/templates/sheets/parts/heritage.hbs", - "systems/daggerheart/templates/sheets/parts/subclassFeature.hbs", - "systems/daggerheart/templates/sheets/parts/effects.hbs", - "systems/daggerheart/templates/sheets/pc/sections/inventory.hbs", - "systems/daggerheart/templates/sheets/pc/sections/loadout.hbs", - "systems/daggerheart/templates/sheets/pc/parts/heritageCard.hbs", - "systems/daggerheart/templates/sheets/pc/parts/advancementCard.hbs", - "systems/daggerheart/templates/views/parts/level.hbs", - "systems/daggerheart/templates/components/slider.hbs", + 'systems/daggerheart/templates/sheets/parts/attributes.hbs', + 'systems/daggerheart/templates/sheets/parts/defense.hbs', + 'systems/daggerheart/templates/sheets/parts/armor.hbs', + 'systems/daggerheart/templates/sheets/parts/experience.hbs', + 'systems/daggerheart/templates/sheets/parts/features.hbs', + 'systems/daggerheart/templates/sheets/parts/gold.hbs', + 'systems/daggerheart/templates/sheets/parts/health.hbs', + 'systems/daggerheart/templates/sheets/parts/hope.hbs', + 'systems/daggerheart/templates/sheets/parts/inventory.hbs', + 'systems/daggerheart/templates/sheets/parts/weapons.hbs', + 'systems/daggerheart/templates/sheets/parts/domainCard.hbs', + 'systems/daggerheart/templates/sheets/parts/heritage.hbs', + 'systems/daggerheart/templates/sheets/parts/subclassFeature.hbs', + 'systems/daggerheart/templates/sheets/parts/effects.hbs', + 'systems/daggerheart/templates/sheets/pc/sections/inventory.hbs', + 'systems/daggerheart/templates/sheets/pc/sections/loadout.hbs', + 'systems/daggerheart/templates/sheets/pc/parts/heritageCard.hbs', + 'systems/daggerheart/templates/sheets/pc/parts/advancementCard.hbs', + 'systems/daggerheart/templates/views/parts/level.hbs', + 'systems/daggerheart/templates/components/slider.hbs' ]); - }; \ No newline at end of file +}; diff --git a/gulpfile.js b/gulpfile.js index a5e1c7ad..45479a5c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,20 +2,15 @@ var gulp = require('gulp'); var less = require('gulp-less'); -gulp.task('less', function(cb) { - gulp - .src('styles/daggerheart.less') - .pipe(less()) - .pipe( - gulp.dest("styles") - ); - cb(); +gulp.task('less', function (cb) { + gulp.src('styles/daggerheart.less').pipe(less()).pipe(gulp.dest('styles')); + cb(); }); gulp.task( - 'default', - gulp.series('less', function(cb) { - gulp.watch('styles/**/*.less', gulp.series('less')); - cb(); - }) -); \ No newline at end of file + 'default', + gulp.series('less', function (cb) { + gulp.watch('styles/**/*.less', gulp.series('less')); + cb(); + }) +); diff --git a/lang/en.json b/lang/en.json index 83943b62..691afd13 100644 --- a/lang/en.json +++ b/lang/en.json @@ -102,7 +102,7 @@ "Fear": "Fear", "CriticalSuccess": "Critical Success", "Advantage": "Advantage", - "Disadvantage": "Disadvantage", + "Disadvantage": "Disadvantage", "OK": "OK", "Cancel": "Cancel", "Or": "Or", @@ -472,7 +472,7 @@ }, "Timeslowing": { "Name": "Timeslowing", - "Description": "On any incoming attacks, roll 1d4 and add its value to your Evasion score." + "Description": "On any incoming attacks, roll 1d4 and add its value to your Evasion score." }, "Truthseeking": { "Name": "Truthseeking", @@ -819,7 +819,7 @@ "Bags": "Bags", "Chests": "Chests" }, - "Health":{ + "Health": { "Title": "HIT POINTS & STRESS", "Minor": "Minor", "Major": "Major", @@ -1064,4 +1064,4 @@ } } } -} \ No newline at end of file +} diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index ba817c03..91aa6ba5 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -11,4 +11,4 @@ export { default as DhpConsumable } from './sheets/consumable.mjs'; export { default as DhpWeapon } from './sheets/weapon.mjs'; export { default as DhpArmor } from './sheets/armor.mjs'; export { default as DhpChatMessage } from './chatMessage.mjs'; -export { default as DhpEnvironment } from './sheets/environment.mjs'; \ No newline at end of file +export { default as DhpEnvironment } from './sheets/environment.mjs'; diff --git a/module/applications/ancestrySelectionDialog.mjs b/module/applications/ancestrySelectionDialog.mjs index 0ea04b9f..1ca15908 100644 --- a/module/applications/ancestrySelectionDialog.mjs +++ b/module/applications/ancestrySelectionDialog.mjs @@ -1,10 +1,9 @@ const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class AncestrySelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) { - - constructor(resolve){ + constructor(resolve) { super({}); - + this.resolve = resolve; this.data = { ancestries: [], @@ -13,17 +12,17 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( name: '', img: null, customImg: 'icons/svg/mystery-man.svg', - description: '', - }, + description: '' + } }; } static DEFAULT_OPTIONS = { tag: 'form', - classes: ["daggerheart", "views", "ancestry-selection"], + classes: ['daggerheart', 'views', 'ancestry-selection'], position: { - width: 800, - height: "auto" + width: 800, + height: 'auto' }, actions: { selectAncestry: this.selectAncestry, @@ -31,21 +30,21 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( viewItem: this.viewItem, selectImage: this.selectImage, editImage: this._onEditImage, - saveAncestry: this.saveAncestry, + saveAncestry: this.saveAncestry }, form: { submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false } }; - + /** @override */ static PARTS = { damageSelection: { - id: "ancestrySelection", - template: "systems/daggerheart/templates/views/ancestrySelection.hbs" + id: 'ancestrySelection', + template: 'systems/daggerheart/templates/views/ancestrySelection.hbs' } - } + }; /* -------------------------------------------- */ @@ -57,10 +56,10 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); - const ancestryNameInput = $(htmlElement).find(".ancestry-name"); - if(ancestryNameInput.length > 0){ - ancestryNameInput.on("change", this.setName.bind(this)); - $(htmlElement).find(".ancestry-description").on("change", this.setDescription.bind(this)); + const ancestryNameInput = $(htmlElement).find('.ancestry-name'); + if (ancestryNameInput.length > 0) { + ancestryNameInput.on('change', this.setName.bind(this)); + $(htmlElement).find('.ancestry-description').on('change', this.setDescription.bind(this)); } // $(htmlElement).find(".ancestry-image").on("change", this.selectImage.bind(this)); } @@ -68,19 +67,26 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( async _prepareContext(_options) { const systemAncestries = Array.from((await game.packs.get('daggerheart.playtest-ancestries')).index).map(x => ({ ...x, - selected: this.data.ancestries.some(selected => selected.uuid === x.uuid), + selected: this.data.ancestries.some(selected => selected.uuid === x.uuid) })); const customAncestries = game.items.reduce((acc, x) => { - if(x.type === 'ancestry'){ - acc.push({ ...x, uuid: x.uuid, selected: this.data.ancestries.some(selected => selected.uuid === x.uuid) }); + if (x.type === 'ancestry') { + acc.push({ + ...x, + uuid: x.uuid, + selected: this.data.ancestries.some(selected => selected.uuid === x.uuid) + }); } return acc; }, []); - const ancestryFeatures = this.data.ancestries.flatMap(x => - x.system.abilities.map(x => ({ ...x, selected: this.data.features.some(selected => selected.uuid === x.uuid) })) + const ancestryFeatures = this.data.ancestries.flatMap(x => + x.system.abilities.map(x => ({ + ...x, + selected: this.data.features.some(selected => selected.uuid === x.uuid) + })) ); return { @@ -89,13 +95,13 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( ancestryFeatures, selectedAncestries: this.data.ancestries, selectedFeatures: this.data.features, - ancestryInfo: this.data.ancestryInfo, + ancestryInfo: this.data.ancestryInfo }; } static async selectAncestry(_, button) { const newAncestries = [...this.data.ancestries]; - if(!newAncestries.findSplice(x => x.uuid === button.dataset.uuid) && this.data.ancestries.length < 2){ + if (!newAncestries.findSplice(x => x.uuid === button.dataset.uuid) && this.data.ancestries.length < 2) { const ancestry = await fromUuid(button.dataset.uuid); newAncestries.push(ancestry); } @@ -108,7 +114,7 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( static async selectFeature(_, button) { const newFeatures = [...this.data.features]; - if(!newFeatures.findSplice(x => x.uuid === button.dataset.uuid) && this.data.features.length < 2){ + if (!newFeatures.findSplice(x => x.uuid === button.dataset.uuid) && this.data.features.length < 2) { const feature = await fromUuid(button.dataset.uuid); newFeatures.push(feature); } @@ -125,7 +131,7 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( this.data.ancestryInfo.name = event.currentTarget.value; this.render(true); } - + setDescription(event) { this.data.ancestryInfo.description = event.currentTarget.value; this.render(true); @@ -139,7 +145,7 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( static _onEditImage() { const fp = new FilePicker({ current: this.data.ancestryInfo.img, - type: "image", + type: 'image', redirectToRoot: ['icons/svg/mystery-man.svg'], callback: async path => this._updateImage.bind(this)(path), top: this.position.top + 40, @@ -148,17 +154,32 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( return fp.browse(); } - _updateImage(path){ - this.data.ancestryInfo.customImg = path; - this.data.ancestryInfo.img = path; - this.render(true); + _updateImage(path) { + this.data.ancestryInfo.customImg = path; + this.data.ancestryInfo.img = path; + this.render(true); } static async saveAncestry(_, button) { - if(this.data.ancestries.length === 2){ + if (this.data.ancestries.length === 2) { const { name, img, description } = this.data.ancestryInfo; - this.resolve({ data: { name: name, img: img, type: "ancestry", system: { description: description, abilities: this.data.features.map(x => ({ name: x.name, img: x.img, uuid: x.uuid, subclassLevel: '' })) }}}); + this.resolve({ + data: { + name: name, + img: img, + type: 'ancestry', + system: { + description: description, + abilities: this.data.features.map(x => ({ + name: x.name, + img: x.img, + uuid: x.uuid, + subclassLevel: '' + })) + } + } + }); } else { this.resolve({ data: this.data.ancestries[0].toObject() }); } @@ -170,7 +191,7 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( // export default class DamageSelectionDialog extends FormApplication { // constructor(rollString, bonusDamage, resolve){ // super({}, {}); - + // this.data = { // rollString, // bonusDamage: bonusDamage.map(x => ({ @@ -180,11 +201,11 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( // } // this.resolve = resolve; // } - + // get title (){ // return 'Damage Options'; // } - + // static get defaultOptions() { // const defaults = super.defaultOptions; // const overrides = { @@ -195,35 +216,35 @@ export default class AncestrySelectionDialog extends HandlebarsApplicationMixin( // closeOnSubmit: false, // classes: ["daggerheart", "views", "damage-selection"], // }; - + // const mergedOptions = foundry.utils.mergeObject(defaults, overrides); - + // return mergedOptions; // } - + // async getData(){ // const context = super.getData(); // context.rollString = this.data.rollString; // context.bonusDamage = this.data.bonusDamage; - + // return context; // } - + // activateListeners(html) { // super.activateListeners(html); - + // html.find('.roll-button').click(this.finish.bind(this)); // html.find('.').change(); // } - + // // async _updateObject(_, formData) { // // const data = foundry.utils.expandObject(formData); // // this.data = foundry.utils.mergeObject(this.data, data); // // this.render(true); // // } - + // finish(){ // this.resolve(this.data); // this.close(); // } -// } \ No newline at end of file +// } diff --git a/module/applications/chatMessage.mjs b/module/applications/chatMessage.mjs index 48935fa1..e83e174f 100644 --- a/module/applications/chatMessage.mjs +++ b/module/applications/chatMessage.mjs @@ -1,9 +1,9 @@ export default class DhpChatMesssage extends ChatMessage { async renderHTML() { - if(this.type === 'dualityRoll' || this.type === 'adversaryRoll' || this.type === 'abilityUse'){ + if (this.type === 'dualityRoll' || this.type === 'adversaryRoll' || this.type === 'abilityUse') { this.content = await foundry.applications.handlebars.renderTemplate(this.content, this.system); } return super.renderHTML(); } -} \ No newline at end of file +} diff --git a/module/applications/config/Action.mjs b/module/applications/config/Action.mjs index ed27e0c1..109ad503 100644 --- a/module/applications/config/Action.mjs +++ b/module/applications/config/Action.mjs @@ -1,8 +1,8 @@ import DaggerheartSheet from '../sheets/daggerheart-sheet.mjs'; -const {ApplicationV2} = foundry.applications.api; +const { ApplicationV2 } = foundry.applications.api; export default class DaggerheartActionConfig extends DaggerheartSheet(ApplicationV2) { - constructor(action){ + constructor(action) { super({}); this.action = action; @@ -10,40 +10,47 @@ export default class DaggerheartActionConfig extends DaggerheartSheet(Applicatio } // get title(){ - // return `Action - ${this.action.name}`; + // return `Action - ${this.action.name}`; // } static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-action", - classes: ["daggerheart", "views", "action"], + id: 'daggerheart-action', + classes: ['daggerheart', 'views', 'action'], position: { width: 600, height: 'auto' }, actions: { - toggleSection: this.toggleSection, + toggleSection: this.toggleSection }, form: { handler: this.updateForm, - closeOnSubmit: true, - }, + closeOnSubmit: true + } }; - + static PARTS = { form: { - id: "action", - template: "systems/daggerheart/templates/views/action.hbs" + id: 'action', + template: 'systems/daggerheart/templates/views/action.hbs' } - } + }; _getTabs() { const tabs = { effects: { active: true, cssClass: '', group: 'primary', id: 'effects', icon: null, label: 'Effects' }, useage: { active: false, cssClass: '', group: 'primary', id: 'useage', icon: null, label: 'Useage' }, - conditions: { active: false, cssClass: '', group: 'primary', id: 'conditions', icon: null, label: 'Conditions' }, - } + conditions: { + active: false, + cssClass: '', + group: 'primary', + id: 'conditions', + icon: null, + label: 'Conditions' + } + }; - for ( const v of Object.values(tabs) ) { + for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; - v.cssClass = v.active ? "active" : ""; + v.cssClass = v.active ? 'active' : ''; } return tabs; @@ -61,14 +68,14 @@ export default class DaggerheartActionConfig extends DaggerheartSheet(Applicatio this.openSection = button.dataset.section === this.openSection ? null : button.dataset.section; this.render(true); } - + static async updateForm(event, _, formData) { const data = foundry.utils.expandObject(foundry.utils.mergeObject(this.action.toObject(), formData.object)); const newActions = this.action.parent.actions.map(x => x.toObject()); - if(!newActions.findSplice(x => x.id === data.id, data)){ + if (!newActions.findSplice(x => x.id === data.id, data)) { newActions.push(data); } - await this.action.parent.parent.update({ "system.actions": newActions }); + await this.action.parent.parent.update({ 'system.actions': newActions }); } -} \ No newline at end of file +} diff --git a/module/applications/daggerheart-sheet.mjs b/module/applications/daggerheart-sheet.mjs index ee06d762..32d5212e 100644 --- a/module/applications/daggerheart-sheet.mjs +++ b/module/applications/daggerheart-sheet.mjs @@ -1,22 +1,22 @@ export default function DhpApplicationMixin(Base) { return class DhpSheet extends Base { - static applicationType = "sheets"; - static documentType = ""; + static applicationType = 'sheets'; + static documentType = ''; static get defaultOptions() { return Object.assign(super.defaultOptions, { - classes: ["daggerheart", "sheet", this.documentType], + classes: ['daggerheart', 'sheet', this.documentType], template: `systems/${SYSTEM.id}/templates/${this.applicationType}/${this.documentType}.hbs`, - height: "auto", + height: 'auto', submitOnChange: true, submitOnClose: false, width: 450 }); } - + /** @override */ get title() { - const {documentName, type, name} = this.object; + const { documentName, type, name } = this.object; // const typeLabel = game.i18n.localize(CONFIG[documentName].typeLabels[type]); const typeLabel = documentName; return `[${typeLabel}] ${name}`; @@ -32,17 +32,17 @@ export default function DhpApplicationMixin(Base) { activateListeners(html) { super.activateListeners(html); - html.on("click", "[data-action]", this.#onClickAction.bind(this)); + html.on('click', '[data-action]', this.#onClickAction.bind(this)); } async #onClickAction(event) { - event.preventDefault(); - const button = event.currentTarget; - const action = button.dataset.action; - - return this._handleAction(action, event, button); + event.preventDefault(); + const button = event.currentTarget; + const action = button.dataset.action; + + return this._handleAction(action, event, button); } async _handleAction(action, event, button) {} - } -} \ No newline at end of file + }; +} diff --git a/module/applications/damageSelectionDialog.mjs b/module/applications/damageSelectionDialog.mjs index cb7c3133..4540ae6d 100644 --- a/module/applications/damageSelectionDialog.mjs +++ b/module/applications/damageSelectionDialog.mjs @@ -1,53 +1,52 @@ const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class DamageSelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) { - - constructor(rollString, bonusDamage, hope, resolve){ + constructor(rollString, bonusDamage, hope, resolve) { super({}); - + this.data = { rollString, bonusDamage: bonusDamage.reduce((acc, x) => { - if(x.appliesOn === SYSTEM.EFFECTS.applyLocations.damageRoll.id){ - acc.push(({ + if (x.appliesOn === SYSTEM.EFFECTS.applyLocations.damageRoll.id) { + acc.push({ ...x, hopeUses: 0 - })); + }); } return acc; }, []), - hope, - } + hope + }; this.resolve = resolve; } static DEFAULT_OPTIONS = { tag: 'form', - classes: ["daggerheart", "views", "damage-selection"], + classes: ['daggerheart', 'views', 'damage-selection'], position: { - width: 400, - height: "auto" + width: 400, + height: 'auto' }, actions: { decreaseHopeUse: this.decreaseHopeUse, increaseHopeUse: this.increaseHopeUse, - rollDamage: this.rollDamage, + rollDamage: this.rollDamage }, form: { handler: this.updateSelection, submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false } }; - + /** @override */ static PARTS = { damageSelection: { - id: "damageSelection", - template: "systems/daggerheart/templates/views/damageSelection.hbs" + id: 'damageSelection', + template: 'systems/daggerheart/templates/views/damageSelection.hbs' } - } + }; /* -------------------------------------------- */ @@ -60,19 +59,19 @@ export default class DamageSelectionDialog extends HandlebarsApplicationMixin(Ap return { rollString: this.getRollString(), bonusDamage: this.data.bonusDamage, - hope: this.data.hope+1, - hopeUsed: this.getHopeUsed(), - } + hope: this.data.hope + 1, + hopeUsed: this.getHopeUsed() + }; } - static updateSelection(event, _, formData){ + static updateSelection(event, _, formData) { const { bonusDamage, ...rest } = foundry.utils.expandObject(formData.object); - - for(var index in bonusDamage){ + + for (var index in bonusDamage) { this.data.bonusDamage[index].initiallySelected = bonusDamage[index].initiallySelected; - if(bonusDamage[index].hopeUses){ + if (bonusDamage[index].hopeUses) { const value = Number.parseInt(bonusDamage[index].hopeUses); - if(!Number.isNaN(value)) this.data.bonusDamage[index].hopeUses = value; + if (!Number.isNaN(value)) this.data.bonusDamage[index].hopeUses = value; } } @@ -80,40 +79,46 @@ export default class DamageSelectionDialog extends HandlebarsApplicationMixin(Ap this.render(true); } - getRollString(){ - return this.data.rollString.concat(this.data.bonusDamage.reduce((acc, x) => { - if(x.initiallySelected){ - const nr = 1+x.hopeUses; - const baseDamage = x.value; - return acc.concat(` + ${nr}${baseDamage}`); - } + getRollString() { + return this.data.rollString.concat( + this.data.bonusDamage.reduce((acc, x) => { + if (x.initiallySelected) { + const nr = 1 + x.hopeUses; + const baseDamage = x.value; + return acc.concat(` + ${nr}${baseDamage}`); + } - return acc; - }, "")); + return acc; + }, '') + ); } - getHopeUsed(){ - return this.data.bonusDamage.reduce((acc, x) => acc+x.hopeUses, 0); + getHopeUsed() { + return this.data.bonusDamage.reduce((acc, x) => acc + x.hopeUses, 0); } - static decreaseHopeUse(_, button){ + static decreaseHopeUse(_, button) { const index = Number.parseInt(button.dataset.index); - if(this.data.bonusDamage[index].hopeUses - 1 >= 0) { + if (this.data.bonusDamage[index].hopeUses - 1 >= 0) { this.data.bonusDamage[index].hopeUses -= 1; this.render(true); } } - static increaseHopeUse(_, button){ + static increaseHopeUse(_, button) { const index = Number.parseInt(button.dataset.index); - if(this.data.bonusDamage[index].hopeUses <= this.data.hope+1) { + if (this.data.bonusDamage[index].hopeUses <= this.data.hope + 1) { this.data.bonusDamage[index].hopeUses += 1; this.render(true); } } - static rollDamage(){ - this.resolve({ rollString: this.getRollString(), bonusDamage: this.data.bonusDamage, hopeUsed: this.getHopeUsed() }); + static rollDamage() { + this.resolve({ + rollString: this.getRollString(), + bonusDamage: this.data.bonusDamage, + hopeUsed: this.getHopeUsed() + }); this.close(); } } @@ -121,7 +126,7 @@ export default class DamageSelectionDialog extends HandlebarsApplicationMixin(Ap // export default class DamageSelectionDialog extends FormApplication { // constructor(rollString, bonusDamage, resolve){ // super({}, {}); - + // this.data = { // rollString, // bonusDamage: bonusDamage.map(x => ({ @@ -131,11 +136,11 @@ export default class DamageSelectionDialog extends HandlebarsApplicationMixin(Ap // } // this.resolve = resolve; // } - + // get title (){ // return 'Damage Options'; // } - + // static get defaultOptions() { // const defaults = super.defaultOptions; // const overrides = { @@ -146,35 +151,35 @@ export default class DamageSelectionDialog extends HandlebarsApplicationMixin(Ap // closeOnSubmit: false, // classes: ["daggerheart", "views", "damage-selection"], // }; - + // const mergedOptions = foundry.utils.mergeObject(defaults, overrides); - + // return mergedOptions; // } - + // async getData(){ // const context = super.getData(); // context.rollString = this.data.rollString; // context.bonusDamage = this.data.bonusDamage; - + // return context; // } - + // activateListeners(html) { // super.activateListeners(html); - + // html.find('.roll-button').click(this.finish.bind(this)); // html.find('.').change(); // } - + // // async _updateObject(_, formData) { // // const data = foundry.utils.expandObject(formData); // // this.data = foundry.utils.mergeObject(this.data, data); // // this.render(true); // // } - + // finish(){ // this.resolve(this.data); // this.close(); // } -// } \ No newline at end of file +// } diff --git a/module/applications/deathMove.mjs b/module/applications/deathMove.mjs index d5559489..54622a1a 100644 --- a/module/applications/deathMove.mjs +++ b/module/applications/deathMove.mjs @@ -1,32 +1,32 @@ -const {HandlebarsApplicationMixin, ApplicationV2} = foundry.applications.api; +const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class DhpDeathMove extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(actor){ + constructor(actor) { super({}); this.actor = actor; this.selectedMove = null; } - get title(){ - return game.i18n.format("DAGGERHEART.Application.DeathMove.Title", { actor: this.actor.name }); + get title() { + return game.i18n.format('DAGGERHEART.Application.DeathMove.Title', { actor: this.actor.name }); } static DEFAULT_OPTIONS = { - classes: ["daggerheart", "views", "death-move"], + classes: ['daggerheart', 'views', 'death-move'], position: { width: 800, height: 'auto' }, actions: { selectMove: this.selectMove, - takeMove: this.takeMove, - }, + takeMove: this.takeMove + } }; - + static PARTS = { application: { - id: "death-move", - template: "systems/daggerheart/templates/views/deathMove.hbs" + id: 'death-move', + template: 'systems/daggerheart/templates/views/deathMove.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -36,28 +36,27 @@ export default class DhpDeathMove extends HandlebarsApplicationMixin(Application return context; } - - static selectMove(_, button){ + static selectMove(_, button) { const move = button.dataset.move; this.selectedMove = SYSTEM.GENERAL.deathMoves[move]; this.render(); } - static async takeMove(){ - const cls = getDocumentClass("ChatMessage"); + static async takeMove() { + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/deathMove.hbs", { - player: game.user.character.name, - title: game.i18n.localize(this.selectedMove.name), + content: await renderTemplate('systems/daggerheart/templates/chat/deathMove.hbs', { + player: game.user.character.name, + title: game.i18n.localize(this.selectedMove.name), img: this.selectedMove.img, - description: game.i18n.localize(this.selectedMove.description), - }), + description: game.i18n.localize(this.selectedMove.description) + }) }); - + cls.create(msg.toObject()); this.close(); } -} \ No newline at end of file +} diff --git a/module/applications/downtime.mjs b/module/applications/downtime.mjs index 8a8cdf25..06575f80 100644 --- a/module/applications/downtime.mjs +++ b/module/applications/downtime.mjs @@ -1,7 +1,7 @@ -const {HandlebarsApplicationMixin, ApplicationV2} = foundry.applications.api; +const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(actor, shortrest){ + constructor(actor, shortrest) { super({}); this.actor = actor; @@ -11,27 +11,27 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV this.customActivity = SYSTEM.GENERAL.downtime.custom; } - get title(){ - return `${this.actor.name} - ${this.shortrest ? 'Short Rest': 'Long Rest'}`; + get title() { + return `${this.actor.name} - ${this.shortrest ? 'Short Rest' : 'Long Rest'}`; } static DEFAULT_OPTIONS = { tag: 'form', - classes: ["daggerheart", "views", "downtime"], + classes: ['daggerheart', 'views', 'downtime'], position: { width: 800, height: 'auto' }, actions: { selectActivity: this.selectActivity, - takeDowntime: this.takeDowntime, + takeDowntime: this.takeDowntime }, form: { handler: this.updateData, submitOnChange: true } }; - + static PARTS = { application: { - id: "downtime", - template: "systems/daggerheart/templates/views/downtime.hbs" + id: 'downtime', + template: 'systems/daggerheart/templates/views/downtime.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -39,44 +39,53 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV context.options = this.shortrest ? SYSTEM.GENERAL.downtime.shortRest : SYSTEM.GENERAL.downtime.longRest; context.customActivity = this.customActivity; - context.disabledDowntime = !this.selectedActivity || (this.selectedActivity.id === this.customActivity.id && (!this.customActivity.name || !this.customActivity.description)); + context.disabledDowntime = + !this.selectedActivity || + (this.selectedActivity.id === this.customActivity.id && + (!this.customActivity.name || !this.customActivity.description)); return context; } - - static selectActivity(_, button){ + static selectActivity(_, button) { const activity = button.dataset.activity; - this.selectedActivity = activity === this.customActivity.id ? this.customActivity : this.shortrest ? SYSTEM.GENERAL.downtime.shortRest[activity] : SYSTEM.GENERAL.downtime.longRest[activity]; + this.selectedActivity = + activity === this.customActivity.id + ? this.customActivity + : this.shortrest + ? SYSTEM.GENERAL.downtime.shortRest[activity] + : SYSTEM.GENERAL.downtime.longRest[activity]; this.render(); } - static async takeDowntime(){ - const refreshedFeatures = this.shortrest ? this.actor.system.refreshableFeatures.shortRest : [...this.actor.system.refreshableFeatures.shortRest, ...this.actor.system.refreshableFeatures.longRest]; - for(var feature of refreshedFeatures){ + static async takeDowntime() { + const refreshedFeatures = this.shortrest + ? this.actor.system.refreshableFeatures.shortRest + : [...this.actor.system.refreshableFeatures.shortRest, ...this.actor.system.refreshableFeatures.longRest]; + for (var feature of refreshedFeatures) { await feature.system.refresh(); } - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/downtime.hbs", { - player: game.user.character.name, - title: game.i18n.localize(this.selectedActivity.name), + content: await renderTemplate('systems/daggerheart/templates/chat/downtime.hbs', { + player: game.user.character.name, + title: game.i18n.localize(this.selectedActivity.name), img: this.selectedActivity.img, description: game.i18n.localize(this.selectedActivity.description), - refreshedFeatures: refreshedFeatures, - }), + refreshedFeatures: refreshedFeatures + }) }); - + cls.create(msg.toObject()); this.close(); } - static async updateData(event, element, formData){ + static async updateData(event, element, formData) { this.customActivity = foundry.utils.mergeObject(this.customActivity, formData.object); this.render(); } -} \ No newline at end of file +} diff --git a/module/applications/levelup.mjs b/module/applications/levelup.mjs index a80333fe..189fc368 100644 --- a/module/applications/levelup.mjs +++ b/module/applications/levelup.mjs @@ -1,77 +1,82 @@ -import SelectDialog from "../dialogs/selectDialog.mjs"; -import { getTier } from "../helpers/utils.mjs"; -import DhpMulticlassDialog from "./multiclassDialog.mjs"; +import SelectDialog from '../dialogs/selectDialog.mjs'; +import { getTier } from '../helpers/utils.mjs'; +import DhpMulticlassDialog from './multiclassDialog.mjs'; -const {HandlebarsApplicationMixin, ApplicationV2} = foundry.applications.api; +const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class DhpLevelup extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(actor){ + constructor(actor) { super({}); this.actor = actor; this.data = foundry.utils.deepClone(actor.system.levelData); - this.activeLevel = actor.system.levelData.currentLevel+1; + this.activeLevel = actor.system.levelData.currentLevel + 1; } - get title(){ - return `${this.actor.name} - Level Up`; + get title() { + return `${this.actor.name} - Level Up`; } static DEFAULT_OPTIONS = { - id: "daggerheart-levelup", - classes: ["daggerheart", "views", "levelup"], + id: 'daggerheart-levelup', + classes: ['daggerheart', 'views', 'levelup'], position: { width: 1200, height: 'auto' }, window: { - resizable: true, + resizable: true }, actions: { toggleBox: this.toggleBox, advanceLevel: this.advanceLevel, - finishLevelup: this.finishLevelup, - }, + finishLevelup: this.finishLevelup + } }; - + static PARTS = { form: { - id: "levelup", - template: "systems/daggerheart/templates/views/levelup.hbs" + id: 'levelup', + template: 'systems/daggerheart/templates/views/levelup.hbs' } - } + }; async _prepareContext(_options) { - let selectedChoices = 0, multiclassing = {}, subclassing = {}; - const leveledTiers = Object.keys(this.data.levelups).reduce((acc, levelKey) => { - const levelData = this.data.levelups[levelKey]; - ['tier1','tier2','tier3'].forEach(tierKey => { - let tierUpdate = {}; - const tierData = levelData[tierKey]; - if(tierData){ - tierUpdate = Object.keys(tierData).reduce((acc, propertyKey) => { - const values = tierData[propertyKey]; - const level = Number.parseInt(levelKey); + let selectedChoices = 0, + multiclassing = {}, + subclassing = {}; + const leveledTiers = Object.keys(this.data.levelups).reduce( + (acc, levelKey) => { + const levelData = this.data.levelups[levelKey]; + ['tier1', 'tier2', 'tier3'].forEach(tierKey => { + let tierUpdate = {}; + const tierData = levelData[tierKey]; + if (tierData) { + tierUpdate = Object.keys(tierData).reduce((acc, propertyKey) => { + const values = tierData[propertyKey]; + const level = Number.parseInt(levelKey); - acc[propertyKey] = Object.values(values).map(value => { - if(value && level === this.activeLevel) selectedChoices++; - if(propertyKey === 'multiclass') multiclassing[levelKey] = true; - if(propertyKey === 'subclass') subclassing[tierKey] = true; - - return { level: level, value: value }; - }); + acc[propertyKey] = Object.values(values).map(value => { + if (value && level === this.activeLevel) selectedChoices++; + if (propertyKey === 'multiclass') multiclassing[levelKey] = true; + if (propertyKey === 'subclass') subclassing[tierKey] = true; - return acc; - }, {}); - } - - Object.keys(tierUpdate).forEach(propertyKey => { - const property = tierUpdate[propertyKey]; - const propertyValues = foundry.utils.getProperty(acc, `${tierKey}.${propertyKey}`)??[]; - foundry.utils.setProperty(acc, `${tierKey}.${propertyKey}`, [...propertyValues, ...property]); + return { level: level, value: value }; + }); + + return acc; + }, {}); + } + + Object.keys(tierUpdate).forEach(propertyKey => { + const property = tierUpdate[propertyKey]; + const propertyValues = foundry.utils.getProperty(acc, `${tierKey}.${propertyKey}`) ?? []; + foundry.utils.setProperty(acc, `${tierKey}.${propertyKey}`, [...propertyValues, ...property]); + }); }); - }); - return acc; - }, { tier1: {}, tier2: {}, tier3: {} }); + return acc; + }, + { tier1: {}, tier2: {}, tier3: {} } + ); const activeTier = getTier(this.activeLevel); const data = Object.keys(SYSTEM.ACTOR.levelupData).reduce((acc, tierKey) => { @@ -85,21 +90,35 @@ export default class DhpLevelup extends HandlebarsApplicationMixin(ApplicationV2 choices: Object.keys(tier.choices).reduce((acc, propertyKey) => { const property = tier.choices[propertyKey]; acc[propertyKey] = { description: property.description, cost: property.cost ?? 1, values: [] }; - for(var i = 0; i < property.maxChoices; i++){ + for (var i = 0; i < property.maxChoices; i++) { const leveledValue = leveledTiers[tierKey][propertyKey]?.[i]; - const subclassLock = propertyKey === 'subclass' && Object.keys(multiclassing).find(x => getTier(Number.parseInt(x)) === tierKey); + const subclassLock = + propertyKey === 'subclass' && + Object.keys(multiclassing).find(x => getTier(Number.parseInt(x)) === tierKey); const subclassMulticlassLock = propertyKey === 'multiclass' && subclassing[tierKey]; - const multiclassLock = propertyKey === 'multiclass' && Object.keys(multiclassing).length > 0 && !(leveledValue && Object.keys(multiclassing).find(x => Number.parseInt(x) === leveledValue.level)); - const locked = leveledValue && leveledValue.level !== this.activeLevel || subclassLock || subclassMulticlassLock || multiclassLock; - const disabled = tierKey > activeTier || (selectedChoices === 2 && !(leveledValue && leveledValue.level === this.activeLevel)) || locked; - + const multiclassLock = + propertyKey === 'multiclass' && + Object.keys(multiclassing).length > 0 && + !( + leveledValue && + Object.keys(multiclassing).find(x => Number.parseInt(x) === leveledValue.level) + ); + const locked = + (leveledValue && leveledValue.level !== this.activeLevel) || + subclassLock || + subclassMulticlassLock || + multiclassLock; + const disabled = + tierKey > activeTier || + (selectedChoices === 2 && !(leveledValue && leveledValue.level === this.activeLevel)) || + locked; acc[propertyKey].values.push({ selected: leveledValue?.value !== undefined, path: `levelups.${this.activeLevel}.${tierKey}.${propertyKey}.${i}`, description: game.i18n.localize(property.description), disabled: disabled, - locked: locked, + locked: locked }); } @@ -114,70 +133,122 @@ export default class DhpLevelup extends HandlebarsApplicationMixin(ApplicationV2 data: data, activeLevel: this.activeLevel, changedLevel: this.actor.system.levelData.changedLevel, - completedSelection: selectedChoices === 2, - } + completedSelection: selectedChoices === 2 + }; } - static async toggleBox(_, button){ + static async toggleBox(_, button) { const path = button.dataset.path; - if(foundry.utils.getProperty(this.data, path)){ + if (foundry.utils.getProperty(this.data, path)) { const pathParts = path.split('.'); - const arrayPart = pathParts.slice(0, pathParts.length-1).join('.'); + const arrayPart = pathParts.slice(0, pathParts.length - 1).join('.'); let array = foundry.utils.getProperty(this.data, arrayPart); - if(button.dataset.levelAttribute === 'multiclass'){ + if (button.dataset.levelAttribute === 'multiclass') { array = []; - } - else { - delete array[Number.parseInt(pathParts[pathParts.length-1])]; + } else { + delete array[Number.parseInt(pathParts[pathParts.length - 1])]; } foundry.utils.setProperty(this.data, arrayPart, array); } else { const updates = [{ path: path, value: { level: this.activeLevel } }]; const levelChoices = SYSTEM.ACTOR.levelChoices[button.dataset.levelAttribute]; - if(button.dataset.levelAttribute === 'subclass'){ - if(!this.actor.system.multiclassSubclass){ - updates[0].value.value = { multiclass: false, feature: this.actor.system.subclass.system.specializationFeature.unlocked ? 'mastery' : 'specialization' }; - } - else { - const choices = [{name: this.actor.system.subclass.name, value: this.actor.system.subclass.uuid}, {name: this.actor.system.multiclassSubclass.name, value: this.actor.system.multiclassSubclass.uuid}]; - const indexes = await SelectDialog.selectItem({ actor: this.actor, choices: choices, title: levelChoices.title, nrChoices: 1 }); - if(indexes.length === 0) { + if (button.dataset.levelAttribute === 'subclass') { + if (!this.actor.system.multiclassSubclass) { + updates[0].value.value = { + multiclass: false, + feature: this.actor.system.subclass.system.specializationFeature.unlocked + ? 'mastery' + : 'specialization' + }; + } else { + const choices = [ + { name: this.actor.system.subclass.name, value: this.actor.system.subclass.uuid }, + { + name: this.actor.system.multiclassSubclass.name, + value: this.actor.system.multiclassSubclass.uuid + } + ]; + const indexes = await SelectDialog.selectItem({ + actor: this.actor, + choices: choices, + title: levelChoices.title, + nrChoices: 1 + }); + if (indexes.length === 0) { this.render(); return; } const multiclassSubclass = choices[indexes[0]].name === this.actor.system.multiclassSubclass.name; - updates[0].value.value = { multiclass: multiclassSubclass, feature: this.actor.system.multiclassSubclass.system.specializationFeature.unlocked ? 'mastery' : 'specialization' }; + updates[0].value.value = { + multiclass: multiclassSubclass, + feature: this.actor.system.multiclassSubclass.system.specializationFeature.unlocked + ? 'mastery' + : 'specialization' + }; } - } - else if (button.dataset.levelAttribute === 'multiclass'){ - const multiclassAwait = new Promise((resolve) => { + } else if (button.dataset.levelAttribute === 'multiclass') { + const multiclassAwait = new Promise(resolve => { new DhpMulticlassDialog(this.actor.name, this.actor.system.class, resolve).render(true); }); const multiclassData = await multiclassAwait; - if(!multiclassData) { + if (!multiclassData) { this.render(); return; } const pathParts = path.split('.'); - const arrayPart = pathParts.slice(0, pathParts.length-1).join('.'); - updates[0] = { path: [arrayPart, '0'].join('.'), value: { level: this.activeLevel, value: { class: multiclassData.class, subclass: multiclassData.subclass, domain: multiclassData.domain, level: this.activeLevel } } }; - updates[1] = { path: [arrayPart, '1'].join('.'), value: { level: this.activeLevel, value: { class: multiclassData.class, subclass: multiclassData.subclass, domain: multiclassData.domain, level: this.activeLevel } } }; - } - else { - if(levelChoices.choices.length > 0){ - if(typeof levelChoices.choices === 'string'){ - const choices = foundry.utils.getProperty(this.actor, levelChoices.choices).map(x => ({ name: x.description, value: x.id })); - const indexes = await SelectDialog.selectItem({ actor: this.actor, choices: choices, title: levelChoices.title, nrChoices: levelChoices.nrChoices }); - if(indexes.length === 0) { + const arrayPart = pathParts.slice(0, pathParts.length - 1).join('.'); + updates[0] = { + path: [arrayPart, '0'].join('.'), + value: { + level: this.activeLevel, + value: { + class: multiclassData.class, + subclass: multiclassData.subclass, + domain: multiclassData.domain, + level: this.activeLevel + } + } + }; + updates[1] = { + path: [arrayPart, '1'].join('.'), + value: { + level: this.activeLevel, + value: { + class: multiclassData.class, + subclass: multiclassData.subclass, + domain: multiclassData.domain, + level: this.activeLevel + } + } + }; + } else { + if (levelChoices.choices.length > 0) { + if (typeof levelChoices.choices === 'string') { + const choices = foundry.utils + .getProperty(this.actor, levelChoices.choices) + .map(x => ({ name: x.description, value: x.id })); + const indexes = await SelectDialog.selectItem({ + actor: this.actor, + choices: choices, + title: levelChoices.title, + nrChoices: levelChoices.nrChoices + }); + if (indexes.length === 0) { this.render(); return; } - updates[0].value.value = choices.filter((_, index) => indexes.includes(index)).map(x => x.value); - } - else { - const indexes = await SelectDialog.selectItem({ actor: this.actor, choices: levelChoices.choices, title: levelChoices.title, nrChoices: levelChoices.nrChoices }); - if(indexes.length === 0) { + updates[0].value.value = choices + .filter((_, index) => indexes.includes(index)) + .map(x => x.value); + } else { + const indexes = await SelectDialog.selectItem({ + actor: this.actor, + choices: levelChoices.choices, + title: levelChoices.title, + nrChoices: levelChoices.nrChoices + }); + if (indexes.length === 0) { this.render(); return; } @@ -198,44 +269,57 @@ export default class DhpLevelup extends HandlebarsApplicationMixin(ApplicationV2 this.render(); } - static advanceLevel(){ + static advanceLevel() { this.activeLevel += 1; this.render(); } - static async finishLevelup(){ + static async finishLevelup() { this.data.currentLevel = this.data.changedLevel; let multiclass = null; - for(var level in this.data.levelups){ - for(var tier in this.data.levelups[level]){ - for(var category in this.data.levelups[level][tier]) { - for (var value in this.data.levelups[level][tier][category]){ - if(category === 'multiclass'){ + for (var level in this.data.levelups) { + for (var tier in this.data.levelups[level]) { + for (var category in this.data.levelups[level][tier]) { + for (var value in this.data.levelups[level][tier][category]) { + if (category === 'multiclass') { multiclass = this.data.levelups[level][tier][category][value].value; this.data.levelups[level][tier][category][value] = true; } else { - this.data.levelups[level][tier][category][value] = this.data.levelups[level][tier][category][value].value ?? true; + this.data.levelups[level][tier][category][value] = + this.data.levelups[level][tier][category][value].value ?? true; } } } } } - const tiersMoved = getTier(this.actor.system.levelData.changedLevel, true) - getTier(this.actor.system.levelData.currentLevel, true); - const experiences = Array.from(Array(tiersMoved), (_,index) => ({ id: foundry.utils.randomID(), level: this.actor.system.experiences.length+index*3, description: '', value: 1 })); + const tiersMoved = + getTier(this.actor.system.levelData.changedLevel, true) - + getTier(this.actor.system.levelData.currentLevel, true); + const experiences = Array.from(Array(tiersMoved), (_, index) => ({ + id: foundry.utils.randomID(), + level: this.actor.system.experiences.length + index * 3, + description: '', + value: 1 + })); - await this.actor.update({ system: { - levelData: this.data, - experiences: [...this.actor.system.experiences, ...experiences], - }}, { diff: false }); + await this.actor.update( + { + system: { + levelData: this.data, + experiences: [...this.actor.system.experiences, ...experiences] + } + }, + { diff: false } + ); - if(!this.actor.multiclass && multiclass){ + if (!this.actor.multiclass && multiclass) { const multiclassClass = (await fromUuid(multiclass.class.uuid)).toObject(); multiclassClass.system.domains = [multiclass.domain.id]; multiclassClass.system.multiclass = multiclass.level; const multiclassFeatures = []; - for(var i = 0; i < multiclassClass.system.features.length; i++){ + for (var i = 0; i < multiclassClass.system.features.length; i++) { const feature = (await fromUuid(multiclassClass.system.features[i].uuid)).toObject(); feature.system.multiclass = multiclass.level; multiclassFeatures.push(feature); @@ -243,17 +327,21 @@ export default class DhpLevelup extends HandlebarsApplicationMixin(ApplicationV2 const multiclassSubclass = (await fromUuid(multiclass.subclass.uuid)).toObject(); multiclassSubclass.system.multiclass = multiclass.level; - + const multiclassSubclassFeatures = {}; - const features = [multiclassSubclass.system.foundationFeature, multiclassSubclass.system.specializationFeature, multiclassSubclass.system.masteryFeature]; - for(var i = 0; i < features.length; i++){ + const features = [ + multiclassSubclass.system.foundationFeature, + multiclassSubclass.system.specializationFeature, + multiclassSubclass.system.masteryFeature + ]; + for (var i = 0; i < features.length; i++) { const path = i === 0 ? 'foundationFeature' : i === 1 ? 'specializationFeature' : 'masteryFeature'; const feature = features[i]; - for(var ability of feature.abilities){ + for (var ability of feature.abilities) { const data = (await fromUuid(ability.uuid)).toObject(); - if(i > 0 ) data.system.disabled = true; + if (i > 0) data.system.disabled = true; data.system.multiclass = multiclass.level; - if(!multiclassSubclassFeatures[path]) multiclassSubclassFeatures[path] = [data]; + if (!multiclassSubclassFeatures[path]) multiclassSubclassFeatures[path] = [data]; else multiclassSubclassFeatures[path].push(data); // data.uuid = feature.uuid; @@ -264,18 +352,21 @@ export default class DhpLevelup extends HandlebarsApplicationMixin(ApplicationV2 } } - for(let subclassFeaturesKey in multiclassSubclassFeatures){ + for (let subclassFeaturesKey in multiclassSubclassFeatures) { const values = multiclassSubclassFeatures[subclassFeaturesKey]; const abilityResults = await this.actor.createEmbeddedDocuments('Item', values); - for(var i = 0; i < abilityResults.length; i++){ + for (var i = 0; i < abilityResults.length; i++) { multiclassSubclass.system[subclassFeaturesKey].abilities[i].uuid = abilityResults[i].uuid; } } - await this.actor.createEmbeddedDocuments('Item', [multiclassClass, ...multiclassFeatures, multiclassSubclass]); - } - + await this.actor.createEmbeddedDocuments('Item', [ + multiclassClass, + ...multiclassFeatures, + multiclassSubclass + ]); + } this.close(); } -} \ No newline at end of file +} diff --git a/module/applications/multiclassDialog.mjs b/module/applications/multiclassDialog.mjs index 8fd1b251..fbd0bb56 100644 --- a/module/applications/multiclassDialog.mjs +++ b/module/applications/multiclassDialog.mjs @@ -1,58 +1,60 @@ -const {HandlebarsApplicationMixin, ApplicationV2} = foundry.applications.api; +const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class DhpMulticlassDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(actorName, actorClass, resolve){ + constructor(actorName, actorClass, resolve) { super({}); this.actorName = actorName; this.actorClass = actorClass; this.resolve = resolve; - this.classChoices = Array.from(game.items.reduce((acc, x) => { - if(x.type === 'class' && x.name !== actorClass.name){ - acc.add(x); - } - - return acc; - }, new Set())); + this.classChoices = Array.from( + game.items.reduce((acc, x) => { + if (x.type === 'class' && x.name !== actorClass.name) { + acc.add(x); + } + + return acc; + }, new Set()) + ); this.subclassChoices = []; this.domainChoices = []; this.data = { class: null, subclass: null, - domain: null, + domain: null }; } - get title(){ - return `${this.actorName} - Multiclass`; + get title() { + return `${this.actorName} - Multiclass`; } static DEFAULT_OPTIONS = { - classes: ["daggerheart", "views", "multiclass"], + classes: ['daggerheart', 'views', 'multiclass'], position: { width: 600, height: 'auto' }, actions: { selectClass: this.selectClass, selectSubclass: this.selectSubclass, selectDomain: this.selectDomain, - finish: this.finish, - }, + finish: this.finish + } }; - + static PARTS = { form: { - id: "levelup", - template: "systems/daggerheart/templates/views/multiclass.hbs" + id: 'levelup', + template: 'systems/daggerheart/templates/views/multiclass.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); context.classChoices = this.classChoices; context.subclassChoices = this.subclassChoices; context.domainChoices = this.domainChoices; - context.disabledFinish = !this.data.class || !this.data.subclass || !this.data.domain; + context.disabledFinish = !this.data.class || !this.data.subclass || !this.data.domain; context.data = this.data; return context; @@ -61,38 +63,51 @@ export default class DhpMulticlassDialog extends HandlebarsApplicationMixin(Appl static async selectClass(_, button) { const oldClass = this.data.class; this.data.class = this.data.class?.uuid === button.dataset.class ? null : await fromUuid(button.dataset.class); - if(oldClass !== button.dataset.class){ + if (oldClass !== button.dataset.class) { this.data.subclass = null; this.data.domain = null; this.subclassChoices = this.data.class ? this.data.class.system.subclasses : []; - this.domainChoices = this.data.class ? this.data.class.system.domains.map(x => { - const config = SYSTEM.DOMAIN.domains[x]; - return { name: game.i18n.localize(config.name), id: config.id, img: config.src, disabled: this.actorClass.system.domains.includes(config.id) }; - }) : []; + this.domainChoices = this.data.class + ? this.data.class.system.domains.map(x => { + const config = SYSTEM.DOMAIN.domains[x]; + return { + name: game.i18n.localize(config.name), + id: config.id, + img: config.src, + disabled: this.actorClass.system.domains.includes(config.id) + }; + }) + : []; } this.render(true); } static async selectSubclass(_, button) { - this.data.subclass = this.data.subclass?.uuid === button.dataset.subclass ? null : this.subclassChoices.find(x => x.uuid === button.dataset.subclass); + this.data.subclass = + this.data.subclass?.uuid === button.dataset.subclass + ? null + : this.subclassChoices.find(x => x.uuid === button.dataset.subclass); this.render(true); } static async selectDomain(_, button) { - const domain = this.data.domain?.id === button.dataset.domain ? null : this.domainChoices.find(x => x.id === button.dataset.domain);; - if(domain?.disabled) return; + const domain = + this.data.domain?.id === button.dataset.domain + ? null + : this.domainChoices.find(x => x.id === button.dataset.domain); + if (domain?.disabled) return; - this.data.domain = domain; + this.data.domain = domain; this.render(true); } - static finish(){ + static finish() { this.close({}, this.data); } - async close(options={}, data=null) { + async close(options = {}, data = null) { this.resolve(data); super.close(options); } -} \ No newline at end of file +} diff --git a/module/applications/npcRollSelectionDialog.mjs b/module/applications/npcRollSelectionDialog.mjs index 8f0aa06b..bee3dd16 100644 --- a/module/applications/npcRollSelectionDialog.mjs +++ b/module/applications/npcRollSelectionDialog.mjs @@ -1,76 +1,81 @@ export default class NpcRollSelectionDialog extends FormApplication { - constructor(experiences, resolve, isNpc){ - super({}, {}); + constructor(experiences, resolve, isNpc) { + super({}, {}); - this.experiences = experiences; - this.resolve = resolve; - this.selectedExperiences = []; - this.data = { - nrDice: 1, - advantage: null, - }; - } + this.experiences = experiences; + this.resolve = resolve; + this.selectedExperiences = []; + this.data = { + nrDice: 1, + advantage: null + }; + } - get title (){ - return 'Roll Options'; - } + get title() { + return 'Roll Options'; + } - static get defaultOptions() { - const defaults = super.defaultOptions; - const overrides = { - height: 'auto', - width: 400, - id: 'roll-selection', - template: 'systems/daggerheart/templates/views/npcRollSelection.hbs', - closeOnSubmit: false, - submitOnChange: true, - classes: ["daggerheart", "views", "npc-roll-selection"], - }; - - const mergedOptions = foundry.utils.mergeObject(defaults, overrides); - - return mergedOptions; - } - - async getData(){ - const context = super.getData(); - context.nrDice = this.data.nrDice; - context.advantage = this.data.advantage; - context.experiences = this.experiences.map(x => ({ ...x, selected: this.selectedExperiences.find(selected => selected.id === x.id) })); + static get defaultOptions() { + const defaults = super.defaultOptions; + const overrides = { + height: 'auto', + width: 400, + id: 'roll-selection', + template: 'systems/daggerheart/templates/views/npcRollSelection.hbs', + closeOnSubmit: false, + submitOnChange: true, + classes: ['daggerheart', 'views', 'npc-roll-selection'] + }; - return context; - } + const mergedOptions = foundry.utils.mergeObject(defaults, overrides); - activateListeners(html) { - super.activateListeners(html); + return mergedOptions; + } - html.find('.increase').click(_ => this.updateNrDice(1)); - html.find('.decrease').click(_ => this.updateNrDice(-1)); - html.find('.advantage').click(_ => this.updateIsAdvantage(true)); - html.find('.disadvantage').click(_ => this.updateIsAdvantage(false)); - html.find('.roll-button').click(this.finish.bind(this)); - html.find('.roll-dialog-chip').click(this.selectExperience.bind(this)); - } + async getData() { + const context = super.getData(); + context.nrDice = this.data.nrDice; + context.advantage = this.data.advantage; + context.experiences = this.experiences.map(x => ({ + ...x, + selected: this.selectedExperiences.find(selected => selected.id === x.id) + })); - updateNrDice(value){ - this.data.nrDice += value; - this.render(); - } + return context; + } - updateIsAdvantage(advantage) { - this.data.advantage = this.data.advantage === advantage ? null : advantage; - this.render(); - } + activateListeners(html) { + super.activateListeners(html); - selectExperience(event){ - const experience = this.experiences[event.currentTarget.dataset.key]; - this.selectedExperiences = this.selectedExperiences.find(x => x.name === experience.name) ? this.selectedExperiences.filter(x => x.name !== experience.name) : [...this.selectedExperiences, experience]; + html.find('.increase').click(_ => this.updateNrDice(1)); + html.find('.decrease').click(_ => this.updateNrDice(-1)); + html.find('.advantage').click(_ => this.updateIsAdvantage(true)); + html.find('.disadvantage').click(_ => this.updateIsAdvantage(false)); + html.find('.roll-button').click(this.finish.bind(this)); + html.find('.roll-dialog-chip').click(this.selectExperience.bind(this)); + } - this.render(); - } + updateNrDice(value) { + this.data.nrDice += value; + this.render(); + } - finish(){ - this.resolve({ ...this.data, experiences: this.selectedExperiences }); - this.close(); - } -} \ No newline at end of file + updateIsAdvantage(advantage) { + this.data.advantage = this.data.advantage === advantage ? null : advantage; + this.render(); + } + + selectExperience(event) { + const experience = this.experiences[event.currentTarget.dataset.key]; + this.selectedExperiences = this.selectedExperiences.find(x => x.name === experience.name) + ? this.selectedExperiences.filter(x => x.name !== experience.name) + : [...this.selectedExperiences, experience]; + + this.render(); + } + + finish() { + this.resolve({ ...this.data, experiences: this.selectedExperiences }); + this.close(); + } +} diff --git a/module/applications/rollSelectionDialog.mjs b/module/applications/rollSelectionDialog.mjs index ff6da549..f8e6f218 100644 --- a/module/applications/rollSelectionDialog.mjs +++ b/module/applications/rollSelectionDialog.mjs @@ -1,147 +1,161 @@ const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class RollSelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(experiences, bonusDamage, hopeResource, resolve, isNpc){ - super({}, {}); + constructor(experiences, bonusDamage, hopeResource, resolve, isNpc) { + super({}, {}); - this.experiences = experiences; - this.resolve = resolve; - this.isNpc; - this.selectedExperiences = []; - this.data = { - diceOptions: [{ name: 'd12', value: 'd12' }, { name: 'd20', value: 'd20' }], - hope: ['d12'], - fear: ['d12'], - advantage: null, - disadvantage: null, - bonusDamage: bonusDamage.reduce((acc, x) => { - if(x.appliesOn === SYSTEM.EFFECTS.applyLocations.attackRoll.id){ - acc.push(({ - ...x, - hopeUses: 0 - })); + this.experiences = experiences; + this.resolve = resolve; + this.isNpc; + this.selectedExperiences = []; + this.data = { + diceOptions: [ + { name: 'd12', value: 'd12' }, + { name: 'd20', value: 'd20' } + ], + hope: ['d12'], + fear: ['d12'], + advantage: null, + disadvantage: null, + bonusDamage: bonusDamage.reduce((acc, x) => { + if (x.appliesOn === SYSTEM.EFFECTS.applyLocations.attackRoll.id) { + acc.push({ + ...x, + hopeUses: 0 + }); + } + + return acc; + }, []), + hopeResource: hopeResource + }; + } + + static DEFAULT_OPTIONS = { + tag: 'form', + classes: ['daggerheart', 'views', 'roll-selection'], + position: { + width: 400, + height: 'auto' + }, + actions: { + selectExperience: this.selectExperience, + decreaseHopeUse: this.decreaseHopeUse, + increaseHopeUse: this.increaseHopeUse, + setAdvantage: this.setAdvantage, + setDisadvantage: this.setDisadvantage, + finish: this.finish + }, + form: { + handler: this.updateSelection, + submitOnChange: true, + submitOnClose: false } - - return acc; - }, []), - hopeResource: hopeResource, }; - } - static DEFAULT_OPTIONS = { - tag: 'form', - classes: ["daggerheart", "views", "roll-selection"], - position: { - width: 400, - height: "auto" - }, - actions: { - selectExperience: this.selectExperience, - decreaseHopeUse: this.decreaseHopeUse, - increaseHopeUse: this.increaseHopeUse, - setAdvantage: this.setAdvantage, - setDisadvantage: this.setDisadvantage, - finish: this.finish, - }, - form: { - handler: this.updateSelection, - submitOnChange: true, - submitOnClose: false, - } - }; - - /** @override */ - static PARTS = { - damageSelection: { - id: "damageSelection", - template: "systems/daggerheart/templates/views/rollSelection.hbs" - } - } + /** @override */ + static PARTS = { + damageSelection: { + id: 'damageSelection', + template: 'systems/daggerheart/templates/views/rollSelection.hbs' + } + }; - get title() { - return `Roll Options`; - } + get title() { + return `Roll Options`; + } - async _prepareContext(_options) { - const context = await super._prepareContext(_options); - context.isNpc = this.isNpc; - context.diceOptions = this.data.diceOptions; - context.hope = this.data.hope; - context.fear = this.data.fear; - context.advantage = this.data.advantage; - context.disadvantage = this.data.disadvantage; - context.experiences = this.experiences.map(x => ({ ...x, selected: this.selectedExperiences.find(selected => selected.id === x.id) })); - context.bonusDamage = this.data.bonusDamage; - context.hopeResource = this.data.hopeResource+1; - context.hopeUsed = this.getHopeUsed(); + async _prepareContext(_options) { + const context = await super._prepareContext(_options); + context.isNpc = this.isNpc; + context.diceOptions = this.data.diceOptions; + context.hope = this.data.hope; + context.fear = this.data.fear; + context.advantage = this.data.advantage; + context.disadvantage = this.data.disadvantage; + context.experiences = this.experiences.map(x => ({ + ...x, + selected: this.selectedExperiences.find(selected => selected.id === x.id) + })); + context.bonusDamage = this.data.bonusDamage; + context.hopeResource = this.data.hopeResource + 1; + context.hopeUsed = this.getHopeUsed(); - return context; - } + return context; + } - static updateSelection(event, _, formData){ - const { bonusDamage, ...rest } = foundry.utils.expandObject(formData.object); - - for(var index in bonusDamage){ - this.data.bonusDamage[index].initiallySelected = bonusDamage[index].initiallySelected; - if(bonusDamage[index].hopeUses){ - const value = Number.parseInt(bonusDamage[index].hopeUses); - if(!Number.isNaN(value)) this.data.bonusDamage[index].hopeUses = value; + static updateSelection(event, _, formData) { + const { bonusDamage, ...rest } = foundry.utils.expandObject(formData.object); + + for (var index in bonusDamage) { + this.data.bonusDamage[index].initiallySelected = bonusDamage[index].initiallySelected; + if (bonusDamage[index].hopeUses) { + const value = Number.parseInt(bonusDamage[index].hopeUses); + if (!Number.isNaN(value)) this.data.bonusDamage[index].hopeUses = value; + } + } + + this.data = foundry.utils.mergeObject(this.data, rest); + this.render(); + } + + static selectExperience(_, button) { + if (this.selectedExperiences.find(x => x.id === button.dataset.key)) { + this.selectedExperiences = this.selectedExperiences.filter(x => x.id !== button.dataset.key); + } else { + this.selectedExperiences = [ + ...this.selectedExperiences, + this.experiences.find(x => x.id === button.dataset.key) + ]; + } + + this.render(); + } + + getHopeUsed() { + return this.data.bonusDamage.reduce((acc, x) => acc + x.hopeUses, 0); + } + + static decreaseHopeUse(_, button) { + const index = Number.parseInt(button.dataset.index); + if (this.data.bonusDamage[index].hopeUses - 1 >= 0) { + this.data.bonusDamage[index].hopeUses -= 1; + this.render(true); } } - this.data = foundry.utils.mergeObject(this.data, rest); - this.render(); - } - - static selectExperience(_, button){ - if(this.selectedExperiences.find(x => x.id === button.dataset.key)){ - this.selectedExperiences = this.selectedExperiences.filter(x => x.id !== button.dataset.key); - } else { - this.selectedExperiences = [...this.selectedExperiences, this.experiences.find(x => x.id === button.dataset.key)]; + static increaseHopeUse(_, button) { + const index = Number.parseInt(button.dataset.index); + if (this.data.bonusDamage[index].hopeUses <= this.data.hopeResource + 1) { + this.data.bonusDamage[index].hopeUses += 1; + this.render(true); + } } - this.render(); - } + static setAdvantage() { + this.data.advantage = this.data.advantage ? null : 'd6'; + this.data.disadvantage = null; - getHopeUsed(){ - return this.data.bonusDamage.reduce((acc, x) => acc+x.hopeUses, 0); - } + this.render(true); + } - static decreaseHopeUse(_, button){ - const index = Number.parseInt(button.dataset.index); - if(this.data.bonusDamage[index].hopeUses - 1 >= 0) { - this.data.bonusDamage[index].hopeUses -= 1; - this.render(true); - } - } + static setDisadvantage() { + this.data.advantage = null; + this.data.disadvantage = this.data.disadvantage ? null : 'd6'; - static increaseHopeUse(_, button){ - const index = Number.parseInt(button.dataset.index); - if(this.data.bonusDamage[index].hopeUses <= this.data.hopeResource+1) { - this.data.bonusDamage[index].hopeUses += 1; - this.render(true); - } - } + this.render(true); + } - static setAdvantage(){ - this.data.advantage = this.data.advantage ? null : 'd6'; - this.data.disadvantage = null; - - this.render(true); - } - - static setDisadvantage(){ - this.data.advantage = null; - this.data.disadvantage = this.data.disadvantage ? null : 'd6'; - - this.render(true); - } - - static async finish(){ - const { diceOptions, ...rest } = this.data; - this.resolve({ ...rest, experiences: this.selectedExperiences, hopeUsed: this.getHopeUsed(), bonusDamage: this.data.bonusDamage.reduce((acc, x) => acc.concat(` + ${1+x.hopeUses}${x.value}`), "") }); - this.close(); - } + static async finish() { + const { diceOptions, ...rest } = this.data; + this.resolve({ + ...rest, + experiences: this.selectedExperiences, + hopeUsed: this.getHopeUsed(), + bonusDamage: this.data.bonusDamage.reduce((acc, x) => acc.concat(` + ${1 + x.hopeUses}${x.value}`), '') + }); + this.close(); + } } // V1.3 @@ -194,7 +208,7 @@ export default class RollSelectionDialog extends HandlebarsApplicationMixin(Appl // closeOnSubmit: false, // } // }; - + // /** @override */ // static PARTS = { // damageSelection: { @@ -225,7 +239,7 @@ export default class RollSelectionDialog extends HandlebarsApplicationMixin(Appl // static updateSelection(event, _, formData){ // const { bonusDamage, ...rest } = foundry.utils.expandObject(formData.object); - + // for(var index in bonusDamage){ // this.data.bonusDamage[index].initiallySelected = bonusDamage[index].initiallySelected; // if(bonusDamage[index].hopeUses){ @@ -273,4 +287,4 @@ export default class RollSelectionDialog extends HandlebarsApplicationMixin(Appl // this.resolve({ ...rest, experiences: this.selectedExperiences, hopeUsed: this.getHopeUsed(), bonusDamage: this.data.bonusDamage.reduce((acc, x) => acc.concat(` + ${1+x.hopeUses}${x.value}`), "") }); // this.close(); // } -// } \ No newline at end of file +// } diff --git a/module/applications/settings.mjs b/module/applications/settings.mjs index 94fd651f..1c2613f1 100644 --- a/module/applications/settings.mjs +++ b/module/applications/settings.mjs @@ -1,26 +1,26 @@ class DhpAutomationSettings extends FormApplication { - constructor(object={}, options={}){ + constructor(object = {}, options = {}) { super(object, options); } static get defaultOptions() { const defaults = super.defaultOptions; const overrides = { - height: 'auto', - width: 400, - id: 'daggerheart-automation-settings', - template: 'systems/daggerheart/templates/views/automation-settings.hbs', - closeOnSubmit: true, - submitOnChange: false, - classes: ["daggerheart", "views", "settings"], + height: 'auto', + width: 400, + id: 'daggerheart-automation-settings', + template: 'systems/daggerheart/templates/views/automation-settings.hbs', + closeOnSubmit: true, + submitOnChange: false, + classes: ['daggerheart', 'views', 'settings'] }; - + const mergedOptions = foundry.utils.mergeObject(defaults, overrides); - + return mergedOptions; } - - async getData(){ + + async getData() { const context = super.getData(); context.settings = SYSTEM.SETTINGS.gameSettings.Automation; context.hope = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope); @@ -36,35 +36,35 @@ class DhpAutomationSettings extends FormApplication { async _updateObject(_, formData) { const data = foundry.utils.expandObject(formData); const updateSettingsKeys = Object.keys(data); - for(var i = 0; i < updateSettingsKeys.length; i++){ + for (var i = 0; i < updateSettingsKeys.length; i++) { await game.settings.set(SYSTEM.id, updateSettingsKeys[i], data[updateSettingsKeys[i]]); } } } class DhpHomebrewSettings extends FormApplication { - constructor(object={}, options={}){ + constructor(object = {}, options = {}) { super(object, options); } static get defaultOptions() { const defaults = super.defaultOptions; const overrides = { - height: 'auto', - width: 400, - id: 'daggerheart-homebrew-settings', - template: 'systems/daggerheart/templates/views/homebrew-settings.hbs', - closeOnSubmit: true, - submitOnChange: false, - classes: ["daggerheart", "views", "settings"], + height: 'auto', + width: 400, + id: 'daggerheart-homebrew-settings', + template: 'systems/daggerheart/templates/views/homebrew-settings.hbs', + closeOnSubmit: true, + submitOnChange: false, + classes: ['daggerheart', 'views', 'settings'] }; - + const mergedOptions = foundry.utils.mergeObject(defaults, overrides); - + return mergedOptions; } - - async getData(){ + + async getData() { const context = super.getData(); context.settings = SYSTEM.SETTINGS.gameSettings.General; context.abilityArray = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.AbilityArray); @@ -79,14 +79,14 @@ class DhpHomebrewSettings extends FormApplication { async _updateObject(_, formData) { const data = foundry.utils.expandObject(formData); const updateSettingsKeys = Object.keys(data); - for(var i = 0; i < updateSettingsKeys.length; i++){ + for (var i = 0; i < updateSettingsKeys.length; i++) { await game.settings.set(SYSTEM.id, updateSettingsKeys[i], data[updateSettingsKeys[i]]); } } } class DhpRangeSettings extends FormApplication { - constructor(object={}, options={}){ + constructor(object = {}, options = {}) { super(object, options); this.range = game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.RangeMeasurement); @@ -95,25 +95,33 @@ class DhpRangeSettings extends FormApplication { static get defaultOptions() { const defaults = super.defaultOptions; const overrides = { - height: 'auto', - width: 400, - id: 'daggerheart-range-settings', - template: 'systems/daggerheart/templates/views/range-settings.hbs', - closeOnSubmit: false, - submitOnChange: true, - classes: ["daggerheart", "views", "settings"], + height: 'auto', + width: 400, + id: 'daggerheart-range-settings', + template: 'systems/daggerheart/templates/views/range-settings.hbs', + closeOnSubmit: false, + submitOnChange: true, + classes: ['daggerheart', 'views', 'settings'] }; - + const mergedOptions = foundry.utils.mergeObject(defaults, overrides); - + return mergedOptions; } - - async getData(){ + + async getData() { const context = super.getData(); context.settings = SYSTEM.SETTINGS.gameSettings.General; context.range = this.range; - context.disabled = context.range.enabled && [context.range.melee, context.range.veryClose, context.range.close, context.range.far, context.range.veryFar].some(x => x === null || x === false); + context.disabled = + context.range.enabled && + [ + context.range.melee, + context.range.veryClose, + context.range.close, + context.range.far, + context.range.veryFar + ].some(x => x === null || x === false); return context; } @@ -121,9 +129,9 @@ class DhpRangeSettings extends FormApplication { activateListeners(html) { super.activateListeners(html); - html.find(".range-reset").click(this.reset.bind(this)); - html.find(".save").click(this.save.bind(this)); - html.find(".close").click(this.close.bind(this)); + html.find('.range-reset').click(this.reset.bind(this)); + html.find('.save').click(this.save.bind(this)); + html.find('.close').click(this.close.bind(this)); } async _updateObject(_, formData) { @@ -132,7 +140,7 @@ class DhpRangeSettings extends FormApplication { this.render(true); } - reset(){ + reset() { this.range = { enabled: false, melee: 5, @@ -144,7 +152,7 @@ class DhpRangeSettings extends FormApplication { this.render(true); } - async save(){ + async save() { await game.settings.set(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.RangeMeasurement, this.range); this.close(); } @@ -154,44 +162,44 @@ export const registerDHPSettings = () => { // const debouncedReload = foundry.utils.debounce(() => window.location.reload(), 100); game.settings.register(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.AbilityArray, { - name: game.i18n.localize("DAGGERHEART.Settings.General.AbilityArray.Name"), - hint: game.i18n.localize("DAGGERHEART.Settings.General.AbilityArray.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.General.AbilityArray.Name'), + hint: game.i18n.localize('DAGGERHEART.Settings.General.AbilityArray.Hint'), scope: 'world', config: false, type: String, - default: '[2,1,1,0,0,-1]', + default: '[2,1,1,0,0,-1]' }); game.settings.register(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear, { - name: game.i18n.localize("DAGGERHEART.Settings.Resources.Fear.Name"), - hint: game.i18n.localize("DAGGERHEART.Settings.Resources.Fear.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.Resources.Fear.Name'), + hint: game.i18n.localize('DAGGERHEART.Settings.Resources.Fear.Hint'), scope: 'world', config: false, type: Number, - default: 0, + default: 0 }); game.settings.register(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope, { - name: game.i18n.localize("DAGGERHEART.Settings.Automation.Hope.Name"), - hint: game.i18n.localize("DAGGERHEART.Settings.Automation.Hope.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.Automation.Hope.Name'), + hint: game.i18n.localize('DAGGERHEART.Settings.Automation.Hope.Hint'), scope: 'world', config: false, type: Boolean, - default: false, + default: false }); game.settings.register(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.ActionPoints, { - name: game.i18n.localize("DAGGERHEART.Settings.Automation.ActionPoints.Name"), - hint: game.i18n.localize("DAGGERHEART.Settings.Automation.ActionPoints.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.Automation.ActionPoints.Name'), + hint: game.i18n.localize('DAGGERHEART.Settings.Automation.ActionPoints.Hint'), scope: 'world', config: false, type: Boolean, - default: true, + default: true }); game.settings.register(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.RangeMeasurement, { - name: game.i18n.localize("DAGGERHEART.Settings.General.RangeMeasurement.Name"), - hint: game.i18n.localize("DAGGERHEART.Settings.General.RangeMeasurement.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.General.RangeMeasurement.Name'), + hint: game.i18n.localize('DAGGERHEART.Settings.General.RangeMeasurement.Hint'), scope: 'world', config: false, type: Object, @@ -202,35 +210,34 @@ export const registerDHPSettings = () => { close: 30, far: 60, veryFar: 120 - }, + } }); game.settings.registerMenu(SYSTEM.id, SYSTEM.SETTINGS.menu.Automation.Name, { - name: game.i18n.localize("DAGGERHEART.Settings.Menu.Automation.Name"), - label: game.i18n.localize("DAGGERHEART.Settings.Menu.Automation.Label"), - hint: game.i18n.localize("DAGGERHEART.Settings.Menu.Automation.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.Menu.Automation.Name'), + label: game.i18n.localize('DAGGERHEART.Settings.Menu.Automation.Label'), + hint: game.i18n.localize('DAGGERHEART.Settings.Menu.Automation.Hint'), icon: SYSTEM.SETTINGS.menu.Automation.Icon, type: DhpAutomationSettings, restricted: true - }); + }); game.settings.registerMenu(SYSTEM.id, SYSTEM.SETTINGS.menu.Homebrew.Name, { - name: game.i18n.localize("DAGGERHEART.Settings.Menu.Homebrew.Name"), - label: game.i18n.localize("DAGGERHEART.Settings.Menu.Homebrew.Label"), - hint: game.i18n.localize("DAGGERHEART.Settings.Menu.Homebrew.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.Menu.Homebrew.Name'), + label: game.i18n.localize('DAGGERHEART.Settings.Menu.Homebrew.Label'), + hint: game.i18n.localize('DAGGERHEART.Settings.Menu.Homebrew.Hint'), icon: SYSTEM.SETTINGS.menu.Homebrew.Icon, type: DhpHomebrewSettings, restricted: true }); game.settings.registerMenu(SYSTEM.id, SYSTEM.SETTINGS.menu.Range.Name, { - name: game.i18n.localize("DAGGERHEART.Settings.Menu.Range.Name"), - label: game.i18n.localize("DAGGERHEART.Settings.Menu.Range.Label"), - hint: game.i18n.localize("DAGGERHEART.Settings.Menu.Range.Hint"), + name: game.i18n.localize('DAGGERHEART.Settings.Menu.Range.Name'), + label: game.i18n.localize('DAGGERHEART.Settings.Menu.Range.Label'), + hint: game.i18n.localize('DAGGERHEART.Settings.Menu.Range.Hint'), icon: SYSTEM.SETTINGS.menu.Range.Icon, type: DhpRangeSettings, restricted: true }); -} - +}; // const {HandlebarsApplicationMixin, ApplicationV2} = foundry.applications.api; @@ -246,7 +253,7 @@ export const registerDHPSettings = () => { // } // get title(){ -// return game.i18n.localize("DAGGERHEART.Application.Settings.Title"); +// return game.i18n.localize("DAGGERHEART.Application.Settings.Title"); // } // static DEFAULT_OPTIONS = { @@ -258,7 +265,7 @@ export const registerDHPSettings = () => { // }, // form: { handler: this.updateData } // }; - + // static PARTS = { // application: { // id: "settings", @@ -279,4 +286,4 @@ export const registerDHPSettings = () => { // static close(){ // super.close(); // } -// } \ No newline at end of file +// } diff --git a/module/applications/sheets/adversary.mjs b/module/applications/sheets/adversary.mjs index f13480f2..25afe393 100644 --- a/module/applications/sheets/adversary.mjs +++ b/module/applications/sheets/adversary.mjs @@ -1,4 +1,3 @@ - // import DhpApplicationMixin from '../daggerheart-sheet.mjs'; // export class Teest extends DhpApplicationMixin(ActorSheet) { @@ -33,10 +32,10 @@ // type: game.i18n.localize(SYSTEM.ACTOR.adversaryTypes[this.object.system.type].name), // attack: { // name: this.object.system.attack.name, -// attackModifier: this.object.system.attackModifier, +// attackModifier: this.object.system.attackModifier, // range: this.object.system.attack.range ? game.i18n.localize(SYSTEM.GENERAL.range[this.object.system.attack.range].name) : null, // damage: { -// value: this.object.system.attack.damage.value, +// value: this.object.system.attack.damage.value, // type: this.object.system.attack.damage.type, // typeName: this.object.system.attack.damage.type ? game.i18n.localize(SYSTEM.GENERAL.damageTypes[this.object.system.attack.damage.type].abbreviation).toLowerCase() : null, // }, @@ -68,7 +67,7 @@ // case 'addMotive': // await this.addMotive(); // break; -// case 'removeMotive': +// case 'removeMotive': // await this.removeMotive(button); // break; // case 'reactionRoll': @@ -138,7 +137,7 @@ // content: "systems/daggerheart/templates/chat/adversary-roll.hbs", // rolls: [roll] // }); - + // cls.create(msg.toObject()); // } @@ -169,7 +168,7 @@ // content: "systems/daggerheart/templates/chat/adversary-attack-roll.hbs", // rolls: [roll] // }); - + // cls.create(msg.toObject()); // } @@ -198,16 +197,16 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ActorSheetV2 } = foundry.applications.sheets; export default class AdversarySheet extends DaggerheartSheet(ActorSheetV2) { - constructor(options={}){ + constructor(options = {}) { super(options); this.editMode = false; } - + static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-adversary", - classes: ["daggerheart", "sheet", "adversary"], + id: 'daggerheart-adversary', + classes: ['daggerheart', 'sheet', 'adversary'], position: { width: 600 }, actions: { viewMove: this.viewMove, @@ -221,21 +220,21 @@ export default class AdversarySheet extends DaggerheartSheet(ActorSheetV2) { addExperience: this.addExperience, removeExperience: this.removeExperience, toggleHP: this.toggleHP, - toggleStress: this.toggleStress, + toggleStress: this.toggleStress }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, - }, + closeOnSubmit: false + } }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/adversary.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/adversary.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -251,93 +250,119 @@ export default class AdversarySheet extends DaggerheartSheet(ActorSheetV2) { type: game.i18n.localize(SYSTEM.ACTOR.adversaryTypes[this.document.system.type].name), attack: { name: this.document.system.attack.name, - attackModifier: this.document.system.attackModifier, - range: this.document.system.attack.range ? game.i18n.localize(SYSTEM.GENERAL.range[this.document.system.attack.range].name) : null, + attackModifier: this.document.system.attackModifier, + range: this.document.system.attack.range + ? game.i18n.localize(SYSTEM.GENERAL.range[this.document.system.attack.range].name) + : null, damage: { - value: this.document.system.attack.damage.value, + value: this.document.system.attack.damage.value, type: this.document.system.attack.damage.type, - typeName: this.document.system.attack.damage.type ? game.i18n.localize(SYSTEM.GENERAL.damageTypes[this.document.system.attack.damage.type].abbreviation).toLowerCase() : null, - }, + typeName: this.document.system.attack.damage.type + ? game.i18n + .localize( + SYSTEM.GENERAL.damageTypes[this.document.system.attack.damage.type].abbreviation + ) + .toLowerCase() + : null + } }, damageThresholds: this.document.system.damageThresholds, difficulty: this.document.system.difficulty, - hp: { ...this.document.system.resources.health, lastRowIndex: Math.floor(this.document.system.resources.health.max/5)*5 }, - stress: { ...this.document.system.resources.stress, lastRowIndex: Math.floor(this.document.system.resources.stress.max/5)*5 }, - moves: this.document.system.moves, + hp: { + ...this.document.system.resources.health, + lastRowIndex: Math.floor(this.document.system.resources.health.max / 5) * 5 + }, + stress: { + ...this.document.system.resources.stress, + lastRowIndex: Math.floor(this.document.system.resources.stress.max / 5) * 5 + }, + moves: this.document.system.moves }; return context; } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - static async viewMove(_, button){ + static async viewMove(_, button) { const move = await fromUuid(button.dataset.move); move.sheet.render(true); } - static async addMove(){ - const result = await this.document.createEmbeddedDocuments("Item", [{ - name: game.i18n.localize('DAGGERHEART.Sheets.Adversary.NewMove'), - type: 'feature', - }]); + static async addMove() { + const result = await this.document.createEmbeddedDocuments('Item', [ + { + name: game.i18n.localize('DAGGERHEART.Sheets.Adversary.NewMove'), + type: 'feature' + } + ]); await result[0].sheet.render(true); } - static async removeMove(_, button){ + static async removeMove(_, button) { await this.document.items.find(x => x.uuid === button.dataset.move).delete(); } - static toggleEditMode(){ + static toggleEditMode() { this.editMode = !this.editMode; this.render(); } - static async addMotive(){ - await this.document.update({ "system.motivesAndTactics": [...this.document.system.motivesAndTactics, ''] }); + static async addMotive() { + await this.document.update({ 'system.motivesAndTactics': [...this.document.system.motivesAndTactics, ''] }); } - static async removeMotive(button){ - await this.document.update({ "system.motivesAndTactics": this.document.system.motivesAndTactics.filter((_, index) => index !== Number.parseInt(button.dataset.motive) )}); + static async removeMotive(button) { + await this.document.update({ + 'system.motivesAndTactics': this.document.system.motivesAndTactics.filter( + (_, index) => index !== Number.parseInt(button.dataset.motive) + ) + }); } - static async reactionRoll(event){ - const { roll, diceResults, modifiers } = await this.actor.diceRoll({ title: `${this.actor.name} - Reaction Roll`, value: 0 }, event.shiftKey); + static async reactionRoll(event) { + const { roll, diceResults, modifiers } = await this.actor.diceRoll( + { title: `${this.actor.name} - Reaction Roll`, value: 0 }, + event.shiftKey + ); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ type: 'adversaryRoll', system: { roll: roll._formula, total: roll._total, modifiers: modifiers, - diceResults: diceResults, + diceResults: diceResults }, - content: "systems/daggerheart/templates/chat/adversary-roll.hbs", + content: 'systems/daggerheart/templates/chat/adversary-roll.hbs', rolls: [roll] }); - + cls.create(msg.toObject()); } - static async attackRoll(event, button){ + static async attackRoll(event, button) { const modifier = Number.parseInt(button.dataset.value); - const { roll, diceResults, modifiers } = await this.actor.diceRoll({ title: `${this.actor.name} - Attack Roll`, value: modifier }, event.shiftKey); + const { roll, diceResults, modifiers } = await this.actor.diceRoll( + { title: `${this.actor.name} - Attack Roll`, value: modifier }, + event.shiftKey + ); const targets = Array.from(game.user.targets).map(x => ({ id: x.id, name: x.actor.name, img: x.actor.img, difficulty: x.actor.system.difficulty, - evasion: x.actor.system.evasion, + evasion: x.actor.system.evasion })); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ type: 'adversaryRoll', system: { @@ -346,32 +371,38 @@ export default class AdversarySheet extends DaggerheartSheet(ActorSheetV2) { modifiers: modifiers, diceResults: diceResults, targets: targets, - damage: { value: button.dataset.damage, type: button.dataset.damageType }, + damage: { value: button.dataset.damage, type: button.dataset.damageType } }, - content: "systems/daggerheart/templates/chat/adversary-attack-roll.hbs", + content: 'systems/daggerheart/templates/chat/adversary-attack-roll.hbs', rolls: [roll] }); - + cls.create(msg.toObject()); } - static async addExperience(){ - await this.document.update({ "system.experiences": [...this.document.system.experiences, { name: 'Experience', value: 1 }] }); + static async addExperience() { + await this.document.update({ + 'system.experiences': [...this.document.system.experiences, { name: 'Experience', value: 1 }] + }); } - static async removeExperience(_, button){ - await this.document.update({ "system.experiences": this.document.system.experiences.filter((_, index) => index !== Number.parseInt(button.dataset.experience) )}); + static async removeExperience(_, button) { + await this.document.update({ + 'system.experiences': this.document.system.experiences.filter( + (_, index) => index !== Number.parseInt(button.dataset.experience) + ) + }); } - static async toggleHP(_, button){ + static async toggleHP(_, button) { const index = Number.parseInt(button.dataset.index); - const newHP = index < this.document.system.resources.health.value ? index : index+1; - await this.document.update({ "system.resources.health.value": newHP }); + const newHP = index < this.document.system.resources.health.value ? index : index + 1; + await this.document.update({ 'system.resources.health.value': newHP }); } - static async toggleStress(_, button){ + static async toggleStress(_, button) { const index = Number.parseInt(button.dataset.index); - const newStress = index < this.document.system.resources.stress.value ? index : index+1; - await this.document.update({ "system.resources.stress.value": newStress }); + const newStress = index < this.document.system.resources.stress.value ? index : index + 1; + await this.document.update({ 'system.resources.stress.value': newStress }); } -} \ No newline at end of file +} diff --git a/module/applications/sheets/ancestry.mjs b/module/applications/sheets/ancestry.mjs index b71b1508..b890f788 100644 --- a/module/applications/sheets/ancestry.mjs +++ b/module/applications/sheets/ancestry.mjs @@ -24,13 +24,12 @@ // return context; // } - // async _handleAction(action, event, button) { // switch(action){ // case 'editAbility': // this.editAbility(button); // break; -// case 'deleteAbility': +// case 'deleteAbility': // this.deleteAbility(event); // break; // } @@ -59,30 +58,30 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ItemSheetV2 } = foundry.applications.sheets; -export default class AncestrySheet extends DaggerheartSheet(ItemSheetV2) { +export default class AncestrySheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-ancestry", - classes: ["daggerheart", "sheet", "heritage"], + id: 'daggerheart-ancestry', + classes: ['daggerheart', 'sheet', 'heritage'], position: { width: 600 }, actions: { editAbility: this.editAbility, - deleteAbility: this.deleteAbility, + deleteAbility: this.deleteAbility }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false }, - dragDrop: [{ dragSelector: null, dropSelector: null }], + dragDrop: [{ dragSelector: null, dropSelector: null }] }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/ancestry.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/ancestry.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -92,26 +91,33 @@ export default class AncestrySheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - static async editAbility(_, button){ + static async editAbility(_, button) { const feature = await fromUuid(button.dataset.ability); feature.sheet.render(true); } - static async deleteAbility(event, button){ + static async deleteAbility(event, button) { event.preventDefault(); event.stopPropagation(); - await this.item.update({ "system.abilities": this.item.system.abilities.filter(x => x.uuid !== button.dataset.ability) }) + await this.item.update({ + 'system.abilities': this.item.system.abilities.filter(x => x.uuid !== button.dataset.ability) + }); } async _onDrop(event) { const data = TextEditor.getDragEventData(event); const item = await fromUuid(data.uuid); - if(item.type === 'feature' && item.system.type === SYSTEM.ITEM.featureTypes.ancestry.id) { - await this.document.update({ "system.abilities": [...this.document.system.abilities, { img: item.img, name: item.name, uuid: item.uuid }] }); + if (item.type === 'feature' && item.system.type === SYSTEM.ITEM.featureTypes.ancestry.id) { + await this.document.update({ + 'system.abilities': [ + ...this.document.system.abilities, + { img: item.img, name: item.name, uuid: item.uuid } + ] + }); } } -} \ No newline at end of file +} diff --git a/module/applications/sheets/armor.mjs b/module/applications/sheets/armor.mjs index 2be493dd..54404804 100644 --- a/module/applications/sheets/armor.mjs +++ b/module/applications/sheets/armor.mjs @@ -20,7 +20,6 @@ // return context; // } - // async _handleAction(action, event, button) { // switch(action){ // } @@ -29,26 +28,26 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ItemSheetV2 } = foundry.applications.sheets; -export default class ArmorSheet extends DaggerheartSheet(ItemSheetV2) { +export default class ArmorSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-armor", - classes: ["daggerheart", "sheet", "armor"], + id: 'daggerheart-armor', + classes: ['daggerheart', 'sheet', 'armor'], position: { width: 400 }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false }, - dragDrop: [{ dragSelector: null, dropSelector: null }], + dragDrop: [{ dragSelector: null, dropSelector: null }] }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/armor.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/armor.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -59,7 +58,7 @@ export default class ArmorSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } -} \ No newline at end of file +} diff --git a/module/applications/sheets/class.mjs b/module/applications/sheets/class.mjs index d75e2dac..94788db2 100644 --- a/module/applications/sheets/class.mjs +++ b/module/applications/sheets/class.mjs @@ -40,17 +40,17 @@ // const domainTagify = new Tagify(domainInput, { // tagTextProp: "name", // enforceWhitelist: true, -// whitelist : Object.keys(SYSTEM.DOMAIN.domains).map(key => { +// whitelist : Object.keys(SYSTEM.DOMAIN.domains).map(key => { // const domain = SYSTEM.DOMAIN.domains[key]; // return { value: key, name: game.i18n.localize(domain.name), src: domain.src, background: domain.background }; // }), // maxTags: 2, -// callbacks : { invalid: this.onAddTag }, +// callbacks : { invalid: this.onAddTag }, // dropdown : { // mapValueTo: 'name', // searchKeys: ['name'], -// enabled: 0, -// maxItems: 20, +// enabled: 0, +// maxItems: 20, // closeOnSelect : true, // highlightFirst: false, // }, @@ -61,7 +61,7 @@ // spellcheck='false' // tabIndex="${this.settings.a11y.focusableTags ? 0 : -1}" // class="${this.settings.classNames.tag} ${tagData.class ? tagData.class : ""}" -// ${this.getAttributes(tagData)}> +// ${this.getAttributes(tagData)}> // //
// ${tagData[this.settings.tagTextProp] || tagData.value} @@ -70,16 +70,16 @@ // `; // }} // }); - + // domainTagify.on('change', this.onDomainSelect.bind(this)); -// } +// } // onAddTag(e){ // if( e.detail.index ===2 ){ // ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.ClassCanOnlyHaveTwoDomains")); // } // } - + // async onDomainSelect(event) { // const domains = event.detail?.value ? JSON.parse(event.detail.value) : []; // await this.object.update({ "system.domains": domains.map(x => x.value) }); @@ -170,7 +170,7 @@ // super._onDragStart(event); // } - + // async _onDrop(event) { // const data = TextEditor.getDragEventData(event); // const item = await fromUuid(data.uuid); @@ -210,14 +210,14 @@ // } import DaggerheartSheet from './daggerheart-sheet.mjs'; -import Tagify from "@yaireo/tagify"; +import Tagify from '@yaireo/tagify'; const { ItemSheetV2 } = foundry.applications.sheets; export default class ClassSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-class", - classes: ["daggerheart", "sheet", "class"], + id: 'daggerheart-class', + classes: ['daggerheart', 'sheet', 'class'], position: { width: 600 }, actions: { removeSubclass: this.removeSubclass, @@ -228,13 +228,12 @@ export default class ClassSheet extends DaggerheartSheet(ItemSheetV2) { viewItem: this.viewItem, removePrimaryWeapon: this.removePrimaryWeapon, removeSecondaryWeapon: this.removeSecondaryWeapon, - removeArmor: this.removeArmor, - + removeArmor: this.removeArmor }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false }, dragDrop: [ { dragSelector: '.suggested-item', dropSelector: null }, @@ -244,25 +243,39 @@ export default class ClassSheet extends DaggerheartSheet(ItemSheetV2) { { dragSelector: null, dropSelector: '.primary-weapon-section' }, { dragSelector: null, dropSelector: '.secondary-weapon-section' }, { dragSelector: null, dropSelector: '.armor-section' }, - { dragSelector: null, dropSelector: null }, + { dragSelector: null, dropSelector: null } ] }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/class.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/class.hbs' } - } + }; _getTabs() { const tabs = { - features: { active: true, cssClass: '', group: 'primary', id: 'features', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Class.Tabs.Features') }, - guide: { active: false, cssClass: '', group: 'primary', id: 'guide', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Class.Tabs.Guide') }, - } - for ( const v of Object.values(tabs) ) { + features: { + active: true, + cssClass: '', + group: 'primary', + id: 'features', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.Class.Tabs.Features') + }, + guide: { + active: false, + cssClass: '', + group: 'primary', + id: 'guide', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.Class.Tabs.Guide') + } + }; + for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; - v.cssClass = v.active ? "active" : ""; + v.cssClass = v.active ? 'active' : ''; } return tabs; @@ -270,32 +283,38 @@ export default class ClassSheet extends DaggerheartSheet(ItemSheetV2) { _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); - + const domainInput = htmlElement.querySelector('.domain-input'); const domainTagify = new Tagify(domainInput, { - tagTextProp: "name", - enforceWhitelist: true, - whitelist : Object.keys(SYSTEM.DOMAIN.domains).map(key => { - const domain = SYSTEM.DOMAIN.domains[key]; - return { value: key, name: game.i18n.localize(domain.label), src: domain.src, background: domain.background }; - }), - maxTags: 2, - callbacks : { invalid: this.onAddTag }, - dropdown : { - mapValueTo: 'name', - searchKeys: ['name'], - enabled: 0, - maxItems: 20, - closeOnSelect : true, - highlightFirst: false, - }, - templates: { - tag(tagData){ //z-index: unset; background-image: ${tagData.background}; Maybe a domain specific background for the chips? - return ` { + const domain = SYSTEM.DOMAIN.domains[key]; + return { + value: key, + name: game.i18n.localize(domain.label), + src: domain.src, + background: domain.background + }; + }), + maxTags: 2, + callbacks: { invalid: this.onAddTag }, + dropdown: { + mapValueTo: 'name', + searchKeys: ['name'], + enabled: 0, + maxItems: 20, + closeOnSelect: true, + highlightFirst: false + }, + templates: { + tag(tagData) { + //z-index: unset; background-image: ${tagData.background}; Maybe a domain specific background for the chips? + return `
@@ -303,11 +322,12 @@ export default class ClassSheet extends DaggerheartSheet(ItemSheetV2) {
`; - }} + } + } }); - + domainTagify.on('change', this.onDomainSelect.bind(this)); - } + } async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -319,101 +339,145 @@ export default class ClassSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - onAddTag(e){ - if( e.detail.index ===2 ){ - ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.ClassCanOnlyHaveTwoDomains")); + onAddTag(e) { + if (e.detail.index === 2) { + ui.notifications.info(game.i18n.localize('DAGGERHEART.Notification.Info.ClassCanOnlyHaveTwoDomains')); } } - + async onDomainSelect(event) { const domains = event.detail?.value ? JSON.parse(event.detail.value) : []; - await this.document.update({ "system.domains": domains.map(x => x.value) }); + await this.document.update({ 'system.domains': domains.map(x => x.value) }); this.render(true); } - static async removeSubclass(_, button){ - await this.document.update({ "system.subclasses": this.document.system.subclasses.filter(x => x.uuid !== button.dataset.subclass)}); + static async removeSubclass(_, button) { + await this.document.update({ + 'system.subclasses': this.document.system.subclasses.filter(x => x.uuid !== button.dataset.subclass) + }); } - static async viewSubclass(_, button){ + static async viewSubclass(_, button) { const subclass = await fromUuid(button.dataset.subclass); subclass.sheet.render(true); } - static async removeFeature(_, button){ - await this.document.update({ "system.features": this.document.system.features.filter(x => x.uuid !== button.dataset.feature)}); + static async removeFeature(_, button) { + await this.document.update({ + 'system.features': this.document.system.features.filter(x => x.uuid !== button.dataset.feature) + }); } - static async viewFeature(_, button){ + static async viewFeature(_, button) { const feature = await fromUuid(button.dataset.feature); feature.sheet.render(true); } - static async removeItem(event, button){ + static async removeItem(event, button) { event.stopPropagation(); const type = button.dataset.type; const path = `system.inventory.${type}`; - await this.document.update({ [path]: this.document.system.inventory[type].filter(x => x.uuid !== button.dataset.item)}); + await this.document.update({ + [path]: this.document.system.inventory[type].filter(x => x.uuid !== button.dataset.item) + }); } - static async viewItem(_, button){ + static async viewItem(_, button) { const item = await fromUuid(button.dataset.item); item.sheet.render(true); } - static async removePrimaryWeapon(event){ + static async removePrimaryWeapon(event) { event.stopPropagation(); - await this.document.update({ "system.characterGuide.suggestedPrimaryWeapon": null }, { diff: false }); + await this.document.update({ 'system.characterGuide.suggestedPrimaryWeapon': null }, { diff: false }); } - static async removeSecondaryWeapon(event){ + static async removeSecondaryWeapon(event) { event.stopPropagation(); - await this.document.update({ "system.characterGuide.suggestedSecondaryWeapon": null }, { diff: false }); + await this.document.update({ 'system.characterGuide.suggestedSecondaryWeapon': null }, { diff: false }); } - static async removeArmor(event){ + static async removeArmor(event) { event.stopPropagation(); - await this.document.update({ "system.characterGuide.suggestedArmor": null }, { diff: false }); + await this.document.update({ 'system.characterGuide.suggestedArmor': null }, { diff: false }); } - + async _onDrop(event) { const data = TextEditor.getDragEventData(event); const item = await fromUuid(data.uuid); - if(item.type === 'subclass') { - await this.document.update({ "system.subclasses": [...this.document.system.subclasses, { img: item.img, name: item.name, uuid: item.uuid }] }); - } - else if(item.type === 'feature') { - - await this.document.update({ "system.features": [...this.document.system.features, { img: item.img, name: item.name, uuid: item.uuid }] }); - } - else if(item.type === 'weapon'){ - if(event.currentTarget.classList.contains('primary-weapon-section')){ - if(!this.document.system.characterGuide.suggestedPrimaryWeapon && !item.system.secondary) await this.document.update({ "system.characterGuide.suggestedPrimaryWeapon": { img: item.img, name: item.name, uuid: item.uuid } }); - } else if(event.currentTarget.classList.contains('secondary-weapon-section')){ - if(!this.document.system.characterGuide.suggestedSecondaryWeapon && item.system.secondary) await this.document.update({ "system.characterGuide.suggestedSecondaryWeapon": { img: item.img, name: item.name, uuid: item.uuid } }); + if (item.type === 'subclass') { + await this.document.update({ + 'system.subclasses': [ + ...this.document.system.subclasses, + { img: item.img, name: item.name, uuid: item.uuid } + ] + }); + } else if (item.type === 'feature') { + await this.document.update({ + 'system.features': [ + ...this.document.system.features, + { img: item.img, name: item.name, uuid: item.uuid } + ] + }); + } else if (item.type === 'weapon') { + if (event.currentTarget.classList.contains('primary-weapon-section')) { + if (!this.document.system.characterGuide.suggestedPrimaryWeapon && !item.system.secondary) + await this.document.update({ + 'system.characterGuide.suggestedPrimaryWeapon': { + img: item.img, + name: item.name, + uuid: item.uuid + } + }); + } else if (event.currentTarget.classList.contains('secondary-weapon-section')) { + if (!this.document.system.characterGuide.suggestedSecondaryWeapon && item.system.secondary) + await this.document.update({ + 'system.characterGuide.suggestedSecondaryWeapon': { + img: item.img, + name: item.name, + uuid: item.uuid + } + }); } - } - else if(item.type === 'armor'){ - if(event.currentTarget.classList.contains('armor-section')){ - if(!this.document.system.characterGuide.suggestedArmor) await this.document.update({ "system.characterGuide.suggestedArmor": { img: item.img, name: item.name, uuid: item.uuid } }); + } else if (item.type === 'armor') { + if (event.currentTarget.classList.contains('armor-section')) { + if (!this.document.system.characterGuide.suggestedArmor) + await this.document.update({ + 'system.characterGuide.suggestedArmor': { img: item.img, name: item.name, uuid: item.uuid } + }); } - } - else if(event.currentTarget.classList.contains('choice-a-section')){ - if(item.type === 'miscellaneous' || item.type === 'consumable'){ - if(this.document.system.inventory.choiceA.length < 2) await this.document.update({ "system.inventory.choiceA": [...this.document.system.inventory.choiceA, { img: item.img, name: item.name, uuid: item.uuid }] }); + } else if (event.currentTarget.classList.contains('choice-a-section')) { + if (item.type === 'miscellaneous' || item.type === 'consumable') { + if (this.document.system.inventory.choiceA.length < 2) + await this.document.update({ + 'system.inventory.choiceA': [ + ...this.document.system.inventory.choiceA, + { img: item.img, name: item.name, uuid: item.uuid } + ] + }); } - } - else if(item.type === 'miscellaneous'){ - if(event.currentTarget.classList.contains('take-section')){ - if(this.document.system.inventory.take.length < 3) await this.document.update({ "system.inventory.take": [...this.document.system.inventory.take, { img: item.img, name: item.name, uuid: item.uuid }] }); - } - else if(event.currentTarget.classList.contains('choice-b-section')){ - if(this.document.system.inventory.choiceB.length < 2) await this.document.update({ "system.inventory.choiceB": [...this.document.system.inventory.choiceB, { img: item.img, name: item.name, uuid: item.uuid }] }); + } else if (item.type === 'miscellaneous') { + if (event.currentTarget.classList.contains('take-section')) { + if (this.document.system.inventory.take.length < 3) + await this.document.update({ + 'system.inventory.take': [ + ...this.document.system.inventory.take, + { img: item.img, name: item.name, uuid: item.uuid } + ] + }); + } else if (event.currentTarget.classList.contains('choice-b-section')) { + if (this.document.system.inventory.choiceB.length < 2) + await this.document.update({ + 'system.inventory.choiceB': [ + ...this.document.system.inventory.choiceB, + { img: item.img, name: item.name, uuid: item.uuid } + ] + }); } } } -} \ No newline at end of file +} diff --git a/module/applications/sheets/community.mjs b/module/applications/sheets/community.mjs index 1d95799f..34f9b660 100644 --- a/module/applications/sheets/community.mjs +++ b/module/applications/sheets/community.mjs @@ -24,13 +24,12 @@ // return context; // } - // async _handleAction(action, event, button) { // switch(action){ // case 'editAbility': // this.editAbility(button); // break; -// case 'deleteAbility': +// case 'deleteAbility': // this.deleteAbility(event); // break; // } @@ -59,30 +58,30 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ItemSheetV2 } = foundry.applications.sheets; -export default class CommunitySheet extends DaggerheartSheet(ItemSheetV2) { +export default class CommunitySheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-community", - classes: ["daggerheart", "sheet", "heritage"], + id: 'daggerheart-community', + classes: ['daggerheart', 'sheet', 'heritage'], position: { width: 600 }, actions: { editAbility: this.editAbility, - deleteAbility: this.deleteAbility, + deleteAbility: this.deleteAbility }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false }, - dragDrop: [{ dragSelector: null, dropSelector: null }], + dragDrop: [{ dragSelector: null, dropSelector: null }] }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/community.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/community.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -92,26 +91,33 @@ export default class CommunitySheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - static async editAbility(_, button){ + static async editAbility(_, button) { const feature = await fromUuid(button.dataset.ability); feature.sheet.render(true); } - static async deleteAbility(event, button){ + static async deleteAbility(event, button) { event.preventDefault(); event.stopPropagation(); - await this.item.update({ "system.abilities": this.item.system.abilities.filter(x => x.uuid !== button.dataset.ability) }) + await this.item.update({ + 'system.abilities': this.item.system.abilities.filter(x => x.uuid !== button.dataset.ability) + }); } async _onDrop(event) { const data = TextEditor.getDragEventData(event); const item = await fromUuid(data.uuid); - if(item.type === 'feature' && item.system.type === SYSTEM.ITEM.featureTypes.community.id) { - await this.document.update({ "system.abilities": [...this.document.system.abilities, { img: item.img, name: item.name, uuid: item.uuid }] }); + if (item.type === 'feature' && item.system.type === SYSTEM.ITEM.featureTypes.community.id) { + await this.document.update({ + 'system.abilities': [ + ...this.document.system.abilities, + { img: item.img, name: item.name, uuid: item.uuid } + ] + }); } } -} \ No newline at end of file +} diff --git a/module/applications/sheets/consumable.mjs b/module/applications/sheets/consumable.mjs index 8fdbde4e..6d1f8da8 100644 --- a/module/applications/sheets/consumable.mjs +++ b/module/applications/sheets/consumable.mjs @@ -23,25 +23,25 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ItemSheetV2 } = foundry.applications.sheets; -export default class ConsumableSheet extends DaggerheartSheet(ItemSheetV2) { +export default class ConsumableSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-consumable", - classes: ["daggerheart", "sheet", "consumable"], + id: 'daggerheart-consumable', + classes: ['daggerheart', 'sheet', 'consumable'], position: { width: 480 }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, - }, + closeOnSubmit: false + } }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/consumable.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/consumable.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -51,7 +51,7 @@ export default class ConsumableSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } -} \ No newline at end of file +} diff --git a/module/applications/sheets/daggerheart-sheet.mjs b/module/applications/sheets/daggerheart-sheet.mjs index 51844012..abf48793 100644 --- a/module/applications/sheets/daggerheart-sheet.mjs +++ b/module/applications/sheets/daggerheart-sheet.mjs @@ -1,73 +1,73 @@ const { HandlebarsApplicationMixin } = foundry.applications.api; export default function DhpApplicationMixin(Base) { - return class DhpSheetV2 extends HandlebarsApplicationMixin(Base) { - constructor(options={}){ - super(options); + return class DhpSheetV2 extends HandlebarsApplicationMixin(Base) { + constructor(options = {}) { + super(options); - this._dragDrop = this._createDragDropHandlers(); - } + this._dragDrop = this._createDragDropHandlers(); + } - _attachPartListeners(partId, htmlElement, options) { - super._attachPartListeners(partId, htmlElement, options); + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); - this._dragDrop.forEach(d => d.bind(htmlElement)); - } + this._dragDrop.forEach(d => d.bind(htmlElement)); + } - static DEFAULT_OPTIONS = { - position: { - width: 480, - height: "auto" - }, - actions: { - onEditImage: this._onEditImage - }, - dragDrop: [], - }; - - async _prepareContext(_options, objectPath='document') { - const context = await super._prepareContext(_options); - context.source = this[objectPath].toObject(); - context.fields = this[objectPath].schema.fields; - context.systemFields = this[objectPath].system ? this[objectPath].system.schema.fields : {}; - - return context; - } - - static _onEditImage(event, target) { - const attr = target.dataset.edit; - const current = foundry.utils.getProperty(this.document, attr); - const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {}; - const fp = new FilePicker({ - current, - type: "image", - redirectToRoot: img ? [img] : [], - callback: async path => this._updateImage.bind(this)(path), - top: this.position.top + 40, - left: this.position.left + 10 - }); - return fp.browse(); - } - - async _updateImage(path){ - await this.document.update({ "img": path }); - } - - _createDragDropHandlers() { - return this.options.dragDrop.map(d => { - // d.permissions = { - // dragstart: this._canDragStart.bind(this), - // drop: this._canDragDrop.bind(this) - // }; - d.callbacks = { - // dragstart: this._onDragStart.bind(this), - // dragover: this._onDragOver.bind(this), - drop: this._onDrop.bind(this) + static DEFAULT_OPTIONS = { + position: { + width: 480, + height: 'auto' + }, + actions: { + onEditImage: this._onEditImage + }, + dragDrop: [] }; - return new foundry.applications.ux.DragDrop.implementation(d); - }); - } - _onDrop(event) {} - } -} \ No newline at end of file + async _prepareContext(_options, objectPath = 'document') { + const context = await super._prepareContext(_options); + context.source = this[objectPath].toObject(); + context.fields = this[objectPath].schema.fields; + context.systemFields = this[objectPath].system ? this[objectPath].system.schema.fields : {}; + + return context; + } + + static _onEditImage(event, target) { + const attr = target.dataset.edit; + const current = foundry.utils.getProperty(this.document, attr); + const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {}; + const fp = new FilePicker({ + current, + type: 'image', + redirectToRoot: img ? [img] : [], + callback: async path => this._updateImage.bind(this)(path), + top: this.position.top + 40, + left: this.position.left + 10 + }); + return fp.browse(); + } + + async _updateImage(path) { + await this.document.update({ img: path }); + } + + _createDragDropHandlers() { + return this.options.dragDrop.map(d => { + // d.permissions = { + // dragstart: this._canDragStart.bind(this), + // drop: this._canDragDrop.bind(this) + // }; + d.callbacks = { + // dragstart: this._onDragStart.bind(this), + // dragover: this._onDragOver.bind(this), + drop: this._onDrop.bind(this) + }; + return new foundry.applications.ux.DragDrop.implementation(d); + }); + } + + _onDrop(event) {} + }; +} diff --git a/module/applications/sheets/domainCard.mjs b/module/applications/sheets/domainCard.mjs index ac1e37cf..3b93050d 100644 --- a/module/applications/sheets/domainCard.mjs +++ b/module/applications/sheets/domainCard.mjs @@ -21,7 +21,6 @@ // return context; // } - // async _handleAction(action, event, button) { // switch(action){ // case 'attributeRoll': @@ -39,36 +38,36 @@ const { ItemSheetV2 } = foundry.applications.sheets; export default class DomainCardSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-domainCard", - classes: ["daggerheart", "sheet", "domain-card"], + id: 'daggerheart-domainCard', + classes: ['daggerheart', 'sheet', 'domain-card'], position: { width: 600, height: 600 }, actions: { addAction: this.addAction, editAction: this.editAction, - removeAction: this.removeAction, + removeAction: this.removeAction }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, - }, + closeOnSubmit: false + } }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/domainCard.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/domainCard.hbs' } - } + }; _getTabs() { const tabs = { general: { active: true, cssClass: '', group: 'primary', id: 'general', icon: null, label: 'General' }, - actions: { active: false, cssClass: '', group: 'primary', id: 'actions', icon: null, label: 'Actions' }, - } - for ( const v of Object.values(tabs) ) { + actions: { active: false, cssClass: '', group: 'primary', id: 'actions', icon: null, label: 'Actions' } + }; + for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; - v.cssClass = v.active ? "active" : ""; + v.cssClass = v.active ? 'active' : ''; } return tabs; @@ -83,28 +82,37 @@ export default class DomainCardSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - static async addAction(){ - const actionIndexes = this.document.system.actions.map(x => x.id.split('-')[2]).sort((a, b) => a-b); - const action = await new DaggerheartAction({ - id: `${this.document.id}-Action-${actionIndexes.length > 0 ? actionIndexes[0]+1 : 1}`, - }, { - parent: this.document, - }); - await this.document.update({ "system.actions": [...this.document.system.actions, action] }); - await (new DaggerheartActionConfig(this.document.system.actions[this.document.system.actions.length-1])).render(true); + static async addAction() { + const actionIndexes = this.document.system.actions.map(x => x.id.split('-')[2]).sort((a, b) => a - b); + const action = await new DaggerheartAction( + { + id: `${this.document.id}-Action-${actionIndexes.length > 0 ? actionIndexes[0] + 1 : 1}` + }, + { + parent: this.document + } + ); + await this.document.update({ 'system.actions': [...this.document.system.actions, action] }); + await new DaggerheartActionConfig(this.document.system.actions[this.document.system.actions.length - 1]).render( + true + ); } - static async editAction(_, button){ + static async editAction(_, button) { const action = this.document.system.actions[button.dataset.index]; - await (new DaggerheartActionConfig(action)).render(true); + await new DaggerheartActionConfig(action).render(true); } - static async removeAction(event, button){ + static async removeAction(event, button) { event.stopPropagation(); - await this.document.update({ "system.actions": this.document.system.actions.filter((_, index) => index !== Number.parseInt(button.dataset.index)) }); + await this.document.update({ + 'system.actions': this.document.system.actions.filter( + (_, index) => index !== Number.parseInt(button.dataset.index) + ) + }); } -} \ No newline at end of file +} diff --git a/module/applications/sheets/environment.mjs b/module/applications/sheets/environment.mjs index f6ff3cae..80295b05 100644 --- a/module/applications/sheets/environment.mjs +++ b/module/applications/sheets/environment.mjs @@ -1,9 +1,8 @@ -import DaggerheartSheet from "./daggerheart-sheet.mjs"; +import DaggerheartSheet from './daggerheart-sheet.mjs'; const { DocumentSheetV2 } = foundry.applications.api; export default class DhpEnvironment extends DaggerheartSheet(DocumentSheetV2) { - - constructor(options){ + constructor(options) { super(options); this.editMode = false; @@ -11,10 +10,10 @@ export default class DhpEnvironment extends DaggerheartSheet(DocumentSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - classes: ["daggerheart", "sheet", "adversary", "environment"], + classes: ['daggerheart', 'sheet', 'adversary', 'environment'], position: { - width: 600, - height: "auto" + width: 600, + height: 'auto' }, actions: { toggleSlider: this.toggleSlider, @@ -23,22 +22,22 @@ export default class DhpEnvironment extends DaggerheartSheet(DocumentSheetV2) { removeFeature: this.removeFeature, addTone: this.addTone, removeTone: this.removeTone, - useFeature: this.useFeature, + useFeature: this.useFeature }, form: { - handler: this._updateForm, - closeOnSubmit: false, - submitOnChange: true, + handler: this._updateForm, + closeOnSubmit: false, + submitOnChange: true } }; - + /** @override */ static PARTS = { form: { - id: "form", - template: "systems/daggerheart/templates/sheets/environment.hbs" + id: 'form', + template: 'systems/daggerheart/templates/sheets/environment.hbs' } - } + }; /* -------------------------------------------- */ @@ -49,81 +48,87 @@ export default class DhpEnvironment extends DaggerheartSheet(DocumentSheetV2) { async _prepareContext(_options) { return { - title: `${this.document.name} - ${game.i18n.localize(SYSTEM.ACTOR.adversaryTypes[this.document.system.type].name)}`, - user: this.document, - source: this.document.toObject(), - fields: this.document.schema.fields, - data: { - type: game.i18n.localize(SYSTEM.ACTOR.adversaryTypes[this.document.system.type].name), - features: this.document.items.reduce((acc, x) => { - if(x.type === 'feature'){ - const feature = x.toObject(); - acc.push({ - ...feature, - system: { - ...feature.system, - actionType: game.i18n.localize(SYSTEM.ITEM.actionTypes[feature.system.actionType].name) - }, - uuid: x.uuid - }); - } + title: `${this.document.name} - ${game.i18n.localize(SYSTEM.ACTOR.adversaryTypes[this.document.system.type].name)}`, + user: this.document, + source: this.document.toObject(), + fields: this.document.schema.fields, + data: { + type: game.i18n.localize(SYSTEM.ACTOR.adversaryTypes[this.document.system.type].name), + features: this.document.items.reduce((acc, x) => { + if (x.type === 'feature') { + const feature = x.toObject(); + acc.push({ + ...feature, + system: { + ...feature.system, + actionType: game.i18n.localize(SYSTEM.ITEM.actionTypes[feature.system.actionType].name) + }, + uuid: x.uuid + }); + } - return acc; - }, []), - }, - editMode: this.editMode, - config: SYSTEM, - } + return acc; + }, []) + }, + editMode: this.editMode, + config: SYSTEM + }; } static async _updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - static toggleSlider(){ + static toggleSlider() { this.editMode = !this.editMode; this.render(); } - static async viewFeature(_, button){ + static async viewFeature(_, button) { const move = await fromUuid(button.dataset.feature); move.sheet.render(true); } - static async addFeature(){ - const result = await this.document.createEmbeddedDocuments("Item", [{ - name: game.i18n.localize('DAGGERHEART.Sheets.Environment.NewFeature'), - type: 'feature', - }]); + static async addFeature() { + const result = await this.document.createEmbeddedDocuments('Item', [ + { + name: game.i18n.localize('DAGGERHEART.Sheets.Environment.NewFeature'), + type: 'feature' + } + ]); await result[0].sheet.render(true); } - static async removeFeature(_, button){ + static async removeFeature(_, button) { await this.document.items.find(x => x.uuid === button.dataset.feature).delete(); } - static async addTone(){ - await this.document.update({ "system.toneAndFeel": [...this.document.system.toneAndFeel, ''] }); + static async addTone() { + await this.document.update({ 'system.toneAndFeel': [...this.document.system.toneAndFeel, ''] }); } - static async removeTone(button){ - await this.document.update({ "system.toneAndFeel": this.document.system.toneAndFeel.filter((_, index) => index !== Number.parseInt(button.dataset.tone) )}); + static async removeTone(button) { + await this.document.update({ + 'system.toneAndFeel': this.document.system.toneAndFeel.filter( + (_, index) => index !== Number.parseInt(button.dataset.tone) + ) + }); } - static async useFeature(_, button){ + static async useFeature(_, button) { const item = this.document.items.find(x => x.uuid === button.dataset.feature); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/ability-use.hbs", { - title: game.i18n.format("DAGGERHEART.Chat.EnvironmentTitle", { actionType: button.dataset.actionType }), - card: { name: item.name, img: item.img, description: item.system.description }, - }), + content: await renderTemplate('systems/daggerheart/templates/chat/ability-use.hbs', { + title: game.i18n.format('DAGGERHEART.Chat.EnvironmentTitle', { actionType: button.dataset.actionType }), + card: { name: item.name, img: item.img, description: item.system.description } + }) }); cls.create(msg.toObject()); } -} \ No newline at end of file +} diff --git a/module/applications/sheets/feature.mjs b/module/applications/sheets/feature.mjs index 6adbbf3a..03658d4f 100644 --- a/module/applications/sheets/feature.mjs +++ b/module/applications/sheets/feature.mjs @@ -4,47 +4,47 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ItemSheetV2 } = foundry.applications.sheets; export default class FeatureSheet extends DaggerheartSheet(ItemSheetV2) { - constructor(options={}){ + constructor(options = {}) { super(options); this.selectedEffectType = null; } - + static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-feature", - classes: ["daggerheart", "sheet", "feature"], + id: 'daggerheart-feature', + classes: ['daggerheart', 'sheet', 'feature'], position: { width: 600, height: 600 }, actions: { addEffect: this.addEffect, removeEffect: this.removeEffect, addAction: this.addAction, editAction: this.editAction, - removeAction: this.removeAction, + removeAction: this.removeAction }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, - }, + closeOnSubmit: false + } }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/feature.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/feature.hbs' } - } + }; _getTabs() { const tabs = { features: { active: true, cssClass: '', group: 'primary', id: 'features', icon: null, label: 'Features' }, effects: { active: false, cssClass: '', group: 'primary', id: 'effects', icon: null, label: 'Effects' }, - actions: { active: false, cssClass: '', group: 'primary', id: 'actions', icon: null, label: 'Actions' }, - } - for ( const v of Object.values(tabs) ) { + actions: { active: false, cssClass: '', group: 'primary', id: 'actions', icon: null, label: 'Actions' } + }; + for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; - v.cssClass = v.active ? "active" : ""; + v.cssClass = v.active ? 'active' : ''; } return tabs; @@ -52,14 +52,13 @@ export default class FeatureSheet extends DaggerheartSheet(ItemSheetV2) { _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); - $(htmlElement).find(".effect-select").on("change", this.effectSelect.bind(this)); + $(htmlElement).find('.effect-select').on('change', this.effectSelect.bind(this)); } async _prepareContext(_options) { const context = await super._prepareContext(_options); context.document = this.document; - context.tabs = this._getTabs(), - context.generalConfig = SYSTEM.GENERAL; + (context.tabs = this._getTabs()), (context.generalConfig = SYSTEM.GENERAL); context.itemConfig = SYSTEM.ITEM; context.properties = SYSTEM.ACTOR.featureProperties; context.dice = SYSTEM.GENERAL.diceTypes; @@ -70,47 +69,53 @@ export default class FeatureSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - effectSelect(event){ + effectSelect(event) { this.selectedEffectType = event.currentTarget.value; this.render(true); } - static async addEffect(){ - if(!this.selectedEffectType) return; - + static async addEffect() { + if (!this.selectedEffectType) return; + const { id, name, ...rest } = SYSTEM.EFFECTS.effectTypes[this.selectedEffectType]; - const update = { + const update = { [foundry.utils.randomID()]: { type: this.selectedEffectType, value: '', ...rest - } + } }; - await this.item.update({ "system.effects": update }); + await this.item.update({ 'system.effects': update }); } - static async removeEffect(_, button){ + static async removeEffect(_, button) { const path = `system.effects.-=${button.dataset.effect}`; await this.item.update({ [path]: null }); } - static async addAction(){ - const action = await new DaggerheartAction({}, {parent: this.document}); - await this.document.update({ "system.actions": [...this.document.system.actions, action] }); - await (new DaggerheartActionConfig(this.document.system.actions[this.document.system.actions.length-1])).render(true); + static async addAction() { + const action = await new DaggerheartAction({}, { parent: this.document }); + await this.document.update({ 'system.actions': [...this.document.system.actions, action] }); + await new DaggerheartActionConfig(this.document.system.actions[this.document.system.actions.length - 1]).render( + true + ); } - static async editAction(_, button){ + static async editAction(_, button) { const action = this.document.system.actions[button.dataset.index]; - await (new DaggerheartActionConfig(action)).render(true); + await new DaggerheartActionConfig(action).render(true); } - static async removeAction(event, button){ + static async removeAction(event, button) { event.stopPropagation(); - await this.document.update({ "system.actions": this.document.system.actions.filter((_, index) => index !== Number.parseInt(button.dataset.index)) }); + await this.document.update({ + 'system.actions': this.document.system.actions.filter( + (_, index) => index !== Number.parseInt(button.dataset.index) + ) + }); } -} \ No newline at end of file +} diff --git a/module/applications/sheets/miscellaneous.mjs b/module/applications/sheets/miscellaneous.mjs index 4c4088a8..1be74016 100644 --- a/module/applications/sheets/miscellaneous.mjs +++ b/module/applications/sheets/miscellaneous.mjs @@ -26,22 +26,22 @@ const { ItemSheetV2 } = foundry.applications.sheets; export default class MiscellaneousSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-miscellaneous", - classes: ["daggerheart", "sheet", "miscellaneous"], + id: 'daggerheart-miscellaneous', + classes: ['daggerheart', 'sheet', 'miscellaneous'], position: { width: 400 }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, - }, + closeOnSubmit: false + } }; static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/miscellaneous.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/miscellaneous.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -51,7 +51,7 @@ export default class MiscellaneousSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } -} \ No newline at end of file +} diff --git a/module/applications/sheets/pc.mjs b/module/applications/sheets/pc.mjs index a4f4d2f6..8112a697 100644 --- a/module/applications/sheets/pc.mjs +++ b/module/applications/sheets/pc.mjs @@ -7,7 +7,7 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ActorSheetV2 } = foundry.applications.sheets; export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { - constructor(options={}){ + constructor(options = {}) { super(options); this.editAttributes = false; @@ -18,18 +18,18 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { this.dropItemBlock = false; this.multiclassFeatureSetSelected = false; } - + static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-pc", - classes: ["daggerheart", "sheet", "pc"], + id: 'daggerheart-pc', + classes: ['daggerheart', 'sheet', 'pc'], position: { width: 810, height: 1080 }, actions: { toggleEditAttributes: this.toggleEditAttributes, attributeRoll: this.rollAttribute, toggleMarks: this.toggleMarks, toggleAttributeMark: this.toggleAttributeMark, - toggleHP: this.toggleHP, + toggleHP: this.toggleHP, toggleStress: this.toggleStress, toggleHope: this.toggleHope, toggleGold: this.toggleGold, @@ -62,7 +62,7 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { useAbility: this.useAbility, useAdvancementCard: this.useAdvancementCard, useAdvancementAbility: this.useAdvancementAbility, - selectFeatureSet: this.selectFeatureSet, + selectFeatureSet: this.selectFeatureSet }, window: { //frame: boolean; @@ -78,43 +78,92 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false }, dragDrop: [ - {dragSelector: null, dropSelector: ".weapon-section" }, - {dragSelector: null, dropSelector: ".armor-section"}, - {dragSelector: null, dropSelector: ".inventory-weapon-section-first"}, - {dragSelector: null, dropSelector: ".inventory-weapon-section-second"}, - {dragSelector: ".item-list .item", dropSelector: null}, - ], + { dragSelector: null, dropSelector: '.weapon-section' }, + { dragSelector: null, dropSelector: '.armor-section' }, + { dragSelector: null, dropSelector: '.inventory-weapon-section-first' }, + { dragSelector: null, dropSelector: '.inventory-weapon-section-second' }, + { dragSelector: '.item-list .item', dropSelector: null } + ] }; - + static PARTS = { form: { - id: "pc", - template: "systems/daggerheart/templates/sheets/pc/pc.hbs" + id: 'pc', + template: 'systems/daggerheart/templates/sheets/pc/pc.hbs' } - } - + }; + _getTabs() { - const setActive = (tabs) => { - for ( const v of Object.values(tabs) ) { + const setActive = tabs => { + for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; - v.cssClass = v.active ? "active" : ""; + v.cssClass = v.active ? 'active' : ''; } - } + }; const primaryTabs = { - features: { active: true, cssClass: '', group: 'primary', id: 'features', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Features') }, - loadout: { active: false, cssClass: '', group: 'primary', id: 'loadout', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Loadout') }, - inventory: { active: false, cssClass: '', group: 'primary', id: 'inventory', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Inventory') }, - story: { active: false, cssClass: '', group: 'primary', id: 'story', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Story') }, - } + features: { + active: true, + cssClass: '', + group: 'primary', + id: 'features', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Features') + }, + loadout: { + active: false, + cssClass: '', + group: 'primary', + id: 'loadout', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Loadout') + }, + inventory: { + active: false, + cssClass: '', + group: 'primary', + id: 'inventory', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Inventory') + }, + story: { + active: false, + cssClass: '', + group: 'primary', + id: 'story', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Story') + } + }; const secondaryTabs = { - foundation: { active: true, cssClass: '', group: 'secondary', id: 'foundation', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Foundation') }, - loadout: { active: false, cssClass: '', group: 'secondary', id: 'loadout', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Loadout') }, - vault: { active: false, cssClass: '', group: 'secondary', id: 'vault', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Vault') }, - } + foundation: { + active: true, + cssClass: '', + group: 'secondary', + id: 'foundation', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Foundation') + }, + loadout: { + active: false, + cssClass: '', + group: 'secondary', + id: 'loadout', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Loadout') + }, + vault: { + active: false, + cssClass: '', + group: 'secondary', + id: 'vault', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.PC.Tabs.Vault') + } + }; setActive(primaryTabs); setActive(secondaryTabs); @@ -124,20 +173,20 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); - $(htmlElement).find(".attribute-value").on("change", this.attributeChange.bind(this)); - $(htmlElement).find(".tab-selector").on("click", this.tabSwitch.bind(this)); - $(htmlElement).find(".level-title.levelup").on("click", this.openLevelUp.bind(this)); - $(htmlElement).find(".feature-input").on("change", this.onFeatureInputBlur.bind(this)); - $(htmlElement).find(".experience-description").on("change", this.experienceDescriptionChange.bind(this)); - $(htmlElement).find(".experience-value").on("change", this.experienceValueChange.bind(this)); - $(htmlElement).find("[data-item]").on("change", this.itemUpdate.bind(this)); + $(htmlElement).find('.attribute-value').on('change', this.attributeChange.bind(this)); + $(htmlElement).find('.tab-selector').on('click', this.tabSwitch.bind(this)); + $(htmlElement).find('.level-title.levelup').on('click', this.openLevelUp.bind(this)); + $(htmlElement).find('.feature-input').on('change', this.onFeatureInputBlur.bind(this)); + $(htmlElement).find('.experience-description').on('change', this.experienceDescriptionChange.bind(this)); + $(htmlElement).find('.experience-value').on('change', this.experienceValueChange.bind(this)); + $(htmlElement).find('[data-item]').on('change', this.itemUpdate.bind(this)); } async _prepareContext(_options) { const context = await super._prepareContext(_options); context.document = this.document; context.tabs = this._getTabs(); - + context.config = SYSTEM; context.editAttributes = this.editAttributes; context.onVaultTab = this.onVaultTab; @@ -146,9 +195,11 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { context.multiclassFeatureSetSelected = this.multiclassFeatureSetSelected; const selectedAttributes = Object.values(this.document.system.attributes).map(x => x.data.base); - context.abilityScoreArray = JSON.parse(await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.AbilityArray)).reduce((acc, x) => { + context.abilityScoreArray = JSON.parse( + await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.AbilityArray) + ).reduce((acc, x) => { const selectedIndex = selectedAttributes.indexOf(x); - if(selectedIndex !== -1){ + if (selectedIndex !== -1) { selectedAttributes.splice(selectedIndex, 1); } else { acc.push({ name: x, value: x }); @@ -156,26 +207,38 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { return acc; }, []); - if(!context.abilityScoreArray.includes(0)) context.abilityScoreArray.push({ name: 0, value: 0 }); + if (!context.abilityScoreArray.includes(0)) context.abilityScoreArray.push({ name: 0, value: 0 }); context.abilityScoresFinished = context.abilityScoreArray.every(x => x.value === 0); - context.domains = this.document.system.class ? { - first: this.document.system.class.system.domains[0] ? SYSTEM.DOMAIN.domains[this.document.system.class.system.domains[0]].src : null, - second: this.document.system.class.system.domains[1] ? SYSTEM.DOMAIN.domains[this.document.system.class.system.domains[1]].src : null, - } : { }; + context.domains = this.document.system.class + ? { + first: this.document.system.class.system.domains[0] + ? SYSTEM.DOMAIN.domains[this.document.system.class.system.domains[0]].src + : null, + second: this.document.system.class.system.domains[1] + ? SYSTEM.DOMAIN.domains[this.document.system.class.system.domains[1]].src + : null + } + : {}; context.attributes = Object.keys(this.document.system.attributes).reduce((acc, key) => { acc[key] = { ...this.document.system.attributes[key], name: game.i18n.localize(SYSTEM.ACTOR.abilities[key].name), - verbs: SYSTEM.ACTOR.abilities[key].verbs.map(x => game.i18n.localize(x)), + verbs: SYSTEM.ACTOR.abilities[key].verbs.map(x => game.i18n.localize(x)) }; return acc; }, {}); - const ancestry = await this.mapFeatureType(this.document.system.ancestry ? [this.document.system.ancestry] : [], SYSTEM.GENERAL.objectTypes); - const community = await this.mapFeatureType(this.document.system.community ? [this.document.system.community] : [], SYSTEM.GENERAL.objectTypes); + const ancestry = await this.mapFeatureType( + this.document.system.ancestry ? [this.document.system.ancestry] : [], + SYSTEM.GENERAL.objectTypes + ); + const community = await this.mapFeatureType( + this.document.system.community ? [this.document.system.community] : [], + SYSTEM.GENERAL.objectTypes + ); const foundation = { ancestry: ancestry[0], community: community[0], @@ -192,66 +255,94 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { loadout: { top: loadout.slice(0, Math.min(2, nrLoadoutCards)), bottom: nrLoadoutCards > 2 ? loadout.slice(2, Math.min(5, nrLoadoutCards)) : [], - nrTotal: nrLoadoutCards, + nrTotal: nrLoadoutCards }, - vault: vault.map(x => ({ ...x, uuid: x.uuid, sendToLoadoutDisabled: this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout })) + vault: vault.map(x => ({ + ...x, + uuid: x.uuid, + sendToLoadoutDisabled: + this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout + })) }; context.inventory = { consumable: { titles: { - name: game.i18n.localize("DAGGERHEART.Sheets.PC.InventoryTab.ConsumableTitle"), - quantity: game.i18n.localize("DAGGERHEART.Sheets.PC.InventoryTab.QuantityTitle"), + name: game.i18n.localize('DAGGERHEART.Sheets.PC.InventoryTab.ConsumableTitle'), + quantity: game.i18n.localize('DAGGERHEART.Sheets.PC.InventoryTab.QuantityTitle') }, - items: this.document.items.filter(x => x.type === 'consumable'), + items: this.document.items.filter(x => x.type === 'consumable') }, miscellaneous: { titles: { - name: game.i18n.localize("DAGGERHEART.Sheets.PC.InventoryTab.MiscellaneousTitle"), - quantity: game.i18n.localize("DAGGERHEART.Sheets.PC.InventoryTab.QuantityTitle"), + name: game.i18n.localize('DAGGERHEART.Sheets.PC.InventoryTab.MiscellaneousTitle'), + quantity: game.i18n.localize('DAGGERHEART.Sheets.PC.InventoryTab.QuantityTitle') }, - items: this.document.items.filter(x => x.type === 'miscellaneous'), - }, - } + items: this.document.items.filter(x => x.type === 'miscellaneous') + } + }; - if(context.inventory.length === 0){ + if (context.inventory.length === 0) { context.inventory = Array(1).fill(Array(5).fill([])); } - context.classFeatures = (this.multiclassFeatureSetSelected ? this.document.system.multiclassFeatures : this.document.system.classFeatures).map(x => { - if(x.system.featureType.type !== 'dice'){ + context.classFeatures = ( + this.multiclassFeatureSetSelected + ? this.document.system.multiclassFeatures + : this.document.system.classFeatures + ).map(x => { + if (x.system.featureType.type !== 'dice') { return x; } - return { ...x, uuid: x.uuid, system: { ...x.system, featureType: { ...x.system.featureType, data: { ...x.system.featureType.data, property: this.document.system.subclass ? SYSTEM.ACTOR.featureProperties[x.system.featureType.data.property].path(this.document) : 0 }}}}; - }); - - return context; - } - - static async updateForm(event, _, formData) { - await this.document.update(formData.object) - this.render(); - } - - async mapFeatureType(data, configType){ - return await Promise.all(data.map(async x => { - const abilities = x.system.abilities ? await Promise.all(x.system.abilities.map(async x => await fromUuid(x.uuid))) : []; - return { ...x, uuid: x.uuid, system: { ...x.system, - abilities: abilities, - type: game.i18n.localize(configType[x.system.type??x.type].label) + featureType: { + ...x.system.featureType, + data: { + ...x.system.featureType.data, + property: this.document.system.subclass + ? SYSTEM.ACTOR.featureProperties[x.system.featureType.data.property].path(this.document) + : 0 + } + } } - } - })); + }; + }); + + return context; + } + + static async updateForm(event, _, formData) { + await this.document.update(formData.object); + this.render(); + } + + async mapFeatureType(data, configType) { + return await Promise.all( + data.map(async x => { + const abilities = x.system.abilities + ? await Promise.all(x.system.abilities.map(async x => await fromUuid(x.uuid))) + : []; + + return { + ...x, + uuid: x.uuid, + system: { + ...x.system, + abilities: abilities, + type: game.i18n.localize(configType[x.system.type ?? x.type].label) + } + }; + }) + ); } mapAdvancementFeatures(actor, config) { - if(!actor.system.subclass) return { foundation: null, advancements: [] }; + if (!actor.system.subclass) return { foundation: null, advancements: [] }; const { subclass, multiclassSubclass } = actor.system.subclassFeatures; @@ -259,7 +350,7 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { type: 'foundation', multiclass: false, img: actor.system.subclass.img, - subtitle: game.i18n.localize("DAGGERHEART.Sheets.PC.DomainCard.FoundationTitle"), + subtitle: game.i18n.localize('DAGGERHEART.Sheets.PC.DomainCard.FoundationTitle'), domains: actor.system.class.system.domains.map(x => config.DOMAIN.domains[x].src), className: actor.system.class.name, subclassUuid: actor.system.subclass.uuid, @@ -267,74 +358,135 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { spellcast: config.ACTOR.abilities[actor.system.subclass.system.spellcastingTrait]?.name ?? null, description: actor.system.subclass.system.foundationFeature.description, abilities: subclass.foundation, - abilityKey: 'foundationFeature', + abilityKey: 'foundationFeature' }; - const firstKey = actor.system.subclass.system.specializationFeature.unlocked && actor.system.subclass.system.specializationFeature.tier === 2 ? 'sub' : - actor.system.multiclass?.system?.multiclassTier === 2 ? 'multi' : null; + const firstKey = + actor.system.subclass.system.specializationFeature.unlocked && + actor.system.subclass.system.specializationFeature.tier === 2 + ? 'sub' + : actor.system.multiclass?.system?.multiclassTier === 2 + ? 'multi' + : null; const firstType = firstKey === 'sub' ? 'specialization' : 'foundation'; - const firstBase = firstKey === 'sub' ? actor.system.subclass : firstKey === 'multi' ? actor.system.multiclassSubclass : null; - const first = !firstBase ? null : { - type: firstType, - multiclass: firstKey === 'multi', - img: firstBase.img, - subtitle: firstKey === 'sub' ? game.i18n.localize("DAGGERHEART.Sheets.PC.DomainCard.SpecializationTitle") : game.i18n.localize("DAGGERHEART.Sheets.PC.DomainCard.FoundationTitle"), - domains: firstKey === 'sub' ? actor.system.class.system.domains.map(x => config.DOMAIN.domains[x].src) : actor.system.multiclass.system.domains.map(x => config.DOMAIN.domains[x].src), - className: firstKey === 'sub' ? actor.system.class.name : actor.system.multiclass.name, - subclassUuid: firstBase.uuid, - subclassName: firstBase.name, - spellcast: firstKey === 'sub' ? null : config.ACTOR.abilities[firstBase.system.spellcastingTrait]?.name ?? null, - description: firstKey === 'sub' ? firstBase.system.specializationFeature.description : firstBase.system.foundationFeature.description, - abilities: firstKey === 'sub' ? subclass.specialization : multiclassSubclass.foundation, - abilityKey: firstKey === 'sub' ? 'specializationFeature' : 'foundationFeature', - }; + const firstBase = + firstKey === 'sub' ? actor.system.subclass : firstKey === 'multi' ? actor.system.multiclassSubclass : null; + const first = !firstBase + ? null + : { + type: firstType, + multiclass: firstKey === 'multi', + img: firstBase.img, + subtitle: + firstKey === 'sub' + ? game.i18n.localize('DAGGERHEART.Sheets.PC.DomainCard.SpecializationTitle') + : game.i18n.localize('DAGGERHEART.Sheets.PC.DomainCard.FoundationTitle'), + domains: + firstKey === 'sub' + ? actor.system.class.system.domains.map(x => config.DOMAIN.domains[x].src) + : actor.system.multiclass.system.domains.map(x => config.DOMAIN.domains[x].src), + className: firstKey === 'sub' ? actor.system.class.name : actor.system.multiclass.name, + subclassUuid: firstBase.uuid, + subclassName: firstBase.name, + spellcast: + firstKey === 'sub' + ? null + : (config.ACTOR.abilities[firstBase.system.spellcastingTrait]?.name ?? null), + description: + firstKey === 'sub' + ? firstBase.system.specializationFeature.description + : firstBase.system.foundationFeature.description, + abilities: firstKey === 'sub' ? subclass.specialization : multiclassSubclass.foundation, + abilityKey: firstKey === 'sub' ? 'specializationFeature' : 'foundationFeature' + }; - const secondKey = (actor.system.subclass.system.specializationFeature.unlocked && actor.system.subclass.system.specializationFeature.tier === 3) || (actor.system.subclass.system.masteryFeature.unlocked && actor.system.subclass.system.masteryFeature.tier === 3) ? 'sub' : - (actor.system.multiclass?.system?.multiclassTier === 3) || (actor.system.multiclassSubclass?.system?.specializationFeature?.unlocked) ? 'multi' : null; - const secondBase = secondKey === 'sub' ? actor.system.subclass : secondKey === 'multi' ? actor.system.multiclassSubclass : null; + const secondKey = + (actor.system.subclass.system.specializationFeature.unlocked && + actor.system.subclass.system.specializationFeature.tier === 3) || + (actor.system.subclass.system.masteryFeature.unlocked && + actor.system.subclass.system.masteryFeature.tier === 3) + ? 'sub' + : actor.system.multiclass?.system?.multiclassTier === 3 || + actor.system.multiclassSubclass?.system?.specializationFeature?.unlocked + ? 'multi' + : null; + const secondBase = + secondKey === 'sub' + ? actor.system.subclass + : secondKey === 'multi' + ? actor.system.multiclassSubclass + : null; const secondAbilities = secondKey === 'sub' ? subclass : multiclassSubclass; - const secondType = secondBase ? secondBase.system.masteryFeature.unlocked ? 'mastery' : secondBase.system.specializationFeature.unlocked ? 'specialization' : 'foundation' : null; - const second = !secondBase ? null : { - type: secondType, - multiclass: secondKey === 'multi', - img: secondBase.img, - subtitle: secondBase.system.masteryFeature.unlocked ? game.i18n.localize("DAGGERHEART.Sheets.PC.DomainCard.MasteryTitle") : - secondBase.system.specializationFeature.unlocked ? game.i18n.localize("DAGGERHEART.Sheets.PC.DomainCard.SpecializationTitle") : game.i18n.localize("DAGGERHEART.Sheets.PC.DomainCard.FoundationTitle"), - domains: secondKey === 'sub' ? actor.system.class.system.domains.map(x => config.DOMAIN.domains[x].src) : actor.system.multiclass.system.domains.map(x => config.DOMAIN.domains[x].src), - className: secondKey === 'sub' ? actor.system.class.name : actor.system.multiclass.name, - subclassUuid: secondBase.uuid, - subclassName: secondBase.name, - spellcast: secondKey === 'sub' || secondBase.system.specializationFeature.unlocked ? null : config.ACTOR.abilities[firstBase.system.spellcastingTrait]?.name ?? null, - description: - secondBase.system.masteryFeature.unlocked ? secondBase.system.masteryFeature.description : - secondBase.system.specializationFeature.unlocked ? secondBase.system.specializationFeature.description : firstBase.system.foundationFeature.description, - abilities: - secondBase.system.masteryFeature.unlocked ? secondAbilities.mastery : - secondBase.system.specializationFeature.unlocked ? secondAbilities.specialization : secondAbilities.foundation, - abilityKey: secondBase.system.masteryFeature.unlocked ? 'masteryFeature' : secondBase.system.specializationFeature.unlocked ? 'specializationFeature' : 'foundationFeature', - }; + const secondType = secondBase + ? secondBase.system.masteryFeature.unlocked + ? 'mastery' + : secondBase.system.specializationFeature.unlocked + ? 'specialization' + : 'foundation' + : null; + const second = !secondBase + ? null + : { + type: secondType, + multiclass: secondKey === 'multi', + img: secondBase.img, + subtitle: secondBase.system.masteryFeature.unlocked + ? game.i18n.localize('DAGGERHEART.Sheets.PC.DomainCard.MasteryTitle') + : secondBase.system.specializationFeature.unlocked + ? game.i18n.localize('DAGGERHEART.Sheets.PC.DomainCard.SpecializationTitle') + : game.i18n.localize('DAGGERHEART.Sheets.PC.DomainCard.FoundationTitle'), + domains: + secondKey === 'sub' + ? actor.system.class.system.domains.map(x => config.DOMAIN.domains[x].src) + : actor.system.multiclass.system.domains.map(x => config.DOMAIN.domains[x].src), + className: secondKey === 'sub' ? actor.system.class.name : actor.system.multiclass.name, + subclassUuid: secondBase.uuid, + subclassName: secondBase.name, + spellcast: + secondKey === 'sub' || secondBase.system.specializationFeature.unlocked + ? null + : (config.ACTOR.abilities[firstBase.system.spellcastingTrait]?.name ?? null), + description: secondBase.system.masteryFeature.unlocked + ? secondBase.system.masteryFeature.description + : secondBase.system.specializationFeature.unlocked + ? secondBase.system.specializationFeature.description + : firstBase.system.foundationFeature.description, + abilities: secondBase.system.masteryFeature.unlocked + ? secondAbilities.mastery + : secondBase.system.specializationFeature.unlocked + ? secondAbilities.specialization + : secondAbilities.foundation, + abilityKey: secondBase.system.masteryFeature.unlocked + ? 'masteryFeature' + : secondBase.system.specializationFeature.unlocked + ? 'specializationFeature' + : 'foundationFeature' + }; return { foundation: foundation, first: first, - second: second, - } + second: second + }; } - async attributeChange(event){ + async attributeChange(event) { const path = `system.attributes.${event.currentTarget.dataset.attribute}.data.base`; await this.document.update({ [path]: event.currentTarget.value }); } - static toggleEditAttributes(){ + static toggleEditAttributes() { this.editAttributes = !this.editAttributes; this.render(); } static async rollAttribute(event, target) { - const { roll, hope, fear, advantage, disadvantage, modifiers } = await this.document.dualityRoll({ title: 'Attribute Bonus', value: event.target.dataset.value }, event.shiftKey); + const { roll, hope, fear, advantage, disadvantage, modifiers } = await this.document.dualityRoll( + { title: 'Attribute Bonus', value: event.target.dataset.value }, + event.shiftKey + ); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msgData = { type: 'dualityRoll', system: { @@ -343,70 +495,76 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { hope: hope, fear: fear, advantage: advantage, - disadvantage: disadvantage, + disadvantage: disadvantage }, user: game.user.id, - content: "systems/daggerheart/templates/chat/duality-roll.hbs", + content: 'systems/daggerheart/templates/chat/duality-roll.hbs', rolls: [roll] }; await cls.create(msgData); } - static async toggleMarks(_, button){ + static async toggleMarks(_, button) { const markValue = Number.parseInt(button.dataset.value); - const newValue = this.document.system.armor.system.marks.value >= markValue ? markValue-1 : markValue; + const newValue = this.document.system.armor.system.marks.value >= markValue ? markValue - 1 : markValue; await this.document.system.armor.update({ 'system.marks.value': newValue }); } - static async toggleAttributeMark(_, button){ + static async toggleAttributeMark(_, button) { const attribute = this.document.system.attributes[button.dataset.attribute]; - const newMark = this.document.system.availableAttributeMarks.filter(x => x > Math.max.apply(null, this.document.system.attributes[button.dataset.attribute].levelMarks)).sort((a, b) => a > b ? 1 : -1)[0]; - - if(attribute.levelMark || !newMark) return; + const newMark = this.document.system.availableAttributeMarks + .filter(x => x > Math.max.apply(null, this.document.system.attributes[button.dataset.attribute].levelMarks)) + .sort((a, b) => (a > b ? 1 : -1))[0]; + if (attribute.levelMark || !newMark) return; const path = `system.attributes.${button.dataset.attribute}.levelMarks`; await this.document.update({ [path]: [...attribute.levelMarks, newMark] }); } - static async toggleHP(_, button){ + static async toggleHP(_, button) { const healthValue = Number.parseInt(button.dataset.value); - const newValue = this.document.system.resources.health.value >= healthValue ? healthValue-1 : healthValue; + const newValue = this.document.system.resources.health.value >= healthValue ? healthValue - 1 : healthValue; await this.document.update({ 'system.resources.health.value': newValue }); } - static async toggleStress(_, button){ + static async toggleStress(_, button) { const healthValue = Number.parseInt(button.dataset.value); - const newValue = this.document.system.resources.stress.value >= healthValue ? healthValue-1 : healthValue; + const newValue = this.document.system.resources.stress.value >= healthValue ? healthValue - 1 : healthValue; await this.document.update({ 'system.resources.stress.value': newValue }); } - static async toggleHope(_, button){ + static async toggleHope(_, button) { const hopeValue = Number.parseInt(button.dataset.value); - const newValue = this.document.system.resources.hope.value >= hopeValue ? hopeValue-1 : hopeValue; + const newValue = this.document.system.resources.hope.value >= hopeValue ? hopeValue - 1 : hopeValue; await this.document.update({ 'system.resources.hope.value': newValue }); } - static async toggleGold(_, button){ + static async toggleGold(_, button) { const goldValue = Number.parseInt(button.dataset.value); const goldType = button.dataset.type; - const newValue = this.document.system.gold[goldType] >= goldValue ? goldValue-1 : goldValue; + const newValue = this.document.system.gold[goldType] >= goldValue ? goldValue - 1 : goldValue; const update = `system.gold.${goldType}`; await this.document.update({ [update]: newValue }); } - static async attackRoll(_, event){ + static async attackRoll(_, event) { const weapon = await fromUuid(event.currentTarget.dataset.weapon); const damage = { - value: `${this.document.system.proficiency.value}${weapon.system.damage.value}`, - type: weapon.system.damage.type, - bonusDamage: this.document.system.bonuses.damage + value: `${this.document.system.proficiency.value}${weapon.system.damage.value}`, + type: weapon.system.damage.type, + bonusDamage: this.document.system.bonuses.damage }; const modifier = this.document.system.attributes[weapon.system.trait].data.value; - const { roll, hope, fear, advantage, disadvantage, modifiers, bonusDamageString } = await this.document.dualityRoll({ title: 'Attribute Modifier', value: modifier }, event.shiftKey, damage.bonusDamage); + const { roll, hope, fear, advantage, disadvantage, modifiers, bonusDamageString } = + await this.document.dualityRoll( + { title: 'Attribute Modifier', value: modifier }, + event.shiftKey, + damage.bonusDamage + ); damage.value = damage.value.concat(bonusDamageString); @@ -415,10 +573,10 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { name: x.actor.name, img: x.actor.img, difficulty: x.actor.system.difficulty, - evasion: x.actor.system.evasion, + evasion: x.actor.system.evasion })); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ type: 'dualityRoll', system: { @@ -429,89 +587,90 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { advantage: advantage, disadvantage: disadvantage, damage: damage, - targets: targets, + targets: targets }, - content: "systems/daggerheart/templates/chat/attack-roll.hbs", + content: 'systems/daggerheart/templates/chat/attack-roll.hbs', rolls: [roll] }); await cls.create(msg.toObject()); } - tabSwitch(event){ + tabSwitch(event) { const tab = event.currentTarget.dataset.tab; - if(tab !== 'loadout'){ + if (tab !== 'loadout') { this.onVaultTab = false; } this.render(); } - openLevelUp(){ + openLevelUp() { new DhpLevelup(this.document).render(true); } - static domainCardsTab(toVault){ + static domainCardsTab(toVault) { this.onVaultTab = toVault; this.render(); } - static async moveDomainCard(button, toVault){ - if(!toVault && this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout){ + static async moveDomainCard(button, toVault) { + if (!toVault && this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout) { return; } const card = this.document.items.find(x => x.uuid === button.dataset.domain); - await card.update({ "system.inVault": toVault }); + await card.update({ 'system.inVault': toVault }); } - static async useDomainCard(_, button){ + static async useDomainCard(_, button) { const card = this.document.items.find(x => x.uuid === button.dataset.key); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ type: 'abilityUse', user: game.user.id, - content: "systems/daggerheart/templates/chat/ability-use.hbs", + content: 'systems/daggerheart/templates/chat/ability-use.hbs', system: { - title: `${game.i18n.localize("DAGGERHEART.Chat.DomainCard.Title")} - ${capitalize(button.dataset.domain)}`, + title: `${game.i18n.localize('DAGGERHEART.Chat.DomainCard.Title')} - ${capitalize(button.dataset.domain)}`, img: card.img, name: card.name, description: card.system.effect, - actions: card.system.actions, - }, + actions: card.system.actions + } }); cls.create(msg.toObject()); } - static async selectClass(){ + static async selectClass() { (await game.packs.get('daggerheart.playtest-classes'))?.render(true); } - static async selectSubclass(){ + static async selectSubclass() { (await game.packs.get('daggerheart.playtest-subclasses'))?.render(true); } - static async selectAncestry(){ + static async selectAncestry() { const dialogClosed = new Promise((resolve, _) => { new AncestrySelectionDialog(resolve).render(true); - }); + }); const result = await dialogClosed; // await this.emulateItemDrop({ type: 'item', data: result }); - for(var ancestry of this.document.items.filter(x => x => x.type === 'ancestry')){ + for (var ancestry of this.document.items.filter(x => x => x.type === 'ancestry')) { await ancestry.delete(); } const createdItems = []; - for(var feature of this.document.items.filter(x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.ancestry.id)){ + for (var feature of this.document.items.filter( + x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.ancestry.id + )) { await feature.delete(); } // createdItems.push(...result.data.system.abilities); createdItems.push(result.data); - await this.document.createEmbeddedDocuments('Item', createdItems); @@ -519,86 +678,97 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { // (await game.packs.get('daggerheart.playtest-ancestries'))?.render(true); } - static async selectCommunity(){ - (await game.packs.get('daggerheart.playtest-communities'))?.render(true);; + static async selectCommunity() { + (await game.packs.get('daggerheart.playtest-communities'))?.render(true); } - static async viewObject(button){ + static async viewObject(button) { const object = await fromUuid(button.dataset.value); - if(!object) return; + if (!object) return; const tab = button.dataset.tab; - if(tab) object.sheet._tabs[0].active = tab; + if (tab) object.sheet._tabs[0].active = tab; - if(object.sheet.editMode) object.sheet.editMode = false; + if (object.sheet.editMode) object.sheet.editMode = false; object.sheet.render(true); } - static async takeShortRest(){ + static async takeShortRest() { await new DhpDowntime(this.document, true).render(true); await this.minimize(); } - static async takeLongRest(){ + static async takeLongRest() { await new DhpDowntime(this.document, false).render(true); await this.minimize(); } - static async removeActiveItem(_, event){ + static async removeActiveItem(_, event) { event.stopPropagation(); const item = await fromUuid(event.currentTarget.dataset.item); await item.delete(); } - static async removeInventoryWeapon(_, event){ + static async removeInventoryWeapon(_, event) { event.stopPropagation(); const item = await fromUuid(event.currentTarget.dataset.item); await item.delete(); } - static async addMiscItem(){ - const result = await this.document.createEmbeddedDocuments("Item", [{ - name: game.i18n.localize('DAGGERHEART.Sheets.PC.NewItem'), - type: 'miscellaneous' - }]); + static async addMiscItem() { + const result = await this.document.createEmbeddedDocuments('Item', [ + { + name: game.i18n.localize('DAGGERHEART.Sheets.PC.NewItem'), + type: 'miscellaneous' + } + ]); await result[0].sheet.render(true); } - static async addScar(){ - if(this.document.system.story.scars.length === 5) return; + static async addScar() { + if (this.document.system.story.scars.length === 5) return; - await this.document.update({ "system.story.scars": [...this.document.system.story.scars, { name: game.i18n.localize("DAGGERHEART.Sheets.PC.NewScar"), description: '' }] }); + await this.document.update({ + 'system.story.scars': [ + ...this.document.system.story.scars, + { name: game.i18n.localize('DAGGERHEART.Sheets.PC.NewScar'), description: '' } + ] + }); } - static async selectScar(_, button){ + static async selectScar(_, button) { this.selectedScar = Number.parseInt(button.dataset.value); this.render(); } static async deleteScar(event, button) { event.stopPropagation(); - await this.document.update({ "system.story.scars": this.document.system.story.scars.filter((_, index) => index !== Number.parseInt(button.currentTarget.dataset.scar) ) }) + await this.document.update({ + 'system.story.scars': this.document.system.story.scars.filter( + (_, index) => index !== Number.parseInt(button.currentTarget.dataset.scar) + ) + }); } static async makeDeathMove() { - if(this.document.system.resources.health.value === this.document.system.resources.health.max){ + if (this.document.system.resources.health.value === this.document.system.resources.health.max) { await new DhpDeathMove(this.document).render(true); await this.minimize(); } } - static async toggleFeatureDice(_, button){ + static async toggleFeatureDice(_, button) { const index = Number.parseInt(button.dataset.index); const feature = this.document.system.classFeatures.find(x => x.uuid === button.dataset.feature); const path = `system.featureType.data.numbers.${index}`; - if(feature.system.featureType.data.numbers[index]?.used) return; + if (feature.system.featureType.data.numbers[index]?.used) return; - if(Object.keys(feature.system.featureType.data.numbers).length <= index) { + if (Object.keys(feature.system.featureType.data.numbers).length <= index) { const roll = new Roll(feature.system.featureType.data.value); const rollData = await roll.evaluate(); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ user: game.user.id, rolls: [roll] @@ -609,45 +779,49 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { await feature.update({ [path]: { value: Number.parseInt(rollData.total), used: false } }); } else { await Dialog.confirm({ - title: game.i18n.localize("Confirm feature use"), + title: game.i18n.localize('Confirm feature use'), content: `Are you sure you want to use ${feature.name}?`, yes: async () => { await feature.update({ [path]: { used: true } }); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/ability-use.hbs", { - title: game.i18n.localize("DAGGERHEART.Chat.FeatureTitle"), - card: { name: `${feature.name} - Roll Of ${feature.system.featureType.data.numbers[index].value}`, img: feature.img }, - }), + content: await renderTemplate('systems/daggerheart/templates/chat/ability-use.hbs', { + title: game.i18n.localize('DAGGERHEART.Chat.FeatureTitle'), + card: { + name: `${feature.name} - Roll Of ${feature.system.featureType.data.numbers[index].value}`, + img: feature.img + } + }) }); cls.create(msg.toObject()); }, - no: () => { return; }, + no: () => { + return; + }, defaultYes: false }); - } } - async onFeatureInputBlur(event){ + async onFeatureInputBlur(event) { const feature = this.document.system.classFeatures.find(x => x.uuid === event.currentTarget.dataset.feature); const value = Number.parseInt(event.currentTarget.value); - if(!Number.isNaN(value)) await feature?.update({ "system.featureType.data.value": value }); + if (!Number.isNaN(value)) await feature?.update({ 'system.featureType.data.value': value }); } - async experienceDescriptionChange(event){ + async experienceDescriptionChange(event) { const newExperiences = [...this.document.system.experiences]; newExperiences[event.currentTarget.dataset.index].description = event.currentTarget.value; - await this.document.update({ "system.experiences": newExperiences }); + await this.document.update({ 'system.experiences': newExperiences }); } - async experienceValueChange(event){ + async experienceValueChange(event) { const newExperiences = [...this.document.system.experiences]; newExperiences[event.currentTarget.dataset.index].value = event.currentTarget.value; - await this.document.update({ "system.experiences": newExperiences }); + await this.document.update({ 'system.experiences': newExperiences }); } static setStoryEditor(_, button) { @@ -655,37 +829,37 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { this.render(); } - async itemUpdate(event){ + async itemUpdate(event) { const name = event.currentTarget.dataset.item; const item = await fromUuid($(event.currentTarget).closest('[data-item-id]')[0].dataset.itemId); await item.update({ [name]: event.currentTarget.value }); } - static async deleteItem(_, button){ + static async deleteItem(_, button) { const item = await fromUuid($(button).closest('[data-item-id]')[0].dataset.itemId); await item.delete(); } - static async setItemQuantity(button, value){ + static async setItemQuantity(button, value) { const item = await fromUuid($(button).closest('[data-item-id]')[0].dataset.itemId); - await item.update({ "system.quantity": Math.max(item.system.quantity + value, 1) }); + await item.update({ 'system.quantity': Math.max(item.system.quantity + value, 1) }); } static async useFeature(_, button) { const item = await fromUuid(button.dataset.id); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ type: 'abilityUse', user: game.user.id, - content: "systems/daggerheart/templates/chat/ability-use.hbs", + content: 'systems/daggerheart/templates/chat/ability-use.hbs', system: { - title: game.i18n.localize("DAGGERHEART.Chat.FeatureTitle"), + title: game.i18n.localize('DAGGERHEART.Chat.FeatureTitle'), img: item.img, name: item.name, description: item.system.description, - actions: item.system.actions, - }, + actions: item.system.actions + } }); cls.create(msg.toObject()); @@ -693,147 +867,165 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { static async useAbility(_, button) { const item = await fromUuid(button.dataset.feature); - const type = button.dataset.type + const type = button.dataset.type; - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ type: 'abilityUse', user: game.user.id, system: { - title: type === 'ancestry' ? game.i18n.localize("DAGGERHEART.Chat.FoundationCard.AncestryTitle") : - type === 'community' ? game.i18n.localize("DAGGERHEART.Chat.FoundationCard.CommunityTitle") : - game.i18n.localize("DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle"), + title: + type === 'ancestry' + ? game.i18n.localize('DAGGERHEART.Chat.FoundationCard.AncestryTitle') + : type === 'community' + ? game.i18n.localize('DAGGERHEART.Chat.FoundationCard.CommunityTitle') + : game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'), img: item.img, name: item.name, description: item.system.description, - actions: [], + actions: [] }, - content: "systems/daggerheart/templates/chat/ability-use.hbs", + content: 'systems/daggerheart/templates/chat/ability-use.hbs' }); cls.create(msg.toObject()); } - static async useAdvancementCard(_, button){ - const item = button.dataset.multiclass === 'true' ? this.document.system.multiclassSubclass : this.document.system.subclass; + static async useAdvancementCard(_, button) { + const item = + button.dataset.multiclass === 'true' + ? this.document.system.multiclassSubclass + : this.document.system.subclass; const ability = item.system[`${button.dataset.key}Feature`]; const title = `${item.name} - ${game.i18n.localize(`DAGGERHEART.Sheets.PC.DomainCard.${capitalize(button.dataset.key)}Title`)}`; - - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/ability-use.hbs", { - title: game.i18n.localize("DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle"), - card: { name: title, img: item.img, description: ability.description }, - }), + content: await renderTemplate('systems/daggerheart/templates/chat/ability-use.hbs', { + title: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'), + card: { name: title, img: item.img, description: ability.description } + }) }); cls.create(msg.toObject()); } - static async useAdvancementAbility(_, button){ + static async useAdvancementAbility(_, button) { // const item = await fromUuid(button.dataset.id); const item = this.document.items.find(x => x.uuid === button.dataset.id); - const cls = getDocumentClass("ChatMessage"); + const cls = getDocumentClass('ChatMessage'); const msg = new cls({ user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/ability-use.hbs", { - title: game.i18n.localize("DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle"), - card: { name: item.name, img: item.img, description: item.system.description }, - }), + content: await renderTemplate('systems/daggerheart/templates/chat/ability-use.hbs', { + title: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'), + card: { name: item.name, img: item.img, description: item.system.description } + }) }); cls.create(msg.toObject()); } - static async selectFeatureSet(_, button){ + static async selectFeatureSet(_, button) { const multiclass = button.dataset.multiclass === 'true'; this.multiclassFeatureSetSelected = multiclass; this.render(); } - static async close(options){ + static async close(options) { this.onVaultTab = false; super.close(options); } - async _onDragStart(_, event){ - if(event.currentTarget.classList.contains('inventory-item')){ - if(!['weapon', 'armor'].includes(event.currentTarget.dataset.type)){ + async _onDragStart(_, event) { + if (event.currentTarget.classList.contains('inventory-item')) { + if (!['weapon', 'armor'].includes(event.currentTarget.dataset.type)) { return; } const targets = { - 'weapon': ['weapon-section', 'inventory-weapon-section'], - 'armor': ['armor-section', 'inventory-armor-section'], + weapon: ['weapon-section', 'inventory-weapon-section'], + armor: ['armor-section', 'inventory-armor-section'] }; - event.dataTransfer.setData("text/plain", JSON.stringify({ uuid: event.currentTarget.dataset.item, internal: true, targets: targets[event.currentTarget.dataset.type] })); + event.dataTransfer.setData( + 'text/plain', + JSON.stringify({ + uuid: event.currentTarget.dataset.item, + internal: true, + targets: targets[event.currentTarget.dataset.type] + }) + ); } super._onDragStart(event); } - async _onDrop(event){ + async _onDrop(event) { const itemData = event.dataTransfer?.getData('text/plain'); const item = itemData ? JSON.parse(itemData) : null; - if (item?.internal){ + if (item?.internal) { let target = null; event.currentTarget.classList.forEach(x => { - if(item.targets.some(target => target === x)){ + if (item.targets.some(target => target === x)) { target = x; } }); - if(target){ + if (target) { const itemObject = await fromUuid(item.uuid); - switch(target){ + switch (target) { case 'weapon-section': - if(itemObject.system.secondary && this.document.system.activeWeapons.burden === 'twoHanded'){ - ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.SecondaryEquipWhileTwohanded")); + if (itemObject.system.secondary && this.document.system.activeWeapons.burden === 'twoHanded') { + ui.notifications.info( + game.i18n.localize('DAGGERHEART.Notification.Info.SecondaryEquipWhileTwohanded') + ); return; - } - else if(itemObject.system.burden === 'twoHanded' && this.document.system.activeWeapons.secondary){ - ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.TwohandedEquipWhileSecondary")); + } else if ( + itemObject.system.burden === 'twoHanded' && + this.document.system.activeWeapons.secondary + ) { + ui.notifications.info( + game.i18n.localize('DAGGERHEART.Notification.Info.TwohandedEquipWhileSecondary') + ); return; } - const existingWeapon = this.document.items.find(x => x.system.active && x.system.secondary === itemObject.system.secondary); - await existingWeapon?.update({ "system.active": false }); - await itemObject.update({ "system.active": true }); + const existingWeapon = this.document.items.find( + x => x.system.active && x.system.secondary === itemObject.system.secondary + ); + await existingWeapon?.update({ 'system.active': false }); + await itemObject.update({ 'system.active': true }); break; case 'armor-section': const existingArmor = this.document.items.find(x => x.type === 'armor' && x.system.active); - await existingArmor?.update({ "system.active": false }); - await itemObject.update({ "system.active": true }); + await existingArmor?.update({ 'system.active': false }); + await itemObject.update({ 'system.active': true }); break; case 'inventory-weapon-section': const existingInventoryWeapon = this.document.items.find(x => x.system.inventoryWeapon); - await existingInventoryWeapon?.update({ "system.inventoryWeapon": false }); - await itemObject.update({ "system.inventoryWeapon": true }); + await existingInventoryWeapon?.update({ 'system.inventoryWeapon': false }); + await itemObject.update({ 'system.inventoryWeapon': true }); break; case 'inventory-armor-section': const existingInventoryArmor = this.document.items.find(x => x.system.inventoryArmor); - await existingInventoryArmor?.update({ "system.inventoryArmor": false }); - await itemObject.update({ "system.inventoryArmor": true }); + await existingInventoryArmor?.update({ 'system.inventoryArmor': false }); + await itemObject.update({ 'system.inventoryArmor': true }); break; } } - } - else { + } else { super._onDrop(event); this._onDropItem(event, TextEditor.getDragEventData(event)); } } - async _onDropItem(event, data){ - if(this.dropItemBlock){ + async _onDropItem(event, data) { + if (this.dropItemBlock) { return; - } - else { + } else { this.dropItemBlock = true; - setTimeout(() => this.dropItemBlock = false, 500); + setTimeout(() => (this.dropItemBlock = false), 500); } const element = event.currentTarget; @@ -842,65 +1034,70 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { const createdItems = []; - if(item.type === 'domainCard'){ - if(!this.document.system.class) - { - ui.notifications.error(game.i18n.localize("DAGGERHEART.Notification.Error.NoClassSelected")); + if (item.type === 'domainCard') { + if (!this.document.system.class) { + ui.notifications.error(game.i18n.localize('DAGGERHEART.Notification.Error.NoClassSelected')); return; } - if(!this.document.system.domains.find(x => x === item.system.domain)){ - ui.notifications.error(game.i18n.localize("DAGGERHEART.Notification.Error.LacksDomain")); + if (!this.document.system.domains.find(x => x === item.system.domain)) { + ui.notifications.error(game.i18n.localize('DAGGERHEART.Notification.Error.LacksDomain')); return; } - if(this.document.system.domainCards.total.length === this.document.system.domainData.maxCards){ - ui.notifications.error(game.i18n.localize("DAGGERHEART.Notification.Error.MaxLoadoutReached")); + if (this.document.system.domainCards.total.length === this.document.system.domainData.maxCards) { + ui.notifications.error(game.i18n.localize('DAGGERHEART.Notification.Error.MaxLoadoutReached')); return; } - if(this.document.system.domainCards.total.find(x => x.name === item.name)){ - ui.notifications.error(game.i18n.localize("DAGGERHEART.Notification.Error.DuplicateDomainCard")); + if (this.document.system.domainCards.total.find(x => x.name === item.name)) { + ui.notifications.error(game.i18n.localize('DAGGERHEART.Notification.Error.DuplicateDomainCard')); return; } - if(this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout){ + if (this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout) { itemData.system.inVault = true; } - if ( this.document.uuid === item.parent?.uuid ) return this._onSortItem(event, itemData); + if (this.document.uuid === item.parent?.uuid) return this._onSortItem(event, itemData); const createdItem = await this._onDropItemCreate(itemData); return createdItem; - } - else { - if(!item.system.multiclass && ['class', 'subclass', 'ancestry', 'community'].includes(item.type)){ + } else { + if (!item.system.multiclass && ['class', 'subclass', 'ancestry', 'community'].includes(item.type)) { const existing = this.document.items.find(x => x.type === item.type); await existing?.delete(); } - if(item.type === 'subclass'){ - if(!item.system.multiclass){ - if(!this.document.system.class){ - ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.SelectClassBeforeSubclass")); + if (item.type === 'subclass') { + if (!item.system.multiclass) { + if (!this.document.system.class) { + ui.notifications.info( + game.i18n.localize('DAGGERHEART.Notification.Info.SelectClassBeforeSubclass') + ); return; - } - else if(!this.document.system.class.system.subclasses.some(x => x.uuid === item.uuid)){ - ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.SubclassNotOfClass")); + } else if (!this.document.system.class.system.subclasses.some(x => x.uuid === item.uuid)) { + ui.notifications.info(game.i18n.localize('DAGGERHEART.Notification.Info.SubclassNotOfClass')); return; } - for(var feature of this.document.items.filter(x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.subclass.id)){ + for (var feature of this.document.items.filter( + x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.subclass.id + )) { await feature.delete(); } } - const features = [itemData.system.foundationFeature, itemData.system.specializationFeature, itemData.system.masteryFeature]; - for(var i = 0; i < features.length; i++){ + const features = [ + itemData.system.foundationFeature, + itemData.system.specializationFeature, + itemData.system.masteryFeature + ]; + for (var i = 0; i < features.length; i++) { const feature = features[i]; - for(var ability of feature.abilities){ + for (var ability of feature.abilities) { const data = (await fromUuid(ability.uuid)).toObject(); - if(i > 0 ) data.system.disabled = true; + if (i > 0) data.system.disabled = true; data.uuid = itemData.uuid; const abilityData = await this._onDropItemCreate(data); @@ -909,87 +1106,98 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { createdItems.push(abilityData); } } - } - else if(item.type === 'class'){ - if(!item.system.multiclass){ - for(var feature of this.document.items.filter(x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.class.id)){ + } else if (item.type === 'class') { + if (!item.system.multiclass) { + for (var feature of this.document.items.filter( + x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.class.id + )) { await feature.delete(); } } - for(var feature of item.system.features){ + for (var feature of item.system.features) { const data = (await fromUuid(feature.uuid)).toObject(); const itemData = await this._onDropItemCreate(data); createdItems.push(itemData); } - } - else if(item.type === 'ancestry'){ - for(var feature of this.document.items.filter(x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.ancestry.id)){ + } else if (item.type === 'ancestry') { + for (var feature of this.document.items.filter( + x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.ancestry.id + )) { await feature.delete(); } - for(var feature of item.system.abilities){ + for (var feature of item.system.abilities) { const data = (await fromUuid(feature.uuid)).toObject(); const itemData = await this._onDropItemCreate(data); createdItems.push(itemData); } - } - else if(item.type === 'community'){ - for(var feature of this.document.items.filter(x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.community.id)){ + } else if (item.type === 'community') { + for (var feature of this.document.items.filter( + x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.community.id + )) { await feature.delete(); } - for(var feature of item.system.abilities){ + for (var feature of item.system.abilities) { const data = (await fromUuid(feature.uuid)).toObject(); const itemData = await this._onDropItemCreate(data); createdItems.push(itemData); } } - if ( this.document.uuid === item.parent?.uuid ) return this._onSortItem(event, item); + if (this.document.uuid === item.parent?.uuid) return this._onSortItem(event, item); - if(item.type === 'weapon'){ - if(!element) return; + if (item.type === 'weapon') { + if (!element) return; - if(element.classList.contains('weapon-section')){ - if(item.system.secondary && this.document.system.activeWeapons.burden === 'twoHanded'){ - ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.SecondaryEquipWhileTwohanded")); + if (element.classList.contains('weapon-section')) { + if (item.system.secondary && this.document.system.activeWeapons.burden === 'twoHanded') { + ui.notifications.info( + game.i18n.localize('DAGGERHEART.Notification.Info.SecondaryEquipWhileTwohanded') + ); return; - } - else if(item.system.burden === 'twoHanded' && this.document.system.activeWeapons.secondary){ - ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.TwohandedEquipWhileSecondary")); + } else if (item.system.burden === 'twoHanded' && this.document.system.activeWeapons.secondary) { + ui.notifications.info( + game.i18n.localize('DAGGERHEART.Notification.Info.TwohandedEquipWhileSecondary') + ); return; } - const existing = this.document.system.activeWeapons.primary && !item.system.secondary ? await fromUuid(this.document.system.activeWeapons.primary.uuid) : - this.document.system.activeWeapons.secondary && item.system.secondary ? await fromUuid(this.document.system.activeWeapons.secondary.uuid) : null; + const existing = + this.document.system.activeWeapons.primary && !item.system.secondary + ? await fromUuid(this.document.system.activeWeapons.primary.uuid) + : this.document.system.activeWeapons.secondary && item.system.secondary + ? await fromUuid(this.document.system.activeWeapons.secondary.uuid) + : null; await existing?.delete(); itemData.system.active = true; - } - else if(element.classList.contains('inventory-weapon-section-first')){ - const existing = this.document.system.inventoryWeapons.first ? await fromUuid(this.document.system.inventoryWeapons.first.uuid) : null; + } else if (element.classList.contains('inventory-weapon-section-first')) { + const existing = this.document.system.inventoryWeapons.first + ? await fromUuid(this.document.system.inventoryWeapons.first.uuid) + : null; await existing?.delete(); itemData.system.inventoryWeapon = 1; - } - else if(element.classList.contains('inventory-weapon-section-second')){ - const existing = this.document.system.inventoryWeapons.second ? await fromUuid(this.document.system.inventoryWeapons.second.uuid) : null; + } else if (element.classList.contains('inventory-weapon-section-second')) { + const existing = this.document.system.inventoryWeapons.second + ? await fromUuid(this.document.system.inventoryWeapons.second.uuid) + : null; await existing?.delete(); itemData.system.inventoryWeapon = 2; - } - else return []; + } else return []; } - if(item.type === 'armor'){ - if(!element) return; + if (item.type === 'armor') { + if (!element) return; - if(element.classList.contains('armor-section')){ - const existing = this.document.system.armor ? await fromUuid(this.document.system.armor.uuid) : null; + if (element.classList.contains('armor-section')) { + const existing = this.document.system.armor + ? await fromUuid(this.document.system.armor.uuid) + : null; await existing?.delete(); - } - - else return; + } else return; } const createdItem = await this._onDropItemCreate(itemData); @@ -1001,11 +1209,11 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { async _onDropItemCreate(itemData, event) { itemData = itemData instanceof Array ? itemData : [itemData]; - return this.document.createEmbeddedDocuments("Item", itemData); + return this.document.createEmbeddedDocuments('Item', itemData); } async emulateItemDrop(data) { - const event = new DragEvent("drop", { altKey: game.keyboard.isModifierActive("Alt") }); + const event = new DragEvent('drop', { altKey: game.keyboard.isModifierActive('Alt') }); return this._onDropItem(event, data); } } @@ -1400,7 +1608,6 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { // if(attribute.levelMark || !newMark) return; - // const path = `system.attributes.${button.dataset.attribute}.levelMarks`; // await this.actor.update({ [path]: [...attribute.levelMarks, newMark] }); // } @@ -1546,7 +1753,6 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { // // createdItems.push(...result.data.system.abilities); // createdItems.push(result.data); - // await this.actor.createEmbeddedDocuments('Item', createdItems); @@ -1754,7 +1960,6 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) { // const ability = item.system[`${button.dataset.key}Feature`]; // const title = `${item.name} - ${game.i18n.localize(`DAGGERHEART.Sheets.PC.DomainCard.${capitalize(button.dataset.key)}Title`)}`; - // const cls = getDocumentClass("ChatMessage"); // const msg = new cls({ // user: game.user.id, diff --git a/module/applications/sheets/subclass.mjs b/module/applications/sheets/subclass.mjs index 0608b2f8..e9df7e1d 100644 --- a/module/applications/sheets/subclass.mjs +++ b/module/applications/sheets/subclass.mjs @@ -51,7 +51,7 @@ // const feature = event.currentTarget.dataset.feature; // const newAbilities = this.item.system[`${feature}Feature`].abilities.filter(x => x.uuid !== event.currentTarget.dataset.ability); // const path = `system.${feature}Feature.abilities`; - + // await this.item.update({ [path]: newAbilities }); // } @@ -79,46 +79,74 @@ const { ItemSheetV2 } = foundry.applications.sheets; export default class SubclassSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-subclass", - classes: ["daggerheart", "sheet", "subclass"], + id: 'daggerheart-subclass', + classes: ['daggerheart', 'sheet', 'subclass'], position: { width: 600 }, actions: { editAbility: this.editAbility, - deleteFeatureAbility: this.deleteFeatureAbility, + deleteFeatureAbility: this.deleteFeatureAbility }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, + closeOnSubmit: false }, dragDrop: [ { dragSelector: null, dropSelector: '.foundation-tab' }, { dragSelector: null, dropSelector: '.specialization-tab' }, { dragSelector: null, dropSelector: '.mastery-tab' } - ], + ] }; _getTabs() { const tabs = { - general: { active: true, cssClass: '', group: 'primary', id: 'general', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.General') }, - foundation: { active: false, cssClass: '', group: 'primary', id: 'foundation', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.Foundation') }, - specialization: { active: false, cssClass: '', group: 'primary', id: 'specialization', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.Specialization') }, - mastery: { active: false, cssClass: '', group: 'primary', id: 'mastery', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.Mastery') }, - } - for ( const v of Object.values(tabs) ) { + general: { + active: true, + cssClass: '', + group: 'primary', + id: 'general', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.General') + }, + foundation: { + active: false, + cssClass: '', + group: 'primary', + id: 'foundation', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.Foundation') + }, + specialization: { + active: false, + cssClass: '', + group: 'primary', + id: 'specialization', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.Specialization') + }, + mastery: { + active: false, + cssClass: '', + group: 'primary', + id: 'mastery', + icon: null, + label: game.i18n.localize('DAGGERHEART.Sheets.Subclass.Tabs.Mastery') + } + }; + for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; - v.cssClass = v.active ? "active" : ""; + v.cssClass = v.active ? 'active' : ''; } return tabs; } - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/subclass.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/subclass.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -130,39 +158,51 @@ export default class SubclassSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } - static async editAbility(_, button){ + static async editAbility(_, button) { const feature = await fromUuid(button.dataset.ability); feature.sheet.render(true); } - static async deleteFeatureAbility(event, button){ + static async deleteFeatureAbility(event, button) { event.preventDefault(); event.stopPropagation(); const feature = button.dataset.feature; - const newAbilities = this.document.system[`${feature}Feature`].abilities.filter(x => x.uuid !== button.dataset.ability); + const newAbilities = this.document.system[`${feature}Feature`].abilities.filter( + x => x.uuid !== button.dataset.ability + ); const path = `system.${feature}Feature.abilities`; - + await this.document.update({ [path]: newAbilities }); } async _onDrop(event) { const data = TextEditor.getDragEventData(event); const item = await fromUuid(data.uuid); - if(item.type === 'feature' && item.system.type === SYSTEM.ITEM.featureTypes.subclass.id) { - if(event.currentTarget.classList.contains('foundation-tab')){ - await this.document.update({ "system.foundationFeature.abilities": [...this.document.system.foundationFeature.abilities, item.system] }); - } - else if(event.currentTarget.classList.contains('specialization-tab')){ - await this.document.update({ "system.specializationFeature.abilities": [...this.document.system.specializationFeature.abilities, data.system] }); - } - else if(event.currentTarget.classList.contains('mastery-tab')){ - await this.document.update({ "system.masteryFeature.abilities": [...this.document.system.masteryFeature.abilities, data.system] }); + if (item.type === 'feature' && item.system.type === SYSTEM.ITEM.featureTypes.subclass.id) { + if (event.currentTarget.classList.contains('foundation-tab')) { + await this.document.update({ + 'system.foundationFeature.abilities': [ + ...this.document.system.foundationFeature.abilities, + item.system + ] + }); + } else if (event.currentTarget.classList.contains('specialization-tab')) { + await this.document.update({ + 'system.specializationFeature.abilities': [ + ...this.document.system.specializationFeature.abilities, + data.system + ] + }); + } else if (event.currentTarget.classList.contains('mastery-tab')) { + await this.document.update({ + 'system.masteryFeature.abilities': [...this.document.system.masteryFeature.abilities, data.system] + }); } } } -} \ No newline at end of file +} diff --git a/module/applications/sheets/weapon.mjs b/module/applications/sheets/weapon.mjs index 16470595..15473380 100644 --- a/module/applications/sheets/weapon.mjs +++ b/module/applications/sheets/weapon.mjs @@ -20,7 +20,6 @@ // return context; // } - // async _handleAction(action, event, button) { // switch(action){ // } @@ -30,25 +29,25 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; const { ItemSheetV2 } = foundry.applications.sheets; -export default class WeaponSheet extends DaggerheartSheet(ItemSheetV2) { +export default class WeaponSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', - id: "daggerheart-weapon", - classes: ["daggerheart", "sheet", "weapon"], + id: 'daggerheart-weapon', + classes: ['daggerheart', 'sheet', 'weapon'], position: { width: 400 }, form: { handler: this.updateForm, submitOnChange: true, - closeOnSubmit: false, - }, + closeOnSubmit: false + } }; - + static PARTS = { form: { - id: "feature", - template: "systems/daggerheart/templates/sheets/weapon.hbs" + id: 'feature', + template: 'systems/daggerheart/templates/sheets/weapon.hbs' } - } + }; async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -59,7 +58,7 @@ export default class WeaponSheet extends DaggerheartSheet(ItemSheetV2) { } static async updateForm(event, _, formData) { - await this.document.update(formData.object) + await this.document.update(formData.object); this.render(); } -} \ No newline at end of file +} diff --git a/module/config/actionConfig.mjs b/module/config/actionConfig.mjs index f77affca..792df85d 100644 --- a/module/config/actionConfig.mjs +++ b/module/config/actionConfig.mjs @@ -1,17 +1,17 @@ export const actionTypes = { damage: { - id: "damage", - name: "DAGGERHEART.Effects.Types.Health.Name" - }, -} + id: 'damage', + name: 'DAGGERHEART.Effects.Types.Health.Name' + } +}; export const targetTypes = { self: { id: 'self', - label: 'Self', + label: 'Self' }, other: { id: 'other', - label: 'Other', - }, -} \ No newline at end of file + label: 'Other' + } +}; diff --git a/module/config/actorConfig.mjs b/module/config/actorConfig.mjs index b73da269..23216b4d 100644 --- a/module/config/actorConfig.mjs +++ b/module/config/actorConfig.mjs @@ -1,164 +1,191 @@ export const abilities = { agility: { - label: "DAGGERHEART.Abilities.Agility.Name", - verbs: ["DAGGERHEART.Abilities.Agility.Verb.Sprint", "DAGGERHEART.Abilities.Agility.Verb.Leap", "DAGGERHEART.Abilities.Agility.Verb.Maneuver"], + label: 'DAGGERHEART.Abilities.Agility.Name', + verbs: [ + 'DAGGERHEART.Abilities.Agility.Verb.Sprint', + 'DAGGERHEART.Abilities.Agility.Verb.Leap', + 'DAGGERHEART.Abilities.Agility.Verb.Maneuver' + ] }, strength: { - label: "DAGGERHEART.Abilities.Strength.Name", - verbs: ["DAGGERHEART.Abilities.Strength.Verb.Lift", "DAGGERHEART.Abilities.Strength.Verb.Smash", "DAGGERHEART.Abilities.Strength.Verb.Grapple"], + label: 'DAGGERHEART.Abilities.Strength.Name', + verbs: [ + 'DAGGERHEART.Abilities.Strength.Verb.Lift', + 'DAGGERHEART.Abilities.Strength.Verb.Smash', + 'DAGGERHEART.Abilities.Strength.Verb.Grapple' + ] }, finesse: { - label: "DAGGERHEART.Abilities.Finesse.Name", - verbs: ["DAGGERHEART.Abilities.Finesse.Verb.Control", "DAGGERHEART.Abilities.Finesse.Verb.Hide", "DAGGERHEART.Abilities.Finesse.Verb.Tinker"], + label: 'DAGGERHEART.Abilities.Finesse.Name', + verbs: [ + 'DAGGERHEART.Abilities.Finesse.Verb.Control', + 'DAGGERHEART.Abilities.Finesse.Verb.Hide', + 'DAGGERHEART.Abilities.Finesse.Verb.Tinker' + ] }, instinct: { - label: "DAGGERHEART.Abilities.Instinct.Name", - verbs: ["DAGGERHEART.Abilities.Instinct.Verb.Perceive", "DAGGERHEART.Abilities.Instinct.Verb.Sense", "DAGGERHEART.Abilities.Instinct.Verb.Navigate"], + label: 'DAGGERHEART.Abilities.Instinct.Name', + verbs: [ + 'DAGGERHEART.Abilities.Instinct.Verb.Perceive', + 'DAGGERHEART.Abilities.Instinct.Verb.Sense', + 'DAGGERHEART.Abilities.Instinct.Verb.Navigate' + ] }, presence: { - label: "DAGGERHEART.Abilities.Presence.Name", - verbs: ["DAGGERHEART.Abilities.Presence.Verb.Charm", "DAGGERHEART.Abilities.Presence.Verb.Perform", "DAGGERHEART.Abilities.Presence.Verb.Deceive"], + label: 'DAGGERHEART.Abilities.Presence.Name', + verbs: [ + 'DAGGERHEART.Abilities.Presence.Verb.Charm', + 'DAGGERHEART.Abilities.Presence.Verb.Perform', + 'DAGGERHEART.Abilities.Presence.Verb.Deceive' + ] }, knowledge: { - label: "DAGGERHEART.Abilities.Knowledge.Name", - verbs: ["DAGGERHEART.Abilities.Knowledge.Verb.Recall", "DAGGERHEART.Abilities.Knowledge.Verb.Analyze", "DAGGERHEART.Abilities.Knowledge.Verb.Comprehend"], - }, + label: 'DAGGERHEART.Abilities.Knowledge.Name', + verbs: [ + 'DAGGERHEART.Abilities.Knowledge.Verb.Recall', + 'DAGGERHEART.Abilities.Knowledge.Verb.Analyze', + 'DAGGERHEART.Abilities.Knowledge.Verb.Comprehend' + ] + } }; export const featureProperties = { agility: { - name: "DAGGERHEART.Abilities.Agility.Name", - path: actor => actor.system.attributes.agility.data.value, + name: 'DAGGERHEART.Abilities.Agility.Name', + path: actor => actor.system.attributes.agility.data.value }, strength: { - name: "DAGGERHEART.Abilities.Strength.Name", - path: actor => actor.system.attributes.strength.data.value, + name: 'DAGGERHEART.Abilities.Strength.Name', + path: actor => actor.system.attributes.strength.data.value }, finesse: { - name: "DAGGERHEART.Abilities.Finesse.Name", - path: actor => actor.system.attributes.finesse.data.value, + name: 'DAGGERHEART.Abilities.Finesse.Name', + path: actor => actor.system.attributes.finesse.data.value }, instinct: { - name: "DAGGERHEART.Abilities.Instinct.Name", - path: actor => actor.system.attributes.instinct.data.value, + name: 'DAGGERHEART.Abilities.Instinct.Name', + path: actor => actor.system.attributes.instinct.data.value }, presence: { - name: "DAGGERHEART.Abilities.Presence.Name", - path: actor => actor.system.attributes.presence.data.value, + name: 'DAGGERHEART.Abilities.Presence.Name', + path: actor => actor.system.attributes.presence.data.value }, knowledge: { - name: "DAGGERHEART.Abilities.Knowledge.Name", - path: actor => actor.system.attributes.knowledge.data.value, + name: 'DAGGERHEART.Abilities.Knowledge.Name', + path: actor => actor.system.attributes.knowledge.data.value }, spellcastingTrait: { - name: "DAGGERHEART.FeatureProperty.SpellcastingTrait", - path: actor => actor.system.attributes[actor.system.subclass.system.spellcastingTrait].data.value, - }, -} + name: 'DAGGERHEART.FeatureProperty.SpellcastingTrait', + path: actor => actor.system.attributes[actor.system.subclass.system.spellcastingTrait].data.value + } +}; export const adversaryTypes = { bruiser: { - name: "DAGGERHEART.Adversary.Bruiser.Name", - description: "DAGGERHEART.Adversary.Bruiser.Description" + name: 'DAGGERHEART.Adversary.Bruiser.Name', + description: 'DAGGERHEART.Adversary.Bruiser.Description' }, horde: { - name: "DAGGERHEART.Adversary.Horde.Name", - description: "DAGGERHEART.Adversary.Horde.Description" + name: 'DAGGERHEART.Adversary.Horde.Name', + description: 'DAGGERHEART.Adversary.Horde.Description' }, leader: { - name: "DAGGERHEART.Adversary.Leader.Name", - description: "DAGGERHEART.Adversary.Leader.Description" + name: 'DAGGERHEART.Adversary.Leader.Name', + description: 'DAGGERHEART.Adversary.Leader.Description' }, minion: { - name: "DAGGERHEART.Adversary.Minion.Name", - description: "DAGGERHEART.Adversary.Minion.Description" + name: 'DAGGERHEART.Adversary.Minion.Name', + description: 'DAGGERHEART.Adversary.Minion.Description' }, ranged: { - name: "DAGGERHEART.Adversary.Ranged.Name", - description: "DAGGERHEART.Adversary.Ranged.Description" + name: 'DAGGERHEART.Adversary.Ranged.Name', + description: 'DAGGERHEART.Adversary.Ranged.Description' }, skulker: { - name: "DAGGERHEART.Adversary.Skulker.Name", - description: "DAGGERHEART.Adversary.Skulker.Description" + name: 'DAGGERHEART.Adversary.Skulker.Name', + description: 'DAGGERHEART.Adversary.Skulker.Description' }, social: { - name: "DAGGERHEART.Adversary.Social.Name", - description: "DAGGERHEART.Adversary.Social.Description" + name: 'DAGGERHEART.Adversary.Social.Name', + description: 'DAGGERHEART.Adversary.Social.Description' }, solo: { - name: "DAGGERHEART.Adversary.Solo.Name", - description: "DAGGERHEART.Adversary.Solo.Description" + name: 'DAGGERHEART.Adversary.Solo.Name', + description: 'DAGGERHEART.Adversary.Solo.Description' }, standard: { - name: "DAGGERHEART.Adversary.Standard.Name", - description: "DAGGERHEART.Adversary.Standard.Description" + name: 'DAGGERHEART.Adversary.Standard.Name', + description: 'DAGGERHEART.Adversary.Standard.Description' }, support: { - name: "DAGGERHEART.Adversary.Support.Name", - description: "DAGGERHEART.Adversary.Support.Description" - }, + name: 'DAGGERHEART.Adversary.Support.Name', + description: 'DAGGERHEART.Adversary.Support.Description' + } }; export const adversaryTraits = { relentless: { - name: "DAGGERHEART.Adversary.Trait..Name", - description: "DAGGERHEART.Adversary.Trait..Description", - tip: "DAGGERHEART.Adversary.Trait..Tip", + name: 'DAGGERHEART.Adversary.Trait..Name', + description: 'DAGGERHEART.Adversary.Trait..Description', + tip: 'DAGGERHEART.Adversary.Trait..Tip' }, slow: { - name: "DAGGERHEART.Adversary.Trait..Name", - description: "DAGGERHEART.Adversary.Trait..Description", - tip: "DAGGERHEART.Adversary.Trait..Tip", + name: 'DAGGERHEART.Adversary.Trait..Name', + description: 'DAGGERHEART.Adversary.Trait..Description', + tip: 'DAGGERHEART.Adversary.Trait..Tip' }, minion: { - name: "DAGGERHEART.Adversary.Trait..Name", - description: "DAGGERHEART.Adversary.Trait..Description", - tip: "DAGGERHEART.Adversary.Trait..Tip", - }, + name: 'DAGGERHEART.Adversary.Trait..Name', + description: 'DAGGERHEART.Adversary.Trait..Description', + tip: 'DAGGERHEART.Adversary.Trait..Tip' + } }; export const levelChoices = { attributes: { name: 'attributes', title: '', - choices: [], + choices: [] }, hitPointSlots: { name: 'hitPointSlots', title: '', - choices: [], + choices: [] }, stressSlots: { name: 'stressSlots', title: '', - choices: [], + choices: [] }, experiences: { name: 'experiences', title: '', choices: 'system.experiences', - nrChoices: 2, + nrChoices: 2 }, proficiency: { name: 'proficiency', title: '', - choices: [], + choices: [] }, armorOrEvasionSlot: { name: 'armorOrEvasionSlot', title: 'Permanently add one Armor Slot or take +1 to your Evasion', - choices: [{ name: 'Armor Marks +1', path: 'armor' }, { name: 'Evasion +1', path: 'evasion' }], - nrChoices: 1, + choices: [ + { name: 'Armor Marks +1', path: 'armor' }, + { name: 'Evasion +1', path: 'evasion' } + ], + nrChoices: 1 }, majorDamageThreshold2: { name: 'majorDamageThreshold2', title: '', - choices: [], + choices: [] }, severeDamageThreshold2: { name: 'severeDamageThreshold2', title: '', - choices: [], + choices: [] }, // minorDamageThreshold2: { // name: 'minorDamageThreshold2', @@ -168,7 +195,7 @@ export const levelChoices = { severeDamageThreshold3: { name: 'severeDamageThreshold3', title: '', - choices: [], + choices: [] }, // major2OrSevere4DamageThreshold: { // name: 'major2OrSevere4DamageThreshold', @@ -185,7 +212,7 @@ export const levelChoices = { severeDamageThreshold4: { name: 'severeDamageThreshold4', title: '', - choices: [], + choices: [] }, // majorDamageThreshold1: { // name: 'majorDamageThreshold2', @@ -195,161 +222,161 @@ export const levelChoices = { subclass: { name: 'subclass', title: 'Select subclass to upgrade', - choices: [], + choices: [] }, multiclass: { name: 'multiclass', title: '', - choices: [{}], + choices: [{}] } }; export const levelupData = { tier1: { - id: "2_4", + id: '2_4', tier: 1, - levels: [2,3,4], + levels: [2, 3, 4], label: 'DAGGERHEART.LevelUp.Tier1.Label', - info: "DAGGERHEART.LevelUp.Tier1.InfoLabel", - pretext: "DAGGERHEART.LevelUp.Tier1.Pretext", - posttext: "DAGGERHEART.LevelUp.Tier1.Posttext", + info: 'DAGGERHEART.LevelUp.Tier1.InfoLabel', + pretext: 'DAGGERHEART.LevelUp.Tier1.Pretext', + posttext: 'DAGGERHEART.LevelUp.Tier1.Posttext', choices: { [levelChoices.attributes.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Attributes", - maxChoices: 3, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Attributes', + maxChoices: 3 }, [levelChoices.hitPointSlots.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.HitPointSlots", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.HitPointSlots', + maxChoices: 1 }, [levelChoices.stressSlots.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.StressSlots", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.StressSlots', + maxChoices: 1 }, [levelChoices.experiences.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Experiences", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Experiences', + maxChoices: 1 }, [levelChoices.proficiency.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Proficiency", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Proficiency', + maxChoices: 1 }, [levelChoices.armorOrEvasionSlot.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.ArmorOrEvasionSlot", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.ArmorOrEvasionSlot', + maxChoices: 1 }, [levelChoices.majorDamageThreshold2.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.MajorDamageThreshold2", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.MajorDamageThreshold2', + maxChoices: 1 }, [levelChoices.severeDamageThreshold2.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.SevereDamageThreshold2", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.SevereDamageThreshold2', + maxChoices: 1 } } }, tier2: { - id: "5_7", + id: '5_7', tier: 2, - levels: [5,6,7], + levels: [5, 6, 7], label: 'DAGGERHEART.LevelUp.Tier2.Label', - info: "DAGGERHEART.LevelUp.Tier2.InfoLabel", - pretext: "DAGGERHEART.LevelUp.Tier2.Pretext", - posttext: "DAGGERHEART.LevelUp.Tier2.Posttext", + info: 'DAGGERHEART.LevelUp.Tier2.InfoLabel', + pretext: 'DAGGERHEART.LevelUp.Tier2.Pretext', + posttext: 'DAGGERHEART.LevelUp.Tier2.Posttext', choices: { [levelChoices.attributes.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Attributes", - maxChoices: 3, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Attributes', + maxChoices: 3 }, [levelChoices.hitPointSlots.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.HitPointSlots", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.HitPointSlots', + maxChoices: 2 }, [levelChoices.stressSlots.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.StressSlots", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.StressSlots', + maxChoices: 2 }, [levelChoices.experiences.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Experiences", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Experiences', + maxChoices: 1 }, [levelChoices.proficiency.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Proficiency", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Proficiency', + maxChoices: 2 }, [levelChoices.armorOrEvasionSlot.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.ArmorOrEvasionSlot", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.ArmorOrEvasionSlot', + maxChoices: 2 }, [levelChoices.majorDamageThreshold2.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.MajorDamageThreshold2", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.MajorDamageThreshold2', + maxChoices: 1 }, [levelChoices.severeDamageThreshold3.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.SevereDamageThreshold3", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.SevereDamageThreshold3', + maxChoices: 1 }, [levelChoices.subclass.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Subclass", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Subclass', + maxChoices: 1 }, [levelChoices.multiclass.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Multiclass", + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Multiclass', maxChoices: 1, - cost: 2, - }, - }, + cost: 2 + } + } }, tier3: { - id: "8_10", + id: '8_10', tier: 3, - levels: [8,9,10], + levels: [8, 9, 10], label: 'DAGGERHEART.LevelUp.Tier3.Label', - info: "DAGGERHEART.LevelUp.Tier3.InfoLabel", - pretext: "DAGGERHEART.LevelUp.Tier3.Pretext", - posttext: "DAGGERHEART.LevelUp.Tier3.Posttext", + info: 'DAGGERHEART.LevelUp.Tier3.InfoLabel', + pretext: 'DAGGERHEART.LevelUp.Tier3.Pretext', + posttext: 'DAGGERHEART.LevelUp.Tier3.Posttext', choices: { [levelChoices.attributes.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Attributes", - maxChoices: 3, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Attributes', + maxChoices: 3 }, [levelChoices.hitPointSlots.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.HitPointSlots", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.HitPointSlots', + maxChoices: 2 }, [levelChoices.stressSlots.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.StressSlots", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.StressSlots', + maxChoices: 2 }, [levelChoices.experiences.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Experiences", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Experiences', + maxChoices: 1 }, [levelChoices.proficiency.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Proficiency", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Proficiency', + maxChoices: 2 }, [levelChoices.armorOrEvasionSlot.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.ArmorOrEvasionSlot", - maxChoices: 2, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.ArmorOrEvasionSlot', + maxChoices: 2 }, [levelChoices.majorDamageThreshold2.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.MajorDamageThreshold2", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.MajorDamageThreshold2', + maxChoices: 1 }, [levelChoices.severeDamageThreshold4.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.SevereDamageThreshold4", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.SevereDamageThreshold4', + maxChoices: 1 }, [levelChoices.subclass.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Subclass", - maxChoices: 1, + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Subclass', + maxChoices: 1 }, [levelChoices.multiclass.name]: { - description: "DAGGERHEART.LevelUp.ChoiceDescriptions.Multiclass", + description: 'DAGGERHEART.LevelUp.ChoiceDescriptions.Multiclass', maxChoices: 1, - cost: 2, - }, - }, + cost: 2 + } + } } -}; \ No newline at end of file +}; diff --git a/module/config/domainConfig.mjs b/module/config/domainConfig.mjs index 289f1243..a188ed43 100644 --- a/module/config/domainConfig.mjs +++ b/module/config/domainConfig.mjs @@ -3,99 +3,99 @@ export const domains = { id: 'arcana', label: 'Arcana', src: 'icons/magic/symbols/circled-gem-pink.webp', - description: 'DAGGERHEART.Domains.Arcana', + description: 'DAGGERHEART.Domains.Arcana' }, blade: { id: 'blade', label: 'Blade', src: 'icons/weapons/swords/sword-broad-crystal-paired.webp', - description: 'DAGGERHEART.Domains.Blade', + description: 'DAGGERHEART.Domains.Blade' }, bone: { id: 'bone', label: 'Bone', src: 'icons/skills/wounds/bone-broken-marrow-red.webp', - description: 'DAGGERHEART.Domains.Bone', + description: 'DAGGERHEART.Domains.Bone' }, codex: { id: 'codex', label: 'Codex', src: 'icons/sundries/books/book-embossed-jewel-gold-purple.webp', - description: 'DAGGERHEART.Domains.Codex', + description: 'DAGGERHEART.Domains.Codex' }, grace: { id: 'grace', label: 'Grace', src: 'icons/skills/movement/feet-winged-boots-glowing-yellow.webp', - description: 'DAGGERHEART.Domains.Grace', + description: 'DAGGERHEART.Domains.Grace' }, midnight: { id: 'midnight', label: 'Midnight', src: 'icons/environment/settlement/watchtower-castle-night.webp', background: 'systems/daggerheart/assets/backgrounds/MidnightBackground.webp', - description: 'DAGGERHEART.Domains.Midnight', + description: 'DAGGERHEART.Domains.Midnight' }, sage: { id: 'sage', label: 'Sage', src: 'icons/sundries/misc/pipe-wooden-straight-brown.webp', - description: 'DAGGERHEART.Domains.Sage', + description: 'DAGGERHEART.Domains.Sage' }, splendor: { id: 'splendor', label: 'Splendor', src: 'icons/magic/control/control-influence-crown-gold.webp', - description: 'DAGGERHEART.Domains.Splendor', + description: 'DAGGERHEART.Domains.Splendor' }, valor: { id: 'valor', label: 'Valor', src: 'icons/magic/control/control-influence-rally-purple.webp', - description: 'DAGGERHEART.Domains.Valor', - }, + description: 'DAGGERHEART.Domains.Valor' + } }; export const classDomainMap = { - rogue: [domains.midnight, domains.grace], + rogue: [domains.midnight, domains.grace] }; export const subclassMap = { syndicate: { id: 'syndicate', - label: 'Syndicate', + label: 'Syndicate' }, nightwalker: { id: 'nightwalker', - label: 'Nightwalker', - }, + label: 'Nightwalker' + } }; export const classMap = { rogue: { - label: "Rogue", - subclasses: [subclassMap.syndicate.id, subclassMap.nightwalker.id], + label: 'Rogue', + subclasses: [subclassMap.syndicate.id, subclassMap.nightwalker.id] }, seraph: { - label: "Seraph", + label: 'Seraph', subclasses: [] - }, + } }; export const cardTypes = { ability: { id: 'ability', - label: "DAGGERHEART.Domain.CardTypes.Ability", - img: "", + label: 'DAGGERHEART.Domain.CardTypes.Ability', + img: '' }, spell: { id: 'spell', - label: "DAGGERHEART.Domain.CardTypes.Spell", - img: "" + label: 'DAGGERHEART.Domain.CardTypes.Spell', + img: '' }, grimoire: { id: 'grimoire', - label: "DAGGERHEART.Domain.CardTypes.Grimoire", - img: "" - } -}; \ No newline at end of file + label: 'DAGGERHEART.Domain.CardTypes.Grimoire', + img: '' + } +}; diff --git a/module/config/effectConfig.mjs b/module/config/effectConfig.mjs index e7a097a2..17d5c960 100644 --- a/module/config/effectConfig.mjs +++ b/module/config/effectConfig.mjs @@ -1,64 +1,64 @@ -import { range } from "./generalConfig.mjs"; +import { range } from './generalConfig.mjs'; export const valueTypes = { numberString: { - id: 'numberString', + id: 'numberString' }, select: { - id: 'select', + id: 'select' } -} +}; export const parseTypes = { string: { - id: 'string', + id: 'string' }, number: { - id: 'number', - }, -} + id: 'number' + } +}; export const applyLocations = { attackRoll: { id: 'attackRoll', - name: "DAGGERHEART.Effects.ApplyLocations.AttackRoll.Name", + name: 'DAGGERHEART.Effects.ApplyLocations.AttackRoll.Name' }, damageRoll: { id: 'damageRoll', - name: "DAGGERHEART.Effects.ApplyLocations.DamageRoll.Name", + name: 'DAGGERHEART.Effects.ApplyLocations.DamageRoll.Name' } }; export const effectTypes = { health: { - id: "health", - name: "DAGGERHEART.Effects.Types.Health.Name", + id: 'health', + name: 'DAGGERHEART.Effects.Types.Health.Name', values: [], valueType: valueTypes.numberString.id, - parseType: parseTypes.number.id, + parseType: parseTypes.number.id }, stress: { - id: "stress", - name: "DAGGERHEART.Effects.Types.Stress.Name", + id: 'stress', + name: 'DAGGERHEART.Effects.Types.Stress.Name', valueType: valueTypes.numberString.id, - parseType: parseTypes.number.id, + parseType: parseTypes.number.id }, reach: { - id: "reach", - name: "DAGGERHEART.Effects.Types.Reach.Name", + id: 'reach', + name: 'DAGGERHEART.Effects.Types.Reach.Name', valueType: valueTypes.select.id, parseType: parseTypes.string.id, options: Object.keys(range).map(x => ({ name: range[x].name, value: x })) }, damage: { - id: "damage", - name: "DAGGERHEART.Effects.Types.Damage.Name", + id: 'damage', + name: 'DAGGERHEART.Effects.Types.Damage.Name', valueType: valueTypes.numberString.id, parseType: parseTypes.string.id, appliesOn: applyLocations.damageRoll.id, applyLocationChoices: { [applyLocations.damageRoll.id]: applyLocations.damageRoll.name, - [applyLocations.attackRoll.id]: applyLocations.attackRoll.name, - }, + [applyLocations.attackRoll.id]: applyLocations.attackRoll.name + } } -}; \ No newline at end of file +}; diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index fa4277f2..b8bac359 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -1,170 +1,170 @@ export const range = { melee: { - label: "DAGGERHEART.Range.Melee.Name", - description: "DAGGERHEART.Range.Melee.Description", + label: 'DAGGERHEART.Range.Melee.Name', + description: 'DAGGERHEART.Range.Melee.Description', distance: 1 }, veryClose: { - label: "DAGGERHEART.Range.VeryClose.Name", - description: "DAGGERHEART.Range.VeryClose.Description", + label: 'DAGGERHEART.Range.VeryClose.Name', + description: 'DAGGERHEART.Range.VeryClose.Description', distance: 3 }, close: { - label: "DAGGERHEART.Range.Close.Name", - description: "DAGGERHEART.Range.Close.Description", + label: 'DAGGERHEART.Range.Close.Name', + description: 'DAGGERHEART.Range.Close.Description', distance: 10 }, far: { - label: "DAGGERHEART.Range.Far.Name", - description: "DAGGERHEART.Range.Far.Description", + label: 'DAGGERHEART.Range.Far.Name', + description: 'DAGGERHEART.Range.Far.Description', distance: 20 }, veryFar: { - label: "DAGGERHEART.Range.VeryFar.Name", - description: "DAGGERHEART.Range.VeryFar.Description", + label: 'DAGGERHEART.Range.VeryFar.Name', + description: 'DAGGERHEART.Range.VeryFar.Description', distance: 30 } -} +}; export const burden = { - oneHanded: "DAGGERHEART.Burden.OneHanded", - twoHanded: "DAGGERHEART.Burden.TwoHanded" -} + oneHanded: 'DAGGERHEART.Burden.OneHanded', + twoHanded: 'DAGGERHEART.Burden.TwoHanded' +}; export const damageTypes = { physical: { id: 'physical', - label: "DAGGERHEART.DamageType.Physical.Name", - abbreviation: "DAGGERHEART.DamageType.Physical.Abbreviation", + label: 'DAGGERHEART.DamageType.Physical.Name', + abbreviation: 'DAGGERHEART.DamageType.Physical.Abbreviation' }, magical: { id: 'magical', - label: "DAGGERHEART.DamageType.Magical.Name", - abbreviation: "DAGGERHEART.DamageType.Magical.Abbreviation", - }, -} + label: 'DAGGERHEART.DamageType.Magical.Name', + abbreviation: 'DAGGERHEART.DamageType.Magical.Abbreviation' + } +}; export const healingTypes = { health: { id: 'health', - label: "DAGGERHEART.HealingType.HitPoints.Name", - abbreviation: "DAGGERHEART.HealingType.HitPoints.Abbreviation" + label: 'DAGGERHEART.HealingType.HitPoints.Name', + abbreviation: 'DAGGERHEART.HealingType.HitPoints.Abbreviation' }, stress: { id: 'stress', - label: "DAGGERHEART.HealingType.Stress.Name", - abbreviation: "DAGGERHEART.HealingType.Stress.Abbreviation" - }, + label: 'DAGGERHEART.HealingType.Stress.Name', + abbreviation: 'DAGGERHEART.HealingType.Stress.Abbreviation' + } }; export const conditions = { vulnerable: { id: 'vulnerable', - name: "DAGGERHEART.Condition.Vulnerable.Name", - icon: "icons/magic/control/silhouette-fall-slip-prone.webp", - description: "DAGGERHEART.Condition.Vulnerable.Description" + name: 'DAGGERHEART.Condition.Vulnerable.Name', + icon: 'icons/magic/control/silhouette-fall-slip-prone.webp', + description: 'DAGGERHEART.Condition.Vulnerable.Description' }, hidden: { id: 'hidden', - name: "DAGGERHEART.Condition.Hidden.Name", - icon: "icons/magic/perception/silhouette-stealth-shadow.webp", - description: "DAGGERHEART.Condition.Hidden.Description" + name: 'DAGGERHEART.Condition.Hidden.Name', + icon: 'icons/magic/perception/silhouette-stealth-shadow.webp', + description: 'DAGGERHEART.Condition.Hidden.Description' }, restrained: { id: 'restrained', - name: "DAGGERHEART.Condition.Restrained.Name", - icon: "icons/magic/control/debuff-chains-shackle-movement-red.webp", - description: "DAGGERHEART.Condition.Restrained.Description" - }, -} + name: 'DAGGERHEART.Condition.Restrained.Name', + icon: 'icons/magic/control/debuff-chains-shackle-movement-red.webp', + description: 'DAGGERHEART.Condition.Restrained.Description' + } +}; export const downtime = { shortRest: { tendToWounds: { - id: "tendToWounds", - name: "DAGGERHEART.Downtime.TendToWounds.Name", - img: "icons/magic/life/cross-worn-green.webp", - description: "DAGGERHEART.Downtime.TendToWounds.Description", + id: 'tendToWounds', + name: 'DAGGERHEART.Downtime.TendToWounds.Name', + img: 'icons/magic/life/cross-worn-green.webp', + description: 'DAGGERHEART.Downtime.TendToWounds.Description' }, clearStress: { - id: "clearStress", - name: "DAGGERHEART.Downtime.ClearStress.Name", - img: "icons/magic/perception/eye-ringed-green.webp", - description: "DAGGERHEART.Downtime.ClearStress.Description", + id: 'clearStress', + name: 'DAGGERHEART.Downtime.ClearStress.Name', + img: 'icons/magic/perception/eye-ringed-green.webp', + description: 'DAGGERHEART.Downtime.ClearStress.Description' }, repairArmor: { - id: "repairArmor", - name: "DAGGERHEART.Downtime.RepairArmor.Name", - img: "icons/skills/trades/smithing-anvil-silver-red.webp", - description: "DAGGERHEART.Downtime.RepairArmor.Description", + id: 'repairArmor', + name: 'DAGGERHEART.Downtime.RepairArmor.Name', + img: 'icons/skills/trades/smithing-anvil-silver-red.webp', + description: 'DAGGERHEART.Downtime.RepairArmor.Description' }, prepare: { - id: "prepare", - name: "DAGGERHEART.Downtime.Prepare.Name", - img: "icons/skills/trades/academics-merchant-scribe.webp", - description: "DAGGERHEART.Downtime.Prepare.Description", - }, + id: 'prepare', + name: 'DAGGERHEART.Downtime.Prepare.Name', + img: 'icons/skills/trades/academics-merchant-scribe.webp', + description: 'DAGGERHEART.Downtime.Prepare.Description' + } }, longRest: { tendToWounds: { - id: "tendToWounds", - name: "DAGGERHEART.Downtime.TendToWounds.Name", - img: "icons/magic/life/cross-worn-green.webp", - description: "DAGGERHEART.Downtime.TendToWounds.Description", + id: 'tendToWounds', + name: 'DAGGERHEART.Downtime.TendToWounds.Name', + img: 'icons/magic/life/cross-worn-green.webp', + description: 'DAGGERHEART.Downtime.TendToWounds.Description' }, clearStress: { - id: "clearStress", - name: "DAGGERHEART.Downtime.ClearStress.Name", - img: "icons/magic/perception/eye-ringed-green.webp", - description: "DAGGERHEART.Downtime.ClearStress.Description", + id: 'clearStress', + name: 'DAGGERHEART.Downtime.ClearStress.Name', + img: 'icons/magic/perception/eye-ringed-green.webp', + description: 'DAGGERHEART.Downtime.ClearStress.Description' }, repairArmor: { - id: "repairArmor", - name: "DAGGERHEART.Downtime.RepairArmor.Name", - img: "icons/skills/trades/smithing-anvil-silver-red.webp", - description: "DAGGERHEART.Downtime.RepairArmor.Description", + id: 'repairArmor', + name: 'DAGGERHEART.Downtime.RepairArmor.Name', + img: 'icons/skills/trades/smithing-anvil-silver-red.webp', + description: 'DAGGERHEART.Downtime.RepairArmor.Description' }, prepare: { - id: "prepare", - name: "DAGGERHEART.Downtime.Prepare.Name", - img: "icons/skills/trades/academics-merchant-scribe.webp", - description: "DAGGERHEART.Downtime.Prepare.Description", + id: 'prepare', + name: 'DAGGERHEART.Downtime.Prepare.Name', + img: 'icons/skills/trades/academics-merchant-scribe.webp', + description: 'DAGGERHEART.Downtime.Prepare.Description' }, workOnAProject: { - id: "workOnAProject", - name: "DAGGERHEART.Downtime.WorkOnAProject.Name", - img: "icons/skills/social/thumbsup-approval-like.webp", - description: "DAGGERHEART.Downtime.WorkOnAProject.Description", + id: 'workOnAProject', + name: 'DAGGERHEART.Downtime.WorkOnAProject.Name', + img: 'icons/skills/social/thumbsup-approval-like.webp', + description: 'DAGGERHEART.Downtime.WorkOnAProject.Description' } }, custom: { id: 'customActivity', - name: "", - img: "icons/skills/trades/academics-investigation-puzzles.webp", - description: "", - namePlaceholder: "DAGGERHEART.Downtime.Custom.NamePlaceholder", - placeholder: "DAGGERHEART.Downtime.Custom.Placeholder", + name: '', + img: 'icons/skills/trades/academics-investigation-puzzles.webp', + description: '', + namePlaceholder: 'DAGGERHEART.Downtime.Custom.NamePlaceholder', + placeholder: 'DAGGERHEART.Downtime.Custom.Placeholder' } -} +}; export const deathMoves = { avoidDeath: { - id: "avoidDeath", - name: "DAGGERHEART.DeathMoves.AvoidDeath.Name", - img: "icons/magic/time/hourglass-yellow-green.webp", - description: "DAGGERHEART.DeathMoves.AvoidDeath.Description", + id: 'avoidDeath', + name: 'DAGGERHEART.DeathMoves.AvoidDeath.Name', + img: 'icons/magic/time/hourglass-yellow-green.webp', + description: 'DAGGERHEART.DeathMoves.AvoidDeath.Description' }, riskItAll: { id: 'riskItAll', - name: "DAGGERHEART.DeathMoves.RiskItAll.Name", - img: "icons/sundries/gaming/dice-pair-white-green.webp", - description: "DAGGERHEART.DeathMoves.RiskItAll.Description", + name: 'DAGGERHEART.DeathMoves.RiskItAll.Name', + img: 'icons/sundries/gaming/dice-pair-white-green.webp', + description: 'DAGGERHEART.DeathMoves.RiskItAll.Description' }, blazeOfGlory: { - id: "blazeOfGlory", - name: "DAGGERHEART.DeathMoves.BlazeOfGlory.Name", - img: "icons/magic/life/heart-cross-strong-flame-purple-orange.webp", - description: "DAGGERHEART.DeathMoves.BlazeOfGlory.Description", + id: 'blazeOfGlory', + name: 'DAGGERHEART.DeathMoves.BlazeOfGlory.Name', + img: 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp', + description: 'DAGGERHEART.DeathMoves.BlazeOfGlory.Description' } }; @@ -172,97 +172,97 @@ export const tiers = { 0: { key: 0, id: 'tier0', - name: 'DAGGERHEART.General.Tier.0', + name: 'DAGGERHEART.General.Tier.0' }, 1: { key: 1, id: 'tier1', - name: 'DAGGERHEART.General.Tier.1', + name: 'DAGGERHEART.General.Tier.1' }, 2: { key: 2, id: 'tier2', - name: 'DAGGERHEART.General.Tier.2', + name: 'DAGGERHEART.General.Tier.2' }, 3: { key: 3, id: 'tier3', - name: 'DAGGERHEART.General.Tier.3', + name: 'DAGGERHEART.General.Tier.3' } }; export const objectTypes = { pc: { - name: "TYPES.Actor.pc", + name: 'TYPES.Actor.pc' }, npc: { - name: "TYPES.Actor.npc", + name: 'TYPES.Actor.npc' }, adversary: { - name: "TYPES.Actor.adversary", + name: 'TYPES.Actor.adversary' }, ancestry: { - name: "TYPES.Item.ancestry", + name: 'TYPES.Item.ancestry' }, community: { - name: "TYPES.Item.community", + name: 'TYPES.Item.community' }, class: { - name: "TYPES.Item.class", + name: 'TYPES.Item.class' }, subclass: { - name: "TYPES.Item.subclass", + name: 'TYPES.Item.subclass' }, feature: { - name: "TYPES.Item.feature", + name: 'TYPES.Item.feature' }, domainCard: { - name: "TYPES.Item.domainCard", + name: 'TYPES.Item.domainCard' }, consumable: { - name: "TYPES.Item.consumable", + name: 'TYPES.Item.consumable' }, miscellaneous: { - name: "TYPES.Item.miscellaneous", + name: 'TYPES.Item.miscellaneous' }, weapon: { - name: "TYPES.Item.weapon", + name: 'TYPES.Item.weapon' }, armor: { - name: "TYPES.Item.armor", + name: 'TYPES.Item.armor' } }; export const diceTypes = { - d4: "d4", - d6: "d6", - d8: "d8", - d12: "d12", - d20: "d20" + d4: 'd4', + d6: 'd6', + d8: 'd8', + d12: 'd12', + d20: 'd20' }; export const refreshTypes = { session: { id: 'session', - label: "DAGGERHEART.General.RefreshType.Session" + label: 'DAGGERHEART.General.RefreshType.Session' }, shortRest: { id: 'shortRest', - label: "DAGGERHEART.General.RefreshType.Shortrest", + label: 'DAGGERHEART.General.RefreshType.Shortrest' }, longRest: { id: 'longRest', - label: "DAGGERHEART.General.RefreshType.Longrest" + label: 'DAGGERHEART.General.RefreshType.Longrest' } -} +}; export const abilityCosts = { hope: { id: 'hope', - label: 'Hope', + label: 'Hope' }, stress: { id: 'stress', - label: 'Stress', + label: 'Stress' } -} \ No newline at end of file +}; diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index 4fb9313c..490d6d6f 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -1,351 +1,351 @@ export const armorFeatures = { light: { - label: "DAGGERHEART.ArmorFeature.Light.Name", - description: "DAGGERHEART.ArmorFeature.Light.Description", + label: 'DAGGERHEART.ArmorFeature.Light.Name', + description: 'DAGGERHEART.ArmorFeature.Light.Description' }, heavy: { - label: "DAGGERHEART.ArmorFeature.Heavy.Name", - description: "DAGGERHEART.ArmorFeature.Heavy.Description", + label: 'DAGGERHEART.ArmorFeature.Heavy.Name', + description: 'DAGGERHEART.ArmorFeature.Heavy.Description' }, veryHeavy: { - label: "DAGGERHEART.ArmorFeature.VeryHeavy.Name", - description: "DAGGERHEART.ArmorFeature.VeryHeavy.Description", + label: 'DAGGERHEART.ArmorFeature.VeryHeavy.Name', + description: 'DAGGERHEART.ArmorFeature.VeryHeavy.Description' }, reinforced: { - label: "DAGGERHEART.ArmorFeature.Reinforced.Name", - description: "DAGGERHEART.ArmorFeature.Reinforced.Description", + label: 'DAGGERHEART.ArmorFeature.Reinforced.Name', + description: 'DAGGERHEART.ArmorFeature.Reinforced.Description' }, sturdy: { - label: "DAGGERHEART.ArmorFeature.Sturdy.Name", - description: "DAGGERHEART.ArmorFeature.Sturdy.Description", + label: 'DAGGERHEART.ArmorFeature.Sturdy.Name', + description: 'DAGGERHEART.ArmorFeature.Sturdy.Description' }, warded: { - label: "DAGGERHEART.ArmorFeature.Warded.Name", - description: "DAGGERHEART.ArmorFeature.Warded.Description", + label: 'DAGGERHEART.ArmorFeature.Warded.Name', + description: 'DAGGERHEART.ArmorFeature.Warded.Description' }, resistant: { - label: "DAGGERHEART.ArmorFeature.Resistant.Name", - description: "DAGGERHEART.ArmorFeature.Resistant.Description", + label: 'DAGGERHEART.ArmorFeature.Resistant.Name', + description: 'DAGGERHEART.ArmorFeature.Resistant.Description' }, quiet: { - label: "DAGGERHEART.ArmorFeature.Quiet.Name", - description: "DAGGERHEART.ArmorFeature.Quiet.Description", + label: 'DAGGERHEART.ArmorFeature.Quiet.Name', + description: 'DAGGERHEART.ArmorFeature.Quiet.Description' }, hopeful: { - label: "DAGGERHEART.ArmorFeature.Hopeful.Name", - description: "DAGGERHEART.ArmorFeature.Hopeful.Description", + label: 'DAGGERHEART.ArmorFeature.Hopeful.Name', + description: 'DAGGERHEART.ArmorFeature.Hopeful.Description' }, impenetrable: { - label: "DAGGERHEART.ArmorFeature.Impenetrable.Name", - description: "DAGGERHEART.ArmorFeature.Impenetrable.Description", + label: 'DAGGERHEART.ArmorFeature.Impenetrable.Name', + description: 'DAGGERHEART.ArmorFeature.Impenetrable.Description' }, painful: { - label: "DAGGERHEART.ArmorFeature.Painful.Name", - description: "DAGGERHEART.ArmorFeature.Painful.Description", + label: 'DAGGERHEART.ArmorFeature.Painful.Name', + description: 'DAGGERHEART.ArmorFeature.Painful.Description' }, gilded: { - label: "DAGGERHEART.ArmorFeature.Gilded.Name", - description: "DAGGERHEART.ArmorFeature.Gilded.Description", + label: 'DAGGERHEART.ArmorFeature.Gilded.Name', + description: 'DAGGERHEART.ArmorFeature.Gilded.Description' }, physical: { - label: "DAGGERHEART.ArmorFeature.Physical.Name", - description: "DAGGERHEART.ArmorFeature.Physical.Description", + label: 'DAGGERHEART.ArmorFeature.Physical.Name', + description: 'DAGGERHEART.ArmorFeature.Physical.Description' }, magic: { - label: "DAGGERHEART.ArmorFeature.Magic.Name", - description: "DAGGERHEART.ArmorFeature.Magic.Description", + label: 'DAGGERHEART.ArmorFeature.Magic.Name', + description: 'DAGGERHEART.ArmorFeature.Magic.Description' }, sharp: { - label: "DAGGERHEART.ArmorFeature.Sharp.Name", - description: "DAGGERHEART.ArmorFeature.Sharp.Description", + label: 'DAGGERHEART.ArmorFeature.Sharp.Name', + description: 'DAGGERHEART.ArmorFeature.Sharp.Description' }, burning: { - label: "DAGGERHEART.ArmorFeature.Burning.Name", - description: "DAGGERHEART.ArmorFeature.Burning.Description", + label: 'DAGGERHEART.ArmorFeature.Burning.Name', + description: 'DAGGERHEART.ArmorFeature.Burning.Description' }, timeslowing: { - label: "DAGGERHEART.ArmorFeature.Timeslowing.Name", - description: "DAGGERHEART.ArmorFeature.Timeslowing.Description", + label: 'DAGGERHEART.ArmorFeature.Timeslowing.Name', + description: 'DAGGERHEART.ArmorFeature.Timeslowing.Description' }, truthseeking: { - label: "DAGGERHEART.ArmorFeature.Truthseeking.Name", - description: "DAGGERHEART.ArmorFeature.Truthseeking.Description", + label: 'DAGGERHEART.ArmorFeature.Truthseeking.Name', + description: 'DAGGERHEART.ArmorFeature.Truthseeking.Description' }, channeling: { - label: "DAGGERHEART.ArmorFeature.Channeling.Name", - description: "DAGGERHEART.ArmorFeature.Channeling.Description", + label: 'DAGGERHEART.ArmorFeature.Channeling.Name', + description: 'DAGGERHEART.ArmorFeature.Channeling.Description' }, difficult: { - label: "DAGGERHEART.ArmorFeature.Difficult.Name", - description: "DAGGERHEART.ArmorFeature.Difficult.Description", + label: 'DAGGERHEART.ArmorFeature.Difficult.Name', + description: 'DAGGERHEART.ArmorFeature.Difficult.Description' }, variable: { - label: "DAGGERHEART.ArmorFeature.Variable.Name", - description: "DAGGERHEART.ArmorFeature.Variable.Description", - }, + label: 'DAGGERHEART.ArmorFeature.Variable.Name', + description: 'DAGGERHEART.ArmorFeature.Variable.Description' + } }; export const weaponFeatures = { light: { - label: "DAGGERHEART.WeaponFeature.Light.Name", - description: "DAGGERHEART.WeaponFeature.Light.Description", + label: 'DAGGERHEART.WeaponFeature.Light.Name', + description: 'DAGGERHEART.WeaponFeature.Light.Description' }, heavy: { - label: "DAGGERHEART.WeaponFeature.Heavy.Name", - description: "DAGGERHEART.WeaponFeature.Heavy.Description", + label: 'DAGGERHEART.WeaponFeature.Heavy.Name', + description: 'DAGGERHEART.WeaponFeature.Heavy.Description' }, massive: { - label: "DAGGERHEART.WeaponFeature.Massive.Name", - description: "DAGGERHEART.WeaponFeature.Massive.Description", + label: 'DAGGERHEART.WeaponFeature.Massive.Name', + description: 'DAGGERHEART.WeaponFeature.Massive.Description' }, reliable: { - label: "DAGGERHEART.WeaponFeature.Reliable.Name", - description: "DAGGERHEART.WeaponFeature.Reliable.Description", + label: 'DAGGERHEART.WeaponFeature.Reliable.Name', + description: 'DAGGERHEART.WeaponFeature.Reliable.Description' }, quick: { - label: "DAGGERHEART.WeaponFeature.Quick.Name", - description: "DAGGERHEART.WeaponFeature.Quick.Description", + label: 'DAGGERHEART.WeaponFeature.Quick.Name', + description: 'DAGGERHEART.WeaponFeature.Quick.Description' }, cumbersome: { - label: "DAGGERHEART.WeaponFeature.Cumbersome.Name", - description: "DAGGERHEART.WeaponFeature.Cumbersome.Description", + label: 'DAGGERHEART.WeaponFeature.Cumbersome.Name', + description: 'DAGGERHEART.WeaponFeature.Cumbersome.Description' }, versatile: { - label: "DAGGERHEART.WeaponFeature.Versatile.Name", - description: "DAGGERHEART.WeaponFeature.Versatile.Description", + label: 'DAGGERHEART.WeaponFeature.Versatile.Name', + description: 'DAGGERHEART.WeaponFeature.Versatile.Description', override: { - damage: "", + damage: '' } }, powerful: { - label: "DAGGERHEART.WeaponFeature.Powerful.Name", - description: "DAGGERHEART.WeaponFeature.Powerful.Description", + label: 'DAGGERHEART.WeaponFeature.Powerful.Name', + description: 'DAGGERHEART.WeaponFeature.Powerful.Description' }, scary: { - label: "DAGGERHEART.WeaponFeature.Scary.Name", - description: "DAGGERHEART.WeaponFeature.Scary.Description", + label: 'DAGGERHEART.WeaponFeature.Scary.Name', + description: 'DAGGERHEART.WeaponFeature.Scary.Description' }, brutal: { - label: "DAGGERHEART.WeaponFeature.Brutal.Name", - description: "DAGGERHEART.WeaponFeature.Brutal.Description", + label: 'DAGGERHEART.WeaponFeature.Brutal.Name', + description: 'DAGGERHEART.WeaponFeature.Brutal.Description' }, reloading: { - label: "DAGGERHEART.WeaponFeature.Reloading.Name", - description: "DAGGERHEART.WeaponFeature.Reloading.Description", + label: 'DAGGERHEART.WeaponFeature.Reloading.Name', + description: 'DAGGERHEART.WeaponFeature.Reloading.Description' }, eruptive: { - label: "DAGGERHEART.WeaponFeature.Eruptive.Name", - description: "DAGGERHEART.WeaponFeature.Eruptive.Description", + label: 'DAGGERHEART.WeaponFeature.Eruptive.Name', + description: 'DAGGERHEART.WeaponFeature.Eruptive.Description' }, persuasive: { - label: "DAGGERHEART.WeaponFeature.Persuasive.Name", - description: "DAGGERHEART.WeaponFeature.Persuasive.Description", + label: 'DAGGERHEART.WeaponFeature.Persuasive.Name', + description: 'DAGGERHEART.WeaponFeature.Persuasive.Description' }, pompous: { - label: "DAGGERHEART.WeaponFeature.Pompous.Name", - description: "DAGGERHEART.WeaponFeature.Pompous.Description", + label: 'DAGGERHEART.WeaponFeature.Pompous.Name', + description: 'DAGGERHEART.WeaponFeature.Pompous.Description' }, invigorating: { - label: "DAGGERHEART.WeaponFeature.Invigorating.Name", - description: "DAGGERHEART.WeaponFeature.Invigorating.Description", + label: 'DAGGERHEART.WeaponFeature.Invigorating.Name', + description: 'DAGGERHEART.WeaponFeature.Invigorating.Description' }, dense: { - label: "DAGGERHEART.WeaponFeature.Dense.Name", - description: "DAGGERHEART.WeaponFeature.Dense.Description", + label: 'DAGGERHEART.WeaponFeature.Dense.Name', + description: 'DAGGERHEART.WeaponFeature.Dense.Description' }, soulswift: { - label: "DAGGERHEART.WeaponFeature.Soulswift.Name", - description: "DAGGERHEART.WeaponFeature.Soulswift.Description", + label: 'DAGGERHEART.WeaponFeature.Soulswift.Name', + description: 'DAGGERHEART.WeaponFeature.Soulswift.Description' }, protective: { - label: "DAGGERHEART.WeaponFeature.Protective.Name", - description: "DAGGERHEART.WeaponFeature.Protective.Description", + label: 'DAGGERHEART.WeaponFeature.Protective.Name', + description: 'DAGGERHEART.WeaponFeature.Protective.Description' }, devastating: { - label: "DAGGERHEART.WeaponFeature.Devastating.Name", - description: "DAGGERHEART.WeaponFeature.Devastating.Description", + label: 'DAGGERHEART.WeaponFeature.Devastating.Name', + description: 'DAGGERHEART.WeaponFeature.Devastating.Description' }, retractable: { - label: "DAGGERHEART.WeaponFeature.Retractable.Name", - description: "DAGGERHEART.WeaponFeature.Retractable.Description", + label: 'DAGGERHEART.WeaponFeature.Retractable.Name', + description: 'DAGGERHEART.WeaponFeature.Retractable.Description' }, burn: { - label: "DAGGERHEART.WeaponFeature.Burn.Name", - description: "DAGGERHEART.WeaponFeature.Burn.Description", + label: 'DAGGERHEART.WeaponFeature.Burn.Name', + description: 'DAGGERHEART.WeaponFeature.Burn.Description' }, painful: { - label: "DAGGERHEART.WeaponFeature.Painful.Name", - description: "DAGGERHEART.WeaponFeature.Painful.Description", + label: 'DAGGERHEART.WeaponFeature.Painful.Name', + description: 'DAGGERHEART.WeaponFeature.Painful.Description' }, otherwordly: { - label: "DAGGERHEART.WeaponFeature.Otherwordly.Name", - description: "DAGGERHEART.WeaponFeature.Otherwordly.Description", + label: 'DAGGERHEART.WeaponFeature.Otherwordly.Name', + description: 'DAGGERHEART.WeaponFeature.Otherwordly.Description' }, lucky: { - label: "DAGGERHEART.WeaponFeature.Lucky.Name", - description: "DAGGERHEART.WeaponFeature.Lucky.Description", + label: 'DAGGERHEART.WeaponFeature.Lucky.Name', + description: 'DAGGERHEART.WeaponFeature.Lucky.Description' }, selfCorrecting: { - label: "DAGGERHEART.WeaponFeature.SelfCorrecting.Name", - description: "DAGGERHEART.WeaponFeature.SelfCorrecting.Description", + label: 'DAGGERHEART.WeaponFeature.SelfCorrecting.Name', + description: 'DAGGERHEART.WeaponFeature.SelfCorrecting.Description' }, healing: { - label: "DAGGERHEART.WeaponFeature.Healing.Name", - description: "DAGGERHEART.WeaponFeature.Healing.Description", + label: 'DAGGERHEART.WeaponFeature.Healing.Name', + description: 'DAGGERHEART.WeaponFeature.Healing.Description' }, timebender: { - label: "DAGGERHEART.WeaponFeature.Timebender.Name", - description: "DAGGERHEART.WeaponFeature.Timebender.Description", + label: 'DAGGERHEART.WeaponFeature.Timebender.Name', + description: 'DAGGERHEART.WeaponFeature.Timebender.Description' }, enchanted: { - label: "DAGGERHEART.WeaponFeature.Enchanted.Name", - description: "DAGGERHEART.WeaponFeature.Enchanted.Description", + label: 'DAGGERHEART.WeaponFeature.Enchanted.Name', + description: 'DAGGERHEART.WeaponFeature.Enchanted.Description' }, serrated: { - label: "DAGGERHEART.WeaponFeature.Serrated.Name", - description: "DAGGERHEART.WeaponFeature.Serrated.Description", + label: 'DAGGERHEART.WeaponFeature.Serrated.Name', + description: 'DAGGERHEART.WeaponFeature.Serrated.Description' }, grappling: { - label: "DAGGERHEART.WeaponFeature.Grappling.Name", - description: "DAGGERHEART.WeaponFeature.Grappling.Description", + label: 'DAGGERHEART.WeaponFeature.Grappling.Name', + description: 'DAGGERHEART.WeaponFeature.Grappling.Description' }, long: { - label: "DAGGERHEART.WeaponFeature.Long.Name", - description: "DAGGERHEART.WeaponFeature.Long.Description", + label: 'DAGGERHEART.WeaponFeature.Long.Name', + description: 'DAGGERHEART.WeaponFeature.Long.Description' }, destructive: { - label: "DAGGERHEART.WeaponFeature.Destructive.Name", - description: "DAGGERHEART.WeaponFeature.Destructive.Description", - }, + label: 'DAGGERHEART.WeaponFeature.Destructive.Name', + description: 'DAGGERHEART.WeaponFeature.Destructive.Description' + }, concussive: { - label: "DAGGERHEART.WeaponFeature.Concussive.Name", - description: "DAGGERHEART.WeaponFeature.Concussive.Description", + label: 'DAGGERHEART.WeaponFeature.Concussive.Name', + description: 'DAGGERHEART.WeaponFeature.Concussive.Description' }, bouncing: { - label: "DAGGERHEART.WeaponFeature.Bouncing.Name", - description: "DAGGERHEART.WeaponFeature.Bouncing.Description", + label: 'DAGGERHEART.WeaponFeature.Bouncing.Name', + description: 'DAGGERHEART.WeaponFeature.Bouncing.Description' }, penetrating: { - label: "DAGGERHEART.WeaponFeature.Penetrating.Name", - description: "DAGGERHEART.WeaponFeature.Penetrating.Description", + label: 'DAGGERHEART.WeaponFeature.Penetrating.Name', + description: 'DAGGERHEART.WeaponFeature.Penetrating.Description' }, lifestealing: { - label: "DAGGERHEART.WeaponFeature.Lifestealing.Name", - description: "DAGGERHEART.WeaponFeature.Lifestealing.Description", + label: 'DAGGERHEART.WeaponFeature.Lifestealing.Name', + description: 'DAGGERHEART.WeaponFeature.Lifestealing.Description' }, greedy: { - label: "DAGGERHEART.WeaponFeature.Greedy.Name", - description: "DAGGERHEART.WeaponFeature.Greedy.Description", + label: 'DAGGERHEART.WeaponFeature.Greedy.Name', + description: 'DAGGERHEART.WeaponFeature.Greedy.Description' }, bonded: { - label: "DAGGERHEART.WeaponFeature.Bonded.Name", - description: "DAGGERHEART.WeaponFeature.Bonded.Description", + label: 'DAGGERHEART.WeaponFeature.Bonded.Name', + description: 'DAGGERHEART.WeaponFeature.Bonded.Description' }, barrier: { - label: "DAGGERHEART.WeaponFeature.Barrier.Name", - description: "DAGGERHEART.WeaponFeature.Barrier.Description", + label: 'DAGGERHEART.WeaponFeature.Barrier.Name', + description: 'DAGGERHEART.WeaponFeature.Barrier.Description' }, paired: { - label: "DAGGERHEART.WeaponFeature.Paired.Name", - description: "DAGGERHEART.WeaponFeature.Paired.Description", + label: 'DAGGERHEART.WeaponFeature.Paired.Name', + description: 'DAGGERHEART.WeaponFeature.Paired.Description' }, whipcrack: { - label: "DAGGERHEART.WeaponFeature.Whipcrack.Name", - description: "DAGGERHEART.WeaponFeature.Whipcrack.Description", + label: 'DAGGERHEART.WeaponFeature.Whipcrack.Name', + description: 'DAGGERHEART.WeaponFeature.Whipcrack.Description' }, hook: { - label: "DAGGERHEART.WeaponFeature.Hook.Name", - description: "DAGGERHEART.WeaponFeature.Hook.Description", + label: 'DAGGERHEART.WeaponFeature.Hook.Name', + description: 'DAGGERHEART.WeaponFeature.Hook.Description' }, doubleDuty: { - label: "DAGGERHEART.WeaponFeature.DoubleDuty.Name", - description: "DAGGERHEART.WeaponFeature.DoubleDuty.Description", + label: 'DAGGERHEART.WeaponFeature.DoubleDuty.Name', + description: 'DAGGERHEART.WeaponFeature.DoubleDuty.Description' }, parry: { - label: "DAGGERHEART.WeaponFeature.Parry.Name", - description: "DAGGERHEART.WeaponFeature.Parry.Description", + label: 'DAGGERHEART.WeaponFeature.Parry.Name', + description: 'DAGGERHEART.WeaponFeature.Parry.Description' }, retrieve: { - label: "DAGGERHEART.WeaponFeature.Retrieve.Name", - description: "DAGGERHEART.WeaponFeature.Retrieve.Description", + label: 'DAGGERHEART.WeaponFeature.Retrieve.Name', + description: 'DAGGERHEART.WeaponFeature.Retrieve.Description' }, deflecting: { - label: "DAGGERHEART.WeaponFeature.Deflecting.Name", - description: "DAGGERHEART.WeaponFeature.Deflecting.Description", + label: 'DAGGERHEART.WeaponFeature.Deflecting.Name', + description: 'DAGGERHEART.WeaponFeature.Deflecting.Description' }, chargedAttack: { - label: "DAGGERHEART.WeaponFeature.ChargedAttack.Name", - description: "DAGGERHEART.WeaponFeature.ChargedAttack.Description", + label: 'DAGGERHEART.WeaponFeature.ChargedAttack.Name', + description: 'DAGGERHEART.WeaponFeature.ChargedAttack.Description' }, sheltering: { - label: "DAGGERHEART.WeaponFeature.Sheltering.Name", - description: "DAGGERHEART.WeaponFeature.Sheltering.Description", + label: 'DAGGERHEART.WeaponFeature.Sheltering.Name', + description: 'DAGGERHEART.WeaponFeature.Sheltering.Description' }, doubledUp: { - label: "DAGGERHEART.WeaponFeature.DoubledUp.Name", - description: "DAGGERHEART.WeaponFeature.DoubledUp.Description", + label: 'DAGGERHEART.WeaponFeature.DoubledUp.Name', + description: 'DAGGERHEART.WeaponFeature.DoubledUp.Description' }, lockedOn: { - label: "DAGGERHEART.WeaponFeature.LockedOn.Name", - description: "DAGGERHEART.WeaponFeature.LockedOn.Description", - }, + label: 'DAGGERHEART.WeaponFeature.LockedOn.Name', + description: 'DAGGERHEART.WeaponFeature.LockedOn.Description' + } }; export const featureTypes = { ancestry: { - id: "ancestry", - label: "DAGGERHEART.Feature.Type.Ancestry" + id: 'ancestry', + label: 'DAGGERHEART.Feature.Type.Ancestry' }, community: { - id: "community", - label: "DAGGERHEART.Feature.Type.Community" + id: 'community', + label: 'DAGGERHEART.Feature.Type.Community' }, class: { - id: "class", - label: "DAGGERHEART.Feature.Type.Class" + id: 'class', + label: 'DAGGERHEART.Feature.Type.Class' }, subclass: { - id: "subclass", - label: "DAGGERHEART.Feature.Type.Subclass" - }, -} + id: 'subclass', + label: 'DAGGERHEART.Feature.Type.Subclass' + } +}; export const valueTypes = { normal: { id: 'normal', - name: "DAGGERHEART.Feature.ValueType.Normal", + name: 'DAGGERHEART.Feature.ValueType.Normal', data: { value: 0, - max: 0, + max: 0 } }, input: { id: 'input', - name: "DAGGERHEART.Feature.ValueType.Input", + name: 'DAGGERHEART.Feature.ValueType.Input', data: { - value: null, + value: null } }, dice: { id: 'dice', - name: "DAGGERHEART.Feature.ValueType.Dice", + name: 'DAGGERHEART.Feature.ValueType.Dice', data: { - value: null, + value: null } } -} +}; export const actionTypes = { passive: { - id: "passive", - label: "DAGGERHEART.ActionType.Passive" + id: 'passive', + label: 'DAGGERHEART.ActionType.Passive' }, action: { - id: "action", - label: "DAGGERHEART.ActionType.Action" + id: 'action', + label: 'DAGGERHEART.ActionType.Action' }, reaction: { - id: "reaction", - label: "DAGGERHEART.ActionType.Reaction" + id: 'reaction', + label: 'DAGGERHEART.ActionType.Reaction' } }; diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index 7c790b72..5a4674da 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -1,28 +1,28 @@ export const menu = { Automation: { - Name: "GameSettingsAutomation", - Icon: "fa-solid fa-robot", + Name: 'GameSettingsAutomation', + Icon: 'fa-solid fa-robot' }, Homebrew: { - Name: "GameSettingsHomebrew", - Icon: "fa-solid fa-flask-vial", + Name: 'GameSettingsHomebrew', + Icon: 'fa-solid fa-flask-vial' }, Range: { - Name: "GameSettingsRange", - Icon: "fa-solid fa-ruler", - }, + Name: 'GameSettingsRange', + Icon: 'fa-solid fa-ruler' + } }; export const gameSettings = { Automation: { - Hope: "AutomationHope", - ActionPoints: "AutomationActionPoints", + Hope: 'AutomationHope', + ActionPoints: 'AutomationActionPoints' }, Resources: { - Fear: "ResourcesFear" + Fear: 'ResourcesFear' }, General: { - AbilityArray: "AbilityArray", - RangeMeasurement: "RangeMeasurement", + AbilityArray: 'AbilityArray', + RangeMeasurement: 'RangeMeasurement' } -} \ No newline at end of file +}; diff --git a/module/config/system.mjs b/module/config/system.mjs index 0129d706..fd198443 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -1,12 +1,12 @@ import * as GENERAL from './generalConfig.mjs'; -import * as DOMAIN from "./domainConfig.mjs"; +import * as DOMAIN from './domainConfig.mjs'; import * as ACTOR from './actorConfig.mjs'; import * as ITEM from './itemConfig.mjs'; import * as SETTINGS from './settingsConfig.mjs'; import * as EFFECTS from './effectConfig.mjs'; import * as ACTIONS from './actionConfig.mjs'; -export const SYSTEM_ID = "daggerheart"; +export const SYSTEM_ID = 'daggerheart'; export const SYSTEM = { id: SYSTEM_ID, @@ -16,5 +16,5 @@ export const SYSTEM = { ITEM, SETTINGS, EFFECTS, - ACTIONS, -}; \ No newline at end of file + ACTIONS +}; diff --git a/module/data/_module.mjs b/module/data/_module.mjs index 2e6db942..bc3839d7 100644 --- a/module/data/_module.mjs +++ b/module/data/_module.mjs @@ -15,4 +15,4 @@ export { default as DhpArmor } from './armor.mjs'; export { default as DhpDualityRoll } from './dualityRoll.mjs'; export { default as DhpAdversaryRoll } from './adversaryRoll.mjs'; export { default as DhpAbilityUse } from './abilityUse.mjs'; -export { default as DhpEnvironment } from './environment.mjs'; \ No newline at end of file +export { default as DhpEnvironment } from './environment.mjs'; diff --git a/module/data/abilityUse.mjs b/module/data/abilityUse.mjs index d1f3f7b9..5d95cd11 100644 --- a/module/data/abilityUse.mjs +++ b/module/data/abilityUse.mjs @@ -1,30 +1,32 @@ export default class DhpAbilityUse extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; + const fields = foundry.data.fields; - return { - title: new fields.StringField({}), - img: new fields.StringField({}), - name: new fields.StringField({}), - description: new fields.StringField({}), - actions: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - damage: new fields.SchemaField({ - type: new fields.StringField({}), - value: new fields.StringField({}), - }), - healing: new fields.SchemaField({ - type: new fields.StringField({}), - value: new fields.StringField({}), - }), - cost: new fields.SchemaField({ - type: new fields.StringField({ nullable: true }), - value: new fields.NumberField({ nullable: true }), - }), - target: new fields.SchemaField({ - type: new fields.StringField({}), - }), - })), - } + return { + title: new fields.StringField({}), + img: new fields.StringField({}), + name: new fields.StringField({}), + description: new fields.StringField({}), + actions: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + damage: new fields.SchemaField({ + type: new fields.StringField({}), + value: new fields.StringField({}) + }), + healing: new fields.SchemaField({ + type: new fields.StringField({}), + value: new fields.StringField({}) + }), + cost: new fields.SchemaField({ + type: new fields.StringField({ nullable: true }), + value: new fields.NumberField({ nullable: true }) + }), + target: new fields.SchemaField({ + type: new fields.StringField({}) + }) + }) + ) + }; } -} \ No newline at end of file +} diff --git a/module/data/action.mjs b/module/data/action.mjs index 7d02c148..2c33450e 100644 --- a/module/data/action.mjs +++ b/module/data/action.mjs @@ -1,38 +1,43 @@ export default class DaggerheartAction extends foundry.abstract.DataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - id: new fields.StringField({}), - name: new fields.StringField({ initial: 'New Action' }), - damage: new fields.SchemaField({ - type: new fields.StringField({ choices: SYSTEM.GENERAL.damageTypes, nullable: true, initial: null }), - value: new fields.StringField({}), - }), - healing: new fields.SchemaField({ - type: new fields.StringField({ choices: SYSTEM.GENERAL.healingTypes, nullable: true, initial: null }), - value: new fields.StringField(), - }), - conditions: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField(), - icon: new fields.StringField(), - description: new fields.StringField(), - })), - cost: new fields.SchemaField({ - type: new fields.StringField({ choices: SYSTEM.GENERAL.abilityCosts, nullable: true, initial: null }), - value: new fields.NumberField({ nullable: true, initial: null }), - }), - target: new fields.SchemaField({ - type: new fields.StringField({ choices: SYSTEM.ACTIONS.targetTypes, initial: SYSTEM.ACTIONS.targetTypes.other.id }) - }), - // uses: new fields.SchemaField({ - // nr: new fields.StringField({}), - // refreshType: new fields.StringField({ choices: SYSTEM.GENERAL.refreshTypes, initial: SYSTEM.GENERAL.refreshTypes.session.id }), - // refreshed: new fields.BooleanField({ initial: true }), - // }), - } + const fields = foundry.data.fields; + return { + id: new fields.StringField({}), + name: new fields.StringField({ initial: 'New Action' }), + damage: new fields.SchemaField({ + type: new fields.StringField({ choices: SYSTEM.GENERAL.damageTypes, nullable: true, initial: null }), + value: new fields.StringField({}) + }), + healing: new fields.SchemaField({ + type: new fields.StringField({ choices: SYSTEM.GENERAL.healingTypes, nullable: true, initial: null }), + value: new fields.StringField() + }), + conditions: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField(), + icon: new fields.StringField(), + description: new fields.StringField() + }) + ), + cost: new fields.SchemaField({ + type: new fields.StringField({ choices: SYSTEM.GENERAL.abilityCosts, nullable: true, initial: null }), + value: new fields.NumberField({ nullable: true, initial: null }) + }), + target: new fields.SchemaField({ + type: new fields.StringField({ + choices: SYSTEM.ACTIONS.targetTypes, + initial: SYSTEM.ACTIONS.targetTypes.other.id + }) + }) + // uses: new fields.SchemaField({ + // nr: new fields.StringField({}), + // refreshType: new fields.StringField({ choices: SYSTEM.GENERAL.refreshTypes, initial: SYSTEM.GENERAL.refreshTypes.session.id }), + // refreshed: new fields.BooleanField({ initial: true }), + // }), + }; } use = async () => { - console.log('Test Use'); + console.log('Test Use'); }; -} \ No newline at end of file +} diff --git a/module/data/adversary.mjs b/module/data/adversary.mjs index ca7bcae9..6d15cf3c 100644 --- a/module/data/adversary.mjs +++ b/module/data/adversary.mjs @@ -1,48 +1,54 @@ -import { MappingField } from "./fields.mjs"; +import { MappingField } from './fields.mjs'; export default class DhpAdversary extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - resources: new fields.SchemaField({ - health: new fields.SchemaField({ - value: new fields.NumberField({ initial: 0, integer: true }), - min: new fields.NumberField({ initial: 0, integer: true }), - max: new fields.NumberField({ initial: 0, integer: true }), - }), - stress: new fields.SchemaField({ - value: new fields.NumberField({ initial: 0, integer: true }), - min: new fields.NumberField({ initial: 0, integer: true }), - max: new fields.NumberField({ initial: 0, integer: true }), - }), - }), - tier: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.tiers), integer: false }), - type: new fields.StringField({ choices: Object.keys(SYSTEM.ACTOR.adversaryTypes), integer: false, initial: Object.keys(SYSTEM.ACTOR.adversaryTypes).find(x => x === 'standard') }), - description: new fields.StringField({}), - motivesAndTactics: new fields.ArrayField(new fields.StringField({})), - attackModifier: new fields.NumberField({ integer: true, nullabe: true, initial: null }), - attack: new fields.SchemaField({ - name: new fields.StringField({}), - range: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.range), integer: false }), - damage: new fields.SchemaField({ - value: new fields.StringField({}), - type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.damageTypes), integer: false }), - }) - }), - difficulty: new fields.NumberField({ initial: 1, integer: true }), - damageThresholds: new fields.SchemaField({ - minor: new fields.NumberField({ initial: 0, integer: true }), - major: new fields.NumberField({ initial: 0, integer: true }), - severe: new fields.NumberField({ initial: 0, integer: true }), - }), - experiences: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - value: new fields.NumberField({ integer: true, nullable: true, initial: null }), - })), - } + const fields = foundry.data.fields; + return { + resources: new fields.SchemaField({ + health: new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true }), + min: new fields.NumberField({ initial: 0, integer: true }), + max: new fields.NumberField({ initial: 0, integer: true }) + }), + stress: new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true }), + min: new fields.NumberField({ initial: 0, integer: true }), + max: new fields.NumberField({ initial: 0, integer: true }) + }) + }), + tier: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.tiers), integer: false }), + type: new fields.StringField({ + choices: Object.keys(SYSTEM.ACTOR.adversaryTypes), + integer: false, + initial: Object.keys(SYSTEM.ACTOR.adversaryTypes).find(x => x === 'standard') + }), + description: new fields.StringField({}), + motivesAndTactics: new fields.ArrayField(new fields.StringField({})), + attackModifier: new fields.NumberField({ integer: true, nullabe: true, initial: null }), + attack: new fields.SchemaField({ + name: new fields.StringField({}), + range: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.range), integer: false }), + damage: new fields.SchemaField({ + value: new fields.StringField({}), + type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.damageTypes), integer: false }) + }) + }), + difficulty: new fields.NumberField({ initial: 1, integer: true }), + damageThresholds: new fields.SchemaField({ + minor: new fields.NumberField({ initial: 0, integer: true }), + major: new fields.NumberField({ initial: 0, integer: true }), + severe: new fields.NumberField({ initial: 0, integer: true }) + }), + experiences: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + value: new fields.NumberField({ integer: true, nullable: true, initial: null }) + }) + ) + }; } - get moves(){ - return this.parent.items.filter(x => x.type === 'feature'); + get moves() { + return this.parent.items.filter(x => x.type === 'feature'); } -} \ No newline at end of file +} diff --git a/module/data/adversaryRoll.mjs b/module/data/adversaryRoll.mjs index 65450a4b..a218f65c 100644 --- a/module/data/adversaryRoll.mjs +++ b/module/data/adversaryRoll.mjs @@ -1,50 +1,59 @@ export default class DhpAdversaryRoll extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; + const fields = foundry.data.fields; - return { - roll: new fields.StringField({}), - total: new fields.NumberField({ integer: true }), - modifiers: new fields.ArrayField(new fields.SchemaField({ - value: new fields.NumberField({ integer: true }), - label: new fields.StringField({}), - title: new fields.StringField({}), - })), - diceResults: new fields.ArrayField(new fields.SchemaField({ - value: new fields.NumberField({ integer: true }), - discarded: new fields.BooleanField({ initial: false }), - })), - targets: new fields.ArrayField(new fields.SchemaField({ - id: new fields.StringField({}), - name: new fields.StringField({}), - img: new fields.StringField({}), - difficulty: new fields.NumberField({ integer: true, nullable: true }), - evasion: new fields.NumberField({ integer: true }), - hit: new fields.BooleanField({ initial: false }), - })), - damage: new fields.SchemaField({ - value: new fields.StringField({}), - type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.damageTypes), integer: false }), - }, { nullable: true, initial: null }) - } + return { + roll: new fields.StringField({}), + total: new fields.NumberField({ integer: true }), + modifiers: new fields.ArrayField( + new fields.SchemaField({ + value: new fields.NumberField({ integer: true }), + label: new fields.StringField({}), + title: new fields.StringField({}) + }) + ), + diceResults: new fields.ArrayField( + new fields.SchemaField({ + value: new fields.NumberField({ integer: true }), + discarded: new fields.BooleanField({ initial: false }) + }) + ), + targets: new fields.ArrayField( + new fields.SchemaField({ + id: new fields.StringField({}), + name: new fields.StringField({}), + img: new fields.StringField({}), + difficulty: new fields.NumberField({ integer: true, nullable: true }), + evasion: new fields.NumberField({ integer: true }), + hit: new fields.BooleanField({ initial: false }) + }) + ), + damage: new fields.SchemaField( + { + value: new fields.StringField({}), + type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.damageTypes), integer: false }) + }, + { nullable: true, initial: null } + ) + }; } - prepareDerivedData(){ - const diceKeys = Object.keys(this.diceResults); - const highestIndex = 0; - for(var index in diceKeys){ - const resultIndex = Number.parseInt(index); - if(highestIndex === resultIndex) continue; + prepareDerivedData() { + const diceKeys = Object.keys(this.diceResults); + const highestIndex = 0; + for (var index in diceKeys) { + const resultIndex = Number.parseInt(index); + if (highestIndex === resultIndex) continue; - const current = this.diceResults[resultIndex]; - const highest = this.diceResults[highestIndex]; + const current = this.diceResults[resultIndex]; + const highest = this.diceResults[highestIndex]; - if(current.value > highest.value) this.diceResults[highestIndex].discarded = true; - else this.diceResults[resultIndex].discarded = true; - } + if (current.value > highest.value) this.diceResults[highestIndex].discarded = true; + else this.diceResults[resultIndex].discarded = true; + } - this.targets.forEach(target => { - target.hit = target.difficulty ? this.total >= target.difficulty : this.total >= target.evasion; - }); + this.targets.forEach(target => { + target.hit = target.difficulty ? this.total >= target.difficulty : this.total >= target.evasion; + }); } -} \ No newline at end of file +} diff --git a/module/data/ancestry.mjs b/module/data/ancestry.mjs index fe9294af..413f729f 100644 --- a/module/data/ancestry.mjs +++ b/module/data/ancestry.mjs @@ -1,11 +1,11 @@ -import featuresSchema from "./interface/featuresSchema.mjs"; +import featuresSchema from './interface/featuresSchema.mjs'; export default class DhpAncestry extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - description: new fields.HTMLField({}), - abilities: featuresSchema(), - } + const fields = foundry.data.fields; + return { + description: new fields.HTMLField({}), + abilities: featuresSchema() + }; } -} \ No newline at end of file +} diff --git a/module/data/armor.mjs b/module/data/armor.mjs index 26cb5985..d3398e06 100644 --- a/module/data/armor.mjs +++ b/module/data/armor.mjs @@ -1,49 +1,47 @@ export default class DhpArmor extends foundry.abstract.TypeDataModel { - static defineSchema() { - const fields = foundry.data.fields; - return { - baseScore: new fields.NumberField({ initial: 1, integer: true }), - feature: new fields.StringField({ - choices: SYSTEM.ITEM.armorFeatures, - integer: false, - blank: true, - }), - marks: new fields.SchemaField({ - max: new fields.NumberField({ initial: 6, integer: true }), - value: new fields.NumberField({ initial: 0, integer: true }), - }), - baseThresholds: new fields.SchemaField({ - major: new fields.NumberField({ initial: 0, integer: true }), - severe: new fields.NumberField({ initial: 0, integer: true }), - }), - description: new fields.HTMLField({}), - }; - } - - get featureInfo() { - return this.feature - ? CONFIG.daggerheart.ITEM.armorFeatures[this.feature] - : null; - } - - prepareDerivedData() { - if (this.parent.parent) { - this.applyLevels(); + static defineSchema() { + const fields = foundry.data.fields; + return { + baseScore: new fields.NumberField({ initial: 1, integer: true }), + feature: new fields.StringField({ + choices: SYSTEM.ITEM.armorFeatures, + integer: false, + blank: true + }), + marks: new fields.SchemaField({ + max: new fields.NumberField({ initial: 6, integer: true }), + value: new fields.NumberField({ initial: 0, integer: true }) + }), + baseThresholds: new fields.SchemaField({ + major: new fields.NumberField({ initial: 0, integer: true }), + severe: new fields.NumberField({ initial: 0, integer: true }) + }), + description: new fields.HTMLField({}) + }; } - } - // Currently bugged as it double triggers. Should get fixed in an updated foundry version. - applyLevels() { - // let armorBonus = 0; - // for(var level in this.parent.parent.system.levelData.levelups){ - // var levelData = this.parent.parent.system.levelData.levelups[level]; - // for(var tier in levelData){ - // var tierData = levelData[tier]; - // if(tierData){ - // armorBonus += Object.keys(tierData.armorOrEvasionSlot).filter(x => tierData.armorOrEvasionSlot[x] === 'armor').length; - // } - // } - // } - // this.marks.max += armorBonus; - } + get featureInfo() { + return this.feature ? CONFIG.daggerheart.ITEM.armorFeatures[this.feature] : null; + } + + prepareDerivedData() { + if (this.parent.parent) { + this.applyLevels(); + } + } + + // Currently bugged as it double triggers. Should get fixed in an updated foundry version. + applyLevels() { + // let armorBonus = 0; + // for(var level in this.parent.parent.system.levelData.levelups){ + // var levelData = this.parent.parent.system.levelData.levelups[level]; + // for(var tier in levelData){ + // var tierData = levelData[tier]; + // if(tierData){ + // armorBonus += Object.keys(tierData.armorOrEvasionSlot).filter(x => tierData.armorOrEvasionSlot[x] === 'armor').length; + // } + // } + // } + // this.marks.max += armorBonus; + } } diff --git a/module/data/class.mjs b/module/data/class.mjs index deacee88..2b29975f 100644 --- a/module/data/class.mjs +++ b/module/data/class.mjs @@ -1,93 +1,117 @@ -import { getTier } from "../helpers/utils.mjs"; -import DhpFeature from "./feature.mjs"; +import { getTier } from '../helpers/utils.mjs'; +import DhpFeature from './feature.mjs'; export default class DhpClass extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - domains: new fields.ArrayField(new fields.StringField({})), - classItems: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - })), - damageThresholds: new fields.SchemaField({ - minor: new fields.NumberField({ initial: 0, integer: true }), - major: new fields.NumberField({ initial: 0, integer: true }), - severe: new fields.NumberField({ initial: 0, integer: true }), - }), - evasion: new fields.NumberField({ initial: 0, integer: true}), - features: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - })), - subclasses: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - })), - inventory: new fields.SchemaField({ - take: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - })), - choiceA: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - })), - choiceB: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - })), - extra: new fields.SchemaField({ - title: new fields.StringField({}), - description: new fields.StringField({}) - }, { initial: null, nullable: true }), - }), - characterGuide: new fields.SchemaField({ - suggestedTraits: new fields.SchemaField({ - agility: new fields.NumberField({ initial: 0, integer: true }), - strength: new fields.NumberField({ initial: 0, integer: true }), - finesse: new fields.NumberField({ initial: 0, integer: true }), - instinct: new fields.NumberField({ initial: 0, integer: true }), - presence: new fields.NumberField({ initial: 0, integer: true }), - knowledge: new fields.NumberField({ initial: 0, integer: true }), - }), - suggestedPrimaryWeapon: new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - }, { initial: null, nullable: true }), - suggestedSecondaryWeapon: new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - }, { initial: null, nullable: true }), - suggestedArmor: new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - }, { initial: null, nullable: true }), - characterDescription: new fields.SchemaField({ - clothes: new fields.StringField({}), - eyes: new fields.StringField({}), - body: new fields.StringField({}), - color: new fields.StringField({}), - attitude: new fields.StringField({}), - }), - backgroundQuestions: new fields.ArrayField(new fields.StringField({}), { initial: ['', '', ''] }), - connections: new fields.ArrayField(new fields.StringField({}), { initial: ['', '' ,''] }), - }), - multiclass: new fields.NumberField({ initial: null, nullable: true, integer: true }), - description: new fields.HTMLField({}), - } + const fields = foundry.data.fields; + return { + domains: new fields.ArrayField(new fields.StringField({})), + classItems: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }) + ), + damageThresholds: new fields.SchemaField({ + minor: new fields.NumberField({ initial: 0, integer: true }), + major: new fields.NumberField({ initial: 0, integer: true }), + severe: new fields.NumberField({ initial: 0, integer: true }) + }), + evasion: new fields.NumberField({ initial: 0, integer: true }), + features: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }) + ), + subclasses: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }) + ), + inventory: new fields.SchemaField({ + take: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }) + ), + choiceA: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }) + ), + choiceB: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }) + ), + extra: new fields.SchemaField( + { + title: new fields.StringField({}), + description: new fields.StringField({}) + }, + { initial: null, nullable: true } + ) + }), + characterGuide: new fields.SchemaField({ + suggestedTraits: new fields.SchemaField({ + agility: new fields.NumberField({ initial: 0, integer: true }), + strength: new fields.NumberField({ initial: 0, integer: true }), + finesse: new fields.NumberField({ initial: 0, integer: true }), + instinct: new fields.NumberField({ initial: 0, integer: true }), + presence: new fields.NumberField({ initial: 0, integer: true }), + knowledge: new fields.NumberField({ initial: 0, integer: true }) + }), + suggestedPrimaryWeapon: new fields.SchemaField( + { + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }, + { initial: null, nullable: true } + ), + suggestedSecondaryWeapon: new fields.SchemaField( + { + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }, + { initial: null, nullable: true } + ), + suggestedArmor: new fields.SchemaField( + { + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}) + }, + { initial: null, nullable: true } + ), + characterDescription: new fields.SchemaField({ + clothes: new fields.StringField({}), + eyes: new fields.StringField({}), + body: new fields.StringField({}), + color: new fields.StringField({}), + attitude: new fields.StringField({}) + }), + backgroundQuestions: new fields.ArrayField(new fields.StringField({}), { initial: ['', '', ''] }), + connections: new fields.ArrayField(new fields.StringField({}), { initial: ['', '', ''] }) + }), + multiclass: new fields.NumberField({ initial: null, nullable: true, integer: true }), + description: new fields.HTMLField({}) + }; } - get multiclassTier(){ - return getTier(this.multiclass, true); + get multiclassTier() { + return getTier(this.multiclass, true); } -} \ No newline at end of file +} diff --git a/module/data/combat.mjs b/module/data/combat.mjs index 0fa1d340..3ad52b8b 100644 --- a/module/data/combat.mjs +++ b/module/data/combat.mjs @@ -1,9 +1,9 @@ export default class DhpCombat extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - actions: new fields.NumberField({ initial: 0, integer: true }), - activeCombatant: new fields.StringField({}), - } + const fields = foundry.data.fields; + return { + actions: new fields.NumberField({ initial: 0, integer: true }), + activeCombatant: new fields.StringField({}) + }; } -} \ No newline at end of file +} diff --git a/module/data/combatant.mjs b/module/data/combatant.mjs index 807665d5..60c32db6 100644 --- a/module/data/combatant.mjs +++ b/module/data/combatant.mjs @@ -1,8 +1,8 @@ export default class DhpCombatant extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - active: new fields.BooleanField({ initial: false }) - } + const fields = foundry.data.fields; + return { + active: new fields.BooleanField({ initial: false }) + }; } -} \ No newline at end of file +} diff --git a/module/data/community.mjs b/module/data/community.mjs index fcb887cd..0f067b6e 100644 --- a/module/data/community.mjs +++ b/module/data/community.mjs @@ -1,11 +1,11 @@ -import featuresSchema from "./interface/featuresSchema.mjs"; +import featuresSchema from './interface/featuresSchema.mjs'; export default class DhpCommunity extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - description: new fields.HTMLField({}), - abilities: featuresSchema(), - } + const fields = foundry.data.fields; + return { + description: new fields.HTMLField({}), + abilities: featuresSchema() + }; } -} \ No newline at end of file +} diff --git a/module/data/consumable.mjs b/module/data/consumable.mjs index 21938ecd..dbe8666d 100644 --- a/module/data/consumable.mjs +++ b/module/data/consumable.mjs @@ -1,10 +1,10 @@ export default class DhpConsumable extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - description: new fields.HTMLField({}), - quantity: new fields.NumberField({ initial: 1, integer: true }), - consumeOnUse: new fields.BooleanField({ initial: false }), - } + const fields = foundry.data.fields; + return { + description: new fields.HTMLField({}), + quantity: new fields.NumberField({ initial: 1, integer: true }), + consumeOnUse: new fields.BooleanField({ initial: false }) + }; } -} \ No newline at end of file +} diff --git a/module/data/domainCard.mjs b/module/data/domainCard.mjs index 181ab15f..35f4ab52 100644 --- a/module/data/domainCard.mjs +++ b/module/data/domainCard.mjs @@ -1,17 +1,23 @@ -import DaggerheartAction from "./action.mjs"; +import DaggerheartAction from './action.mjs'; export default class DhpDomainCard extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - domain: new fields.StringField({ choices: SYSTEM.DOMAIN.domains, integer: false }, { required: true, initial: [] }), - level: new fields.NumberField({ initial: 1, integer: true }), - recallCost: new fields.NumberField({ initial: 0, integer: true }), - type: new fields.StringField({ choices: SYSTEM.DOMAIN.cardTypes, integer: false }, { required: true, initial: [] }), - foundation: new fields.BooleanField({ initial: false }), - effect: new fields.HTMLField({}), - inVault: new fields.BooleanField({ initial: false }), - actions: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartAction)), - } + const fields = foundry.data.fields; + return { + domain: new fields.StringField( + { choices: SYSTEM.DOMAIN.domains, integer: false }, + { required: true, initial: [] } + ), + level: new fields.NumberField({ initial: 1, integer: true }), + recallCost: new fields.NumberField({ initial: 0, integer: true }), + type: new fields.StringField( + { choices: SYSTEM.DOMAIN.cardTypes, integer: false }, + { required: true, initial: [] } + ), + foundation: new fields.BooleanField({ initial: false }), + effect: new fields.HTMLField({}), + inVault: new fields.BooleanField({ initial: false }), + actions: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartAction)) + }; } -} \ No newline at end of file +} diff --git a/module/data/dualityRoll.mjs b/module/data/dualityRoll.mjs index ffb40484..d6c4471c 100644 --- a/module/data/dualityRoll.mjs +++ b/module/data/dualityRoll.mjs @@ -1,65 +1,83 @@ const fields = foundry.data.fields; -const diceField = () => new fields.SchemaField({ - dice: new fields.StringField({}), - value: new fields.NumberField({ integer: true}), -}); +const diceField = () => + new fields.SchemaField({ + dice: new fields.StringField({}), + value: new fields.NumberField({ integer: true }) + }); export default class DhpDualityRoll extends foundry.abstract.TypeDataModel { static defineSchema() { - - return { - roll: new fields.StringField({}), - modifiers: new fields.ArrayField(new fields.SchemaField({ - value: new fields.NumberField({ integer: true }), - label: new fields.StringField({}), - title: new fields.StringField({}), - })), - hope: diceField(), - fear: diceField(), - advantage: diceField(), - disadvantage: diceField(), - advantageSelected: new fields.NumberField({ initial: 0 }), - targets: new fields.ArrayField(new fields.SchemaField({ - id: new fields.StringField({}), - name: new fields.StringField({}), - img: new fields.StringField({}), - difficulty: new fields.NumberField({ integer: true, nullable: true }), - evasion: new fields.NumberField({ integer: true }), - hit: new fields.BooleanField({ initial: false }), - })), - damage: new fields.SchemaField({ - value: new fields.StringField({}), - type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.damageTypes), integer: false }), - bonusDamage: new fields.ArrayField(new fields.SchemaField({ - value: new fields.StringField({}), - type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.damageTypes), integer: false }), - initiallySelected: new fields.BooleanField(), - appliesOn: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.applyLocations) }, { nullable: true, initial: null }), - description: new fields.StringField({}), - hopeIncrease: new fields.StringField({ nullable: true }) - }), { nullable: true, initial: null }) - }) - } + return { + roll: new fields.StringField({}), + modifiers: new fields.ArrayField( + new fields.SchemaField({ + value: new fields.NumberField({ integer: true }), + label: new fields.StringField({}), + title: new fields.StringField({}) + }) + ), + hope: diceField(), + fear: diceField(), + advantage: diceField(), + disadvantage: diceField(), + advantageSelected: new fields.NumberField({ initial: 0 }), + targets: new fields.ArrayField( + new fields.SchemaField({ + id: new fields.StringField({}), + name: new fields.StringField({}), + img: new fields.StringField({}), + difficulty: new fields.NumberField({ integer: true, nullable: true }), + evasion: new fields.NumberField({ integer: true }), + hit: new fields.BooleanField({ initial: false }) + }) + ), + damage: new fields.SchemaField({ + value: new fields.StringField({}), + type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.damageTypes), integer: false }), + bonusDamage: new fields.ArrayField( + new fields.SchemaField({ + value: new fields.StringField({}), + type: new fields.StringField({ + choices: Object.keys(SYSTEM.GENERAL.damageTypes), + integer: false + }), + initiallySelected: new fields.BooleanField(), + appliesOn: new fields.StringField( + { choices: Object.keys(SYSTEM.EFFECTS.applyLocations) }, + { nullable: true, initial: null } + ), + description: new fields.StringField({}), + hopeIncrease: new fields.StringField({ nullable: true }) + }), + { nullable: true, initial: null } + ) + }) + }; } get total() { - const modifiers = this.modifiers.reduce((acc, x) => acc+x.value, 0); - const advantage = this.advantage.value ?? this.disadvantage.value ? -this.disadvantage.value : 0; - return this.hope.value + this.fear.value + advantage + modifiers; + const modifiers = this.modifiers.reduce((acc, x) => acc + x.value, 0); + const advantage = (this.advantage.value ?? this.disadvantage.value) ? -this.disadvantage.value : 0; + return this.hope.value + this.fear.value + advantage + modifiers; } - get totalLabel() { - const label = this.hope.value > this.fear.value ? "DAGGERHEART.General.Hope" : this.fear.value > this.hope.value ? "DAGGERHEART.General.Fear" : "DAGGERHEART.General.CriticalSuccess"; + get totalLabel() { + const label = + this.hope.value > this.fear.value + ? 'DAGGERHEART.General.Hope' + : this.fear.value > this.hope.value + ? 'DAGGERHEART.General.Fear' + : 'DAGGERHEART.General.CriticalSuccess'; - return game.i18n.localize(label); + return game.i18n.localize(label); } - prepareDerivedData(){ - const total = this.total; + prepareDerivedData() { + const total = this.total; - this.targets.forEach(target => { - target.hit = target.difficulty ? total >= target.difficulty : total >= target.evasion; - }); + this.targets.forEach(target => { + target.hit = target.difficulty ? total >= target.difficulty : total >= target.evasion; + }); } } @@ -110,7 +128,7 @@ export default class DhpDualityRoll extends foundry.abstract.TypeDataModel { // get total() { // const modifiers = this.modifiers.reduce((acc, x) => acc+x.value, 0); -// const regular = { +// const regular = { // normal: this.disadvantage.value ? Math.min(this.disadvantage.value, this.hope.value) + this.fear.value + modifiers : this.hope.value + this.fear.value + modifiers, // alternate: this.advantage.value ? this.advantage.value + this.fear.value + modifiers : null, // }; @@ -126,7 +144,7 @@ export default class DhpDualityRoll extends foundry.abstract.TypeDataModel { // get totalLabel() { // if(this.advantage.value && this.advantageSelected === 0) return game.i18n.localize("DAGGERHEART.Chat.DualityRoll.AdvantageChooseTitle"); -// const hope = !this.advantage.value || this.advantageSelected === 1 ? this.hope.value : this.advantage.value; +// const hope = !this.advantage.value || this.advantageSelected === 1 ? this.hope.value : this.advantage.value; // const label = hope > this.fear.value ? "DAGGERHEART.General.Hope" : this.fear.value > hope ? "DAGGERHEART.General.Fear" : "DAGGERHEART.General.CriticalSuccess"; // return game.i18n.localize(label); @@ -147,4 +165,4 @@ export default class DhpDualityRoll extends foundry.abstract.TypeDataModel { // target.hit = target.difficulty ? total.normal >= target.difficulty : total.normal >= target.evasion; // }); // } -// } \ No newline at end of file +// } diff --git a/module/data/environment.mjs b/module/data/environment.mjs index 05c6aeae..23e9cd25 100644 --- a/module/data/environment.mjs +++ b/module/data/environment.mjs @@ -1,20 +1,22 @@ export default class DhpEnvironment extends foundry.abstract.TypeDataModel { - static defineSchema() { - const fields = foundry.data.fields; - return { - resources: new fields.SchemaField({ - - }), - tier: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.tiers), integer: false }), - type: new fields.StringField({ choices: Object.keys(SYSTEM.ACTOR.adversaryTypes), integer: false, initial: Object.keys(SYSTEM.ACTOR.adversaryTypes).find(x => x === 'standard') }), - description: new fields.StringField({}), - toneAndFeel: new fields.StringField({}), - difficulty: new fields.NumberField({ initial: 1, integer: true }), - potentialAdversaries: new fields.StringField({}), + static defineSchema() { + const fields = foundry.data.fields; + return { + resources: new fields.SchemaField({}), + tier: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.tiers), integer: false }), + type: new fields.StringField({ + choices: Object.keys(SYSTEM.ACTOR.adversaryTypes), + integer: false, + initial: Object.keys(SYSTEM.ACTOR.adversaryTypes).find(x => x === 'standard') + }), + description: new fields.StringField({}), + toneAndFeel: new fields.StringField({}), + difficulty: new fields.NumberField({ initial: 1, integer: true }), + potentialAdversaries: new fields.StringField({}) + }; } - } - get features(){ - return this.parent.items.filter(x => x.type === 'feature'); - } -} \ No newline at end of file + get features() { + return this.parent.items.filter(x => x.type === 'feature'); + } +} diff --git a/module/data/feature.mjs b/module/data/feature.mjs index 56bc31cc..cf2ebe06 100644 --- a/module/data/feature.mjs +++ b/module/data/feature.mjs @@ -1,77 +1,106 @@ -import { getTier } from "../helpers/utils.mjs"; -import DaggerheartAction from "./action.mjs"; -import { MappingField } from "./fields.mjs"; -import DhpEffect from "./interface/effects.mjs"; +import { getTier } from '../helpers/utils.mjs'; +import DaggerheartAction from './action.mjs'; +import { MappingField } from './fields.mjs'; +import DhpEffect from './interface/effects.mjs'; export default class DhpFeature extends DhpEffect { static defineSchema() { - const fields = foundry.data.fields; - return foundry.utils.mergeObject({}, { - type: new fields.StringField({ choices: SYSTEM.ITEM.featureTypes }), - actionType: new fields.StringField({ choices: SYSTEM.ITEM.actionTypes, initial: SYSTEM.ITEM.actionTypes.passive.id }), - featureType: new fields.SchemaField({ - type: new fields.StringField({ choices: SYSTEM.ITEM.valueTypes, initial: Object.keys(SYSTEM.ITEM.valueTypes).find(x => x === 'normal') }), - data: new fields.SchemaField({ - value: new fields.StringField({}), - property: new fields.StringField({ choices: SYSTEM.ACTOR.featureProperties, initial: Object.keys(SYSTEM.ACTOR.featureProperties).find(x => x === 'spellcastingTrait') }), - max: new fields.NumberField({ initial: 1, integer: true }), - numbers: new MappingField(new fields.SchemaField({ - value: new fields.NumberField({ integer: true }), - used: new fields.BooleanField({ initial: false }), - })), - }), - }), - refreshData: new fields.SchemaField({ - type: new fields.StringField({ choices: SYSTEM.GENERAL.refreshTypes }), - uses: new fields.NumberField({ initial: 1, integer: true }), - refreshed: new fields.BooleanField({ initial: true }) - }, { nullable: true, initial: null }), - multiclass: new fields.NumberField({ initial: null, nullable: true, integer: true }), - disabled: new fields.BooleanField({ initial: false }), - description: new fields.HTMLField({}), - effects: new MappingField(new fields.SchemaField({ - type: new fields.StringField({ choices: SYSTEM.EFFECTS.effectTypes }), - valueType: new fields.StringField({ choices: SYSTEM.EFFECTS.valueTypes }), - parseType: new fields.StringField({ choices: SYSTEM.EFFECTS.parseTypes }), - initiallySelected: new fields.BooleanField({ initial: true }), - options: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - value: new fields.StringField({}), - }), { nullable: true, initial: null }), - dataField: new fields.StringField({}), - appliesOn: new fields.StringField({ choices: SYSTEM.EFFECTS.applyLocations }, { nullable: true, initial: null }), - applyLocationChoices: new MappingField(new fields.StringField({}), { nullable: true, initial: null }), - valueData: new fields.SchemaField({ - value: new fields.StringField({}), - fromValue: new fields.StringField({ initial: null, nullable: true }), - type: new fields.StringField({ initial: null, nullable: true }), - hopeIncrease: new fields.StringField({ initial: null, nullable: true }) - }), - })), - actions: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartAction)), - }); + const fields = foundry.data.fields; + return foundry.utils.mergeObject( + {}, + { + type: new fields.StringField({ choices: SYSTEM.ITEM.featureTypes }), + actionType: new fields.StringField({ + choices: SYSTEM.ITEM.actionTypes, + initial: SYSTEM.ITEM.actionTypes.passive.id + }), + featureType: new fields.SchemaField({ + type: new fields.StringField({ + choices: SYSTEM.ITEM.valueTypes, + initial: Object.keys(SYSTEM.ITEM.valueTypes).find(x => x === 'normal') + }), + data: new fields.SchemaField({ + value: new fields.StringField({}), + property: new fields.StringField({ + choices: SYSTEM.ACTOR.featureProperties, + initial: Object.keys(SYSTEM.ACTOR.featureProperties).find(x => x === 'spellcastingTrait') + }), + max: new fields.NumberField({ initial: 1, integer: true }), + numbers: new MappingField( + new fields.SchemaField({ + value: new fields.NumberField({ integer: true }), + used: new fields.BooleanField({ initial: false }) + }) + ) + }) + }), + refreshData: new fields.SchemaField( + { + type: new fields.StringField({ choices: SYSTEM.GENERAL.refreshTypes }), + uses: new fields.NumberField({ initial: 1, integer: true }), + refreshed: new fields.BooleanField({ initial: true }) + }, + { nullable: true, initial: null } + ), + multiclass: new fields.NumberField({ initial: null, nullable: true, integer: true }), + disabled: new fields.BooleanField({ initial: false }), + description: new fields.HTMLField({}), + effects: new MappingField( + new fields.SchemaField({ + type: new fields.StringField({ choices: SYSTEM.EFFECTS.effectTypes }), + valueType: new fields.StringField({ choices: SYSTEM.EFFECTS.valueTypes }), + parseType: new fields.StringField({ choices: SYSTEM.EFFECTS.parseTypes }), + initiallySelected: new fields.BooleanField({ initial: true }), + options: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + value: new fields.StringField({}) + }), + { nullable: true, initial: null } + ), + dataField: new fields.StringField({}), + appliesOn: new fields.StringField( + { choices: SYSTEM.EFFECTS.applyLocations }, + { nullable: true, initial: null } + ), + applyLocationChoices: new MappingField(new fields.StringField({}), { + nullable: true, + initial: null + }), + valueData: new fields.SchemaField({ + value: new fields.StringField({}), + fromValue: new fields.StringField({ initial: null, nullable: true }), + type: new fields.StringField({ initial: null, nullable: true }), + hopeIncrease: new fields.StringField({ initial: null, nullable: true }) + }) + }) + ), + actions: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartAction)) + } + ); } - get multiclassTier(){ - return getTier(this.multiclass); + get multiclassTier() { + return getTier(this.multiclass); } - - async refresh(){ - if(this.refreshData){ - if(this.featureType.type === SYSTEM.ITEM.valueTypes.dice.id) { - const update = { "system.refreshData.refreshed": true }; - Object.keys(this.featureType.data.numbers).forEach(x => update[`system.featureType.data.numbers.-=${x}`] = null); - await this.parent.update(update); + + async refresh() { + if (this.refreshData) { + if (this.featureType.type === SYSTEM.ITEM.valueTypes.dice.id) { + const update = { 'system.refreshData.refreshed': true }; + Object.keys(this.featureType.data.numbers).forEach( + x => (update[`system.featureType.data.numbers.-=${x}`] = null) + ); + await this.parent.update(update); + } else { + await this.parent.update({ 'system.refreshData.refreshed': true }); + } } - else { - await this.parent.update({ "system.refreshData.refreshed": true}); - } - } } // prepareDerivedData(){ // if(this.featureType.type === SYSTEM.ITEM.valueTypes.dice.id){ - // this.featureType.numbers = ; + // this.featureType.numbers = ; // } // } -} \ No newline at end of file +} diff --git a/module/data/fields.mjs b/module/data/fields.mjs index d75be130..b4993237 100644 --- a/module/data/fields.mjs +++ b/module/data/fields.mjs @@ -1,50 +1,50 @@ export class MappingField extends foundry.data.fields.ObjectField { constructor(model, options) { - if ( !(model instanceof foundry.data.fields.DataField) ) { - throw new Error("MappingField must have a DataField as its contained element"); - } - super(options); - - /** - * The embedded DataField definition which is contained in this field. - * @type {DataField} - */ - this.model = model; + if (!(model instanceof foundry.data.fields.DataField)) { + throw new Error('MappingField must have a DataField as its contained element'); + } + super(options); + + /** + * The embedded DataField definition which is contained in this field. + * @type {DataField} + */ + this.model = model; } - + /* -------------------------------------------- */ - + /** @inheritdoc */ static get _defaults() { - return foundry.utils.mergeObject(super._defaults, { - initialKeys: null, - initialValue: null, - initialKeysOnly: false - }); + return foundry.utils.mergeObject(super._defaults, { + initialKeys: null, + initialValue: null, + initialKeysOnly: false + }); } - + /* -------------------------------------------- */ - + /** @inheritdoc */ _cleanType(value, options) { - Object.entries(value).forEach(([k, v]) => value[k] = this.model.clean(v, options)); - return value; + Object.entries(value).forEach(([k, v]) => (value[k] = this.model.clean(v, options))); + return value; } - + /* -------------------------------------------- */ - + /** @inheritdoc */ getInitialValue(data) { - let keys = this.initialKeys; - const initial = super.getInitialValue(data); - if ( !keys || !foundry.utils.isEmpty(initial) ) return initial; - if ( !(keys instanceof Array) ) keys = Object.keys(keys); - for ( const key of keys ) initial[key] = this._getInitialValueForKey(key); - return initial; + let keys = this.initialKeys; + const initial = super.getInitialValue(data); + if (!keys || !foundry.utils.isEmpty(initial)) return initial; + if (!(keys instanceof Array)) keys = Object.keys(keys); + for (const key of keys) initial[key] = this._getInitialValueForKey(key); + return initial; } - + /* -------------------------------------------- */ - + /** * Get the initial value for the provided key. * @param {string} key Key within the object being built. @@ -52,21 +52,21 @@ export class MappingField extends foundry.data.fields.ObjectField { * @returns {*} Initial value based on provided field type. */ _getInitialValueForKey(key, object) { - const initial = this.model.getInitialValue(); - return this.initialValue?.(key, initial, object) ?? initial; + const initial = this.model.getInitialValue(); + return this.initialValue?.(key, initial, object) ?? initial; } - + /* -------------------------------------------- */ - + /** @override */ - _validateType(value, options={}) { - if ( foundry.utils.getType(value) !== "Object" ) throw new Error("must be an Object"); - const errors = this._validateValues(value, options); - if ( !foundry.utils.isEmpty(errors) ) throw new foundry.data.fields.ModelValidationError(errors); + _validateType(value, options = {}) { + if (foundry.utils.getType(value) !== 'Object') throw new Error('must be an Object'); + const errors = this._validateValues(value, options); + if (!foundry.utils.isEmpty(errors)) throw new foundry.data.fields.ModelValidationError(errors); } - + /* -------------------------------------------- */ - + /** * Validate each value of the object. * @param {object} value The object to validate. @@ -74,36 +74,36 @@ export class MappingField extends foundry.data.fields.ObjectField { * @returns {Object} An object of value-specific errors by key. */ _validateValues(value, options) { - const errors = {}; - for ( const [k, v] of Object.entries(value) ) { - const error = this.model.validate(v, options); - if ( error ) errors[k] = error; - } - return errors; + const errors = {}; + for (const [k, v] of Object.entries(value)) { + const error = this.model.validate(v, options); + if (error) errors[k] = error; + } + return errors; } - + /* -------------------------------------------- */ - + /** @override */ - initialize(value, model, options={}) { - if ( !value ) return value; - const obj = {}; - const initialKeys = (this.initialKeys instanceof Array) ? this.initialKeys : Object.keys(this.initialKeys ?? {}); - const keys = this.initialKeysOnly ? initialKeys : Object.keys(value); - for ( const key of keys ) { - const data = value[key] ?? this._getInitialValueForKey(key, value); - obj[key] = this.model.initialize(data, model, options); - } - return obj; + initialize(value, model, options = {}) { + if (!value) return value; + const obj = {}; + const initialKeys = this.initialKeys instanceof Array ? this.initialKeys : Object.keys(this.initialKeys ?? {}); + const keys = this.initialKeysOnly ? initialKeys : Object.keys(value); + for (const key of keys) { + const data = value[key] ?? this._getInitialValueForKey(key, value); + obj[key] = this.model.initialize(data, model, options); + } + return obj; } - + /* -------------------------------------------- */ - + /** @inheritdoc */ _getField(path) { - if ( path.length === 0 ) return this; - else if ( path.length === 1 ) return this.model; - path.shift(); - return this.model._getField(path); + if (path.length === 0) return this; + else if (path.length === 1) return this.model; + path.shift(); + return this.model._getField(path); } - } \ No newline at end of file +} diff --git a/module/data/interface/effects.mjs b/module/data/interface/effects.mjs index 3ed91430..adc03f54 100644 --- a/module/data/interface/effects.mjs +++ b/module/data/interface/effects.mjs @@ -1,75 +1,86 @@ -import DaggerheartAction from "../action.mjs"; -import { MappingField } from "../fields.mjs"; +import DaggerheartAction from '../action.mjs'; +import { MappingField } from '../fields.mjs'; export default class DhpEffects extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - effects: new MappingField(new fields.SchemaField({ - type: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.effectTypes) }), - valueType: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.valueTypes) }), - parseType: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.parseTypes) }), - initiallySelected: new fields.BooleanField({ initial: true }), - options: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - value: new fields.StringField({}), - }), { nullable: true, initial: null }), - dataField: new fields.StringField({}), - appliesOn: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.applyLocations) }, { nullable: true, initial: null }), - applyLocationChoices: new MappingField(new fields.StringField({}), { nullable: true, initial: null }), - valueData: new fields.SchemaField({ - value: new fields.StringField({}), - fromValue: new fields.StringField({ initial: null, nullable: true }), - type: new fields.StringField({ initial: null, nullable: true }), - hopeIncrease: new fields.StringField({ initial: null, nullable: true }) - }), - })), - actions: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartAction)), - // actions: new fields.SchemaField({ - // damage: new fields.ArrayField(new fields.SchemaField({ - // type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.extendedDamageTypes), initial: SYSTEM.GENERAL.extendedDamageTypes.physical.id }), - // value: new fields.StringField({}), - // })), - // uses: new fields.SchemaField({ - // nr: new fields.StringField({}), - // refreshType: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.refreshTypes), initial: SYSTEM.GENERAL.refreshTypes.session.id }), - // refreshed: new fields.BooleanField({ initial: true }), - // }), - // }), - } + const fields = foundry.data.fields; + return { + effects: new MappingField( + new fields.SchemaField({ + type: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.effectTypes) }), + valueType: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.valueTypes) }), + parseType: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.parseTypes) }), + initiallySelected: new fields.BooleanField({ initial: true }), + options: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + value: new fields.StringField({}) + }), + { nullable: true, initial: null } + ), + dataField: new fields.StringField({}), + appliesOn: new fields.StringField( + { choices: Object.keys(SYSTEM.EFFECTS.applyLocations) }, + { nullable: true, initial: null } + ), + applyLocationChoices: new MappingField(new fields.StringField({}), { + nullable: true, + initial: null + }), + valueData: new fields.SchemaField({ + value: new fields.StringField({}), + fromValue: new fields.StringField({ initial: null, nullable: true }), + type: new fields.StringField({ initial: null, nullable: true }), + hopeIncrease: new fields.StringField({ initial: null, nullable: true }) + }) + }) + ), + actions: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartAction)) + // actions: new fields.SchemaField({ + // damage: new fields.ArrayField(new fields.SchemaField({ + // type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.extendedDamageTypes), initial: SYSTEM.GENERAL.extendedDamageTypes.physical.id }), + // value: new fields.StringField({}), + // })), + // uses: new fields.SchemaField({ + // nr: new fields.StringField({}), + // refreshType: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.refreshTypes), initial: SYSTEM.GENERAL.refreshTypes.session.id }), + // refreshed: new fields.BooleanField({ initial: true }), + // }), + // }), + }; } - get effectData(){ - const effectValues = Object.values(this.effects); - const effectCategories = Object.keys(SYSTEM.EFFECTS.effectTypes).reduce((acc, effectType) => { - acc[effectType] = effectValues.reduce((acc, effect) => { - if(effect.type === effectType){ - acc.push({ ...effect, valueData: this.#parseValues(effect.parseType, effect.valueData) }); - } - - return acc; - }, []); + get effectData() { + const effectValues = Object.values(this.effects); + const effectCategories = Object.keys(SYSTEM.EFFECTS.effectTypes).reduce((acc, effectType) => { + acc[effectType] = effectValues.reduce((acc, effect) => { + if (effect.type === effectType) { + acc.push({ ...effect, valueData: this.#parseValues(effect.parseType, effect.valueData) }); + } - return acc; - }, {}); + return acc; + }, []); - return effectCategories; + return acc; + }, {}); + + return effectCategories; } - #parseValues(parseType, values){ - return Object.keys(values).reduce((acc, prop) => { - acc[prop] = this.#parseValue(parseType, values[prop]); + #parseValues(parseType, values) { + return Object.keys(values).reduce((acc, prop) => { + acc[prop] = this.#parseValue(parseType, values[prop]); - return acc; - }, {}); + return acc; + }, {}); } #parseValue(parseType, value) { - switch(parseType){ - case SYSTEM.EFFECTS.parseTypes.number.id: - return Number.parseInt(value); - default: - return value; - } + switch (parseType) { + case SYSTEM.EFFECTS.parseTypes.number.id: + return Number.parseInt(value); + default: + return value; + } } -} \ No newline at end of file +} diff --git a/module/data/interface/featuresSchema.mjs b/module/data/interface/featuresSchema.mjs index b35d6e46..89a0c1f4 100644 --- a/module/data/interface/featuresSchema.mjs +++ b/module/data/interface/featuresSchema.mjs @@ -1,10 +1,13 @@ const fields = foundry.data.fields; -const featuresSchema = () => new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - subclassLevel: new fields.StringField({}), -})) +const featuresSchema = () => + new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + img: new fields.StringField({}), + uuid: new fields.StringField({}), + subclassLevel: new fields.StringField({}) + }) + ); -export default featuresSchema; \ No newline at end of file +export default featuresSchema; diff --git a/module/data/miscellaneous.mjs b/module/data/miscellaneous.mjs index 45429992..3e43e471 100644 --- a/module/data/miscellaneous.mjs +++ b/module/data/miscellaneous.mjs @@ -1,9 +1,9 @@ export default class DhpMiscellaneous extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - description: new fields.HTMLField({}), - quantity: new fields.NumberField({ initial: 1, integer: true }) - } + const fields = foundry.data.fields; + return { + description: new fields.HTMLField({}), + quantity: new fields.NumberField({ initial: 1, integer: true }) + }; } -} \ No newline at end of file +} diff --git a/module/data/pc.mjs b/module/data/pc.mjs index df6852c2..c9c11848 100644 --- a/module/data/pc.mjs +++ b/module/data/pc.mjs @@ -1,36 +1,39 @@ -import { getPathValue, getTier } from "../helpers/utils.mjs"; -import { MappingField } from "./fields.mjs"; +import { getPathValue, getTier } from '../helpers/utils.mjs'; +import { MappingField } from './fields.mjs'; const fields = foundry.data.fields; -const attributeField = () => new fields.SchemaField({ - data: new fields.SchemaField({ - value: new fields.NumberField({ initial: 0, integer: true }), - base: new fields.NumberField({ initial: 0, integer: true }), - bonus: new fields.NumberField({ initial: 0, integer: true }), - actualValue: new fields.NumberField({ initial: 0, integer: true }), - overrideValue: new fields.NumberField({ initial: 0, integer: true }), - }), - levelMarks: new fields.ArrayField(new fields.NumberField({ nullable: true, initial: null, integer: true })), - levelMark: new fields.NumberField({ nullable: true, initial: null, integer: true }), -}); +const attributeField = () => + new fields.SchemaField({ + data: new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true }), + base: new fields.NumberField({ initial: 0, integer: true }), + bonus: new fields.NumberField({ initial: 0, integer: true }), + actualValue: new fields.NumberField({ initial: 0, integer: true }), + overrideValue: new fields.NumberField({ initial: 0, integer: true }) + }), + levelMarks: new fields.ArrayField(new fields.NumberField({ nullable: true, initial: null, integer: true })), + levelMark: new fields.NumberField({ nullable: true, initial: null, integer: true }) + }); const levelUpTier = () => ({ - attributes: new MappingField(new fields.BooleanField()), - hitPointSlots: new MappingField(new fields.BooleanField()), - stressSlots: new MappingField(new fields.BooleanField()), - experiences: new MappingField(new fields.ArrayField(new fields.StringField({}))), - proficiency: new MappingField(new fields.BooleanField()), - armorOrEvasionSlot: new MappingField(new fields.StringField({})), - majorDamageThreshold2: new MappingField(new fields.BooleanField()), - severeDamageThreshold2: new MappingField(new fields.BooleanField()), - severeDamageThreshold3: new MappingField(new fields.BooleanField()), - severeDamageThreshold4: new MappingField(new fields.BooleanField()), - subclass: new MappingField(new fields.SchemaField({ - multiclass: new fields.BooleanField(), - feature: new fields.StringField({}), - })), - multiclass: new MappingField(new fields.BooleanField()), + attributes: new MappingField(new fields.BooleanField()), + hitPointSlots: new MappingField(new fields.BooleanField()), + stressSlots: new MappingField(new fields.BooleanField()), + experiences: new MappingField(new fields.ArrayField(new fields.StringField({}))), + proficiency: new MappingField(new fields.BooleanField()), + armorOrEvasionSlot: new MappingField(new fields.StringField({})), + majorDamageThreshold2: new MappingField(new fields.BooleanField()), + severeDamageThreshold2: new MappingField(new fields.BooleanField()), + severeDamageThreshold3: new MappingField(new fields.BooleanField()), + severeDamageThreshold4: new MappingField(new fields.BooleanField()), + subclass: new MappingField( + new fields.SchemaField({ + multiclass: new fields.BooleanField(), + feature: new fields.StringField({}) + }) + ), + multiclass: new MappingField(new fields.BooleanField()) }); // const weapon = () => new fields.SchemaField({ @@ -48,450 +51,512 @@ const levelUpTier = () => ({ export default class DhpPC extends foundry.abstract.TypeDataModel { static defineSchema() { - return { - resources: new fields.SchemaField({ - health: new fields.SchemaField({ - value: new fields.NumberField({ initial: 0, integer: true }), - min: new fields.NumberField({ initial: 0, integer: true }), - max: new fields.NumberField({ initial: 6, integer: true }), - }), - stress: new fields.SchemaField({ - value: new fields.NumberField({ initial: 0, integer: true }), - min: new fields.NumberField({ initial: 0, integer: true }), - max: new fields.NumberField({ initial: 6, integer: true }), - }), - hope: new fields.SchemaField({ - value: new fields.NumberField({ initial: -1, integer: true }), // FIXME. Logic is gte and needs -1 in PC/Hope. Change to 0 - min: new fields.NumberField({ initial: 0, integer: true }), - }), - }), - bonuses: new fields.SchemaField({ - damage: new fields.ArrayField(new fields.SchemaField({ - value: new fields.NumberField({ integer: true, initial: 0 }), - type: new fields.StringField({ nullable: true }), - initiallySelected: new fields.BooleanField(), - hopeIncrease: new fields.StringField({ initial: null, nullable: true }), - description: new fields.StringField({}), - })), - }), - attributes: new fields.SchemaField({ - agility: attributeField(), - strength: attributeField(), - finesse: attributeField(), - instinct: attributeField(), - presence: attributeField(), - knowledge: attributeField(), - }), - proficiency: new fields.SchemaField({ - value: new fields.NumberField({ initial: 1, integer: true}), - min: new fields.NumberField({ initial: 1, integer: true}), - max: new fields.NumberField({ initial: 6, integer: true}), - }), - damageThresholds: new fields.SchemaField({ - minor: new fields.NumberField({ initial: 0, integer: true }), - major: new fields.NumberField({ initial: 0, integer: true }), - severe: new fields.NumberField({ initial: 0, integer: true }), - }), - evasion: new fields.NumberField({ initial: 0, integer: true }), - // armor: new fields.SchemaField({ - // value: new fields.NumberField({ initial: 0, integer: true }), - // customValue: new fields.NumberField({ initial: null, nullable: true }), - // }), - experiences: new fields.ArrayField(new fields.SchemaField({ - id: new fields.StringField({ required: true }), - level: new fields.NumberField({ required: true, integer: true }), - description: new fields.StringField({}), - value: new fields.NumberField({ integer: true, nullable: true, initial: null }), - }), { - initial: [ - { id: foundry.utils.randomID(), level: 1, description: '', value: 2 }, - { id: foundry.utils.randomID(), level: 1, description: '', value: 2 }, - ] - }), - gold: new fields.SchemaField({ - coins: new fields.NumberField({ initial: 0, integer: true }), - handfulls: new fields.NumberField({ initial: 0, integer: true }), - bags: new fields.NumberField({ initial: 0, integer: true }), - chests: new fields.NumberField({ initial: 0, integer: true }), - }), - pronouns: new fields.StringField({}), - domainData: new fields.SchemaField({ - maxLoadout: new fields.NumberField({ initial: 2, integer: true }), - maxCards: new fields.NumberField({ initial: 2, integer: true }), - }), - levelData: new fields.SchemaField({ - currentLevel: new fields.NumberField({ initial: 1, integer: true }), - changedLevel: new fields.NumberField({ initial: 1, integer: true }), - levelups: new MappingField(new fields.SchemaField({ - level: new fields.NumberField({ required: true, integer: true }), - tier1: new fields.SchemaField({ - ...levelUpTier() + return { + resources: new fields.SchemaField({ + health: new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true }), + min: new fields.NumberField({ initial: 0, integer: true }), + max: new fields.NumberField({ initial: 6, integer: true }) + }), + stress: new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true }), + min: new fields.NumberField({ initial: 0, integer: true }), + max: new fields.NumberField({ initial: 6, integer: true }) + }), + hope: new fields.SchemaField({ + value: new fields.NumberField({ initial: -1, integer: true }), // FIXME. Logic is gte and needs -1 in PC/Hope. Change to 0 + min: new fields.NumberField({ initial: 0, integer: true }) + }) }), - tier2: new fields.SchemaField({ - ...levelUpTier() - }, { nullable: true, initial: null }), - tier3: new fields.SchemaField({ - ...levelUpTier() - }, { nullable: true, initial: null }), - })), - }), - story: new fields.SchemaField({ - background: new fields.HTMLField(), - appearance: new fields.HTMLField(), - connections: new fields.HTMLField(), - scars: new fields.ArrayField(new fields.SchemaField({ - name: new fields.StringField({}), - description: new fields.HTMLField(), - })), - }), - description: new fields.StringField({}), - //Temporary until new FoundryVersion fix --> See Armor.Mjs DataPreparation - armorMarks: new fields.SchemaField({ - max: new fields.NumberField({ initial: 6, integer: true }), - value: new fields.NumberField({ initial: 0, integer: true }), - }), - } + bonuses: new fields.SchemaField({ + damage: new fields.ArrayField( + new fields.SchemaField({ + value: new fields.NumberField({ integer: true, initial: 0 }), + type: new fields.StringField({ nullable: true }), + initiallySelected: new fields.BooleanField(), + hopeIncrease: new fields.StringField({ initial: null, nullable: true }), + description: new fields.StringField({}) + }) + ) + }), + attributes: new fields.SchemaField({ + agility: attributeField(), + strength: attributeField(), + finesse: attributeField(), + instinct: attributeField(), + presence: attributeField(), + knowledge: attributeField() + }), + proficiency: new fields.SchemaField({ + value: new fields.NumberField({ initial: 1, integer: true }), + min: new fields.NumberField({ initial: 1, integer: true }), + max: new fields.NumberField({ initial: 6, integer: true }) + }), + damageThresholds: new fields.SchemaField({ + minor: new fields.NumberField({ initial: 0, integer: true }), + major: new fields.NumberField({ initial: 0, integer: true }), + severe: new fields.NumberField({ initial: 0, integer: true }) + }), + evasion: new fields.NumberField({ initial: 0, integer: true }), + // armor: new fields.SchemaField({ + // value: new fields.NumberField({ initial: 0, integer: true }), + // customValue: new fields.NumberField({ initial: null, nullable: true }), + // }), + experiences: new fields.ArrayField( + new fields.SchemaField({ + id: new fields.StringField({ required: true }), + level: new fields.NumberField({ required: true, integer: true }), + description: new fields.StringField({}), + value: new fields.NumberField({ integer: true, nullable: true, initial: null }) + }), + { + initial: [ + { id: foundry.utils.randomID(), level: 1, description: '', value: 2 }, + { id: foundry.utils.randomID(), level: 1, description: '', value: 2 } + ] + } + ), + gold: new fields.SchemaField({ + coins: new fields.NumberField({ initial: 0, integer: true }), + handfulls: new fields.NumberField({ initial: 0, integer: true }), + bags: new fields.NumberField({ initial: 0, integer: true }), + chests: new fields.NumberField({ initial: 0, integer: true }) + }), + pronouns: new fields.StringField({}), + domainData: new fields.SchemaField({ + maxLoadout: new fields.NumberField({ initial: 2, integer: true }), + maxCards: new fields.NumberField({ initial: 2, integer: true }) + }), + levelData: new fields.SchemaField({ + currentLevel: new fields.NumberField({ initial: 1, integer: true }), + changedLevel: new fields.NumberField({ initial: 1, integer: true }), + levelups: new MappingField( + new fields.SchemaField({ + level: new fields.NumberField({ required: true, integer: true }), + tier1: new fields.SchemaField({ + ...levelUpTier() + }), + tier2: new fields.SchemaField( + { + ...levelUpTier() + }, + { nullable: true, initial: null } + ), + tier3: new fields.SchemaField( + { + ...levelUpTier() + }, + { nullable: true, initial: null } + ) + }) + ) + }), + story: new fields.SchemaField({ + background: new fields.HTMLField(), + appearance: new fields.HTMLField(), + connections: new fields.HTMLField(), + scars: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.StringField({}), + description: new fields.HTMLField() + }) + ) + }), + description: new fields.StringField({}), + //Temporary until new FoundryVersion fix --> See Armor.Mjs DataPreparation + armorMarks: new fields.SchemaField({ + max: new fields.NumberField({ initial: 6, integer: true }), + value: new fields.NumberField({ initial: 0, integer: true }) + }) + }; } - get canLevelUp(){ - // return Object.values(this.levels.data).some(x => !x.completed); - return this.levelData.currentLevel !== this.levelData.changedLevel; + get canLevelUp() { + // return Object.values(this.levels.data).some(x => !x.completed); + return this.levelData.currentLevel !== this.levelData.changedLevel; } - get tier(){ - return this.#getTier(this.levelData.currentLevel); + get tier() { + return this.#getTier(this.levelData.currentLevel); } - get ancestry(){ - return this.parent.items.find(x => x.type === 'ancestry') ?? null; + get ancestry() { + return this.parent.items.find(x => x.type === 'ancestry') ?? null; } - get class(){ - return this.parent.items.find(x => x.type === 'class' && !x.system.multiclass) ?? null; + get class() { + return this.parent.items.find(x => x.type === 'class' && !x.system.multiclass) ?? null; } - get multiclass(){ - return this.parent.items.find(x => x.type === 'class' && x.system.multiclass) ?? null; + get multiclass() { + return this.parent.items.find(x => x.type === 'class' && x.system.multiclass) ?? null; } - get multiclassSubclass(){ - return this.parent.items.find(x => x.type === 'subclass' && x.system.multiclass) ?? null; + get multiclassSubclass() { + return this.parent.items.find(x => x.type === 'subclass' && x.system.multiclass) ?? null; } - get subclass(){ - return this.parent.items.find(x => x.type === 'subclass' && !x.system.multiclass) ?? null; + get subclass() { + return this.parent.items.find(x => x.type === 'subclass' && !x.system.multiclass) ?? null; } - get subclassFeatures(){ - const subclass = this.subclass; - const multiclass = this.multiclassSubclass; - const subclassItems = this.parent.items.filter(x => x.type === 'feature' && x.system.type === 'subclass'); - return { - subclass: !subclass ? {} : { - foundation: subclassItems.filter(x => subclass.system.foundationFeature.abilities.some(ability => ability.uuid === x.uuid)), - specialization: subclassItems.filter(x => subclass.system.specializationFeature.abilities.some(ability => ability.uuid === x.uuid)), - mastery: subclassItems.filter(x => subclass.system.masteryFeature.abilities.some(ability => ability.uuid === x.uuid)), - }, - multiclassSubclass: !multiclass ? {} : { - foundation: subclassItems.filter(x => multiclass.system.foundationFeature.abilities.some(ability => ability.uuid === x.uuid)), - specialization: subclassItems.filter(x => multiclass.system.specializationFeature.abilities.some(ability => ability.uuid === x.uuid)), - mastery: subclassItems.filter(x => multiclass.system.masteryFeature.abilities.some(ability => ability.uuid === x.uuid)), - } - } + get subclassFeatures() { + const subclass = this.subclass; + const multiclass = this.multiclassSubclass; + const subclassItems = this.parent.items.filter(x => x.type === 'feature' && x.system.type === 'subclass'); + return { + subclass: !subclass + ? {} + : { + foundation: subclassItems.filter(x => + subclass.system.foundationFeature.abilities.some(ability => ability.uuid === x.uuid) + ), + specialization: subclassItems.filter(x => + subclass.system.specializationFeature.abilities.some(ability => ability.uuid === x.uuid) + ), + mastery: subclassItems.filter(x => + subclass.system.masteryFeature.abilities.some(ability => ability.uuid === x.uuid) + ) + }, + multiclassSubclass: !multiclass + ? {} + : { + foundation: subclassItems.filter(x => + multiclass.system.foundationFeature.abilities.some(ability => ability.uuid === x.uuid) + ), + specialization: subclassItems.filter(x => + multiclass.system.specializationFeature.abilities.some(ability => ability.uuid === x.uuid) + ), + mastery: subclassItems.filter(x => + multiclass.system.masteryFeature.abilities.some(ability => ability.uuid === x.uuid) + ) + } + }; } - get community(){ - return this.parent.items.find(x => x.type === 'community') ?? null; + get community() { + return this.parent.items.find(x => x.type === 'community') ?? null; } - get classFeatures(){ - return this.parent.items.filter(x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.class.id && !x.system.multiclass); + get classFeatures() { + return this.parent.items.filter( + x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.class.id && !x.system.multiclass + ); } - get multiclassFeatures(){ - return this.parent.items.filter(x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.class.id && x.system.multiclass); + get multiclassFeatures() { + return this.parent.items.filter( + x => x.type === 'feature' && x.system.type === SYSTEM.ITEM.featureTypes.class.id && x.system.multiclass + ); } - get domains(){ - const classDomains = this.class ? this.class.system.domains : []; - const multiclassDomains = this.multiclass ? this.multiclass.system.domains : []; - return [...classDomains, ...multiclassDomains] + get domains() { + const classDomains = this.class ? this.class.system.domains : []; + const multiclassDomains = this.multiclass ? this.multiclass.system.domains : []; + return [...classDomains, ...multiclassDomains]; } - get domainCards(){ - const domainCards = this.parent.items.filter(x => x.type === 'domainCard'); - const loadout = domainCards.filter(x => !x.system.inVault); - const vault = domainCards.filter(x => x.system.inVault); + get domainCards() { + const domainCards = this.parent.items.filter(x => x.type === 'domainCard'); + const loadout = domainCards.filter(x => !x.system.inVault); + const vault = domainCards.filter(x => x.system.inVault); - return { - loadout: loadout, - vault: vault, - total: [...loadout, ...vault] - }; + return { + loadout: loadout, + vault: vault, + total: [...loadout, ...vault] + }; } - get armor(){ - return this.parent.items.find(x => x.type === 'armor'); + get armor() { + return this.parent.items.find(x => x.type === 'armor'); } - get activeWeapons(){ - const primaryWeapon = this.parent.items.find(x => x.type === 'weapon' && x.system.active && !x.system.secondary); - const secondaryWeapon = this.parent.items.find(x => x.type === 'weapon' && x.system.active && x.system.secondary); - return { - primary: this.#weaponData(primaryWeapon), - secondary: this.#weaponData(secondaryWeapon), - burden: this.getBurden(primaryWeapon, secondaryWeapon) - }; + get activeWeapons() { + const primaryWeapon = this.parent.items.find( + x => x.type === 'weapon' && x.system.active && !x.system.secondary + ); + const secondaryWeapon = this.parent.items.find( + x => x.type === 'weapon' && x.system.active && x.system.secondary + ); + return { + primary: this.#weaponData(primaryWeapon), + secondary: this.#weaponData(secondaryWeapon), + burden: this.getBurden(primaryWeapon, secondaryWeapon) + }; } - get inventoryWeapons(){ - const inventoryWeaponFirst = this.parent.items.find(x => x.type === 'weapon' && x.system.inventoryWeapon === 1); - const inventoryWeaponSecond = this.parent.items.find(x => x.type === 'weapon' && x.system.inventoryWeapon === 2); - return { - first: this.#weaponData(inventoryWeaponFirst), - second: this.#weaponData(inventoryWeaponSecond), - }; + get inventoryWeapons() { + const inventoryWeaponFirst = this.parent.items.find(x => x.type === 'weapon' && x.system.inventoryWeapon === 1); + const inventoryWeaponSecond = this.parent.items.find( + x => x.type === 'weapon' && x.system.inventoryWeapon === 2 + ); + return { + first: this.#weaponData(inventoryWeaponFirst), + second: this.#weaponData(inventoryWeaponSecond) + }; } - get totalAttributeMarks(){ - return Object.keys(this.levelData.levelups).reduce((nr, level) => { - const nrAttributeMarks = Object.keys(this.levelData.levelups[level]).reduce((nr, tier) => { - nr += Object.keys(this.levelData.levelups[level][tier]?.attributes ?? {}).length * 2; + get totalAttributeMarks() { + return Object.keys(this.levelData.levelups).reduce((nr, level) => { + const nrAttributeMarks = Object.keys(this.levelData.levelups[level]).reduce((nr, tier) => { + nr += Object.keys(this.levelData.levelups[level][tier]?.attributes ?? {}).length * 2; - return nr; - }, 0); + return nr; + }, 0); - nr.push(...Array(nrAttributeMarks).fill(Number.parseInt(level))); + nr.push(...Array(nrAttributeMarks).fill(Number.parseInt(level))); - return nr; - }, []); + return nr; + }, []); } - get availableAttributeMarks(){ - const attributeMarks = Object.keys(this.attributes).flatMap(y => this.attributes[y].levelMarks); - return this.totalAttributeMarks.reduce((acc, attribute) => { - if(!attributeMarks.findSplice(x => x === attribute)){ - acc.push(attribute); - } - - return acc; - }, []); - } - - get effects(){ - return this.parent.items.reduce((acc, item) => { - const effects = item.system.effectData; - if(effects && !item.system.disabled){ - for(var key in effects){ - const effect = effects[key]; - for(var effectEntry of effect){ - if(!acc[key]) acc[key] = []; - acc[key].push({ name: item.name, value: effectEntry }); + get availableAttributeMarks() { + const attributeMarks = Object.keys(this.attributes).flatMap(y => this.attributes[y].levelMarks); + return this.totalAttributeMarks.reduce((acc, attribute) => { + if (!attributeMarks.findSplice(x => x === attribute)) { + acc.push(attribute); } - } - } - return acc; - }, {}); + return acc; + }, []); } - get refreshableFeatures(){ - return this.parent.items.reduce((acc, x) => { - if(x.type === 'feature' && x.system.refreshData.type){ - acc[x.system.refreshData.type].push(x); - } + get effects() { + return this.parent.items.reduce((acc, item) => { + const effects = item.system.effectData; + if (effects && !item.system.disabled) { + for (var key in effects) { + const effect = effects[key]; + for (var effectEntry of effect) { + if (!acc[key]) acc[key] = []; + acc[key].push({ name: item.name, value: effectEntry }); + } + } + } - return acc; - }, { shortRest: [], longRest: [] }); + return acc; + }, {}); } - #weaponData(weapon){ - return weapon ? { - name: weapon.name, - trait: CONFIG.daggerheart.ACTOR.abilities[weapon.system.trait].name, //Should not be done in data? - range: CONFIG.daggerheart.GENERAL.range[weapon.system.range], - damage: { - value: weapon.system.damage.value, - type: CONFIG.daggerheart.GENERAL.damageTypes[weapon.system.damage.type], - }, - feature: CONFIG.daggerheart.ITEM.weaponFeatures[weapon.system.feature], - img: weapon.img, - uuid: weapon.uuid - } : null + get refreshableFeatures() { + return this.parent.items.reduce( + (acc, x) => { + if (x.type === 'feature' && x.system.refreshData.type) { + acc[x.system.refreshData.type].push(x); + } + + return acc; + }, + { shortRest: [], longRest: [] } + ); } - prepareDerivedData(){ - this.resources.hope.max = 6 - this.story.scars.length; - if(this.resources.hope.value >= this.resources.hope.max){ - this.resources.hope.value = Math.max(this.resources.hope.max-1, 0); - } - - for(var attributeKey in this.attributes){ - const attribute = this.attributes[attributeKey]; - - attribute.levelMark = attribute.levelMarks.find(x => this.isSameTier(x)) ?? null; - - const actualValue = attribute.data.base + attribute.levelMarks.length + attribute.data.bonus; - attribute.data.actualValue = actualValue; - attribute.data.value = attribute.data.overrideValue ? attribute.data.overrideValue : attribute.data.actualValue; - } - - this.evasion = this.class?.system?.evasion ?? 0; - // this.armor.value = this.activeArmor?.baseScore ?? 0; - this.damageThresholds = this.class?.system?.damageThresholds ?? { minor: 0, major: 0, severe: 0 }; - - this.applyLevels(); - this.applyEffects(); - } - - applyLevels(){ - let healthBonus = 0, stressBonus = 0, proficiencyBonus = 0, evasionBonus = 0, armorBonus = 0, minorThresholdBonus = 0, majorThresholdBonus = 0, severeThresholdBonus = 0; - let experienceBonuses = {}; - let advancementFirst = null, advancementSecond = null; - for(var level in this.levelData.levelups){ - var levelData = this.levelData.levelups[level]; - for(var tier in levelData){ - var tierData = levelData[tier]; - if(tierData){ - healthBonus += Object.keys(tierData.hitPointSlots).length; - stressBonus += Object.keys(tierData.stressSlots).length; - proficiencyBonus += Object.keys(tierData.proficiency).length; - advancementFirst = Object.keys(tierData.subclass).length > 0 && (level >= 5 && level <= 7) ? { ...tierData.subclass[0], tier: getTier(Number.parseInt(level), true) } : advancementFirst; - advancementSecond = Object.keys(tierData.subclass).length > 0 && (level >= 8 && level <= 10) ? { ...tierData.subclass[0], tier: getTier(Number.parseInt(level), true) } : advancementSecond; - - for(var index in Object.keys(tierData.experiences)){ - for(var experienceKey in tierData.experiences[index]){ - var experience = tierData.experiences[index][experienceKey]; - experienceBonuses[experience] = experienceBonuses[experience] ? experienceBonuses[experience]+1 : 1; + #weaponData(weapon) { + return weapon + ? { + name: weapon.name, + trait: CONFIG.daggerheart.ACTOR.abilities[weapon.system.trait].name, //Should not be done in data? + range: CONFIG.daggerheart.GENERAL.range[weapon.system.range], + damage: { + value: weapon.system.damage.value, + type: CONFIG.daggerheart.GENERAL.damageTypes[weapon.system.damage.type] + }, + feature: CONFIG.daggerheart.ITEM.weaponFeatures[weapon.system.feature], + img: weapon.img, + uuid: weapon.uuid } + : null; + } + + prepareDerivedData() { + this.resources.hope.max = 6 - this.story.scars.length; + if (this.resources.hope.value >= this.resources.hope.max) { + this.resources.hope.value = Math.max(this.resources.hope.max - 1, 0); + } + + for (var attributeKey in this.attributes) { + const attribute = this.attributes[attributeKey]; + + attribute.levelMark = attribute.levelMarks.find(x => this.isSameTier(x)) ?? null; + + const actualValue = attribute.data.base + attribute.levelMarks.length + attribute.data.bonus; + attribute.data.actualValue = actualValue; + attribute.data.value = attribute.data.overrideValue + ? attribute.data.overrideValue + : attribute.data.actualValue; + } + + this.evasion = this.class?.system?.evasion ?? 0; + // this.armor.value = this.activeArmor?.baseScore ?? 0; + this.damageThresholds = this.class?.system?.damageThresholds ?? { minor: 0, major: 0, severe: 0 }; + + this.applyLevels(); + this.applyEffects(); + } + + applyLevels() { + let healthBonus = 0, + stressBonus = 0, + proficiencyBonus = 0, + evasionBonus = 0, + armorBonus = 0, + minorThresholdBonus = 0, + majorThresholdBonus = 0, + severeThresholdBonus = 0; + let experienceBonuses = {}; + let advancementFirst = null, + advancementSecond = null; + for (var level in this.levelData.levelups) { + var levelData = this.levelData.levelups[level]; + for (var tier in levelData) { + var tierData = levelData[tier]; + if (tierData) { + healthBonus += Object.keys(tierData.hitPointSlots).length; + stressBonus += Object.keys(tierData.stressSlots).length; + proficiencyBonus += Object.keys(tierData.proficiency).length; + advancementFirst = + Object.keys(tierData.subclass).length > 0 && level >= 5 && level <= 7 + ? { ...tierData.subclass[0], tier: getTier(Number.parseInt(level), true) } + : advancementFirst; + advancementSecond = + Object.keys(tierData.subclass).length > 0 && level >= 8 && level <= 10 + ? { ...tierData.subclass[0], tier: getTier(Number.parseInt(level), true) } + : advancementSecond; + + for (var index in Object.keys(tierData.experiences)) { + for (var experienceKey in tierData.experiences[index]) { + var experience = tierData.experiences[index][experienceKey]; + experienceBonuses[experience] = experienceBonuses[experience] + ? experienceBonuses[experience] + 1 + : 1; + } + } + + evasionBonus += Object.keys(tierData.armorOrEvasionSlot).filter( + x => tierData.armorOrEvasionSlot[x] === 'evasion' + ).length; + armorBonus += Object.keys(tierData.armorOrEvasionSlot).filter( + x => tierData.armorOrEvasionSlot[x] === 'armor' + ).length; + + majorThresholdBonus += Object.keys(tierData.majorDamageThreshold2).length * 2; + severeThresholdBonus += Object.keys(tierData.severeDamageThreshold2).length * 2; + severeThresholdBonus += Object.keys(tierData.severeDamageThreshold3).length * 3; + severeThresholdBonus += Object.keys(tierData.severeDamageThreshold4).length * 4; + } + } + } + + this.resources.health.max += healthBonus; + this.resources.stress.max += stressBonus; + this.proficiency.value += proficiencyBonus; + this.evasion += evasionBonus; + this.armorMarks = { + max: this.armor ? this.armor.system.marks.max + armorBonus : 0, + value: this.armor ? this.armor.system.marks.value : 0 + }; + this.damageThresholds.minor += minorThresholdBonus; + this.damageThresholds.major += majorThresholdBonus; + this.damageThresholds.severe += severeThresholdBonus; + + this.experiences = this.experiences.map(x => ({ ...x, value: x.value + (experienceBonuses[x.id] ?? 0) })); + + const subclassFeatures = this.subclassFeatures; + if (advancementFirst) { + if (advancementFirst.multiclass) { + this.multiclassSubclass.system[`${advancementFirst.feature}Feature`].unlocked = true; + this.multiclassSubclass.system[`${advancementFirst.feature}Feature`].tier = advancementFirst.tier; + subclassFeatures.multiclassSubclass[advancementFirst.feature].forEach(x => (x.system.disabled = false)); + } else { + this.subclass.system[`${advancementFirst.feature}Feature`].unlocked = true; + this.subclass.system[`${advancementFirst.feature}Feature`].tier = advancementFirst.tier; + subclassFeatures.subclass[advancementFirst.feature].forEach(x => (x.system.disabled = false)); + } + } + if (advancementSecond) { + if (advancementSecond.multiclass) { + this.multiclassSubclass.system[`${advancementSecond.feature}Feature`].unlocked = true; + this.multiclassSubclass.system[`${advancementSecond.feature}Feature`].tier = advancementSecond.tier; + subclassFeatures.multiclassSubclass[advancementSecond.feature].forEach( + x => (x.system.disabled = false) + ); + } else { + this.subclass.system[`${advancementSecond.feature}Feature`].unlocked = true; + this.subclass.system[`${advancementSecond.feature}Feature`].tier = advancementSecond.tier; + subclassFeatures.subclass[advancementSecond.feature].forEach(x => (x.system.disabled = false)); + } + } + + //General progression + for (var i = 0; i < this.levelData.currentLevel; i++) { + const tier = getTier(i + 1); + if (tier !== 'tier0') { + this.domainData.maxLoadout = Math.min(this.domainData.maxLoadout + 1, 5); + this.domainData.maxCards += 1; } - evasionBonus += Object.keys(tierData.armorOrEvasionSlot).filter(x => tierData.armorOrEvasionSlot[x] === 'evasion').length; - armorBonus += Object.keys(tierData.armorOrEvasionSlot).filter(x => tierData.armorOrEvasionSlot[x] === 'armor').length; - - majorThresholdBonus += Object.keys(tierData.majorDamageThreshold2).length * 2; - severeThresholdBonus += Object.keys(tierData.severeDamageThreshold2).length * 2; - severeThresholdBonus += Object.keys(tierData.severeDamageThreshold3).length * 3; - severeThresholdBonus += Object.keys(tierData.severeDamageThreshold4).length * 4; - } + switch (tier) { + case 'tier1': + this.damageThresholds.severe += 2; + break; + case 'tier2': + this.damageThresholds.major += 1; + this.damageThresholds.severe += 3; + break; + case 'tier3': + this.damageThresholds.major += 2; + this.damageThresholds.severe += 4; + break; + } } - } + } - this.resources.health.max += healthBonus; - this.resources.stress.max += stressBonus; - this.proficiency.value += proficiencyBonus; - this.evasion += evasionBonus; - this.armorMarks = { - max: this.armor ? this.armor.system.marks.max + armorBonus : 0, - value: this.armor ? this.armor.system.marks.value : 0, - }; - this.damageThresholds.minor += minorThresholdBonus; - this.damageThresholds.major += majorThresholdBonus; - this.damageThresholds.severe += severeThresholdBonus; - - this.experiences = this.experiences.map(x => ({ ...x, value: x.value + (experienceBonuses[x.id] ?? 0) })); - - const subclassFeatures = this.subclassFeatures; - if(advancementFirst){ - if(advancementFirst.multiclass){ - this.multiclassSubclass.system[`${advancementFirst.feature}Feature`].unlocked = true; - this.multiclassSubclass.system[`${advancementFirst.feature}Feature`].tier = advancementFirst.tier; - subclassFeatures.multiclassSubclass[advancementFirst.feature].forEach(x => x.system.disabled = false); - } else { - this.subclass.system[`${advancementFirst.feature}Feature`].unlocked = true; - this.subclass.system[`${advancementFirst.feature}Feature`].tier = advancementFirst.tier; - subclassFeatures.subclass[advancementFirst.feature].forEach(x => x.system.disabled = false); + applyEffects() { + const effects = this.effects; + for (var key in effects) { + const effectType = effects[key]; + for (var effect of effectType) { + switch (key) { + case SYSTEM.EFFECTS.effectTypes.health.id: + this.resources.health.max += effect.value.valueData.value; + break; + case SYSTEM.EFFECTS.effectTypes.stress.id: + this.resources.stress.max += effect.value.valueData.value; + break; + case SYSTEM.EFFECTS.effectTypes.damage.id: + this.bonuses.damage.push({ + value: getPathValue(effect.value.valueData.value, this), + type: 'physical', + description: effect.name, + hopeIncrease: effect.value.valueData.hopeIncrease, + initiallySelected: effect.value.initiallySelected, + appliesOn: effect.value.appliesOn + }); + } + } } - } - if(advancementSecond){ - if(advancementSecond.multiclass){ - this.multiclassSubclass.system[`${advancementSecond.feature}Feature`].unlocked = true; - this.multiclassSubclass.system[`${advancementSecond.feature}Feature`].tier = advancementSecond.tier; - subclassFeatures.multiclassSubclass[advancementSecond.feature].forEach(x => x.system.disabled = false); - } else { - this.subclass.system[`${advancementSecond.feature}Feature`].unlocked = true; - this.subclass.system[`${advancementSecond.feature}Feature`].tier = advancementSecond.tier; - subclassFeatures.subclass[advancementSecond.feature].forEach(x => x.system.disabled = false); - } - } - - - //General progression - for(var i = 0; i < this.levelData.currentLevel; i++){ - const tier = getTier(i+1); - if(tier !== 'tier0'){ - this.domainData.maxLoadout = Math.min(this.domainData.maxLoadout+1, 5); - this.domainData.maxCards += 1; - } - - switch(tier){ - case 'tier1': - this.damageThresholds.severe += 2; - break; - case 'tier2': - this.damageThresholds.major += 1; - this.damageThresholds.severe += 3; - break; - case 'tier3': - this.damageThresholds.major += 2; - this.damageThresholds.severe += 4; - break; - } - } } - applyEffects(){ - const effects = this.effects; - for(var key in effects){ - const effectType = effects[key]; - for(var effect of effectType) { - switch(key) { - case SYSTEM.EFFECTS.effectTypes.health.id: - this.resources.health.max += effect.value.valueData.value; - break; - case SYSTEM.EFFECTS.effectTypes.stress.id: - this.resources.stress.max += effect.value.valueData.value; - break; - case SYSTEM.EFFECTS.effectTypes.damage.id: - this.bonuses.damage.push({ - value: getPathValue(effect.value.valueData.value, this), - type: 'physical', - description: effect.name, - hopeIncrease: effect.value.valueData.hopeIncrease, - initiallySelected: effect.value.initiallySelected, - appliesOn: effect.value.appliesOn, - }); - } - } - } + getBurden(primary, secondary) { + const twoHanded = + primary?.system?.burden === 'twoHanded' || + secondary?.system?.burden === 'twoHanded' || + (primary?.system?.burden === 'oneHanded' && secondary?.system?.burden === 'oneHanded'); + const oneHanded = + !twoHanded && (primary?.system?.burden === 'oneHanded' || secondary?.system?.burden === 'oneHanded'); + + return twoHanded ? 'twoHanded' : oneHanded ? 'oneHanded' : null; } - getBurden(primary, secondary){ - const twoHanded = - primary?.system?.burden === 'twoHanded' || - secondary?.system?.burden === 'twoHanded' || - ( - primary?.system?.burden === 'oneHanded' && - secondary?.system?.burden === 'oneHanded' - ); - const oneHanded = - !twoHanded && - ( - primary?.system?.burden === 'oneHanded' || - secondary?.system?.burden === 'oneHanded' - ); - - return twoHanded ? 'twoHanded' : oneHanded ? 'oneHanded' : null; + isSameTier(level) { + return this.#getTier(this.levelData.currentLevel) === this.#getTier(level); } - isSameTier(level){ - return this.#getTier(this.levelData.currentLevel) === this.#getTier(level); + #getTier(level) { + if (level >= 8) return 3; + else if (level >= 5) return 2; + else if (level >= 2) return 1; + else return 0; } - - #getTier(level){ - if(level >= 8) return 3; - else if(level >= 5) return 2; - else if(level >= 2) return 1; - else return 0; - } -} \ No newline at end of file +} diff --git a/module/data/subclass.mjs b/module/data/subclass.mjs index 59080343..9cf327dc 100644 --- a/module/data/subclass.mjs +++ b/module/data/subclass.mjs @@ -1,34 +1,39 @@ -import { getTier } from "../helpers/utils.mjs"; -import featuresSchema from "./interface/featuresSchema.mjs"; +import { getTier } from '../helpers/utils.mjs'; +import featuresSchema from './interface/featuresSchema.mjs'; import DaggerheartFeature from './feature.mjs'; export default class DhpSubclass extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - description: new fields.HTMLField({}), - spellcastingTrait: new fields.StringField({ choices: SYSTEM.ACTOR.abilities, integer: false, nullable: true, initial: null }), - foundationFeature: new fields.SchemaField({ + const fields = foundry.data.fields; + return { description: new fields.HTMLField({}), - abilities: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartFeature)), - }), - specializationFeature: new fields.SchemaField({ - unlocked: new fields.BooleanField({ initial: false }), - tier: new fields.NumberField({ initial: null, nullable: true, integer: true }), - description: new fields.HTMLField({}), - abilities: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartFeature)), - }), - masteryFeature: new fields.SchemaField({ - unlocked: new fields.BooleanField({ initial: false }), - tier: new fields.NumberField({ initial: null, nullable: true, integer: true }), - description: new fields.HTMLField({}), - abilities: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartFeature)), - }), - multiclass: new fields.NumberField({ initial: null, nullable: true, integer: true }), - } + spellcastingTrait: new fields.StringField({ + choices: SYSTEM.ACTOR.abilities, + integer: false, + nullable: true, + initial: null + }), + foundationFeature: new fields.SchemaField({ + description: new fields.HTMLField({}), + abilities: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartFeature)) + }), + specializationFeature: new fields.SchemaField({ + unlocked: new fields.BooleanField({ initial: false }), + tier: new fields.NumberField({ initial: null, nullable: true, integer: true }), + description: new fields.HTMLField({}), + abilities: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartFeature)) + }), + masteryFeature: new fields.SchemaField({ + unlocked: new fields.BooleanField({ initial: false }), + tier: new fields.NumberField({ initial: null, nullable: true, integer: true }), + description: new fields.HTMLField({}), + abilities: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartFeature)) + }), + multiclass: new fields.NumberField({ initial: null, nullable: true, integer: true }) + }; } - get multiclassTier(){ + get multiclassTier() { return getTier(this.multiclass); } -} \ No newline at end of file +} diff --git a/module/data/weapon.mjs b/module/data/weapon.mjs index 2d8b58eb..3e9127ca 100644 --- a/module/data/weapon.mjs +++ b/module/data/weapon.mjs @@ -1,47 +1,50 @@ export default class DhpWeapon extends foundry.abstract.TypeDataModel { static defineSchema() { - const fields = foundry.data.fields; - return { - active: new fields.BooleanField({ initial: false }), - inventoryWeapon: new fields.NumberField({ initial: null, nullable: true, integer: true }), - secondary: new fields.BooleanField({ initial: false }), - trait: new fields.StringField({ choices: SYSTEM.ACTOR.abilities, integer: false }), - range: new fields.StringField({ choices: SYSTEM.GENERAL.range, integer: false }), - damage: new fields.SchemaField({ - value: new fields.StringField({}), - type: new fields.StringField({ choices: SYSTEM.GENERAL.damageTypes, integer: false }), - }), - burden: new fields.StringField({ choices: SYSTEM.GENERAL.burden, integer: false }), - feature: new fields.StringField({ choices: SYSTEM.ITEM.weaponFeatures, integer: false, blank:true }), - quantity: new fields.NumberField({ initial: 1, integer: true }), - description: new fields.HTMLField({}), - } + const fields = foundry.data.fields; + return { + active: new fields.BooleanField({ initial: false }), + inventoryWeapon: new fields.NumberField({ initial: null, nullable: true, integer: true }), + secondary: new fields.BooleanField({ initial: false }), + trait: new fields.StringField({ choices: SYSTEM.ACTOR.abilities, integer: false }), + range: new fields.StringField({ choices: SYSTEM.GENERAL.range, integer: false }), + damage: new fields.SchemaField({ + value: new fields.StringField({}), + type: new fields.StringField({ choices: SYSTEM.GENERAL.damageTypes, integer: false }) + }), + burden: new fields.StringField({ choices: SYSTEM.GENERAL.burden, integer: false }), + feature: new fields.StringField({ choices: SYSTEM.ITEM.weaponFeatures, integer: false, blank: true }), + quantity: new fields.NumberField({ initial: 1, integer: true }), + description: new fields.HTMLField({}) + }; } - prepareDerivedData(){ - if(this.parent.parent){ - this.applyEffects(); - } - } - - applyEffects(){ - const effects = this.parent.parent.system.effects; - for(var key in effects){ - const effectType = effects[key]; - for(var effect of effectType) { - switch(key) { - case SYSTEM.EFFECTS.effectTypes.reach.id: - if(SYSTEM.GENERAL.range[this.range].distance < SYSTEM.GENERAL.range[effect.valueData.value].distance){ - this.range = effect.valueData.value; - } - - break; - // case SYSTEM.EFFECTS.effectTypes.damage.id: - - // if(this.damage.type === 'physical') this.damage.value = (`${this.damage.value} + ${this.parent.parent.system.levelData.currentLevel}`); - // break; - } + prepareDerivedData() { + if (this.parent.parent) { + this.applyEffects(); } - } } -} \ No newline at end of file + + applyEffects() { + const effects = this.parent.parent.system.effects; + for (var key in effects) { + const effectType = effects[key]; + for (var effect of effectType) { + switch (key) { + case SYSTEM.EFFECTS.effectTypes.reach.id: + if ( + SYSTEM.GENERAL.range[this.range].distance < + SYSTEM.GENERAL.range[effect.valueData.value].distance + ) { + this.range = effect.valueData.value; + } + + break; + // case SYSTEM.EFFECTS.effectTypes.damage.id: + + // if(this.damage.type === 'physical') this.damage.value = (`${this.damage.value} + ${this.parent.parent.system.levelData.currentLevel}`); + // break; + } + } + } + } +} diff --git a/module/dialogs/selectDialog.mjs b/module/dialogs/selectDialog.mjs index 8e3a2046..e4792238 100644 --- a/module/dialogs/selectDialog.mjs +++ b/module/dialogs/selectDialog.mjs @@ -5,41 +5,41 @@ export default class SelectDialog extends Dialog { this.data = { title: data.title, buttons: data.buttons, - content: renderTemplate("systems/daggerheart/templates/dialog/item-select.hbs", { + content: renderTemplate('systems/daggerheart/templates/dialog/item-select.hbs', { items: data.choices - }), + }) }; this.actor = data.actor; this.actionCostMax = data.actionCostMax; this.nrChoices = data.nrChoices; - this.validate= data.validate; + this.validate = data.validate; } - async getData(options={}) { + async getData(options = {}) { let buttons = Object.keys(this.data.buttons).reduce((obj, key) => { - let b = this.data.buttons[key]; - b.cssClass = (this.data.default === key ? [key, "default", "bright"] : [key]).join(" "); - if ( b.condition !== false ) obj[key] = b; - return obj; + let b = this.data.buttons[key]; + b.cssClass = (this.data.default === key ? [key, 'default', 'bright'] : [key]).join(' '); + if (b.condition !== false) obj[key] = b; + return obj; }, {}); - const content = await this.data.content; + const content = await this.data.content; return { - content: content, - buttons: buttons + content: content, + buttons: buttons }; - } + } activateListeners(html) { super.activateListeners(html); $(html).find('.item-button').click(this.selectChoice); } - selectChoice = async (event) => { - if(this.validate){ - if(!this.validate(event.currentTarget.dataset.validateProp)){ + selectChoice = async event => { + if (this.validate) { + if (!this.validate(event.currentTarget.dataset.validateProp)) { return; } } @@ -48,47 +48,47 @@ export default class SelectDialog extends Dialog { $(event.currentTarget).find('i')[0].classList.toggle('checked'); const buttons = $(this.element[0]).find('button.checked'); - if(buttons.length === this.nrChoices){ + if (buttons.length === this.nrChoices) { $(event.currentTarget).closest('.window-content').find('.confirm')[0].disabled = false; } else { $(event.currentTarget).closest('.window-content').find('.confirm')[0].disabled = true; } - } + }; /** - * + * * @param {*} data - * choices, actor, title, cancelMessage, nrChoices, validate - * @returns + * choices, actor, title, cancelMessage, nrChoices, validate + * @returns */ static async selectItem(data) { return this.wait({ - title: data.title ?? "Selection", + title: data.title ?? 'Selection', buttons: { no: { icon: '', - label: game.i18n.localize("DAGGERHEART.General.Cancel"), + label: game.i18n.localize('DAGGERHEART.General.Cancel'), callback: _ => { - if(data.cancelMessage){ - ChatMessage.create({content: data.cancelMessage }); + if (data.cancelMessage) { + ChatMessage.create({ content: data.cancelMessage }); } return []; } - }, + }, confirm: { icon: '', - label: game.i18n.localize("DAGGERHEART.General.OK"), + label: game.i18n.localize('DAGGERHEART.General.OK'), callback: html => { const buttons = $(html).find('button.checked'); return buttons.map(key => Number.parseInt(buttons[key].dataset.index)).toArray(); }, disabled: true - }, + } }, choices: data.choices, - actor: data.actor, + actor: data.actor, nrChoices: data.nrChoices ?? 1, validate: data.validate }); } -} \ No newline at end of file +} diff --git a/module/documents/_module.mjs b/module/documents/_module.mjs index e41e7ee0..f374372d 100644 --- a/module/documents/_module.mjs +++ b/module/documents/_module.mjs @@ -1,3 +1,3 @@ export { default as DhpActor } from './actor.mjs'; export { default as DhpItem } from './item.mjs'; -export { default as DhpCombat } from './combat.mjs'; \ No newline at end of file +export { default as DhpCombat } from './combat.mjs'; diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 6cbb2b0d..cbcf0ed5 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -1,350 +1,416 @@ -import DamageSelectionDialog from "../applications/damageSelectionDialog.mjs"; -import NpcRollSelectionDialog from "../applications/npcRollSelectionDialog.mjs"; -import RollSelectionDialog from "../applications/rollSelectionDialog.mjs"; -import { GMUpdateEvent, socketEvent } from "../helpers/socket.mjs"; +import DamageSelectionDialog from '../applications/damageSelectionDialog.mjs'; +import NpcRollSelectionDialog from '../applications/npcRollSelectionDialog.mjs'; +import RollSelectionDialog from '../applications/rollSelectionDialog.mjs'; +import { GMUpdateEvent, socketEvent } from '../helpers/socket.mjs'; export default class DhpActor extends Actor { - _preCreate(data, changes, user){ - if(data.type === 'pc'){ - data.prototypeToken = { actorLink: true, disposition: 1, sight: { enabled: true } }; - } - - super._preCreate(data, changes, user); - } - - prepareData(){ - super.prepareData(); - } - - async _preUpdate(changed, options, user) { - //Level Down - if(changed.system?.levelData?.changedLevel && this.system.levelData.currentLevel > changed.system.levelData.changedLevel){ - changed.system.levelData.currentLevel = changed.system.levelData.changedLevel; - changed.system.levelData.levelups = Object.keys(this.system.levelData.levelups).reduce((acc, x) => { - if(x > changed.system.levelData.currentLevel){ - acc[`-=${x}`] = null; - } - - return acc; - }, {}); - - changed.system.attributes = Object.keys(this.system.attributes).reduce((acc, key) => { - acc[key] = { levelMarks: this.system.attributes[key].levelMarks.filter(x => x <= changed.system.levelData.currentLevel) }; - - return acc; - }, {}); - - changed.system.experiences = this.system.experiences.filter(x => x.level <= changed.system.levelData.currentLevel); - - if(this.system.multiclass && this.system.multiclass.system.multiclass > changed.system.levelData.changedLevel){ - const multiclassFeatures = this.items.filter(x => x.system.multiclass); - for(var feature of multiclassFeatures){ - await feature.delete(); - } + _preCreate(data, changes, user) { + if (data.type === 'pc') { + data.prototypeToken = { actorLink: true, disposition: 1, sight: { enabled: true } }; } - } - super._preUpdate(changed, options, user); + super._preCreate(data, changes, user); + } + + prepareData() { + super.prepareData(); + } + + async _preUpdate(changed, options, user) { + //Level Down + if ( + changed.system?.levelData?.changedLevel && + this.system.levelData.currentLevel > changed.system.levelData.changedLevel + ) { + changed.system.levelData.currentLevel = changed.system.levelData.changedLevel; + changed.system.levelData.levelups = Object.keys(this.system.levelData.levelups).reduce((acc, x) => { + if (x > changed.system.levelData.currentLevel) { + acc[`-=${x}`] = null; + } + + return acc; + }, {}); + + changed.system.attributes = Object.keys(this.system.attributes).reduce((acc, key) => { + acc[key] = { + levelMarks: this.system.attributes[key].levelMarks.filter( + x => x <= changed.system.levelData.currentLevel + ) + }; + + return acc; + }, {}); + + changed.system.experiences = this.system.experiences.filter( + x => x.level <= changed.system.levelData.currentLevel + ); + + if ( + this.system.multiclass && + this.system.multiclass.system.multiclass > changed.system.levelData.changedLevel + ) { + const multiclassFeatures = this.items.filter(x => x.system.multiclass); + for (var feature of multiclassFeatures) { + await feature.delete(); + } + } + } + + super._preUpdate(changed, options, user); } async diceRoll(modifier, shiftKey) { - if(this.type === 'pc'){ - return await this.dualityRoll(modifier, shiftKey); - } - else { - return await this.npcRoll(modifier, shiftKey); - } + if (this.type === 'pc') { + return await this.dualityRoll(modifier, shiftKey); + } else { + return await this.npcRoll(modifier, shiftKey); + } } async npcRoll(modifier, shiftKey) { - let nrDice = 1; - let advantage = null; + let nrDice = 1; + let advantage = null; - const modifiers = [ - { - value: Number.parseInt(modifier.value), - label: modifier.value >= 0 ? `+${modifier.value}` : `-${modifier.value}`, - title: modifier.title, + const modifiers = [ + { + value: Number.parseInt(modifier.value), + label: modifier.value >= 0 ? `+${modifier.value}` : `-${modifier.value}`, + title: modifier.title + } + ]; + if (!shiftKey) { + const dialogClosed = new Promise((resolve, _) => { + new NpcRollSelectionDialog(this.system.experiences, resolve).render(true); + }); + const result = await dialogClosed; + + nrDice = result.nrDice; + advantage = result.advantage; + result.experiences.forEach(x => + modifiers.push({ + value: x.value, + label: x.value >= 0 ? `+${x.value}` : `-${x.value}`, + title: x.description + }) + ); } - ]; - if(!shiftKey) { - const dialogClosed = new Promise((resolve, _) => { - new NpcRollSelectionDialog(this.system.experiences, resolve).render(true); - }); - const result = await dialogClosed; - - nrDice = result.nrDice; - advantage = result.advantage; - result.experiences.forEach(x => modifiers.push({ value: x.value, label: x.value >= 0 ? `+${x.value}` : `-${x.value}`, title: x.description })) - } - const roll = new Roll(`${nrDice}d20${advantage === true ? 'kh' : advantage === false ? 'kl': ''} ${modifiers.map(x => `+ ${x.value}`).join(' ')}`); - let rollResult = await roll.evaluate(); - const diceResults = rollResult.dice.flatMap(x => x.results.flatMap(result => ({ value: result.result }))); + const roll = new Roll( + `${nrDice}d20${advantage === true ? 'kh' : advantage === false ? 'kl' : ''} ${modifiers.map(x => `+ ${x.value}`).join(' ')}` + ); + let rollResult = await roll.evaluate(); + const diceResults = rollResult.dice.flatMap(x => x.results.flatMap(result => ({ value: result.result }))); - return { roll, diceResults: diceResults, modifiers: modifiers }; + return { roll, diceResults: diceResults, modifiers: modifiers }; } - async dualityRoll(modifier, shiftKey, bonusDamage=[]){ - let hopeDice = 'd12', fearDice = 'd12', advantageDice = null, disadvantageDice = null, bonusDamageString = ""; - - const modifiers = [ - { - value: modifier.value ? Number.parseInt(modifier.value) : 0, - label: modifier.value >= 0 ? `+${modifier.value}` : `-${modifier.value}`, - title: modifier.title, + async dualityRoll(modifier, shiftKey, bonusDamage = []) { + let hopeDice = 'd12', + fearDice = 'd12', + advantageDice = null, + disadvantageDice = null, + bonusDamageString = ''; + + const modifiers = [ + { + value: modifier.value ? Number.parseInt(modifier.value) : 0, + label: modifier.value >= 0 ? `+${modifier.value}` : `-${modifier.value}`, + title: modifier.title + } + ]; + if (!shiftKey) { + const dialogClosed = new Promise((resolve, _) => { + new RollSelectionDialog( + this.system.experiences, + bonusDamage, + this.system.resources.hope.value, + resolve + ).render(true); + }); + const result = await dialogClosed; + (hopeDice = result.hope), + (fearDice = result.fear), + (advantageDice = result.advantage), + (disadvantageDice = result.disadvantage); + result.experiences.forEach(x => + modifiers.push({ + value: x.value, + label: x.value >= 0 ? `+${x.value}` : `-${x.value}`, + title: x.description + }) + ); + bonusDamageString = result.bonusDamage; + + const automateHope = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope); + + if (automateHope && result.hopeUsed) { + await this.update({ + 'system.resources.hope.value': this.system.resources.hope.value - result.hopeUsed + }); + } + } + const roll = new Roll( + `1${hopeDice} + 1${fearDice}${advantageDice ? ` + 1${advantageDice}` : disadvantageDice ? ` - 1${disadvantageDice}` : ''} ${modifiers.map(x => `+ ${x.value}`).join(' ')}` + ); + let rollResult = await roll.evaluate(); + rollResult.dice[0].options.appearance = { + colorset: 'inspired', + foreground: '#FFFFFF', + background: '#008080', + outline: '#000000', + edge: '#806400', + texture: 'bloodmoon', + material: 'metal', + font: 'Arial Black', + system: 'standard' + }; + if (advantageDice || disadvantageDice) { + rollResult.dice[1].options.appearance = { + colorset: 'inspired', + foreground: disadvantageDice ? '#b30000' : '#FFFFFF', + background: '#008080', + outline: disadvantageDice ? '#000000' : '#000000', + edge: '#806400', + texture: 'bloodmoon', + material: 'metal', + font: 'Arial Black', + system: 'standard' + }; + rollResult.dice[2].options.appearance = { + colorset: 'bloodmoon', + foreground: '#000000', + background: '#430070', + outline: '#b30000', + edge: '#000000', + texture: 'bloodmoon', + material: 'metal', + font: 'Arial Black', + system: 'standard' + }; + } else { + rollResult.dice[1].options.appearance = { + colorset: 'bloodmoon', + foreground: '#000000', + background: '#430070', + outline: '#b30000', + edge: '#000000', + texture: 'bloodmoon', + material: 'metal', + font: 'Arial Black', + system: 'standard' + }; + } + + const hope = rollResult.dice[0].results[0].result; + const advantage = advantageDice ? rollResult.dice[1].results[0].result : null; + const disadvantage = disadvantageDice ? rollResult.dice[1].results[0].result : null; + const fear = + advantage || disadvantage ? rollResult.dice[2].results[0].result : rollResult.dice[1].results[0].result; + + if (disadvantage) { + rollResult = { ...rollResult, total: rollResult.total - Math.max(hope, disadvantage) }; + } + if (advantage) { + rollResult = { ...rollResult, total: 'Select Hope Die' }; } - ]; - if(!shiftKey) { - const dialogClosed = new Promise((resolve, _) => { - new RollSelectionDialog(this.system.experiences, bonusDamage, this.system.resources.hope.value, resolve).render(true); - }); - const result = await dialogClosed; - hopeDice = result.hope, fearDice = result.fear, advantageDice = result.advantage, disadvantageDice = result.disadvantage; - result.experiences.forEach(x => modifiers.push({ value: x.value, label: x.value >= 0 ? `+${x.value}` : `-${x.value}`, title: x.description })) - bonusDamageString = result.bonusDamage; const automateHope = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope); - - if(automateHope && result.hopeUsed){ - await this.update({ "system.resources.hope.value": this.system.resources.hope.value - result.hopeUsed }); + if (automateHope && hope > fear) { + await this.update({ + 'system.resources.hope.value': Math.min( + this.system.resources.hope.value + 1, + this.system.resources.hope.max + ) + }); } - } - const roll = new Roll(`1${hopeDice} + 1${fearDice}${advantageDice ? ` + 1${advantageDice}` : disadvantageDice ? ` - 1${disadvantageDice}` : ''} ${modifiers.map(x => `+ ${x.value}`).join(' ')}`); - let rollResult = await roll.evaluate(); - rollResult.dice[0].options.appearance = { - colorset:"inspired", - foreground: "#FFFFFF", - background: "#008080", - outline: "#000000", - edge: "#806400", - texture: "bloodmoon", - material: "metal", - font: "Arial Black", - system: "standard" - }; - if(advantageDice || disadvantageDice){ - rollResult.dice[1].options.appearance = { - colorset:"inspired", - foreground: disadvantageDice ? "#b30000" : "#FFFFFF", - background: "#008080", - outline: disadvantageDice ? "#000000" : "#000000", - edge: "#806400", - texture: "bloodmoon", - material: "metal", - font: "Arial Black", - system: "standard" - }; - rollResult.dice[2].options.appearance = { - colorset:"bloodmoon", - foreground: "#000000", - background: "#430070", - outline: "#b30000", - edge: "#000000", - texture: "bloodmoon", - material: "metal", - font: "Arial Black", - system: "standard" - }; - } - else { - rollResult.dice[1].options.appearance = { - colorset:"bloodmoon", - foreground: "#000000", - background: "#430070", - outline: "#b30000", - edge: "#000000", - texture: "bloodmoon", - material: "metal", - font: "Arial Black", - system: "standard" - }; - } - - const hope = rollResult.dice[0].results[0].result; - const advantage = advantageDice ? rollResult.dice[1].results[0].result : null; - const disadvantage = disadvantageDice ? rollResult.dice[1].results[0].result : null; - const fear = advantage || disadvantage ? rollResult.dice[2].results[0].result : rollResult.dice[1].results[0].result; - if(disadvantage){ - rollResult = {...rollResult, total: rollResult.total - Math.max(hope, disadvantage) }; - } - if(advantage){ - rollResult = {...rollResult, total: 'Select Hope Die' }; - } - - const automateHope = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope); - if (automateHope && hope > fear){ - await this.update({ "system.resources.hope.value": Math.min(this.system.resources.hope.value+1, this.system.resources.hope.max) }); - } + if (automateHope && hope === fear) { + await this.update({ + 'system.resources': { + 'hope.value': Math.min(this.system.resources.hope.value + 1, this.system.resources.hope.max), + 'stress.value': Math.max(this.system.resources.stress.value - 1, 0) + } + }); + } - if(automateHope && hope === fear){ - await this.update({ "system.resources": { - "hope.value": Math.min(this.system.resources.hope.value+1, this.system.resources.hope.max), - "stress.value": Math.max(this.system.resources.stress.value-1, 0), - }}); - } - - return { roll, rollResult, hope: { dice: hopeDice, value: hope }, fear: { dice: fearDice, value: fear }, advantage: { dice: advantageDice, value: advantage }, disadvantage: { dice: disadvantageDice, value: disadvantage }, modifiers: modifiers, bonusDamageString }; + return { + roll, + rollResult, + hope: { dice: hopeDice, value: hope }, + fear: { dice: fearDice, value: fear }, + advantage: { dice: advantageDice, value: advantage }, + disadvantage: { dice: disadvantageDice, value: disadvantage }, + modifiers: modifiers, + bonusDamageString + }; } - async damageRoll(damage, shiftKey){ - let rollString = damage.value; - let bonusDamage = damage.bonusDamage?.filter(x => x.initiallySelected) ?? []; - if(!shiftKey) { - const dialogClosed = new Promise((resolve, _) => { - new DamageSelectionDialog(rollString, bonusDamage, this.system.resources.hope.value, resolve).render(true); - }); - const result = await dialogClosed; - bonusDamage = result.bonusDamage; - rollString = result.rollString; - - const automateHope = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope); - if(automateHope && result.hopeUsed){ - await this.update({ "system.resources.hope.value": this.system.resources.hope.value - result.hopeUsed }); + async damageRoll(damage, shiftKey) { + let rollString = damage.value; + let bonusDamage = damage.bonusDamage?.filter(x => x.initiallySelected) ?? []; + if (!shiftKey) { + const dialogClosed = new Promise((resolve, _) => { + new DamageSelectionDialog(rollString, bonusDamage, this.system.resources.hope.value, resolve).render( + true + ); + }); + const result = await dialogClosed; + bonusDamage = result.bonusDamage; + rollString = result.rollString; + + const automateHope = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope); + if (automateHope && result.hopeUsed) { + await this.update({ + 'system.resources.hope.value': this.system.resources.hope.value - result.hopeUsed + }); + } } - } - const roll = new Roll(rollString); - let rollResult = await roll.evaluate(); + const roll = new Roll(rollString); + let rollResult = await roll.evaluate(); - const dice = []; - const modifiers = []; - for(var i = 0; i < rollResult.terms.length; i++){ - const term = rollResult.terms[i]; - if(term.faces){ - dice.push({type: `d${term.faces}`, value: term.total}); - } - else if (term.operator){ + const dice = []; + const modifiers = []; + for (var i = 0; i < rollResult.terms.length; i++) { + const term = rollResult.terms[i]; + if (term.faces) { + dice.push({ type: `d${term.faces}`, value: term.total }); + } else if (term.operator) { + } else if (term.number) { + const operator = i === 0 ? '' : rollResult.terms[i - 1].operator; + modifiers.push(`${operator}${term.number}`); + } + } - } - else if(term.number){ - const operator = i === 0 ? '' : rollResult.terms[i-1].operator; - modifiers.push(`${operator}${term.number}`); - } - } + const cls = getDocumentClass('ChatMessage'); + const msg = new cls({ + user: game.user.id, + content: await renderTemplate('systems/daggerheart/templates/chat/damage-roll.hbs', { + roll: rollString, + total: rollResult.total, + dice: dice, + modifiers: modifiers + }), + rolls: [roll] + }); - const cls = getDocumentClass("ChatMessage"); - const msg = new cls({ - user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/damage-roll.hbs", { - roll: rollString, - total: rollResult.total, - dice: dice, - modifiers: modifiers - }), - rolls: [roll] - }); - - cls.create(msg.toObject()); + cls.create(msg.toObject()); } - async takeDamage(damage, type){ - const hpDamage = - damage >= this.system.damageThresholds.severe ? 3 : - damage >= this.system.damageThresholds.major ? 2 : - damage >= this.system.damageThresholds.minor ? 1 : - 0; + async takeDamage(damage, type) { + const hpDamage = + damage >= this.system.damageThresholds.severe + ? 3 + : damage >= this.system.damageThresholds.major + ? 2 + : damage >= this.system.damageThresholds.minor + ? 1 + : 0; - const update = { "system.resources.health.value": Math.min(this.system.resources.health.value+hpDamage, this.system.resources.health.max) }; + const update = { + 'system.resources.health.value': Math.min( + this.system.resources.health.value + hpDamage, + this.system.resources.health.max + ) + }; - if(game.user.isGM){ - await this.update(update); - } else { - await game.socket.emit(`system.${SYSTEM.id}`, { - action: socketEvent.GMUpdate, - data: { - action: GMUpdateEvent.UpdateDocument, - uuid: this.uuid, - update: update, - } - }); - } + if (game.user.isGM) { + await this.update(update); + } else { + await game.socket.emit(`system.${SYSTEM.id}`, { + action: socketEvent.GMUpdate, + data: { + action: GMUpdateEvent.UpdateDocument, + uuid: this.uuid, + update: update + } + }); + } } async takeHealing(healing, type) { - let update = { }; - switch(type){ - case SYSTEM.GENERAL.healingTypes.health.id: - update = { "system.resources.health.value": Math.max(this.system.resources.health.value - healing, 0) }; - break; - case SYSTEM.GENERAL.healingTypes.stress.id: - update = { "system.resources.stress.value": Math.max(this.system.resources.stress.value - healing, 0) }; - break; - } + let update = {}; + switch (type) { + case SYSTEM.GENERAL.healingTypes.health.id: + update = { 'system.resources.health.value': Math.max(this.system.resources.health.value - healing, 0) }; + break; + case SYSTEM.GENERAL.healingTypes.stress.id: + update = { 'system.resources.stress.value': Math.max(this.system.resources.stress.value - healing, 0) }; + break; + } - if(game.user.isGM){ - await this.update(update); - } else { - await game.socket.emit(`system.${SYSTEM.id}`, { - action: socketEvent.GMUpdate, - data: { - action: GMUpdateEvent.UpdateDocument, - uuid: this.uuid, - update: update, - } - }); - } + if (game.user.isGM) { + await this.update(update); + } else { + await game.socket.emit(`system.${SYSTEM.id}`, { + action: socketEvent.GMUpdate, + data: { + action: GMUpdateEvent.UpdateDocument, + uuid: this.uuid, + update: update + } + }); + } } async emulateItemDrop(data) { - const event = new DragEvent("drop", { altKey: game.keyboard.isModifierActive("Alt") }); - return this.sheet._onDropItem(event, { data: data }); + const event = new DragEvent('drop', { altKey: game.keyboard.isModifierActive('Alt') }); + return this.sheet._onDropItem(event, { data: data }); } //Move to action-scope? async useAction(action) { - const userTargets = Array.from(game.user.targets); - const otherTarget = action.target.type ===SYSTEM.ACTIONS.targetTypes.other.id; - if(otherTarget && userTargets.length === 0) { - ui.notifications.error(game.i18n.localize("DAGGERHEART.Notification.Error.ActionRequiresTarget")); - return; - } - - if(action.cost.type != null && action.cost.value != null){ - if (this.system.resources[action.cost.type].value < action.cost.value-1) { - ui.notifications.error(game.i18n.localize(`Insufficient ${action.cost.type} to use this ability`)); - return; - } - } - - // const targets = otherTarget ? userTargets : [game.user.character]; - if(action.damage.type){ - let roll = { formula: action.damage.value, result: action.damage.value }; - if(Number.isNaN(Number.parseInt(action.damage.value))){ - roll = await new Roll(`1${action.damage.value}`).evaluate(); + const userTargets = Array.from(game.user.targets); + const otherTarget = action.target.type === SYSTEM.ACTIONS.targetTypes.other.id; + if (otherTarget && userTargets.length === 0) { + ui.notifications.error(game.i18n.localize('DAGGERHEART.Notification.Error.ActionRequiresTarget')); + return; } - const cls = getDocumentClass("ChatMessage"); - const msg = new cls({ - user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/damage-roll.hbs", { - roll: roll.formula, - total: roll.result, - type: action.damage.type, - }), - }); - - cls.create(msg.toObject()); - } - - if(action.healing.type){ - let roll = { formula: action.healing.value, result: action.healing.value }; - if(Number.isNaN(Number.parseInt(action.healing.value))){ - roll = await new Roll(`1${action.healing.value}`).evaluate(); + if (action.cost.type != null && action.cost.value != null) { + if (this.system.resources[action.cost.type].value < action.cost.value - 1) { + ui.notifications.error(game.i18n.localize(`Insufficient ${action.cost.type} to use this ability`)); + return; + } } - const cls = getDocumentClass("ChatMessage"); - const msg = new cls({ - user: game.user.id, - content: await renderTemplate("systems/daggerheart/templates/chat/healing-roll.hbs", { - roll: roll.formula, - total: roll.result, - type: action.healing.type, - }), - }); - - cls.create(msg.toObject()); - } + // const targets = otherTarget ? userTargets : [game.user.character]; + if (action.damage.type) { + let roll = { formula: action.damage.value, result: action.damage.value }; + if (Number.isNaN(Number.parseInt(action.damage.value))) { + roll = await new Roll(`1${action.damage.value}`).evaluate(); + } + + const cls = getDocumentClass('ChatMessage'); + const msg = new cls({ + user: game.user.id, + content: await renderTemplate('systems/daggerheart/templates/chat/damage-roll.hbs', { + roll: roll.formula, + total: roll.result, + type: action.damage.type + }) + }); + + cls.create(msg.toObject()); + } + + if (action.healing.type) { + let roll = { formula: action.healing.value, result: action.healing.value }; + if (Number.isNaN(Number.parseInt(action.healing.value))) { + roll = await new Roll(`1${action.healing.value}`).evaluate(); + } + + const cls = getDocumentClass('ChatMessage'); + const msg = new cls({ + user: game.user.id, + content: await renderTemplate('systems/daggerheart/templates/chat/healing-roll.hbs', { + roll: roll.formula, + total: roll.result, + type: action.healing.type + }) + }); + + cls.create(msg.toObject()); + } } -} \ No newline at end of file +} diff --git a/module/documents/combat.mjs b/module/documents/combat.mjs index cf6e7efb..c7905605 100644 --- a/module/documents/combat.mjs +++ b/module/documents/combat.mjs @@ -1,11 +1,11 @@ -import { GMUpdateEvent, socketEvent } from "../helpers/socket.mjs"; +import { GMUpdateEvent, socketEvent } from '../helpers/socket.mjs'; export default class DhpCombat extends Combat { _sortCombatants(a, b) { - if(a.isNPC !== b.isNPC){ + if (a.isNPC !== b.isNPC) { const aVal = a.isNPC ? 0 : 1; const bVal = b.isNPC ? 0 : 1; - + return aVal - bVal; } @@ -13,20 +13,23 @@ export default class DhpCombat extends Combat { } async useActionToken(combatantId) { - const automateActionPoints = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.ActionPoints); + const automateActionPoints = await game.settings.get( + SYSTEM.id, + SYSTEM.SETTINGS.gameSettings.Automation.ActionPoints + ); - if(game.user.isGM){ - if(this.system.actions < 1) return; - - const update = automateActionPoints ? - { "system.activeCombatant": combatantId, "system.actions": Math.max(this.system.actions-1, 0) } : - { "system.activeCombatant": combatantId }; + if (game.user.isGM) { + if (this.system.actions < 1) return; + + const update = automateActionPoints + ? { 'system.activeCombatant': combatantId, 'system.actions': Math.max(this.system.actions - 1, 0) } + : { 'system.activeCombatant': combatantId }; await this.update(update); } else { - const update = automateActionPoints ? - { "system.activeCombatant": combatantId, "system.actions": this.system.actions+1} : - { "system.activeCombatant": combatantId }; + const update = automateActionPoints + ? { 'system.activeCombatant': combatantId, 'system.actions': this.system.actions + 1 } + : { 'system.activeCombatant': combatantId }; await game.socket.emit(`system.${SYSTEM.id}`, { action: socketEvent.GMUpdate, @@ -38,4 +41,4 @@ export default class DhpCombat extends Combat { }); } } -} \ No newline at end of file +} diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 0174b184..cbf3ff2b 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -1,72 +1,79 @@ export default class DhpItem extends Item { - _preCreate(data, changes, user){ - super._preCreate(data, changes, user); + _preCreate(data, changes, user) { + super._preCreate(data, changes, user); } - prepareData(){ + prepareData() { super.prepareData(); - if(this.type === 'class'){ - // Bad. Make this better. - // this.system.domains = CONFIG.daggerheart.DOMAIN.classDomainMap[Object.keys(CONFIG.daggerheart.DOMAIN.classDomainMap).find(x => x === this.name.toLowerCase())]; + if (this.type === 'class') { + // Bad. Make this better. + // this.system.domains = CONFIG.daggerheart.DOMAIN.classDomainMap[Object.keys(CONFIG.daggerheart.DOMAIN.classDomainMap).find(x => x === this.name.toLowerCase())]; } } - isInventoryItem(){ - return ['weapon', 'armor', 'miscellaneous', 'consumable'].includes(this.type); + isInventoryItem() { + return ['weapon', 'armor', 'miscellaneous', 'consumable'].includes(this.type); } _onUpdate(data, options, userId) { - super._onUpdate(data, options, userId); + super._onUpdate(data, options, userId); } static async createDialog(data = {}, { parent = null, pack = null, ...options } = {}) { - const documentName = this.metadata.name; - const types = game.documentTypes[documentName].filter(t => t !== CONST.BASE_DOCUMENT_TYPE); - let collection; - if ( !parent ) { - if ( pack ) collection = game.packs.get(pack); - else collection = game.collections.get(documentName); - } - const folders = collection?._formatFolderSelectOptions() ?? []; - const label = game.i18n.localize(this.metadata.label); - const title = game.i18n.format("DOCUMENT.Create", {type: label}); - const typeObjects = types.reduce((obj, t) => { - const label = CONFIG[documentName]?.typeLabels?.[t] ?? t; - obj[t] = { value: t, label: game.i18n.has(label) ? game.i18n.localize(label) : t }; - return obj; - }, {}); + const documentName = this.metadata.name; + const types = game.documentTypes[documentName].filter(t => t !== CONST.BASE_DOCUMENT_TYPE); + let collection; + if (!parent) { + if (pack) collection = game.packs.get(pack); + else collection = game.collections.get(documentName); + } + const folders = collection?._formatFolderSelectOptions() ?? []; + const label = game.i18n.localize(this.metadata.label); + const title = game.i18n.format('DOCUMENT.Create', { type: label }); + const typeObjects = types.reduce((obj, t) => { + const label = CONFIG[documentName]?.typeLabels?.[t] ?? t; + obj[t] = { value: t, label: game.i18n.has(label) ? game.i18n.localize(label) : t }; + return obj; + }, {}); - // Render the document creation form - const html = await renderTemplate("systems/daggerheart/templates/sidebar/documentCreate.hbs", { - folders, - name: data.name || game.i18n.format("DOCUMENT.New", {type: label}), - folder: data.folder, - hasFolders: folders.length >= 1, - type: data.type || CONFIG[documentName]?.defaultType || typeObjects.armor, - types: { - Items: [typeObjects.armor, typeObjects.weapon, typeObjects.consumable, typeObjects.miscellaneous], - Character: [typeObjects.class, typeObjects.subclass, typeObjects.ancestry, typeObjects.community, typeObjects.feature, typeObjects.domainCard], - }, - hasTypes: types.length > 1 - }); + // Render the document creation form + const html = await renderTemplate('systems/daggerheart/templates/sidebar/documentCreate.hbs', { + folders, + name: data.name || game.i18n.format('DOCUMENT.New', { type: label }), + folder: data.folder, + hasFolders: folders.length >= 1, + type: data.type || CONFIG[documentName]?.defaultType || typeObjects.armor, + types: { + Items: [typeObjects.armor, typeObjects.weapon, typeObjects.consumable, typeObjects.miscellaneous], + Character: [ + typeObjects.class, + typeObjects.subclass, + typeObjects.ancestry, + typeObjects.community, + typeObjects.feature, + typeObjects.domainCard + ] + }, + hasTypes: types.length > 1 + }); - // Render the confirmation dialog window - return Dialog.prompt({ - title: title, - content: html, - label: title, - callback: html => { - const form = html[0].querySelector("form"); - const fd = new FormDataExtended(form); - foundry.utils.mergeObject(data, fd.object, {inplace: true}); - if ( !data.folder ) delete data.folder; - if ( types.length === 1 ) data.type = types[0]; - if ( !data.name?.trim() ) data.name = this.defaultName(); - return this.create(data, {parent, pack, renderSheet: true}); - }, - rejectClose: false, - options - }); + // Render the confirmation dialog window + return Dialog.prompt({ + title: title, + content: html, + label: title, + callback: html => { + const form = html[0].querySelector('form'); + const fd = new FormDataExtended(form); + foundry.utils.mergeObject(data, fd.object, { inplace: true }); + if (!data.folder) delete data.folder; + if (types.length === 1) data.type = types[0]; + if (!data.name?.trim()) data.name = this.defaultName(); + return this.create(data, { parent, pack, renderSheet: true }); + }, + rejectClose: false, + options + }); } - } \ No newline at end of file +} diff --git a/module/helpers/handlebarsHelper.mjs b/module/helpers/handlebarsHelper.mjs index 728f66f9..8a099175 100644 --- a/module/helpers/handlebarsHelper.mjs +++ b/module/helpers/handlebarsHelper.mjs @@ -1,7 +1,7 @@ -import { getWidthOfText } from "./utils.mjs"; +import { getWidthOfText } from './utils.mjs'; export default class RegisterHandlebarsHelpers { - static registerHelpers(){ + static registerHelpers() { Handlebars.registerHelper({ looseEq: this.looseEq, times: this.times, @@ -11,60 +11,62 @@ export default class RegisterHandlebarsHelpers { objectSelector: this.objectSelector, includes: this.includes, simpleEditor: this.simpleEditor, - debug: this.debug, + debug: this.debug }); - }; + } - static looseEq(a, b){ + static looseEq(a, b) { return a == b; } - static times(nr, block){ + static times(nr, block) { var accum = ''; - for(var i = 0; i < nr; ++i) - accum += block.fn(i); + for (var i = 0; i < nr; ++i) accum += block.fn(i); return accum; } - static join(...options){ - return options.slice(0, options.length-1); + static join(...options) { + return options.slice(0, options.length - 1); } - static add(a, b){ + static add(a, b) { const aNum = Number.parseInt(a); const bNum = Number.parseInt(b); return (Number.isNaN(aNum) ? 0 : aNum) + (Number.isNaN(bNum) ? 0 : bNum); } - static subtract(a, b){ + static subtract(a, b) { const aNum = Number.parseInt(a); const bNum = Number.parseInt(b); return (Number.isNaN(aNum) ? 0 : aNum) - (Number.isNaN(bNum) ? 0 : bNum); } - static objectSelector(options){ + static objectSelector(options) { let { title, values, titleFontSize, ids, style } = options.hash; const titleLength = getWidthOfText(title, titleFontSize, true, true); const margins = 12; const buttons = options.fn(); - const nrButtons = Math.max($(buttons).length-1, 1); + const nrButtons = Math.max($(buttons).length - 1, 1); const iconWidth = 26; - const texts = values.reduce((acc, x, index) => { - if(x){ - acc.push(`${x}`); - } + const texts = values + .reduce((acc, x, index) => { + if (x) { + acc.push( + `${x}` + ); + } - return acc; - }, []).join(' '); + return acc; + }, []) + .join(' '); - const html = - `
+ const html = `
${title} -
+
${texts}
${buttons} @@ -76,25 +78,31 @@ export default class RegisterHandlebarsHelpers { } static rangePicker(options) { - let {name, value, min, max, step} = options.hash; - name = name || "range"; - value = value ?? ""; - if ( Number.isNaN(value) ) value = ""; - const html = - ` + let { name, value, min, max, step } = options.hash; + name = name || 'range'; + value = value ?? ''; + if (Number.isNaN(value)) value = ''; + const html = ` ${value}`; return new Handlebars.SafeString(html); } - - static includes(list, item){ + + static includes(list, item) { return list.includes(item); } static simpleEditor(content, options) { - const { target, editable=true, button, engine="tinymce", collaborate=false, class: cssClass } = options.hash; - const config = {name: target, value: content, button, collaborate, editable, engine}; + const { + target, + editable = true, + button, + engine = 'tinymce', + collaborate = false, + class: cssClass + } = options.hash; + const config = { name: target, value: content, button, collaborate, editable, engine }; const element = foundry.applications.fields.createEditorInput(config); - if ( cssClass ) element.querySelector(".editor-content").classList.add(cssClass); + if (cssClass) element.querySelector('.editor-content').classList.add(cssClass); return new Handlebars.SafeString(element.outerHTML); } @@ -102,4 +110,4 @@ export default class RegisterHandlebarsHelpers { console.log(JSON.stringify(a)); return a; } -} \ No newline at end of file +} diff --git a/module/helpers/socket.mjs b/module/helpers/socket.mjs index 5f4ee737..fd768d34 100644 --- a/module/helpers/socket.mjs +++ b/module/helpers/socket.mjs @@ -1,4 +1,4 @@ -export function handleSocketEvent({action=null, data={}}={}) { +export function handleSocketEvent({ action = null, data = {} } = {}) { switch (action) { case socketEvent.GMUpdate: Hooks.callAll(socketEvent.GMUpdate, data.action, data.uuid, data.update); @@ -8,13 +8,13 @@ export function handleSocketEvent({action=null, data={}}={}) { break; } } - + export const socketEvent = { - GMUpdate: "DhpGMUpdate", - DhpFearUpdate: "DhpFearUpdate", + GMUpdate: 'DhpGMUpdate', + DhpFearUpdate: 'DhpFearUpdate' }; export const GMUpdateEvent = { - UpdateDocument: "DhpGMUpdateDocument", - UpdateFear: "DhpUpdateFear" -}; \ No newline at end of file + UpdateDocument: 'DhpGMUpdateDocument', + UpdateFear: 'DhpUpdateFear' +}; diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index 796bfab8..2b1bc536 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -1,7 +1,7 @@ -export const loadCompendiumOptions = async (compendiums) => { +export const loadCompendiumOptions = async compendiums => { const compendiumValues = []; - for(var compendium of compendiums){ + for (var compendium of compendiums) { const values = await getCompendiumOptions(compendium); compendiumValues.push(values); } @@ -9,11 +9,11 @@ export const loadCompendiumOptions = async (compendiums) => { return compendiumValues; }; -const getCompendiumOptions = async (compendium) => { +const getCompendiumOptions = async compendium => { const compendiumPack = await game.packs.get(compendium); - + const values = []; - for(var value of compendiumPack.index){ + for (var value of compendiumPack.index) { const document = await compendiumPack.getDocument(value._id); values.push(document); } @@ -34,24 +34,23 @@ export const getWidthOfText = (txt, fontsize, allCaps, bold) => { // getWidthOfText.e.innerText = txt; // return getWidthOfText.e.offsetWidth; const text = allCaps ? txt.toUpperCase() : txt; - if(getWidthOfText.c === undefined){ - getWidthOfText.c=document.createElement('canvas'); - getWidthOfText.ctx=getWidthOfText.c.getContext('2d'); + if (getWidthOfText.c === undefined) { + getWidthOfText.c = document.createElement('canvas'); + getWidthOfText.ctx = getWidthOfText.c.getContext('2d'); } - var fontspec = `${bold ? 'bold': ''} ${fontsize}px` + ' ' + 'Signika, sans-serif'; - if(getWidthOfText.ctx.font !== fontspec) - getWidthOfText.ctx.font = fontspec; + var fontspec = `${bold ? 'bold' : ''} ${fontsize}px` + ' ' + 'Signika, sans-serif'; + if (getWidthOfText.ctx.font !== fontspec) getWidthOfText.ctx.font = fontspec; return getWidthOfText.ctx.measureText(text).width; -} +}; export const padArray = (arr, len, fill) => { - return arr.concat(Array(len).fill(fill)).slice(0,len); -} + return arr.concat(Array(len).fill(fill)).slice(0, len); +}; export const getTier = (level, asNr) => { - switch(Math.floor((level+1)/3)){ - case 1: + switch (Math.floor((level + 1) / 3)) { + case 1: return asNr ? 1 : 'tier1'; case 2: return asNr ? 2 : 'tier2'; @@ -60,23 +59,26 @@ export const getTier = (level, asNr) => { default: return asNr ? 0 : 'tier0'; } -} +}; -export const capitalize = (string) => { +export const capitalize = string => { return string.charAt(0).toUpperCase() + string.slice(1); -} +}; export const getPathValue = (path, entity, numeric) => { const pathValue = foundry.utils.getProperty(entity, path); - if(pathValue) return numeric ? Number.parseInt(pathValue) : pathValue; + if (pathValue) return numeric ? Number.parseInt(pathValue) : pathValue; return numeric ? Number.parseInt(path) : path; }; export const generateId = (title, length) => { - const id = title.split(" ").map((w, i) => { - const p = w.slugify({replacement: "", strict: true}); - return i ? p.titleCase() : p; - }).join(""); - return Number.isNumeric(length) ? id.slice(0, length).padEnd(length, "0") : id; -} \ No newline at end of file + const id = title + .split(' ') + .map((w, i) => { + const p = w.slugify({ replacement: '', strict: true }); + return i ? p.titleCase() : p; + }) + .join(''); + return Number.isNumeric(length) ? id.slice(0, length).padEnd(length, '0') : id; +}; diff --git a/module/ui/chatLog.mjs b/module/ui/chatLog.mjs index c8931c46..49972386 100644 --- a/module/ui/chatLog.mjs +++ b/module/ui/chatLog.mjs @@ -1,5 +1,5 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLog { - constructor(){ + constructor() { super(); this.targetTemplate = { @@ -9,27 +9,37 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo minimizedSheets: [], config: undefined, targets: undefined - } + }; this.setupHooks(); } addChatListeners = async (app, html, data) => { - html.querySelectorAll('.roll-damage-button').forEach(element => element.addEventListener('click', event => this.onRollDamage(event, data.message))); - html.querySelectorAll('.target-container').forEach(element => element.addEventListener('hover', hover(this.hoverTarget, this.unhoverTarget))); // ???? + html.querySelectorAll('.roll-damage-button').forEach(element => + element.addEventListener('click', event => this.onRollDamage(event, data.message)) + ); + html.querySelectorAll('.target-container').forEach(element => + element.addEventListener('hover', hover(this.hoverTarget, this.unhoverTarget)) + ); // ???? // html.find('.target-container').mouseout(this.unhoverTarget); html.querySelectorAll('.damage-button').forEach(element => element.addEventListener('click', this.onDamage)); html.querySelectorAll('.healing-button').forEach(element => element.addEventListener('click', this.onHealing)); - html.querySelectorAll('.target-indicator').forEach(element => element.addEventListener('click', this.onToggleTargets)); + html.querySelectorAll('.target-indicator').forEach(element => + element.addEventListener('click', this.onToggleTargets) + ); html.querySelectorAll('.advantage').forEach(element => element.hover(this.hoverAdvantage)); // ?? - html.querySelectorAll('.advantage').forEach(element => element.addEventListener('click', event => this.selectAdvantage.bind(this)(event, data.message))); - html.querySelectorAll('.ability-use-button').forEach(element => element.addEventListener('click', this.abilityUseButton.bind(this)(event, data.message))); - } - - setupHooks(){ + html.querySelectorAll('.advantage').forEach(element => + element.addEventListener('click', event => this.selectAdvantage.bind(this)(event, data.message)) + ); + html.querySelectorAll('.ability-use-button').forEach(element => + element.addEventListener('click', this.abilityUseButton.bind(this)(event, data.message)) + ); + }; + + setupHooks() { Hooks.on('renderChatMessageHTML', this.addChatListeners.bind()); } - close(options){ + close(options) { Hooks.off('renderChatMessageHTML', this.addChatListeners); super.close(options); } @@ -40,47 +50,49 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo await game.user.character.damageRoll(message.system.damage, event.shiftKey); }; - hoverTarget = (event) => { + hoverTarget = event => { event.stopPropagation(); const token = canvas.tokens.get(event.currentTarget.dataset.token); - if ( !token.controlled ) token._onHoverIn(event, {hoverOutOthers: true}); - } - - unhoverTarget = (event) => { - const token = canvas.tokens.get(event.currentTarget.dataset.token); - if ( !token.controlled ) token._onHoverOut(event); + if (!token.controlled) token._onHoverIn(event, { hoverOutOthers: true }); }; - onDamage = async (event) => { + unhoverTarget = event => { + const token = canvas.tokens.get(event.currentTarget.dataset.token); + if (!token.controlled) token._onHoverOut(event); + }; + + onDamage = async event => { event.stopPropagation(); const damage = Number.parseInt(event.currentTarget.dataset.value); const targets = Array.from(game.user.targets); - if(targets.length === 0) ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.NoTargetsSelected")); + if (targets.length === 0) + ui.notifications.info(game.i18n.localize('DAGGERHEART.Notification.Info.NoTargetsSelected')); - for(var target of targets){ + for (var target of targets) { await target.actor.takeDamage(damage, event.currentTarget.dataset.type); } }; - onHealing = async (event) => { + onHealing = async event => { event.stopPropagation(); const healing = Number.parseInt(event.currentTarget.dataset.value); const targets = Array.from(game.user.targets); - if(targets.length === 0) ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.NoTargetsSelected")); + if (targets.length === 0) + ui.notifications.info(game.i18n.localize('DAGGERHEART.Notification.Info.NoTargetsSelected')); - for(var target of targets){ + for (var target of targets) { await target.actor.takeHealing(healing, event.currentTarget.dataset.type); } - } + }; - onToggleTargets = async (event) => { + onToggleTargets = async event => { event.stopPropagation(); $($(event.currentTarget).parent()).find('.target-container').toggleClass('hidden'); }; - hoverAdvantage = (event) => { + hoverAdvantage = event => { $(event.currentTarget).siblings('.advantage').toggleClass('unused'); }; @@ -88,16 +100,16 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo event.stopPropagation(); const updateMessage = game.messages.get(message._id); - await updateMessage.update({ system: { advantageSelected: event.currentTarget.id === 'hope' ? 1 : 2 }}); + await updateMessage.update({ system: { advantageSelected: event.currentTarget.id === 'hope' ? 1 : 2 } }); $(event.currentTarget).siblings('.advantage').off('click'); $(event.currentTarget).off('click'); - } + }; abilityUseButton = async (event, message) => { event.stopPropagation(); const action = message.system.actions[Number.parseInt(event.currentTarget.dataset.index)]; await game.user.character.useAction(action); - } -} \ No newline at end of file + }; +} diff --git a/module/ui/combatTracker.mjs b/module/ui/combatTracker.mjs index 8ee6b3d3..86002cb6 100644 --- a/module/ui/combatTracker.mjs +++ b/module/ui/combatTracker.mjs @@ -1,200 +1,199 @@ -import { GMUpdateEvent, socketEvent } from "../helpers/socket.mjs"; +import { GMUpdateEvent, socketEvent } from '../helpers/socket.mjs'; export default class DhpCombatTracker extends foundry.applications.sidebar.tabs.CombatTracker { constructor(data, context) { - super(data, context); + super(data, context); - Hooks.on(socketEvent.DhpFearUpdate, this.onFearUpdate); + Hooks.on(socketEvent.DhpFearUpdate, this.onFearUpdate); } - get template(){ + get template() { return 'systems/daggerheart/templates/ui/combatTracker.hbs'; } activateListeners(html) { super.activateListeners(html); - html.on("click", ".token-action-tokens .use-action-token", this.useActionToken.bind(this)); - html.on("click", ".encounter-gm-resources .trade-actions", this.tradeActions.bind(this)); - html.on("click", ".encounter-gm-resources .trade-fear", this.tradeFear.bind(this)); - html.on("click", ".encounter-gm-resources .icon-button.up", this.increaseResource.bind(this)); - html.on("click", ".encounter-gm-resources .icon-button.down", this.decreaseResource.bind(this)); + html.on('click', '.token-action-tokens .use-action-token', this.useActionToken.bind(this)); + html.on('click', '.encounter-gm-resources .trade-actions', this.tradeActions.bind(this)); + html.on('click', '.encounter-gm-resources .trade-fear', this.tradeFear.bind(this)); + html.on('click', '.encounter-gm-resources .icon-button.up', this.increaseResource.bind(this)); + html.on('click', '.encounter-gm-resources .icon-button.down', this.decreaseResource.bind(this)); } - async useActionToken(event){ + async useActionToken(event) { event.stopPropagation(); const combatant = event.currentTarget.dataset.combatant; await game.combat.useActionToken(combatant); } - async tradeActions(event){ - if(event.currentTarget.classList.contains('disabled')) return; + async tradeActions(event) { + if (event.currentTarget.classList.contains('disabled')) return; - const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); - const value = currentFear+1; + const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); + const value = currentFear + 1; - if(value <= 6){ - Hooks.callAll(socketEvent.GMUpdate,GMUpdateEvent.UpdateFear, null, value); - await game.socket.emit(`system.${SYSTEM.id}`, { - action: socketEvent.GMUpdate, - data: { action: GMUpdateEvent.UpdateFear, update: value }, - }); - await game.combat.update({ "system.actions": game.combat.system.actions-2 }); - } + if (value <= 6) { + Hooks.callAll(socketEvent.GMUpdate, GMUpdateEvent.UpdateFear, null, value); + await game.socket.emit(`system.${SYSTEM.id}`, { + action: socketEvent.GMUpdate, + data: { action: GMUpdateEvent.UpdateFear, update: value } + }); + await game.combat.update({ 'system.actions': game.combat.system.actions - 2 }); + } } - async tradeFear(){ - if(event.currentTarget.classList.contains('disabled')) return; + async tradeFear() { + if (event.currentTarget.classList.contains('disabled')) return; - const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); - const value = currentFear-1; - if(value >= 0){ - Hooks.callAll(socketEvent.GMUpdate,GMUpdateEvent.UpdateFear, null, value); - await game.socket.emit(`system.${SYSTEM.id}`, { - action: socketEvent.GMUpdate, - data: { action: GMUpdateEvent.UpdateFear, update: value }, - }); - await game.combat.update({ "system.actions": game.combat.system.actions+2 }); - } + const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); + const value = currentFear - 1; + if (value >= 0) { + Hooks.callAll(socketEvent.GMUpdate, GMUpdateEvent.UpdateFear, null, value); + await game.socket.emit(`system.${SYSTEM.id}`, { + action: socketEvent.GMUpdate, + data: { action: GMUpdateEvent.UpdateFear, update: value } + }); + await game.combat.update({ 'system.actions': game.combat.system.actions + 2 }); + } } async increaseResource(event) { - if(event.currentTarget.dataset.type === 'action'){ - await game.combat.update({ "system.actions": game.combat.system.actions+1 }); - } + if (event.currentTarget.dataset.type === 'action') { + await game.combat.update({ 'system.actions': game.combat.system.actions + 1 }); + } - const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); - const value = currentFear+1; - if(event.currentTarget.dataset.type === 'fear' && value <= 6){ - Hooks.callAll(socketEvent.GMUpdate,GMUpdateEvent.UpdateFear, null, value); - await game.socket.emit(`system.${SYSTEM.id}`, { - action: socketEvent.GMUpdate, - data: { action: GMUpdateEvent.UpdateFear, update: value }, - }); - } + const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); + const value = currentFear + 1; + if (event.currentTarget.dataset.type === 'fear' && value <= 6) { + Hooks.callAll(socketEvent.GMUpdate, GMUpdateEvent.UpdateFear, null, value); + await game.socket.emit(`system.${SYSTEM.id}`, { + action: socketEvent.GMUpdate, + data: { action: GMUpdateEvent.UpdateFear, update: value } + }); + } - this.render(); + this.render(); } async decreaseResource(event) { - if(event.currentTarget.dataset.type === 'action' && game.combat.system.actions-1 >= 0){ - await game.combat.update({ "system.actions": game.combat.system.actions-1 }); - } + if (event.currentTarget.dataset.type === 'action' && game.combat.system.actions - 1 >= 0) { + await game.combat.update({ 'system.actions': game.combat.system.actions - 1 }); + } - const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); - const value = currentFear-1; - if(event.currentTarget.dataset.type === 'fear' && value >= 0){ - Hooks.callAll(socketEvent.GMUpdate,GMUpdateEvent.UpdateFear, null, value); - await game.socket.emit(`system.${SYSTEM.id}`, { - action: socketEvent.GMUpdate, - data: { action: GMUpdateEvent.UpdateFear, update: value }, - }); - } + const currentFear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); + const value = currentFear - 1; + if (event.currentTarget.dataset.type === 'fear' && value >= 0) { + Hooks.callAll(socketEvent.GMUpdate, GMUpdateEvent.UpdateFear, null, value); + await game.socket.emit(`system.${SYSTEM.id}`, { + action: socketEvent.GMUpdate, + data: { action: GMUpdateEvent.UpdateFear, update: value } + }); + } - this.render(); + this.render(); } - async getData(options={}) { + async getData(options = {}) { let context = await super.getData(options); - + // Get the combat encounters possible for the viewed Scene const combat = this.viewed; const hasCombat = combat !== null; const combats = this.combats; const currentIdx = combats.findIndex(c => c === combat); - const previousId = currentIdx > 0 ? combats[currentIdx-1].id : null; - const nextId = currentIdx < combats.length - 1 ? combats[currentIdx+1].id : null; - const settings = game.settings.get("core", Combat.CONFIG_SETTING); - + const previousId = currentIdx > 0 ? combats[currentIdx - 1].id : null; + const nextId = currentIdx < combats.length - 1 ? combats[currentIdx + 1].id : null; + const settings = game.settings.get('core', Combat.CONFIG_SETTING); + // Prepare rendering data context = foundry.utils.mergeObject(context, { - combats: combats, - currentIndex: currentIdx + 1, - combatCount: combats.length, - hasCombat: hasCombat, - combat, - turns: [], - previousId, - nextId, - started: this.started, - control: false, - settings, - linked: combat?.scene !== null, - labels: {} + combats: combats, + currentIndex: currentIdx + 1, + combatCount: combats.length, + hasCombat: hasCombat, + combat, + turns: [], + previousId, + nextId, + started: this.started, + control: false, + settings, + linked: combat?.scene !== null, + labels: {} }); - context.labels.scope = game.i18n.localize(`COMBAT.${context.linked ? "Linked" : "Unlinked"}`); - if ( !hasCombat ) return context; - + context.labels.scope = game.i18n.localize(`COMBAT.${context.linked ? 'Linked' : 'Unlinked'}`); + if (!hasCombat) return context; + // Format information about each combatant in the encounter let hasDecimals = false; const turns = []; - for ( let [i, combatant] of combat.turns.entries() ) { - if ( !combatant.visible ) continue; - - // Prepare turn data - const resource = combatant.permission >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER ? combatant.resource : null; - const turn = { - id: combatant.id, - name: combatant.name, - img: await this._getCombatantThumbnail(combatant), - active: combatant.id === combat.system.activeCombatant, - owner: combatant.isOwner, - defeated: combatant.isDefeated, - hidden: combatant.hidden, - initiative: combatant.initiative, - hasRolled: combatant.initiative !== null, - hasResource: resource !== null, - resource: resource, - canPing: (combatant.sceneId === canvas.scene?.id) && game.user.hasPermission("PING_CANVAS"), - playerCharacter: game.user?.character?.id === combatant.actor.id, - ownedByPlayer: combatant.hasPlayerOwner, - }; - if ( (turn.initiative !== null) && !Number.isInteger(turn.initiative) ) hasDecimals = true; - turn.css = [ - turn.active ? "active" : "", - turn.hidden ? "hidden" : "", - turn.defeated ? "defeated" : "" - ].join(" ").trim(); - - // Actor and Token status effects - turn.effects = new Set(); - if ( combatant.token ) { - combatant.token.effects.forEach(e => turn.effects.add(e)); - if ( combatant.token.overlayEffect ) turn.effects.add(combatant.token.overlayEffect); - } - if ( combatant.actor ) { - for ( const effect of combatant.actor.temporaryEffects ) { - if ( effect.statuses.has(CONFIG.specialStatusEffects.DEFEATED) ) turn.defeated = true; - else if ( effect.icon ) turn.effects.add(effect.icon); + for (let [i, combatant] of combat.turns.entries()) { + if (!combatant.visible) continue; + + // Prepare turn data + const resource = + combatant.permission >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER ? combatant.resource : null; + const turn = { + id: combatant.id, + name: combatant.name, + img: await this._getCombatantThumbnail(combatant), + active: combatant.id === combat.system.activeCombatant, + owner: combatant.isOwner, + defeated: combatant.isDefeated, + hidden: combatant.hidden, + initiative: combatant.initiative, + hasRolled: combatant.initiative !== null, + hasResource: resource !== null, + resource: resource, + canPing: combatant.sceneId === canvas.scene?.id && game.user.hasPermission('PING_CANVAS'), + playerCharacter: game.user?.character?.id === combatant.actor.id, + ownedByPlayer: combatant.hasPlayerOwner + }; + if (turn.initiative !== null && !Number.isInteger(turn.initiative)) hasDecimals = true; + turn.css = [turn.active ? 'active' : '', turn.hidden ? 'hidden' : '', turn.defeated ? 'defeated' : ''] + .join(' ') + .trim(); + + // Actor and Token status effects + turn.effects = new Set(); + if (combatant.token) { + combatant.token.effects.forEach(e => turn.effects.add(e)); + if (combatant.token.overlayEffect) turn.effects.add(combatant.token.overlayEffect); } - } - turns.push(turn); + if (combatant.actor) { + for (const effect of combatant.actor.temporaryEffects) { + if (effect.statuses.has(CONFIG.specialStatusEffects.DEFEATED)) turn.defeated = true; + else if (effect.icon) turn.effects.add(effect.icon); + } + } + turns.push(turn); } - + // Format initiative numeric precision const precision = CONFIG.Combat.initiative.decimals; turns.forEach(t => { - if ( t.initiative !== null ) t.initiative = t.initiative.toFixed(hasDecimals ? precision : 0); + if (t.initiative !== null) t.initiative = t.initiative.toFixed(hasDecimals ? precision : 0); }); const fear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); - + // Merge update data for rendering return foundry.utils.mergeObject(context, { - round: combat.round, - turn: combat.turn, - turns: turns, - control: combat.combatant?.players?.includes(game.user), - fear: fear, + round: combat.round, + turn: combat.turn, + turns: turns, + control: combat.combatant?.players?.includes(game.user), + fear: fear }); - } + } onFearUpdate = async () => { this.render(true); - } + }; - async close(options){ + async close(options) { Hooks.off(socketEvent.DhpFearUpdate, this.onFearUpdate); return super.close(options); } -} \ No newline at end of file +} diff --git a/module/ui/players.mjs b/module/ui/players.mjs index 829148eb..cbce702b 100644 --- a/module/ui/players.mjs +++ b/module/ui/players.mjs @@ -1,53 +1,53 @@ -import { GMUpdateEvent, socketEvent } from "../helpers/socket.mjs"; +import { GMUpdateEvent, socketEvent } from '../helpers/socket.mjs'; export default class DhpPlayers extends foundry.applications.ui.Players { constructor(data, context) { super(data, context); - + Hooks.on(socketEvent.DhpFearUpdate, this.onFearUpdate); } - get template(){ + get template() { return 'systems/daggerheart/templates/ui/players.hbs'; } - async getData(options={}) { + async getData(options = {}) { const context = super.getData(options); context.fear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); context.user = game.user; - + return context; } activateListeners(html) { // Toggle online/offline - html.find(".players-mode").click(this._onToggleOfflinePlayers.bind(this)); - html.find(".fear-control.up").click(async event => await this.updateFear(event, 1)); - html.find(".fear-control.down").click(async event => await this.updateFear(event, -1)); + html.find('.players-mode').click(this._onToggleOfflinePlayers.bind(this)); + html.find('.fear-control.up').click(async event => await this.updateFear(event, 1)); + html.find('.fear-control.down').click(async event => await this.updateFear(event, -1)); // Context menu const contextOptions = this._getUserContextOptions(); - Hooks.call("getUserContextOptions", html, contextOptions); - new ContextMenu(html, ".player", contextOptions); + Hooks.call('getUserContextOptions', html, contextOptions); + new ContextMenu(html, '.player', contextOptions); } - async updateFear(_, change){ + async updateFear(_, change) { const fear = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); - const value = Math.max(Math.min(fear+change, 6), 0); - Hooks.callAll(socketEvent.GMUpdate,GMUpdateEvent.UpdateFear, null, value); + const value = Math.max(Math.min(fear + change, 6), 0); + Hooks.callAll(socketEvent.GMUpdate, GMUpdateEvent.UpdateFear, null, value); await game.socket.emit(`system.${SYSTEM.id}`, { - action: socketEvent.GMUpdate, - data: { action: GMUpdateEvent.UpdateFear, update: value }, + action: socketEvent.GMUpdate, + data: { action: GMUpdateEvent.UpdateFear, update: value } }); } onFearUpdate = async () => { this.render(true); - } + }; - async close(options){ + async close(options) { Hooks.off(socketEvent.DhpFearUpdate, this.onFearUpdate); return super.close(options); } -} \ No newline at end of file +} diff --git a/module/ui/ruler.mjs b/module/ui/ruler.mjs index 565c7217..a12f3616 100644 --- a/module/ui/ruler.mjs +++ b/module/ui/ruler.mjs @@ -1,7 +1,7 @@ export default class DhpRuler extends foundry.canvas.interaction.Ruler { _getSegmentLabel(segment, totalDistance) { const range = game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.RangeMeasurement); - if(!range.enabled) return super._getSegmentLabel(segment, totalDistance); + if (!range.enabled) return super._getSegmentLabel(segment, totalDistance); const segmentDistance = Math.round(segment.distance * 100) / 100; const totalDistanceValue = Math.round(totalDistance * 100) / 100; @@ -9,21 +9,21 @@ export default class DhpRuler extends foundry.canvas.interaction.Ruler { return `${this.#getRangeLabel(segmentDistance, range)} [${this.#getRangeLabel(totalDistanceValue, range)}]`; } - #getRangeLabel(distance, settings){ - if(distance <= settings.melee){ - return game.i18n.localize("DAGGERHEART.Range.Melee.Name"); + #getRangeLabel(distance, settings) { + if (distance <= settings.melee) { + return game.i18n.localize('DAGGERHEART.Range.Melee.Name'); } - if(distance <= settings.veryClose){ - return game.i18n.localize("DAGGERHEART.Range.VeryClose.Name"); + if (distance <= settings.veryClose) { + return game.i18n.localize('DAGGERHEART.Range.VeryClose.Name'); } - if(distance <= settings.close){ - return game.i18n.localize("DAGGERHEART.Range.Close.Name"); + if (distance <= settings.close) { + return game.i18n.localize('DAGGERHEART.Range.Close.Name'); } - if(distance <= settings.far){ - return game.i18n.localize("DAGGERHEART.Range.Far.Name"); + if (distance <= settings.far) { + return game.i18n.localize('DAGGERHEART.Range.Far.Name'); } - if(distance <= settings.veryFar){ - return game.i18n.localize("DAGGERHEART.Range.VeryFar.Name"); + if (distance <= settings.veryFar) { + return game.i18n.localize('DAGGERHEART.Range.VeryFar.Name'); } } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 69848a5e..a26d608f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4516 +1,4894 @@ { - "name": "daggerheart", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@yaireo/tagify": "^4.17.9", - "gulp": "^5.0.0", - "gulp-less": "^5.0.0", - "rollup": "^4.40.0" - }, - "devDependencies": { - "@foundryvtt/foundryvtt-cli": "^1.0.2", - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-node-resolve": "^15.2.3", - "concurrently": "^8.2.2", - "postcss": "^8.4.32", - "rollup-plugin-postcss": "^4.0.2" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@foundryvtt/foundryvtt-cli": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@foundryvtt/foundryvtt-cli/-/foundryvtt-cli-1.0.2.tgz", - "integrity": "sha512-pERML7ViBiqwP11NS1kci0Q38t4h557F/Mj+DjYmmgumMJIZqDsVv2XU3bwOJS7+6yzbUmUc2/jRD6EIx+U/fw==", - "dev": true, - "dependencies": { - "chalk": "^5.2.0", - "classic-level": "^1.2.0", - "esm": "^3.2.25", - "js-yaml": "^4.1.0", - "mkdirp": "^3.0.0", - "nedb-promises": "^6.2.1", - "yargs": "^17.7.1" - }, - "bin": { - "fvtt": "fvtt.mjs" - }, - "engines": { - "node": ">17.0.0" - } - }, - "node_modules/@foundryvtt/foundryvtt-cli/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@foundryvtt/foundryvtt-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@foundryvtt/foundryvtt-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@foundryvtt/foundryvtt-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@gulpjs/messages": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", - "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@gulpjs/to-absolute-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", - "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", - "license": "MIT", - "dependencies": { - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", - "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", - "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", - "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", - "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", - "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", - "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", - "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", - "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", - "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", - "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", - "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", - "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", - "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", - "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", - "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", - "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", - "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", - "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", - "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", - "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@seald-io/binary-search-tree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@seald-io/binary-search-tree/-/binary-search-tree-1.0.3.tgz", - "integrity": "sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==", - "dev": true - }, - "node_modules/@seald-io/nedb": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@seald-io/nedb/-/nedb-4.0.4.tgz", - "integrity": "sha512-CUNcMio7QUHTA+sIJ/DC5JzVNNsHe743TPmC4H5Gij9zDLMbmrCT2li3eVB72/gF63BPS8pWEZrjlAMRKA8FDw==", - "dev": true, - "dependencies": { - "@seald-io/binary-search-tree": "^1.0.3", - "localforage": "^1.9.0", - "util": "^0.12.4" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "license": "MIT" - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/@yaireo/tagify": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/@yaireo/tagify/-/tagify-4.22.2.tgz", - "integrity": "sha512-R2QSHX3eCJiAf7kIoTojlMbjHiS271z5V2XLyVf4VvgPVQpXBNFskI41DyaDiMS5enXZ13j8kmm92GI+QmgdnQ==", - "engines": { - "node": ">=14.20.0", - "npm": ">=8.0.0" - }, - "peerDependencies": { - "prop-types": "^15.7.2" - } - }, - "node_modules/abstract-level": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", - "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/abstract-level/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dependencies": { - "ansi-wrap": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async-done": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", - "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.4.4", - "once": "^1.4.0", - "stream-exhaust": "^1.0.2" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/async-settle": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", - "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", - "license": "MIT", - "dependencies": { - "async-done": "^2.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "node_modules/bach": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", - "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", - "license": "MIT", - "dependencies": { - "async-done": "^2.0.0", - "async-settle": "^2.0.0", - "now-and-later": "^3.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/classic-level": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", - "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/concurrently/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-props": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", - "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", - "license": "MIT", - "dependencies": { - "each-props": "^3.0.0", - "is-plain-object": "^5.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/each-props": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", - "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.711", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", - "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", - "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", - "license": "MIT", - "dependencies": { - "fastest-levenshtein": "^1.0.7" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/fined": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", - "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0", - "object.pick": "^1.3.0", - "parse-filepath": "^1.0.2" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/flagged-respawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", - "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", - "license": "MIT", - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-mkdirp-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", - "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.8", - "streamx": "^2.12.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "dependencies": { - "loader-utils": "^3.2.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-stream": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", - "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", - "license": "MIT", - "dependencies": { - "@gulpjs/to-absolute-glob": "^4.0.0", - "anymatch": "^3.1.3", - "fastq": "^1.13.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "is-negated-glob": "^1.0.0", - "normalize-path": "^3.0.0", - "streamx": "^2.12.5" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-stream/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-watcher": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", - "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", - "license": "MIT", - "dependencies": { - "async-done": "^2.0.0", - "chokidar": "^3.5.3" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glogg": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", - "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", - "license": "MIT", - "dependencies": { - "sparkles": "^2.1.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gulp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", - "integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==", - "license": "MIT", - "dependencies": { - "glob-watcher": "^6.0.0", - "gulp-cli": "^3.0.0", - "undertaker": "^2.0.0", - "vinyl-fs": "^4.0.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/gulp-cli": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz", - "integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==", - "license": "MIT", - "dependencies": { - "@gulpjs/messages": "^1.1.0", - "chalk": "^4.1.2", - "copy-props": "^4.0.0", - "gulplog": "^2.2.0", - "interpret": "^3.1.1", - "liftoff": "^5.0.0", - "mute-stdout": "^2.0.0", - "replace-homedir": "^2.0.0", - "semver-greatest-satisfied-range": "^2.0.0", - "string-width": "^4.2.3", - "v8flags": "^4.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/gulp-less": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-5.0.0.tgz", - "integrity": "sha512-W2I3TewO/By6UZsM/wJG3pyK5M6J0NYmJAAhwYXQHR+38S0iDtZasmUgFCH3CQj+pQYw/PAIzxvFvwtEXz1HhQ==", - "dependencies": { - "less": "^3.7.1 || ^4.0.0", - "object-assign": "^4.0.1", - "plugin-error": "^1.0.0", - "replace-ext": "^2.0.0", - "through2": "^4.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/gulplog": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", - "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", - "license": "MIT", - "dependencies": { - "glogg": "^2.2.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "node_modules/import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "dependencies": { - "import-from": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "license": "MIT", - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "license": "MIT", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "license": "MIT", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "peer": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/last-run": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", - "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/lead": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", - "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/liftoff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz", - "integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==", - "license": "MIT", - "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^5.0.0", - "fined": "^2.0.0", - "flagged-respawn": "^2.0.0", - "is-plain-object": "^5.0.0", - "rechoir": "^0.8.0", - "resolve": "^1.20.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dev": true, - "dependencies": { - "lie": "3.1.1" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/mute-stdout": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", - "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, - "node_modules/nedb-promises": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/nedb-promises/-/nedb-promises-6.2.3.tgz", - "integrity": "sha512-enq0IjNyBz9Qy9W/QPCcLGh/QORGBjXbIeZeWvIjO3OMLyAvlKT3hiJubP2BKEiFniUlR3L01o18ktqgn5jxqA==", - "dev": true, - "dependencies": { - "@seald-io/nedb": "^4.0.2" - } - }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/now-and-later": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", - "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", - "license": "MIT", - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "license": "MIT", - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "license": "MIT", - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/plugin-error/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.37", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.37.tgz", - "integrity": "sha512-7iB/v/r7Woof0glKLH8b1SPHrsX7uhdO+Geb41QpF/+mWZHU3uxxSlN+UXGVit1PawOYDToO+AbZzhBzWRDwbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "dependencies": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "peer": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "optional": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "peer": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "license": "ISC" - }, - "node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/replace-homedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", - "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", - "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", - "license": "MIT", - "dependencies": { - "value-or-function": "^4.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", - "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.0", - "@rollup/rollup-android-arm64": "4.41.0", - "@rollup/rollup-darwin-arm64": "4.41.0", - "@rollup/rollup-darwin-x64": "4.41.0", - "@rollup/rollup-freebsd-arm64": "4.41.0", - "@rollup/rollup-freebsd-x64": "4.41.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", - "@rollup/rollup-linux-arm-musleabihf": "4.41.0", - "@rollup/rollup-linux-arm64-gnu": "4.41.0", - "@rollup/rollup-linux-arm64-musl": "4.41.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-musl": "4.41.0", - "@rollup/rollup-linux-s390x-gnu": "4.41.0", - "@rollup/rollup-linux-x64-gnu": "4.41.0", - "@rollup/rollup-linux-x64-musl": "4.41.0", - "@rollup/rollup-win32-arm64-msvc": "4.41.0", - "@rollup/rollup-win32-ia32-msvc": "4.41.0", - "@rollup/rollup-win32-x64-msvc": "4.41.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", - "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.0", - "@rollup/rollup-android-arm64": "4.41.0", - "@rollup/rollup-darwin-arm64": "4.41.0", - "@rollup/rollup-darwin-x64": "4.41.0", - "@rollup/rollup-freebsd-arm64": "4.41.0", - "@rollup/rollup-freebsd-x64": "4.41.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", - "@rollup/rollup-linux-arm-musleabihf": "4.41.0", - "@rollup/rollup-linux-arm64-gnu": "4.41.0", - "@rollup/rollup-linux-arm64-musl": "4.41.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-musl": "4.41.0", - "@rollup/rollup-linux-s390x-gnu": "4.41.0", - "@rollup/rollup-linux-x64-gnu": "4.41.0", - "@rollup/rollup-linux-x64-musl": "4.41.0", - "@rollup/rollup-win32-arm64-msvc": "4.41.0", - "@rollup/rollup-win32-ia32-msvc": "4.41.0", - "@rollup/rollup-win32-x64-msvc": "4.41.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-postcss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", - "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^5.0.1", - "import-cwd": "^3.0.0", - "p-queue": "^6.6.2", - "pify": "^5.0.0", - "postcss-load-config": "^3.0.0", - "postcss-modules": "^4.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.19.0", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.2", - "style-inject": "^0.3.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "8.x" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "optional": true - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-greatest-satisfied-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", - "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", - "license": "MIT", - "dependencies": { - "sver": "^1.8.3" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparkles": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", - "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stream-composer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", - "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", - "license": "MIT", - "dependencies": { - "streamx": "^2.13.2" - } - }, - "node_modules/stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "license": "MIT" - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sver": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", - "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", - "license": "MIT", - "optionalDependencies": { - "semver": "^6.3.0" - } - }, - "node_modules/sver/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-through": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", - "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", - "license": "MIT", - "dependencies": { - "streamx": "^2.12.5" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undertaker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", - "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", - "license": "MIT", - "dependencies": { - "bach": "^2.0.1", - "fast-levenshtein": "^3.0.0", - "last-run": "^2.0.0", - "undertaker-registry": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/undertaker-registry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", - "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/v8flags": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", - "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/value-or-function": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", - "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/vinyl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", - "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", - "license": "MIT", - "dependencies": { - "clone": "^2.1.2", - "clone-stats": "^1.0.0", - "remove-trailing-separator": "^1.1.0", - "replace-ext": "^2.0.0", - "teex": "^1.0.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/vinyl-contents": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", - "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", - "license": "MIT", - "dependencies": { - "bl": "^5.0.0", - "vinyl": "^3.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/vinyl-fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", - "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", - "license": "MIT", - "dependencies": { - "fs-mkdirp-stream": "^2.0.1", - "glob-stream": "^8.0.0", - "graceful-fs": "^4.2.11", - "iconv-lite": "^0.6.3", - "is-valid-glob": "^1.0.0", - "lead": "^4.0.0", - "normalize-path": "3.0.0", - "resolve-options": "^2.0.0", - "stream-composer": "^1.0.2", - "streamx": "^2.14.0", - "to-through": "^3.0.0", - "value-or-function": "^4.0.0", - "vinyl": "^3.0.0", - "vinyl-sourcemap": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/vinyl-sourcemap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", - "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", - "license": "MIT", - "dependencies": { - "convert-source-map": "^2.0.0", - "graceful-fs": "^4.2.10", - "now-and-later": "^3.0.0", - "streamx": "^2.12.5", - "vinyl": "^3.0.0", - "vinyl-contents": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", - "dependencies": { - "source-map": "^0.5.1" - } - }, - "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } + "name": "daggerheart", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@yaireo/tagify": "^4.17.9", + "gulp": "^5.0.0", + "gulp-less": "^5.0.0", + "rollup": "^4.40.0" + }, + "devDependencies": { + "@foundryvtt/foundryvtt-cli": "^1.0.2", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-node-resolve": "^15.2.3", + "concurrently": "^8.2.2", + "husky": "^9.1.5", + "lint-staged": "^15.2.10", + "postcss": "^8.4.32", + "prettier": "^3.5.3", + "rollup-plugin-postcss": "^4.0.2" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@foundryvtt/foundryvtt-cli/-/foundryvtt-cli-1.0.2.tgz", + "integrity": "sha512-pERML7ViBiqwP11NS1kci0Q38t4h557F/Mj+DjYmmgumMJIZqDsVv2XU3bwOJS7+6yzbUmUc2/jRD6EIx+U/fw==", + "dev": true, + "dependencies": { + "chalk": "^5.2.0", + "classic-level": "^1.2.0", + "esm": "^3.2.25", + "js-yaml": "^4.1.0", + "mkdirp": "^3.0.0", + "nedb-promises": "^6.2.1", + "yargs": "^17.7.1" + }, + "bin": { + "fvtt": "fvtt.mjs" + }, + "engines": { + "node": ">17.0.0" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@gulpjs/messages": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", + "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@gulpjs/to-absolute-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", + "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", + "dependencies": { + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", + "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", + "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@seald-io/binary-search-tree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@seald-io/binary-search-tree/-/binary-search-tree-1.0.3.tgz", + "integrity": "sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==", + "dev": true + }, + "node_modules/@seald-io/nedb": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@seald-io/nedb/-/nedb-4.0.4.tgz", + "integrity": "sha512-CUNcMio7QUHTA+sIJ/DC5JzVNNsHe743TPmC4H5Gij9zDLMbmrCT2li3eVB72/gF63BPS8pWEZrjlAMRKA8FDw==", + "dev": true, + "dependencies": { + "@seald-io/binary-search-tree": "^1.0.3", + "localforage": "^1.9.0", + "util": "^0.12.4" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@yaireo/tagify": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/@yaireo/tagify/-/tagify-4.22.2.tgz", + "integrity": "sha512-R2QSHX3eCJiAf7kIoTojlMbjHiS271z5V2XLyVf4VvgPVQpXBNFskI41DyaDiMS5enXZ13j8kmm92GI+QmgdnQ==", + "engines": { + "node": ">=14.20.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "prop-types": "^15.7.2" + } + }, + "node_modules/abstract-level": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", + "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abstract-level/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-done": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", + "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", + "dependencies": { + "end-of-stream": "^1.4.4", + "once": "^1.4.0", + "stream-exhaust": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/async-settle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", + "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", + "dependencies": { + "async-done": "^2.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, + "node_modules/bach": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", + "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", + "dependencies": { + "async-done": "^2.0.0", + "async-settle": "^2.0.0", + "now-and-later": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001599", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", + "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/classic-level": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", + "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-props": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", + "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", + "dependencies": { + "each-props": "^3.0.0", + "is-plain-object": "^5.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/each-props": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", + "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", + "dependencies": { + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.711", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", + "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", + "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", + "dependencies": { + "graceful-fs": "^4.2.8", + "streamx": "^2.12.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-stream": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", + "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", + "dependencies": { + "@gulpjs/to-absolute-glob": "^4.0.0", + "anymatch": "^3.1.3", + "fastq": "^1.13.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "is-negated-glob": "^1.0.0", + "normalize-path": "^3.0.0", + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-watcher": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", + "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", + "dependencies": { + "async-done": "^2.0.0", + "chokidar": "^3.5.3" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/glogg": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", + "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", + "dependencies": { + "sparkles": "^2.1.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gulp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", + "integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==", + "dependencies": { + "glob-watcher": "^6.0.0", + "gulp-cli": "^3.0.0", + "undertaker": "^2.0.0", + "vinyl-fs": "^4.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-cli": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz", + "integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==", + "dependencies": { + "@gulpjs/messages": "^1.1.0", + "chalk": "^4.1.2", + "copy-props": "^4.0.0", + "gulplog": "^2.2.0", + "interpret": "^3.1.1", + "liftoff": "^5.0.0", + "mute-stdout": "^2.0.0", + "replace-homedir": "^2.0.0", + "semver-greatest-satisfied-range": "^2.0.0", + "string-width": "^4.2.3", + "v8flags": "^4.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-less": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-5.0.0.tgz", + "integrity": "sha512-W2I3TewO/By6UZsM/wJG3pyK5M6J0NYmJAAhwYXQHR+38S0iDtZasmUgFCH3CQj+pQYw/PAIzxvFvwtEXz1HhQ==", + "dependencies": { + "less": "^3.7.1 || ^4.0.0", + "object-assign": "^4.0.1", + "plugin-error": "^1.0.0", + "replace-ext": "^2.0.0", + "through2": "^4.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gulplog": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", + "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", + "dependencies": { + "glogg": "^2.2.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/last-run": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", + "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/lead": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", + "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/liftoff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz", + "integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lint-staged": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", + "dev": true, + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/lint-staged/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mute-stdout": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", + "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "dev": true + }, + "node_modules/nedb-promises": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/nedb-promises/-/nedb-promises-6.2.3.tgz", + "integrity": "sha512-enq0IjNyBz9Qy9W/QPCcLGh/QORGBjXbIeZeWvIjO3OMLyAvlKT3hiJubP2BKEiFniUlR3L01o18ktqgn5jxqA==", + "dev": true, + "dependencies": { + "@seald-io/nedb": "^4.0.2" + } + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", + "dependencies": { + "once": "^1.4.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.37", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.37.tgz", + "integrity": "sha512-7iB/v/r7Woof0glKLH8b1SPHrsX7uhdO+Geb41QpF/+mWZHU3uxxSlN+UXGVit1PawOYDToO+AbZzhBzWRDwbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "dev": true, + "dependencies": { + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/promise.series": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", + "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "peer": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/replace-homedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", + "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", + "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", + "dependencies": { + "value-or-function": "^4.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", + "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.41.0", + "@rollup/rollup-android-arm64": "4.41.0", + "@rollup/rollup-darwin-arm64": "4.41.0", + "@rollup/rollup-darwin-x64": "4.41.0", + "@rollup/rollup-freebsd-arm64": "4.41.0", + "@rollup/rollup-freebsd-x64": "4.41.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", + "@rollup/rollup-linux-arm-musleabihf": "4.41.0", + "@rollup/rollup-linux-arm64-gnu": "4.41.0", + "@rollup/rollup-linux-arm64-musl": "4.41.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-musl": "4.41.0", + "@rollup/rollup-linux-s390x-gnu": "4.41.0", + "@rollup/rollup-linux-x64-gnu": "4.41.0", + "@rollup/rollup-linux-x64-musl": "4.41.0", + "@rollup/rollup-win32-arm64-msvc": "4.41.0", + "@rollup/rollup-win32-ia32-msvc": "4.41.0", + "@rollup/rollup-win32-x64-msvc": "4.41.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-postcss": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", + "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "concat-with-sourcemaps": "^1.1.0", + "cssnano": "^5.0.1", + "import-cwd": "^3.0.0", + "p-queue": "^6.6.2", + "pify": "^5.0.0", + "postcss-load-config": "^3.0.0", + "postcss-modules": "^4.0.0", + "promise.series": "^0.2.0", + "resolve": "^1.19.0", + "rollup-pluginutils": "^2.8.2", + "safe-identifier": "^0.4.2", + "style-inject": "^0.3.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "8.x" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "optional": true + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", + "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", + "dependencies": { + "sver": "^1.8.3" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparkles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", + "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/stream-composer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", + "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", + "dependencies": { + "streamx": "^2.13.2" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-inject": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", + "dev": true + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", + "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", + "optionalDependencies": { + "semver": "^6.3.0" + } + }, + "node_modules/sver/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", + "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", + "dependencies": { + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", + "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", + "dependencies": { + "bach": "^2.0.1", + "fast-levenshtein": "^3.0.0", + "last-run": "^2.0.0", + "undertaker-registry": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/undertaker-registry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", + "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/v8flags": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/value-or-function": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", + "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-contents": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", + "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", + "dependencies": { + "bl": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", + "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", + "dependencies": { + "fs-mkdirp-stream": "^2.0.1", + "glob-stream": "^8.0.0", + "graceful-fs": "^4.2.11", + "iconv-lite": "^0.6.3", + "is-valid-glob": "^1.0.0", + "lead": "^4.0.0", + "normalize-path": "3.0.0", + "resolve-options": "^2.0.0", + "stream-composer": "^1.0.2", + "streamx": "^2.14.0", + "to-through": "^3.0.0", + "value-or-function": "^4.0.0", + "vinyl": "^3.0.0", + "vinyl-sourcemap": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", + "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", + "dependencies": { + "convert-source-map": "^2.0.0", + "graceful-fs": "^4.2.10", + "now-and-later": "^3.0.0", + "streamx": "^2.12.5", + "vinyl": "^3.0.0", + "vinyl-contents": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } } + } } diff --git a/package.json b/package.json index 8c03aac6..7e76b5e7 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,28 @@ { - "dependencies": { - "@yaireo/tagify": "^4.17.9", - "gulp": "^5.0.0", - "gulp-less": "^5.0.0", - "rollup": "^4.40.0" - }, - "scripts": { - "start": "concurrently \"rollup -c --watch\" \"node ../../../../FoundryDev/main.js --dataPath=../../../ --noupnp\" \"gulp\"", - "start-test": "node ./resources/app/main.js --dataPath=./ && rollup -c --watch && gulp", - "pushLDBtoYML": "node ./tools/pushLDBtoYML.mjs", - "pullYMLtoLDB": "node ./tools/pullYMLtoLDB.mjs" - }, - "devDependencies": { - "@foundryvtt/foundryvtt-cli": "^1.0.2", - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-node-resolve": "^15.2.3", - "concurrently": "^8.2.2", - "postcss": "^8.4.32", - "rollup-plugin-postcss": "^4.0.2" - } + "dependencies": { + "@yaireo/tagify": "^4.17.9", + "gulp": "^5.0.0", + "gulp-less": "^5.0.0", + "rollup": "^4.40.0" + }, + "scripts": { + "start": "concurrently \"rollup -c --watch\" \"node ../../../../FoundryDev/main.js --dataPath=../../../ --noupnp\" \"gulp\"", + "start-test": "node ./resources/app/main.js --dataPath=./ && rollup -c --watch && gulp", + "pushLDBtoYML": "node ./tools/pushLDBtoYML.mjs", + "pullYMLtoLDB": "node ./tools/pullYMLtoLDB.mjs" + }, + "devDependencies": { + "@foundryvtt/foundryvtt-cli": "^1.0.2", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-node-resolve": "^15.2.3", + "concurrently": "^8.2.2", + "husky": "^9.1.5", + "lint-staged": "^15.2.10", + "postcss": "^8.4.32", + "prettier": "^3.5.3", + "rollup-plugin-postcss": "^4.0.2" + }, + "lint-staged": { + "**/*": "prettier --write --ignore-unknown" + } } diff --git a/postcss.config.js b/postcss.config.js index f75aa23c..85970d70 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ /** @type {import('postcss-load-config').Config} */ const config = { plugins: [] -} - - module.exports = config \ No newline at end of file +}; + +module.exports = config; diff --git a/rollup.config.mjs b/rollup.config.mjs index c3894007..9317eb1a 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -7,14 +7,14 @@ export default { output: { file: 'build/daggerheart.js', format: 'cjs', - sourcemap: true, + sourcemap: true }, plugins: [ postcss({ config: { path: './postcss.config.js' }, - use: { + use: { less: { javascriptEnabled: true } }, extensions: ['.less'], @@ -22,8 +22,8 @@ export default { }), commonjs({ include: /node_modules/, - requireReturnsDefault: 'auto', + requireReturnsDefault: 'auto' }), resolve() - ], -} \ No newline at end of file + ] +}; diff --git a/src/packs/ancestries/ancestry_Clank_AzKMOIpXnCSLLDEB.json b/src/packs/ancestries/ancestry_Clank_AzKMOIpXnCSLLDEB.json index 0541310a..3234bc97 100644 --- a/src/packs/ancestries/ancestry_Clank_AzKMOIpXnCSLLDEB.json +++ b/src/packs/ancestries/ancestry_Clank_AzKMOIpXnCSLLDEB.json @@ -1,30 +1,30 @@ { - "name": "Clank", - "type": "ancestry", - "_id": "AzKMOIpXnCSLLDEB", - "img": "icons/svg/item-bag.svg", - "system": { - "description": "

Purposeful Design: Decide who made you and for what purpose. At character creation, choose one of your Experiences that best aligns with this purpose and gain a permanent +1 bonus to it.

Efficient: When you take a short rest, you can choose a long rest move instead of a short rest move.

", - "abilities": [] - }, - "effects": [], - "folder": null, - "sort": 100000, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747990113503, - "modifiedTime": 1747999445342, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!AzKMOIpXnCSLLDEB" + "name": "Clank", + "type": "ancestry", + "_id": "AzKMOIpXnCSLLDEB", + "img": "icons/svg/item-bag.svg", + "system": { + "description": "

Purposeful Design: Decide who made you and for what purpose. At character creation, choose one of your Experiences that best aligns with this purpose and gain a permanent +1 bonus to it.

Efficient: When you take a short rest, you can choose a long rest move instead of a short rest move.

", + "abilities": [] + }, + "effects": [], + "folder": null, + "sort": 100000, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747990113503, + "modifiedTime": 1747999445342, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!AzKMOIpXnCSLLDEB" } diff --git a/src/packs/class-features/feature_Make_a_Scene_Ddk0PAgwM4VLRbyY.json b/src/packs/class-features/feature_Make_a_Scene_Ddk0PAgwM4VLRbyY.json index b878085e..3b060c22 100644 --- a/src/packs/class-features/feature_Make_a_Scene_Ddk0PAgwM4VLRbyY.json +++ b/src/packs/class-features/feature_Make_a_Scene_Ddk0PAgwM4VLRbyY.json @@ -1,44 +1,44 @@ { - "name": "Make a Scene", - "type": "feature", - "_id": "Ddk0PAgwM4VLRbyY", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Make a Scene", + "type": "feature", + "_id": "Ddk0PAgwM4VLRbyY", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "action", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

Spend 3 Hope to temporarily Distract a target within Close range, giving them a -2 penalty to their Difficulty.

", + "effects": {}, + "actions": [], + "type": "class" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to temporarily Distract a target within Close range, giving them a -2 penalty to their Difficulty.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991384366, - "modifiedTime": 1747991421484, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!Ddk0PAgwM4VLRbyY" + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747991384366, + "modifiedTime": 1747991421484, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!Ddk0PAgwM4VLRbyY" } diff --git a/src/packs/class-features/feature_Rally_8uORDWrXtNFzA00U.json b/src/packs/class-features/feature_Rally_8uORDWrXtNFzA00U.json index d07fef13..177ee282 100644 --- a/src/packs/class-features/feature_Rally_8uORDWrXtNFzA00U.json +++ b/src/packs/class-features/feature_Rally_8uORDWrXtNFzA00U.json @@ -1,47 +1,47 @@ { - "name": "Rally", - "type": "feature", - "_id": "8uORDWrXtNFzA00U", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {}, - "value": "d6" - } + "name": "Rally", + "type": "feature", + "_id": "8uORDWrXtNFzA00U", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "action", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {}, + "value": "d6" + } + }, + "refreshData": { + "type": "session" + }, + "multiclass": null, + "disabled": false, + "description": "

Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice.

At level 5, your Rally Die increases to a d8.

", + "effects": {}, + "actions": [], + "type": "class" }, - "refreshData": { - "type": "session" + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "multiclass": null, - "disabled": false, - "description": "

Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice.

At level 5, your Rally Die increases to a d8.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991484460, - "modifiedTime": 1747991546148, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!8uORDWrXtNFzA00U" + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747991484460, + "modifiedTime": 1747991546148, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!8uORDWrXtNFzA00U" } diff --git a/src/packs/classes/class_Bard_yKicceU4LesCgKwF.json b/src/packs/classes/class_Bard_yKicceU4LesCgKwF.json index e63160b4..24e62064 100644 --- a/src/packs/classes/class_Bard_yKicceU4LesCgKwF.json +++ b/src/packs/classes/class_Bard_yKicceU4LesCgKwF.json @@ -1,104 +1,93 @@ { - "name": "Bard", - "type": "class", - "_id": "yKicceU4LesCgKwF", - "img": "systems/daggerheart/assets/icons/classes/bard.png", - "system": { - "domains": [ - "grace", - "codex" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 10, - "features": [ - { - "name": "Make a Scene", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.Ddk0PAgwM4VLRbyY" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Rally", - "uuid": "Compendium.daggerheart.class-features.Item.8uORDWrXtNFzA00U" - } - ], - "subclasses": [ - { - "name": "Troubadour", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.subclasses.Item.T1iBO8i0xRF5c8Q2" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Wordsmith", - "uuid": "Compendium.daggerheart.subclasses.Item.FXT65YDVWFy85EI0" - } - ], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", + "name": "Bard", + "type": "class", + "_id": "yKicceU4LesCgKwF", + "img": "systems/daggerheart/assets/icons/classes/bard.png", + "system": { + "domains": ["grace", "codex"], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 10, + "features": [ + { + "name": "Make a Scene", + "img": "icons/svg/item-bag.svg", + "uuid": "Compendium.daggerheart.class-features.Item.Ddk0PAgwM4VLRbyY" + }, + { + "img": "icons/svg/item-bag.svg", + "name": "Rally", + "uuid": "Compendium.daggerheart.class-features.Item.8uORDWrXtNFzA00U" + } + ], + "subclasses": [ + { + "name": "Troubadour", + "img": "icons/svg/item-bag.svg", + "uuid": "Compendium.daggerheart.subclasses.Item.T1iBO8i0xRF5c8Q2" + }, + { + "img": "icons/svg/item-bag.svg", + "name": "Wordsmith", + "uuid": "Compendium.daggerheart.subclasses.Item.FXT65YDVWFy85EI0" + } + ], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": { + "title": "", + "description": "" + } + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": { + "clothes": "", + "eyes": "", + "body": "", + "color": "", + "attitude": "" + }, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, "description": "" - } }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946810798, - "modifiedTime": 1747991996135, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!yKicceU4LesCgKwF" + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946810798, + "modifiedTime": 1747991996135, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!yKicceU4LesCgKwF" } diff --git a/src/packs/classes/class_Druid_HEh27jDQCJmnPsXH.json b/src/packs/classes/class_Druid_HEh27jDQCJmnPsXH.json index 0eaf393b..9fe99cf5 100644 --- a/src/packs/classes/class_Druid_HEh27jDQCJmnPsXH.json +++ b/src/packs/classes/class_Druid_HEh27jDQCJmnPsXH.json @@ -1,70 +1,62 @@ { - "name": "Druid", - "type": "class", - "_id": "HEh27jDQCJmnPsXH", - "img": "systems/daggerheart/assets/icons/classes/druid.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Druid", + "type": "class", + "_id": "HEh27jDQCJmnPsXH", + "img": "systems/daggerheart/assets/icons/classes/druid.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946822837, + "modifiedTime": 1747946826150, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946822837, - "modifiedTime": 1747946826150, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!HEh27jDQCJmnPsXH" + "_key": "!items!HEh27jDQCJmnPsXH" } diff --git a/src/packs/classes/class_Fighter_HPzaWaZBc6RvElKd.json b/src/packs/classes/class_Fighter_HPzaWaZBc6RvElKd.json index 505dc460..87d12a25 100644 --- a/src/packs/classes/class_Fighter_HPzaWaZBc6RvElKd.json +++ b/src/packs/classes/class_Fighter_HPzaWaZBc6RvElKd.json @@ -1,70 +1,62 @@ { - "name": "Fighter", - "type": "class", - "_id": "HPzaWaZBc6RvElKd", - "img": "systems/daggerheart/assets/icons/classes/fighter.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Fighter", + "type": "class", + "_id": "HPzaWaZBc6RvElKd", + "img": "systems/daggerheart/assets/icons/classes/fighter.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946839346, + "modifiedTime": 1747946842033, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946839346, - "modifiedTime": 1747946842033, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!HPzaWaZBc6RvElKd" + "_key": "!items!HPzaWaZBc6RvElKd" } diff --git a/src/packs/classes/class_Guardian_hyfigmrAoLxFPOW2.json b/src/packs/classes/class_Guardian_hyfigmrAoLxFPOW2.json index 0d2609db..a600f7cf 100644 --- a/src/packs/classes/class_Guardian_hyfigmrAoLxFPOW2.json +++ b/src/packs/classes/class_Guardian_hyfigmrAoLxFPOW2.json @@ -1,70 +1,62 @@ { - "name": "Guardian", - "type": "class", - "_id": "hyfigmrAoLxFPOW2", - "img": "systems/daggerheart/assets/icons/classes/guardian.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Guardian", + "type": "class", + "_id": "hyfigmrAoLxFPOW2", + "img": "systems/daggerheart/assets/icons/classes/guardian.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946853583, + "modifiedTime": 1747946858579, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946853583, - "modifiedTime": 1747946858579, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!hyfigmrAoLxFPOW2" + "_key": "!items!hyfigmrAoLxFPOW2" } diff --git a/src/packs/classes/class_Ranger_XoUsU9sCxEq8t3We.json b/src/packs/classes/class_Ranger_XoUsU9sCxEq8t3We.json index c4014272..7be391e0 100644 --- a/src/packs/classes/class_Ranger_XoUsU9sCxEq8t3We.json +++ b/src/packs/classes/class_Ranger_XoUsU9sCxEq8t3We.json @@ -1,70 +1,62 @@ { - "name": "Ranger", - "type": "class", - "_id": "XoUsU9sCxEq8t3We", - "img": "systems/daggerheart/assets/icons/classes/ranger.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Ranger", + "type": "class", + "_id": "XoUsU9sCxEq8t3We", + "img": "systems/daggerheart/assets/icons/classes/ranger.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946878680, + "modifiedTime": 1747946882593, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946878680, - "modifiedTime": 1747946882593, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!XoUsU9sCxEq8t3We" + "_key": "!items!XoUsU9sCxEq8t3We" } diff --git a/src/packs/classes/class_Rogue_V1a5AKCLe8qtoPlA.json b/src/packs/classes/class_Rogue_V1a5AKCLe8qtoPlA.json index 82c881e3..a4414e57 100644 --- a/src/packs/classes/class_Rogue_V1a5AKCLe8qtoPlA.json +++ b/src/packs/classes/class_Rogue_V1a5AKCLe8qtoPlA.json @@ -1,70 +1,62 @@ { - "name": "Rogue", - "type": "class", - "_id": "V1a5AKCLe8qtoPlA", - "img": "systems/daggerheart/assets/icons/classes/rogue.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Rogue", + "type": "class", + "_id": "V1a5AKCLe8qtoPlA", + "img": "systems/daggerheart/assets/icons/classes/rogue.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946902620, + "modifiedTime": 1747946906032, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946902620, - "modifiedTime": 1747946906032, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!V1a5AKCLe8qtoPlA" + "_key": "!items!V1a5AKCLe8qtoPlA" } diff --git a/src/packs/classes/class_Seraph_qW7yLIe87vd5bbto.json b/src/packs/classes/class_Seraph_qW7yLIe87vd5bbto.json index bca9a3b8..4b14c456 100644 --- a/src/packs/classes/class_Seraph_qW7yLIe87vd5bbto.json +++ b/src/packs/classes/class_Seraph_qW7yLIe87vd5bbto.json @@ -1,70 +1,62 @@ { - "name": "Seraph", - "type": "class", - "_id": "qW7yLIe87vd5bbto", - "img": "systems/daggerheart/assets/icons/classes/seraph.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Seraph", + "type": "class", + "_id": "qW7yLIe87vd5bbto", + "img": "systems/daggerheart/assets/icons/classes/seraph.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946916585, + "modifiedTime": 1747946919635, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946916585, - "modifiedTime": 1747946919635, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!qW7yLIe87vd5bbto" + "_key": "!items!qW7yLIe87vd5bbto" } diff --git a/src/packs/classes/class_Sorcerer_aacMxI9mOTmLO4cj.json b/src/packs/classes/class_Sorcerer_aacMxI9mOTmLO4cj.json index f7b42963..f4dbe534 100644 --- a/src/packs/classes/class_Sorcerer_aacMxI9mOTmLO4cj.json +++ b/src/packs/classes/class_Sorcerer_aacMxI9mOTmLO4cj.json @@ -1,70 +1,62 @@ { - "name": "Sorcerer", - "type": "class", - "_id": "aacMxI9mOTmLO4cj", - "img": "systems/daggerheart/assets/icons/classes/sorcerer.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Sorcerer", + "type": "class", + "_id": "aacMxI9mOTmLO4cj", + "img": "systems/daggerheart/assets/icons/classes/sorcerer.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946940010, + "modifiedTime": 1747946943869, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946940010, - "modifiedTime": 1747946943869, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!aacMxI9mOTmLO4cj" + "_key": "!items!aacMxI9mOTmLO4cj" } diff --git a/src/packs/classes/class_Warlock_kSSIqmgxFTm1Xr9s.json b/src/packs/classes/class_Warlock_kSSIqmgxFTm1Xr9s.json index 0f4cd617..7efe26f8 100644 --- a/src/packs/classes/class_Warlock_kSSIqmgxFTm1Xr9s.json +++ b/src/packs/classes/class_Warlock_kSSIqmgxFTm1Xr9s.json @@ -1,70 +1,62 @@ { - "name": "Warlock", - "type": "class", - "_id": "kSSIqmgxFTm1Xr9s", - "img": "systems/daggerheart/assets/icons/classes/warlock.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Warlock", + "type": "class", + "_id": "kSSIqmgxFTm1Xr9s", + "img": "systems/daggerheart/assets/icons/classes/warlock.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946952119, + "modifiedTime": 1747946955843, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946952119, - "modifiedTime": 1747946955843, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!kSSIqmgxFTm1Xr9s" + "_key": "!items!kSSIqmgxFTm1Xr9s" } diff --git a/src/packs/classes/class_Warrior_ishqAXCT8xLgEbBp.json b/src/packs/classes/class_Warrior_ishqAXCT8xLgEbBp.json index bc4f48bb..0a727140 100644 --- a/src/packs/classes/class_Warrior_ishqAXCT8xLgEbBp.json +++ b/src/packs/classes/class_Warrior_ishqAXCT8xLgEbBp.json @@ -1,70 +1,62 @@ { - "name": "Warrior", - "type": "class", - "_id": "ishqAXCT8xLgEbBp", - "img": "systems/daggerheart/assets/icons/classes/warrior.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Warrior", + "type": "class", + "_id": "ishqAXCT8xLgEbBp", + "img": "systems/daggerheart/assets/icons/classes/warrior.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946965065, + "modifiedTime": 1747946967544, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946965065, - "modifiedTime": 1747946967544, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!ishqAXCT8xLgEbBp" + "_key": "!items!ishqAXCT8xLgEbBp" } diff --git a/src/packs/classes/class_Wizard_uhj2mZPOC8nbIMTy.json b/src/packs/classes/class_Wizard_uhj2mZPOC8nbIMTy.json index af0ea4cb..01366b68 100644 --- a/src/packs/classes/class_Wizard_uhj2mZPOC8nbIMTy.json +++ b/src/packs/classes/class_Wizard_uhj2mZPOC8nbIMTy.json @@ -1,70 +1,62 @@ { - "name": "Wizard", - "type": "class", - "_id": "uhj2mZPOC8nbIMTy", - "img": "systems/daggerheart/assets/icons/classes/wizard.png", - "system": { - "domains": [], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 + "name": "Wizard", + "type": "class", + "_id": "uhj2mZPOC8nbIMTy", + "img": "systems/daggerheart/assets/icons/classes/wizard.png", + "system": { + "domains": [], + "classItems": [], + "damageThresholds": { + "minor": 0, + "major": 0, + "severe": 0 + }, + "evasion": 0, + "features": [], + "subclasses": [], + "inventory": { + "take": [], + "choiceA": [], + "choiceB": [], + "extra": null + }, + "characterGuide": { + "suggestedTraits": { + "agility": 0, + "strength": 0, + "finesse": 0, + "instinct": 0, + "presence": 0, + "knowledge": 0 + }, + "suggestedPrimaryWeapon": null, + "suggestedSecondaryWeapon": null, + "suggestedArmor": null, + "characterDescription": {}, + "backgroundQuestions": ["", "", ""], + "connections": ["", "", ""] + }, + "multiclass": null, + "description": "" }, - "evasion": 0, - "features": [], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": null + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 0, - "finesse": 0, - "instinct": 0, - "presence": 0, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": {}, - "backgroundQuestions": [ - "", - "", - "" - ], - "connections": [ - "", - "", - "" - ] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747946791380, + "modifiedTime": 1747946799247, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946791380, - "modifiedTime": 1747946799247, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!uhj2mZPOC8nbIMTy" + "_key": "!items!uhj2mZPOC8nbIMTy" } diff --git a/src/packs/communities/community_Highborne_8AcV556QwoIzkkea.json b/src/packs/communities/community_Highborne_8AcV556QwoIzkkea.json index f37d81f5..252ccdbf 100644 --- a/src/packs/communities/community_Highborne_8AcV556QwoIzkkea.json +++ b/src/packs/communities/community_Highborne_8AcV556QwoIzkkea.json @@ -1,36 +1,36 @@ { - "name": "Highborne", - "type": "community", - "_id": "8AcV556QwoIzkkea", - "img": "systems/daggerheart/assets/icons/communities/highborne.png", - "system": { - "description": "

Being part of a highborne community means you're accustomed to life of elegance, opulence, and prestige within the upper echelons of society. Traditionally, members of a highborne community possess incredible material wealth. While this can take a variety of forms depending on the community—including gold and other minerals, land, or controlling the means of production—this status always comes with power and influence. Highborne place great value on titles and possessions, and there is little social mobility within their ranks. Members of a highborne community often control the political and economic status of the areas in which they live due to their ability to influence people and the economy with their substantial wealth. The health and safety of the less affluent people who live in these locations often hinges on the ability of this highborne ruling class to prioritize the well-being of their subjects over profit.

Highborne are often amiable, candid, conniving, enterprising, ostentatious, and unflappable.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Privilege", - "uuid": "Compendium.world.community-features.Item.WoMZCTnDcK8GPSh1" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940320728, - "modifiedTime": 1747990568291, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!8AcV556QwoIzkkea" + "name": "Highborne", + "type": "community", + "_id": "8AcV556QwoIzkkea", + "img": "systems/daggerheart/assets/icons/communities/highborne.png", + "system": { + "description": "

Being part of a highborne community means you're accustomed to life of elegance, opulence, and prestige within the upper echelons of society. Traditionally, members of a highborne community possess incredible material wealth. While this can take a variety of forms depending on the community—including gold and other minerals, land, or controlling the means of production—this status always comes with power and influence. Highborne place great value on titles and possessions, and there is little social mobility within their ranks. Members of a highborne community often control the political and economic status of the areas in which they live due to their ability to influence people and the economy with their substantial wealth. The health and safety of the less affluent people who live in these locations often hinges on the ability of this highborne ruling class to prioritize the well-being of their subjects over profit.

Highborne are often amiable, candid, conniving, enterprising, ostentatious, and unflappable.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Privilege", + "uuid": "Compendium.world.community-features.Item.WoMZCTnDcK8GPSh1" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940320728, + "modifiedTime": 1747990568291, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!8AcV556QwoIzkkea" } diff --git a/src/packs/communities/community_Loreborne_fgJHuCdoyXX4Q84O.json b/src/packs/communities/community_Loreborne_fgJHuCdoyXX4Q84O.json index b6132b3f..eeceb3b3 100644 --- a/src/packs/communities/community_Loreborne_fgJHuCdoyXX4Q84O.json +++ b/src/packs/communities/community_Loreborne_fgJHuCdoyXX4Q84O.json @@ -1,36 +1,36 @@ { - "name": "Loreborne", - "type": "community", - "_id": "fgJHuCdoyXX4Q84O", - "img": "systems/daggerheart/assets/icons/communities/loreborne.png", - "system": { - "description": "

Being part of a loreborne community means you’re from a society that favors strong academic or political prowess. Loreborne communities highly value knowledge, frequently in the form of historical preservation, political advancement, scientific study, skill development, or lore and mythology compilation. Most members of these communities research in institutions built in bastions of civilization, while some eclectic few thrive in gathering information from the natural world. Some may be isolationists, operating in smaller enclaves, schools, or guilds and following their own unique ethos. Others still wield their knowledge on a larger scale, making deft political maneuvers across governmental landscapes.

Loreborne are often direct, eloquent, inquisitive, patient,

rhapsodic, and witty.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Well-Read", - "uuid": "Compendium.world.community-features.Item.MUfVlf8hoJ3HZidv" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940300210, - "modifiedTime": 1747990671092, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!fgJHuCdoyXX4Q84O" + "name": "Loreborne", + "type": "community", + "_id": "fgJHuCdoyXX4Q84O", + "img": "systems/daggerheart/assets/icons/communities/loreborne.png", + "system": { + "description": "

Being part of a loreborne community means you’re from a society that favors strong academic or political prowess. Loreborne communities highly value knowledge, frequently in the form of historical preservation, political advancement, scientific study, skill development, or lore and mythology compilation. Most members of these communities research in institutions built in bastions of civilization, while some eclectic few thrive in gathering information from the natural world. Some may be isolationists, operating in smaller enclaves, schools, or guilds and following their own unique ethos. Others still wield their knowledge on a larger scale, making deft political maneuvers across governmental landscapes.

Loreborne are often direct, eloquent, inquisitive, patient,

rhapsodic, and witty.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Well-Read", + "uuid": "Compendium.world.community-features.Item.MUfVlf8hoJ3HZidv" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940300210, + "modifiedTime": 1747990671092, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!fgJHuCdoyXX4Q84O" } diff --git a/src/packs/communities/community_Orderborne_Cg39GoSa6lxhXndW.json b/src/packs/communities/community_Orderborne_Cg39GoSa6lxhXndW.json index 01936248..5d0011d2 100644 --- a/src/packs/communities/community_Orderborne_Cg39GoSa6lxhXndW.json +++ b/src/packs/communities/community_Orderborne_Cg39GoSa6lxhXndW.json @@ -1,36 +1,36 @@ { - "name": "Orderborne", - "type": "community", - "_id": "Cg39GoSa6lxhXndW", - "img": "systems/daggerheart/assets/icons/communities/orderborne.png", - "system": { - "description": "

Being part of an orderborne community means you’re from a collective that focuses on discipline or faith, and you uphold a set of principles that reflect your experience there. Orderborne are frequently some of the most powerful among the surrounding communities.

By aligning the members of their society around a common value or goal, such as a god, doctrine, ethos, or even a shared business or trade, the ruling bodies of these enclaves are able to mobilize larger populations with less effort.

While orderborne communities take a variety of forms—some even profoundly pacifistic—perhaps the most feared are those that structure themselves around military prowess. In such a case, it’s not uncommon for orderborne to provide soldiers for hire to other cities or countries.

Orderborne are often ambitious, benevolent, pensive, prudent, sardonic, and stoic.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Dedicated", - "uuid": "Compendium.world.community-features.Item.b7LmL7ti1gL5kfGq" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940332147, - "modifiedTime": 1747990820386, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!Cg39GoSa6lxhXndW" + "name": "Orderborne", + "type": "community", + "_id": "Cg39GoSa6lxhXndW", + "img": "systems/daggerheart/assets/icons/communities/orderborne.png", + "system": { + "description": "

Being part of an orderborne community means you’re from a collective that focuses on discipline or faith, and you uphold a set of principles that reflect your experience there. Orderborne are frequently some of the most powerful among the surrounding communities.

By aligning the members of their society around a common value or goal, such as a god, doctrine, ethos, or even a shared business or trade, the ruling bodies of these enclaves are able to mobilize larger populations with less effort.

While orderborne communities take a variety of forms—some even profoundly pacifistic—perhaps the most feared are those that structure themselves around military prowess. In such a case, it’s not uncommon for orderborne to provide soldiers for hire to other cities or countries.

Orderborne are often ambitious, benevolent, pensive, prudent, sardonic, and stoic.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Dedicated", + "uuid": "Compendium.world.community-features.Item.b7LmL7ti1gL5kfGq" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940332147, + "modifiedTime": 1747990820386, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!Cg39GoSa6lxhXndW" } diff --git a/src/packs/communities/community_Ridgeborne_DAQoNvVlc9w7NmZd.json b/src/packs/communities/community_Ridgeborne_DAQoNvVlc9w7NmZd.json index 39ef2693..a3e5e769 100644 --- a/src/packs/communities/community_Ridgeborne_DAQoNvVlc9w7NmZd.json +++ b/src/packs/communities/community_Ridgeborne_DAQoNvVlc9w7NmZd.json @@ -1,36 +1,36 @@ { - "name": "Ridgeborne", - "type": "community", - "_id": "DAQoNvVlc9w7NmZd", - "img": "systems/daggerheart/assets/icons/communities/ridgeborne.png", - "system": { - "description": "

Being part of a ridgeborne community means you’ve called the rocky peaks and sharp cliffs of the mountainside home. Those who’ve lived in the mountains often consider themselves hardier than most because they’ve thrived among the most dangerous terrain many continents have to offer. These groups are adept at adaptation, developing unique technologies and equipment to move both people and products across difficult terrain. As such, ridgeborne grow up scrambling and climbing, making them sturdy and strong-willed. Ridgeborne localities appear in a variety of forms—some cities carve out entire cliff faces, others construct castles of stone, and still more live in small homes on windblown peaks. Outside forces often struggle to attack ridgeborne groups, as the small militias and large military forces of the mountains are adept at utilizing their high-ground advantage.

Ridgeborne are often bold, hardy, indomitable, loyal, reserved, and stubborn.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Steady", - "uuid": "Compendium.world.community-features.Item.hKGv54dst9crq3Sw" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940346633, - "modifiedTime": 1747990891669, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!DAQoNvVlc9w7NmZd" + "name": "Ridgeborne", + "type": "community", + "_id": "DAQoNvVlc9w7NmZd", + "img": "systems/daggerheart/assets/icons/communities/ridgeborne.png", + "system": { + "description": "

Being part of a ridgeborne community means you’ve called the rocky peaks and sharp cliffs of the mountainside home. Those who’ve lived in the mountains often consider themselves hardier than most because they’ve thrived among the most dangerous terrain many continents have to offer. These groups are adept at adaptation, developing unique technologies and equipment to move both people and products across difficult terrain. As such, ridgeborne grow up scrambling and climbing, making them sturdy and strong-willed. Ridgeborne localities appear in a variety of forms—some cities carve out entire cliff faces, others construct castles of stone, and still more live in small homes on windblown peaks. Outside forces often struggle to attack ridgeborne groups, as the small militias and large military forces of the mountains are adept at utilizing their high-ground advantage.

Ridgeborne are often bold, hardy, indomitable, loyal, reserved, and stubborn.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Steady", + "uuid": "Compendium.world.community-features.Item.hKGv54dst9crq3Sw" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940346633, + "modifiedTime": 1747990891669, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!DAQoNvVlc9w7NmZd" } diff --git a/src/packs/communities/community_Seaborne_ivrXToGxyuVdqZtG.json b/src/packs/communities/community_Seaborne_ivrXToGxyuVdqZtG.json index a2c10f39..ebebca78 100644 --- a/src/packs/communities/community_Seaborne_ivrXToGxyuVdqZtG.json +++ b/src/packs/communities/community_Seaborne_ivrXToGxyuVdqZtG.json @@ -1,36 +1,36 @@ { - "name": "Seaborne", - "type": "community", - "_id": "ivrXToGxyuVdqZtG", - "img": "systems/daggerheart/assets/icons/communities/seaborne.png", - "system": { - "description": "

Being part of a seaborne community means you lived on or near a large body of water. Seaborne communities are built, both physically and culturally, around the specific waters they call home.

Some of these groups live along the shore, constructing ports for locals and travelers alike. These harbors function as centers of commerce, tourist attractions, or even just a safe place to lay down one’s head after weeks of travel. Other seaborne live on the water in small boats or large ships, with the idea of “home” comprising a ship and its crew, rather than any one landmass.

No matter their exact location, seaborne communities are closely tied to the ocean tides and the creatures who inhabit them. Seaborne learn to fish at a young age, and train from birth to hold their breath and swim in even the most tumultuous waters. Individuals from these groups are highly sought after for their sailing skills, and many become captains of vessels, whether within their own community, working for another, or even at the helm of a powerful naval operation.

Seaborne are often candid, cooperative, exuberant, fierce, resolute, and weathered.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Know the Tide", - "uuid": "Compendium.world.community-features.Item.coBcBEFpXgtxD1Jt" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940375520, - "modifiedTime": 1747990980804, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!ivrXToGxyuVdqZtG" + "name": "Seaborne", + "type": "community", + "_id": "ivrXToGxyuVdqZtG", + "img": "systems/daggerheart/assets/icons/communities/seaborne.png", + "system": { + "description": "

Being part of a seaborne community means you lived on or near a large body of water. Seaborne communities are built, both physically and culturally, around the specific waters they call home.

Some of these groups live along the shore, constructing ports for locals and travelers alike. These harbors function as centers of commerce, tourist attractions, or even just a safe place to lay down one’s head after weeks of travel. Other seaborne live on the water in small boats or large ships, with the idea of “home” comprising a ship and its crew, rather than any one landmass.

No matter their exact location, seaborne communities are closely tied to the ocean tides and the creatures who inhabit them. Seaborne learn to fish at a young age, and train from birth to hold their breath and swim in even the most tumultuous waters. Individuals from these groups are highly sought after for their sailing skills, and many become captains of vessels, whether within their own community, working for another, or even at the helm of a powerful naval operation.

Seaborne are often candid, cooperative, exuberant, fierce, resolute, and weathered.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Know the Tide", + "uuid": "Compendium.world.community-features.Item.coBcBEFpXgtxD1Jt" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940375520, + "modifiedTime": 1747990980804, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!ivrXToGxyuVdqZtG" } diff --git a/src/packs/communities/community_Slyborne_rwsUCLenOkE9CS7v.json b/src/packs/communities/community_Slyborne_rwsUCLenOkE9CS7v.json index ae65ceed..6f03ed3f 100644 --- a/src/packs/communities/community_Slyborne_rwsUCLenOkE9CS7v.json +++ b/src/packs/communities/community_Slyborne_rwsUCLenOkE9CS7v.json @@ -1,36 +1,36 @@ { - "name": "Slyborne", - "type": "community", - "_id": "rwsUCLenOkE9CS7v", - "img": "systems/daggerheart/assets/icons/communities/slyborne.png", - "system": { - "description": "

Being part of a slyborne community means you come from a group that operates outside the law, including all manner of criminals, grifters, and con artists. Members of slyborne communities are brought together by their disreputable goals and their clever means of achieving them. Many people in these communities have an array of unscrupulous skills: forging, thievery, smuggling, and violence. People of any social class can be slyborne, from those who have garnered vast wealth and influence to those without a coin to their name. To the outside eye, slyborne might appear to be ruffians with no loyalty, but these communities possess some of the strictest codes of honor which, when broken, can result in a terrifying end for the transgressor.

Slyborne are often calculating, clever, formidable, perceptive, shrewd, and tenacious.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Scoundrel", - "uuid": "Compendium.world.community-features.Item.p2PipVUiMt0Cy0ws" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940388725, - "modifiedTime": 1747991089836, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!rwsUCLenOkE9CS7v" + "name": "Slyborne", + "type": "community", + "_id": "rwsUCLenOkE9CS7v", + "img": "systems/daggerheart/assets/icons/communities/slyborne.png", + "system": { + "description": "

Being part of a slyborne community means you come from a group that operates outside the law, including all manner of criminals, grifters, and con artists. Members of slyborne communities are brought together by their disreputable goals and their clever means of achieving them. Many people in these communities have an array of unscrupulous skills: forging, thievery, smuggling, and violence. People of any social class can be slyborne, from those who have garnered vast wealth and influence to those without a coin to their name. To the outside eye, slyborne might appear to be ruffians with no loyalty, but these communities possess some of the strictest codes of honor which, when broken, can result in a terrifying end for the transgressor.

Slyborne are often calculating, clever, formidable, perceptive, shrewd, and tenacious.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Scoundrel", + "uuid": "Compendium.world.community-features.Item.p2PipVUiMt0Cy0ws" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940388725, + "modifiedTime": 1747991089836, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!rwsUCLenOkE9CS7v" } diff --git a/src/packs/communities/community_Underborne_CXQN2zcQUIjUOx1i.json b/src/packs/communities/community_Underborne_CXQN2zcQUIjUOx1i.json index ab2f3b19..a0f99f40 100644 --- a/src/packs/communities/community_Underborne_CXQN2zcQUIjUOx1i.json +++ b/src/packs/communities/community_Underborne_CXQN2zcQUIjUOx1i.json @@ -1,36 +1,36 @@ { - "name": "Underborne", - "type": "community", - "_id": "CXQN2zcQUIjUOx1i", - "img": "systems/daggerheart/assets/icons/communities/underborne.png", - "system": { - "description": "

Being part of an underborne community means you’re from a subterranean society. Many underborne live right beneath the cities and villages of other collectives, while some live much deeper. These communities range from small family groups in burrows to massive metropolises in caverns of stone. In many locales, underborne are recognized for their incredible boldness and skill that enable great feats of architecture and engineering. Underborne are regularly hired for their bravery, as even the least daring among them has likely encountered formidable belowground beasts, and learning to dispatch such creatures is common practice amongst these societies.

Because of the dangers of their environment, many underborne communities develop unique nonverbal languages that prove equally useful on the surface.

Underborne are often composed, elusive, indomitable, innovative, resourceful, and unpretentious.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Low-Light Living", - "uuid": "Compendium.world.community-features.Item.p12Le1M3DPWXa0vh" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940403160, - "modifiedTime": 1747991158174, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!CXQN2zcQUIjUOx1i" + "name": "Underborne", + "type": "community", + "_id": "CXQN2zcQUIjUOx1i", + "img": "systems/daggerheart/assets/icons/communities/underborne.png", + "system": { + "description": "

Being part of an underborne community means you’re from a subterranean society. Many underborne live right beneath the cities and villages of other collectives, while some live much deeper. These communities range from small family groups in burrows to massive metropolises in caverns of stone. In many locales, underborne are recognized for their incredible boldness and skill that enable great feats of architecture and engineering. Underborne are regularly hired for their bravery, as even the least daring among them has likely encountered formidable belowground beasts, and learning to dispatch such creatures is common practice amongst these societies.

Because of the dangers of their environment, many underborne communities develop unique nonverbal languages that prove equally useful on the surface.

Underborne are often composed, elusive, indomitable, innovative, resourceful, and unpretentious.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Low-Light Living", + "uuid": "Compendium.world.community-features.Item.p12Le1M3DPWXa0vh" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940403160, + "modifiedTime": 1747991158174, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!CXQN2zcQUIjUOx1i" } diff --git a/src/packs/communities/community_Wanderborne_DHB5uSzbBeJCJuvC.json b/src/packs/communities/community_Wanderborne_DHB5uSzbBeJCJuvC.json index 0e73f066..b5407762 100644 --- a/src/packs/communities/community_Wanderborne_DHB5uSzbBeJCJuvC.json +++ b/src/packs/communities/community_Wanderborne_DHB5uSzbBeJCJuvC.json @@ -1,36 +1,36 @@ { - "name": "Wanderborne", - "type": "community", - "_id": "DHB5uSzbBeJCJuvC", - "img": "systems/daggerheart/assets/icons/communities/wanderborne.png", - "system": { - "description": "

Being part of a wanderborne community means you’ve lived as a nomad, forgoing a permanent home and experiencing a wide variety of cultures. Unlike many communities that are defined by their locale, wanderborne are defined by their traveling lifestyle. Because of their frequent migration, wanderborne put less value on the accumulation of material possessions in favor of acquiring information, skills, and connections. While some wanderborne are allied by a common ethos, such as a religion or a set of political or economic values, others come together after shared tragedy, such as the loss of their home or land. No matter the reason, the dangers posed by life on the road and the choice to continue down that road together mean that wanderborne are known for their unwavering loyalty.

Wanderborne are often inscrutable, magnanimous, mirthful, reliable, savvy, and unorthodox.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Nomadic Pack", - "uuid": "Compendium.world.community-features.Item.NeuBdFDpV0HTzOIM" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940414913, - "modifiedTime": 1747991238462, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!DHB5uSzbBeJCJuvC" + "name": "Wanderborne", + "type": "community", + "_id": "DHB5uSzbBeJCJuvC", + "img": "systems/daggerheart/assets/icons/communities/wanderborne.png", + "system": { + "description": "

Being part of a wanderborne community means you’ve lived as a nomad, forgoing a permanent home and experiencing a wide variety of cultures. Unlike many communities that are defined by their locale, wanderborne are defined by their traveling lifestyle. Because of their frequent migration, wanderborne put less value on the accumulation of material possessions in favor of acquiring information, skills, and connections. While some wanderborne are allied by a common ethos, such as a religion or a set of political or economic values, others come together after shared tragedy, such as the loss of their home or land. No matter the reason, the dangers posed by life on the road and the choice to continue down that road together mean that wanderborne are known for their unwavering loyalty.

Wanderborne are often inscrutable, magnanimous, mirthful, reliable, savvy, and unorthodox.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Nomadic Pack", + "uuid": "Compendium.world.community-features.Item.NeuBdFDpV0HTzOIM" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940414913, + "modifiedTime": 1747991238462, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!DHB5uSzbBeJCJuvC" } diff --git a/src/packs/communities/community_Wildborne_jUzXIVyBx0mlIFWa.json b/src/packs/communities/community_Wildborne_jUzXIVyBx0mlIFWa.json index a481b5a4..5ca65c1c 100644 --- a/src/packs/communities/community_Wildborne_jUzXIVyBx0mlIFWa.json +++ b/src/packs/communities/community_Wildborne_jUzXIVyBx0mlIFWa.json @@ -1,36 +1,36 @@ { - "name": "Wildborne", - "type": "community", - "_id": "jUzXIVyBx0mlIFWa", - "img": "systems/daggerheart/assets/icons/communities/wildborne.png", - "system": { - "description": "

Being part of a wildborne community means you lived deep within the forest. Wildborne communities are defined by their dedication to the conservation of their homelands, and many have strong religious or cultural ties to the fauna they live among.

This results in unique architectural and technological advancements that favor sustainability over short-term, high-yield results.

It is a hallmark of wildborne societies to integrate their villages and cities with the natural environment and avoid disturbing the lives of the plants and animals. While some construct their lodgings high in the branches of trees, others establish their homes on the ground beneath the forest canopy. It’s not uncommon for wildborne to remain reclusive and hidden within their woodland homes.

Wildborne are often hardy, loyal, nurturing, reclusive, sagacious, and vibrant.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Lightfoot", - "uuid": "Compendium.world.community-features.Item.4VaugxNAouI7SKKz" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940432585, - "modifiedTime": 1747991300734, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!jUzXIVyBx0mlIFWa" + "name": "Wildborne", + "type": "community", + "_id": "jUzXIVyBx0mlIFWa", + "img": "systems/daggerheart/assets/icons/communities/wildborne.png", + "system": { + "description": "

Being part of a wildborne community means you lived deep within the forest. Wildborne communities are defined by their dedication to the conservation of their homelands, and many have strong religious or cultural ties to the fauna they live among.

This results in unique architectural and technological advancements that favor sustainability over short-term, high-yield results.

It is a hallmark of wildborne societies to integrate their villages and cities with the natural environment and avoid disturbing the lives of the plants and animals. While some construct their lodgings high in the branches of trees, others establish their homes on the ground beneath the forest canopy. It’s not uncommon for wildborne to remain reclusive and hidden within their woodland homes.

Wildborne are often hardy, loyal, nurturing, reclusive, sagacious, and vibrant.

", + "abilities": [ + { + "img": "icons/svg/item-bag.svg", + "name": "Lightfoot", + "uuid": "Compendium.world.community-features.Item.4VaugxNAouI7SKKz" + } + ] + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747940432585, + "modifiedTime": 1747991300734, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" + }, + "_key": "!items!jUzXIVyBx0mlIFWa" } diff --git a/src/packs/community-features/feature_Dedicated_ZiBpJxtDSsh6wY3h.json b/src/packs/community-features/feature_Dedicated_ZiBpJxtDSsh6wY3h.json index 0655c73e..54c15b84 100644 --- a/src/packs/community-features/feature_Dedicated_ZiBpJxtDSsh6wY3h.json +++ b/src/packs/community-features/feature_Dedicated_ZiBpJxtDSsh6wY3h.json @@ -1,46 +1,46 @@ { - "name": "Dedicated", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "input", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {}, - "value": "d20" - } + "name": "Dedicated", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "action", + "featureType": { + "type": "input", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {}, + "value": "d20" + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

Record three sayings or values your upbringing instilled in you. Once per rest, when you describe how you’re embodying one of these principles through your current action, you can roll a d20 as your Hope Die.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Record three sayings or values your upbringing instilled in you. Once per rest, when you describe how you’re embodying one of these principles through your current action, you can roll a d20 as your Hope Die.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008847578, - "modifiedTime": 1748008847578, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "ZiBpJxtDSsh6wY3h", - "sort": 0, - "_key": "!items!ZiBpJxtDSsh6wY3h" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008847578, + "modifiedTime": 1748008847578, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "ZiBpJxtDSsh6wY3h", + "sort": 0, + "_key": "!items!ZiBpJxtDSsh6wY3h" } diff --git a/src/packs/community-features/feature_Know_the_Tide_0mdoYz7uZNWCcK5Z.json b/src/packs/community-features/feature_Know_the_Tide_0mdoYz7uZNWCcK5Z.json index a23aaa00..846c955c 100644 --- a/src/packs/community-features/feature_Know_the_Tide_0mdoYz7uZNWCcK5Z.json +++ b/src/packs/community-features/feature_Know_the_Tide_0mdoYz7uZNWCcK5Z.json @@ -1,45 +1,45 @@ { - "name": "Know the Tide", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Know the Tide", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

You can sense the ebb and flow of life. When you roll with Fear, place a token on your community card. You can hold a number of tokens equal to your level. Before you make an action roll, you can spend any number of these tokens to gain a +1 bonus to the roll for each token spent. At the end of each session, clear all unspent tokens.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You can sense the ebb and flow of life. When you roll with Fear, place a token on your community card. You can hold a number of tokens equal to your level. Before you make an action roll, you can spend any number of these tokens to gain a +1 bonus to the roll for each token spent. At the end of each session, clear all unspent tokens.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008848585, - "modifiedTime": 1748008848585, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "0mdoYz7uZNWCcK5Z", - "sort": 0, - "_key": "!items!0mdoYz7uZNWCcK5Z" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008848585, + "modifiedTime": 1748008848585, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "0mdoYz7uZNWCcK5Z", + "sort": 0, + "_key": "!items!0mdoYz7uZNWCcK5Z" } diff --git a/src/packs/community-features/feature_Lightfoot_LY9c4DCgMcB1uEiv.json b/src/packs/community-features/feature_Lightfoot_LY9c4DCgMcB1uEiv.json index faffa9fe..1b1d5684 100644 --- a/src/packs/community-features/feature_Lightfoot_LY9c4DCgMcB1uEiv.json +++ b/src/packs/community-features/feature_Lightfoot_LY9c4DCgMcB1uEiv.json @@ -1,45 +1,45 @@ { - "name": "Lightfoot", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Lightfoot", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

Your movement is naturally silent. You have advantage on rolls to move without being heard.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Your movement is naturally silent. You have advantage on rolls to move without being heard.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008849798, - "modifiedTime": 1748008849798, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "LY9c4DCgMcB1uEiv", - "sort": 0, - "_key": "!items!LY9c4DCgMcB1uEiv" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008849798, + "modifiedTime": 1748008849798, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "LY9c4DCgMcB1uEiv", + "sort": 0, + "_key": "!items!LY9c4DCgMcB1uEiv" } diff --git a/src/packs/community-features/feature_Low_Light_Living_hX85YvTQcMzc25hW.json b/src/packs/community-features/feature_Low_Light_Living_hX85YvTQcMzc25hW.json index 6d5bb2d7..1dec67fc 100644 --- a/src/packs/community-features/feature_Low_Light_Living_hX85YvTQcMzc25hW.json +++ b/src/packs/community-features/feature_Low_Light_Living_hX85YvTQcMzc25hW.json @@ -1,45 +1,45 @@ { - "name": "Low-Light Living", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Low-Light Living", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

When you’re in an area with low light or heavy shadow, you have advantage on rolls to hide, investigate, or perceive details within that area.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

When you’re in an area with low light or heavy shadow, you have advantage on rolls to hide, investigate, or perceive details within that area.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008850934, - "modifiedTime": 1748008850934, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "hX85YvTQcMzc25hW", - "sort": 0, - "_key": "!items!hX85YvTQcMzc25hW" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008850934, + "modifiedTime": 1748008850934, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "hX85YvTQcMzc25hW", + "sort": 0, + "_key": "!items!hX85YvTQcMzc25hW" } diff --git a/src/packs/community-features/feature_Nomadic_Pack_o3Q88Rws9Eb5ae5D.json b/src/packs/community-features/feature_Nomadic_Pack_o3Q88Rws9Eb5ae5D.json index 2af9f177..bcf78f86 100644 --- a/src/packs/community-features/feature_Nomadic_Pack_o3Q88Rws9Eb5ae5D.json +++ b/src/packs/community-features/feature_Nomadic_Pack_o3Q88Rws9Eb5ae5D.json @@ -1,45 +1,45 @@ { - "name": "Nomadic Pack", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Nomadic Pack", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

Add a Nomadic Pack to your inventory. Once per session, you can spend a Hope to reach into this pack and pull out a mundane item that’s useful to your situation. Work with the GM to figure out what item you take out.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Add a Nomadic Pack to your inventory. Once per session, you can spend a Hope to reach into this pack and pull out a mundane item that’s useful to your situation. Work with the GM to figure out what item you take out.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008852219, - "modifiedTime": 1748008852219, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "o3Q88Rws9Eb5ae5D", - "sort": 0, - "_key": "!items!o3Q88Rws9Eb5ae5D" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008852219, + "modifiedTime": 1748008852219, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "o3Q88Rws9Eb5ae5D", + "sort": 0, + "_key": "!items!o3Q88Rws9Eb5ae5D" } diff --git a/src/packs/community-features/feature_Privilege_AgJiUvad5tgeam57.json b/src/packs/community-features/feature_Privilege_AgJiUvad5tgeam57.json index 200ccb61..504dd1fb 100644 --- a/src/packs/community-features/feature_Privilege_AgJiUvad5tgeam57.json +++ b/src/packs/community-features/feature_Privilege_AgJiUvad5tgeam57.json @@ -1,45 +1,45 @@ { - "name": "Privilege", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Privilege", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

You have advantage on rolls to consort with nobles, negotiate prices, or leverage your reputation to get what you want.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls to consort with nobles, negotiate prices, or leverage your reputation to get what you want.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008853598, - "modifiedTime": 1748008853598, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "AgJiUvad5tgeam57", - "sort": 0, - "_key": "!items!AgJiUvad5tgeam57" + "effects": [], + "folder": null, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008853598, + "modifiedTime": 1748008853598, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "_id": "AgJiUvad5tgeam57", + "sort": 0, + "_key": "!items!AgJiUvad5tgeam57" } diff --git a/src/packs/community-features/feature_Scoundrel_5BUCiSPswsiB0RDW.json b/src/packs/community-features/feature_Scoundrel_5BUCiSPswsiB0RDW.json index 13eb1e52..ee22fb4d 100644 --- a/src/packs/community-features/feature_Scoundrel_5BUCiSPswsiB0RDW.json +++ b/src/packs/community-features/feature_Scoundrel_5BUCiSPswsiB0RDW.json @@ -1,45 +1,45 @@ { - "name": "Scoundrel", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Scoundrel", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

You have advantage on rolls to negotiate with criminals, detect lies, or find a safe place to hide.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls to negotiate with criminals, detect lies, or find a safe place to hide.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008855001, - "modifiedTime": 1748008855001, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "5BUCiSPswsiB0RDW", - "sort": 0, - "_key": "!items!5BUCiSPswsiB0RDW" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008855001, + "modifiedTime": 1748008855001, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "5BUCiSPswsiB0RDW", + "sort": 0, + "_key": "!items!5BUCiSPswsiB0RDW" } diff --git a/src/packs/community-features/feature_Steady_Oky51ziMZp6bbuUQ.json b/src/packs/community-features/feature_Steady_Oky51ziMZp6bbuUQ.json index 70f4c783..7074b134 100644 --- a/src/packs/community-features/feature_Steady_Oky51ziMZp6bbuUQ.json +++ b/src/packs/community-features/feature_Steady_Oky51ziMZp6bbuUQ.json @@ -1,45 +1,45 @@ { - "name": "Steady", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } + "name": "Steady", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

You have advantage on rolls to traverse dangerous cliffs and ledges, navigate harsh environments, and use your survival knowledge.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls to traverse dangerous cliffs and ledges, navigate harsh environments, and use your survival knowledge.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008856287, - "modifiedTime": 1748008856287, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "Oky51ziMZp6bbuUQ", - "sort": 0, - "_key": "!items!Oky51ziMZp6bbuUQ" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008856287, + "modifiedTime": 1748008856287, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "Oky51ziMZp6bbuUQ", + "sort": 0, + "_key": "!items!Oky51ziMZp6bbuUQ" } diff --git a/src/packs/community-features/feature_Well_Read_n2RA9iZNiVbGlxco.json b/src/packs/community-features/feature_Well_Read_n2RA9iZNiVbGlxco.json index db3e79e8..bfa879b4 100644 --- a/src/packs/community-features/feature_Well_Read_n2RA9iZNiVbGlxco.json +++ b/src/packs/community-features/feature_Well_Read_n2RA9iZNiVbGlxco.json @@ -1,46 +1,46 @@ { - "name": "Well-Read", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {}, - "value": "d4" - } + "name": "Well-Read", + "type": "feature", + "img": "icons/svg/item-bag.svg", + "system": { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {}, + "value": "d4" + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

You have advantage on rolls that involve the history, culture, or politics of a prominent person or place.

", + "effects": {}, + "actions": [], + "type": "community" }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls that involve the history, culture, or politics of a prominent person or place.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008857389, - "modifiedTime": 1748008857389, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "n2RA9iZNiVbGlxco", - "sort": 0, - "_key": "!items!n2RA9iZNiVbGlxco" + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3, + "JKaKJsbixtjbUa07": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1748008857389, + "modifiedTime": 1748008857389, + "lastModifiedBy": "JKaKJsbixtjbUa07" + }, + "_id": "n2RA9iZNiVbGlxco", + "sort": 0, + "_key": "!items!n2RA9iZNiVbGlxco" } diff --git a/src/packs/subclasses/subclass_Troubadour_T1iBO8i0xRF5c8Q2.json b/src/packs/subclasses/subclass_Troubadour_T1iBO8i0xRF5c8Q2.json index e32a615f..df5ba598 100644 --- a/src/packs/subclasses/subclass_Troubadour_T1iBO8i0xRF5c8Q2.json +++ b/src/packs/subclasses/subclass_Troubadour_T1iBO8i0xRF5c8Q2.json @@ -1,66 +1,66 @@ { - "name": "Troubadour", - "type": "subclass", - "_id": "T1iBO8i0xRF5c8Q2", - "img": "icons/svg/item-bag.svg", - "system": { - "description": "

Play the Troubadour if you want to play music to bolster your allies.

", - "spellcastingTrait": "presence", - "foundationFeature": { - "description": "

Gifted Performer: Describe how you perform for others. You can play each song once per long rest:

Relaxing Song: You and all allies within Close range clear a Hit Point.

Epic Song: Make a target within Close range temporarily Vulnerable.

Heartbreaking Song: You and all allies within Close range gain a Hope.

", - "abilities": [ - { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You are among the greatest of your craft and your skill is boundless. You can perform each of your “Gifted Performer” feature’s songs twice instead of once per long rest.

", - "effects": {}, - "actions": [], - "type": "subclass" - } - ] + "name": "Troubadour", + "type": "subclass", + "_id": "T1iBO8i0xRF5c8Q2", + "img": "icons/svg/item-bag.svg", + "system": { + "description": "

Play the Troubadour if you want to play music to bolster your allies.

", + "spellcastingTrait": "presence", + "foundationFeature": { + "description": "

Gifted Performer: Describe how you perform for others. You can play each song once per long rest:

Relaxing Song: You and all allies within Close range clear a Hit Point.

Epic Song: Make a target within Close range temporarily Vulnerable.

Heartbreaking Song: You and all allies within Close range gain a Hope.

", + "abilities": [ + { + "actionType": "passive", + "featureType": { + "type": "normal", + "data": { + "property": "spellcastingTrait", + "max": 1, + "numbers": {} + } + }, + "refreshData": null, + "multiclass": null, + "disabled": false, + "description": "

You are among the greatest of your craft and your skill is boundless. You can perform each of your “Gifted Performer” feature’s songs twice instead of once per long rest.

", + "effects": {}, + "actions": [], + "type": "subclass" + } + ] + }, + "specializationFeature": { + "unlocked": false, + "tier": null, + "description": "", + "abilities": [] + }, + "masteryFeature": { + "unlocked": false, + "tier": null, + "description": "", + "abilities": [] + }, + "multiclass": null }, - "specializationFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "masteryFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747991594334, + "modifiedTime": 1747991866434, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991594334, - "modifiedTime": 1747991866434, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!T1iBO8i0xRF5c8Q2" + "_key": "!items!T1iBO8i0xRF5c8Q2" } diff --git a/src/packs/subclasses/subclass_Wordsmith_FXT65YDVWFy85EI0.json b/src/packs/subclasses/subclass_Wordsmith_FXT65YDVWFy85EI0.json index e0b7f70b..e9317c05 100644 --- a/src/packs/subclasses/subclass_Wordsmith_FXT65YDVWFy85EI0.json +++ b/src/packs/subclasses/subclass_Wordsmith_FXT65YDVWFy85EI0.json @@ -1,47 +1,47 @@ { - "name": "Wordsmith", - "type": "subclass", - "_id": "FXT65YDVWFy85EI0", - "img": "icons/svg/item-bag.svg", - "system": { - "description": "

Play the Wordsmith if you want to use clever wordplay and captivate crowds.

", - "spellcastingTrait": "presence", - "foundationFeature": { - "description": "", - "abilities": [] + "name": "Wordsmith", + "type": "subclass", + "_id": "FXT65YDVWFy85EI0", + "img": "icons/svg/item-bag.svg", + "system": { + "description": "

Play the Wordsmith if you want to use clever wordplay and captivate crowds.

", + "spellcastingTrait": "presence", + "foundationFeature": { + "description": "", + "abilities": [] + }, + "specializationFeature": { + "unlocked": false, + "tier": null, + "description": "", + "abilities": [] + }, + "masteryFeature": { + "unlocked": false, + "tier": null, + "description": "", + "abilities": [] + }, + "multiclass": null }, - "specializationFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "NqO2eQGMjrvUO6v9": 3 }, - "masteryFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.344", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1747991988842, + "modifiedTime": 1747992014955, + "lastModifiedBy": "NqO2eQGMjrvUO6v9" }, - "multiclass": null - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991988842, - "modifiedTime": 1747992014955, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!FXT65YDVWFy85EI0" + "_key": "!items!FXT65YDVWFy85EI0" } diff --git a/styles/application.less b/styles/application.less index 51874a98..a0f61883 100644 --- a/styles/application.less +++ b/styles/application.less @@ -1,12 +1,15 @@ -form.daggerheart.views.downtime { // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' +form.daggerheart.views.downtime { + // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' height: auto !important; } -div.daggerheart.views.death-move { // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' +div.daggerheart.views.death-move { + // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' height: auto !important; } -div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' +div.daggerheart.views.multiclass { + // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' height: auto !important; } @@ -19,7 +22,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d justify-content: center; font-size: 32px; margin-bottom: 4px; - + .level-title { text-decoration: underline; } @@ -27,7 +30,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d .level-display { display: flex; align-items: center; - + i { margin: 0 @halfMargin; } @@ -97,7 +100,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d position: relative; display: flex; align-items: center; - + input { &:disabled:checked::before { opacity: 0.4; @@ -126,7 +129,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d padding: 8px 0; } } - } + } } } @@ -153,7 +156,8 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d margin-right: 8px; cursor: pointer; - &:hover, &.selected { + &:hover, + &.selected { filter: drop-shadow(0 0 6px gold); } } @@ -173,7 +177,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d } } } - + &.downtime { .activity-text-area { resize: none; @@ -199,22 +203,23 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d } .roll-dialog-container { - .disadvantage, .advantage { + .disadvantage, + .advantage { border: 2px solid @secondaryAccent; border-radius: 6px; display: flex; align-items: center; padding: 4px; margin-bottom: 6px; - + &.selected { filter: drop-shadow(0px 0px 3px @mainShadow); } - + input { border: 0; } - + button { flex: 0; border-radius: 50%; @@ -225,11 +230,11 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d justify-content: center; margin: 2px 0 2px 4px; padding: 12px; - + i { margin: 0; } - } + } } .roll-dialog-experience-container { @@ -237,7 +242,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d align-items: center; flex-wrap: wrap; gap: @halfMargin; - + .roll-dialog-chip { border: @thinBorder solid black; border-radius: 6px; @@ -252,11 +257,11 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d background: grey; overflow: hidden; font-weight: bold; - + &.hover { filter: drop-shadow(0 0 3px @mainShadow); } - + span { overflow: hidden; white-space: nowrap; @@ -272,7 +277,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d } } } - + .hope-container { display: flex; gap: @fullMargin; @@ -297,7 +302,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d align-items: center; flex: 1; - .dice-inner-container{ + .dice-inner-container { position: relative; display: flex; align-items: center; @@ -305,13 +310,13 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d i { font-size: 18px; } - + img { border: 0; position: relative; left: 1px; } - + .dice-number { position: absolute; top: calc(50% - 14px); @@ -330,7 +335,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d gap: @halfMargin; flex: 2; height: 100%; - + .roll-dialog-chip { border: @thinBorder solid black; border-radius: 6px; @@ -342,11 +347,11 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d padding: @fullPadding; background: grey; overflow: hidden; - + &.hover { filter: drop-shadow(0 0 3px @mainShadow); } - + span { overflow: hidden; white-space: nowrap; @@ -370,38 +375,40 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d } .multiclass-class-choices { - display: flex; - width: 100%; - height: 100%; + display: flex; + width: 100%; + height: 100%; flex-wrap: wrap; } .multiclass-spaced-choices { - display: flex; + display: flex; justify-content: space-around; - width: 100%; - height: 100%; + width: 100%; + height: 100%; } .multiclass-class-choice { - display: flex; + display: flex; align-items: center; flex-basis: 33.33%; - font-weight: bold; + font-weight: bold; font-size: 24px; cursor: pointer; - &.selected:not(.disabled), &:hover:not(.disabled) { + &.selected:not(.disabled), + &:hover:not(.disabled) { filter: drop-shadow(0 0 3px gold); } - &.inactive, &.disabled { + &.inactive, + &.disabled { cursor: initial; opacity: 0.4; } img { - width: 80px; + width: 80px; height: 80px; margin-right: @largeMargin; } @@ -460,27 +467,27 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d width: 100%; display: flex; flex-wrap: wrap; - + .ancestry-inner-container { flex-basis: 25%; display: flex; flex-direction: column; align-items: center; - + .image-container { img { width: 120px; border: 4px solid black; border-radius: 50%; - + &.selected { border-color: @secondaryShadow; } - - &:hover:not(.selected) { + + &:hover:not(.selected) { filter: drop-shadow(0 0 3px @secondaryShadow); } - + &.disabled { opacity: 0.3; } @@ -556,7 +563,7 @@ div.daggerheart.views.multiclass { // Shouldn't be needed, but DEFAULT_OPTIONS d } } } - } + } } } -} \ No newline at end of file +} diff --git a/styles/chat.less b/styles/chat.less index e7eda717..fe1483e3 100644 --- a/styles/chat.less +++ b/styles/chat.less @@ -68,7 +68,7 @@ color: white; -webkit-text-stroke-color: @disadvantage; -webkit-text-stroke-width: 1.5px; - font-weight: 400; + font-weight: 400; } &.advantage { color: white; @@ -118,7 +118,7 @@ .target-section { margin-top: 5px; - + .target-container { display: flex; transition: all 0.2s ease-in-out; @@ -146,8 +146,8 @@ width: 22px; height: 22px; margin-left: 8px; - align-self: center; - border-color: transparent; + align-self: center; + border-color: transparent; } .target-inner-container { @@ -199,7 +199,7 @@ border-color: black; flex-basis: calc(50% - 2px); - &:nth-of-type(n+3){ + &:nth-of-type(n + 3) { margin-top: @tinyMargin; } } @@ -209,4 +209,4 @@ width: 80px; } } -} \ No newline at end of file +} diff --git a/styles/class.less b/styles/class.less index 42e33ee4..ec1b1bd5 100644 --- a/styles/class.less +++ b/styles/class.less @@ -2,4 +2,4 @@ .editor { height: 500px; } -} \ No newline at end of file +} diff --git a/styles/components.less b/styles/components.less index a836cbc8..34292734 100644 --- a/styles/components.less +++ b/styles/components.less @@ -16,11 +16,11 @@ width: 40px; padding: 0 4px; border: @thinBorder solid black; - + &:hover { filter: drop-shadow(0 0 3px red); } - + input:checked { opacity: 0; width: 0; @@ -42,4 +42,4 @@ transform: translateX(0); } } -} \ No newline at end of file +} diff --git a/styles/daggerheart.css b/styles/daggerheart.css index 8120d8fe..a1b1f200 100644 --- a/styles/daggerheart.css +++ b/styles/daggerheart.css @@ -6,2608 +6,3123 @@ /* Borders */ /* Padding */ /* Inputs */ -@import "../node_modules/@yaireo/tagify/dist/tagify.css"; +@import '../node_modules/@yaireo/tagify/dist/tagify.css'; .daggerheart.sheet.class .editor { - height: 500px; + height: 500px; } .daggerheart.sheet.pc { - width: 810px !important; + width: 810px !important; } .daggerheart.sheet.pc div[data-application-part] { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header { - display: flex; - gap: 4px; - height: 120px; - margin-bottom: 4px; + display: flex; + gap: 4px; + height: 120px; + margin-bottom: 4px; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .portrait { - border: 0; - border-right: 1px solid var(--color-underline-header); + border: 0; + border-right: 1px solid var(--color-underline-header); } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info { - flex: 1; - background: #778899; + flex: 1; + background: #778899; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .portrait { - max-width: 120px; + max-width: 120px; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-title { - text-align: center; - display: flex; - justify-content: space-between; + text-align: center; + display: flex; + justify-content: space-between; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-title span:hover { - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; + filter: drop-shadow(0px 0px 3px red); + cursor: pointer; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-title .domain-container { - margin-left: 4px; + margin-left: 4px; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-add-container { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - flex: 0; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + flex: 0; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-add-container button { - height: 22px; - width: 22px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - margin-left: 4px; - background: #778899; + height: 22px; + width: 22px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-left: 4px; + background: #778899; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .domain-title { - text-transform: uppercase; - display: flex; - flex-direction: column; - align-items: center; - line-height: 23px; - font-weight: bold; - font-style: italic; + text-transform: uppercase; + display: flex; + flex-direction: column; + align-items: center; + line-height: 23px; + font-weight: bold; + font-style: italic; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .domain-image { - height: 30px; - flex: 0; + height: 30px; + flex: 0; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info { - flex: 2; - display: flex; - flex-direction: column; - justify-content: space-between; + flex: 2; + display: flex; + flex-direction: column; + justify-content: space-between; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .general-input { - position: relative; + position: relative; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .general-input .general-title { - position: absolute; - left: 4px; - text-align: center; - font-weight: bold; - text-transform: uppercase; + position: absolute; + left: 4px; + text-align: center; + font-weight: bold; + text-transform: uppercase; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .pc-tabs { - flex: 1; - margin: 0; + flex: 1; + margin: 0; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .rest-container { - flex-wrap: nowrap; - display: flex; - height: var(--form-field-height); - flex: 0; + flex-wrap: nowrap; + display: flex; + height: var(--form-field-height); + flex: 0; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .rest-container button { - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - width: var(--form-field-height); + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + width: var(--form-field-height); } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .rest-container button i { - font-size: 13px; + font-size: 13px; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container { - position: relative; - bottom: 4px; - flex: none; - width: 40px; - border: none; - outline: none; - margin-left: 8px; + position: relative; + bottom: 4px; + flex: none; + width: 40px; + border: none; + outline: none; + margin-left: 8px; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container.levelup { - filter: drop-shadow(0px 0px 3px gold); + filter: drop-shadow(0px 0px 3px gold); } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container img { - height: 40px; - width: 40px; - border: none; + height: 40px; + width: 40px; + border: none; } -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container { - width: 48px; - position: absolute; - top: calc(50% - 17px); - left: calc(50% - 23px); +.daggerheart.sheet.pc + div[data-application-part] + .pc-sheet-header + .general-info + .level-container + .level-value-container { + width: 48px; + position: absolute; + top: calc(50% - 17px); + left: calc(50% - 23px); } -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .level-value { - font-weight: bold; - font-size: 20px; - text-align: center; +.daggerheart.sheet.pc + div[data-application-part] + .pc-sheet-header + .general-info + .level-container + .level-value-container + .level-value { + font-weight: bold; + font-size: 20px; + text-align: center; } -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .level-value:not(:hover), -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .level-value:not(:focus) { - border: none; +.daggerheart.sheet.pc + div[data-application-part] + .pc-sheet-header + .general-info + .level-container + .level-value-container + .level-value:not(:hover), +.daggerheart.sheet.pc + div[data-application-part] + .pc-sheet-header + .general-info + .level-container + .level-value-container + .level-value:not(:focus) { + border: none; } -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .levelup-marker { - position: absolute; - top: 0; - right: calc(50% - 12px); - color: gold; - filter: drop-shadow(0px 0px 3px black); +.daggerheart.sheet.pc + div[data-application-part] + .pc-sheet-header + .general-info + .level-container + .level-value-container + .levelup-marker { + position: absolute; + top: 0; + right: calc(50% - 12px); + color: gold; + filter: drop-shadow(0px 0px 3px black); } -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .levelup-marker.double-digit { - right: calc(50% - 20px); +.daggerheart.sheet.pc + div[data-application-part] + .pc-sheet-header + .general-info + .level-container + .level-value-container + .levelup-marker.double-digit { + right: calc(50% - 20px); } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-title { - position: absolute; - bottom: 2px; - width: 42px; - background-color: black; - color: white; - left: calc(50% - 21px); - text-align: center; - border-radius: 5px; - font-size: 12px; + position: absolute; + bottom: 2px; + width: 42px; + background-color: black; + color: white; + left: calc(50% - 21px); + text-align: center; + border-radius: 5px; + font-size: 12px; } .daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-title.levelup { - color: gold; - filter: drop-shadow(0px 0px 3px orange); - font-weight: bold; - cursor: pointer; + color: gold; + filter: drop-shadow(0px 0px 3px orange); + font-weight: bold; + cursor: pointer; } -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-title.levelup:hover { - background-color: aliceblue; +.daggerheart.sheet.pc + div[data-application-part] + .pc-sheet-header + .general-info + .level-container + .level-title.levelup:hover { + background-color: aliceblue; } .daggerheart.sheet.pc div[data-application-part] .sheet-body { - display: flex; - flex-direction: column; - flex: 1; + display: flex; + flex-direction: column; + flex: 1; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container { - height: 100%; - display: flex; - flex-direction: column; + height: 100%; + display: flex; + flex-direction: column; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container .tab-inner-container { - flex: 1; + flex: 1; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container .tab-inner-container .body-section { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container .tab-inner-container .body-section fieldset { - flex: 0; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .tab-container + .tab-inner-container + .body-section + fieldset { + flex: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .system-info { - font-size: 12px; - font-style: italic; - font-weight: bold; - margin-top: -4px; - flex: 0; + font-size: 12px; + font-style: italic; + font-weight: bold; + margin-top: -4px; + flex: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .feature-sheet-body { - gap: 4px; + gap: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container { - position: relative; - display: flex; - flex-wrap: wrap; - border-radius: 6px; - padding-left: 0; + position: relative; + display: flex; + flex-wrap: wrap; + border-radius: 6px; + padding-left: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - text-transform: uppercase; - padding: 0 8px; - position: relative; + margin-left: auto; + margin-right: auto; + font-weight: bold; + text-transform: uppercase; + padding: 0 8px; + position: relative; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attributes-menu { - position: absolute; - bottom: calc(50% - 12px); - font-size: 24px; - left: -8px; + position: absolute; + bottom: calc(50% - 12px); + font-size: 24px; + left: -8px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute { - position: relative; - padding: 0 0 4px; - display: flex; - flex-direction: column; - align-items: center; - flex-basis: 33.33%; + position: relative; + padding: 0 0 4px; + display: flex; + flex-direction: column; + align-items: center; + flex-basis: 33.33%; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner { - position: relative; - top: 8px; - z-index: 2; - background: black; - color: white; - text-transform: uppercase; - padding: 2px; - border-radius: 6px; - display: flex; - align-items: center; - overflow: hidden; - min-width: 96px; + position: relative; + top: 8px; + z-index: 2; + background: black; + color: white; + text-transform: uppercase; + padding: 2px; + border-radius: 6px; + display: flex; + align-items: center; + overflow: hidden; + min-width: 96px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner .attribute-roll { - position: absolute; - width: 16px; - transition: transform 0.2s; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-banner + .attribute-roll { + position: absolute; + width: 16px; + transition: transform 0.2s; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner .attribute-roll:hover { - transform: rotate(30deg); - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-banner + .attribute-roll:hover { + transform: rotate(30deg); + filter: drop-shadow(0px 0px 3px red); + cursor: pointer; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner .attribute-text { - width: 100%; - margin-left: 16px; - font-size: 12px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-banner + .attribute-text { + width: 100%; + margin-left: 16px; + font-size: 12px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark { - height: 23px; - width: 23px; - position: absolute; - right: -5px; - top: 6px; - border: 2px solid black; - border-radius: 50%; - background: white; - z-index: 2; - display: flex; - align-items: center; - justify-content: center; + height: 23px; + width: 23px; + position: absolute; + right: -5px; + top: 6px; + border: 2px solid black; + border-radius: 50%; + background: white; + z-index: 2; + display: flex; + align-items: center; + justify-content: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark.selectable { - border-color: gold; - filter: drop-shadow(0 0 3px black); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-mark.selectable { + border-color: gold; + filter: drop-shadow(0 0 3px black); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark.selectable:hover i { - opacity: 0.3; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-mark.selectable:hover + i { + opacity: 0.3; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark i.selected, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark:hover i.selected { - color: green; - opacity: 1; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-mark:hover + i.selected { + color: green; + opacity: 1; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark i { - color: black; - font-size: 17px; - opacity: 0; + color: black; + font-size: 17px; + opacity: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image { - position: relative; - width: fit-content; - display: flex; + position: relative; + width: fit-content; + display: flex; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image img { - height: 80px; - width: 80px; - border: none; + height: 80px; + width: 80px; + border: none; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-value { - width: 55px; - padding-right: 10px; - position: absolute; - top: calc(50% - 18px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - line-height: 30px; - text-align: center; - border: none; - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-image + .attribute-value { + width: 55px; + padding-right: 10px; + position: absolute; + top: calc(50% - 18px); + left: calc(50% - 24px); + font-weight: bold; + font-size: 30px; + line-height: 30px; + text-align: center; + border: none; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-value.negative { - left: calc(50% - 29px); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-image + .attribute-value.negative { + left: calc(50% - 29px); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-value.unselected { - filter: drop-shadow(0 0 3px gold); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-image + .attribute-value.unselected { + filter: drop-shadow(0 0 3px gold); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-text { - width: 47px; - position: absolute; - top: calc(50% - 22px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - text-align: center; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-image + .attribute-text { + width: 47px; + position: absolute; + top: calc(50% - 22px); + left: calc(50% - 24px); + font-weight: bold; + font-size: 30px; + text-align: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-text.negative { - left: calc(50% - 29px); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-container + .attribute + .attribute-image + .attribute-text.negative { + left: calc(50% - 29px); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-verb { - font-variant: petite-caps; + font-variant: petite-caps; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row { - height: 100%; - width: 100%; - display: flex; - align-items: baseline; - justify-content: space-evenly; + height: 100%; + width: 100%; + display: flex; + align-items: baseline; + justify-content: space-evenly; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section { - display: flex; - align-items: center; - margin-right: 8px; + display: flex; + align-items: center; + margin-right: 8px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container { - position: relative; - padding: 4px; - max-width: 100px; + position: relative; + padding: 4px; + max-width: 100px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container img { - border: none; - max-width: 80px; + border: none; + max-width: 80px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-value { - width: 47px; - position: absolute; - top: calc(50% - 22px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - text-align: center; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .defense-row + .defense-section + .defense-container + .defense-value { + width: 47px; + position: absolute; + top: calc(50% - 22px); + left: calc(50% - 24px); + font-weight: bold; + font-size: 30px; + text-align: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-value:not(:hover), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-value:not(:focus) { - border: none; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .defense-row + .defense-section + .defense-container + .defense-value:not(:hover), +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .defense-row + .defense-section + .defense-container + .defense-value:not(:focus) { + border: none; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-banner { - position: absolute; - bottom: 20px; - left: calc(50% - 42px); - z-index: 2; - background-color: black; - color: white; - width: 84px; - text-align: center; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .defense-row + .defense-section + .defense-container + .defense-banner { + position: absolute; + bottom: 20px; + left: calc(50% - 42px); + z-index: 2; + background-color: black; + color: white; + width: 84px; + text-align: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .armor-marks { - max-width: 67px; - padding: 4px; - align-self: end; - margin-left: 4px; + max-width: 67px; + padding: 4px; + align-self: end; + margin-left: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .armor-marks .mark { - width: 16px; - height: 16px; - margin: 0px; + width: 16px; + height: 16px; + margin: 0px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .armor-marks .disabled-mark { - opacity: 0.6; + opacity: 0.6; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .left-main-container { - position: relative; - display: flex; - flex-direction: column; - align-items: flex-start; - border-radius: 6px; + position: relative; + display: flex; + flex-direction: column; + align-items: flex-start; + border-radius: 6px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .left-main-container .legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - text-transform: uppercase; - padding: 0 4px; - position: relative; + margin-left: auto; + margin-right: auto; + font-weight: bold; + text-transform: uppercase; + padding: 0 4px; + position: relative; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapon-section { - padding-top: 8px; + padding-top: 8px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .threshold-container { - position: relative; - display: flex; - align-items: center; - align-self: center; + position: relative; + display: flex; + align-items: center; + align-self: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .threshold-container .threshold-box { - position: relative; - width: 30px; - height: 30px; - border: 2px solid black; - display: flex; - align-items: center; - justify-content: center; - font-size: 20px; - font-weight: bold; + position: relative; + width: 30px; + height: 30px; + border: 2px solid black; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .threshold-container .threshold-spacer { - position: relative; - z-index: 2; - width: 70px; - height: 18px; - background-color: darkgray; - color: white; - display: flex; - justify-content: center; - align-items: center; + position: relative; + z-index: 2; + width: 70px; + height: 18px; + background-color: darkgray; + color: white; + display: flex; + justify-content: center; + align-items: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-label { - text-transform: uppercase; - font-weight: bold; + text-transform: uppercase; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .death-save { - position: absolute; - right: -22px; + position: absolute; + right: -22px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .death-save:hover:not(.disabled) { - filter: drop-shadow(0 0 3px red); - cursor: pointer; + filter: drop-shadow(0 0 3px red); + cursor: pointer; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .death-save.disabled { - opacity: 0.4; + opacity: 0.4; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-box { - width: 20px; - height: 12px; + width: 20px; + height: 12px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-box.stress:nth-child(even) { - position: relative; - right: 1px; + position: relative; + right: 1px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-box .disabled { - opacity: 0.6; + opacity: 0.6; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-text { - font-size: 11.7px; - margin-right: 6px; + font-size: 11.7px; + margin-right: 6px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container { - background: darkgray; - border-radius: 6px; - display: flex; - padding: 2px 0px; + background: darkgray; + border-radius: 6px; + display: flex; + padding: 2px 0px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .vertical-separator { - border-left: 2px solid white; - height: auto; - margin: 4px 0; - flex: 0; + border-left: 2px solid white; + height: auto; + margin: 4px 0; + flex: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .hope-inner-container { - position: relative; + position: relative; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .hope-inner-container .hope-value { - width: 16px; - height: 16px; + width: 16px; + height: 16px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .hope-inner-container .hope-scar { - position: absolute; - top: calc(50% - 6px); - left: calc(50% - 7px); - opacity: 0.4; - font-size: 12px; - -webkit-transform: scaleX(-1); - transform: scaleX(-1); + position: absolute; + top: calc(50% - 6px); + left: calc(50% - 7px); + opacity: 0.4; + font-size: 12px; + -webkit-transform: scaleX(-1); + transform: scaleX(-1); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row { - width: 100%; - display: flex; - align-items: flex-end; + width: 100%; + display: flex; + align-items: flex-end; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-selector { - font-size: 18px; - cursor: pointer; - margin-right: 4px; - opacity: 0.5; + font-size: 18px; + cursor: pointer; + margin-right: 4px; + opacity: 0.5; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-selector:hover:not(.selected) { - filter: drop-shadow(0 0 3px gold); + filter: drop-shadow(0 0 3px gold); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-selector.selected { - filter: drop-shadow(0 0 3px gold); - opacity: 1; + filter: drop-shadow(0 0 3px gold); + opacity: 1; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-value { - margin-left: 8px; - width: 30px; - border-bottom: 2px solid black; - border-radius: 4px; - text-align: center; - font-weight: bold; + margin-left: 8px; + width: 30px; + border-bottom: 2px solid black; + border-radius: 4px; + text-align: center; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-value.empty { - border: 0; + border: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .disabled-experience { - border: 1px solid #7a7971; - background: rgba(0, 0, 0, 0.2); + border: 1px solid #7a7971; + background: rgba(0, 0, 0, 0.2); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section { - width: calc(100% - 8px); - display: flex; - justify-content: space-between; + width: calc(100% - 8px); + display: flex; + justify-content: space-between; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset { - padding-right: 0; - padding-left: 0; - padding-bottom: 4px; + padding-right: 0; + padding-left: 0; + padding-bottom: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset legend { - margin-left: auto; - margin-right: auto; - font-size: 15px; - font-variant: all-petite-caps; - font-weight: bold; + margin-left: auto; + margin-right: auto; + font-size: 15px; + font-variant: all-petite-caps; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - gap: 4px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + gap: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row { - display: flex; - align-items: center; - justify-content: center; - padding: 0 4px; - gap: 2px; + display: flex; + align-items: center; + justify-content: center; + padding: 0 4px; + gap: 2px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row img, .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column img { - min-width: 14px; - min-height: 14px; - height: 14px; - border: 0; - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); + min-width: 14px; + min-height: 14px; + height: 14px; + border: 0; + filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row img:hover, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column img:hover { - cursor: pointer; - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%) drop-shadow(0 0 3px red); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .gold-section + fieldset.gold-fieldset + .gold-column + img:hover { + cursor: pointer; + filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%) + drop-shadow(0 0 3px red); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row i:hover, .daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column i:hover { - cursor: pointer; - filter: drop-shadow(0 0 3px red); + cursor: pointer; + filter: drop-shadow(0 0 3px red); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row img:not(.owned), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column img:not(.owned), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row i:not(.owned), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column i:not(.owned) { - opacity: 0.4; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .gold-section + fieldset.gold-fieldset + .gold-row + img:not(.owned), +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .gold-section + fieldset.gold-fieldset + .gold-column + img:not(.owned), +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .gold-section + fieldset.gold-fieldset + .gold-row + i:not(.owned), +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .gold-section + fieldset.gold-fieldset + .gold-column + i:not(.owned) { + opacity: 0.4; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .health-category { - text-transform: uppercase; + text-transform: uppercase; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .class-feature-selectable { - cursor: pointer; + cursor: pointer; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .class-feature-selectable:hover { - filter: drop-shadow(0 0 3px red); + filter: drop-shadow(0 0 3px red); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .class-feature-selectable.inactive { - opacity: 0.5; + opacity: 0.5; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container { - width: 100%; - min-height: 136px; + width: 100%; + min-height: 136px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container { - display: flex; - align-items: center; - justify-content: space-between; - padding: 4px; - margin-bottom: 0; + display: flex; + align-items: center; + justify-content: space-between; + padding: 4px; + margin-bottom: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container .feature-img { - max-width: 42px; + max-width: 42px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container .feature-label { - font-weight: bold; - font-size: 30px; + font-weight: bold; + font-size: 30px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container button { - flex: 0; + flex: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container { - flex: 0; - min-width: 56px; - display: flex; - flex-wrap: wrap; - gap: 8px; - margin: 0 24px; + flex: 0; + min-width: 56px; + display: flex; + flex-wrap: wrap; + gap: 8px; + margin: 0 24px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick { - position: relative; - border: 2px solid #7a7971; - height: 24px; - border-radius: 50%; - width: 24px; - background: rgba(0, 0, 0, 0.05); - display: flex; - justify-content: center; + position: relative; + border: 2px solid #7a7971; + height: 24px; + border-radius: 50%; + width: 24px; + background: rgba(0, 0, 0, 0.05); + display: flex; + justify-content: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick:hover:not(.disabled):not(.used) { - cursor: pointer; - filter: drop-shadow(0 0 3px red); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .features-container + .feature-tick-container + .feature-tick:hover:not(.disabled):not(.used) { + cursor: pointer; + filter: drop-shadow(0 0 3px red); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick.disabled { - opacity: 0.3; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .features-container + .feature-tick-container + .feature-tick.disabled { + opacity: 0.3; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick img { - border: 0; - width: 24px; - height: 24px; - filter: invert(17%) sepia(0%) saturate(0%) hue-rotate(19deg) brightness(102%) contrast(84%); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .features-container + .feature-tick-container + .feature-tick + img { + border: 0; + width: 24px; + height: 24px; + filter: invert(17%) sepia(0%) saturate(0%) hue-rotate(19deg) brightness(102%) contrast(84%); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick .feature-dice-value { - font-size: 18px; - align-self: center; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .features-container + .feature-tick-container + .feature-tick + .feature-dice-value { + font-size: 18px; + align-self: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick.used::after { - position: absolute; - content: "/"; - color: #7a7971; - font-weight: 700; - font-size: 1.7em; - left: 4px; - top: -5px; - transform: rotate(25deg); - font-size: 24.5px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .features-container + .feature-tick-container + .feature-tick.used::after { + position: absolute; + content: '/'; + color: #7a7971; + font-weight: 700; + font-size: 1.7em; + left: 4px; + top: -5px; + transform: rotate(25deg); + font-size: 24.5px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .feature-input { - border: 0; - border-bottom: 1px solid #7a7971; - text-align: center; - height: min-content; - background: inherit; - font-size: 20px; - position: relative; - bottom: 3px; + border: 0; + border-bottom: 1px solid #7a7971; + text-align: center; + height: min-content; + background: inherit; + font-size: 20px; + position: relative; + bottom: 3px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .editor { - height: 400px; - width: 100%; + height: 400px; + width: 100%; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title { - position: relative; - display: flex; - flex-direction: column; - align-items: center; + position: relative; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container { - width: 176px; - height: 20px; - position: absolute; - bottom: -15px; - left: calc(50% - 88px); - text-transform: uppercase; - display: flex; - align-items: center; - justify-content: center; - z-index: 1; - clip-path: polygon(11% 100%, 89% 100%, 100% 0%, 0% 0%); - font-size: 10px; + width: 176px; + height: 20px; + position: absolute; + bottom: -15px; + left: calc(50% - 88px); + text-transform: uppercase; + display: flex; + align-items: center; + justify-content: center; + z-index: 1; + clip-path: polygon(11% 100%, 89% 100%, 100% 0%, 0% 0%); + font-size: 10px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container span { - margin-right: 2px; + margin-right: 2px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container .proficiency-dot { - background: white; - color: white; - font-size: 10px; - padding: 1px; - border-radius: 50%; + background: white; + color: white; + font-size: 10px; + padding: 1px; + border-radius: 50%; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container .proficiency-dot.marked { - color: black; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .weapons-title + .proficiency-container + .proficiency-dot.marked { + color: black; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container .proficiency-dot:not(:last-of-type) { - margin-right: 2px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .weapons-title + .proficiency-container + .proficiency-dot:not(:last-of-type) { + margin-right: 2px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden { - position: absolute; - top: -4px; - right: -56px; - display: flex; - align-items: center; + position: absolute; + top: -4px; + right: -56px; + display: flex; + align-items: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon { - color: white; - font-size: 22px; - -webkit-text-stroke-width: 1px; - -webkit-text-stroke-color: black; + color: white; + font-size: 22px; + -webkit-text-stroke-width: 1px; + -webkit-text-stroke-color: black; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon.active { - -webkit-text-stroke-color: rgba(0, 0, 0, 0.05); - color: black; + -webkit-text-stroke-color: rgba(0, 0, 0, 0.05); + color: black; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon.left { - -webkit-transform: scaleX(-1) rotate(20deg); - transform: scaleX(-1) rotate(20deg); - margin-right: 4px; + -webkit-transform: scaleX(-1) rotate(20deg); + transform: scaleX(-1) rotate(20deg); + margin-right: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon.right { - transform: rotate(20deg); + transform: rotate(20deg); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .armor-container { - display: flex; - align-items: center; + display: flex; + align-items: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .armor-container .active-item-label-chip { - margin-left: 4px; + margin-left: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container { - display: flex; - flex-direction: column; - width: 100%; - padding: 2px 0px; + display: flex; + flex-direction: column; + width: 100%; + padding: 2px 0px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container .weapons-label-row { - display: flex; - align-items: center; + display: flex; + align-items: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container .weapons-label-row .damage-roll { - width: 24px; - border: none; - margin-left: 4px; - transition: transform 0.2s; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .item-section + .active-item-container + .weapons-label-row + .damage-roll { + width: 24px; + border: none; + margin-left: 4px; + transition: transform 0.2s; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container .weapons-label-row .damage-roll:hover { - transform: rotate(30deg); - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .item-section + .active-item-container + .weapons-label-row + .damage-roll:hover { + transform: rotate(30deg); + filter: drop-shadow(0px 0px 3px red); + cursor: pointer; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip { - width: 62px; - border: 2px solid black; - border-radius: 6px; - background-color: #778899; - display: flex; - align-items: center; - justify-content: space-around; - margin-left: 4px; + width: 62px; + border: 2px solid black; + border-radius: 6px; + background-color: #778899; + display: flex; + align-items: center; + justify-content: space-around; + margin-left: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip img { - height: 20px; + height: 20px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip button { - height: 17px; - width: 17px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - background: #7a7971; - border-color: black; - margin: 0; + height: 17px; + width: 17px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: #7a7971; + border-color: black; + margin: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip button:hover { - background: red; + background: red; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip button i { - font-size: 10px; - color: black; + font-size: 10px; + color: black; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-armor-section, .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-weapon-section { - width: 100%; - margin-bottom: 8px; - text-transform: uppercase; + width: 100%; + margin-bottom: 8px; + text-transform: uppercase; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-armor-section h2, .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-weapon-section h2 { - width: 100%; - display: flex; - align-items: center; + width: 100%; + display: flex; + align-items: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend { - display: flex; - align-items: center; - margin-bottom: 4px; + display: flex; + align-items: center; + margin-bottom: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend .page-selector { - margin-left: 4px; - display: flex; - align-items: center; + margin-left: 4px; + display: flex; + align-items: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend .page-selector i:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0px 0px 3px red); + cursor: pointer; + filter: drop-shadow(0px 0px 3px red); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend .page-selector i.disabled { - opacity: 0.4; + opacity: 0.4; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-add-button { - position: absolute; - border-radius: 50%; - height: 15px; - width: 15px; - top: -20px; - background: grey; - border-color: black; - right: 6px; - display: flex; - font-size: 13px; - align-items: center; - justify-content: center; + position: absolute; + border-radius: 50%; + height: 15px; + width: 15px; + top: -20px; + background: grey; + border-color: black; + right: 6px; + display: flex; + font-size: 13px; + align-items: center; + justify-content: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory { - width: 100%; + width: 100%; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row { - height: 26px; - border-bottom: 1px solid #7a7971; - display: flex; - margin-bottom: 8px; - border-radius: 8px; + height: 26px; + border-bottom: 1px solid #7a7971; + display: flex; + margin-bottom: 8px; + border-radius: 8px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container { - flex-basis: 25%; - margin: 0 4px 8px; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; + flex-basis: 25%; + margin: 0 4px 8px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container:hover { - filter: drop-shadow(0px 0px 3px red); + filter: drop-shadow(0px 0px 3px red); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item { - background: #778899; - padding: 4px; - border: 1px solid black; - border-radius: 6px; - display: flex; - align-items: center; + background: #778899; + padding: 4px; + border: 1px solid black; + border-radius: 6px; + display: flex; + align-items: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item .inventory-item-text { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - flex: 1; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory + .inventory-row + .item-container + .inventory-item + .inventory-item-text { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + flex: 1; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item button { - height: 16px; - width: 16px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - flex: 0; - background: #7a7971; - border-color: black; - margin-left: 4px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory + .inventory-row + .item-container + .inventory-item + button { + height: 16px; + width: 16px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex: 0; + background: #7a7971; + border-color: black; + margin-left: 4px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item button i { - font-size: 12px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory + .inventory-row + .item-container + .inventory-item + button + i { + font-size: 12px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .editor { - height: 100px; + height: 100px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-items { - width: 100%; - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; + width: 100%; + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab { - flex: 1; + flex: 1; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body { - height: 100%; - width: 100%; - padding: 8px; - display: flex; - flex-direction: column; + height: 100%; + width: 100%; + padding: 8px; + display: flex; + flex-direction: column; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .card-row { - flex: 1; - display: flex; + flex: 1; + display: flex; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .domain-card { - flex: 0; - flex-basis: 33.33%; - margin: 8px; + flex: 0; + flex-basis: 33.33%; + margin: 8px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body { - flex: 1; + flex: 1; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body .loadout-container { - height: 100%; - display: flex; - flex-direction: column; - gap: 8px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .domain-card-tab + .domain-card-body + .loadout-body + .loadout-container { + height: 100%; + display: flex; + flex-direction: column; + gap: 8px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body .loadout-container .top-card-row { - flex: 1; - display: flex; - justify-content: space-around; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .domain-card-tab + .domain-card-body + .loadout-body + .loadout-container + .top-card-row { + flex: 1; + display: flex; + justify-content: space-around; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body .loadout-container .domain-card.outlined { - border: 2px dotted black; - padding: 0; - margin: 8px; - height: calc(100% - 16px); - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .domain-card-tab + .domain-card-body + .loadout-body + .loadout-container + .domain-card.outlined { + border: 2px dotted black; + padding: 0; + margin: 8px; + height: calc(100% - 16px); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .vault-container { - display: flex; - flex-wrap: wrap; - overflow-y: auto; - height: 100%; + display: flex; + flex-wrap: wrap; + overflow-y: auto; + height: 100%; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .vault-container .vault-card { - flex: 0; - flex-basis: calc(33.33% - 16px); - margin: 8px; - height: calc(50% - 16px); - min-height: calc(50% - 16px); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .domain-card-tab + .domain-card-body + .vault-container + .vault-card { + flex: 0; + flex-basis: calc(33.33% - 16px); + margin: 8px; + height: calc(50% - 16px); + min-height: calc(50% - 16px); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .domain-card-menu { - flex: 0; - width: 120px; - height: 100%; - border-width: 2px 0 2px 2px; - border-color: black; - border-style: solid; + flex: 0; + width: 120px; + height: 100%; + border-width: 2px 0 2px 2px; + border-color: black; + border-style: solid; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .domain-card-menu button { - margin-bottom: 2px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .domain-card-tab + .domain-card-body + .domain-card-menu + button { + margin-bottom: 2px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .loadout-tabs { - border-top: 1px solid #b5b3a4; - border-bottom: 1px solid #b5b3a4; + border-top: 1px solid #b5b3a4; + border-bottom: 1px solid #b5b3a4; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card { - position: relative; - border: 4px solid #708090; - border-radius: 6px; - display: flex; - flex-direction: column; - height: 100%; - font-size: 14px; + position: relative; + border: 4px solid #708090; + border-radius: 6px; + display: flex; + flex-direction: column; + height: 100%; + font-size: 14px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-image-container { - position: relative; + position: relative; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-image { - width: 100%; - height: 100%; - aspect-ratio: 2; + width: 100%; + height: 100%; + aspect-ratio: 2; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-text-container { - flex: 1; - position: relative; - height: 50%; - display: flex; - flex-direction: column; - overflow-y: auto; - padding: 12px 4px 4px; + flex: 1; + position: relative; + height: 50%; + display: flex; + flex-direction: column; + overflow-y: auto; + padding: 12px 4px 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-level { - position: absolute; - top: 0; - left: 12px; - color: black; - height: 60px; - border: 2px solid orange; - border-top-width: 0; - width: 30px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; - background: grey; - font-size: 20px; - font-weight: bold; + position: absolute; + top: 0; + left: 12px; + color: black; + height: 60px; + border: 2px solid orange; + border-top-width: 0; + width: 30px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + background: grey; + font-size: 20px; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-level img { - border: 0; - width: 20px; + border: 0; + width: 20px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-refresh-cost { - position: absolute; - top: 12px; - right: 12px; - color: white; - width: 30px; - height: 30px; - border: 2px solid orange; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - background: black; - font-size: 14px; + position: absolute; + top: 12px; + right: 12px; + color: white; + width: 30px; + height: 30px; + border: 2px solid orange; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: black; + font-size: 14px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-refresh-cost i { - font-size: 11px; + font-size: 11px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-type { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-weight: bold; - position: absolute; - left: 0; - text-align: center; - width: 100%; - bottom: -9px; - z-index: 1; + flex: 0; + display: flex; + justify-content: center; + align-items: center; + font-weight: bold; + position: absolute; + left: 0; + text-align: center; + width: 100%; + bottom: -9px; + z-index: 1; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-type .abilities-card-type-text { - padding: 0px 4px; - border: 1px solid black; - border-radius: 6px; - background: gold; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-card + .abilities-card-type + .abilities-card-type-text { + padding: 0px 4px; + border: 1px solid black; + border-radius: 6px; + background: gold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-title { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-weight: bold; - font-size: 18px; + flex: 0; + display: flex; + justify-content: center; + align-items: center; + font-weight: bold; + font-size: 18px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-sub-title { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-style: italic; - font-size: 12px; + flex: 0; + display: flex; + justify-content: center; + align-items: center; + font-style: italic; + font-size: 12px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-spellcast { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - text-transform: uppercase; - font-size: 12px; + flex: 0; + display: flex; + justify-content: center; + align-items: center; + text-transform: uppercase; + font-size: 12px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-spellcast .title { - font-weight: bold; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-description { - flex: 0; - font-size: 12px; - margin-bottom: 4px; + flex: 0; + font-size: 12px; + margin-bottom: 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-effect { - cursor: pointer; + cursor: pointer; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-effect:hover { - background: rgba(47, 79, 79, 0.25); + background: rgba(47, 79, 79, 0.25); } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-effect > * { - margin-top: 0; - margin-bottom: 0; + margin-top: 0; + margin-bottom: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities { - flex: 1; - display: flex; - flex-direction: column; - gap: 4px; + flex: 1; + display: flex; + flex-direction: column; + gap: 4px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities .abilities-card-ability { - font-size: 12px; - cursor: pointer; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-card + .abilities-card-abilities + .abilities-card-ability { + font-size: 12px; + cursor: pointer; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities .abilities-card-ability:hover { - background: rgba(47, 79, 79, 0.25); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-card + .abilities-card-abilities + .abilities-card-ability:hover { + background: rgba(47, 79, 79, 0.25); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities .abilities-card-ability > * { - margin: 0; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .abilities-card + .abilities-card-abilities + .abilities-card-ability + > * { + margin: 0; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card:hover .abilities-card-menu { - height: 40px; - left: 0px; + height: 40px; + left: 0px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-menu { - display: flex; - justify-content: center; - align-items: center; - height: 0; - transition: height 0.2s; - overflow: hidden; - position: absolute; - bottom: 0; - z-index: 2; - width: 100%; - background: grey; + display: flex; + justify-content: center; + align-items: center; + height: 0; + transition: height 0.2s; + overflow: hidden; + position: absolute; + bottom: 0; + z-index: 2; + width: 100%; + background: grey; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-menu button { - font-weight: bold; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container { - height: 100%; - display: flex; - flex-direction: column; - gap: 8px; + height: 100%; + display: flex; + flex-direction: column; + gap: 8px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container .card-row { - height: 50%; - display: flex; - justify-content: space-around; + height: 50%; + display: flex; + justify-content: space-around; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container .heritage-card { - flex-basis: 33.33%; - margin: 8px; - display: flex; - align-items: center; - justify-content: center; + flex-basis: 33.33%; + margin: 8px; + display: flex; + align-items: center; + justify-content: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container .heritage-card.outlined { - border: 2px dotted black; - font-size: 25px; + border: 2px dotted black; + font-size: 25px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .empty-ability-container { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - font-size: 25px; - opacity: 0.7; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + font-size: 25px; + opacity: 0.7; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .empty-ability-container .empty-ability-inner-container { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .empty-ability-container .empty-ability-inner-container i { - font-size: 48px; + font-size: 48px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container { - gap: 16px; + gap: 16px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container .story-fieldset { - border-radius: 6px; + border-radius: 6px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container .story-legend { - margin-left: auto; - margin-right: auto; - padding: 0 8px; - font-size: 30px; - font-weight: bold; + margin-left: auto; + margin-right: auto; + padding: 0 8px; + font-size: 30px; + font-weight: bold; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container .scars-container .editor { - height: 240px; + height: 240px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container { - height: 100%; - overflow: auto; + height: 100%; + overflow: auto; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list { - list-style-type: none; - padding: 0 8px; - margin-top: 0; + list-style-type: none; + padding: 0 8px; + margin-top: 0; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list.inventory-item-header { - margin-bottom: 0; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list.inventory-item-header { + margin-bottom: 0; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container { - display: flex; - align-items: center; - width: 100%; - border-bottom: 4px ridge slategrey; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-title-row-container { + display: flex; + align-items: center; + width: 100%; + border-bottom: 4px ridge slategrey; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container .inventory-title-row { - justify-content: space-between; - flex: 1; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-title-row-container + .inventory-title-row { + justify-content: space-between; + flex: 1; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container .inventory-item-title-container { - flex: 1; - display: flex; - align-items: center; - justify-content: flex-start; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-title-row-container + .inventory-item-title-container { + flex: 1; + display: flex; + align-items: center; + justify-content: flex-start; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container .inventory-item-quantity { - width: 48px; - display: flex; - align-items: center; - margin-right: 96px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-title-row-container + .inventory-item-quantity { + width: 48px; + display: flex; + align-items: center; + margin-right: 96px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item { - background: crimson; + background: crimson; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item:not(:last-of-type) { - border-bottom: 2px ridge slategrey; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item:not(:last-of-type) { + border-bottom: 2px ridge slategrey; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-title-container { - flex: 1; - display: flex; - align-items: center; - justify-content: flex-start; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item + .inventory-item-title-container { + flex: 1; + display: flex; + align-items: center; + justify-content: flex-start; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-title-container .inventory-item-title { - display: flex; - align-items: center; - cursor: pointer; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item + .inventory-item-title-container + .inventory-item-title { + display: flex; + align-items: center; + cursor: pointer; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-title-container .inventory-item-title:hover { - filter: drop-shadow(0 0 3px gold); +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item + .inventory-item-title-container + .inventory-item-title:hover { + filter: drop-shadow(0 0 3px gold); } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity { - width: 48px; - display: flex; - align-items: center; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item + .inventory-item-quantity { + width: 48px; + display: flex; + align-items: center; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity.spaced { - margin-right: 56px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item + .inventory-item-quantity.spaced { + margin-right: 56px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity input { - margin: 0 2px; - border: 0; - border-bottom: 2px solid black; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item + .inventory-item-quantity + input { + margin: 0 2px; + border: 0; + border-bottom: 2px solid black; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity i { - font-size: 20px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-item + .inventory-item-quantity + i { + font-size: 20px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row { - font-size: 20px; - font-weight: bold; - display: flex; - align-items: center; - padding: 0 4px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-title-row { + font-size: 20px; + font-weight: bold; + display: flex; + align-items: center; + padding: 0 4px; } .daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row { - display: flex; - align-items: center; - padding: 4px; - font-size: 24px; + display: flex; + align-items: center; + padding: 4px; + font-size: 24px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row .row-icon { - margin-left: 4px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-row + .row-icon { + margin-left: 4px; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row .active-item { - position: absolute; - font-size: 16px; - left: calc(50% - 8px); - top: calc(50% - 8px); - margin-left: 2px; - color: crimson; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-row + .active-item { + position: absolute; + font-size: 16px; + left: calc(50% - 8px); + top: calc(50% - 8px); + margin-left: 2px; + color: crimson; } -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row img { - width: 32px; +.daggerheart.sheet.pc + div[data-application-part] + .sheet-body + .inventory-container + .inventory-item-list + .inventory-row + img { + width: 32px; } .combat-sidebar .encounter-gm-resources { - flex: 0; - display: flex; - justify-content: center; - padding: 8px 0; + flex: 0; + display: flex; + justify-content: center; + padding: 8px 0; } .combat-sidebar .encounter-gm-resources .gm-resource-controls { - display: flex; - flex-direction: column; - align-items: center; - padding: 0 4px; - justify-content: center; + display: flex; + flex-direction: column; + align-items: center; + padding: 0 4px; + justify-content: center; } .combat-sidebar .encounter-gm-resources .gm-resource-tools { - display: flex; - flex-direction: column; - justify-content: center; - padding: 0 5px 0 4px; + display: flex; + flex-direction: column; + justify-content: center; + padding: 0 5px 0 4px; } .combat-sidebar .encounter-gm-resources .gm-resource-tools i { - margin: 0 2px; - font-size: 16px; + margin: 0 2px; + font-size: 16px; } .combat-sidebar .encounter-gm-resources .gm-resource-tools i.disabled { - opacity: 0.6; + opacity: 0.6; } .combat-sidebar .encounter-gm-resources .gm-resource-tools i:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0 0 3px red); + cursor: pointer; + filter: drop-shadow(0 0 3px red); } .combat-sidebar .encounter-gm-resources .gm-resource { - background: rgba(255, 255, 255, 0.1); - padding: 4px; - border-radius: 8px; - border: 2px solid black; - font-size: 20px; + background: rgba(255, 255, 255, 0.1); + padding: 4px; + border-radius: 8px; + border: 2px solid black; + font-size: 20px; } .combat-sidebar .token-action-tokens { - flex: 0 0 48px; - text-align: center; + flex: 0 0 48px; + text-align: center; } .combat-sidebar .token-action-tokens .use-action-token.disabled { - opacity: 0.6; + opacity: 0.6; } .combat-sidebar .icon-button.spaced { - margin-left: 4px; + margin-left: 4px; } .combat-sidebar .icon-button.disabled { - opacity: 0.6; + opacity: 0.6; } .combat-sidebar .icon-button:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0 0 3px red); + cursor: pointer; + filter: drop-shadow(0 0 3px red); } .daggerheart.chat.downtime { - display: flex; - flex-direction: column; - align-items: center; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart.chat.downtime .downtime-title-container { - display: flex; - flex-direction: column; - align-items: center; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart.chat.downtime .downtime-title-container .downtime-subtitle { - font-size: 17px; + font-size: 17px; } .daggerheart.chat.downtime .downtime-image { - width: 80px; + width: 80px; } .daggerheart.chat.downtime .downtime-refresh-container { - margin-top: 8px; - width: 100%; + margin-top: 8px; + width: 100%; } .daggerheart.chat.downtime .downtime-refresh-container .refresh-title { - font-weight: bold; + font-weight: bold; } .daggerheart.chat.roll .dice-tooltip .dice-rolls { - display: flex; - align-items: center; - justify-content: space-around; + display: flex; + align-items: center; + justify-content: space-around; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .dice-hope-container { - display: flex; + display: flex; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .dice-hope-container .roll.die:not(:last-of-type) { - margin-right: 8px; + margin-right: 8px; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .modifiers-container { - display: flex; + display: flex; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .modifiers-container .modifier-value:not(:last-of-type) { - margin-right: 8px; + margin-right: 8px; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .roll.die.hope { - color: white; - -webkit-text-stroke-color: #008080; - -webkit-text-stroke-width: 1.5px; - font-weight: 400; + color: white; + -webkit-text-stroke-color: #008080; + -webkit-text-stroke-width: 1.5px; + font-weight: 400; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .roll.die.fear { - color: white; - -webkit-text-stroke-color: #430070; - -webkit-text-stroke-width: 1.5px; - font-weight: 400; + color: white; + -webkit-text-stroke-color: #430070; + -webkit-text-stroke-width: 1.5px; + font-weight: 400; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .roll.die.disadvantage { - color: white; - -webkit-text-stroke-color: #b30000; - -webkit-text-stroke-width: 1.5px; - font-weight: 400; + color: white; + -webkit-text-stroke-color: #b30000; + -webkit-text-stroke-width: 1.5px; + font-weight: 400; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .roll.die.advantage { - color: white; - -webkit-text-stroke-color: green; - -webkit-text-stroke-width: 1.5px; - font-weight: 400; + color: white; + -webkit-text-stroke-color: green; + -webkit-text-stroke-width: 1.5px; + font-weight: 400; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .roll.die.unused { - opacity: 0.3; + opacity: 0.3; } .daggerheart.chat.roll .dice-tooltip .dice-rolls .modifier-value { - text-align: center; - font-weight: bold; - font-size: 16px; + text-align: center; + font-weight: bold; + font-size: 16px; } .daggerheart.chat.roll .dice-total .dice-total-value .hope { - color: #008080; + color: #008080; } .daggerheart.chat.roll .dice-total .dice-total-value .fear { - color: #430070; + color: #430070; } .daggerheart.chat.roll .dice-total .dice-total-value .critical { - color: #ffd700; + color: #ffd700; } .daggerheart.chat.roll .dice-total-label { - font-size: 12px; - font-weight: bold; - font-variant: all-small-caps; - margin: -8px 0; + font-size: 12px; + font-weight: bold; + font-variant: all-small-caps; + margin: -8px 0; } .daggerheart.chat.roll .target-section { - margin-top: 5px; + margin-top: 5px; } .daggerheart.chat.roll .target-section .target-container { - display: flex; - transition: all 0.2s ease-in-out; + display: flex; + transition: all 0.2s ease-in-out; } .daggerheart.chat.roll .target-section .target-container:hover { - filter: drop-shadow(0 0 3px gold); - border-color: gold; + filter: drop-shadow(0 0 3px gold); + border-color: gold; } .daggerheart.chat.roll .target-section .target-container.hidden { - display: none; - border: 0; + display: none; + border: 0; } .daggerheart.chat.roll .target-section .target-container.hit { - background: #008000; + background: #008000; } .daggerheart.chat.roll .target-section .target-container.miss { - background: #ff0000; + background: #ff0000; } .daggerheart.chat.roll .target-section .target-container img { - flex: 0; - width: 22px; - height: 22px; - margin-left: 8px; - align-self: center; - border-color: transparent; + flex: 0; + width: 22px; + height: 22px; + margin-left: 8px; + align-self: center; + border-color: transparent; } .daggerheart.chat.roll .target-section .target-container .target-inner-container { - flex: 1; - display: flex; - justify-content: center; - margin-right: 32px; + flex: 1; + display: flex; + justify-content: center; + margin-right: 32px; } .daggerheart.chat.roll .roll-damage-button { - margin-top: 5px; + margin-top: 5px; } .daggerheart.chat.domain-card { - display: flex; - flex-direction: column; - align-items: center; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart.chat.domain-card .domain-card-title { - width: 100%; - display: flex; - flex-direction: column; - align-items: center; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart.chat.domain-card .domain-card-title div { - font-size: 20px; - font-variant: small-caps; - font-weight: bold; + font-size: 20px; + font-variant: small-caps; + font-weight: bold; } .daggerheart.chat.domain-card .domain-card-title h2 { - width: 100%; - text-align: center; + width: 100%; + text-align: center; } .daggerheart.chat.domain-card .ability-card-footer { - display: flex; - width: 100%; - margin-top: 8px; - flex-wrap: wrap; + display: flex; + width: 100%; + margin-top: 8px; + flex-wrap: wrap; } .daggerheart.chat.domain-card .ability-card-footer button { - border-radius: 6px; - background: #699969; - border-color: black; - flex-basis: calc(50% - 2px); + border-radius: 6px; + background: #699969; + border-color: black; + flex-basis: calc(50% - 2px); } -.daggerheart.chat.domain-card .ability-card-footer button:nth-of-type(n+3) { - margin-top: 2px; +.daggerheart.chat.domain-card .ability-card-footer button:nth-of-type(n + 3) { + margin-top: 2px; } .daggerheart.chat.domain-card img { - width: 80px; + width: 80px; } .daggerheart.sheet.feature { - background-color: red; + background-color: red; } .daggerheart.sheet.feature .editable { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .daggerheart.sheet.feature .sheet-body { - flex: 1; - display: flex; - flex-direction: column; + flex: 1; + display: flex; + flex-direction: column; } .daggerheart.sheet.feature .feature-description { - flex: 1; - display: flex; - flex-direction: column; + flex: 1; + display: flex; + flex-direction: column; } .daggerheart.sheet.class .class-feature { - display: flex; + display: flex; } .daggerheart.sheet.class .class-feature img { - width: 40px; + width: 40px; } .daggerheart.sheet.class .class-feature button { - width: 40px; + width: 40px; } .daggerheart.sheet .domain-card-description .editor { - height: 300px; + height: 300px; } .daggerheart.sheet .item-container { - margin-top: 4px; - gap: 4px; - align-items: baseline; + margin-top: 4px; + gap: 4px; + align-items: baseline; } .daggerheart.sheet .item-sidebar { - border-right: 1px groove darkgray; - min-width: 160px; - flex: 0; - padding: 4px; + border-right: 1px groove darkgray; + min-width: 160px; + flex: 0; + padding: 4px; } .daggerheart.sheet .item-sidebar label { - margin-right: 8px; - font-weight: bold; + margin-right: 8px; + font-weight: bold; } -.daggerheart.sheet .item-sidebar input[type="checkbox"] { - margin: 0; +.daggerheart.sheet .item-sidebar input[type='checkbox'] { + margin: 0; } form.daggerheart.views.downtime { - height: auto !important; + height: auto !important; } div.daggerheart.views.death-move { - height: auto !important; + height: auto !important; } div.daggerheart.views.multiclass { - height: auto !important; + height: auto !important; } .daggerheart.views.levelup .levelup-title-container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: 32px; - margin-bottom: 4px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: 32px; + margin-bottom: 4px; } .daggerheart.views.levelup .levelup-title-container .level-title { - text-decoration: underline; + text-decoration: underline; } .daggerheart.views.levelup .levelup-title-container .level-display { - display: flex; - align-items: center; + display: flex; + align-items: center; } .daggerheart.views.levelup .levelup-title-container .level-display i { - margin: 0 4px; + margin: 0 4px; } .daggerheart.views.levelup .levelup-section { - display: flex; - align-items: flex-start; - margin-bottom: 8px; - font-size: 11px; + display: flex; + align-items: flex-start; + margin-bottom: 8px; + font-size: 11px; } .daggerheart.views.levelup .levelup-section .levelup-container { - flex: 1; + flex: 1; } .daggerheart.views.levelup .levelup-section .levelup-container:nth-of-type(2) { - padding: 0 4px; + padding: 0 4px; } .daggerheart.views.levelup .levelup-section .levelup-container.disabled { - opacity: 0.2; + opacity: 0.2; } .daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container { - height: 700px; - padding: 24px 58px 0; - display: flex; - flex-direction: column; - align-items: center; - position: relative; + height: 700px; + padding: 24px 58px 0; + display: flex; + flex-direction: column; + align-items: center; + position: relative; } .daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - z-index: 1; + margin-left: auto; + margin-right: auto; + font-weight: bold; + z-index: 1; } .daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-info { - background: #778899; - width: 100%; - text-align: center; - position: absolute; - top: -6px; - padding: 8px 0; + background: #778899; + width: 100%; + text-align: center; + position: absolute; + top: -6px; + padding: 8px 0; } .daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-pretext { - padding: 8px 0; + padding: 8px 0; } .daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row { - display: flex; - align-items: center; - padding: 4px; +.daggerheart.views.levelup + .levelup-section + .levelup-container + .levelup-inner-container + .levelup-body + .levelup-choice-row { + display: flex; + align-items: center; + padding: 4px; } -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-row-inner { - display: flex; - align-items: center; +.daggerheart.views.levelup + .levelup-section + .levelup-container + .levelup-inner-container + .levelup-body + .levelup-choice-row + .levelup-choice-row-inner { + display: flex; + align-items: center; } -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container { - position: relative; - display: flex; - align-items: center; +.daggerheart.views.levelup + .levelup-section + .levelup-container + .levelup-inner-container + .levelup-body + .levelup-choice-row + .levelup-choice-input-container { + position: relative; + display: flex; + align-items: center; } -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container input:disabled:checked::before { - opacity: 0.4; - color: var(--color-warm-1); +.daggerheart.views.levelup + .levelup-section + .levelup-container + .levelup-inner-container + .levelup-body + .levelup-choice-row + .levelup-choice-input-container + input:disabled:checked::before { + opacity: 0.4; + color: var(--color-warm-1); } -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container i.fa-link { - transform: rotate(45deg); - position: relative; - top: 2px; - margin: 0 -3px; +.daggerheart.views.levelup + .levelup-section + .levelup-container + .levelup-inner-container + .levelup-body + .levelup-choice-row + .levelup-choice-input-container + i.fa-link { + transform: rotate(45deg); + position: relative; + top: 2px; + margin: 0 -3px; } -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container i.fa-lock { - position: absolute; - top: 0; - left: 0; - font-size: 8px; +.daggerheart.views.levelup + .levelup-section + .levelup-container + .levelup-inner-container + .levelup-body + .levelup-choice-row + .levelup-choice-input-container + i.fa-lock { + position: absolute; + top: 0; + left: 0; + font-size: 8px; } .daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-posttext { - padding: 8px 0; + padding: 8px 0; } .daggerheart.views .downtime-container .activity-container { - display: flex; - align-items: center; - padding: 8px; + display: flex; + align-items: center; + padding: 8px; } .daggerheart.views .downtime-container .activity-container .activity-title { - flex: 1; - display: flex; - align-items: center; + flex: 1; + display: flex; + align-items: center; } .daggerheart.views .downtime-container .activity-container .activity-title .activity-title-text { - font-size: 24px; - font-weight: bold; + font-size: 24px; + font-weight: bold; } .daggerheart.views .downtime-container .activity-container .activity-title .activity-image { - width: 120px; - border: 2px solid black; - border-radius: 50%; - margin-right: 8px; - cursor: pointer; + width: 120px; + border: 2px solid black; + border-radius: 50%; + margin-right: 8px; + cursor: pointer; } .daggerheart.views .downtime-container .activity-container .activity-title .activity-image:hover, .daggerheart.views .downtime-container .activity-container .activity-title .activity-image.selected { - filter: drop-shadow(0 0 6px gold); + filter: drop-shadow(0 0 6px gold); } .daggerheart.views .downtime-container .activity-container .activity-title .custom-name-input { - font-size: 24px; - font-weight: bold; - padding: 0; - background: transparent; - color: #efe6d8; + font-size: 24px; + font-weight: bold; + padding: 0; + background: transparent; + color: #efe6d8; } .daggerheart.views .downtime-container .activity-container .activity-body { - flex: 1; - font-style: italic; + flex: 1; + font-style: italic; } .daggerheart.views.downtime .activity-text-area { - resize: none; + resize: none; } .daggerheart.views .range-reset { - flex: 0; - width: 21px; - height: 21px; - margin: 3px 4px; - border: 1px solid black; - display: flex; - align-items: center; - justify-content: center; + flex: 0; + width: 21px; + height: 21px; + margin: 3px 4px; + border: 1px solid black; + display: flex; + align-items: center; + justify-content: center; } .daggerheart.views.roll-selection .roll-selection-container i { - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); + filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); } .daggerheart.views.roll-selection .roll-dialog-container .disadvantage, .daggerheart.views.roll-selection .roll-dialog-container .advantage { - border: 2px solid #708090; - border-radius: 6px; - display: flex; - align-items: center; - padding: 4px; - margin-bottom: 6px; + border: 2px solid #708090; + border-radius: 6px; + display: flex; + align-items: center; + padding: 4px; + margin-bottom: 6px; } .daggerheart.views.roll-selection .roll-dialog-container .disadvantage.selected, .daggerheart.views.roll-selection .roll-dialog-container .advantage.selected { - filter: drop-shadow(0px 0px 3px red); + filter: drop-shadow(0px 0px 3px red); } .daggerheart.views.roll-selection .roll-dialog-container .disadvantage input, .daggerheart.views.roll-selection .roll-dialog-container .advantage input { - border: 0; + border: 0; } .daggerheart.views.roll-selection .roll-dialog-container .disadvantage button, .daggerheart.views.roll-selection .roll-dialog-container .advantage button { - flex: 0; - border-radius: 50%; - height: 20px; - width: 20px; - display: flex; - align-items: center; - justify-content: center; - margin: 2px 0 2px 4px; - padding: 12px; + flex: 0; + border-radius: 50%; + height: 20px; + width: 20px; + display: flex; + align-items: center; + justify-content: center; + margin: 2px 0 2px 4px; + padding: 12px; } .daggerheart.views.roll-selection .roll-dialog-container .disadvantage button i, .daggerheart.views.roll-selection .roll-dialog-container .advantage button i { - margin: 0; + margin: 0; } .daggerheart.views.roll-selection .roll-dialog-container .roll-dialog-experience-container { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 4px; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 4px; } .daggerheart.views.roll-selection .roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip { - border: 1px solid black; - border-radius: 6px; - min-width: calc(33% - 2px); - flex: 1; - display: flex; - align-items: center; - justify-content: center; - gap: 4px; - cursor: pointer; - padding: 4px; - background: grey; - overflow: hidden; - font-weight: bold; + border: 1px solid black; + border-radius: 6px; + min-width: calc(33% - 2px); + flex: 1; + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + cursor: pointer; + padding: 4px; + background: grey; + overflow: hidden; + font-weight: bold; } .daggerheart.views.roll-selection .roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip.hover { - filter: drop-shadow(0 0 3px red); + filter: drop-shadow(0 0 3px red); } .daggerheart.views.roll-selection .roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip span { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } .daggerheart.views.roll-selection .roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip.selected { - background: green; + background: green; } -.daggerheart.views.roll-selection .roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip.selected span { - filter: drop-shadow(0 0 3px gold); +.daggerheart.views.roll-selection + .roll-dialog-container + .roll-dialog-experience-container + .roll-dialog-chip.selected + span { + filter: drop-shadow(0 0 3px gold); } .daggerheart.views.roll-selection .roll-dialog-container .hope-container { - display: flex; - gap: 8px; - align-items: center; - font-size: 18px; + display: flex; + gap: 8px; + align-items: center; + font-size: 18px; } .daggerheart.views.npc-roll-selection .npc-roll-dialog-container { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container { - display: flex; - align-items: center; - margin-bottom: 8px; + display: flex; + align-items: center; + margin-bottom: 8px; } .daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container { - display: flex; - align-items: center; - flex: 1; + display: flex; + align-items: center; + flex: 1; } -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container { - position: relative; - display: flex; - align-items: center; +.daggerheart.views.npc-roll-selection + .npc-roll-dialog-container + .selection-container + .dice-container + .dice-inner-container { + position: relative; + display: flex; + align-items: center; } -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container i { - font-size: 18px; +.daggerheart.views.npc-roll-selection + .npc-roll-dialog-container + .selection-container + .dice-container + .dice-inner-container + i { + font-size: 18px; } -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container img { - border: 0; - position: relative; - left: 1px; +.daggerheart.views.npc-roll-selection + .npc-roll-dialog-container + .selection-container + .dice-container + .dice-inner-container + img { + border: 0; + position: relative; + left: 1px; } -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container .dice-number { - position: absolute; - top: calc(50% - 14px); - left: calc(50% - 7px); - font-size: 24px; - font-weight: bold; +.daggerheart.views.npc-roll-selection + .npc-roll-dialog-container + .selection-container + .dice-container + .dice-inner-container + .dice-number { + position: absolute; + top: calc(50% - 14px); + left: calc(50% - 7px); + font-size: 24px; + font-weight: bold; } .daggerheart.views.npc-roll-selection .npc-roll-dialog-container .roll-dialog-experience-container { - display: flex; - align-items: flex-start; - flex-wrap: wrap; - gap: 4px; - flex: 2; - height: 100%; + display: flex; + align-items: flex-start; + flex-wrap: wrap; + gap: 4px; + flex: 2; + height: 100%; } .daggerheart.views.npc-roll-selection .npc-roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip { - border: 1px solid black; - border-radius: 6px; - flex-basis: calc(50% - 2px); - display: flex; - align-items: center; - justify-content: space-between; - cursor: pointer; - padding: 4px; - background: grey; - overflow: hidden; + border: 1px solid black; + border-radius: 6px; + flex-basis: calc(50% - 2px); + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + padding: 4px; + background: grey; + overflow: hidden; } -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip.hover { - filter: drop-shadow(0 0 3px red); +.daggerheart.views.npc-roll-selection + .npc-roll-dialog-container + .roll-dialog-experience-container + .roll-dialog-chip.hover { + filter: drop-shadow(0 0 3px red); } -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip span { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; +.daggerheart.views.npc-roll-selection + .npc-roll-dialog-container + .roll-dialog-experience-container + .roll-dialog-chip + span { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .roll-dialog-experience-container .roll-dialog-chip.selected i { - color: green; +.daggerheart.views.npc-roll-selection + .npc-roll-dialog-container + .roll-dialog-experience-container + .roll-dialog-chip.selected + i { + color: green; } .daggerheart.views.multiclass .multiclass-container { - margin-bottom: 16px; + margin-bottom: 16px; } .daggerheart.views.multiclass .multiclass-container .multiclass-category-title { - margin-top: 16px; + margin-top: 16px; } .daggerheart.views.multiclass .multiclass-container .multiclass-class-choices { - display: flex; - width: 100%; - height: 100%; - flex-wrap: wrap; + display: flex; + width: 100%; + height: 100%; + flex-wrap: wrap; } .daggerheart.views.multiclass .multiclass-container .multiclass-spaced-choices { - display: flex; - justify-content: space-around; - width: 100%; - height: 100%; + display: flex; + justify-content: space-around; + width: 100%; + height: 100%; } .daggerheart.views.multiclass .multiclass-container .multiclass-class-choice { - display: flex; - align-items: center; - flex-basis: 33.33%; - font-weight: bold; - font-size: 24px; - cursor: pointer; + display: flex; + align-items: center; + flex-basis: 33.33%; + font-weight: bold; + font-size: 24px; + cursor: pointer; } .daggerheart.views.multiclass .multiclass-container .multiclass-class-choice.selected:not(.disabled), .daggerheart.views.multiclass .multiclass-container .multiclass-class-choice:hover:not(.disabled) { - filter: drop-shadow(0 0 3px gold); + filter: drop-shadow(0 0 3px gold); } .daggerheart.views.multiclass .multiclass-container .multiclass-class-choice.inactive, .daggerheart.views.multiclass .multiclass-container .multiclass-class-choice.disabled { - cursor: initial; - opacity: 0.4; + cursor: initial; + opacity: 0.4; } .daggerheart.views.multiclass .multiclass-container .multiclass-class-choice img { - width: 80px; - height: 80px; - margin-right: 16px; + width: 80px; + height: 80px; + margin-right: 16px; } .daggerheart.views.damage-selection .hope-container { - display: flex; - gap: 8px; - align-items: center; - font-size: 18px; + display: flex; + gap: 8px; + align-items: center; + font-size: 18px; } .daggerheart.views.action .action-category { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .daggerheart.views.action .action-category .action-category-label { - display: flex; - align-items: center; - justify-content: space-between; - border-radius: 6px; - cursor: pointer; - padding: 0 4px; - margin: 0 auto 4px; + display: flex; + align-items: center; + justify-content: space-between; + border-radius: 6px; + cursor: pointer; + padding: 0 4px; + margin: 0 auto 4px; } .daggerheart.views.action .action-category .action-category-label:hover { - background-color: darkgray; + background-color: darkgray; } .daggerheart.views.action .action-category .action-category-data { - max-height: 0; - transition: max-height 0.2s ease-in-out; - overflow: hidden; + max-height: 0; + transition: max-height 0.2s ease-in-out; + overflow: hidden; } .daggerheart.views.action .action-category .action-category-data.open { - max-height: initial; + max-height: initial; } .daggerheart.views.ancestry-selection .ancestry-section { - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: 8px; + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 8px; } .daggerheart.views.ancestry-selection .ancestry-section .ancestry-container { - width: 100%; - display: flex; - flex-wrap: wrap; + width: 100%; + display: flex; + flex-wrap: wrap; } .daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container { - flex-basis: 25%; - display: flex; - flex-direction: column; - align-items: center; + flex-basis: 25%; + display: flex; + flex-direction: column; + align-items: center; } -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img { - width: 120px; - border: 4px solid black; - border-radius: 50%; +.daggerheart.views.ancestry-selection + .ancestry-section + .ancestry-container + .ancestry-inner-container + .image-container + img { + width: 120px; + border: 4px solid black; + border-radius: 50%; } -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img.selected { - border-color: gold; +.daggerheart.views.ancestry-selection + .ancestry-section + .ancestry-container + .ancestry-inner-container + .image-container + img.selected { + border-color: gold; } -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img:hover:not(.selected) { - filter: drop-shadow(0 0 3px gold); +.daggerheart.views.ancestry-selection + .ancestry-section + .ancestry-container + .ancestry-inner-container + .image-container + img:hover:not(.selected) { + filter: drop-shadow(0 0 3px gold); } -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img.disabled { - opacity: 0.3; +.daggerheart.views.ancestry-selection + .ancestry-section + .ancestry-container + .ancestry-inner-container + .image-container + img.disabled { + opacity: 0.3; } -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .name-container div { - font-size: 18px; - font-weight: bold; - cursor: help; +.daggerheart.views.ancestry-selection + .ancestry-section + .ancestry-container + .ancestry-inner-container + .name-container + div { + font-size: 18px; + font-weight: bold; + cursor: help; } .daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container { - width: 100%; - display: flex; - gap: 8px; + width: 100%; + display: flex; + gap: 8px; } .daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container > div { - flex: 1; + flex: 1; } .daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-name { - text-align: center; + text-align: center; } .daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-name div { - font-size: 24px; + font-size: 24px; } .daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images { - display: flex; - align-items: center; - gap: 4px; + display: flex; + align-items: center; + gap: 4px; } -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image { - position: relative; - max-width: 33%; +.daggerheart.views.ancestry-selection + .ancestry-section + .mixed-ancestry-container + .mixed-ancestry-images + .mixed-ancestry-image { + position: relative; + max-width: 33%; } -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image:hover i { - opacity: 1; +.daggerheart.views.ancestry-selection + .ancestry-section + .mixed-ancestry-container + .mixed-ancestry-images + .mixed-ancestry-image:hover + i { + opacity: 1; } -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image i { - position: absolute; - font-size: 32px; - top: calc(50% - 20px); - left: calc(50% - 20px); - padding: 4px; - background-color: grey; - opacity: 0; - cursor: pointer; +.daggerheart.views.ancestry-selection + .ancestry-section + .mixed-ancestry-container + .mixed-ancestry-images + .mixed-ancestry-image + i { + position: absolute; + font-size: 32px; + top: calc(50% - 20px); + left: calc(50% - 20px); + padding: 4px; + background-color: grey; + opacity: 0; + cursor: pointer; } -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image i:hover { - filter: drop-shadow(0 0 3px gold); +.daggerheart.views.ancestry-selection + .ancestry-section + .mixed-ancestry-container + .mixed-ancestry-images + .mixed-ancestry-image + i:hover { + filter: drop-shadow(0 0 3px gold); } -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image img { - max-width: 100%; +.daggerheart.views.ancestry-selection + .ancestry-section + .mixed-ancestry-container + .mixed-ancestry-images + .mixed-ancestry-image + img { + max-width: 100%; } .daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images img { - max-width: 33%; - border: 4px solid black; - border-radius: 50%; + max-width: 33%; + border: 4px solid black; + border-radius: 50%; } .daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images img.selected { - border-color: gold; + border-color: gold; } .daggerheart.sheet.heritage .editor { - height: 200px; + height: 200px; } .daggerheart.sheet.class .guide .guide-section { - gap: 8px; + gap: 8px; } .daggerheart.sheet.class .guide .drop-section { - width: 100%; + width: 100%; } .daggerheart.sheet.class .guide .drop-section legend { - margin-left: auto; - margin-right: auto; - font-size: 12px; + margin-left: auto; + margin-right: auto; + font-size: 12px; } .daggerheart.sheet.class .guide .drop-section .drop-section-body { - min-height: 40px; - display: flex; - flex-direction: column; - align-items: center; + min-height: 40px; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart.sheet.class .guide .trait-input { - text-align: center; - min-width: 24px; + text-align: center; + min-width: 24px; } .daggerheart.sheet.class .guide .suggested-item { - padding: 2px 4px; - border-radius: 6px; - border: 1px solid black; - background: #778899; - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; + padding: 2px 4px; + border-radius: 6px; + border: 1px solid black; + background: #778899; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; } .daggerheart.sheet.class .guide .suggested-item:not(:last-child) { - margin: 4px; + margin: 4px; } .daggerheart.sheet.class .guide .suggested-item img { - width: 30px; + width: 30px; } .daggerheart.sheet.class .guide .suggested-item div { - text-align: center; + text-align: center; } .daggerheart.sheet.class .guide .suggested-item i { - border-radius: 50%; - margin-right: 4px; - font-size: 11px; + border-radius: 50%; + margin-right: 4px; + font-size: 11px; } .daggerheart.sheet.class .guide .extra-section { - display: flex; - flex-direction: column; - align-items: center; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart.sheet.class .guide .extra-section .extra-title { - font-size: 14px; - font-weight: bold; + font-size: 14px; + font-weight: bold; } .daggerheart.sheet.class .guide .extra-section .extra-input { - margin-bottom: 4px; + margin-bottom: 4px; } .daggerheart.sheet.class .guide-section-title-centered { - font-weight: bold; - font-size: 18px; + font-weight: bold; + font-size: 18px; } .daggerheart.sheet.class .inventory-section { - width: 100%; - border: 2px solid black; - border-style: dotted; - min-height: 80px; + width: 100%; + border: 2px solid black; + border-style: dotted; + min-height: 80px; } .daggerheart.sheet.class .inventory-section .inventory-title { - font-weight: bold; - font-size: 14px; - text-align: center; + font-weight: bold; + font-size: 14px; + text-align: center; } .daggerheart.sheet.class .tagify { - background: var(--color-light-1); - border: 1px solid var(--color-border); - height: 34px; - width: 100%; - border-radius: 3px; - margin-right: 1px; + background: var(--color-light-1); + border: 1px solid var(--color-border); + height: 34px; + width: 100%; + border-radius: 3px; + margin-right: 1px; } .daggerheart.sheet.class .tagify tag div { - display: flex; - justify-content: space-between; - align-items: center; - height: 22px; + display: flex; + justify-content: space-between; + align-items: center; + height: 22px; } .daggerheart.sheet.class .tagify tag div span { - font-weight: 400; + font-weight: 400; } .daggerheart.sheet.class .tagify tag div img { - margin-left: 8px; - height: 20px; - width: 20px; + margin-left: 8px; + height: 20px; + width: 20px; } .daggerheart.sheet.adversary .adversary-header-container { - position: relative; - background-color: grey; - display: flex; + position: relative; + background-color: grey; + display: flex; } .daggerheart.sheet.adversary .adversary-header-container .adversary-header { - flex: 1; + flex: 1; } .daggerheart.sheet.adversary .adversary-header-container .adversary-header img { - height: 60px; - width: 60px; + height: 60px; + width: 60px; } .daggerheart.sheet.adversary .adversary-header-container .adversary-header .adversary-title { - display: flex; - align-items: center; - text-align: center; - font-size: 28px; + display: flex; + align-items: center; + text-align: center; + font-size: 28px; } .daggerheart.sheet.adversary .adversary-header-container .adversary-header .adversary-title .title-text { - width: 100%; + width: 100%; } .daggerheart.sheet.adversary .adversary-header-container .adversary-header .adversary-title input { - font-size: 28px; - border: 0; - height: 100%; + font-size: 28px; + border: 0; + height: 100%; } .daggerheart.sheet.adversary .adversary-header-container .adversary-toggle { - position: absolute; - top: 0; - right: 0; - background-color: white; - color: black; - flex: 0; + position: absolute; + top: 0; + right: 0; + background-color: white; + color: black; + flex: 0; } .daggerheart.sheet.adversary .motive-container { - background: lightgrey; - margin-bottom: 8px; - padding-bottom: 4px; + background: lightgrey; + margin-bottom: 8px; + padding-bottom: 4px; } .daggerheart.sheet.adversary .motive-container .motive-title { - display: flex; - align-items: center; - justify-content: center; - flex-wrap: wrap; + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; } .daggerheart.sheet.adversary .motive-container .motive-title .motive-title-base { - font-size: 21px; + font-size: 21px; } .daggerheart.sheet.adversary .motive-container .motive-title .motive-title-value { - font-style: italic; - position: relative; - top: 2px; + font-style: italic; + position: relative; + top: 2px; } .daggerheart.sheet.adversary .motive-container .motive-title i { - margin-left: 4px; - cursor: pointer; + margin-left: 4px; + cursor: pointer; } .daggerheart.sheet.adversary .motive-container .motive-title i:hover { - filter: drop-shadow(0 0 3px red); + filter: drop-shadow(0 0 3px red); } .daggerheart.sheet.adversary .adversary-content-container { - display: flex; - align-items: baseline; + display: flex; + align-items: baseline; } .daggerheart.sheet.adversary .adversary-statistics-container { - flex: 1; - margin-right: 24px; - display: flex; - flex-direction: column; - gap: 12px; + flex: 1; + margin-right: 24px; + display: flex; + flex-direction: column; + gap: 12px; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-title { - flex: 0; - white-space: nowrap; - font-weight: bold; + flex: 0; + white-space: nowrap; + font-weight: bold; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-row { - display: flex; - align-items: center; + display: flex; + align-items: center; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-row .statistic-value { - flex: 0; - white-space: nowrap; - margin-left: 4px; + flex: 0; + white-space: nowrap; + margin-left: 4px; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-row .adversary-roll { - border: 0; - width: 16px; - margin-left: 4px; - align-self: baseline; - transition: transform 0.2s; + border: 0; + width: 16px; + margin-left: 4px; + align-self: baseline; + transition: transform 0.2s; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-row .adversary-roll:hover { - transform: rotate(30deg); - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; + transform: rotate(30deg); + filter: drop-shadow(0px 0px 3px red); + cursor: pointer; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-resource-container { - display: flex; - align-items: center; + display: flex; + align-items: center; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-resource-container label { - min-width: 44px; + min-width: 44px; } -.daggerheart.sheet.adversary .adversary-statistics-container .statistic-resource-container .statistic-resource-inner-container { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 4px; +.daggerheart.sheet.adversary + .adversary-statistics-container + .statistic-resource-container + .statistic-resource-inner-container { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 4px; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-resource-container .resource-title { - align-self: center; - font-weight: bold; + align-self: center; + font-weight: bold; } .daggerheart.sheet.adversary .adversary-statistics-container .statistic-resource-container .statistic-resource-input { - margin: 0; - flex: 0; - min-width: 16px; + margin: 0; + flex: 0; + min-width: 16px; } .daggerheart.sheet.adversary .adversary-statistics-container .attack-container { - border: 1px solid black dotted; + border: 1px solid black dotted; } .daggerheart.sheet.adversary .adversary-statistics-container .experience-row { - display: flex; + display: flex; } .daggerheart.sheet.adversary .adversary-statistics-container .experience-row * { - flex: 0; - white-space: nowrap; + flex: 0; + white-space: nowrap; } .daggerheart.sheet.adversary .adversary-statistics-container .experience-container i { - margin-left: 4px; - cursor: pointer; + margin-left: 4px; + cursor: pointer; } .daggerheart.sheet.adversary .adversary-statistics-container .experience-container i:hover { - filter: drop-shadow(0 0 3px red); + filter: drop-shadow(0 0 3px red); } .daggerheart.sheet.adversary .adversary-statistics-container .experience-chip { - border: 2px solid #708090; - border-radius: 6px; - display: flex; - align-items: center; - padding: 4px; - margin-bottom: 6px; + border: 2px solid #708090; + border-radius: 6px; + display: flex; + align-items: center; + padding: 4px; + margin-bottom: 6px; } .daggerheart.sheet.adversary .adversary-statistics-container .experience-chip .experience-text { - flex: 1; + flex: 1; } .daggerheart.sheet.adversary .adversary-statistics-container .experience-chip .experience-value { - flex: 0; - min-width: 26px; - margin: 0 4px; + flex: 0; + min-width: 26px; + margin: 0 4px; } .daggerheart.sheet.adversary .adversary-statistics-container .experience-chip .experience-button { - flex: 0; - border-radius: 50%; - height: 20px; - width: 20px; - display: flex; - align-items: center; - justify-content: center; - padding: 12px; + flex: 0; + border-radius: 50%; + height: 20px; + width: 20px; + display: flex; + align-items: center; + justify-content: center; + padding: 12px; } .daggerheart.sheet.adversary .adversary-damage-threshold-container input { - min-width: 26px; + min-width: 26px; } .daggerheart.sheet.adversary .adversary-moves-container { - flex: 2.5; + flex: 2.5; } .daggerheart.sheet.adversary .adversary-moves-container .moves-title { - text-decoration: underline; - font-weight: bold; + text-decoration: underline; + font-weight: bold; } .daggerheart.sheet.adversary .adversary-moves-container .move-container { - cursor: pointer; + cursor: pointer; } .daggerheart.sheet.adversary .adversary-moves-container .move-container:hover { - background: #2f4f4f40; + background: #2f4f4f40; } .daggerheart.sheet.adversary .adversary-moves-container .move-container .moves-name { - font-weight: bold; - text-decoration: none; + font-weight: bold; + text-decoration: none; } .daggerheart.sheet.adversary .adversary-moves-container .move-container .move-description p { - margin-top: 0; + margin-top: 0; } .daggerheart.sheet.adversary .adversary-moves-container .moves-edit-container i { - margin-left: 4px; - cursor: pointer; + margin-left: 4px; + cursor: pointer; } .daggerheart.sheet.adversary .adversary-moves-container .moves-edit-container i:hover { - filter: drop-shadow(0 0 3px red); + filter: drop-shadow(0 0 3px red); } .daggerheart.sheet.adversary .chip-container { - display: flex; - align-items: center; - justify-content: space-between; - background: #778899; - padding: 8px; - border: 2px solid black; - border-radius: 6px; + display: flex; + align-items: center; + justify-content: space-between; + background: #778899; + padding: 8px; + border: 2px solid black; + border-radius: 6px; } .daggerheart.sheet.adversary .chip-container:not(:last-child) { - margin-bottom: 8px; + margin-bottom: 8px; } .daggerheart.sheet.adversary .chip-container .chip-inner-container { - display: flex; - align-items: center; + display: flex; + align-items: center; } .daggerheart.sheet.adversary .chip-container .chip-inner-container img { - height: 40px; - width: 40px; - margin-right: 8px; + height: 40px; + width: 40px; + margin-right: 8px; } .daggerheart.sheet.adversary .chip-container .chip-inner-container .chip-title { - font-size: 22px; - font-weight: bold; - font-style: italic; + font-size: 22px; + font-weight: bold; + font-style: italic; } .daggerheart.sheet.adversary .chip-container button { - height: 40px; - width: 40px; - background: white; + height: 40px; + width: 40px; + background: white; } .daggerheart.sheet .title-container { - display: flex; - gap: 8px; + display: flex; + gap: 8px; } .daggerheart.sheet .title-container div { - flex: 1; - align-items: baseline; + flex: 1; + align-items: baseline; } .daggerheart.sheet .editor-form-group { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .daggerheart.sheet .editor-form-group label { - font-weight: bold; - text-align: center; + font-weight: bold; + text-align: center; } .daggerheart.sheet .option-select { - position: absolute; - top: calc(50% - 10px); - right: 8px; - height: 20px; - width: 20px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - padding: 8px; + position: absolute; + top: calc(50% - 10px); + right: 8px; + height: 20px; + width: 20px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + padding: 8px; } .daggerheart.sheet .option-select.deeper { - right: 32px; + right: 32px; } .daggerheart.sheet .option-select:hover:not(:disabled) { - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; + filter: drop-shadow(0px 0px 3px red); + cursor: pointer; } .daggerheart.sheet .option-select i { - margin: 0; - font-size: 11px; + margin: 0; + font-size: 11px; } .daggerheart.sheet .ability-title { - width: 100%; - display: flex; + width: 100%; + display: flex; } .daggerheart.sheet .ability-title h2 { - flex: 1; + flex: 1; } .daggerheart.sheet .ability-title i { - cursor: pointer; + cursor: pointer; } .daggerheart.sheet .ability-title i:hover { - filter: drop-shadow(0px 0px 3px red); + filter: drop-shadow(0px 0px 3px red); } .daggerheart.sheet .ability-choices { - display: flex; - align-items: center; - flex-wrap: wrap; + display: flex; + align-items: center; + flex-wrap: wrap; } .daggerheart.sheet .ability-chip { - border: 2px solid #708090; - border-radius: 6px; - display: flex; - align-items: center; - padding: 4px; - margin-bottom: 6px; - flex: calc(33% - 4px); - max-width: calc(33% - 4px); + border: 2px solid #708090; + border-radius: 6px; + display: flex; + align-items: center; + padding: 4px; + margin-bottom: 6px; + flex: calc(33% - 4px); + max-width: calc(33% - 4px); } .daggerheart.sheet .ability-chip.selected { - filter: drop-shadow(0px 0px 3px red); + filter: drop-shadow(0px 0px 3px red); } .daggerheart.sheet .ability-chip:nth-of-type(3n-1) { - margin-left: 6px; - margin-right: 6px; + margin-left: 6px; + margin-right: 6px; } .daggerheart.sheet .ability-chip input { - border: 0; + border: 0; } .daggerheart.sheet .ability-chip button { - flex: 0; - border-radius: 50%; - height: 20px; - width: 20px; - display: flex; - align-items: center; - justify-content: center; - margin: 2px 0 2px 4px; - padding: 12px; + flex: 0; + border-radius: 50%; + height: 20px; + width: 20px; + display: flex; + align-items: center; + justify-content: center; + margin: 2px 0 2px 4px; + padding: 12px; } .daggerheart.sheet .ability-chip button i { - margin: 0; + margin: 0; } .daggerheart.sheet .object-select-display { - position: relative; - width: calc(100% - 2px); - background: rgba(0, 0, 0, 0.05); - height: var(--form-field-height); - display: flex; - border: 1px solid #7a7971; - border-radius: 3px; + position: relative; + width: calc(100% - 2px); + background: rgba(0, 0, 0, 0.05); + height: var(--form-field-height); + display: flex; + border: 1px solid #7a7971; + border-radius: 3px; } .daggerheart.sheet .object-select-display .object-select-title { - position: absolute; - left: 4px; - text-align: center; - font-weight: bold; - text-transform: uppercase; + position: absolute; + left: 4px; + text-align: center; + font-weight: bold; + text-transform: uppercase; } .daggerheart.sheet .object-select-display .object-select-text { - align-self: center; + align-self: center; } .daggerheart.sheet .object-select-display .object-select-item { - cursor: pointer; + cursor: pointer; } .daggerheart.sheet .object-select-display .object-select-item:hover { - filter: drop-shadow(0px 0px 3px red); + filter: drop-shadow(0px 0px 3px red); } .daggerheart.sheet .feature-container { - display: flex; - align-items: center; - justify-content: space-between; - background: #778899; - padding: 8px; - border: 2px solid black; - border-radius: 6px; + display: flex; + align-items: center; + justify-content: space-between; + background: #778899; + padding: 8px; + border: 2px solid black; + border-radius: 6px; } .daggerheart.sheet .feature-container:not(:last-child) { - margin-bottom: 8px; + margin-bottom: 8px; } .daggerheart.sheet .feature-container .feature-inner-container { - display: flex; - align-items: center; + display: flex; + align-items: center; } .daggerheart.sheet .feature-container .feature-inner-container img { - height: 40px; - width: 40px; - margin-right: 8px; + height: 40px; + width: 40px; + margin-right: 8px; } .daggerheart.sheet .feature-container .feature-inner-container .feature-title { - font-size: 22px; - font-weight: bold; - font-style: italic; + font-size: 22px; + font-weight: bold; + font-style: italic; } .daggerheart.sheet .feature-container button { - height: 40px; - width: 40px; - background: inherit; - border: 0; + height: 40px; + width: 40px; + background: inherit; + border: 0; } .slider-container { - position: relative; - background: lightslategray; + position: relative; + background: lightslategray; } .slider-container .slider-inner-container { - position: absolute; - top: 1px; - left: -60px; - background-color: inherit; - color: inherit; - border-radius: 30px; - cursor: pointer; - display: flex; - align-items: center; - height: 20px; - width: 40px; - padding: 0 4px; - border: 1px solid black; + position: absolute; + top: 1px; + left: -60px; + background-color: inherit; + color: inherit; + border-radius: 30px; + cursor: pointer; + display: flex; + align-items: center; + height: 20px; + width: 40px; + padding: 0 4px; + border: 1px solid black; } .slider-container .slider-inner-container:hover { - filter: drop-shadow(0 0 3px red); + filter: drop-shadow(0 0 3px red); } .slider-container .slider-inner-container input:checked { - opacity: 0; - width: 0; - height: 0; + opacity: 0; + width: 0; + height: 0; } .slider-container .slider-inner-container input:checked + .slider-icon { - transform: translateX(17px); - transition: 1s; + transform: translateX(17px); + transition: 1s; } .slider-container .slider-inner-container .slider-icon { - position: absolute; - left: 4px; - height: 15px; - width: 15px; - border-radius: 50%; - transition: 1s; - transform: translateX(0); + position: absolute; + left: 4px; + height: 15px; + width: 15px; + border-radius: 50%; + transition: 1s; + transform: translateX(0); } .item-button.checked { - background: green; + background: green; } .item-button .item-icon { - opacity: 0; - transition: opacity 0.2s; + opacity: 0; + transition: opacity 0.2s; } .item-button .item-icon.checked { - opacity: 1; + opacity: 1; } #logo { - content: url(../assets/DaggerheartLogo.webp); - height: 50px; - width: 50px; - position: relative; - left: 25px; + content: url(../assets/DaggerheartLogo.webp); + height: 50px; + width: 50px; + position: relative; + left: 25px; } .daggerheart { - /* Flex */ - /****/ + /* Flex */ + /****/ } .daggerheart .vertical-separator { - border-left: 2px solid black; - height: 56px; - flex: 0; - align-self: center; + border-left: 2px solid black; + height: 56px; + flex: 0; + align-self: center; } .daggerheart .flex-centered { - display: flex; - align-items: center; - justify-content: center; + display: flex; + align-items: center; + justify-content: center; } .daggerheart .flex-col-centered { - display: flex; - flex-direction: column; - align-items: center; + display: flex; + flex-direction: column; + align-items: center; } .daggerheart .flex-spaced { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; } .daggerheart .flex-min { - display: flex; - flex: 0; + display: flex; + flex: 0; } -.daggerheart img[data-edit="img"] { - min-width: 64px; - min-height: 64px; +.daggerheart img[data-edit='img'] { + min-width: 64px; + min-height: 64px; } .daggerheart .editor { - height: 200px; + height: 200px; } .daggerheart button i { - margin: 0; + margin: 0; } .daggerheart .icon-button.spaced { - margin-left: 4px; + margin-left: 4px; } .daggerheart .icon-button.active { - filter: drop-shadow(0 0 3px red); + filter: drop-shadow(0 0 3px red); } .daggerheart .icon-button.active.secondary { - filter: drop-shadow(0 0 3px gold); + filter: drop-shadow(0 0 3px gold); } .daggerheart .icon-button.disabled { - opacity: 0.6; + opacity: 0.6; } .daggerheart .icon-button:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0 0 3px red); + cursor: pointer; + filter: drop-shadow(0 0 3px red); } .daggerheart .icon-button:hover:not(.disabled).secondary { - filter: drop-shadow(0 0 3px gold); + filter: drop-shadow(0 0 3px gold); } #players h3 { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: nowrap; + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: nowrap; } #players h3 .players-container { - display: flex; - align-items: center; + display: flex; + align-items: center; } #players h3 .fear-control { - font-size: 10px; + font-size: 10px; } #players h3 .fear-control.disabled { - opacity: 0.4; + opacity: 0.4; } #players h3 .fear-control:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0 0 3px red); + cursor: pointer; + filter: drop-shadow(0 0 3px red); } diff --git a/styles/daggerheart.less b/styles/daggerheart.less index a23e51aa..53384143 100644 --- a/styles/daggerheart.less +++ b/styles/daggerheart.less @@ -1,14 +1,14 @@ -@import "./variables/variables.less"; -@import "./class.less"; -@import "./pc.less"; -@import "./ui.less"; -@import "./chat.less"; -@import "./item.less"; -@import "./application.less"; -@import "./sheets//sheets.less"; -@import "./components.less"; -@import "./dialog.less"; -@import "../node_modules/@yaireo/tagify/dist/tagify.css"; +@import './variables/variables.less'; +@import './class.less'; +@import './pc.less'; +@import './ui.less'; +@import './chat.less'; +@import './item.less'; +@import './application.less'; +@import './sheets//sheets.less'; +@import './components.less'; +@import './dialog.less'; +@import '../node_modules/@yaireo/tagify/dist/tagify.css'; #logo { content: url(../assets/DaggerheartLogo.webp); @@ -52,7 +52,7 @@ } /****/ - img[data-edit="img"] { + img[data-edit='img'] { min-width: 64px; min-height: 64px; } @@ -84,8 +84,7 @@ opacity: 0.6; } - - &:hover:not(.disabled){ + &:hover:not(.disabled) { cursor: pointer; filter: drop-shadow(0 0 3px @mainShadow); @@ -118,15 +117,15 @@ .fear-control { font-size: 10px; - + &.disabled { opacity: 0.4; } - + &:hover:not(.disabled) { cursor: pointer; filter: drop-shadow(0 0 3px @mainShadow); } } } -} \ No newline at end of file +} diff --git a/styles/dialog.less b/styles/dialog.less index 593b7cb2..0a9f31e3 100644 --- a/styles/dialog.less +++ b/styles/dialog.less @@ -1,12 +1,12 @@ .item-button { - &.checked { + &.checked { background: green; } .item-icon { opacity: 0; - transition: opacity 0.2s; + transition: opacity 0.2s; &.checked { opacity: 1; } } -} \ No newline at end of file +} diff --git a/styles/item.less b/styles/item.less index 752fcf07..f453af8b 100644 --- a/styles/item.less +++ b/styles/item.less @@ -53,8 +53,8 @@ font-weight: bold; } - input[type="checkbox"] { + input[type='checkbox'] { margin: 0; } } -} \ No newline at end of file +} diff --git a/styles/pc.less b/styles/pc.less index 6f83d41e..a6920304 100644 --- a/styles/pc.less +++ b/styles/pc.less @@ -4,7 +4,7 @@ div[data-application-part] { display: flex; flex-direction: column; - + .pc-sheet-header { display: flex; gap: @halfMargin; @@ -118,7 +118,7 @@ } } - .level-container{ + .level-container { position: relative; bottom: 4px; flex: none; @@ -147,7 +147,8 @@ font-weight: bold; font-size: 20px; text-align: center; - &:not(:hover), &:not(:focus) { + &:not(:hover), + &:not(:focus) { border: none; } } @@ -177,7 +178,7 @@ font-size: 12px; &.levelup { - color:gold; + color: gold; filter: drop-shadow(0px 0px 3px orange); font-weight: bold; cursor: pointer; @@ -258,7 +259,7 @@ align-items: center; flex-basis: 33.33%; // flex: 1; - + .attribute-banner { position: relative; top: 8px; @@ -315,7 +316,8 @@ } } - & i.selected, &:hover i.selected { + & i.selected, + &:hover i.selected { color: green; opacity: 1; } @@ -397,7 +399,7 @@ position: relative; padding: @fullPadding; max-width: 100px; - + img { border: none; max-width: 80px; @@ -411,7 +413,8 @@ font-weight: bold; font-size: 30px; text-align: center; - &:not(:hover), &:not(:focus) { + &:not(:hover), + &:not(:focus) { border: none; } } @@ -463,7 +466,7 @@ position: relative; } } - + .weapon-section { padding-top: 8px; } @@ -473,7 +476,7 @@ display: flex; align-items: center; align-self: center; - + .threshold-box { position: relative; width: 30px; @@ -507,7 +510,7 @@ .death-save { position: absolute; right: -22px; - + &:hover:not(.disabled) { filter: drop-shadow(0 0 3px @mainShadow); cursor: pointer; @@ -606,14 +609,14 @@ .disabled-experience { border: @thinBorder solid @borderTertiary; - background: rgba(0, 0, 0, 0.20); + background: rgba(0, 0, 0, 0.2); } } .gold-section { width: calc(100% - 8px); display: flex; justify-content: space-between; - + fieldset.gold-fieldset { padding-right: 0; padding-left: 0; @@ -644,7 +647,8 @@ gap: @tinyMargin; } - .gold-row, .gold-column { + .gold-row, + .gold-column { img { min-width: 14px; min-height: 14px; @@ -654,7 +658,8 @@ &:hover { cursor: pointer; - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%) drop-shadow(0 0 3px @mainShadow); + filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) + contrast(103%) drop-shadow(0 0 3px @mainShadow); } } @@ -663,7 +668,8 @@ filter: drop-shadow(0 0 3px @mainShadow); } - img:not(.owned), i:not(.owned) { + img:not(.owned), + i:not(.owned) { opacity: 0.4; } } @@ -696,7 +702,7 @@ justify-content: space-between; padding: @fullPadding; margin-bottom: 0; - + .feature-img { max-width: 42px; } @@ -728,8 +734,8 @@ background: rgba(0, 0, 0, 0.05); display: flex; justify-content: center; - - &:hover:not(.disabled):not(.used){ + + &:hover:not(.disabled):not(.used) { cursor: pointer; filter: drop-shadow(0 0 3px @mainShadow); } @@ -752,7 +758,7 @@ &.used::after { position: absolute; - content: "/"; + content: '/'; color: @borderTertiary; font-weight: 700; font-size: 1.7em; @@ -816,7 +822,7 @@ color: black; } - &:not(:last-of-type){ + &:not(:last-of-type) { margin-right: @tinyMargin; } } @@ -912,7 +918,7 @@ background: rgb(122, 121, 113); border-color: black; margin: 0; - + &:hover { background: red; } @@ -925,7 +931,8 @@ } } - .inventory-armor-section, .inventory-weapon-section { + .inventory-armor-section, + .inventory-weapon-section { width: 100%; margin-bottom: @fullMargin; text-transform: uppercase; @@ -941,14 +948,14 @@ display: flex; align-items: center; margin-bottom: @halfMargin; - + .page-selector { margin-left: 4px; display: flex; align-items: center; i { - &:hover:not(.disabled){ + &:hover:not(.disabled) { cursor: pointer; filter: drop-shadow(0px 0px 3px red); } @@ -1040,8 +1047,8 @@ .inventory-items { width: 100%; flex: 1; - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; justify-content: space-between; } @@ -1078,7 +1085,7 @@ .top-card-row { flex: 1; display: flex; - justify-content: space-around; + justify-content: space-around; } .domain-card.outlined { @@ -1099,7 +1106,7 @@ flex-wrap: wrap; overflow-y: auto; height: 100%; - + .vault-card { flex: 0; flex-basis: calc(33.33% - 16px); @@ -1108,7 +1115,7 @@ min-height: calc(50% - 16px); } } - + .domain-card-menu { flex: 0; width: 120px; @@ -1120,7 +1127,7 @@ button { margin-bottom: @tinyMargin; } - } + } } } @@ -1213,14 +1220,14 @@ bottom: -9px; z-index: 1; - .abilities-card-type-text{ + .abilities-card-type-text { padding: 0px 4px; border: 1px solid black; border-radius: 6px; background: gold; } } - + .abilities-card-title { flex: 0; display: flex; @@ -1260,7 +1267,7 @@ .abilities-card-effect { cursor: pointer; - + &:hover { background: rgb(47 79 79 / 25%); } @@ -1284,14 +1291,14 @@ &:hover { background: rgb(47 79 79 / 25%); } - + > * { margin: 0; - } + } } } - &:hover .abilities-card-menu{ + &:hover .abilities-card-menu { height: 40px; left: 0px; } @@ -1328,7 +1335,7 @@ } .heritage-card { - flex-basis: 33.33%; + flex-basis: 33.33%; margin: @fullMargin; display: flex; align-items: center; @@ -1389,7 +1396,7 @@ overflow: auto; .inventory-item-list { - list-style-type:none; + list-style-type: none; padding: 0 @largePadding; margin-top: 0; @@ -1503,4 +1510,4 @@ } } } -} \ No newline at end of file +} diff --git a/styles/sheets/adversary.less b/styles/sheets/adversary.less index 1a4a6f45..657ce218 100644 --- a/styles/sheets/adversary.less +++ b/styles/sheets/adversary.less @@ -66,7 +66,7 @@ cursor: pointer; &:hover { - filter: drop-shadow(0 0 3px red), + filter: drop-shadow(0 0 3px red); } } } @@ -118,7 +118,7 @@ .statistic-resource-container { display: flex; align-items: center; - + label { min-width: 44px; } @@ -161,7 +161,7 @@ cursor: pointer; &:hover { - filter: drop-shadow(0 0 3px red), + filter: drop-shadow(0 0 3px red); } } } @@ -214,12 +214,12 @@ cursor: pointer; &:hover { - background: @hoverBackground; + background: @hoverBackground; } .moves-name { font-weight: bold; - text-decoration: none;; + text-decoration: none; } .move-description { @@ -230,13 +230,12 @@ } .moves-edit-container { - i { margin-left: 4px; cursor: pointer; &:hover { - filter: drop-shadow(0 0 3px red), + filter: drop-shadow(0 0 3px red); } } } @@ -278,4 +277,4 @@ background: white; } } -} \ No newline at end of file +} diff --git a/styles/sheets/class.less b/styles/sheets/class.less index 4eb8a6f8..07008699 100644 --- a/styles/sheets/class.less +++ b/styles/sheets/class.less @@ -22,7 +22,7 @@ } .trait-input { - text-align: center; + text-align: center; min-width: 24px; } @@ -72,18 +72,18 @@ } .guide-section-title-centered { - font-weight: bold; + font-weight: bold; font-size: 18px; } .inventory-section { width: 100%; - border: 2px solid black; - border-style: dotted; + border: 2px solid black; + border-style: dotted; min-height: 80px; .inventory-title { - font-weight: bold; + font-weight: bold; font-size: 14px; text-align: center; } @@ -109,11 +109,11 @@ } img { - margin-left: 8px; - height: 20px; + margin-left: 8px; + height: 20px; width: 20px; } } } } -} \ No newline at end of file +} diff --git a/styles/sheets/heritage.less b/styles/sheets/heritage.less index c16bf582..84af64bc 100644 --- a/styles/sheets/heritage.less +++ b/styles/sheets/heritage.less @@ -2,5 +2,4 @@ .editor { height: 200px; } - -} \ No newline at end of file +} diff --git a/styles/sheets/sheets.less b/styles/sheets/sheets.less index 31de74f3..19c76980 100644 --- a/styles/sheets/sheets.less +++ b/styles/sheets/sheets.less @@ -1,6 +1,6 @@ -@import "./heritage.less"; -@import "./class.less"; -@import "./adversary.less"; +@import './heritage.less'; +@import './class.less'; +@import './adversary.less'; .daggerheart.sheet { .title-container { @@ -53,7 +53,7 @@ .ability-title { width: 100%; display: flex; - + h2 { flex: 1; } @@ -117,7 +117,7 @@ position: relative; width: calc(100% - 2px); background: rgba(0, 0, 0, 0.05); - height: var(--form-field-height);; + height: var(--form-field-height); display: flex; border: 1px solid rgb(122, 121, 113); border-radius: 3px; @@ -177,10 +177,9 @@ width: 40px; background: inherit; border: 0; - + i { - } } } -} \ No newline at end of file +} diff --git a/styles/ui.less b/styles/ui.less index d4592066..7d1ff690 100644 --- a/styles/ui.less +++ b/styles/ui.less @@ -22,7 +22,7 @@ i { margin: 0 @tinyMargin; font-size: 16px; - + &.disabled { opacity: 0.6; } @@ -63,8 +63,7 @@ opacity: 0.6; } - - &:hover:not(.disabled){ + &:hover:not(.disabled) { cursor: pointer; filter: drop-shadow(0 0 3px @mainShadow); } diff --git a/styles/variables/colors.less b/styles/variables/colors.less index 27b74e97..19c32885 100644 --- a/styles/variables/colors.less +++ b/styles/variables/colors.less @@ -21,4 +21,4 @@ @primaryAccent: #778899; @secondaryAccent: #708090; @formBackground: #782e22; -@hoverBackground: #2f4f4f40; \ No newline at end of file +@hoverBackground: #2f4f4f40; diff --git a/styles/variables/values.less b/styles/variables/values.less index eb946e81..67f0b68a 100644 --- a/styles/variables/values.less +++ b/styles/variables/values.less @@ -23,4 +23,4 @@ @largePadding: 8px; /* Inputs */ -@inputSingleMinWidth: 26px; \ No newline at end of file +@inputSingleMinWidth: 26px; diff --git a/styles/variables/variables.less b/styles/variables/variables.less index ca8a2fcc..ef536475 100644 --- a/styles/variables/variables.less +++ b/styles/variables/variables.less @@ -1,2 +1,2 @@ -@import "./colors.less"; -@import "./values.less"; \ No newline at end of file +@import './colors.less'; +@import './values.less'; diff --git a/system.json b/system.json index 25953769..d98cd595 100644 --- a/system.json +++ b/system.json @@ -1,425 +1,440 @@ { - "id": "daggerheart", - "title": "Daggerheart", - "description": "An unofficial implementation of the Daggerheart system", - "version": "0.0.1", - "compatibility": { - "minimum": "13", - "verified": "13.342", - "maximum": "13" - }, - "authors": [ - { - "name": "Darrington Press LLC" + "id": "daggerheart", + "title": "Daggerheart", + "description": "An unofficial implementation of the Daggerheart system", + "version": "0.0.1", + "compatibility": { + "minimum": "13", + "verified": "13.342", + "maximum": "13" }, - { - "name": "HarryFurAlle" - }, - { - "name": "cptn-cosmo" - }, - { - "name": "Ikraik" - }, - { - "name": "IrkTheImp" - }, - { - "name": "jacobwojoski" - }, - { - "name": "moliloo" - }, - { - "name": "Mysteryusy" - } - ], - "scripts": ["build/daggerheart.js"], - "styles": [ - "styles/daggerheart.css" - ], - "packs": [ - { - "name": "classes", - "label": "Classes", - "system": "daggerheart", - "path": "packs/classes.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "class-features", - "label": "Class Features", - "system": "daggerheart", - "path": "packs/class-features.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "subclasses", - "label": "Subclasses", - "system": "daggerheart", - "path": "packs/subclasses.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "arcana-domain", - "label": "Arcana", - "system": "daggerheart", - "path": "packs/domain-cards/arcana.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "blade-domain", - "label": "Blade", - "system": "daggerheart", - "path": "packs/domain-cards/blade.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "bone-domain", - "label": "Bone", - "system": "daggerheart", - "path": "packs/domain-cards/bone.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "codex-domain", - "label": "Codex", - "system": "daggerheart", - "path": "packs/domain-cards/codex.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "grace-domain", - "label": "Grace", - "system": "daggerheart", - "path": "packs/domain-cards/grace.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "midnight-domain", - "label": "Midnight", - "system": "daggerheart", - "path": "packs/domain-cards/midnight.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "sage-domain", - "label": "Sage", - "system": "daggerheart", - "path": "packs/domain-cards/sage.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "splendor-domain", - "label": "Splendor", - "system": "daggerheart", - "path": "packs/domain-cards/splendor.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "valor-domain", - "label": "Valor", - "system": "daggerheart", - "path": "packs/domain-cards/valor.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "ancestries", - "label": "Ancestry", - "system": "daggerheart", - "path": "packs/ancestries.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "communities", - "label": "Communities", - "system": "daggerheart", - "path": "packs/communities.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "community-features", - "label": "Community Features", - "system": "daggerheart", - "path": "packs/community-features.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "weapons-tier1", - "label": "Tier 1", - "system": "daggerheart", - "path": "packs/items/weapons/tier1.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "weapons-tier2", - "label": "Tier 2", - "system": "daggerheart", - "path": "packs/items/weapons/tier2.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "weapons-tier3", - "label": "Tier 3", - "system": "daggerheart", - "path": "packs/items/weapons/tier3.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "weapons-tier4", - "label": "Tier 4", - "system": "daggerheart", - "path": "packs/items/weapons/tier4.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "armor-tier1", - "label": "Tier 1", - "system": "daggerheart", - "path": "packs/items/armor/tier1.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "armor-tier2", - "label": "Tier 2", - "system": "daggerheart", - "path": "packs/items/armor/tier2.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "armor-tier3", - "label": "Tier 3", - "system": "daggerheart", - "path": "packs/items/armor/tier3.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "armor-tier4", - "label": "Tier 4", - "system": "daggerheart", - "path": "packs/items/armor/tier4.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "consumables", - "label": "Consumables", - "system": "daggerheart", - "path": "packs/items/consumables.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "general-items", - "label": "General Items", - "system": "daggerheart", - "path": "packs/items/general.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "adversaries-tier1", - "label": "Tier 1", - "system": "daggerheart", - "path": "packs/adversaries/tier1.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "adversaries-tier2", - "label": "Tier 2", - "system": "daggerheart", - "path": "packs/adversaries/tier2.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "adversaries-tier3", - "label": "Tier 3", - "system": "daggerheart", - "path": "packs/adversaries/tier3.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "adversaries-tier4", - "label": "Tier 4", - "system": "daggerheart", - "path": "packs/adversaries/tier4.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "environments-tier1", - "label": "Tier 1", - "system": "daggerheart", - "path": "packs/environments/tier1.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "environments-tier2", - "label": "Tier 2", - "system": "daggerheart", - "path": "packs/environments/tier2.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "environments-tier3", - "label": "Tier 3", - "system": "daggerheart", - "path": "packs/environments/tier3.db", - "type": "Item", - "private": false, - "flags": {} - }, - { - "name": "environments-tier4", - "label": "Tier 4", - "system": "daggerheart", - "path": "packs/environments/tier4.db", - "type": "Item", - "private": false, - "flags": {} - } - ], - "packFolders": [ - { - "name": "Daggerheart", - "sorting": "m", - "color": "#08718c", - "packs": [], - "folders": [ + "authors": [ { - "name": "Character Options", - "sorting": "m", - "color": "#000000", - "packs": ["classes", "class-features", "subclasses", "ancestries", "communities", "community-features"], - "folders": [ - { - "name": "Domains", - "sorting": "m", - "color": "#000000", - "packs": ["arcana-domain", "blade-domain", "bone-domain", "codex-domain", "grace-domain", "midnight-domain", "sage-domain", "splendor-domain", "valor-domain"] - } - ] + "name": "Darrington Press LLC" }, { - "name": "Items", - "sorting": "m", - "color": "#000000", - "folders": [ - { - "name": "Weapons", - "sorting": "m", - "color": "#000000", - "packs": ["weapons-tier1", "weapons-tier2", "weapons-tier3", "weapons-tier4"] - }, - { - "name": "Armor", - "sorting": "m", - "color": "#000000", - "packs": ["armor-tier1", "armor-tier2", "armor-tier3", "armor-tier4"] - }, - { - "name": "Consumables", - "sorting": "m", - "color": "#000000", - "packs": ["consumables"] - }, - { - "name": "General", - "sorting": "m", - "color": "#000000", - "packs": ["general-items"] - } - ] + "name": "HarryFurAlle" }, { - "name": "Adversaries", - "sorting": "m", - "color": "#000000", - "packs": ["adversaries-tier1", "adversaries-tier2", "adversaries-tier3", "adversaries-tier4"] + "name": "cptn-cosmo" }, { - "name": "Environments", - "sorting": "m", - "color": "#000000", - "packs": ["environments-tier1", "environments-tier2", "environments-tier3", "environments-tier4"] + "name": "Ikraik" + }, + { + "name": "IrkTheImp" + }, + { + "name": "jacobwojoski" + }, + { + "name": "moliloo" + }, + { + "name": "Mysteryusy" } - ] - } - ], - "languages": [ - { - "lang": "en", - "name": "English", - "path": "lang/en.json" - } - ], - "socket": true, - "initiative": "1d20", - "grid": { - "distance": 5, - "units": "feet" - }, - "primaryTokenAttribute": "resources.health", - "secondaryTokenAttribute": "resources.stress", - "url": "https://your/hosted/system/repo/", - "manifest": "https://your/hosted/system/repo/system.json", - "download": "https://your/packaged/download/archive.zip" + ], + "scripts": ["build/daggerheart.js"], + "styles": ["styles/daggerheart.css"], + "packs": [ + { + "name": "classes", + "label": "Classes", + "system": "daggerheart", + "path": "packs/classes.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "class-features", + "label": "Class Features", + "system": "daggerheart", + "path": "packs/class-features.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "subclasses", + "label": "Subclasses", + "system": "daggerheart", + "path": "packs/subclasses.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "arcana-domain", + "label": "Arcana", + "system": "daggerheart", + "path": "packs/domain-cards/arcana.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "blade-domain", + "label": "Blade", + "system": "daggerheart", + "path": "packs/domain-cards/blade.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "bone-domain", + "label": "Bone", + "system": "daggerheart", + "path": "packs/domain-cards/bone.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "codex-domain", + "label": "Codex", + "system": "daggerheart", + "path": "packs/domain-cards/codex.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "grace-domain", + "label": "Grace", + "system": "daggerheart", + "path": "packs/domain-cards/grace.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "midnight-domain", + "label": "Midnight", + "system": "daggerheart", + "path": "packs/domain-cards/midnight.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "sage-domain", + "label": "Sage", + "system": "daggerheart", + "path": "packs/domain-cards/sage.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "splendor-domain", + "label": "Splendor", + "system": "daggerheart", + "path": "packs/domain-cards/splendor.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "valor-domain", + "label": "Valor", + "system": "daggerheart", + "path": "packs/domain-cards/valor.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "ancestries", + "label": "Ancestry", + "system": "daggerheart", + "path": "packs/ancestries.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "communities", + "label": "Communities", + "system": "daggerheart", + "path": "packs/communities.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "community-features", + "label": "Community Features", + "system": "daggerheart", + "path": "packs/community-features.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "weapons-tier1", + "label": "Tier 1", + "system": "daggerheart", + "path": "packs/items/weapons/tier1.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "weapons-tier2", + "label": "Tier 2", + "system": "daggerheart", + "path": "packs/items/weapons/tier2.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "weapons-tier3", + "label": "Tier 3", + "system": "daggerheart", + "path": "packs/items/weapons/tier3.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "weapons-tier4", + "label": "Tier 4", + "system": "daggerheart", + "path": "packs/items/weapons/tier4.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "armor-tier1", + "label": "Tier 1", + "system": "daggerheart", + "path": "packs/items/armor/tier1.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "armor-tier2", + "label": "Tier 2", + "system": "daggerheart", + "path": "packs/items/armor/tier2.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "armor-tier3", + "label": "Tier 3", + "system": "daggerheart", + "path": "packs/items/armor/tier3.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "armor-tier4", + "label": "Tier 4", + "system": "daggerheart", + "path": "packs/items/armor/tier4.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "consumables", + "label": "Consumables", + "system": "daggerheart", + "path": "packs/items/consumables.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "general-items", + "label": "General Items", + "system": "daggerheart", + "path": "packs/items/general.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "adversaries-tier1", + "label": "Tier 1", + "system": "daggerheart", + "path": "packs/adversaries/tier1.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "adversaries-tier2", + "label": "Tier 2", + "system": "daggerheart", + "path": "packs/adversaries/tier2.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "adversaries-tier3", + "label": "Tier 3", + "system": "daggerheart", + "path": "packs/adversaries/tier3.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "adversaries-tier4", + "label": "Tier 4", + "system": "daggerheart", + "path": "packs/adversaries/tier4.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "environments-tier1", + "label": "Tier 1", + "system": "daggerheart", + "path": "packs/environments/tier1.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "environments-tier2", + "label": "Tier 2", + "system": "daggerheart", + "path": "packs/environments/tier2.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "environments-tier3", + "label": "Tier 3", + "system": "daggerheart", + "path": "packs/environments/tier3.db", + "type": "Item", + "private": false, + "flags": {} + }, + { + "name": "environments-tier4", + "label": "Tier 4", + "system": "daggerheart", + "path": "packs/environments/tier4.db", + "type": "Item", + "private": false, + "flags": {} + } + ], + "packFolders": [ + { + "name": "Daggerheart", + "sorting": "m", + "color": "#08718c", + "packs": [], + "folders": [ + { + "name": "Character Options", + "sorting": "m", + "color": "#000000", + "packs": [ + "classes", + "class-features", + "subclasses", + "ancestries", + "communities", + "community-features" + ], + "folders": [ + { + "name": "Domains", + "sorting": "m", + "color": "#000000", + "packs": [ + "arcana-domain", + "blade-domain", + "bone-domain", + "codex-domain", + "grace-domain", + "midnight-domain", + "sage-domain", + "splendor-domain", + "valor-domain" + ] + } + ] + }, + { + "name": "Items", + "sorting": "m", + "color": "#000000", + "folders": [ + { + "name": "Weapons", + "sorting": "m", + "color": "#000000", + "packs": ["weapons-tier1", "weapons-tier2", "weapons-tier3", "weapons-tier4"] + }, + { + "name": "Armor", + "sorting": "m", + "color": "#000000", + "packs": ["armor-tier1", "armor-tier2", "armor-tier3", "armor-tier4"] + }, + { + "name": "Consumables", + "sorting": "m", + "color": "#000000", + "packs": ["consumables"] + }, + { + "name": "General", + "sorting": "m", + "color": "#000000", + "packs": ["general-items"] + } + ] + }, + { + "name": "Adversaries", + "sorting": "m", + "color": "#000000", + "packs": ["adversaries-tier1", "adversaries-tier2", "adversaries-tier3", "adversaries-tier4"] + }, + { + "name": "Environments", + "sorting": "m", + "color": "#000000", + "packs": ["environments-tier1", "environments-tier2", "environments-tier3", "environments-tier4"] + } + ] + } + ], + "languages": [ + { + "lang": "en", + "name": "English", + "path": "lang/en.json" + } + ], + "socket": true, + "initiative": "1d20", + "grid": { + "distance": 5, + "units": "feet" + }, + "primaryTokenAttribute": "resources.health", + "secondaryTokenAttribute": "resources.stress", + "url": "https://your/hosted/system/repo/", + "manifest": "https://your/hosted/system/repo/system.json", + "download": "https://your/packaged/download/archive.zip" } diff --git a/template.json b/template.json index 1b297265..e66dba4a 100644 --- a/template.json +++ b/template.json @@ -1,33 +1,45 @@ { - "Actor": { - "types": ["pc", "npc", "adversary", "environment"], - "pc": {}, - "npc": {}, - "adversary": {}, - "environment": {} - }, - "Item": { - "types": ["ancestry", "community", "class", "subclass", "feature", "domainCard", "miscellaneous", "consumable", "weapon", "armor", "test"], - "ancestry": {}, - "community": {}, - "class": {}, - "subclass": {}, - "feature": {}, - "domainCard": {}, - "miscellaneous": {}, - "consumable": {}, - "weapon": {}, - "armor": {}, - "test": {} - }, - "Combat": { - "types": ["combat"], - "combat": {} - }, - "ChatMessage": { - "types": ["dualityRoll", "adversaryRoll", "abilityUse"], - "dualityRoll": {}, - "adversaryRoll": {}, - "abilityUse": {} - } -} \ No newline at end of file + "Actor": { + "types": ["pc", "npc", "adversary", "environment"], + "pc": {}, + "npc": {}, + "adversary": {}, + "environment": {} + }, + "Item": { + "types": [ + "ancestry", + "community", + "class", + "subclass", + "feature", + "domainCard", + "miscellaneous", + "consumable", + "weapon", + "armor", + "test" + ], + "ancestry": {}, + "community": {}, + "class": {}, + "subclass": {}, + "feature": {}, + "domainCard": {}, + "miscellaneous": {}, + "consumable": {}, + "weapon": {}, + "armor": {}, + "test": {} + }, + "Combat": { + "types": ["combat"], + "combat": {} + }, + "ChatMessage": { + "types": ["dualityRoll", "adversaryRoll", "abilityUse"], + "dualityRoll": {}, + "adversaryRoll": {}, + "abilityUse": {} + } +} diff --git a/tools/pullYMLtoLDB.mjs b/tools/pullYMLtoLDB.mjs index e8ab8154..a9d890d5 100644 --- a/tools/pullYMLtoLDB.mjs +++ b/tools/pullYMLtoLDB.mjs @@ -1,16 +1,12 @@ -import { compilePack } from "@foundryvtt/foundryvtt-cli"; -import { promises as fs } from "fs"; +import { compilePack } from '@foundryvtt/foundryvtt-cli'; +import { promises as fs } from 'fs'; const MODULE_ID = process.cwd(); const yaml = false; -const packs = await fs.readdir("./src/packs"); +const packs = await fs.readdir('./src/packs'); for (const pack of packs) { - if (pack === ".gitattributes") continue; - console.log("Packing " + pack); - await compilePack( - `${MODULE_ID}/src/packs/${pack}`, - `${MODULE_ID}/packs/${pack}`, - { yaml }, - ); + if (pack === '.gitattributes') continue; + console.log('Packing ' + pack); + await compilePack(`${MODULE_ID}/src/packs/${pack}`, `${MODULE_ID}/packs/${pack}`, { yaml }); } diff --git a/tools/pushLDBtoYML.mjs b/tools/pushLDBtoYML.mjs index 9bc71ddc..38b66809 100644 --- a/tools/pushLDBtoYML.mjs +++ b/tools/pushLDBtoYML.mjs @@ -1,42 +1,36 @@ -import { extractPack } from "@foundryvtt/foundryvtt-cli"; -import { promises as fs } from "fs"; -import path from "path"; +import { extractPack } from '@foundryvtt/foundryvtt-cli'; +import { promises as fs } from 'fs'; +import path from 'path'; const MODULE_ID = process.cwd(); const yaml = false; -const packs = await fs.readdir("./packs"); +const packs = await fs.readdir('./packs'); for (const pack of packs) { - if (pack === ".gitattributes") continue; - console.log("Unpacking " + pack); - const directory = `./src/packs/${pack}`; - try { - for (const file of await fs.readdir(directory)) { - await fs.unlink(path.join(directory, file)); + if (pack === '.gitattributes') continue; + console.log('Unpacking ' + pack); + const directory = `./src/packs/${pack}`; + try { + for (const file of await fs.readdir(directory)) { + await fs.unlink(path.join(directory, file)); + } + } catch (error) { + if (error.code === 'ENOENT') console.log('No files inside of ' + pack); + else console.log(error); } - } catch (error) { - if (error.code === "ENOENT") console.log("No files inside of " + pack); - else console.log(error); - } - await extractPack( - `${MODULE_ID}/packs/${pack}`, - `${MODULE_ID}/src/packs/${pack}`, - { - yaml, - transformName, - }, - ); + await extractPack(`${MODULE_ID}/packs/${pack}`, `${MODULE_ID}/src/packs/${pack}`, { + yaml, + transformName + }); } /** * Prefaces the document with its type * @param {object} doc - The document data */ function transformName(doc) { - const safeFileName = doc.name.replace(/[^a-zA-Z0-9А-я]/g, "_"); - const type = doc._key.split("!")[1]; - const prefix = ["actors", "items"].includes(type) ? doc.type : type; + const safeFileName = doc.name.replace(/[^a-zA-Z0-9А-я]/g, '_'); + const type = doc._key.split('!')[1]; + const prefix = ['actors', 'items'].includes(type) ? doc.type : type; - return `${doc.name ? `${prefix}_${safeFileName}_${doc._id}` : doc._id}.${ - yaml ? "yml" : "json" - }`; + return `${doc.name ? `${prefix}_${safeFileName}_${doc._id}` : doc._id}.${yaml ? 'yml' : 'json'}`; }