Merge branch 'main' into feature/transform-linked-actors

This commit is contained in:
Carlos Fernandez 2026-07-01 23:35:49 -04:00
commit 731be03277
24 changed files with 1123 additions and 1304 deletions

View file

@ -114,7 +114,8 @@
"area": {
"sectionTitle": "Areas",
"shape": "Shape",
"size": "Size"
"size": "Size",
"hasHole": "Area Hole"
},
"displayInChat": "Display in chat",
"deleteTriggerTitle": "Delete Trigger",
@ -871,6 +872,10 @@
"bruiser": "for each Bruiser adversary.",
"solo": "for each Solo adversary."
},
"AreaTypes": {
"attached": { "label": "Attached To Token" },
"placed": { "label": "Placed In Scene" }
},
"ArmorInteraction": {
"none": { "label": "Ignores Armor" },
"active": { "label": "Active w/ Armor" },

View file

@ -7,7 +7,7 @@ export default class AdversarySheet extends DHBaseActorSheet {
/** @inheritDoc */
static DEFAULT_OPTIONS = {
classes: ['adversary'],
position: { width: 660, height: 766 },
position: { width: 645, height: 760 },
window: { resizable: true },
actions: {
toggleHitPoints: AdversarySheet.#toggleHitPoints,
@ -58,12 +58,13 @@ export default class AdversarySheet extends DHBaseActorSheet {
template: 'systems/daggerheart/templates/sheets/actors/adversary/features.hbs',
scrollable: ['.feature-section']
},
notes: {
template: 'systems/daggerheart/templates/sheets/actors/adversary/notes.hbs'
},
effects: {
template: 'systems/daggerheart/templates/sheets/actors/adversary/effects.hbs',
scrollable: ['.effects-sections']
},
notes: {
template: 'systems/daggerheart/templates/sheets/actors/adversary/notes.hbs',
scrollable: ['.editor-content']
}
};

View file

@ -1057,7 +1057,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
direction: 'DOWN'
});
html.querySelectorAll('.armor-slot').forEach(element => {
html.querySelectorAll('.armor .slot').forEach(element => {
element.addEventListener('click', CharacterSheet.armorSourcePipUpdate);
});
}
@ -1072,7 +1072,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
/** Update specific armor source */
static async armorSourcePipUpdate(event) {
const target = event.target.closest('.armor-slot');
const target = event.target.closest('.slot');
const { uuid, value } = target.dataset;
const document = await foundry.utils.fromUuid(uuid);
@ -1100,7 +1100,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
}
const container = target.closest('.slot-bar');
for (const armorSlot of container.querySelectorAll('.armor-slot i')) {
for (const armorSlot of container.querySelectorAll('.armor .slot i')) {
const index = Number.parseInt(armorSlot.dataset.index);
if (decreasing && index >= newCurrent) {
armorSlot.classList.remove('fa-shield');

View file

@ -96,7 +96,7 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
return inBounds.length === 1 ? inBounds[0] : null;
}
static getTemplateShape({ type, angle, range, direction } = {}) {
static getTemplateShape({ shapeType, angle, range, direction, hasHole } = {}) {
const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes;
/* Length calculation */
@ -112,11 +112,11 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
const shapeData = {
...canvas.mousePosition,
type: type,
type: shapeType,
direction: direction ?? 0
};
switch (type) {
switch (shapeType) {
case rectangle.id:
shapeData.width = length;
shapeData.height = length;
@ -145,7 +145,8 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
y: 0,
width: 1,
height: 1,
shape: game.canvas.grid.isHexagonal ? CONST.TOKEN_SHAPES.ELLIPSE_1 : CONST.TOKEN_SHAPES.RECTANGLE_1
shape: game.canvas.grid.isHexagonal ? CONST.TOKEN_SHAPES.ELLIPSE_1 : CONST.TOKEN_SHAPES.RECTANGLE_1,
hole: hasHole
};
break;
}

View file

@ -119,6 +119,10 @@ export const advantageState = {
export const areaTypes = {
placed: {
id: 'placed',
label: 'Placed Area'
label: 'DAGGERHEART.CONFIG.AreaTypes.placed.label'
},
attached: {
id: 'attached',
label: 'DAGGERHEART.CONFIG.AreaTypes.attached.label'
}
};

View file

@ -33,6 +33,10 @@ export default class AreasField extends fields.ArrayField {
initial: CONFIG.DH.GENERAL.range.veryClose.id,
label: 'DAGGERHEART.ACTIONS.Config.area.size'
}),
hasHole: new fields.BooleanField({
initial: false,
label: 'DAGGERHEART.ACTIONS.Config.area.hasHole'
}),
effects: new fields.ArrayField(new fields.DocumentIdField())
});
super(element, options, context);

View file

@ -276,8 +276,12 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
async onCreateAreas(event) {
const createArea = async selectedArea => {
const effects = selectedArea.effects.map(effect => this.system.action.item.effects.get(effect).uuid);
const { shape: type, size: range } = selectedArea;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ type, range });
const { shape: shapeType, size: range, hasHole } = selectedArea;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
shapeType,
range,
hasHole
});
const scene = game.scenes.get(game.user.viewedScene);
const level = scene.levels.find(x => x.isView);
@ -305,7 +309,10 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
visibility: CONST.REGION_VISIBILITY.ALWAYS
};
const placeRegion = data => {
canvas.regions.placeRegion(data, { create: true });
canvas.regions.placeRegion(data, {
create: true,
attachToToken: selectedArea.type === CONFIG.DH.ACTIONS.areaTypes.attached.id
});
};
// Regions with effects must be placed by the GM

View file

@ -58,10 +58,11 @@ export const renderMeasuredTemplate = async event => {
if (!type || !range || !game.canvas.scene) return;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
type,
shapetype: type,
angle,
range,
direction
direction,
hasHole: false
});
await canvas.regions.placeRegion(

View file

@ -893,13 +893,12 @@ export function shouldUseHopeFearAutomation(options = { gmAsPlayer: true }) {
export async function getWorldActor(baseActor) {
if (baseActor.inCompendium) {
const worldActorCopy = game.actors.find(x =>
x._stats.compendiumSource === baseActor.uuid &&
(!x.prototypeToken.actorLink || x.name === baseActor.name)
const worldActorCandidates = game.actors.filter(x =>
x._stats.compendiumSource === baseActor.uuid &&
x.prototypeToken.actorLink === baseActor.prototypeToken.actorLink
);
if (worldActorCopy)
return worldActorCopy;
const worldActorCopy = worldActorCandidates.find(a => a.name === baseActor.name) ?? worldActorCandidates[0];
if (worldActorCopy) return worldActorCopy;
const baseActorData = baseActor;
return await game.system.api.documents.DhpActor.create({

View file

@ -52,7 +52,7 @@
"includeBase": false
},
"target": {
"type": "hostile",
"type": "",
"amount": 1
},
"effects": [
@ -63,13 +63,23 @@
],
"name": "Fire",
"img": "icons/magic/fire/barrier-wall-explosion-orange.webp",
"range": "close"
"range": "",
"areas": [
{
"name": "Elemental Aura: Fire",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": []
}
]
},
"xDBLH5TWidvrYF7z": {
"type": "effect",
"_id": "xDBLH5TWidvrYF7z",
"systemPath": "actions",
"description": "<p>When an adversary marks 1 or more Hit Points, they must also mark a Stress.</p>",
"description": "<p>Your allies gain a +1 bonus to Strength.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -78,19 +88,26 @@
"max": "",
"recovery": null
},
"effects": [
{
"_id": "WRuijfHxmUscAa69",
"onSave": false
}
],
"effects": [],
"target": {
"type": "friendly",
"type": "",
"amount": null
},
"name": "Earth",
"img": "icons/magic/control/buff-strength-muscle-damage-red.webp",
"range": "close"
"range": "",
"areas": [
{
"name": "Elemental Aura: Earth",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": true,
"effects": [
"yvpWNCNobg0LLjey"
]
}
]
},
"S4t5HlgxWlHwaBDw": {
"type": "effect",
@ -112,12 +129,22 @@
}
],
"target": {
"type": "hostile",
"type": "self",
"amount": null
},
"name": "Water",
"img": "icons/magic/water/vortex-water-whirlpool.webp",
"range": "close"
"range": "self",
"areas": [
{
"name": "Elemental Aura: Water",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": []
}
]
},
"hAsKFFewtTqd1gg9": {
"type": "attack",
@ -138,15 +165,10 @@
"includeBase": false
},
"target": {
"type": "any",
"type": "self",
"amount": null
},
"effects": [
{
"_id": "mJBA2QTyM9SM5NVS",
"onSave": false
}
],
"effects": [],
"roll": {
"type": "diceSet",
"trait": null,
@ -169,7 +191,19 @@
},
"name": "Air",
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
"range": ""
"range": "self",
"areas": [
{
"name": "Elemental Aura: Air",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": [
"vnKV5hsO4DVjURAl"
]
}
]
}
},
"originItemType": null,
@ -181,49 +215,6 @@
}
},
"effects": [
{
"name": "Elemental Aura (Earth)",
"img": "icons/magic/control/buff-strength-muscle-damage-orange.webp",
"origin": "Compendium.daggerheart.subclasses.Item.2JH9NaOh69yN80Gw",
"transfer": false,
"_id": "WRuijfHxmUscAa69",
"type": "base",
"system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
},
"changes": [
{
"key": "system.traits.strength.value",
"mode": 2,
"value": "1",
"priority": null
}
],
"disabled": false,
"duration": {
"startTime": null,
"combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
},
"description": "",
"tint": "#ffffff",
"statuses": [],
"sort": 0,
"flags": {},
"_stats": {
"compendiumSource": null
},
"_key": "!items.effects!2JH9NaOh69yN80Gw.WRuijfHxmUscAa69"
},
{
"name": "Elemental Aura (Water)",
"img": "icons/magic/water/vortex-water-whirlpool.webp",
@ -237,18 +228,15 @@
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
},
"changes": []
},
"changes": [],
"disabled": false,
"duration": {
"startTime": null,
"combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
"value": null,
"units": "seconds",
"expiry": null,
"expired": false
},
"description": "",
"tint": "#ffffff",
@ -258,6 +246,9 @@
"_stats": {
"compendiumSource": null
},
"start": null,
"showIcon": 1,
"folder": null,
"_key": "!items.effects!2JH9NaOh69yN80Gw.H7W52ps5d3UGmaFr"
},
{
@ -273,18 +264,15 @@
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
},
"changes": []
},
"changes": [],
"disabled": false,
"duration": {
"startTime": null,
"combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
"value": null,
"units": "seconds",
"expiry": null,
"expired": false
},
"description": "",
"tint": "#ffffff",
@ -294,43 +282,120 @@
"_stats": {
"compendiumSource": null
},
"start": null,
"showIcon": 1,
"folder": null,
"_key": "!items.effects!2JH9NaOh69yN80Gw.WX5AMEpmUAutB9Hm"
},
{
"name": "Elemental Aura (Air)",
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
"origin": "Compendium.daggerheart.subclasses.Item.2JH9NaOh69yN80Gw",
"name": "Elemental Aura: Earth",
"disabled": false,
"img": "icons/magic/control/buff-strength-muscle-damage-red.webp",
"description": "<p>Your allies gain a +1 bonus to Strength.</p>",
"transfer": false,
"_id": "mJBA2QTyM9SM5NVS",
"type": "base",
"statuses": [],
"system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
},
"changes": [
{
"key": "system.traits.strength.value",
"type": "add",
"value": 1,
"priority": null,
"phase": "initial"
}
],
"duration": {
"description": "",
"type": ""
},
"stacking": null,
"targetDispositions": [
1
]
},
"changes": [],
"disabled": false,
"duration": {
"startTime": null,
"_id": "yvpWNCNobg0LLjey",
"type": "base",
"start": {
"time": 0,
"combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
"combatant": null,
"initiative": null,
"round": null,
"turn": null
},
"description": "",
"duration": {
"value": null,
"units": "seconds",
"expiry": null,
"expired": false
},
"origin": null,
"tint": "#ffffff",
"statuses": [],
"showIcon": 1,
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"compendiumSource": null
},
"_key": "!items.effects!2JH9NaOh69yN80Gw.mJBA2QTyM9SM5NVS"
"_key": "!items.effects!2JH9NaOh69yN80Gw.yvpWNCNobg0LLjey"
},
{
"name": "Elemental Aura: Air",
"disabled": false,
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
"description": "<p><span style=\"color:rgb(239, 230, 216);font-family:Montserrat, sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;-webkit-text-stroke-width:0px;white-space:normal;background-color:rgba(24, 22, 46, 0.753);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;display:inline !important;float:none\">When you or an ally takes damage from an attack beyond Melee range, reduce the damage by 1d8.</span></p>",
"transfer": false,
"statuses": [],
"system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [],
"duration": {
"description": "",
"type": ""
},
"stacking": null,
"targetDispositions": [
1
]
},
"_id": "vnKV5hsO4DVjURAl",
"type": "base",
"start": {
"time": 0,
"combat": null,
"combatant": null,
"initiative": null,
"round": null,
"turn": null
},
"duration": {
"value": null,
"units": "seconds",
"expiry": null,
"expired": false
},
"origin": null,
"tint": "#ffffff",
"showIcon": 1,
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"compendiumSource": null
},
"_key": "!items.effects!2JH9NaOh69yN80Gw.vnKV5hsO4DVjURAl"
}
],
"sort": 100000,

View file

@ -384,6 +384,10 @@
justify-content: space-between;
}
label {
white-space: nowrap;
}
.btn {
padding-top: 15px;
}
@ -399,6 +403,13 @@
> .checkbox {
align-self: end;
}
.auto-sized {
width: auto;
display: flex;
flex-direction: column;
align-items: center;
}
}
.form-group {

View file

@ -9,111 +9,108 @@
}
});
/** Pips styling, can exist standalone even without a slot-value */
.slot-bar {
display: flex;
gap: 4px;
padding: 5px;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1;
color: @color-text-emphatic;
width: fit-content;
min-height: 22px;
flex-wrap: wrap;
.slot {
transition: all 0.3s ease;
cursor: pointer;
}
.slot:not(:has(i)) {
width: 15px;
height: 10px;
border: 1px solid @color-border;
background: light-dark(@dark-blue-10, @golden-10);
border-radius: 3px;
&.large {
width: 20px;
}
&.filled {
background: light-dark(@dark-blue, @golden);
}
}
&.armor .slot {
font-size: var(--font-size-12);
.fa-shield-halved {
color: light-dark(@dark-blue-40, @golden-40);
}
}
.empty-slot {
width: 15px;
height: 10px;
}
}
.slot-value {
display: flex;
flex-direction: column;
font-size: 1.5rem;
align-items: center;
justify-content: center;
text-align: center;
z-index: 2;
color: @beige;
.slot-label {
display: flex;
align-items: center;
color: light-dark(@beige, @dark-blue);
background: light-dark(@dark-blue, @golden);
padding: 0 5px;
width: fit-content;
font-weight: bold;
border-radius: 0px 0px 5px 5px;
font-size: var(--font-size-12);
.label {
padding-right: 5px;
}
.value {
padding-left: 6px;
border-left: 1px solid light-dark(@beige, @dark-golden);
}
}
}
.status-bar {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
position: relative;
width: 120px;
height: 40px;
.status-label {
position: relative;
top: 40px;
height: 22px;
width: 79px;
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
background: light-dark(@dark-blue, @golden);
h4 {
font-weight: bold;
text-align: center;
line-height: 18px;
color: light-dark(@beige, @dark-blue);
}
}
.slot-value {
position: absolute;
display: flex;
flex-direction: column;
padding: 0 5px;
font-size: 1.5rem;
align-items: center;
width: 140px;
height: 40px;
justify-content: center;
text-align: center;
z-index: 2;
color: @beige;
.slot-bar {
display: flex;
flex-wrap: wrap;
gap: 5px;
padding: 5px;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1;
color: @color-text-emphatic;
width: fit-content;
.slot {
width: 15px;
height: 10px;
border: 1px solid @color-border;
background: light-dark(@dark-blue-10, @golden-10);
border-radius: 3px;
transition: all 0.3s ease;
cursor: pointer;
&.large {
width: 20px;
}
&.filled {
background: light-dark(@dark-blue, @golden);
}
}
.empty-slot {
width: 15px;
height: 10px;
}
}
.slot-label {
display: flex;
align-items: center;
color: light-dark(@beige, @dark-blue);
background: light-dark(@dark-blue, @golden);
padding: 0 5px;
width: fit-content;
font-weight: bold;
border-radius: 0px 0px 5px 5px;
font-size: var(--font-size-12);
.label {
padding-right: 5px;
}
.value {
padding-left: 6px;
border-left: 1px solid light-dark(@beige, @dark-golden);
}
}
}
.status-value {
position: absolute;
position: relative;
display: flex;
padding: 0 5px;
font-size: 1.5rem;
align-items: center;
width: 140px;
width: 100px;
height: 40px;
justify-content: center;
text-align: center;
z-index: 2;
color: @beige;
> * {
z-index: 1;
}
input[type='number'] {
background: transparent;
font-size: 1.5rem;
@ -146,11 +143,11 @@
.progress-bar {
position: absolute;
appearance: none;
width: 100px;
height: 40px;
width: 100%;
height: 100%;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1;
z-index: 0;
background: @dark-blue;
&::-webkit-progress-bar {
@ -175,4 +172,29 @@
border-radius: 6px;
}
}
.status-label {
position: relative;
height: 22px;
width: 79px;
background: light-dark(@dark-blue, @golden);
&.pointy {
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
margin-bottom: -2px; // compensate for pointy bottom so spacing feels more "right"
}
h4 {
font-weight: bold;
text-align: center;
line-height: 18px;
color: light-dark(@beige, @dark-blue);
}
}
}
// Overrides for sidebar usage.
aside[data-application-part="sidebar"] .resources-section .slot-bar {
display: grid;
grid-template-columns: repeat(6, min-content);
grid-auto-flow: row;
}

View file

@ -1,7 +1,6 @@
@import './sheet.less';
@import './features.less';
@import './header.less';
@import './sheet.less';
@import './sidebar.less';
@import './effects.less';
@import './notes.less';

View file

@ -2,35 +2,37 @@
@import '../../../utils/fonts.less';
.application.sheet.daggerheart.actor.dh-style.adversary {
--sidebar-width: 260px;
.window-content {
display: grid;
grid-template-columns: 275px 1fr;
grid-template-columns: var(--sidebar-width) 1fr;
grid-template-rows: auto 1fr;
height: 100%;
width: 100%;
padding-bottom: 0;
}
.adversary-sidebar-sheet {
grid-row: 1 / span 2;
grid-column: 1;
.adversary-sidebar-sheet {
grid-row: 1 / span 2;
grid-column: 1;
overflow: hidden;
display: flex;
flex-direction: column;
}
.adversary-header-sheet {
grid-row: 1;
grid-column: 2;
}
.tab {
grid-row: 2;
grid-column: 2;
&.active {
overflow: hidden;
display: flex;
flex-direction: column;
}
.adversary-header-sheet {
grid-row: 1;
grid-column: 2;
}
.tab {
grid-row: 2;
grid-column: 2;
&.active {
overflow: hidden;
display: flex;
flex-direction: column;
}
}
}
}
}

View file

@ -22,8 +22,8 @@
.application.sheet.daggerheart.actor.dh-style.adversary {
.adversary-sidebar-sheet {
width: 275px;
min-width: 275px;
width: var(--sidebar-width);
min-width: var(--sidebar-width);
border-right: 1px solid light-dark(@dark-blue, @golden);
.portrait {
@ -52,7 +52,7 @@
}
img {
height: 275px;
height: var(--sidebar-width);
}
.death-roll-btn {
@ -63,7 +63,7 @@
.threshold-section {
position: relative;
display: flex;
gap: 10px;
gap: 7px;
background-color: light-dark(transparent, @dark-blue);
color: @color-text-emphatic;
padding: 5px 10px;
@ -106,8 +106,8 @@
display: flex;
flex-direction: column;
top: -20px;
gap: 16px;
margin-bottom: -10px;
gap: 10px;
margin-bottom: -16px;
&.pip-display {
top: -15px;
@ -120,105 +120,6 @@
.resources-section {
display: flex;
justify-content: space-evenly;
margin-bottom: 16px;
.status-bar {
display: flex;
justify-content: center;
position: relative;
width: 100px;
height: 40px;
.status-label {
position: relative;
top: 40px;
height: 22px;
width: 79px;
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
background: light-dark(@dark-blue, @golden);
h4 {
font-weight: bold;
text-align: center;
line-height: 18px;
color: light-dark(@beige, @dark-blue);
}
}
.status-value {
position: absolute;
display: flex;
padding: 0 6px;
font-size: 1.5rem;
align-items: center;
width: 100px;
height: 40px;
justify-content: center;
text-align: center;
z-index: 2;
color: @beige;
input[type='number'] {
background: transparent;
font-size: 1.5rem;
width: 40px;
height: 30px;
text-align: center;
border: none;
outline: 2px solid transparent;
color: @beige;
&.bar-input {
padding: 0;
color: @beige;
backdrop-filter: none;
background: transparent;
transition: all 0.3s ease;
&:hover,
&:focus {
background: @semi-transparent-dark-blue;
backdrop-filter: blur(9.5px);
}
}
}
.bar-label {
width: 40px;
}
}
.progress-bar {
position: absolute;
appearance: none;
width: 100px;
height: 40px;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1;
background: @dark-blue;
&::-webkit-progress-bar {
border: none;
background: @dark-blue;
border-radius: 6px;
}
&::-webkit-progress-value {
background: @gradient-hp;
border-radius: 6px;
}
&.stress-color::-webkit-progress-value {
background: @gradient-stress;
border-radius: 6px;
}
&::-moz-progress-bar {
background: @gradient-hp;
border-radius: 6px;
}
&.stress-color::-moz-progress-bar {
background: @gradient-stress;
border-radius: 6px;
}
}
}
}
.status-section {
@ -256,7 +157,7 @@
.status-label {
padding: 2px 10px;
width: 100%;
border-radius: 3px;
border-radius: 0 0 3px 3px;
background: light-dark(@dark-blue, @golden);
h4 {
@ -284,8 +185,8 @@
.shortcut-items-section {
overflow-y: hidden;
padding-top: 10px;
padding-bottom: 20px;
padding: 10px 0;
flex: 1;
scrollbar-gutter: stable;
.with-scroll-shadows();
@ -313,8 +214,6 @@
}
.experience-section {
margin-bottom: 20px;
.title {
display: flex;
gap: 15px;
@ -331,21 +230,21 @@
gap: 5px;
width: 100%;
margin-top: 10px;
align-items: center;
align-items: stretch;
padding: 0 4px 0 12px;
.experience-row {
display: flex;
gap: 5px;
width: 250px;
align-items: center;
justify-content: space-between;
.experience-name {
width: 180px;
display: flex;
align-items: center;
text-align: start;
font-size: var(--font-size-14);
flex: 1;
color: light-dark(@dark, @beige);
line-height: 1;
}
@ -370,9 +269,7 @@
.reaction-section {
display: flex;
padding: 0 10px;
margin-top: 20px;
width: 100%;
margin: 10px;
button {
height: 40px;

View file

@ -89,113 +89,13 @@
.resources-section {
justify-content: space-around;
margin: 8px 2px 8px 2px;
margin: 8px 2px 0 2px;
}
}
.resources-section {
display: flex;
justify-content: space-evenly;
margin-bottom: 20px;
.status-bar {
display: flex;
justify-content: center;
position: relative;
width: 120px;
height: 40px;
.status-label {
position: relative;
top: 40px;
height: 22px;
width: 79px;
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
background: light-dark(@dark-blue, @golden);
h4 {
font-weight: bold;
text-align: center;
line-height: 18px;
color: light-dark(@beige, @dark-blue);
}
}
.status-value {
position: absolute;
display: flex;
padding: 0 5px;
font-size: 1.5rem;
align-items: center;
width: 140px;
height: 40px;
justify-content: center;
text-align: center;
z-index: 2;
color: @beige;
input[type='number'] {
background: transparent;
font-size: 1.5rem;
width: 40px;
height: 30px;
text-align: center;
border: none;
outline: 2px solid transparent;
color: @beige;
&.bar-input {
padding: 0;
color: @beige;
backdrop-filter: none;
background: transparent;
transition: all 0.3s ease;
&:hover,
&:focus {
background: @semi-transparent-dark-blue;
backdrop-filter: blur(9.5px);
}
}
}
.bar-label {
width: 40px;
}
}
.progress-bar {
position: absolute;
appearance: none;
width: 100px;
height: 40px;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1;
background: @dark-blue;
&::-webkit-progress-bar {
border: none;
background: @dark-blue;
border-radius: 6px;
}
&::-webkit-progress-value {
background: @gradient-hp;
border-radius: 6px;
}
&.stress-color::-webkit-progress-value {
background: @gradient-stress;
border-radius: 6px;
}
&::-moz-progress-bar {
background: @gradient-hp;
border-radius: 6px;
}
&.stress-color::-moz-progress-bar {
background: @gradient-stress;
border-radius: 6px;
}
}
}
}
.status-section {
@ -245,21 +145,21 @@
.status-bar.armor-slots {
display: flex;
justify-content: center;
position: relative;
width: 95px;
height: 30px;
white-space: nowrap;
.status-label {
height: 30px;
}
.status-label {
padding: 2px 2px;
position: relative;
top: 30px;
height: 22px;
width: 95px;
border-radius: 3px;
background: light-dark(@dark-blue, @golden);
clip-path: none;
display: flex;
align-items: center;
justify-content: center;
@ -291,40 +191,16 @@
}
}
.slot-value {
position: absolute;
display: flex;
padding: 0 5px;
font-size: 1.2rem;
align-items: center;
width: 80px;
height: 30px;
justify-content: center;
text-align: center;
z-index: 2;
color: light-dark(@dark-blue, @beige);
flex-direction: column;
.slot-bar {
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 5px;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1;
background: @dark-blue;
justify-content: center;
color: @color-text-emphatic;
.armor-slot {
cursor: pointer;
transition: all 0.3s ease;
font-size: var(--font-size-12);
.fa-shield-halved {
color: light-dark(@dark-blue-40, @golden-40);
}
}
border-bottom: none;
}
.slot-label {
display: flex;
@ -364,41 +240,21 @@
}
}
.status-value {
position: absolute;
display: flex;
padding: 0 6px;
font-size: 1.2rem;
align-items: center;
width: 80px;
height: 30px;
justify-content: center;
text-align: center;
z-index: 2;
color: light-dark(@dark-blue, @beige);
border: 1px solid @color-border;
border-bottom: none;
border-radius: 6px 6px 0 0;
input[type='number'] {
background: transparent;
font-size: 1.2rem;
width: 30px;
height: 20px;
text-align: center;
border: none;
outline: 2px solid transparent;
color: light-dark(@dark-blue, @beige);
&.bar-input {
padding: 0;
color: light-dark(@dark-blue, @beige);
backdrop-filter: none;
background: transparent;
&:hover,
&:focus {
background: @semi-transparent-dark-blue;
backdrop-filter: blur(9.5px);
}
}
}
@ -407,32 +263,9 @@
}
}
.progress-bar {
position: absolute;
appearance: none;
width: 80px;
height: 30px;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1;
background: light-dark(transparent, @dark-blue);
border-bottom: none;
border-radius: 6px 6px 0 0;
&::-webkit-progress-bar {
border: none;
background: light-dark(transparent, @dark-blue);
}
&::-webkit-progress-value {
background: @gradient-stress;
}
&.stress-color::-webkit-progress-value {
background: @gradient-stress;
}
&::-moz-progress-bar {
background: @gradient-stress;
}
&.stress-color::-moz-progress-bar {
background: @gradient-stress;
}
}
}

View file

@ -1,295 +1,265 @@
@import '../../../utils/colors.less';
@import '../../../utils/fonts.less';
@import '../../../utils/mixin.less';
.application.sheet.daggerheart.actor.dh-style.party .tab.partyMembers {
overflow: auto;
.actors-list {
display: flex;
flex-direction: column;
gap: 8px;
align-items: stretch;
width: 100%;
.actor-resources {
display: grid;
grid-template:
"img header" min-content
"img body" 1fr
/ 7.5rem 1fr;
gap: 6px;
column-gap: 12px;
padding: 6px;
background-color: light-dark(@dark-blue-10, @golden-10);
.actor-img-frame {
grid-area: img;
width: 7.375rem;
height: 7.375rem;
position: relative;
.actor-img {
object-fit: cover;
object-position: top center;
border-radius: 6px;
width: 100%;
height: 100%;
}
.equipped-weapons {
position: absolute;
top: -2px;
left: -3px;
display: flex;
flex-direction: column;
gap: 1px;
img {
border-radius: 50%;
width: 24px;
height: 24px;
border: 1px solid @color-border;
object-fit: cover;
}
}
.evasion {
position: absolute;
top: 1px;
right: 1px;
width: 1.75rem;
height: 1.75rem;
background: url('../assets/svg/trait-shield.svg') no-repeat;
background-size: 100%;
color: var(--color-light-1);
font-size: var(--font-size-14);
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
}
.threshold-section {
position: absolute;
left: 0;
right: 0;
bottom: -2px;
margin: auto;
display: flex;
gap: 4px;
background-color: light-dark(var(--color-light-1), @dark-blue);
color: @color-text-emphatic;
padding: 4px 6px;
border: 1px solid @color-border;
border-radius: 3px;
align-items: baseline;
width: fit-content;
h4 {
font-weight: bold;
text-transform: uppercase;
white-space: nowrap;
&.threshold-label {
font-size: var(--font-size-10);
color: @color-text-emphatic;
}
&.threshold-value {
font-size: var(--font-size-11);
color: light-dark(@dark, @beige);
}
}
}
}
header {
grid-area: header;
display: grid;
grid-template:
"name hope" min-content
"subtitle subtitle" min-content
/ 1fr min-content;
.actor-name {
width: 100%;
z-index: 1;
font-size: var(--font-size-20);
color: @color-text-emphatic;
font-weight: bold;
}
.delete-icon {
font-size: 0.75em;
}
.subtitle {
grid-area: subtitle;
font-size: var(--font-size-14);
}
.hope-section {
display: flex;
background-color: light-dark(transparent, @dark-blue);
color: @color-text-emphatic;
padding: 3px 6px;
border: 1px solid @color-border;
border-radius: 3px;
align-items: center;
width: fit-content;
margin-left: auto;
h4 {
font-size: var(--font-size-12);
font-weight: bold;
text-transform: uppercase;
color: @color-text-emphatic;
margin-right: 3px;
}
.hope-value {
display: flex;
cursor: pointer;
font-size: var(--font-size-12);
margin-left: 1px;
}
}
}
.body {
grid-area: body;
display: flex;
align-items: start;
justify-content: space-between;
}
.resources {
display: flex;
flex-direction: column;
gap: 4px;
.slot-section {
display: flex;
flex-direction: row;
align-items: stretch;
.slot-label {
display: flex;
align-items: center;
color: light-dark(@beige, @dark-blue);
background: light-dark(@dark-blue, @golden);
padding: 0 4px;
width: fit-content;
font-weight: bold;
border-radius: 6px 0px 0px 6px;
font-size: var(--font-size-12);
white-space: nowrap;
.label {
padding-right: 2px;
}
.value {
font-variant-numeric: tabular-nums;
.current {
display: inline-block;
text-align: end;
width: 2ch;
}
.max {
display: inline-block;
text-align: start;
width: 2ch;
}
}
}
.slot-bar {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 4px;
background-color: light-dark(@dark-blue-10, @dark-blue);
color: @color-text-emphatic;
padding: 2px 5px;
border: 1px solid @color-border;
border-radius: 0 6px 6px 0;
width: fit-content;
min-height: 22px;
.armor-slot {
cursor: pointer;
transition: all 0.3s ease;
font-size: var(--font-size-12);
.fa-shield-halved {
color: light-dark(@dark-blue-40, @golden-40);
}
}
.slot {
width: 16px;
height: 10px;
border: 1px solid @color-border;
background: light-dark(@dark-blue-10, @golden-10);
border-radius: 3px;
transition: all 0.3s ease;
cursor: pointer;
&.filled {
background: light-dark(@dark-blue, @golden);
}
}
}
}
}
.traits {
background-color: light-dark(@dark-blue-10, @dark-blue);
border: 1px solid @color-border;
border-radius: 6px;
display: grid;
grid-template-columns: 1fr 1fr;
font-size: var(--font-size-12);
padding: 3px 4px;
gap: 3px 7px;
.trait {
display: flex;
justify-content: space-between;
gap: 3px;
.label {
color: @color-text-emphatic;
}
.value {
font-weight: 600;
}
}
}
}
}
.actors-list.limited {
.actor-resources {
display: flex;
align-items: center;
}
.actor-img-frame {
width: 3rem;
height: 3rem;
}
}
.actors-dragger {
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
width: 100%;
height: 40px;
border: 1px dashed light-dark(@dark-blue-50, @beige-50);
border-radius: 3px;
color: light-dark(@dark-blue-50, @beige-50);
}
}
@import '../../../utils/colors.less';
@import '../../../utils/fonts.less';
@import '../../../utils/mixin.less';
.application.sheet.daggerheart.actor.dh-style.party .tab.partyMembers {
overflow: auto;
.actors-list {
display: flex;
flex-direction: column;
gap: 8px;
align-items: stretch;
width: 100%;
.actor-resources {
display: grid;
grid-template:
"img header" min-content
"img body" 1fr
/ 7.5rem 1fr;
gap: 6px;
column-gap: 12px;
padding: 6px;
background-color: light-dark(@dark-blue-10, @golden-10);
.actor-img-frame {
grid-area: img;
width: 7.375rem;
height: 7.375rem;
position: relative;
.actor-img {
object-fit: cover;
object-position: top center;
border-radius: 6px;
width: 100%;
height: 100%;
}
.equipped-weapons {
position: absolute;
top: -2px;
left: -3px;
display: flex;
flex-direction: column;
gap: 1px;
img {
border-radius: 50%;
width: 24px;
height: 24px;
border: 1px solid @color-border;
object-fit: cover;
}
}
.evasion {
position: absolute;
top: 1px;
right: 1px;
width: 1.75rem;
height: 1.75rem;
background: url('../assets/svg/trait-shield.svg') no-repeat;
background-size: 100%;
color: var(--color-light-1);
font-size: var(--font-size-14);
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
}
.threshold-section {
position: absolute;
left: 0;
right: 0;
bottom: -2px;
margin: auto;
display: flex;
gap: 4px;
background-color: light-dark(var(--color-light-1), @dark-blue);
color: @color-text-emphatic;
padding: 4px 6px;
border: 1px solid @color-border;
border-radius: 3px;
align-items: baseline;
width: fit-content;
h4 {
font-weight: bold;
text-transform: uppercase;
white-space: nowrap;
&.threshold-label {
font-size: var(--font-size-10);
color: @color-text-emphatic;
}
&.threshold-value {
font-size: var(--font-size-11);
color: light-dark(@dark, @beige);
}
}
}
}
header {
grid-area: header;
display: grid;
grid-template:
"name hope" min-content
"subtitle subtitle" min-content
/ 1fr min-content;
.actor-name {
width: 100%;
z-index: 1;
font-size: var(--font-size-20);
color: @color-text-emphatic;
font-weight: bold;
}
.delete-icon {
font-size: 0.75em;
}
.subtitle {
grid-area: subtitle;
font-size: var(--font-size-14);
}
.hope-section {
display: flex;
background-color: light-dark(transparent, @dark-blue);
color: @color-text-emphatic;
padding: 3px 6px;
border: 1px solid @color-border;
border-radius: 3px;
align-items: center;
width: fit-content;
margin-left: auto;
h4 {
font-size: var(--font-size-12);
font-weight: bold;
text-transform: uppercase;
color: @color-text-emphatic;
margin-right: 3px;
}
.hope-value {
display: flex;
cursor: pointer;
font-size: var(--font-size-12);
margin-left: 1px;
}
}
}
.body {
grid-area: body;
display: flex;
align-items: start;
justify-content: space-between;
}
.resources {
display: flex;
flex-direction: column;
gap: 4px;
.slot-section {
display: flex;
flex-direction: row;
align-items: stretch;
.slot-label {
display: flex;
align-items: center;
color: light-dark(@beige, @dark-blue);
background: light-dark(@dark-blue, @golden);
padding: 0 4px;
width: fit-content;
font-weight: bold;
border-radius: 6px 0px 0px 6px;
font-size: var(--font-size-12);
white-space: nowrap;
.label {
padding-right: 2px;
}
.value {
font-variant-numeric: tabular-nums;
.current {
display: inline-block;
text-align: end;
width: 2ch;
}
.max {
display: inline-block;
text-align: start;
width: 2ch;
}
}
}
.slot-bar {
align-items: center;
flex-wrap: wrap;
background-color: light-dark(@dark-blue-10, @dark-blue);
padding: 2px 5px;
border-radius: 0 6px 6px 0;
width: fit-content;
}
}
}
.traits {
background-color: light-dark(@dark-blue-10, @dark-blue);
border: 1px solid @color-border;
border-radius: 6px;
display: grid;
grid-template-columns: 1fr 1fr;
font-size: var(--font-size-12);
padding: 3px 4px;
gap: 3px 7px;
.trait {
display: flex;
justify-content: space-between;
gap: 3px;
.label {
color: @color-text-emphatic;
}
.value {
font-weight: 600;
}
}
}
}
}
.actors-list.limited {
.actor-resources {
display: flex;
align-items: center;
}
.actor-img-frame {
width: 3rem;
height: 3rem;
}
}
.actors-dragger {
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
width: 100%;
height: 40px;
border: 1px dashed light-dark(@dark-blue-50, @beige-50);
border-radius: 3px;
color: light-dark(@dark-blue-50, @beige-50);
}
}

View file

@ -11,9 +11,10 @@
<a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a>
</div>
<div class="nest-inputs">
{{formField ../fields.type value=area.type name=(concat "areas." index ".type") localize=true}}
{{formField ../fields.shape value=area.shape name=(concat "areas." index ".shape") localize=true}}
{{formField ../fields.size value=area.size name=(concat "areas." index ".size") localize=true}}
{{formField ../fields.type value=area.type name=(concat "areas." index ".type") localize=true blank=false}}
{{formField ../fields.shape value=area.shape name=(concat "areas." index ".shape") localize=true blank=false}}
{{formField ../fields.size value=area.size name=(concat "areas." index ".size") localize=true blank=false}}
{{formField ../fields.hasHole value=area.hasHole name=(concat "areas." index ".hasHole") localize=true classes="auto-sized" }}
</div>
<div class="sub-section-header">

View file

@ -1,100 +1,102 @@
<aside class="adversary-sidebar-sheet">
<div class="portrait {{#if (and source.system.resources.hitPoints.max (gte source.system.resources.hitPoints.value source.system.resources.hitPoints.max))}}death-roll{{/if}}">
<img src="{{source.img}}" alt="{{source.name}}" data-action='editImage' data-edit="img">
<a class="death-roll-btn"><i class="fa-solid fa-skull death-save"></i></a>
</div>
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
<div class="resources-section">
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
</div>
<div class="status-section">
<div class="status-number">
<div class='status-value armor-slots'>
{{#if source.system.difficulty}}
<p>{{source.system.difficulty}}</p>
{{else}}
<p>-</p>
{{/if}}
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.difficulty"}}</h4>
</div>
</div>
<div class="status-number">
<div class='status-value armor-slots'>
{{#if source.system.attack.roll.bonus includeZero=true}}
<p>{{numberFormat source.system.attack.roll.bonus sign=true}}</p>
{{else}}
<p>-</p>
{{/if}}
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.attack"}}</h4>
</div>
</div>
{{#if (lt source.system.criticalThreshold 20)}}
<div class="status-number">
<div class='status-value armor-slots'>
<p>{{source.system.criticalThreshold}}+</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.criticalShort"}}</h4>
</div>
</div>
{{/if}}
</div>
<div class="status-section">
<div class="threshold-section">
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
</div>
</div>
</div>
<div class="shortcut-items-section">
<div class="attack-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.attack"}}</h3>
<side-line-div></side-line-div>
</div>
<ul class="items-sidebar-list">
{{> 'daggerheart.inventory-item-compact'
item=document.system.attack
type='attack'
noCompendiumEdit=true
}}
</ul>
</div>
<div class="experience-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.experience.plural"}}</h3>
<side-line-div></side-line-div>
</div>
<div class="experience-list">
{{#each source.system.experiences as |experience id|}}
<div class="experience-row" data-tooltip-text="{{experience.description}}">
<span class="experience-value">
+{{experience.value}}
</span>
<span class="experience-name">{{experience.name}}</span>
<div class="controls">
<a data-action="sendExpToChat" data-id="{{id}}">
<i class="fa-regular fa-message"></i>
</a>
</div>
</div>
{{/each}}
</div>
</div>
<line-div></line-div>
<div class="reaction-section">
<button type="button" data-action="reactionRoll">{{localize "DAGGERHEART.GENERAL.Roll.reaction"}}</button>
</div>
</div>
<aside class="adversary-sidebar-sheet">
<div class="portrait {{#if (and source.system.resources.hitPoints.max (gte source.system.resources.hitPoints.value source.system.resources.hitPoints.max))}}death-roll{{/if}}">
<img src="{{source.img}}" alt="{{source.name}}" data-action='editImage' data-edit="img">
<a class="death-roll-btn"><i class="fa-solid fa-skull death-save"></i></a>
</div>
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
<div class="resources-section">
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
</div>
<div class="status-section">
<div class="status-number">
<div class='status-value armor-slots'>
{{#if source.system.difficulty}}
<p>{{source.system.difficulty}}</p>
{{else}}
<p>-</p>
{{/if}}
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.difficulty"}}</h4>
</div>
</div>
<div class="status-number">
<div class='status-value armor-slots'>
{{#if source.system.attack.roll.bonus includeZero=true}}
<p>{{numberFormat source.system.attack.roll.bonus sign=true}}</p>
{{else}}
<p>-</p>
{{/if}}
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.attack"}}</h4>
</div>
</div>
{{#if (lt source.system.criticalThreshold 20)}}
<div class="status-number">
<div class='status-value armor-slots'>
<p>{{source.system.criticalThreshold}}+</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.criticalShort"}}</h4>
</div>
</div>
{{/if}}
</div>
<div class="status-section">
<div class="threshold-section">
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
</div>
</div>
</div>
<div class="shortcut-items-section">
<div class="attack-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.attack"}}</h3>
<side-line-div></side-line-div>
</div>
<ul class="items-sidebar-list">
{{> 'daggerheart.inventory-item-compact'
item=document.system.attack
type='attack'
noCompendiumEdit=true
}}
</ul>
</div>
<div class="experience-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.experience.plural"}}</h3>
<side-line-div></side-line-div>
</div>
<div class="experience-list">
{{#each source.system.experiences as |experience id|}}
<div class="experience-row" data-tooltip-text="{{experience.description}}">
<span class="experience-value">
+{{experience.value}}
</span>
<span class="experience-name">{{experience.name}}</span>
<div class="controls">
<a data-action="sendExpToChat" data-id="{{id}}">
<i class="fa-regular fa-message"></i>
</a>
</div>
</div>
{{/each}}
</div>
</div>
</div>
<div class="reaction-section">
<button type="button" data-action="reactionRoll">
<i class="fa-solid fa-dice"></i>
{{localize "DAGGERHEART.GENERAL.Roll.reaction"}}
</button>
</div>
</aside>

View file

@ -1,152 +1,152 @@
<aside class="character-sidebar-sheet">
<div class="portrait {{#if isDeath}}death-roll{{/if}}">
<img src="{{document.img}}" alt="{{document.name}}" data-action='editImage' data-edit="img">
<a class="death-roll-btn" data-tooltip="DAGGERHEART.UI.Tooltip.makeDeathMove" {{#if
isDeath}}data-action="makeDeathMove" {{/if}}><i class="fa-solid fa-skull death-save"></i></a>
</div>
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
<div class="resources-section">
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
</div>
<div class="status-section {{#if useResourcePips}}pip-display{{/if}}">
<div class="status-number">
<div class='status-value'>
<p>{{document.system.evasion}}</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.evasion"}}</h4>
</div>
</div>
{{#if document.system.armorScore.max}}
<div class="status-bar armor-slots">
{{#if useResourcePips}}
<div class='slot-value'>
<div class="slot-bar">
{{#times document.system.armorScore.max}}
<a class='armor-slot' data-action='toggleArmor' data-value="{{add this 1}}">
{{#if (gte ../document.system.armorScore.value (add this 1))}}
<i class="fa-solid fa-shield"></i>
{{else}}
<i class="fa-solid fa-shield-halved"></i>
{{/if}}
</a>
{{/times}}
</div>
<a class="slot-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
<span class="label">{{localize "DAGGERHEART.GENERAL.armorSlots"}}</span>
<div class="slot-value-container">
<span class="value">{{document.system.armorScore.value}} / {{document.system.armorScore.max}}</span>
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
</div>
</a>
</div>
{{else}}
<div class='status-value'>
<input class="bar-input armor-marks-input" value="{{document.system.armorScore.value}}" type="number" id="{{document.uuid}}-armor-slots">
<span>/</span>
<span class="bar-label">{{document.system.armorScore.max}}</span>
</div>
<progress
class='progress-bar stress-color'
value='{{document.system.armorScore.value}}'
max='{{document.system.armorScore.max}}'
></progress>
<a class="status-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
</a>
{{/if}}
</div>
{{else}}
<div class="status-number armor-slots">
<div class='status-value'>
<p>-</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
</div>
</div>
{{/if}}
<div class="status-number">
<div class='status-value'>
<p>{{document.system.proficiency}}</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.proficiency"}}</h4>
</div>
</div>
</div>
<div class="threshold-section">
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
</div>
</div>
<div class="shortcut-items-section">
<div class="equipment-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.equipment"}}</h3>
<side-line-div></side-line-div>
</div>
<ul class="items-sidebar-list">
{{#if document.system.usedUnarmed}}
{{> 'daggerheart.inventory-item-compact'
item=document.system.usedUnarmed
type='attack'
}}
{{/if}}
{{#each equippedItems as |item|}}
{{> 'daggerheart.inventory-item-compact'
item=item
type=item.type
}}
{{/each}}
</ul>
</div>
<div class="loadout-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.loadout"}}</h3>
<side-line-div></side-line-div>
</div>
<ul class="items-sidebar-list">
{{#each document.system.domainCards.loadout as |card|}}
{{> 'daggerheart.inventory-item-compact'
item=card
type='domainCard'
}}
{{/each}}
</ul>
</div>
<div class="experience-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.experience.single"}}</h3>
<side-line-div></side-line-div>
</div>
<div class="experience-list">
{{#each document.system.experiences as |experience id|}}
<div class="experience-row" data-tooltip-text="{{experience.description}}">
<span class="experience-value">
{{numberFormat experience.value sign=true}}
</span>
<span class="experience-name">{{experience.name}}</span>
<div class="controls">
<a data-action="sendExpToChat" data-type="experience" data-id="{{id}}">
<i class="fa-regular fa-message"></i>
</a>
</div>
</div>
{{/each}}
</div>
</div>
</div>
<aside class="character-sidebar-sheet">
<div class="portrait {{#if isDeath}}death-roll{{/if}}">
<img src="{{document.img}}" alt="{{document.name}}" data-action='editImage' data-edit="img">
<a class="death-roll-btn" data-tooltip="DAGGERHEART.UI.Tooltip.makeDeathMove" {{#if
isDeath}}data-action="makeDeathMove" {{/if}}><i class="fa-solid fa-skull death-save"></i></a>
</div>
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
<div class="resources-section">
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
</div>
<div class="status-section {{#if useResourcePips}}pip-display{{/if}}">
<div class="status-number">
<div class='status-value'>
<p>{{document.system.evasion}}</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.evasion"}}</h4>
</div>
</div>
{{#if document.system.armorScore.max}}
<div class="status-bar armor-slots">
{{#if useResourcePips}}
<div class='slot-value'>
<div class="slot-bar armor">
{{#times document.system.armorScore.max}}
<a class="slot" data-action="toggleArmor" data-value="{{add this 1}}">
{{#if (gte ../document.system.armorScore.value (add this 1))}}
<i class="fa-solid fa-shield"></i>
{{else}}
<i class="fa-solid fa-shield-halved"></i>
{{/if}}
</a>
{{/times}}
</div>
<a class="slot-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
<span class="label">{{localize "DAGGERHEART.GENERAL.armorSlots"}}</span>
<div class="slot-value-container">
<span class="value">{{document.system.armorScore.value}} / {{document.system.armorScore.max}}</span>
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
</div>
</a>
</div>
{{else}}
<div class='status-value'>
<progress
class='progress-bar stress-color'
value='{{document.system.armorScore.value}}'
max='{{document.system.armorScore.max}}'
></progress>
<input class="bar-input armor-marks-input" value="{{document.system.armorScore.value}}" type="number" id="{{document.uuid}}-armor-slots">
<span>/</span>
<span class="bar-label">{{document.system.armorScore.max}}</span>
</div>
<a class="status-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
</a>
{{/if}}
</div>
{{else}}
<div class="status-number armor-slots">
<div class='status-value'>
<p>-</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
</div>
</div>
{{/if}}
<div class="status-number">
<div class='status-value'>
<p>{{document.system.proficiency}}</p>
</div>
<div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.proficiency"}}</h4>
</div>
</div>
</div>
<div class="threshold-section">
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
</div>
</div>
<div class="shortcut-items-section">
<div class="equipment-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.equipment"}}</h3>
<side-line-div></side-line-div>
</div>
<ul class="items-sidebar-list">
{{#if document.system.usedUnarmed}}
{{> 'daggerheart.inventory-item-compact'
item=document.system.usedUnarmed
type='attack'
}}
{{/if}}
{{#each equippedItems as |item|}}
{{> 'daggerheart.inventory-item-compact'
item=item
type=item.type
}}
{{/each}}
</ul>
</div>
<div class="loadout-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.loadout"}}</h3>
<side-line-div></side-line-div>
</div>
<ul class="items-sidebar-list">
{{#each document.system.domainCards.loadout as |card|}}
{{> 'daggerheart.inventory-item-compact'
item=card
type='domainCard'
}}
{{/each}}
</ul>
</div>
<div class="experience-section">
<div class="title">
<side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.experience.single"}}</h3>
<side-line-div></side-line-div>
</div>
<div class="experience-list">
{{#each document.system.experiences as |experience id|}}
<div class="experience-row" data-tooltip-text="{{experience.description}}">
<span class="experience-value">
{{numberFormat experience.value sign=true}}
</span>
<span class="experience-name">{{experience.name}}</span>
<div class="controls">
<a data-action="sendExpToChat" data-type="experience" data-id="{{id}}">
<i class="fa-regular fa-message"></i>
</a>
</div>
</div>
{{/each}}
</div>
</div>
</div>
</aside>

View file

@ -1,191 +1,191 @@
<section
class='tab {{tabs.partyMembers.cssClass}} {{tabs.partyMembers.id}}'
data-tab='{{tabs.partyMembers.id}}'
data-group='{{tabs.partyMembers.group}}'
>
<div class="actions-section">
<button data-action="tagTeamRoll" class="{{#if tagTeamActive}}active-action{{/if}}">
<i class="fa-solid fa-user-group"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.title"}}</span>
</button>
<button data-action="groupRoll" class="{{#if groupRollActive}}active-action{{/if}}">
<i class="fa-solid fa-users"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.GroupRollSelect.title"}}</span>
</button>
<button data-action="triggerRest" data-action="triggerRest" data-type="shortRest">
<i class="fa-solid fa-utensils"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"}}</span>
</button>
<button data-action="triggerRest" data-type="longRest">
<i class="fa-solid fa-bed"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.longRest.title"}}</span>
</button>
</div>
{{#if @root.showStats}}
<ul class="actors-list">
{{#each partyMembers as |member id|}}
<li class="actor-resources">
<div class="actor-img-frame">
<img class="actor-img" src="{{member.img}}">
{{#if member.weapons}}
<div class="equipped-weapons">
{{#each member.weapons as |weapon|}}
<img src="{{weapon.img}}" data-tooltip="{{weapon.name}}"/>
{{/each}}
</div>
{{/if}}
{{#if member.evasion includeZero=true}}
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.evasion">{{member.evasion}}</div>
{{/if}}
{{#if member.difficulty includeZero=true}}
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.difficulty">{{member.difficulty}}</div>
{{/if}}
{{#unless (or (eq member.type 'companion') (eq member.type 'npc'))}}
<div class="threshold-section">
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.minor"}}</h4>
<h4 class="threshold-value">{{member.damageThresholds.major}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.major"}}</h4>
<h4 class="threshold-value">{{member.damageThresholds.severe}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.severe"}}</h4>
</div>
{{/unless}}
</div>
<header>
<h2 class="actor-name">
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
</h2>
<div>
{{#unless (or (eq member.type 'companion') (eq member.type 'adversary') (eq member.type 'npc')) }}
<div class="hope-section">
<h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4>
{{#times member.resources.hope.max}}
<span class='hope-value' data-action='toggleHope' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
{{#if (gte member.resources.hope.value (add this 1))}}
<i class='fa-solid fa-diamond'></i>
{{else}}
<i class='fa-regular fa-circle'></i>
{{/if}}
</span>
{{/times}}
</div>
{{/unless}}
</div>
{{#if member.subtitle}}
<span class="subtitle">{{member.subtitle}}</span>
{{/if}}
</header>
<section class="body">
<section class="resources">
{{#unless (or (eq member.type 'companion') (eq member.type 'npc')) }}
<div class="slot-section">
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.HitPoints.plural">
<span class="label">
<i class="fa-solid fa-heart" inert></i>
</span>
<span class="value">
<span class="current">{{member.resources.hitPoints.value}}</span>
/
<span class="max">{{member.resources.hitPoints.max}}</span>
</span>
</div>
<div class="slot-bar">
{{#times member.resources.hitPoints.max}}
<span class='slot {{#if (gte member.resources.hitPoints.value (add this 1))}}filled{{/if}}'
data-action='toggleHitPoints' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
</span>
{{/times}}
</div>
</div>
{{/unless}}
{{#unless (eq member.type 'npc')}}
<div class="slot-section">
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.stress">
<span class="label">
<i class="fa-solid fa-bolt" inert></i>
</span>
<span class="value">
<span class="current">{{member.resources.stress.value}}</span>
/
<span class="max">{{member.resources.stress.max}}</span>
</span>
</div>
<div class="slot-bar">
{{#times member.resources.stress.max}}
<span class='slot {{#if (gte member.resources.stress.value (add this 1))}}filled{{/if}}'
data-action='toggleStress' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
</span>
{{/times}}
</div>
</div>
{{/unless}}
{{#if member.armorScore.max}}
<div class="slot-section">
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.armorSlots">
<span class="label">
<i class="fa-solid fa-shield" inert></i>
</span>
<span class="value">
<span class="current">{{member.armorScore.value}}</span>
/
<span class="max">{{member.armorScore.max}}</span>
</span>
</div>
<div class="slot-bar">
{{#times member.armorScore.max}}
<a class='armor-slot' data-action='toggleArmorSlot' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
{{#if (gte member.armorScore.value (add this 1))}}
<i class="fa-solid fa-shield"></i>
{{else}}
<i class="fa-solid fa-shield-halved"></i>
{{/if}}
</a>
{{/times}}
</div>
</div>
{{/if}}
</section>
{{#if member.traits}}
<div class="traits">
{{#each member.traits as |trait|}}
<span class="trait">
<span class="label">{{trait.label}}</span>
<span class="value">{{trait.value}}</span>
</span>
{{/each}}
</div>
{{/if}}
</section>
</li>
{{/each}}
</ul>
{{else}}
<ul class="actors-list limited">
{{#each partyMembers as |member id|}}
<li class="actor-resources">
<div class="actor-img-frame">
<img class="actor-img" src="{{member.img}}">
</div>
<header>
<h2 class="actor-name">
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
</h2>
{{#if member.subtitle}}
<span class="subtitle">{{member.subtitle}}</span>
{{/if}}
</header>
</li>
{{/each}}
</ul>
{{/if}}
{{#unless document.system.partyMembers.length}}
<div class="actors-dragger">
<span>{{localize "DAGGERHEART.GENERAL.dropActorsHere"}}</span>
</div>
{{/unless}}
</section>
<section
class='tab {{tabs.partyMembers.cssClass}} {{tabs.partyMembers.id}}'
data-tab='{{tabs.partyMembers.id}}'
data-group='{{tabs.partyMembers.group}}'
>
<div class="actions-section">
<button data-action="tagTeamRoll" class="{{#if tagTeamActive}}active-action{{/if}}">
<i class="fa-solid fa-user-group"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.title"}}</span>
</button>
<button data-action="groupRoll" class="{{#if groupRollActive}}active-action{{/if}}">
<i class="fa-solid fa-users"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.GroupRollSelect.title"}}</span>
</button>
<button data-action="triggerRest" data-action="triggerRest" data-type="shortRest">
<i class="fa-solid fa-utensils"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"}}</span>
</button>
<button data-action="triggerRest" data-type="longRest">
<i class="fa-solid fa-bed"></i>
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.longRest.title"}}</span>
</button>
</div>
{{#if @root.showStats}}
<ul class="actors-list">
{{#each partyMembers as |member id|}}
<li class="actor-resources">
<div class="actor-img-frame">
<img class="actor-img" src="{{member.img}}">
{{#if member.weapons}}
<div class="equipped-weapons">
{{#each member.weapons as |weapon|}}
<img src="{{weapon.img}}" data-tooltip="{{weapon.name}}"/>
{{/each}}
</div>
{{/if}}
{{#if member.evasion includeZero=true}}
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.evasion">{{member.evasion}}</div>
{{/if}}
{{#if member.difficulty includeZero=true}}
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.difficulty">{{member.difficulty}}</div>
{{/if}}
{{#unless (or (eq member.type 'companion') (eq member.type 'npc'))}}
<div class="threshold-section">
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.minor"}}</h4>
<h4 class="threshold-value">{{member.damageThresholds.major}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.major"}}</h4>
<h4 class="threshold-value">{{member.damageThresholds.severe}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.severe"}}</h4>
</div>
{{/unless}}
</div>
<header>
<h2 class="actor-name">
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
</h2>
<div>
{{#unless (or (eq member.type 'companion') (eq member.type 'adversary') (eq member.type 'npc')) }}
<div class="hope-section">
<h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4>
{{#times member.resources.hope.max}}
<span class='hope-value' data-action='toggleHope' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
{{#if (gte member.resources.hope.value (add this 1))}}
<i class='fa-solid fa-diamond'></i>
{{else}}
<i class='fa-regular fa-circle'></i>
{{/if}}
</span>
{{/times}}
</div>
{{/unless}}
</div>
{{#if member.subtitle}}
<span class="subtitle">{{member.subtitle}}</span>
{{/if}}
</header>
<section class="body">
<section class="resources">
{{#unless (or (eq member.type 'companion') (eq member.type 'npc')) }}
<div class="slot-section">
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.HitPoints.plural">
<span class="label">
<i class="fa-solid fa-heart" inert></i>
</span>
<span class="value">
<span class="current">{{member.resources.hitPoints.value}}</span>
/
<span class="max">{{member.resources.hitPoints.max}}</span>
</span>
</div>
<div class="slot-bar">
{{#times member.resources.hitPoints.max}}
<span class='slot {{#if (gte member.resources.hitPoints.value (add this 1))}}filled{{/if}}'
data-action='toggleHitPoints' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
</span>
{{/times}}
</div>
</div>
{{/unless}}
{{#unless (eq member.type 'npc')}}
<div class="slot-section">
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.stress">
<span class="label">
<i class="fa-solid fa-bolt" inert></i>
</span>
<span class="value">
<span class="current">{{member.resources.stress.value}}</span>
/
<span class="max">{{member.resources.stress.max}}</span>
</span>
</div>
<div class="slot-bar">
{{#times member.resources.stress.max}}
<span class='slot {{#if (gte member.resources.stress.value (add this 1))}}filled{{/if}}'
data-action='toggleStress' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
</span>
{{/times}}
</div>
</div>
{{/unless}}
{{#if member.armorScore.max}}
<div class="slot-section">
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.armorSlots">
<span class="label">
<i class="fa-solid fa-shield" inert></i>
</span>
<span class="value">
<span class="current">{{member.armorScore.value}}</span>
/
<span class="max">{{member.armorScore.max}}</span>
</span>
</div>
<div class="slot-bar armor">
{{#times member.armorScore.max}}
<a class="slot" data-action="toggleArmorSlot" data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
{{#if (gte member.armorScore.value (add this 1))}}
<i class="fa-solid fa-shield"></i>
{{else}}
<i class="fa-solid fa-shield-halved"></i>
{{/if}}
</a>
{{/times}}
</div>
</div>
{{/if}}
</section>
{{#if member.traits}}
<div class="traits">
{{#each member.traits as |trait|}}
<span class="trait">
<span class="label">{{trait.label}}</span>
<span class="value">{{trait.value}}</span>
</span>
{{/each}}
</div>
{{/if}}
</section>
</li>
{{/each}}
</ul>
{{else}}
<ul class="actors-list limited">
{{#each partyMembers as |member id|}}
<li class="actor-resources">
<div class="actor-img-frame">
<img class="actor-img" src="{{member.img}}">
</div>
<header>
<h2 class="actor-name">
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
</h2>
{{#if member.subtitle}}
<span class="subtitle">{{member.subtitle}}</span>
{{/if}}
</header>
</li>
{{/each}}
</ul>
{{/if}}
{{#unless document.system.partyMembers.length}}
<div class="actors-dragger">
<span>{{localize "DAGGERHEART.GENERAL.dropActorsHere"}}</span>
</div>
{{/unless}}
</section>

View file

@ -1,35 +1,35 @@
<div class="status-bar">
{{#if useResourcePips}}
<div class='slot-value'>
<div class="slot-bar">
{{#times resource.max}}
<span class='slot {{#if (gte ../resource.value (add this 1))}}filled{{/if}} {{#if ../largePips}}large{{/if}}' data-action="{{../action}}" data-value="{{add this 1}}">
</span>
{{/times}}
{{#times resource.emptyPips}}
<span class="empty-slot"></span>
{{/times}}
</div>
<div class="slot-label">
<span class="label">{{localize label}}</span>
<span class="value">{{resource.value}} / {{resource.max}}</span>
</div>
{{#if useResourcePips}}
<div class="slot-value">
<div class="slot-bar">
{{#times resource.max}}
<span class='slot {{#if (gte ../resource.value (add this 1))}}filled{{/if}} {{#if ../largePips}}large{{/if}}' data-action="{{../action}}" data-value="{{add this 1}}">
</span>
{{/times}}
{{#times resource.emptyPips}}
<span class="empty-slot"></span>
{{/times}}
</div>
{{else}}
<div class="slot-label">
<span class="label">{{localize label}}</span>
<span class="value">{{resource.value}} / {{resource.max}}</span>
</div>
</div>
{{else}}
<div class="status-bar">
<div class='status-value'>
<progress
class='progress-bar'
max='{{resource.max}}'
value='{{resource.value}}'
></progress>
<input class="bar-input" name="{{key}}" min="0" max='{{resource.max}}'
value="{{resource.value}}" type="number">
<span>/</span>
<span class="bar-label">{{resource.max}}</span>
</div>
<progress
class='progress-bar'
max='{{resource.max}}'
value='{{resource.value}}'
></progress>
<div class="status-label">
<div class="status-label pointy">
<h4>{{localize label}}</h4>
</div>
{{/if}}
</div>
</div>
{{/if}}

View file

@ -6,18 +6,13 @@
<div class="message-sub-header-container">
{{#if message.title}}
<h4>{{message.title}}</h4>
<div>{{actor.name}} {{#if author.isGM}}(GM){{/if}}</div>
<div>{{alias}} {{#if author.isGM}}(GM){{/if}}</div>
{{else}}
{{#unless actor.name}}
<h4>{{author.name}}</h4>
{{else}}
{{#if (eq message.type 'base')}}
<h4>{{actor.name}}</h4>
<div>{{author.name}}</div>
{{else}}
<h4>{{alias}}</h4>
<div>{{actor.name}} {{#if author.isGM}}(GM){{/if}}</div>
{{/if}}
<h4>{{alias}}</h4>
<div>{{author.name}}</div>
{{/unless}}
{{/if}}
</div>

View file

@ -3,9 +3,9 @@
{{#each sources as |source|}}
<div class="armor-source-container">
<p class="armor-source-label">{{source.name}}</p>
<div class="slot-bar">
<div class="slot-bar armor">
{{#times source.max}}
<a class='armor-slot' data-value="{{add this 1}}" data-uuid="{{source.uuid}}">
<a class="slot" data-value="{{add this 1}}" data-uuid="{{source.uuid}}">
{{#if (gte ../current (add this 1))}}
<i class="fa-solid fa-shield" data-index="{{this}}"></i>
{{else}}