From a477c9b8528eed10a085cf56b288933be0838b3d Mon Sep 17 00:00:00 2001 From: Chris Ryan <73275196+chrisryan10@users.noreply.github.com> Date: Fri, 19 Sep 2025 06:25:08 +1000 Subject: [PATCH 01/11] Fixed a merge? error in the itemBrowserConfig (#1174) Co-authored-by: Chris Ryan --- module/config/itemBrowserConfig.mjs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/module/config/itemBrowserConfig.mjs b/module/config/itemBrowserConfig.mjs index e870172f..2c3e1dfb 100644 --- a/module/config/itemBrowserConfig.mjs +++ b/module/config/itemBrowserConfig.mjs @@ -370,19 +370,6 @@ export const typeConfig = { label: 'DAGGERHEART.ITEMS.Subclass.spellcastingTrait' } ], - filters: [] - }, - beastforms: { - columns: [ - { - key: 'system.tier', - label: 'DAGGERHEART.GENERAL.Tiers.singular' - }, - { - key: 'system.mainTrait', - label: 'DAGGERHEART.GENERAL.Trait.single' - } - ], filters: [ { key: 'system.linkedClass.uuid', From 55586c93c837662124ebc95b8d4193215a9c0b1d Mon Sep 17 00:00:00 2001 From: Chris Ryan <73275196+chrisryan10@users.noreply.github.com> Date: Fri, 19 Sep 2025 06:27:04 +1000 Subject: [PATCH 02/11] Move Foundryborne menu location; fix localisation; fix deprecation (#1169) Co-authored-by: Chris Ryan --- lang/en.json | 1 + module/applications/sidebar/sidebar.mjs | 43 ++++++++++++++++++++- templates/sidebar/daggerheart-menu/main.hbs | 4 +- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/lang/en.json b/lang/en.json index 685f1266..e40b035c 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2029,6 +2029,7 @@ "range": "Range", "reactionRoll": "Reaction Roll", "recovery": "Recovery", + "refresh": "Refresh", "reroll": "Reroll", "rerollThing": "Reroll {thing}", "resource": "Resource", diff --git a/module/applications/sidebar/sidebar.mjs b/module/applications/sidebar/sidebar.mjs index fad39ac5..ae28d56c 100644 --- a/module/applications/sidebar/sidebar.mjs +++ b/module/applications/sidebar/sidebar.mjs @@ -1,10 +1,49 @@ -export default class DhSidebar extends Sidebar { +export default class DhSidebar extends foundry.applications.sidebar.Sidebar { /** @override */ static TABS = { - ...super.TABS, + chat: { + documentName: 'ChatMessage' + }, + combat: { + documentName: 'Combat' + }, + scenes: { + documentName: 'Scene', + gmOnly: true + }, + actors: { + documentName: 'Actor' + }, + items: { + documentName: 'Item' + }, + journal: { + documentName: 'JournalEntry', + tooltip: 'SIDEBAR.TabJournal' + }, + tables: { + documentName: 'RollTable' + }, + cards: { + documentName: 'Cards' + }, + macros: { + documentName: 'Macro' + }, + playlists: { + documentName: 'Playlist' + }, + compendium: { + tooltip: 'SIDEBAR.TabCompendium', + icon: 'fa-solid fa-book-atlas' + }, daggerheartMenu: { tooltip: 'DAGGERHEART.UI.Sidebar.daggerheartMenu.title', img: 'systems/daggerheart/assets/logos/FoundryBorneLogoWhite.svg' + }, + settings: { + tooltip: 'SIDEBAR.TabSettings', + icon: 'fa-solid fa-gears' } }; diff --git a/templates/sidebar/daggerheart-menu/main.hbs b/templates/sidebar/daggerheart-menu/main.hbs index 6f31f165..b00001eb 100644 --- a/templates/sidebar/daggerheart-menu/main.hbs +++ b/templates/sidebar/daggerheart-menu/main.hbs @@ -16,7 +16,7 @@ {{/each}} - + - \ No newline at end of file + From f1b5c80a53c124845d3ee8a5d3e8c6a7ea45f414 Mon Sep 17 00:00:00 2001 From: Chris Ryan <73275196+chrisryan10@users.noreply.github.com> Date: Fri, 19 Sep 2025 06:28:25 +1000 Subject: [PATCH 03/11] Null check metadata (#1145) * Null check metadata * Fix d20RollDialog action find --------- Co-authored-by: Chris Ryan Co-authored-by: Dapoolp --- module/applications/dialogs/d20RollDialog.mjs | 2 +- module/data/fields/action/costField.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index 6c227152..c57dda12 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -16,7 +16,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio this.action = config.data.attack?._id == config.source.action ? config.data.attack - : this.item.system.actions.get(config.source.action); + : this.item.system.actionsList?.find(a => a.id === config.source.action); } } diff --git a/module/data/fields/action/costField.mjs b/module/data/fields/action/costField.mjs index 2d2a38df..656edee3 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.metadata.isQuantifiable && this.parent.consumeOnUse === false) { + if (this.parent?.metadata.isQuantifiable && this.parent.consumeOnUse === false) { filteredCosts = filteredCosts.filter(c => c.key !== 'quantity'); } From e6559548902a2c68ec3f5b15d66e3f1c422f0ec2 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Thu, 18 Sep 2025 21:33:56 -0400 Subject: [PATCH 04/11] Fix item summary animation replaying on every rerender (#1176) --- .../sheets/api/application-mixin.mjs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index bdd9fa68..5e186c86 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -203,11 +203,19 @@ export default function DHApplicationMixin(Base) { this.relatedDocs.filter(doc => doc).map(doc => delete doc.apps[this.id]); } + /** @inheritdoc */ + async _renderHTML(context, options) { + const rendered = await super._renderHTML(context, options); + for (const result of Object.values(rendered)) { + await this.#prepareInventoryDescription(result); + } + return rendered; + } + /**@inheritdoc */ async _onRender(context, options) { await super._onRender(context, options); this._createTagifyElements(this.options.tagifyConfigs); - await this.#prepareInventoryDescription(context); } /* -------------------------------------------- */ @@ -215,8 +223,8 @@ export default function DHApplicationMixin(Base) { /* -------------------------------------------- */ /**@inheritdoc */ - _syncPartState(partId, newElement, priorElement, state) { - super._syncPartState(partId, newElement, priorElement, state); + _preSyncPartState(partId, newElement, priorElement, state) { + super._preSyncPartState(partId, newElement, priorElement, state); for (const el of priorElement.querySelectorAll('.extensible.extended')) { const { actionId, itemUuid } = el.parentElement.dataset; const selector = `${actionId ? `[data-action-id="${actionId}"]` : `[data-item-uuid="${itemUuid}"]`} .extensible`; @@ -496,11 +504,12 @@ export default function DHApplicationMixin(Base) { /** * Prepares and enriches an inventory item or action description for display. + * @param {HTMLElement} element the element to enrich the inventory items of * @returns {Promise} */ - async #prepareInventoryDescription(context) { + async #prepareInventoryDescription(element) { // Get all inventory item elements with a data-item-uuid attribute - const inventoryItems = this.element.querySelectorAll('.inventory-item[data-item-uuid]'); + const inventoryItems = element.querySelectorAll('.inventory-item[data-item-uuid]'); for (const el of inventoryItems) { // Get the doc uuid from the element const { itemUuid } = el?.dataset || {}; From cc6ef0b7bfb213f36adc0a338c1f0e5ab55b01df Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Mon, 29 Sep 2025 10:10:13 -0400 Subject: [PATCH 05/11] Anchor chat message image crop to top (#1193) --- styles/less/global/chat.less | 1 + 1 file changed, 1 insertion(+) diff --git a/styles/less/global/chat.less b/styles/less/global/chat.less index 95ea956f..3f83294a 100644 --- a/styles/less/global/chat.less +++ b/styles/less/global/chat.less @@ -61,6 +61,7 @@ width: 40px; height: 40px; object-fit: cover; + object-position: top center; } .message-sub-header-container { From 952779000d97c8d1cc9301674c91c04c4b6f9512 Mon Sep 17 00:00:00 2001 From: Chris Ryan <73275196+chrisryan10@users.noreply.github.com> Date: Tue, 30 Sep 2025 04:15:02 +1000 Subject: [PATCH 06/11] [PR] [Feature] Remember the position and size of the compendium browser (#1123) * Remember the position and size of the compendium browser * Save position, size details for the 3 types of compendium browser --------- Co-authored-by: Chris Ryan --- module/applications/ui/itemBrowser.mjs | 28 ++++++++++++++++++++++---- module/config/flagsConfig.mjs | 12 +++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs index a00f8edc..4f3053bb 100644 --- a/module/applications/ui/itemBrowser.mjs +++ b/module/applications/ui/itemBrowser.mjs @@ -16,6 +16,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { this.selectedMenu = { path: [], data: null }; this.config = CONFIG.DH.ITEMBROWSER.compendiumConfig; this.presets = {}; + this.compendiumBrowserTypeKey = 'compendiumBrowserDefault'; } /** @inheritDoc */ @@ -84,10 +85,25 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { /** @inheritDoc */ async _preRender(context, options) { this.presets = options.presets ?? {}; - - const width = this.presets?.render?.noFolder === true || this.presets?.render?.lite === true ? 600 : 850; - if (this.rendered) this.setPosition({ width }); - else options.position.width = width; + const noFolder = this.presets?.render?.noFolder; + if (noFolder === true) { + this.compendiumBrowserTypeKey = 'compendiumBrowserNoFolder'; + } + const lite = this.presets?.render?.lite; + if (lite === true) { + this.compendiumBrowserTypeKey = 'compendiumBrowserLite'; + } + const userPresetPosition = game.user.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS[`${this.compendiumBrowserTypeKey}`].position) ; + + options.position = userPresetPosition ?? ItemBrowser.DEFAULT_OPTIONS.position; + + if (!userPresetPosition) { + const width = noFolder === true || lite === true ? 600 : 850; + if (this.rendered) + this.setPosition({ width }); + else + options.position.width = width; + } await super._preRender(context, options); } @@ -113,6 +129,10 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { }); } + _onPosition(position) { + game.user.setFlag(CONFIG.DH.id, CONFIG.DH.FLAGS[`${this.compendiumBrowserTypeKey}`].position, position); + } + _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); diff --git a/module/config/flagsConfig.mjs b/module/config/flagsConfig.mjs index c2a6dff2..32088bc1 100644 --- a/module/config/flagsConfig.mjs +++ b/module/config/flagsConfig.mjs @@ -8,6 +8,18 @@ export const encounterCountdown = { position: 'countdown-encounter-position' }; +export const compendiumBrowserDefault = { + position: 'compendium-browser-default-position' +}; + +export const compendiumBrowserNoFolder = { + position: 'compendium-browser-no-folder-position' +}; + +export const compendiumBrowserLite = { + position: 'compendium-browser-lite-position' +}; + export const itemAttachmentSource = 'attachmentSource'; export const userFlags = { From 86eeba06483a811b783dbeb852b69f0b379dd553 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Sat, 4 Oct 2025 07:10:39 -0400 Subject: [PATCH 07/11] Implement @Lookup enricher (#1196) --- module/documents/actor.mjs | 1 + module/enrichers/DamageEnricher.mjs | 29 ++------------ module/enrichers/LookupEnricher.mjs | 8 ++++ module/enrichers/TemplateEnricher.mjs | 55 ++++++--------------------- module/enrichers/_module.mjs | 5 +++ module/enrichers/parser.mjs | 20 ++++++++++ 6 files changed, 50 insertions(+), 68 deletions(-) create mode 100644 module/enrichers/LookupEnricher.mjs create mode 100644 module/enrichers/parser.mjs diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 79e71549..3601e09d 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -501,6 +501,7 @@ export default class DhpActor extends Actor { /**@inheritdoc */ getRollData() { const rollData = super.getRollData(); + rollData.name = this.name; rollData.system = this.system.getRollData(); rollData.prof = this.system.proficiency ?? 1; rollData.cast = this.system.spellcastModifier ?? 1; diff --git a/module/enrichers/DamageEnricher.mjs b/module/enrichers/DamageEnricher.mjs index a52c4b31..e3f9c42a 100644 --- a/module/enrichers/DamageEnricher.mjs +++ b/module/enrichers/DamageEnricher.mjs @@ -1,29 +1,8 @@ +import { parseInlineParams } from './parser.mjs'; + export default function DhDamageEnricher(match, _options) { - const parts = match[1].split('|').map(x => x.trim()); - - let value = null, - type = null, - inline = false; - - parts.forEach(part => { - const split = part.split(':').map(x => x.toLowerCase().trim()); - if (split.length === 2) { - switch (split[0]) { - case 'value': - value = split[1]; - break; - case 'type': - type = split[1]; - break; - case 'inline': - inline = true; - break; - } - } - }); - - if (!value || !value) return match[0]; - + const { value, type, inline } = parseInlineParams(match[1]); + if (!value || !type) return match[0]; return getDamageMessage(value, type, inline, match[0]); } diff --git a/module/enrichers/LookupEnricher.mjs b/module/enrichers/LookupEnricher.mjs new file mode 100644 index 00000000..7836311e --- /dev/null +++ b/module/enrichers/LookupEnricher.mjs @@ -0,0 +1,8 @@ +import { parseInlineParams } from './parser.mjs'; + +export default function DhLookupEnricher(match, { rollData }) { + const results = parseInlineParams(match[1], { first: 'formula'}); + const element = document.createElement('span'); + element.textContent = Roll.replaceFormulaData(String(results.formula), rollData); + return element; +} diff --git a/module/enrichers/TemplateEnricher.mjs b/module/enrichers/TemplateEnricher.mjs index 15936b29..f1e9298d 100644 --- a/module/enrichers/TemplateEnricher.mjs +++ b/module/enrichers/TemplateEnricher.mjs @@ -1,49 +1,18 @@ +import { parseInlineParams } from './parser.mjs'; + export default function DhTemplateEnricher(match, _options) { - const parts = match[1].split('|').map(x => x.trim()); - - let type = null, - range = null, - angle = CONFIG.MeasuredTemplate.defaults.angle, - direction = 0, - inline = false; - - parts.forEach(part => { - const split = part.split(':').map(x => x.toLowerCase().trim()); - if (split.length === 2) { - switch (split[0]) { - case 'type': - const matchedType = Object.values(CONFIG.DH.GENERAL.templateTypes).find( - x => x.toLowerCase() === split[1] - ); - type = matchedType; - break; - case 'range': - if (Number.isNaN(Number(split[1]))) { - const matchedRange = Object.values(CONFIG.DH.GENERAL.templateRanges).find( - x => x.id.toLowerCase() === split[1] || x.short === split[1] - ); - range = matchedRange?.id; - } else { - range = split[1]; - } - break; - case 'inline': - inline = true; - break; - case 'angle': - angle = split[1]; - break; - case 'direction': - direction = split[1]; - break; - } - } - }); - - if (!type || !range) return match[0]; + const params = parseInlineParams(match[1]); + const { type, angle = CONFIG.MeasuredTemplate.defaults.angle, inline = false } = params; + const direction = Number(params.direction) || 0; + const range = + params.range && Number.isNaN(params.range) + ? Object.values(CONFIG.DH.GENERAL.templateRanges).find( + x => x.id.toLowerCase() === split[1] || x.short === split[1] + )?.id + : params.range; + if (!(type in CONFIG.MeasuredTemplate.types) || !range) return match[0]; const label = game.i18n.localize(`DAGGERHEART.CONFIG.TemplateTypes.${type}`); - const rangeDisplay = Number.isNaN(Number(range)) ? game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.name`) : range; let angleDisplay = ''; diff --git a/module/enrichers/_module.mjs b/module/enrichers/_module.mjs index deec4250..794756f4 100644 --- a/module/enrichers/_module.mjs +++ b/module/enrichers/_module.mjs @@ -2,6 +2,7 @@ import { default as DhDamageEnricher, renderDamageButton } from './DamageEnriche import { default as DhDualityRollEnricher, renderDualityButton } from './DualityRollEnricher.mjs'; import { default as DhEffectEnricher } from './EffectEnricher.mjs'; import { default as DhTemplateEnricher, renderMeasuredTemplate } from './TemplateEnricher.mjs'; +import { default as DhLookupEnricher } from './LookupEnricher.mjs'; export { DhDamageEnricher, DhDualityRollEnricher, DhEffectEnricher, DhTemplateEnricher }; @@ -21,6 +22,10 @@ export const enricherConfig = [ { pattern: /@Template\[(.*)\]({.*})?/g, enricher: DhTemplateEnricher + }, + { + pattern: /@Lookup\[(.*)\]({.*})?/g, + enricher: DhLookupEnricher } ]; diff --git a/module/enrichers/parser.mjs b/module/enrichers/parser.mjs new file mode 100644 index 00000000..9fcc4af1 --- /dev/null +++ b/module/enrichers/parser.mjs @@ -0,0 +1,20 @@ +/** + * @param {string} paramString The parameter inside the brackets of something like @Template[] to parse + * @param {Object} options + * @param {string} options.first If set, the first parameter is treated as a value with this as its key + * @returns {Record | null} + */ +export function parseInlineParams(paramString, { first } = {}) { + const parts = paramString.split('|').map(x => x.trim()); + const params = {}; + for (const [idx, param] of parts.entries()) { + if (first && idx === 0) { + params[first] = param; + } else { + const parts = param.split(':'); + params[parts[0]] = parts.length > 1 ? parts[1] : true; + } + } + + return params; +} From b3a72d6b1dffee883c0c86c836f9a2857cedd777 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Wed, 8 Oct 2025 12:18:19 -0400 Subject: [PATCH 08/11] [Community PR] Use 2d12 as hover icon for PCs and omit when feature has no uses (#1202) * Use 2d12 as hover icon for player rolls * SVG test files added Try to manipulate the fills and stroke of the SVG files as needed. I have made hope and fear based vectors to easily identify between them. * Updated SVG path Fear path fixed * Use b&w duality and only show roll img if there are usable actions * Switch to SVG and change colors --------- Co-authored-by: Nikhil Nagarajan --- assets/icons/dice/duality/DualityBW.png | Bin 0 -> 5841 bytes assets/icons/dice/duality/DualityBW.svg | 59 ++++++++++++++++++ styles/less/global/inventory-item.less | 4 +- .../global/partials/inventory-item-V2.hbs | 8 ++- 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 assets/icons/dice/duality/DualityBW.png create mode 100644 assets/icons/dice/duality/DualityBW.svg diff --git a/assets/icons/dice/duality/DualityBW.png b/assets/icons/dice/duality/DualityBW.png new file mode 100644 index 0000000000000000000000000000000000000000..5f94e99f582daeb7f38e52e2f341e4fb482a55dd GIT binary patch literal 5841 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 bLNoX$GM&ZGmtsNM00000NkvXXu0mjfMx9^J literal 0 HcmV?d00001 diff --git a/assets/icons/dice/duality/DualityBW.svg b/assets/icons/dice/duality/DualityBW.svg new file mode 100644 index 00000000..9e716fd6 --- /dev/null +++ b/assets/icons/dice/duality/DualityBW.svg @@ -0,0 +1,59 @@ + + + + + + + diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index e221f4e7..fc79cdc4 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -26,7 +26,7 @@ &:not(.single-img) { .inventory-item-header:hover { - .img-portait { + .img-portait:has(.roll-img) { .roll-img { opacity: 1; } @@ -96,7 +96,9 @@ } .roll-img { + object-fit: contain; opacity: 0; + padding: 2px; } } diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index a4ecec3a..8758c77d 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -23,7 +23,13 @@ Parameters: (hasProperty item "toChat" ) "toChat" "editDoc" ) }}' {{#unless hideTooltip}} {{#if (eq type 'attack' )}} data-tooltip="#attack#{{item.actor.uuid}}" {{else}} data-tooltip="#item#{{item.uuid}}" {{/if}} {{/unless}}> - d20 + {{#if (or item.system.actionsList.size item.system.actionsList.length item.actionType)}} + {{#if @root.isNPC}} + d20 + {{else}} + 2d12 + {{/if}} + {{/if}} {{!-- Name & Tags --}} From 25fb2ee570bfc35f19e50c0a03559934512f39f5 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Tue, 14 Oct 2025 11:00:16 -0400 Subject: [PATCH 09/11] [Community PR] Remove item description fieldset (#1214) * Remove item description fieldset * Move styling to tab description and reduce tab specific overrides * Move artist attribution style back to tab description * Roll back editor menu changes --- module/applications/sheets/api/base-item.mjs | 2 +- styles/less/global/tab-description.less | 9 ++++++--- templates/sheets/global/tabs/tab-description.hbs | 5 +---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs index f719b6d1..21ccbbf1 100644 --- a/module/applications/sheets/api/base-item.mjs +++ b/module/applications/sheets/api/base-item.mjs @@ -66,7 +66,7 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { /**@inheritdoc */ async _prepareContext(options) { - const context = super._prepareContext(options); + const context = await super._prepareContext(options); context.showAttribution = !game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance) .hideAttribution; diff --git a/styles/less/global/tab-description.less b/styles/less/global/tab-description.less index 4d81f2f2..04a9d82a 100644 --- a/styles/less/global/tab-description.less +++ b/styles/less/global/tab-description.less @@ -3,11 +3,14 @@ .daggerheart.dh-style { .tab.active.description { - overflow-y: hidden !important; + display: flex; + flex-direction: column; height: -webkit-fill-available !important; + overflow-y: hidden !important; + padding-top: 10px; - fieldset { - height: -webkit-fill-available; + prose-mirror.active + .artist-attribution { + display: none; } } } diff --git a/templates/sheets/global/tabs/tab-description.hbs b/templates/sheets/global/tabs/tab-description.hbs index 6d0669e0..71995a51 100755 --- a/templates/sheets/global/tabs/tab-description.hbs +++ b/templates/sheets/global/tabs/tab-description.hbs @@ -3,10 +3,7 @@ data-tab='{{tabs.description.id}}' data-group='{{tabs.description.group}}' > -
- {{localize "DAGGERHEART.GENERAL.description"}} - {{formInput systemFields.description value=document.system.description enriched=enrichedDescription toggled=true}} -
+ {{formInput systemFields.description value=document.system.description enriched=enrichedDescription toggled=true}} {{#if (and showAttribution document.system.attribution.artist)}} From dc073aa9cc965ee6d9c178b490c0f6153530a0b2 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Tue, 14 Oct 2025 11:01:54 -0400 Subject: [PATCH 10/11] Clean up loadout tab card name visual styling (#1216) --- styles/less/global/inventory-item.less | 2 ++ 1 file changed, 2 insertions(+) diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index fc79cdc4..1f5840af 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -309,12 +309,14 @@ background-color: @dark-blue; bottom: 0; mask-image: linear-gradient(180deg, transparent 0%, black 20%); + border-radius: 0 0 6px 6px; .card-name { font-style: normal; font-weight: 400; font-size: var(--font-size-12); line-height: 15px; + text-align: center; color: @beige; } From 45b9b5231400afe8851d78355324339fb9846515 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Wed, 15 Oct 2025 09:01:41 -0400 Subject: [PATCH 11/11] Allow viewing domain card item sheet by clicking the name in grid view (#1215) --- .../applications/sheets/api/application-mixin.mjs | 14 ++++++++++++-- .../sheets/global/partials/domain-card-item.hbs | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 5e186c86..dd845d34 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -99,6 +99,7 @@ export default function DHApplicationMixin(Base) { deleteDoc: DHSheetV2.#deleteDoc, toChat: DHSheetV2.#toChat, useItem: DHSheetV2.#useItem, + viewItem: DHSheetV2.#viewItem, toggleEffect: DHSheetV2.#toggleEffect, toggleExtended: DHSheetV2.#toggleExtended, addNewItem: DHSheetV2.#addNewItem, @@ -710,7 +711,7 @@ export default function DHApplicationMixin(Base) { * @type {ApplicationClickAction} */ static async #toChat(_event, target) { - let doc = await getDocFromElement(target); + const doc = await getDocFromElement(target); return doc.toChat(doc.uuid); } @@ -719,10 +720,19 @@ export default function DHApplicationMixin(Base) { * @type {ApplicationClickAction} */ static async #useItem(event, target) { - let doc = await getDocFromElement(target); + const doc = await getDocFromElement(target); await doc.use(event); } + /** + * View an item by opening its sheet + * @type {ApplicationClickAction} + */ + static async #viewItem(_, target) { + const doc = await getDocFromElement(target); + await doc.sheet.render({ force: true }); + } + /** * Toggle a ActiveEffect * @type {ApplicationClickAction} diff --git a/templates/sheets/global/partials/domain-card-item.hbs b/templates/sheets/global/partials/domain-card-item.hbs index 1dd92128..ae95b7af 100644 --- a/templates/sheets/global/partials/domain-card-item.hbs +++ b/templates/sheets/global/partials/domain-card-item.hbs @@ -19,6 +19,6 @@ - {{item.name}} + {{item.name}} \ No newline at end of file