From f7f1bdce2b00feece6b2c7864dffedfb868dd14f Mon Sep 17 00:00:00 2001
From: WBHarry <89362246+WBHarry@users.noreply.github.com>
Date: Sun, 24 May 2026 17:15:17 +0200
Subject: [PATCH 01/11] Fixed so that we are not looking at the now
non-existing metadata.isQuantifiable anymore (#1922)
---
module/applications/sheets-configs/action-base-config.mjs | 2 +-
module/data/fields/action/costField.mjs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs
index 7406b084..e83dfae4 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?.isQuantifiable) {
+ if (this.action.parent.metadata.isInventoryItem) {
options.quantity = {
label: 'DAGGERHEART.GENERAL.itemQuantity',
group: 'Global'
diff --git a/module/data/fields/action/costField.mjs b/module/data/fields/action/costField.mjs
index 9271f6b0..1928af41 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?.isInventoryItem && this.parent.consumeOnUse === false) {
filteredCosts = filteredCosts.filter(c => c.key !== 'quantity');
}
From e0955873053058bfe6aeb452352a9ff1bb8dfd1b Mon Sep 17 00:00:00 2001
From: WBHarry <89362246+WBHarry@users.noreply.github.com>
Date: Sun, 24 May 2026 19:05:55 +0200
Subject: [PATCH 02/11] [Fix] ContextMenu v14 Deprecation (#1927)
* Updated from the deprecated 'callback' to 'onClick' for ContextMenu entries
* Missed parameter reversal in api/base-item.mjs
---
module/applications/sheets/actors/character.mjs | 12 ++++++------
.../sheets/api/application-mixin.mjs | 16 +++++++++-------
module/applications/sheets/api/base-item.mjs | 2 +-
3 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs
index 5f6c854b..d85838e1 100644
--- a/module/applications/sheets/actors/character.mjs
+++ b/module/applications/sheets/actors/character.mjs
@@ -368,7 +368,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
const doc = getDocFromElementSync(target);
return doc?.isOwner && !isItemWizardManaged(doc);
},
- callback: async (target, event) => {
+ onClick: async (event, target) => {
const doc = await getDocFromElement(target);
if (event.shiftKey) return doc.delete();
else return doc.deleteDialog();
@@ -393,7 +393,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
const doc = getDocFromElementSync(target);
return doc?.isOwner && doc.system.inVault;
},
- callback: async target => {
+ onClick: async (_, target) => {
const doc = await getDocFromElement(target);
const actorLoadout = doc.actor.system.loadoutSlot;
if (actorLoadout.available) return doc.update({ 'system.inVault': false });
@@ -407,7 +407,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
const doc = getDocFromElementSync(target);
return doc?.isOwner && doc.system.inVault;
},
- callback: async (target, event) => {
+ onClick: async (event, target) => {
const doc = await getDocFromElement(target);
const actorLoadout = doc.actor.system.loadoutSlot;
if (!actorLoadout.available) {
@@ -446,7 +446,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
const doc = getDocFromElementSync(target);
return doc?.isOwner && !doc.system.inVault;
},
- callback: async target => (await getDocFromElement(target)).update({ 'system.inVault': true })
+ onClick: async (_, target) => (await getDocFromElement(target)).update({ 'system.inVault': true })
}
].map(option => ({
...option,
@@ -472,7 +472,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
const doc = getDocFromElementSync(target);
return doc.isOwner && doc && !doc.system.equipped;
},
- callback: (target, event) => CharacterSheet.#toggleEquipItem.call(this, event, target)
+ onClick: (event, target) => CharacterSheet.#toggleEquipItem.call(this, event, target)
},
{
label: 'unequip',
@@ -481,7 +481,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
const doc = getDocFromElementSync(target);
return doc.isOwner && doc && doc.system.equipped;
},
- callback: (target, event) => CharacterSheet.#toggleEquipItem.call(this, event, target)
+ onClick: (event, target) => 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 c79db99b..2b0c3e55 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';
},
- callback: async target => (await getDocFromElement(target)).update({ disabled: true })
+ onClick: 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';
},
- callback: async target => (await getDocFromElement(target)).update({ disabled: false })
+ onClick: async (_, target) => (await getDocFromElement(target)).update({ disabled: false })
}
].map(option => ({
...option,
@@ -478,7 +478,9 @@ export default function DHApplicationMixin(Base) {
(doc?.isOwner && (!doc?.hasOwnProperty('systemPath') || doc?.inCollection))
);
},
- callback: async target => (await getDocFromElement(target)).sheet.render({ force: true })
+ onClick: async (_, target) => {
+ return (await getDocFromElement(target)).sheet.render({ force: true });
+ }
}
];
@@ -493,7 +495,7 @@ export default function DHApplicationMixin(Base) {
!foundry.utils.isEmpty(doc?.damage?.parts);
return doc?.isOwner && hasDamage;
},
- callback: async (target, event) => {
+ onClick: async (event, target) => {
const doc = await getDocFromElement(target),
action = doc?.system?.attack ?? doc;
const config = action.prepareConfig(event);
@@ -513,7 +515,7 @@ export default function DHApplicationMixin(Base) {
const doc = getDocFromElementSync(target);
return doc?.isOwner && !(doc.type === 'domainCard' && doc.system.inVault);
},
- callback: async (target, event) => (await getDocFromElement(target)).use(event)
+ onClick: async (event, target) => (await getDocFromElement(target)).use(event)
});
}
@@ -521,7 +523,7 @@ export default function DHApplicationMixin(Base) {
options.push({
label: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat',
icon: 'fa-solid fa-message',
- callback: async target => (await getDocFromElement(target)).toChat(this.document.uuid)
+ onClick: async (_, target) => (await getDocFromElement(target)).toChat(this.document.uuid)
});
if (deletable)
@@ -533,7 +535,7 @@ export default function DHApplicationMixin(Base) {
const doc = getDocFromElementSync(target);
return doc?.isOwner !== false && target.dataset.itemType !== 'beastform';
},
- callback: async (target, event) => {
+ onClick: async (event, target) => {
const doc = await getDocFromElement(target);
if (event.shiftKey) return doc.delete();
else return doc.deleteDialog();
diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs
index e3568b23..1e08fc05 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: '',
- callback: async target => {
+ onClick: async (_, target) => {
const feature = await getDocFromElement(target);
if (!feature) return;
const confirmed = await foundry.applications.api.DialogV2.confirm({
From 58824d5bbff69bda2a3438631630e67de1b1f111 Mon Sep 17 00:00:00 2001
From: WBHarry <89362246+WBHarry@users.noreply.github.com>
Date: Mon, 25 May 2026 00:55:43 +0200
Subject: [PATCH 03/11] Fixed so that ActiveEffects on homebrew features can
set 'Transfer To Actor' (#1926)
---
.../sheets-configs/activeEffectConfig.mjs | 1 +
templates/sheets/activeEffect/details.hbs | 13 +++----------
2 files changed, 4 insertions(+), 10 deletions(-)
diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs
index 834a57a8..cb9f1701 100644
--- a/module/applications/sheets-configs/activeEffectConfig.mjs
+++ b/module/applications/sheets-configs/activeEffectConfig.mjs
@@ -175,6 +175,7 @@ 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/templates/sheets/activeEffect/details.hbs b/templates/sheets/activeEffect/details.hbs
index dc19b3dc..8ab4b5cf 100644
--- a/templates/sheets/activeEffect/details.hbs
+++ b/templates/sheets/activeEffect/details.hbs
@@ -5,16 +5,9 @@
{{formGroup systemFields.targetDispositions value=source.system.targetDispositions name=(concat "system.targetDispositions") localize=true}}
{{#if isActorEffect}}
-
- {{/if}}
-
- {{#if isItemEffect}}
- {{formGroup fields.transfer value=source.transfer rootId=rootId label=legacyTransfer.label hint=(localize "DAGGERHEART.EFFECTS.Attachments.transferHint")}}
+ {{formGroup fields.origin value=source.origin rootId=rootId disabled=true}}
+ {{else if isItemEffect}}
+ {{formGroup fields.transfer value=source.transfer rootId=rootId}}
{{/if}}
{{formGroup fields.statuses value=source.statuses options=statuses rootId=rootId classes="statuses"}}
From 0e8c3dc74a265477fa04583b495ac9862e9620e3 Mon Sep 17 00:00:00 2001
From: Carlos Fernandez
Date: Mon, 25 May 2026 17:55:57 -0400
Subject: [PATCH 04/11] [UI] Adjust actor sheet headers (#1923)
---
.../tag-team-dialog/initialization.less | 14 +-
.../sheets/actors/actor-sheet-shared.less | 2 +-
.../less/sheets/actors/companion/header.less | 15 ++-
.../sheets/actors/environment/header.less | 126 ++++++++++--------
.../less/sheets/actors/environment/sheet.less | 4 -
styles/less/sheets/actors/party/header.less | 35 ++---
styles/less/utils/colors.less | 4 +
styles/less/utils/mixin.less | 45 +++++++
.../sheets/actors/environment/header.hbs | 42 +++---
templates/sheets/actors/party/header.hbs | 4 +-
10 files changed, 172 insertions(+), 119 deletions(-)
diff --git a/styles/less/dialog/tag-team-dialog/initialization.less b/styles/less/dialog/tag-team-dialog/initialization.less
index 2d015141..f53a7af4 100644
--- a/styles/less/dialog/tag-team-dialog/initialization.less
+++ b/styles/less/dialog/tag-team-dialog/initialization.less
@@ -1,3 +1,5 @@
+@import '../../utils/mixin.less';
+
.theme-light .daggerheart.dialog.dh-style.views.tag-team-dialog {
.initialization-container .members-container .member-container {
.member-name {
@@ -62,17 +64,7 @@
color: var(--color-text-primary);
text-shadow: 1px 1px 2px var(--shadow-color), 0 0 10px var(--shadow-color);
-
- // 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%
- );
+ .smooth-gradient-ease-in-out(background-image, to bottom, var(--shadow-color), 100%);
}
img {
diff --git a/styles/less/sheets/actors/actor-sheet-shared.less b/styles/less/sheets/actors/actor-sheet-shared.less
index bd82ef83..6ef73035 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: light-dark(@chat-blue-bg, @beige-50);
+ color: @color-text-subtle;
}
.tab.inventory {
diff --git a/styles/less/sheets/actors/companion/header.less b/styles/less/sheets/actors/companion/header.less
index 2a162a25..6cf886ab 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;
- mask-image: linear-gradient(0deg, transparent 0%, black 10%);
+ .smooth-gradient-ease-in-out(mask-image, to top, black, 2.25rem);
}
.actor-name {
@@ -24,11 +24,16 @@
margin-bottom: -30px;
input[type='text'] {
+ backdrop-filter: none;
+ border: none;
+ font-family: @font-title;
font-size: var(--font-size-24);
- height: 32px;
- text-align: center;
- border: 1px solid transparent;
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;
+ text-align: center;
transition: all 0.3s ease;
&:hover {
@@ -243,7 +248,7 @@
.companion-navigation {
display: flex;
gap: 8px;
- align-items: center;
+ align-items: baseline;
width: 100%;
}
}
diff --git a/styles/less/sheets/actors/environment/header.less b/styles/less/sheets/actors/environment/header.less
index 670f6c92..ce7e6163 100644
--- a/styles/less/sheets/actors/environment/header.less
+++ b/styles/less/sheets/actors/environment/header.less
@@ -1,5 +1,6 @@
@import '../../../utils/colors.less';
@import '../../../utils/fonts.less';
+@import '../../../utils/mixin.less';
.application.sheet.daggerheart.actor.dh-style.environment {
.environment-header-sheet {
@@ -10,60 +11,83 @@
.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: flex;
+ display: grid;
+ grid-auto-flow: row;
+ grid-template-columns: 1fr min-content;
+
align-items: center;
position: relative;
- top: -45px;
- gap: 20px;
+ top: -36px;
+ gap: 0 var(--spacer-12);
padding: 0 20px;
- margin-bottom: -30px;
+ margin-bottom: -26px;
- .item-info {
+ .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 {
display: flex;
- flex-direction: column;
- gap: 8px;
+ gap: 10px;
+ padding-bottom: 0;
+ flex: 0;
- .tags {
+ .tag {
display: flex;
- gap: 10px;
- padding-bottom: 0;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ padding: 3px 5px;
+ font-size: var(--font-size-12);
+ font: @font-body;
+ white-space: nowrap;
- .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);
- }
+ background: light-dark(@dark-15, @beige-15);
+ border: 1px solid light-dark(@dark, @beige);
+ border-radius: 3px;
}
- .attribution-header-label {
- text-align: left;
- position: relative;
- top: 4px;
- margin-bottom: -6px;
+ .label {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ font-size: var(--font-size-12);
}
}
+ .attribution-header-label {
+ text-align: right;
+ position: relative;
+ }
+
.status-number {
display: flex;
align-items: center;
@@ -81,7 +105,7 @@
font-size: 1.2rem;
align-items: center;
justify-content: center;
- background: light-dark(transparent, @dark-blue);
+ background: light-dark(#e8e6e3, @dark-blue);
z-index: 2;
&.armor-slots {
@@ -93,7 +117,7 @@
.status-label {
padding: 2px 10px;
width: 100%;
- border-radius: 3px;
+ border-radius: 0 0 3px 3px;
background: light-dark(@dark-blue, @golden);
h4 {
@@ -105,37 +129,23 @@
}
}
}
-
- .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: 12px;
+ gap: var(--spacer-8);
padding: 10px 20px;
}
.environment-navigation {
display: flex;
gap: 20px;
- align-items: center;
+ align-items: baseline;
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 a7c9605b..2d9cc188 100644
--- a/styles/less/sheets/actors/environment/sheet.less
+++ b/styles/less/sheets/actors/environment/sheet.less
@@ -5,10 +5,6 @@
.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 9a2c7350..18d69834 100644
--- a/styles/less/sheets/actors/party/header.less
+++ b/styles/less/sheets/actors/party/header.less
@@ -1,5 +1,6 @@
@import '../../../utils/colors.less';
@import '../../../utils/fonts.less';
+@import '../../../utils/mixin.less';
.party-header-sheet {
display: flex;
@@ -9,26 +10,30 @@
.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 {
- .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;
+ 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);
- &:hover[type='text'],
- &:focus[type='text'] {
- box-shadow: none;
- outline: 2px solid light-dark(@dark-blue, @golden);
- }
+ 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);
}
}
diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less
index 80519a5b..d35ad8b3 100755
--- a/styles/less/utils/colors.less
+++ b/styles/less/utils/colors.less
@@ -83,6 +83,8 @@
--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);
@@ -190,3 +192,5 @@
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 49e97a1f..b37bfc06 100644
--- a/styles/less/utils/mixin.less
+++ b/styles/less/utils/mixin.less
@@ -114,3 +114,48 @@
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/actors/environment/header.hbs b/templates/sheets/actors/environment/header.hbs
index b7eab3db..2c6bbb5a 100644
--- a/templates/sheets/actors/environment/header.hbs
+++ b/templates/sheets/actors/environment/header.hbs
@@ -1,28 +1,7 @@