diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index 76b2e751..067aa473 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -175,14 +175,14 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio this.disadvantage = advantage === -1; this.config.roll.advantage = this.config.roll.advantage === advantage ? 0 : advantage; - if (this.config.roll.advantage === 0) return this.render(); - const defaultFaces = - this.config.roll.advantage === 1 - ? this.config.data.rules.roll.defaultAdvantageDice - : this.config.data.rules.roll.defaultDisadvantageDice; - const faces = Number.parseInt(defaultFaces); - this.roll.advantageFaces = Number.isNaN(faces) ? this.roll.advantageFaces : faces; + if (this.config.roll.advantage === 1 && this.config.data.rules.roll.defaultAdvantageDice) { + const faces = Number.parseInt(this.config.data.rules.roll.defaultAdvantageDice); + this.roll.advantageFaces = Number.isNaN(faces) ? this.roll.advantageFaces : faces; + } else if (this.config.roll.advantage === -1 && this.config.data.rules.roll.defaultDisadvantageDice) { + const faces = Number.parseInt(this.config.data.rules.roll.defaultDisadvantageDice); + this.roll.advantageFaces = Number.isNaN(faces) ? this.roll.advantageFaces : faces; + } this.render(); } diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs index e83dfae4..7406b084 100644 --- a/module/applications/sheets-configs/action-base-config.mjs +++ b/module/applications/sheets-configs/action-base-config.mjs @@ -204,7 +204,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) }; } - if (this.action.parent.metadata.isInventoryItem) { + if (this.action.parent.metadata?.isQuantifiable) { options.quantity = { label: 'DAGGERHEART.GENERAL.itemQuantity', group: 'Global' diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index cb9f1701..834a57a8 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -175,7 +175,6 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac const partContext = await super._preparePartContext(partId, context); switch (partId) { case 'details': - partContext.isItemEffect = partContext.isItemEffect || this.options.isSetting; const useGeneric = game.settings.get( CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 19b82712..5f6c854b 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -184,9 +184,6 @@ export default class CharacterSheet extends DHBaseActorSheet { for (const input of form.querySelectorAll('input:not([type=search]), .editor.prosemirror')) { input.disabled = disabled; } - for (const element of form.querySelectorAll('.input[contenteditable]')) { - element.classList.toggle('disabled', disabled); - } } /** @inheritDoc */ @@ -371,7 +368,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const doc = getDocFromElementSync(target); return doc?.isOwner && !isItemWizardManaged(doc); }, - onClick: async (event, target) => { + callback: async (target, event) => { const doc = await getDocFromElement(target); if (event.shiftKey) return doc.delete(); else return doc.deleteDialog(); @@ -396,7 +393,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const doc = getDocFromElementSync(target); return doc?.isOwner && doc.system.inVault; }, - onClick: async (_, target) => { + callback: async target => { const doc = await getDocFromElement(target); const actorLoadout = doc.actor.system.loadoutSlot; if (actorLoadout.available) return doc.update({ 'system.inVault': false }); @@ -410,7 +407,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const doc = getDocFromElementSync(target); return doc?.isOwner && doc.system.inVault; }, - onClick: async (event, target) => { + callback: async (target, event) => { const doc = await getDocFromElement(target); const actorLoadout = doc.actor.system.loadoutSlot; if (!actorLoadout.available) { @@ -449,7 +446,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const doc = getDocFromElementSync(target); return doc?.isOwner && !doc.system.inVault; }, - onClick: async (_, target) => (await getDocFromElement(target)).update({ 'system.inVault': true }) + callback: async target => (await getDocFromElement(target)).update({ 'system.inVault': true }) } ].map(option => ({ ...option, @@ -475,7 +472,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const doc = getDocFromElementSync(target); return doc.isOwner && doc && !doc.system.equipped; }, - onClick: (event, target) => CharacterSheet.#toggleEquipItem.call(this, event, target) + callback: (target, event) => CharacterSheet.#toggleEquipItem.call(this, event, target) }, { label: 'unequip', @@ -484,7 +481,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const doc = getDocFromElementSync(target); return doc.isOwner && doc && doc.system.equipped; }, - onClick: (event, target) => CharacterSheet.#toggleEquipItem.call(this, event, target) + callback: (target, event) => CharacterSheet.#toggleEquipItem.call(this, event, target) } ].map(option => ({ ...option, diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 2b0c3e55..c79db99b 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -424,7 +424,7 @@ export default function DHApplicationMixin(Base) { const target = element.closest('[data-item-uuid]'); return !target.dataset.disabled && target.dataset.itemType !== 'beastform'; }, - onClick: async (_, target) => (await getDocFromElement(target)).update({ disabled: true }) + callback: async target => (await getDocFromElement(target)).update({ disabled: true }) }, { label: 'enableEffect', @@ -433,7 +433,7 @@ export default function DHApplicationMixin(Base) { const target = element.closest('[data-item-uuid]'); return target.dataset.disabled && target.dataset.itemType !== 'beastform'; }, - onClick: async (_, target) => (await getDocFromElement(target)).update({ disabled: false }) + callback: async target => (await getDocFromElement(target)).update({ disabled: false }) } ].map(option => ({ ...option, @@ -478,9 +478,7 @@ export default function DHApplicationMixin(Base) { (doc?.isOwner && (!doc?.hasOwnProperty('systemPath') || doc?.inCollection)) ); }, - onClick: async (_, target) => { - return (await getDocFromElement(target)).sheet.render({ force: true }); - } + callback: async target => (await getDocFromElement(target)).sheet.render({ force: true }) } ]; @@ -495,7 +493,7 @@ export default function DHApplicationMixin(Base) { !foundry.utils.isEmpty(doc?.damage?.parts); return doc?.isOwner && hasDamage; }, - onClick: async (event, target) => { + callback: async (target, event) => { const doc = await getDocFromElement(target), action = doc?.system?.attack ?? doc; const config = action.prepareConfig(event); @@ -515,7 +513,7 @@ export default function DHApplicationMixin(Base) { const doc = getDocFromElementSync(target); return doc?.isOwner && !(doc.type === 'domainCard' && doc.system.inVault); }, - onClick: async (event, target) => (await getDocFromElement(target)).use(event) + callback: async (target, event) => (await getDocFromElement(target)).use(event) }); } @@ -523,7 +521,7 @@ export default function DHApplicationMixin(Base) { options.push({ label: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat', icon: 'fa-solid fa-message', - onClick: async (_, target) => (await getDocFromElement(target)).toChat(this.document.uuid) + callback: async target => (await getDocFromElement(target)).toChat(this.document.uuid) }); if (deletable) @@ -535,7 +533,7 @@ export default function DHApplicationMixin(Base) { const doc = getDocFromElementSync(target); return doc?.isOwner !== false && target.dataset.itemType !== 'beastform'; }, - onClick: async (event, target) => { + callback: async (target, event) => { const doc = await getDocFromElement(target); if (event.shiftKey) return doc.delete(); else return doc.deleteDialog(); diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 5cd0f6a5..e23a4426 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -166,15 +166,6 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { } } - /** Add support for input content editables */ - _toggleDisabled(disabled) { - super._toggleDisabled(disabled); - const form = this.form; - for (const element of form.querySelectorAll('.input[contenteditable]')) { - element.classList.toggle('disabled', disabled); - } - } - /* -------------------------------------------- */ /* Context Menu */ /* -------------------------------------------- */ diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs index 1e08fc05..e3568b23 100644 --- a/module/applications/sheets/api/base-item.mjs +++ b/module/applications/sheets/api/base-item.mjs @@ -126,7 +126,7 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { options.push({ name: 'CONTROLS.CommonDelete', icon: '', - onClick: async (_, target) => { + callback: async target => { const feature = await getDocFromElement(target); if (!feature) return; const confirmed = await foundry.applications.api.DialogV2.confirm({ diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index 7036a5df..b829b2e7 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -108,7 +108,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo icon: '', visible: li => { const message = game.messages.get(li.dataset.messageId); - return message.system.hasRoll && (game.user.isGM || message.isAuthor); + return game.user.isGM || message.isAuthor; }, callback: async li => { const message = game.messages.get(li.dataset.messageId); @@ -128,8 +128,10 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo }, callback: async li => { const message = game.messages.get(li.dataset.messageId); - const update = await message.system.getRerolledDamage(); - message.update(update); + const damageRoll = new game.system.api.dice.DamageRoll(message.system.damage.hitPoints.roll); + await message.system.action.workflow.get('damage')?.execute(message.system, message.id, true); + // message.update({ rolls: [reroll] }); + console.log('test'); } } ]; diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs index 8f38918a..d98cf2da 100644 --- a/module/applications/ui/itemBrowser.mjs +++ b/module/applications/ui/itemBrowser.mjs @@ -1,4 +1,3 @@ -import { getDocFromElement } from '../../helpers/utils.mjs'; import { RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -48,8 +47,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { expandContent: this.expandContent, resetFilters: this.resetFilters, sortList: this.sortList, - openSettings: this.openSettings, - viewSheet: this.#onViewSheet + openSettings: this.openSettings }, position: { left: 100, @@ -308,8 +306,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { { items: this.items, menu: this.selectedMenu, - formatLabel: this.formatLabel, - viewSheet: this.items[0] instanceof Actor + formatLabel: this.formatLabel } ); @@ -571,11 +568,6 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { } } - static async #onViewSheet(_, target) { - const document = await getDocFromElement(target); - document?.sheet?.render(true); - } - _createDragProcess() { new foundry.applications.ux.DragDrop.implementation({ dragSelector: '.item-container', @@ -614,16 +606,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { items: { folder: 'equipments', render: { - folders: [ - 'equipments', - 'ancestries', - 'classes', - 'subclasses', - 'domains', - 'communities', - 'beastforms' - // excluded: features - ] + noFolder: true } }, compendium: {} diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index acd104a7..b3775dc9 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -148,14 +148,10 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel : null; } - /** - * Returns true if the action is usable. - * An action is usable on any actor type. For example, an adversary might have a base attack action. - */ + /** Returns true if the action is usable */ get usable() { const actor = this.actor; - const pack = actor?.pack ? game.packs.get(actor.pack) : null; - return !pack?.locked && this.isOwner; + return this.isOwner && actor?.type === 'character'; } static getRollType(parent) { diff --git a/module/data/chat-message/actorRoll.mjs b/module/data/chat-message/actorRoll.mjs index caffde09..eaa1cdc2 100644 --- a/module/data/chat-message/actorRoll.mjs +++ b/module/data/chat-message/actorRoll.mjs @@ -130,41 +130,6 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { }); } - /* TODO: Change how damage data is stored somehow to enable better rerolling */ - async getRerolledDamage() { - if (!this.damage) return; - - const rerolls = []; - const update = { system: { damage: {} } }; - for (const partKey in this.damage) { - const part = this.damage[partKey]; - const testRoll = Roll.fromData(part.parts[0].roll); - const rerolled = await testRoll.reroll(); - rerolls.push(rerolled); - - if (!update.system.damage[partKey]) update.system.damage[partKey] = { parts: [part.parts[0]] }; - const partData = update.system.damage[partKey].parts[0]; - update.system.damage[partKey].total = rerolled.total; - partData.modifierTotal = rerolled.terms.reduce((acc, x) => { - if (x.isDeterministic && !x.operator) acc += x.total; - return acc; - }, 0); - partData.dice = rerolled.dice; - partData.total = rerolled.total; - partData.roll = rerolled.toJSON(); - } - - if (game.modules.get('dice-so-nice')?.active) { - for (const roll of rerolls) { - await game.dice3d.showForRoll(roll, game.user, true); - } - } else { - foundry.audio.AudioHelper.play({ src: CONFIG.sounds.dice }); - } - - return update; - } - registerTargetHook() { if (!this.parent.isAuthor || !this.hasTarget) return; if (this.targetMode && this.parent.targetHook !== null) { diff --git a/module/data/fields/action/costField.mjs b/module/data/fields/action/costField.mjs index 1928af41..9271f6b0 100644 --- a/module/data/fields/action/costField.mjs +++ b/module/data/fields/action/costField.mjs @@ -103,7 +103,7 @@ export default class CostField extends fields.ArrayField { static calcCosts(costs) { const resources = CostField.getResources.call(this, costs); let filteredCosts = costs; - if (this.parent?.isInventoryItem && this.parent.consumeOnUse === false) { + if (this.parent?.metadata.isQuantifiable && this.parent.consumeOnUse === false) { filteredCosts = filteredCosts.filter(c => c.key !== 'quantity'); } diff --git a/module/data/fields/action/rollField.mjs b/module/data/fields/action/rollField.mjs index a1c813c6..63d48990 100644 --- a/module/data/fields/action/rollField.mjs +++ b/module/data/fields/action/rollField.mjs @@ -78,6 +78,24 @@ export class DHActionRollData extends foundry.abstract.DataModel { return formula; } + getModifier() { + const modifiers = []; + if (!this.parent?.actor) return modifiers; + switch (this.parent.actor.type) { + case 'companion': + case 'adversary': + if (this.type === CONFIG.DH.GENERAL.rollTypes.attack.id) + modifiers.push({ + label: 'Bonus to Hit', + value: this.bonus ?? this.parent.actor.system.attack.roll.bonus ?? 0 + }); + break; + default: + break; + } + return modifiers; + } + get rollTrait() { if (this.parent?.actor?.type !== 'character') return null; switch (this.type) { @@ -127,6 +145,7 @@ export default class RollField extends fields.EmbeddedDataField { config.dialog.configure = RollField.getAutomation() ? !config.dialog.configure : config.dialog.configure; const roll = { + baseModifiers: this.roll.getModifier(), label: 'Attack', type: this.roll?.type, trait: this.roll?.rollTrait, diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index 346f6b87..509f5d69 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -128,30 +128,8 @@ export default class D20Roll extends DHRoll { } } - getBaseModifiers() { - const modifiers = []; - const actor = foundry.utils.fromUuidSync(this.options.source.actor); - if (!actor) return modifiers; - switch (actor.type) { - case 'companion': - case 'adversary': - if ( - this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.attack.id || - this.options.source.action === actor.system.attack.id - ) - modifiers.push({ - label: 'Bonus to Hit', - value: this.data.attack.roll.bonus ?? 0 - }); - break; - default: - break; - } - return modifiers; - } - applyBaseBonus() { - const modifiers = this.getBaseModifiers(); + const modifiers = foundry.utils.deepClone(this.options.roll.baseModifiers) ?? []; modifiers.push( ...this.getBonus( @@ -246,19 +224,4 @@ export default class D20Roll extends DHRoll { resetFormula() { return (this._formula = this.constructor.getFormula(this.terms)); } - - async reroll(options) { - const result = await super.reroll(options); - if (this instanceof game.system.api.dice.DualityRoll) return result; - - if (options?.liveRoll) { - if (game.modules.get('dice-so-nice')?.active) { - await game.dice3d.showForRoll(result, game.user, true); - } else { - foundry.audio.AudioHelper.play({ src: CONFIG.sounds.dice }); - } - } - - return result; - } } diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index 1fc30d29..98fd8401 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -18,12 +18,7 @@ export default class DamageRoll extends DHRoll { if (config.evaluate !== false) for (const roll of config.roll) await roll.roll.evaluate(); roll._evaluated = true; - - const parts = []; - for (const roll of config.roll) { - parts.push(this.postEvaluate(roll)); - roll.roll = JSON.stringify(roll.roll.toJSON()); - } + const parts = config.roll.map(r => this.postEvaluate(r)); config.damage = this.unifyDamageRoll(parts); } diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 63f21667..e4efc4f3 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -150,22 +150,14 @@ export default class DualityRoll extends D20Roll { } applyAdvantage() { - const advDieClass = this.hasAdvantage - ? game.system.api.dice.diceTypes.AdvantageDie - : this.hasDisadvantage - ? game.system.api.dice.diceTypes.DisadvantageDie - : null; - if (advDieClass) { - const advDie = new advDieClass({ faces: this.advantageFaces, number: this.advantageNumber }); - if (this.terms.length < 4) { - if (this.advantageNumber > 1) advDie.modifiers = ['kh']; - this.terms.push( - new foundry.dice.terms.OperatorTerm({ operator: this.hasDisadvantage ? '-' : '+' }), - advDie - ); - } else { - this.terms[4] = advDie; - } + if (this.hasAdvantage || this.hasDisadvantage) { + const dieFaces = this.advantageFaces, + advDie = new foundry.dice.terms.Die({ faces: dieFaces, number: this.advantageNumber }); + if (this.advantageNumber > 1) advDie.modifiers = ['kh']; + this.terms.push( + new foundry.dice.terms.OperatorTerm({ operator: this.hasDisadvantage ? '-' : '+' }), + advDie + ); } if (this.rallyFaces) this.terms.push( diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 603ca594..93aa3b28 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -73,10 +73,8 @@ export default class DHItem extends foundry.documents.Item { /** Returns true if the item can be used */ get usable() { const actor = this.actor; - const pack = actor?.pack ? game.packs.get(actor.pack) : null; - const hasActions = this.system.actionsList?.size || this.system.actionsList?.length; - const isValidType = actor?.type === 'character' || this.type === 'feature'; - return !pack?.locked && this.isOwner && isValidType && hasActions; + const actionsList = this.system.actionsList; + return this.isOwner && actor?.type === 'character' && (actionsList?.size || actionsList?.length); } /** @inheritdoc */ diff --git a/styles/less/dialog/tag-team-dialog/initialization.less b/styles/less/dialog/tag-team-dialog/initialization.less index f53a7af4..2d015141 100644 --- a/styles/less/dialog/tag-team-dialog/initialization.less +++ b/styles/less/dialog/tag-team-dialog/initialization.less @@ -1,5 +1,3 @@ -@import '../../utils/mixin.less'; - .theme-light .daggerheart.dialog.dh-style.views.tag-team-dialog { .initialization-container .members-container .member-container { .member-name { @@ -64,7 +62,17 @@ color: var(--color-text-primary); text-shadow: 1px 1px 2px var(--shadow-color), 0 0 10px var(--shadow-color); - .smooth-gradient-ease-in-out(background-image, to bottom, var(--shadow-color), 100%); + + // Basic "scrim" gradient + background-image: linear-gradient( + to top, + var(--shadow-color), + rgba(from var(--shadow-color) r g b / 0.834) 10.6%, + rgba(from var(--shadow-color) r g b / 0.541) 34%, + rgba(from var(--shadow-color) r g b / 0.382) 47%, + rgba(from var(--shadow-color) r g b / 0.194) 65%, + transparent 100% + ); } img { diff --git a/styles/less/sheets/actors/actor-sheet-shared.less b/styles/less/sheets/actors/actor-sheet-shared.less index 6ef73035..bd82ef83 100644 --- a/styles/less/sheets/actors/actor-sheet-shared.less +++ b/styles/less/sheets/actors/actor-sheet-shared.less @@ -34,7 +34,7 @@ .attribution-header-label { font-style: italic; font-family: @font-body; - color: @color-text-subtle; + color: light-dark(@chat-blue-bg, @beige-50); } .tab.inventory { diff --git a/styles/less/sheets/actors/companion/header.less b/styles/less/sheets/actors/companion/header.less index 6cf886ab..2a162a25 100644 --- a/styles/less/sheets/actors/companion/header.less +++ b/styles/less/sheets/actors/companion/header.less @@ -11,7 +11,7 @@ .profile { height: 235px; cursor: pointer; - .smooth-gradient-ease-in-out(mask-image, to top, black, 2.25rem); + mask-image: linear-gradient(0deg, transparent 0%, black 10%); } .actor-name { @@ -24,16 +24,11 @@ margin-bottom: -30px; input[type='text'] { - backdrop-filter: none; - border: none; - font-family: @font-title; font-size: var(--font-size-24); - outline: 2px solid transparent; - box-shadow: unset; - text-shadow: 0 0 4px light-dark(white, @dark-80), 0 0 8px light-dark(white, @dark-80), 0 0 14px light-dark(white, @dark-80); - - height: 2rem; + height: 32px; text-align: center; + border: 1px solid transparent; + outline: 2px solid transparent; transition: all 0.3s ease; &:hover { @@ -248,7 +243,7 @@ .companion-navigation { display: flex; gap: 8px; - align-items: baseline; + align-items: center; width: 100%; } } diff --git a/styles/less/sheets/actors/environment/header.less b/styles/less/sheets/actors/environment/header.less index ce7e6163..670f6c92 100644 --- a/styles/less/sheets/actors/environment/header.less +++ b/styles/less/sheets/actors/environment/header.less @@ -1,6 +1,5 @@ @import '../../../utils/colors.less'; @import '../../../utils/fonts.less'; -@import '../../../utils/mixin.less'; .application.sheet.daggerheart.actor.dh-style.environment { .environment-header-sheet { @@ -11,83 +10,60 @@ .profile { height: 235px; + mask-image: linear-gradient(0deg, transparent 0%, black 10%); cursor: pointer; - .smooth-gradient-ease-in-out(mask-image, to top, black, 3.5rem); } .item-container { - display: grid; - grid-auto-flow: row; - grid-template-columns: 1fr min-content; - + display: flex; align-items: center; position: relative; - top: -36px; - gap: 0 var(--spacer-12); + top: -45px; + gap: 20px; padding: 0 20px; - margin-bottom: -26px; + margin-bottom: -30px; - .item-name input[type='text'] { - backdrop-filter: none; - border: none; - font-family: @font-title; - font-size: var(--font-size-32); - text-align: start; - transition: all 0.3s ease; - outline: 2px solid transparent; - box-shadow: none; - text-shadow: 0 0 4px light-dark(white, @dark-80), 0 0 8px light-dark(white, @dark-80), 0 0 14px light-dark(white, @dark-80); - - padding-left: 0; - height: 2.625rem; - - &:hover[type='text'], - &:focus[type='text'] { - box-shadow: none; - outline: 2px solid light-dark(@dark-blue, @golden); - } - } - - .flexrow { - align-items: baseline; - grid-column: span 2; - } - - .tags { + .item-info { display: flex; - gap: 10px; - padding-bottom: 0; - flex: 0; + flex-direction: column; + gap: 8px; - .tag { + .tags { display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: var(--font-size-12); - font: @font-body; - white-space: nowrap; + gap: 10px; + padding-bottom: 0; - background: light-dark(@dark-15, @beige-15); - border: 1px solid light-dark(@dark, @beige); - border-radius: 3px; + .tag { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding: 3px 5px; + font-size: var(--font-size-12); + font: @font-body; + + background: light-dark(@dark-15, @beige-15); + border: 1px solid light-dark(@dark, @beige); + border-radius: 3px; + } + + .label { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: var(--font-size-12); + } } - .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: var(--font-size-12); + .attribution-header-label { + text-align: left; + position: relative; + top: 4px; + margin-bottom: -6px; } } - .attribution-header-label { - text-align: right; - position: relative; - } - .status-number { display: flex; align-items: center; @@ -105,7 +81,7 @@ font-size: 1.2rem; align-items: center; justify-content: center; - background: light-dark(#e8e6e3, @dark-blue); + background: light-dark(transparent, @dark-blue); z-index: 2; &.armor-slots { @@ -117,7 +93,7 @@ .status-label { padding: 2px 10px; width: 100%; - border-radius: 0 0 3px 3px; + border-radius: 3px; background: light-dark(@dark-blue, @golden); h4 { @@ -129,23 +105,37 @@ } } } + + .item-name { + input[type='text'] { + font-size: var(--font-size-32); + height: 42px; + text-align: start; + transition: all 0.3s ease; + outline: 2px solid transparent; + border: 1px solid transparent; + + &:hover[type='text'], + &:focus[type='text'] { + box-shadow: none; + outline: 2px solid light-dark(@dark-blue, @golden); + } + } + } } .environment-info { display: flex; flex-direction: column; - gap: var(--spacer-8); + gap: 12px; padding: 10px 20px; } .environment-navigation { display: flex; gap: 20px; - align-items: baseline; + align-items: center; padding: 0 20px; - .tab-navigation { - margin-top: 0; - } } } } diff --git a/styles/less/sheets/actors/environment/sheet.less b/styles/less/sheets/actors/environment/sheet.less index 2d9cc188..a7c9605b 100644 --- a/styles/less/sheets/actors/environment/sheet.less +++ b/styles/less/sheets/actors/environment/sheet.less @@ -5,6 +5,10 @@ .appTheme({ &.environment { background-image: url('../assets/parchments/dh-parchment-dark.png'); + + .attribution-header-label { + background-image: url('../assets/parchments/dh-parchment-dark.png'); + } } }, { &.environment { diff --git a/styles/less/sheets/actors/party/header.less b/styles/less/sheets/actors/party/header.less index 18d69834..9a2c7350 100644 --- a/styles/less/sheets/actors/party/header.less +++ b/styles/less/sheets/actors/party/header.less @@ -1,6 +1,5 @@ @import '../../../utils/colors.less'; @import '../../../utils/fonts.less'; -@import '../../../utils/mixin.less'; .party-header-sheet { display: flex; @@ -10,30 +9,26 @@ .profile { height: 235px; + mask-image: linear-gradient(0deg, transparent 0%, black 10%); cursor: pointer; - .smooth-gradient-ease-in-out(mask-image, to top, black, 3.5rem); } .item-container { - margin-top: -2rem; - z-index: 1; - input.item-name[type='text'] { - backdrop-filter: none; - border: none; - font-family: @font-title; - font-size: var(--font-size-32); - outline: 2px solid transparent; - box-shadow: unset; - text-shadow: 0 0 4px light-dark(white, @dark-80), 0 0 8px light-dark(white, @dark-80), 0 0 14px light-dark(white, @dark-80); + .item-name { + padding: 0 20px; + input[type='text'] { + font-size: 32px; + height: 42px; + text-align: center; + transition: all 0.3s ease; + outline: 2px solid transparent; + border: 1px solid transparent; - text-align: center; - transition: all 0.3s ease; - width: calc(100% - 40px); - height: 2.625rem; - - &:hover[type='text'], - &:focus[type='text'] { - outline: 2px solid light-dark(@dark-blue, @golden); + &:hover[type='text'], + &:focus[type='text'] { + box-shadow: none; + outline: 2px solid light-dark(@dark-blue, @golden); + } } } diff --git a/styles/less/ui/item-browser/item-browser.less b/styles/less/ui/item-browser/item-browser.less index a40c0fae..066da73b 100644 --- a/styles/less/ui/item-browser/item-browser.less +++ b/styles/less/ui/item-browser/item-browser.less @@ -245,7 +245,7 @@ } .item-list-header, - .item-list .item-info[data-action] { + .item-list [data-action='expandContent'] { display: flex; > * { diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less index d35ad8b3..80519a5b 100755 --- a/styles/less/utils/colors.less +++ b/styles/less/utils/colors.less @@ -83,8 +83,6 @@ --gradient-stress: linear-gradient(15deg, rgb(130, 59, 1) 0%, rgb(252, 142, 69) 65%, rgb(190, 0, 0) 100%); --primary-color-fear: rgba(9, 71, 179, 0.75); - - --dh-color-text-subtle: light-dark(#555, #a29086); } @primary-blue: var(--primary-blue, #1488cc); @@ -192,5 +190,3 @@ box-shadow: 0 0 2px 2px @dark-blue; } } - -@color-text-subtle: var(--dh-color-text-subtle); \ No newline at end of file diff --git a/styles/less/utils/mixin.less b/styles/less/utils/mixin.less index b37bfc06..49e97a1f 100644 --- a/styles/less/utils/mixin.less +++ b/styles/less/utils/mixin.less @@ -114,48 +114,3 @@ font-family: @font-body; } } - - -// A simple ease-out mask -.smooth-gradient-ease-out(@param, @to, @destination, @length) { - @{param}+: linear-gradient( - @to, - transparent 0%, - rgb(from @destination r g b / ~"calc(alpha * 0.013)") calc(0.008 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.049)") calc(0.029 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.104)") calc(0.064 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.259)") calc(0.166 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.45)") calc(0.304 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.741)") calc(0.554 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.825)") calc(0.644 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.896)") calc(0.735 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.951)") calc(0.825 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.987)") calc(0.914 * @length), - @destination @length - ); -} - -/** - * A simple ease in and out mask. - * @param - the parameter to add to - * @param - direction, such as "to top" - * @destination - the color at the destination. The origin is always transparent - * @length - the value at the destination - */ -.smooth-gradient-ease-in-out(@param, @to, @destination, @length: 100%) { - @{param}+: linear-gradient( - @to, - transparent 0%, - rgb(from @destination r g b / ~"calc(alpha * 0.013)") calc(0.081 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.049)") calc(0.155 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.104)") calc(0.225 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.259)") calc(0.353 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.45)") calc(0.471 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.741)") calc(0.647 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.825)") calc(0.71 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.896)") calc(0.775 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.951)") calc(0.845 * @length), - rgb(from @destination r g b / ~"calc(alpha * 0.987)") calc(0.914 * @length), - @destination @length - ); -} diff --git a/templates/sheets/activeEffect/details.hbs b/templates/sheets/activeEffect/details.hbs index 8ab4b5cf..dc19b3dc 100644 --- a/templates/sheets/activeEffect/details.hbs +++ b/templates/sheets/activeEffect/details.hbs @@ -5,9 +5,16 @@ {{formGroup systemFields.targetDispositions value=source.system.targetDispositions name=(concat "system.targetDispositions") localize=true}} {{#if isActorEffect}} - {{formGroup fields.origin value=source.origin rootId=rootId disabled=true}} - {{else if isItemEffect}} - {{formGroup fields.transfer value=source.transfer rootId=rootId}} +