Compare commits

..

1 commit

Author SHA1 Message Date
Carlos Fernandez
a15b82df36 Styling pass for scrollbars, fieldsets, and scroll shadows 2026-06-25 01:31:42 -04:00
68 changed files with 1768 additions and 1571 deletions

View file

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

View file

@ -7,7 +7,7 @@ export default class AdversarySheet extends DHBaseActorSheet {
/** @inheritDoc */ /** @inheritDoc */
static DEFAULT_OPTIONS = { static DEFAULT_OPTIONS = {
classes: ['adversary'], classes: ['adversary'],
position: { width: 645, height: 760 }, position: { width: 650, height: 750 },
window: { resizable: true }, window: { resizable: true },
actions: { actions: {
toggleHitPoints: AdversarySheet.#toggleHitPoints, toggleHitPoints: AdversarySheet.#toggleHitPoints,

View file

@ -1057,7 +1057,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
direction: 'DOWN' direction: 'DOWN'
}); });
html.querySelectorAll('.armor .slot').forEach(element => { html.querySelectorAll('.armor-slot').forEach(element => {
element.addEventListener('click', CharacterSheet.armorSourcePipUpdate); element.addEventListener('click', CharacterSheet.armorSourcePipUpdate);
}); });
} }
@ -1072,7 +1072,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
/** Update specific armor source */ /** Update specific armor source */
static async armorSourcePipUpdate(event) { static async armorSourcePipUpdate(event) {
const target = event.target.closest('.slot'); const target = event.target.closest('.armor-slot');
const { uuid, value } = target.dataset; const { uuid, value } = target.dataset;
const document = await foundry.utils.fromUuid(uuid); const document = await foundry.utils.fromUuid(uuid);
@ -1100,7 +1100,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
} }
const container = target.closest('.slot-bar'); 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); const index = Number.parseInt(armorSlot.dataset.index);
if (decreasing && index >= newCurrent) { if (decreasing && index >= newCurrent) {
armorSlot.classList.remove('fa-shield'); 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; return inBounds.length === 1 ? inBounds[0] : null;
} }
static getTemplateShape({ shapeType, angle, range, direction, hasHole } = {}) { static getTemplateShape({ type, angle, range, direction } = {}) {
const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes; const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes;
/* Length calculation */ /* Length calculation */
@ -112,11 +112,11 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
const shapeData = { const shapeData = {
...canvas.mousePosition, ...canvas.mousePosition,
type: shapeType, type: type,
direction: direction ?? 0 direction: direction ?? 0
}; };
switch (shapeType) { switch (type) {
case rectangle.id: case rectangle.id:
shapeData.width = length; shapeData.width = length;
shapeData.height = length; shapeData.height = length;
@ -145,8 +145,7 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
y: 0, y: 0,
width: 1, width: 1,
height: 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; break;
} }

View file

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

View file

@ -451,15 +451,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
static migrateData(source) { static migrateData(source) {
if (source.damage?.parts && Array.isArray(source.damage.parts)) { if (source.damage?.parts && Array.isArray(source.damage.parts)) {
let hitPointsExists = source.damage.parts.some(x => x.applyTo === 'hitPoints');
source.damage.parts = source.damage.parts.reduce((acc, part) => { source.damage.parts = source.damage.parts.reduce((acc, part) => {
if (!part.applyTo && hitPointsExists) return acc;
if (!part.applyTo) {
hitPointsExists = true;
part.applyTo = 'hitPoints';
}
acc[part.applyTo] = part; acc[part.applyTo] = part;
return acc; return acc;
}, {}); }, {});

View file

@ -87,7 +87,6 @@ export default class DhpAdversary extends DhCreature {
parts: { parts: {
hitPoints: { hitPoints: {
type: ['physical'], type: ['physical'],
applyTo: 'hitPoints',
value: { value: {
multiplier: 'flat' multiplier: 'flat'
} }

View file

@ -107,7 +107,6 @@ export default class DhCharacter extends DhCreature {
parts: { parts: {
hitPoints: { hitPoints: {
type: ['physical'], type: ['physical'],
applyTo: 'hitPoints',
value: { value: {
custom: { custom: {
enabled: true, enabled: true,

View file

@ -102,7 +102,6 @@ export default class DhCompanion extends DhCreature {
parts: { parts: {
hitPoints: { hitPoints: {
type: ['physical'], type: ['physical'],
applyTo: 'hitPoints',
value: { value: {
dice: 'd6', dice: 'd6',
multiplier: 'prof' multiplier: 'prof'

View file

@ -28,39 +28,6 @@ export default class DhCountdowns extends foundry.abstract.DataModel {
for (const countdownKey of changedCountdowns) for (const countdownKey of changedCountdowns)
foundry.ui.countdowns.changedCountdownsForAnimation.add(countdownKey); foundry.ui.countdowns.changedCountdownsForAnimation.add(countdownKey);
} }
static migrateData(source) {
const migrateOldCountdowns = (data, type) => {
for (const key of Object.keys(data.countdowns)) {
const countdown = data.countdowns[key];
source.countdowns[key] = {
...countdown,
type: type,
ownership: Object.keys(countdown.ownership.players).reduce((acc, key) => {
acc[key] =
countdown.ownership.players[key].type === 1 ? 2 : countdown.ownership.players[key].type;
return acc;
}, {}),
progress: {
...countdown.progress,
type: countdown.progress.type.value
}
};
}
source[type] = null;
};
if (source.narrative) {
migrateOldCountdowns(source.narrative, 'narrative');
}
if (source.encounter) {
migrateOldCountdowns(source.encounter, 'encounter');
}
return super.migrateData(source);
}
} }
export class DhCountdown extends foundry.abstract.DataModel { export class DhCountdown extends foundry.abstract.DataModel {

View file

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

View file

@ -1,4 +1,4 @@
import { getWorldActor, itemAbleRollParse, triggerChatRollFx } from '../../../helpers/utils.mjs'; import { itemAbleRollParse, triggerChatRollFx } from '../../../helpers/utils.mjs';
import FormulaField from '../formulaField.mjs'; import FormulaField from '../formulaField.mjs';
const fields = foundry.data.fields; const fields = foundry.data.fields;
@ -42,7 +42,7 @@ export default class DHSummonField extends fields.ArrayField {
const count = roll.total; const count = roll.total;
if (!roll.isDeterministic) rolls.push(roll); if (!roll.isDeterministic) rolls.push(roll);
const actor = await getWorldActor(await foundry.utils.fromUuid(summon.actorUUID)); const actor = await DHSummonField.getWorldActor(await foundry.utils.fromUuid(summon.actorUUID));
/* Extending summon data in memory so it's available in actionField.toChat. Think it's harmless, but ugly. Could maybe find a better way. */ /* Extending summon data in memory so it's available in actionField.toChat. Think it's harmless, but ugly. Could maybe find a better way. */
summon.actor = actor.toObject(); summon.actor = actor.toObject();
@ -62,6 +62,19 @@ export default class DHSummonField extends fields.ArrayField {
DHSummonField.handleSummon(summonData, this.actor); DHSummonField.handleSummon(summonData, this.actor);
} }
/* Check for any available instances of the actor present in the world if we're missing artwork in the compendium. If none exists, create one. */
static async getWorldActor(baseActor) {
const dataType = game.system.api.data.actors[`Dh${baseActor.type.capitalize()}`];
if (baseActor.inCompendium && dataType && baseActor.img === dataType.DEFAULT_ICON) {
const worldActorCopy = game.actors.find(x => x.name === baseActor.name);
if (worldActorCopy) return worldActorCopy;
return await game.system.api.documents.DhpActor.create(baseActor.toObject());
}
return baseActor;
}
static async handleSummon(summonData, actionActor) { static async handleSummon(summonData, actionActor) {
await CONFIG.ux.TokenManager.createTokensWithPreview(summonData, { elevation: actionActor.token?.elevation }); await CONFIG.ux.TokenManager.createTokensWithPreview(summonData, { elevation: actionActor.token?.elevation });

View file

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

View file

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

View file

@ -889,26 +889,4 @@ export async function triggerChatRollFx(rolls, options = { whisper: false, blind
export function shouldUseHopeFearAutomation(options = { gmAsPlayer: true }) { export function shouldUseHopeFearAutomation(options = { gmAsPlayer: true }) {
const { hopeFear } = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); const { hopeFear } = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
return (!game.user.isGM || options.gmAsPlayer) ? hopeFear.players : hopeFear.gm; return (!game.user.isGM || options.gmAsPlayer) ? hopeFear.players : hopeFear.gm;
}
export async function getWorldActor(baseActor) {
if (baseActor.inCompendium) {
const worldActorCandidates = game.actors.filter(x =>
x._stats.compendiumSource === baseActor.uuid &&
x.prototypeToken.actorLink === baseActor.prototypeToken.actorLink
);
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({
...baseActorData,
_stats: {
...baseActorData._stats,
compendiumSource: baseActor.uuid
}
});
}
return baseActor;
} }

View file

@ -1,4 +1,5 @@
import { defaultRestOptions } from '../config/generalConfig.mjs'; import { defaultRestOptions } from '../config/generalConfig.mjs';
import { RefreshType, socketEvent } from './socket.mjs';
export async function runMigrations() { export async function runMigrations() {
let lastMigrationVersion = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion); let lastMigrationVersion = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion);
@ -152,26 +153,61 @@ export async function runMigrations() {
await pack.configure({ locked: true }); await pack.configure({ locked: true });
} }
/* Migrate old countdown structure */
const countdownSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
const getCountdowns = (data, type) => {
return Object.keys(data.countdowns).reduce((acc, key) => {
const countdown = data.countdowns[key];
acc[key] = {
...countdown,
type: type,
ownership: Object.keys(countdown.ownership.players).reduce((acc, key) => {
acc[key] =
countdown.ownership.players[key].type === 1 ? 2 : countdown.ownership.players[key].type;
return acc;
}, {}),
progress: {
...countdown.progress,
type: countdown.progress.type.value
}
};
return acc;
}, {});
};
await countdownSettings.updateSource({
countdowns: {
...getCountdowns(countdownSettings.narrative, 'narrative'),
...getCountdowns(countdownSettings.encounter, 'encounter')
}
});
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns, countdownSettings);
game.socket.emit(`system.${CONFIG.DH.id}`, {
action: socketEvent.Refresh,
data: { refreshType: RefreshType.Countdown }
});
Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.Countdown });
lastMigrationVersion = '1.2.0'; lastMigrationVersion = '1.2.0';
} }
if (foundry.utils.isNewerVersion('1.2.7', lastMigrationVersion)) { if (foundry.utils.isNewerVersion('1.2.7', lastMigrationVersion)) {
try { const tagTeam = game.settings.get(CONFIG.DH.id, 'TagTeamRoll');
const tagTeam = game.settings.get(CONFIG.DH.id, 'TagTeamRoll'); const initatorMissing = tagTeam.initiator && !game.actors.some(actor => actor.id === tagTeam.initiator);
const initatorMissing = tagTeam.initiator && !game.actors.some(actor => actor.id === tagTeam.initiator); const missingMembers = Object.keys(tagTeam.members).reduce((acc, id) => {
const missingMembers = Object.keys(tagTeam.members).reduce((acc, id) => { if (!game.actors.some(actor => actor.id === id)) {
if (!game.actors.some(actor => actor.id === id)) { acc[id] = _del;
acc[id] = _del; }
} return acc;
return acc; }, {});
}, {});
await tagTeam.updateSource({ await tagTeam.updateSource({
initiator: initatorMissing ? null : tagTeam.initiator, initiator: initatorMissing ? null : tagTeam.initiator,
members: missingMembers members: missingMembers
}); });
await game.settings.set(CONFIG.DH.id, 'TagTeamRoll', tagTeam); await game.settings.set(CONFIG.DH.id, 'TagTeamRoll', tagTeam);
} catch { }
lastMigrationVersion = '1.2.7'; lastMigrationVersion = '1.2.7';
} }
@ -267,8 +303,6 @@ export async function runMigrations() {
/* Migrate existing effects modifying armor, creating new Armor Effects instead */ /* Migrate existing effects modifying armor, creating new Armor Effects instead */
const migrateEffects = async entity => { const migrateEffects = async entity => {
if (!entity?.effects) return;
for (const effect of entity.effects) { for (const effect of entity.effects) {
if (effect.system.changes.every(x => x.key !== 'system.armorScore')) continue; if (effect.system.changes.every(x => x.key !== 'system.armorScore')) continue;

View file

@ -52,7 +52,7 @@
"includeBase": false "includeBase": false
}, },
"target": { "target": {
"type": "", "type": "hostile",
"amount": 1 "amount": 1
}, },
"effects": [ "effects": [
@ -63,23 +63,13 @@
], ],
"name": "Fire", "name": "Fire",
"img": "icons/magic/fire/barrier-wall-explosion-orange.webp", "img": "icons/magic/fire/barrier-wall-explosion-orange.webp",
"range": "", "range": "close"
"areas": [
{
"name": "Elemental Aura: Fire",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": []
}
]
}, },
"xDBLH5TWidvrYF7z": { "xDBLH5TWidvrYF7z": {
"type": "effect", "type": "effect",
"_id": "xDBLH5TWidvrYF7z", "_id": "xDBLH5TWidvrYF7z",
"systemPath": "actions", "systemPath": "actions",
"description": "<p>Your allies gain a +1 bonus to Strength.</p>", "description": "<p>When an adversary marks 1 or more Hit Points, they must also mark a Stress.</p>",
"chatDisplay": true, "chatDisplay": true,
"actionType": "action", "actionType": "action",
"cost": [], "cost": [],
@ -88,26 +78,19 @@
"max": "", "max": "",
"recovery": null "recovery": null
}, },
"effects": [], "effects": [
{
"_id": "WRuijfHxmUscAa69",
"onSave": false
}
],
"target": { "target": {
"type": "", "type": "friendly",
"amount": null "amount": null
}, },
"name": "Earth", "name": "Earth",
"img": "icons/magic/control/buff-strength-muscle-damage-red.webp", "img": "icons/magic/control/buff-strength-muscle-damage-red.webp",
"range": "", "range": "close"
"areas": [
{
"name": "Elemental Aura: Earth",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": true,
"effects": [
"yvpWNCNobg0LLjey"
]
}
]
}, },
"S4t5HlgxWlHwaBDw": { "S4t5HlgxWlHwaBDw": {
"type": "effect", "type": "effect",
@ -129,22 +112,12 @@
} }
], ],
"target": { "target": {
"type": "self", "type": "hostile",
"amount": null "amount": null
}, },
"name": "Water", "name": "Water",
"img": "icons/magic/water/vortex-water-whirlpool.webp", "img": "icons/magic/water/vortex-water-whirlpool.webp",
"range": "self", "range": "close"
"areas": [
{
"name": "Elemental Aura: Water",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": []
}
]
}, },
"hAsKFFewtTqd1gg9": { "hAsKFFewtTqd1gg9": {
"type": "attack", "type": "attack",
@ -165,10 +138,15 @@
"includeBase": false "includeBase": false
}, },
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [], "effects": [
{
"_id": "mJBA2QTyM9SM5NVS",
"onSave": false
}
],
"roll": { "roll": {
"type": "diceSet", "type": "diceSet",
"trait": null, "trait": null,
@ -191,19 +169,7 @@
}, },
"name": "Air", "name": "Air",
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp", "img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
"range": "self", "range": ""
"areas": [
{
"name": "Elemental Aura: Air",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": [
"vnKV5hsO4DVjURAl"
]
}
]
} }
}, },
"originItemType": null, "originItemType": null,
@ -215,6 +181,49 @@
} }
}, },
"effects": [ "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)", "name": "Elemental Aura (Water)",
"img": "icons/magic/water/vortex-water-whirlpool.webp", "img": "icons/magic/water/vortex-water-whirlpool.webp",
@ -228,15 +237,18 @@
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "range": "melee"
}, }
"changes": []
}, },
"changes": [],
"disabled": false, "disabled": false,
"duration": { "duration": {
"value": null, "startTime": null,
"units": "seconds", "combat": null,
"expiry": null, "seconds": null,
"expired": false "rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"description": "", "description": "",
"tint": "#ffffff", "tint": "#ffffff",
@ -246,9 +258,6 @@
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"start": null,
"showIcon": 1,
"folder": null,
"_key": "!items.effects!2JH9NaOh69yN80Gw.H7W52ps5d3UGmaFr" "_key": "!items.effects!2JH9NaOh69yN80Gw.H7W52ps5d3UGmaFr"
}, },
{ {
@ -264,15 +273,18 @@
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "range": "melee"
}, }
"changes": []
}, },
"changes": [],
"disabled": false, "disabled": false,
"duration": { "duration": {
"value": null, "startTime": null,
"units": "seconds", "combat": null,
"expiry": null, "seconds": null,
"expired": false "rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"description": "", "description": "",
"tint": "#ffffff", "tint": "#ffffff",
@ -282,120 +294,43 @@
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"start": null,
"showIcon": 1,
"folder": null,
"_key": "!items.effects!2JH9NaOh69yN80Gw.WX5AMEpmUAutB9Hm" "_key": "!items.effects!2JH9NaOh69yN80Gw.WX5AMEpmUAutB9Hm"
}, },
{ {
"name": "Elemental Aura: Earth", "name": "Elemental Aura (Air)",
"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,
"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
]
},
"_id": "yvpWNCNobg0LLjey",
"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.yvpWNCNobg0LLjey"
},
{
"name": "Elemental Aura: Air",
"disabled": false,
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp", "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>", "origin": "Compendium.daggerheart.subclasses.Item.2JH9NaOh69yN80Gw",
"transfer": false, "transfer": false,
"statuses": [], "_id": "mJBA2QTyM9SM5NVS",
"type": "base",
"system": { "system": {
"rangeDependence": { "rangeDependence": {
"enabled": false, "enabled": false,
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "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
}, },
"changes": [],
"disabled": false,
"duration": { "duration": {
"value": null, "startTime": null,
"units": "seconds", "combat": null,
"expiry": null, "seconds": null,
"expired": false "rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"origin": null, "description": "",
"tint": "#ffffff", "tint": "#ffffff",
"showIcon": 1, "statuses": [],
"folder": null,
"sort": 0, "sort": 0,
"flags": {}, "flags": {},
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"_key": "!items.effects!2JH9NaOh69yN80Gw.vnKV5hsO4DVjURAl" "_key": "!items.effects!2JH9NaOh69yN80Gw.mJBA2QTyM9SM5NVS"
} }
], ],
"sort": 100000, "sort": 100000,

View file

@ -261,15 +261,14 @@
fieldset { fieldset {
align-items: center; align-items: center;
margin: 0;
margin-top: 5px;
border-radius: 6px; border-radius: 6px;
border-color: @color-fieldset-border; border-color: @color-fieldset-border;
margin-top: 5px;
&.glassy { &.glassy {
background-color: light-dark(@dark-blue-10, @golden-10); background-color: light-dark(@dark-blue-10, @golden-10);
border: none;
padding-inline: 10px; padding-inline: 10px;
border: none;
legend { legend {
padding: 2px 12px; padding: 2px 12px;
@ -386,10 +385,6 @@
justify-content: space-between; justify-content: space-between;
} }
label {
white-space: nowrap;
}
.btn { .btn {
padding-top: 15px; padding-top: 15px;
} }
@ -405,13 +400,6 @@
> .checkbox { > .checkbox {
align-self: end; align-self: end;
} }
.auto-sized {
width: auto;
display: flex;
flex-direction: column;
align-items: center;
}
} }
.form-group { .form-group {
@ -555,7 +543,7 @@
font-style: italic; font-style: italic;
font-family: @font-body; font-family: @font-body;
margin-top: 4px; margin-top: 4px;
color: @color-text-subtle; color: light-dark(#14142599, #efe6d850);
font-size: var(--font-size-12); font-size: var(--font-size-12);
padding-left: 3px; padding-left: 3px;
} }

View file

@ -12,9 +12,6 @@
} }
.daggerheart.dh-style { .daggerheart.dh-style {
/** Not an actual scrollbar width (it can't be configured on all browsers) but actually a compensation value for scrollbar gutter purposes */
--scrollbar-width: 10px;
* { * {
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: light-dark(@dark-blue, @golden) transparent; scrollbar-color: light-dark(@dark-blue, @golden) transparent;

View file

@ -49,7 +49,8 @@
// Make hover extend out of bounds. // Make hover extend out of bounds.
// Because of this extra spacing, the scroll container parent needs some padding // Because of this extra spacing, the scroll container parent needs some padding
padding: 2px; padding: 2px;
margin: -2px -2px 0 -2px; margin: -2px;
margin-bottom: 0;
} }
&:hover { &:hover {

View file

@ -1,6 +1,5 @@
@import '../utils/colors.less'; @import '../utils/colors.less';
@import '../utils/fonts.less'; @import '../utils/fonts.less';
@import '../utils/mixin.less';
.application.daggerheart { .application.daggerheart {
prose-mirror { prose-mirror {
@ -13,7 +12,6 @@
background-color: transparent; background-color: transparent;
} }
.editor-content { .editor-content {
.with-scroll-shadows();
h1 { h1 {
font-size: var(--font-size-32); font-size: var(--font-size-32);
} }
@ -44,7 +42,7 @@
ul { ul {
list-style: disc; list-style: disc;
} }
} }
// Fixes centering and makes it not render over scrollbar // Fixes centering and makes it not render over scrollbar
&:hover button.toggle:enabled { &:hover button.toggle:enabled {
display: flex; display: flex;

View file

@ -9,107 +9,110 @@
} }
}); });
/** 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 { .status-bar {
display: flex; display: flex;
flex-direction: column; justify-content: center;
align-items: center;
position: relative; position: relative;
width: 120px;
height: 40px;
.status-value { .status-label {
position: relative; 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; display: flex;
flex-direction: column;
padding: 0 5px; padding: 0 5px;
font-size: 1.5rem; font-size: 1.5rem;
align-items: center; align-items: center;
width: 100px; width: 140px;
height: 40px; height: 40px;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
z-index: 2; z-index: 2;
color: @beige; color: @beige;
> * { .slot-bar {
display: flex;
flex-wrap: wrap;
gap: 5px;
padding: 5px;
border: 1px solid @color-border;
border-radius: 6px;
z-index: 1; 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;
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'] { input[type='number'] {
background: transparent; background: transparent;
@ -143,11 +146,11 @@
.progress-bar { .progress-bar {
position: absolute; position: absolute;
appearance: none; appearance: none;
width: 100%; width: 100px;
height: 100%; height: 40px;
border: 1px solid @color-border; border: 1px solid @color-border;
border-radius: 6px; border-radius: 6px;
z-index: 0; z-index: 1;
background: @dark-blue; background: @dark-blue;
&::-webkit-progress-bar { &::-webkit-progress-bar {
@ -172,29 +175,4 @@
border-radius: 6px; 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

@ -18,8 +18,6 @@
}); });
.application.sheet.daggerheart.actor.dh-style { .application.sheet.daggerheart.actor.dh-style {
--side-indent: 16px;
.portrait img, .portrait img,
.profile { .profile {
width: 100%; width: 100%;
@ -44,38 +42,12 @@
pointer-events: none; pointer-events: none;
} }
.tab-navigation {
margin-bottom: 0;
}
.tab {
padding: 0;
.search-section {
padding: var(--spacer-16) 12px var(--spacer-8) 10px;
}
.scroll-container {
scrollbar-gutter: stable;
overflow-y: auto;
.with-scroll-shadows();
padding: var(--spacer-16) calc(var(--side-indent) - var(--scrollbar-width)) 4px var(--side-indent);
> fieldset:first-child {
margin-top: 0;
}
}
.scroll-container:not(:first-child) {
padding-top: var(--spacer-8); // nested have less top padding
}
}
.tab.inventory { .tab.inventory {
.gold-section { .gold-section {
display: grid; display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-columns: 1fr 1fr 1fr 1fr;
gap: 10px; gap: 10px;
padding: var(--spacer-8) var(--side-indent) var(--spacer-12) var(--side-indent); padding: 12px 12px 0 10px;
.input { .input {
color: light-dark(@dark, @beige); color: light-dark(@dark, @beige);
@ -83,37 +55,6 @@
} }
} }
.tab.notes.active {
padding: 0;
margin: 0;
margin-top: -10px; // will be removed once tab-navigation bottom margin is removed on all actor sheets
scrollbar-gutter: unset;
// Add padding around top level level prosemirrors used for note tabs
> prose-mirror {
@right-padding: calc(16px - var(--scrollbar-width));
.editor-content {
scrollbar-gutter: stable;
padding-right: @right-padding;
}
&.inactive {
button.toggle {
top: 16px;
}
.editor-content {
padding: 16px @right-padding 4px 16px;
}
}
&.active {
padding: 8px 0 4px 16px;
}
}
.artist-attribution {
padding-left: 16px;
}
}
.search-section { .search-section {
display: flex; display: flex;
gap: 10px; gap: 10px;
@ -123,6 +64,7 @@
position: relative; position: relative;
color: light-dark(@dark-blue-50, @beige-50); color: light-dark(@dark-blue-50, @beige-50);
width: 100%; width: 100%;
padding-top: 5px;
input { input {
border-radius: 50px; border-radius: 50px;

View file

@ -3,7 +3,7 @@
@import '../../../utils/mixin.less'; @import '../../../utils/mixin.less';
.application.sheet.daggerheart.actor.dh-style.adversary { .application.sheet.daggerheart.actor.dh-style.adversary {
.tab.features { .tab.features.active {
.feature-section { .feature-section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View file

@ -7,7 +7,7 @@
width: 100%; width: 100%;
> *:not(line-div, .tab-navigation) { > *:not(line-div, .tab-navigation) {
padding-left: var(--side-indent); padding-left: var(--left-indent);
padding-right: 15px; padding-right: 15px;
} }
@ -75,6 +75,7 @@
.tab-navigation { .tab-navigation {
margin-top: 0; margin-top: 0;
margin-bottom: 0;
button[data-action="openSettings"] { button[data-action="openSettings"] {
margin-right: 12px; margin-right: 12px;
} }

View file

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

View file

@ -2,7 +2,8 @@
@import '../../../utils/fonts.less'; @import '../../../utils/fonts.less';
.application.sheet.daggerheart.actor.dh-style.adversary { .application.sheet.daggerheart.actor.dh-style.adversary {
--sidebar-width: 260px; --left-indent: 16px;
--sidebar-width: 265px;
.window-content { .window-content {
display: grid; display: grid;
@ -34,7 +35,29 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin: 0 0 10px 0; margin: 0 0 10px 0;
padding: 0;
position: relative; position: relative;
.scroll-container,
> prose-mirror.inactive .editor-content {
scrollbar-gutter: stable;
overflow-y: auto;
padding: var(--spacer-16) calc(var(--left-indent) - 6px) 4px var(--left-indent);
.with-scroll-shadows();
> fieldset {
margin-left: -10px; // align content with indent
margin-right: -10px;
&:first-child {
margin-top: 0;
}
}
}
> prose-mirror.inactive button.toggle {
top: var(--spacer-16);
}
&:has(> prose-mirror.active) {
padding: var(--spacer-12) 0 0 var(--left-indent);
}
} }
} }
} }

View file

@ -63,7 +63,7 @@
.threshold-section { .threshold-section {
position: relative; position: relative;
display: flex; display: flex;
gap: 7px; gap: 8px;
background-color: light-dark(transparent, @dark-blue); background-color: light-dark(transparent, @dark-blue);
color: @color-text-emphatic; color: @color-text-emphatic;
padding: 5px 10px; padding: 5px 10px;
@ -74,7 +74,7 @@
height: 30px; height: 30px;
h4 { h4 {
font-size: var(--font-size-14); font-size: var(--font-size-13);
font-weight: bold; font-weight: bold;
text-transform: uppercase; text-transform: uppercase;
color: @color-text-emphatic; color: @color-text-emphatic;
@ -106,7 +106,7 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
top: -20px; top: -20px;
gap: 10px; gap: 16px;
margin-bottom: -16px; margin-bottom: -16px;
&.pip-display { &.pip-display {
@ -120,6 +120,105 @@
.resources-section { .resources-section {
display: flex; display: flex;
justify-content: space-evenly; 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 { .status-section {
@ -157,7 +256,7 @@
.status-label { .status-label {
padding: 2px 10px; padding: 2px 10px;
width: 100%; width: 100%;
border-radius: 0 0 3px 3px; border-radius: 3px;
background: light-dark(@dark-blue, @golden); background: light-dark(@dark-blue, @golden);
h4 { h4 {
@ -185,7 +284,8 @@
.shortcut-items-section { .shortcut-items-section {
overflow-y: hidden; overflow-y: hidden;
padding: 10px 0; padding-top: 10px;
padding-bottom: 20px;
flex: 1; flex: 1;
scrollbar-gutter: stable; scrollbar-gutter: stable;
.with-scroll-shadows(); .with-scroll-shadows();
@ -214,6 +314,8 @@
} }
.experience-section { .experience-section {
margin-bottom: 20px;
.title { .title {
display: flex; display: flex;
gap: 15px; gap: 15px;
@ -230,8 +332,8 @@
gap: 5px; gap: 5px;
width: 100%; width: 100%;
margin-top: 10px; margin-top: 10px;
align-items: stretch;
padding: 0 4px 0 12px; padding: 0 4px 0 12px;
align-items: stretch;
.experience-row { .experience-row {
display: flex; display: flex;
@ -269,7 +371,10 @@
.reaction-section { .reaction-section {
display: flex; display: flex;
margin: 10px; padding: 0 10px;
margin-top: 16px;
margin-bottom: 10px;
width: 100%;
button { button {
height: 40px; height: 40px;

View file

@ -8,11 +8,18 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
flex: 1; height: 100%;
overflow-y: auto;
padding-top: 8px;
padding-bottom: 4px;
height: 100%;
scrollbar-gutter: stable;
.with-scroll-shadows();
} }
.characteristics-section { .characteristics-section {
gap: 20px; gap: 20px;
padding: 0 10px;
} }
.biography-section { .biography-section {

View file

@ -8,6 +8,9 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
overflow-y: auto;
padding-bottom: 20px;
.with-scroll-shadows();
} }
} }
} }

View file

@ -8,6 +8,10 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
overflow-y: auto;
padding-bottom: 20px;
scrollbar-gutter: stable;
.with-scroll-shadows();
} }
} }
} }

View file

@ -19,19 +19,16 @@
.application.sheet.daggerheart.actor.dh-style.character { .application.sheet.daggerheart.actor.dh-style.character {
.character-header-sheet { .character-header-sheet {
padding: 0 15px;
padding-top: var(--header-height); padding-top: var(--header-height);
width: 100%; width: 100%;
> *:not(line-div, .tab-navigation) {
margin-left: var(--side-indent);
margin-right: 15px;
}
.name-row { .name-row {
display: flex; display: flex;
gap: 6px; gap: 6px;
align-items: start; align-items: start;
justify-content: space-between; justify-content: space-between;
padding: 0;
padding-top: 5px; padding-top: 5px;
flex: 1; flex: 1;
@ -103,8 +100,8 @@
.character-details { .character-details {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-top: 5px; padding: 5px 0;
margin-bottom: 10px; margin-bottom: 8px;
font-size: var(--font-size-12); font-size: var(--font-size-12);
color: @color-text-emphatic; color: @color-text-emphatic;
@ -133,6 +130,7 @@
.character-row { .character-row {
display: flex; display: flex;
align-items: center; align-items: center;
padding: 0;
margin-bottom: 12px; margin-bottom: 12px;
.resource-section { .resource-section {
@ -220,6 +218,7 @@
.character-traits { .character-traits {
display: flex; display: flex;
padding: 0;
margin-bottom: 15px; margin-bottom: 15px;
justify-content: space-between; justify-content: space-between;
max-width: 38.5rem; max-width: 38.5rem;
@ -326,9 +325,5 @@
} }
} }
} }
.tab-navigation button[data-action="openSettings"] {
margin-right: 12px;
}
} }
} }

View file

@ -4,10 +4,19 @@
.application.sheet.daggerheart.actor.dh-style.character { .application.sheet.daggerheart.actor.dh-style.character {
.tab.inventory { .tab.inventory {
padding-right: 0;
.search-section {
padding-right: 14px;
}
.items-section { .items-section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
overflow-y: auto;
scrollbar-gutter: stable;
margin-top: 20px;
padding-bottom: 4px;
.with-scroll-shadows();
} }
} }
} }

View file

@ -5,6 +5,7 @@
.application.sheet.daggerheart.actor.dh-style.character { .application.sheet.daggerheart.actor.dh-style.character {
.tab.loadout { .tab.loadout {
.search-section { .search-section {
padding-right: 14px;
.btn-toggle-view { .btn-toggle-view {
background: light-dark(@dark-blue-10, @dark-blue); background: light-dark(@dark-blue-10, @dark-blue);
border: 1px solid @color-border; border: 1px solid @color-border;
@ -50,6 +51,12 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
height: 100%;
overflow-y: auto;
scrollbar-gutter: stable;
margin-top: 20px;
padding-bottom: 4px;
.with-scroll-shadows();
} }
} }
} }

View file

@ -2,8 +2,6 @@
@import '../../../utils/fonts.less'; @import '../../../utils/fonts.less';
.application.sheet.daggerheart.actor.dh-style.character { .application.sheet.daggerheart.actor.dh-style.character {
--side-indent: 16px;
.window-content { .window-content {
display: grid; display: grid;
grid-template-columns: 275px 1fr; grid-template-columns: 275px 1fr;
@ -37,9 +35,6 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
overflow: hidden; overflow: hidden;
margin: 0 0 10px 0;
padding: 0;
position: relative;
} }
} }
} }

View file

@ -89,13 +89,113 @@
.resources-section { .resources-section {
justify-content: space-around; justify-content: space-around;
margin: 8px 2px 0 2px; margin: 8px 2px 8px 2px;
} }
} }
.resources-section { .resources-section {
display: flex; display: flex;
justify-content: space-evenly; 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 { .status-section {
@ -145,21 +245,21 @@
.status-bar.armor-slots { .status-bar.armor-slots {
display: flex; display: flex;
justify-content: center;
position: relative;
width: 95px; width: 95px;
height: 30px;
white-space: nowrap; white-space: nowrap;
.status-label {
height: 30px;
}
.status-label { .status-label {
padding: 2px 2px; padding: 2px 2px;
position: relative; position: relative;
top: 30px;
height: 22px; height: 22px;
width: 95px; width: 95px;
border-radius: 3px; border-radius: 3px;
background: light-dark(@dark-blue, @golden); background: light-dark(@dark-blue, @golden);
clip-path: none;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -191,16 +291,40 @@
} }
} }
.slot-value { .slot-value {
position: absolute;
display: flex;
padding: 0 5px;
font-size: 1.2rem; font-size: 1.2rem;
align-items: center;
width: 80px; width: 80px;
height: 30px; height: 30px;
justify-content: center;
text-align: center;
z-index: 2;
color: light-dark(@dark-blue, @beige); color: light-dark(@dark-blue, @beige);
flex-direction: column; flex-direction: column;
.slot-bar { .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; background: @dark-blue;
justify-content: center; justify-content: center;
border-bottom: none; 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);
}
}
} }
.slot-label { .slot-label {
display: flex; display: flex;
@ -240,21 +364,41 @@
} }
} }
.status-value { .status-value {
position: absolute;
display: flex;
padding: 0 6px; padding: 0 6px;
font-size: 1.2rem; font-size: 1.2rem;
align-items: center;
width: 80px; width: 80px;
height: 30px; height: 30px;
justify-content: center; justify-content: center;
text-align: center;
z-index: 2;
color: light-dark(@dark-blue, @beige); color: light-dark(@dark-blue, @beige);
border: 1px solid @color-border;
border-bottom: none;
border-radius: 6px 6px 0 0;
input[type='number'] { input[type='number'] {
background: transparent;
font-size: 1.2rem; font-size: 1.2rem;
width: 30px; width: 30px;
height: 20px; height: 20px;
text-align: center;
border: none;
outline: 2px solid transparent;
color: light-dark(@dark-blue, @beige); color: light-dark(@dark-blue, @beige);
&.bar-input { &.bar-input {
padding: 0;
color: light-dark(@dark-blue, @beige); color: light-dark(@dark-blue, @beige);
backdrop-filter: none;
background: transparent;
&:hover,
&:focus {
background: @semi-transparent-dark-blue;
backdrop-filter: blur(9.5px);
}
} }
} }
@ -263,9 +407,32 @@
} }
} }
.progress-bar { .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); background: light-dark(transparent, @dark-blue);
border-bottom: none; border-bottom: none;
border-radius: 6px 6px 0 0; 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

@ -4,10 +4,15 @@
.application.sheet.daggerheart.actor.dh-style.environment { .application.sheet.daggerheart.actor.dh-style.environment {
.tab.features { .tab.features {
position: relative;
.feature-section { .feature-section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
overflow-y: auto;
padding: 4px 8px;
scrollbar-gutter: stable;
.with-scroll-shadows();
} }
} }
} }

View file

@ -138,11 +138,10 @@
} }
.environment-navigation { .environment-navigation {
padding-right: 20px; padding: 0 20px;
.tab-navigation { .tab-navigation {
margin-top: 0; margin-top: 0;
margin-bottom: 0;
} }
} }
} }

View file

@ -2,3 +2,4 @@
@import './features.less'; @import './features.less';
@import './header.less'; @import './header.less';
@import './potentialAdversaries.less'; @import './potentialAdversaries.less';
@import './notes.less';

View file

@ -0,0 +1,11 @@
@import '../../../utils/mixin.less';
.application.sheet.daggerheart.actor.dh-style.environment {
.tab.notes {
padding: 6px 0 4px 15px;
.editor-content {
scrollbar-gutter: stable;
.with-scroll-shadows();
}
}
}

View file

@ -7,6 +7,10 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
overflow-y: auto;
padding: 0 4px 4px 4px;
scrollbar-gutter: stable;
.with-scroll-shadows();
} }
} }
} }

View file

@ -16,6 +16,8 @@
.tab { .tab {
flex: 1; flex: 1;
overflow-y: auto; overflow-y: auto;
padding-right: 0;
margin-right: 2px;
&.active { &.active {
overflow: hidden; overflow: hidden;

View file

@ -2,3 +2,4 @@
@import './header.less'; @import './header.less';
@import './party-members.less'; @import './party-members.less';
@import './inventory.less'; @import './inventory.less';
@import './notes.less';

View file

@ -4,10 +4,20 @@
.application.sheet.daggerheart.actor.dh-style.party { .application.sheet.daggerheart.actor.dh-style.party {
.tab.inventory { .tab.inventory {
padding-right: 0;
.search-section {
padding-right: 14px;
}
.items-section { .items-section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
overflow-y: auto;
scrollbar-gutter: stable;
margin-top: 20px;
padding-bottom: 4px;
.with-scroll-shadows();
} }
} }
} }

View file

@ -0,0 +1,12 @@
@import '../../../utils/mixin.less';
.application.sheet.daggerheart.actor.dh-style.party {
.tab.notes {
padding: 16px 0 4px 15px;
.editor-content {
scrollbar-gutter: stable;
padding-left: 8px;
.with-scroll-shadows();
}
}
}

View file

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

@ -17,10 +17,37 @@
}); });
.application.sheet.daggerheart.actor.dh-style.party { .application.sheet.daggerheart.actor.dh-style.party {
.tab.active { .tab {
overflow: auto;
display: flex;
flex-direction: column;
flex: 1; flex: 1;
overflow-y: auto;
scrollbar-gutter: stable;
margin-right: 2px;
padding-right: 8px;
&.active {
overflow: auto;
display: flex;
flex-direction: column;
}
.actions-section {
display: flex;
align-items: center;
justify-content: center;
padding: 10px;
margin-bottom: 10px;
gap: 20px;
background-color: light-dark(@dark-blue-10, @golden-10);
button {
span {
font-size: 12px;
}
}
.active-action {
animation: glow 0.75s infinite alternate;
}
}
} }
} }

View file

@ -174,10 +174,10 @@
--fade-start: 0; --fade-start: 0;
} }
10%, 100% { 10%, 100% {
--fade-start: 14px; --fade-start: 12px;
} }
0%, 90% { 0%, 90% {
--fade-end: 14px; --fade-end: 12px;
} }
100% { 100% {
--fade-end: 0; --fade-end: 0;

View file

@ -2,7 +2,7 @@
"id": "daggerheart", "id": "daggerheart",
"title": "Daggerheart", "title": "Daggerheart",
"description": "An unofficial implementation of the Daggerheart system", "description": "An unofficial implementation of the Daggerheart system",
"version": "2.4.2", "version": "2.4.1",
"compatibility": { "compatibility": {
"minimum": "14.364", "minimum": "14.364",
"verified": "14.364", "verified": "14.364",
@ -10,7 +10,7 @@
}, },
"url": "https://github.com/Foundryborne/daggerheart", "url": "https://github.com/Foundryborne/daggerheart",
"manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/v14/system.json", "manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/v14/system.json",
"download": "https://github.com/Foundryborne/daggerheart/releases/download/2.4.2/system.zip", "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.4.1/system.zip",
"authors": [ "authors": [
{ {
"name": "WBHarry" "name": "WBHarry"

View file

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

View file

@ -1,12 +1,10 @@
<section <section class='tab {{tabs.features.cssClass}} {{tabs.features.id}}' data-tab='{{tabs.features.id}}'
class="tab {{tabs.features.cssClass}} {{tabs.features.id}}" data-group='{{tabs.features.group}}'>
data-tab="{{tabs.features.id}}"
data-group="{{tabs.features.group}}">
<div class="feature-section scroll-container"> <div class="feature-section scroll-container">
{{#each @root.features as |item|}} {{#each @root.features as |item|}}
{{> "daggerheart.inventory-item" {{> 'daggerheart.inventory-item'
item=item item=item
type="feature" type='feature'
actorType=@root.document.type actorType=@root.document.type
hideContextMenu=true hideContextMenu=true
hideModifyControls=true hideModifyControls=true

View file

@ -1,9 +1,10 @@
<section <section
class="tab {{tabs.notes.cssClass}} {{tabs.notes.id}}" class='tab {{tabs.notes.cssClass}} {{tabs.notes.id}}'
data-tab="{{tabs.notes.id}}" data-tab='{{tabs.notes.id}}'
data-group="{{tabs.notes.group}}" data-group='{{tabs.notes.group}}'
> >
{{formInput notes.field value=notes.value enriched=notes.enriched toggled=true}} {{formInput notes.field value=notes.value enriched=notes.enriched class="aaa" toggled=true}}
{{#if (and showAttribution document.system.attribution.artist)}} {{#if (and showAttribution document.system.attribution.artist)}}
<label class="artist-attribution">{{localize "DAGGERHEART.GENERAL.artistAttribution" artist=document.system.attribution.artist}}</label> <label class="artist-attribution">{{localize "DAGGERHEART.GENERAL.artistAttribution" artist=document.system.attribution.artist}}</label>
{{/if}} {{/if}}

View file

@ -1,34 +1,34 @@
<section <section
class="tab {{tabs.biography.cssClass}} {{tabs.biography.id}}" class='tab {{tabs.biography.cssClass}} {{tabs.biography.id}}'
data-tab="{{tabs.biography.id}}" data-tab='{{tabs.biography.id}}'
data-group='{{tabs.biography.group}}' data-group='{{tabs.biography.group}}'
> >
<div class="items-section scroll-container"> <div class="items-section">
<div class="characteristics-section flexrow"> <div class="characteristics-section flexrow">
<div class="input"> <div class="input">
<span>{{localize 'DAGGERHEART.ACTORS.Character.pronouns'}}</span> <span>{{localize 'DAGGERHEART.ACTORS.Character.pronouns'}}</span>
{{formInput systemFields.biography.fields.characteristics.fields.pronouns value=source.system.biography.characteristics.pronouns enriched=source.system.biography.characteristics.pronouns localize=true toggled=true}} {{formInput systemFields.biography.fields.characteristics.fields.pronouns value=source.system.biography.characteristics.pronouns enriched=source.system.biography.characteristics.pronouns localize=true toggled=true}}
</div> </div>
<div class="input"> <div class="input">
<span>{{localize 'DAGGERHEART.ACTORS.Character.age'}}</span> <span>{{localize 'DAGGERHEART.ACTORS.Character.age'}}</span>
{{formInput systemFields.biography.fields.characteristics.fields.age value=source.system.biography.characteristics.age enriched=source.system.biography.characteristics.age localize=true toggled=true}} {{formInput systemFields.biography.fields.characteristics.fields.age value=source.system.biography.characteristics.age enriched=source.system.biography.characteristics.age localize=true toggled=true}}
</div> </div>
<div class="input"> <div class="input">
<span>{{localize 'DAGGERHEART.ACTORS.Character.faith'}}</span> <span>{{localize 'DAGGERHEART.ACTORS.Character.faith'}}</span>
{{formInput systemFields.biography.fields.characteristics.fields.faith value=source.system.biography.characteristics.faith enriched=source.system.biography.characteristics.faith localize=true toggled=true}} {{formInput systemFields.biography.fields.characteristics.fields.faith value=source.system.biography.characteristics.faith enriched=source.system.biography.characteristics.faith localize=true toggled=true}}
</div> </div>
</div> </div>
<fieldset class="glassy biography-section"> <fieldset class="glassy biography-section">
<legend>{{localize 'DAGGERHEART.ACTORS.Character.story.backgroundTitle'}}</legend> <legend>{{localize 'DAGGERHEART.ACTORS.Character.story.backgroundTitle'}}</legend>
{{formInput background.field value=background.value enriched=background.enriched toggled=true}} {{formInput background.field value=background.value enriched=background.enriched toggled=true}}
</fieldset> </fieldset>
<fieldset class="glassy biography-section"> <fieldset class="glassy biography-section">
<legend>{{localize 'DAGGERHEART.ACTORS.Character.story.connectionsTitle'}}</legend> <legend>{{localize 'DAGGERHEART.ACTORS.Character.story.connectionsTitle'}}</legend>
{{formInput connections.field value=connections.value enriched=connections.enriched toggled=true}} {{formInput connections.field value=connections.value enriched=connections.enriched toggled=true}}
</fieldset> </fieldset>
</div> </div>
</section> </section>

View file

@ -1,24 +1,24 @@
<section class='tab {{tabs.effects.cssClass}} {{tabs.effects.id}}' data-tab='{{tabs.effects.id}}' <section class='tab {{tabs.effects.cssClass}} {{tabs.effects.id}}' data-tab='{{tabs.effects.id}}'
data-group='{{tabs.effects.group}}'> data-group='{{tabs.effects.group}}'>
<div class="effects-sections scroll-container"> <div class="effects-sections">
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='DAGGERHEART.GENERAL.activeEffects' title='DAGGERHEART.GENERAL.activeEffects'
type='effect' type='effect'
isGlassy=true isGlassy=true
collection=effects.actives collection=effects.actives
canCreate=@root.editable canCreate=@root.editable
hideResources=true hideResources=true
}} }}
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='DAGGERHEART.GENERAL.inactiveEffects' title='DAGGERHEART.GENERAL.inactiveEffects'
type='effect' type='effect'
isGlassy=true isGlassy=true
collection=effects.inactives collection=effects.inactives
canCreate=@root.editable canCreate=@root.editable
hideResources=true hideResources=true
disabled=true disabled=true
}} }}
</div> </div>
</section> </section>

View file

@ -1,28 +1,26 @@
<section <section class='tab {{tabs.features.cssClass}} {{tabs.features.id}}' data-tab='{{tabs.features.id}}'
class="tab {{tabs.features.cssClass}} {{tabs.features.id}}" data-group='{{tabs.features.group}}'>
data-tab="{{tabs.features.id}}" <div class="features-sections">
data-group="{{tabs.features.group}}"> {{#each document.system.sheetLists as |category|}}
<div class="features-section scroll-container"> {{#if (eq category.type 'feature' )}}
{{#each document.system.sheetLists as |category|}} {{> 'daggerheart.inventory-items'
{{#if (eq category.type "feature" )}} title=category.title
{{> "daggerheart.inventory-items" type='feature'
title=category.title actorType='character'
type="feature" collection=category.values
actorType="character" canCreate=@root.editable
collection=category.values showActions=@root.editable
canCreate=@root.editable }}
showActions=@root.editable {{else if category.values}}
}} {{> 'daggerheart.inventory-items'
{{else if category.values}} title=category.title
{{> "daggerheart.inventory-items" type='feature'
title=category.title actorType='character'
type="feature" collection=category.values
actorType="character" canCreate=false
collection=category.values showActions=@root.editable
canCreate=false }}
showActions=@root.editable {{/if}}
}} {{/each}}
{{/if}} </div>
{{/each}}
</div>
</section> </section>

View file

@ -1,163 +1,165 @@
<header class="character-header-sheet"> <header class="character-header-sheet">
<line-div></line-div> <line-div></line-div>
<div class="name-row"> <div class="name-row">
<h1 <h1
class="actor-name input" class="actor-name input"
contenteditable="plaintext-only" contenteditable="plaintext-only"
data-property="name" data-property="name"
placeholder="{{localize "DAGGERHEART.GENERAL.actorName"}}" placeholder="{{localize "DAGGERHEART.GENERAL.actorName"}}"
autocomplete="off" autocomplete="off"
spellcheck="false" spellcheck="false"
>{{source.name}}</h1> >{{source.name}}</h1>
<div class='level-div'> <div class='level-div'>
<h3 class='label'> <h3 class='label'>
{{#if @root.editable}} {{#if @root.editable}}
{{#if document.system.needsCharacterSetup}} {{#if document.system.needsCharacterSetup}}
<button <button
type="button" type="button"
class="level-button glow" class="level-button glow"
data-action="levelManagement" data-action="levelManagement"
> >
{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.buttonTitle"}} {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.buttonTitle"}}
</button> </button>
{{else if document.system.levelData.canLevelUp}} {{else if document.system.levelData.canLevelUp}}
<button <button
type="button" type="button"
class="level-button glow" data-tooltip="{{localize "DAGGERHEART.ACTORS.Character.levelUp"}}" class="level-button glow" data-tooltip="{{localize "DAGGERHEART.ACTORS.Character.levelUp"}}"
data-action="levelManagement" data-action="levelManagement"
> >
<i class="fa-solid fa-angles-up"></i> <i class="fa-solid fa-angles-up"></i>
</button> </button>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#unless document.system.needsCharacterSetup}} {{#unless document.system.needsCharacterSetup}}
{{localize 'DAGGERHEART.GENERAL.level'}} {{localize 'DAGGERHEART.GENERAL.level'}}
<input type="text" data-dtype="Number" class="level-value" value={{#if document.system.needsCharacterSetup}}0{{else}}{{document.system.levelData.level.changed}}{{/if}} {{#if document.system.needsCharacterSetup}}disabled{{/if}} /> <input type="text" data-dtype="Number" class="level-value" value={{#if document.system.needsCharacterSetup}}0{{else}}{{document.system.levelData.level.changed}}{{/if}} {{#if document.system.needsCharacterSetup}}disabled{{/if}} />
{{/unless}} {{/unless}}
</h3> </h3>
</div> </div>
</div> </div>
<div class="character-details"> <div class="character-details">
<div> <div>
{{#if document.system.class.value}} {{#if document.system.class.value}}
<span data-action="editDoc" data-item-uuid="{{document.system.class.value.uuid}}">{{document.system.class.value.name}}</span> <span data-action="editDoc" data-item-uuid="{{document.system.class.value.uuid}}">{{document.system.class.value.name}}</span>
{{else}} {{else}}
<span class="missing-header-feature" data-action="openPack" data-key="classes">{{localize 'TYPES.Item.class'}}</span> <span class="missing-header-feature" data-action="openPack" data-key="classes">{{localize 'TYPES.Item.class'}}</span>
{{/if}} {{/if}}
<span class="dot">•</span> <span class="dot">•</span>
{{#if document.system.class.subclass}} {{#if document.system.class.subclass}}
<span data-action="editDoc" data-item-uuid="{{document.system.class.subclass.uuid}}">{{document.system.class.subclass.name}}</span> <span data-action="editDoc" data-item-uuid="{{document.system.class.subclass.uuid}}">{{document.system.class.subclass.name}}</span>
{{else}} {{else}}
<span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span> <span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span>
{{/if}} {{/if}}
<span class="dot">•</span> <span class="dot">•</span>
{{#if document.system.community}} {{#if document.system.community}}
<span data-action="editDoc" data-item-uuid="{{document.system.community.uuid}}">{{document.system.community.name}}</span> <span data-action="editDoc" data-item-uuid="{{document.system.community.uuid}}">{{document.system.community.name}}</span>
{{else}} {{else}}
<span class="missing-header-feature" data-action="openPack" data-key="communities">{{localize 'TYPES.Item.community'}}</span> <span class="missing-header-feature" data-action="openPack" data-key="communities">{{localize 'TYPES.Item.community'}}</span>
{{/if}} {{/if}}
<span class="dot">•</span> <span class="dot">•</span>
{{#if document.system.ancestry}} {{#if document.system.ancestry}}
<span data-action="editDoc" data-item-uuid="{{document.system.ancestry.uuid}}">{{document.system.ancestry.name}}</span> <span data-action="editDoc" data-item-uuid="{{document.system.ancestry.uuid}}">{{document.system.ancestry.name}}</span>
{{else}} {{else}}
<span class="missing-header-feature" data-action="openPack" data-key="ancestries">{{localize 'TYPES.Item.ancestry'}}</span> <span class="missing-header-feature" data-action="openPack" data-key="ancestries">{{localize 'TYPES.Item.ancestry'}}</span>
{{/if}} {{/if}}
</div> </div>
{{#if (or document.system.multiclass.value document.system.multiclass.subclass)}} {{#if (or document.system.multiclass.value document.system.multiclass.subclass)}}
<div class="multiclass"> <div class="multiclass">
{{#if document.system.multiclass.value}} {{#if document.system.multiclass.value}}
<span data-action="editDoc"data-item-uuid="{{document.system.multiclass.value.uuid}}">{{document.system.multiclass.value.name}}</span> <span data-action="editDoc"data-item-uuid="{{document.system.multiclass.value.uuid}}">{{document.system.multiclass.value.name}}</span>
{{else}} {{else}}
<span data-action="openPack" data-key="classes">{{localize 'DAGGERHEART.GENERAL.multiclass'}}</span> <span data-action="openPack" data-key="classes">{{localize 'DAGGERHEART.GENERAL.multiclass'}}</span>
{{/if}} {{/if}}
<span class="dot">•</span> <span class="dot">•</span>
{{#if document.system.multiclass.subclass}} {{#if document.system.multiclass.subclass}}
<span data-action="editDoc" data-item-uuid="{{document.system.multiclass.subclass.uuid}}">{{document.system.multiclass.subclass.name}}</span> <span data-action="editDoc" data-item-uuid="{{document.system.multiclass.subclass.uuid}}">{{document.system.multiclass.subclass.name}}</span>
{{else}} {{else}}
<span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span> <span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span>
{{/if}} {{/if}}
</div> </div>
{{/if}} {{/if}}
</div>
<div class="character-row"> </div>
<div class="resource-section">
<div class="hope-section"> <div class="character-row">
<h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4> <div class="resource-section">
{{#times document.system.resources.hope.max}} <div class="hope-section">
<span class='hope-value' data-action='toggleHope' data-value="{{add this 1}}"> <h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4>
{{#if (gte ../document.system.resources.hope.value (add this 1))}} {{#times document.system.resources.hope.max}}
<i class='fa-solid fa-diamond'></i> <span class='hope-value' data-action='toggleHope' data-value="{{add this 1}}">
{{else}} {{#if (gte ../document.system.resources.hope.value (add this 1))}}
<i class='fa-regular fa-circle'></i> <i class='fa-solid fa-diamond'></i>
{{/if}} {{else}}
</span> <i class='fa-regular fa-circle'></i>
{{/times}} {{/if}}
{{#times document.system.scars}} </span>
<span class='hope-value scar'> {{/times}}
<i class='fa-regular fa-ban'></i> {{#times document.system.scars}}
</span> <span class='hope-value scar'>
{{/times}} <i class='fa-regular fa-ban'></i>
{{#if hasExtraResources}}<a type="button" class="resource-manager" data-action="toggleResourceManagement"><i class="fa-solid fa-angle-down"></i></a>{{/if}} </span>
</div> {{/times}}
</div> {{#if hasExtraResources}}<a type="button" class="resource-manager" data-action="toggleResourceManagement"><i class="fa-solid fa-angle-down"></i></a>{{/if}}
{{#if document.system.class.value}} </div>
<div class="domains-section"> </div>
{{#each document.system.domainData as |data|}} {{#if document.system.class.value}}
<div class="domain"> <div class="domains-section">
<img src="{{data.src}}" alt="" data-tooltip="{{data.label}}" /> {{#each document.system.domainData as |data|}}
</div> <div class="domain">
{{/each}} <img src="{{data.src}}" alt="" data-tooltip="{{data.label}}" />
</div> </div>
{{/if}} {{/each}}
<div class="downtime-section"> </div>
{{#if document.parties.size}} {{/if}}
<button type="button" data-action="viewParty" data-tooltip="DAGGERHEART.ACTORS.Character.viewParty"> <div class="downtime-section">
<i class="fa-solid fa-fw fa-users"></i> {{#if document.parties.size}}
</button> <button type="button" data-action="viewParty" data-tooltip="DAGGERHEART.ACTORS.Character.viewParty">
{{/if}} <i class="fa-solid fa-fw fa-users"></i>
{{#if @root.editable}} </button>
<button type="button" data-action="useDowntime" data-type="shortRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"> {{/if}}
<i class="fa-solid fa-fw fa-utensils"></i> {{#if @root.editable}}
</button> <button type="button" data-action="useDowntime" data-type="shortRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.shortRest.title">
<button type="button" data-action="useDowntime" data-type="longRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.longRest.title"> <i class="fa-solid fa-fw fa-utensils"></i>
<i class="fa-solid fa-fw fa-bed"></i> </button>
</button> <button type="button" data-action="useDowntime" data-type="longRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.longRest.title">
{{/if}} <i class="fa-solid fa-fw fa-bed"></i>
</div> </button>
</div> {{/if}}
</div>
<div class="character-traits"> </div>
{{#each this.attributes as |attribute key|}}
<div class="trait {{#if isSpellcasting}}with-spellcasting{{/if}}" data-tooltip="<b>{{attribute.label}}:</b><br>{{#each attribute.verbs}}{{this}}<br>{{/each}}" data-action="rollAttribute" data-attribute="{{key}}" data-value="{{attribute.value}}"> <div class="character-traits">
<div class="trait-name"> {{#each this.attributes as |attribute key|}}
<div class="tier-mark {{#if attribute.tierMarked}}marked{{/if}}"></div> <div class="trait {{#if isSpellcasting}}with-spellcasting{{/if}}" data-tooltip="<b>{{attribute.label}}:</b><br>{{#each attribute.verbs}}{{this}}<br>{{/each}}" data-action="rollAttribute" data-attribute="{{key}}" data-value="{{attribute.value}}">
<span>{{attribute.label}}</span> <div class="trait-name">
</div> <div class="tier-mark {{#if attribute.tierMarked}}marked{{/if}}"></div>
<div class="trait-value-area"> <span>{{attribute.label}}</span>
<svg width="52" height="46" viewBox="0 0 52 46" fill="none" xmlns="http://www.w3.org/2000/svg"> </div>
<path d="M 0,0 H 52 L 51.0714,18.254 48.781,24.0952 47.5745,39.9596 26,46 4.42553,39.9596 3.219,24.0952 0.928571,18.254 Z" fill="var(--color-border)"/> <div class="trait-value-area">
<path d="M 3.312,5.357 8.58596,0 H 43.414 l 5.274,5.357 -1.8797,28.846 c -0.2431,2.605 -2.1461,4.7522 -4.7031,5.3064 l -14.8343,3.2151 c -0.8375,0.1816 -1.7043,0.1816 -2.5418,0 L 9.89482,39.5094 C 7.33785,38.9552 5.43478,36.808 5.19169,34.203 Z" fill="var(--background)"/> <svg width="52" height="46" viewBox="0 0 52 46" fill="none" xmlns="http://www.w3.org/2000/svg">
</svg> <path d="M 0,0 H 52 L 51.0714,18.254 48.781,24.0952 47.5745,39.9596 26,46 4.42553,39.9596 3.219,24.0952 0.928571,18.254 Z" fill="var(--color-border)"/>
<div class="trait-value"> <path d="M 3.312,5.357 8.58596,0 H 43.414 l 5.274,5.357 -1.8797,28.846 c -0.2431,2.605 -2.1461,4.7522 -4.7031,5.3064 l -14.8343,3.2151 c -0.8375,0.1816 -1.7043,0.1816 -2.5418,0 L 9.89482,39.5094 C 7.33785,38.9552 5.43478,36.808 5.19169,34.203 Z" fill="var(--background)"/>
{{#if (gt attribute.value 0)}} </svg>
<span>+{{attribute.value}}</span> <div class="trait-value">
{{else}} {{#if (gt attribute.value 0)}}
<span>{{attribute.value}}</span> <span>+{{attribute.value}}</span>
{{/if}} {{else}}
</div> <span>{{attribute.value}}</span>
{{#if isSpellcasting}} {{/if}}
<div class="spellcasting-mark" data-tooltip="DAGGERHEART.ITEMS.Subclass.spellcastingTrait"> </div>
<i class="fa-solid fa-wand-magic-sparkles" inert></i> {{#if isSpellcasting}}
</div> <div class="spellcasting-mark" data-tooltip="DAGGERHEART.ITEMS.Subclass.spellcastingTrait">
{{/if}} <i class="fa-solid fa-wand-magic-sparkles" inert></i>
</div> </div>
</div> {{/if}}
{{/each}} </div>
</div> </div>
{{/each}}
{{#> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }} </div>
<button type="button" data-action="openSettings" data-tooltip-text="{{localize "DAGGERHEART.UI.Tooltip.openSheetSettings"}}"><i class="fa-solid fa-wrench"></i></button>
{{/'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}} {{#> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }}
<button type="button" data-action="openSettings" data-tooltip-text="{{localize "DAGGERHEART.UI.Tooltip.openSheetSettings"}}"><i class="fa-solid fa-wrench"></i></button>
{{/'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}}
</header> </header>

View file

@ -1,54 +1,54 @@
<section class='tab {{tabs.inventory.cssClass}} {{tabs.inventory.id}}' data-tab='{{tabs.inventory.id}}' <section class='tab {{tabs.inventory.cssClass}} {{tabs.inventory.id}}' data-tab='{{tabs.inventory.id}}'
data-group='{{tabs.inventory.group}}'> data-group='{{tabs.inventory.group}}'>
<div class="search-section"> <div class="search-section">
<div class="search-bar"> <div class="search-bar">
<div class="icon"> <div class="icon">
<i class="fa-solid fa-magnifying-glass"></i> <i class="fa-solid fa-magnifying-glass"></i>
</div> </div>
<input type="search" name="search" class="search-inventory" placeholder="{{localize "DAGGERHEART.GENERAL.searchPlaceholder"}}"> <input type="search" name="search" class="search-inventory" placeholder="{{localize "DAGGERHEART.GENERAL.searchPlaceholder"}}">
</div> </div>
<a class="filter-button"> <a class="filter-button">
<i class="fa-solid fa-filter"></i> <i class="fa-solid fa-filter"></i>
</a> </a>
</div> </div>
{{#if this.inventory.hasCurrency}} {{#if this.inventory.hasCurrency}}
{{> "systems/daggerheart/templates/sheets/global/partials/gold.hbs" currencies=inventory.currencies}} {{> "systems/daggerheart/templates/sheets/global/partials/gold.hbs" currencies=inventory.currencies}}
{{/if}} {{/if}}
<div class="items-section scroll-container"> <div class="items-section">
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='TYPES.Item.weapon' title='TYPES.Item.weapon'
type='weapon' type='weapon'
collection=@root.inventory.weapons collection=@root.inventory.weapons
isGlassy=true isGlassy=true
canCreate=@root.editable canCreate=@root.editable
hideResources=true hideResources=true
}} }}
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='TYPES.Item.armor' title='TYPES.Item.armor'
type='armor' type='armor'
collection=@root.inventory.armor collection=@root.inventory.armor
isGlassy=true isGlassy=true
canCreate=@root.editable canCreate=@root.editable
hideResources=true hideResources=true
}} }}
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='TYPES.Item.consumable' title='TYPES.Item.consumable'
type='consumable' type='consumable'
collection=@root.inventory.consumables collection=@root.inventory.consumables
isGlassy=true isGlassy=true
canCreate=@root.editable canCreate=@root.editable
isQuantifiable=true isQuantifiable=true
}} }}
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='TYPES.Item.loot' title='TYPES.Item.loot'
type='loot' type='loot'
collection=@root.inventory.loot collection=@root.inventory.loot
isGlassy=true isGlassy=true
canCreate=@root.editable canCreate=@root.editable
showActions=@root.editable showActions=@root.editable
isQuantifiable=true isQuantifiable=true
}} }}
</div> </div>
</section> </section>

View file

@ -1,42 +1,42 @@
<section class='tab {{tabs.loadout.cssClass}} {{tabs.loadout.id}}' data-tab='{{tabs.loadout.id}}' <section class='tab {{tabs.loadout.cssClass}} {{tabs.loadout.id}}' data-tab='{{tabs.loadout.id}}'
data-group='{{tabs.loadout.group}}'> data-group='{{tabs.loadout.group}}'>
<div class="search-section"> <div class="search-section">
<div class="search-bar"> <div class="search-bar">
<div class="icon"> <div class="icon">
<i class="fa-solid fa-magnifying-glass"></i> <i class="fa-solid fa-magnifying-glass"></i>
</div> </div>
<input type="search" name="search" class="search-loadout" placeholder="{{localize "DAGGERHEART.GENERAL.searchPlaceholder"}}"> <input type="search" name="search" class="search-loadout" placeholder="{{localize "DAGGERHEART.GENERAL.searchPlaceholder"}}">
</div> </div>
<a class="filter-button"> <a class="filter-button">
<i class="fa-solid fa-filter"></i> <i class="fa-solid fa-filter"></i>
</a> </a>
<button type="button" class="btn-toggle-view" data-action="toggleLoadoutView" data-value="{{not cardView}}"> <button type="button" class="btn-toggle-view" data-action="toggleLoadoutView" data-value="{{not cardView}}">
<span class="{{ifThen cardView '' 'list-active'}} list-icon"> <span class="{{ifThen cardView '' 'list-active'}} list-icon">
<i class="fa-solid fa-bars"></i> <i class="fa-solid fa-bars"></i>
</span> </span>
<span class="{{ifThen cardView 'grid-active' ''}} grid-icon"> <span class="{{ifThen cardView 'grid-active' ''}} grid-icon">
<i class="fa-solid fa-grip"></i> <i class="fa-solid fa-grip"></i>
</span> </span>
</button> </button>
</div> </div>
<div class="items-section scroll-container"> <div class="items-section">
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='DAGGERHEART.GENERAL.Tabs.loadout' title='DAGGERHEART.GENERAL.Tabs.loadout'
type='domainCard' type='domainCard'
isGlassy=true isGlassy=true
cardView=cardView cardView=cardView
collection=document.system.domainCards.loadout collection=document.system.domainCards.loadout
canCreate=@root.editable canCreate=@root.editable
}} }}
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='DAGGERHEART.GENERAL.Tabs.vault' title='DAGGERHEART.GENERAL.Tabs.vault'
type='domainCard' type='domainCard'
isGlassy=true isGlassy=true
cardView=cardView cardView=cardView
collection=document.system.domainCards.vault collection=document.system.domainCards.vault
canCreate=@root.editable canCreate=@root.editable
inVault=true inVault=true
}} }}
</div> </div>
</section> </section>

View file

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

View file

@ -1,13 +1,13 @@
<section <section
class="tab {{tabs.features.cssClass}} {{tabs.features.id}}" class='tab {{tabs.features.cssClass}} {{tabs.features.id}}'
data-tab="{{tabs.features.id}}" data-tab='{{tabs.features.id}}'
data-group="{{tabs.features.group}}" data-group='{{tabs.features.group}}'
> >
<div class="feature-section scroll-container"> <div class="feature-section">
{{#each @root.features as |item|}} {{#each @root.features as |item|}}
{{> "daggerheart.inventory-item" {{> 'daggerheart.inventory-item'
item=item item=item
type="feature" type='feature'
actorType=@root.document.type actorType=@root.document.type
hideContextMenu=true hideContextMenu=true
hideModifyControls=true hideModifyControls=true

View file

@ -1,20 +1,20 @@
<section <section
class='tab {{tabs.potentialAdversaries.cssClass}} {{tabs.potentialAdversaries.id}}' class='tab {{tabs.potentialAdversaries.cssClass}} {{tabs.potentialAdversaries.id}}'
data-tab='{{tabs.potentialAdversaries.id}}' data-tab='{{tabs.potentialAdversaries.id}}'
data-group='{{tabs.potentialAdversaries.group}}' data-group='{{tabs.potentialAdversaries.group}}'
> >
<div class="items-section scroll-container"> <div class="items-section">
{{#each document.system.potentialAdversaries as |category categoryId|}} {{#each document.system.potentialAdversaries as |category categoryId|}}
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title=category.label title=category.label
type='adversary' type='adversary'
isGlassy=true isGlassy=true
isActor=true isActor=true
categoryAdversary=categoryId categoryAdversary=categoryId
hideControls=true hideControls=true
collection=category.adversaries collection=category.adversaries
hideResources=true hideResources=true
}} }}
{{/each}} {{/each}}
</div> </div>
</section> </section>

View file

@ -1,7 +1,7 @@
<section <section
class="tab {{tabs.notes.cssClass}} {{tabs.notes.id}}" class='tab {{tabs.notes.cssClass}} {{tabs.notes.id}}'
data-tab="{{tabs.notes.id}}" data-tab='{{tabs.notes.id}}'
data-group="{{tabs.notes.group}}" data-group='{{tabs.notes.group}}'
> >
{{formInput notes.field value=notes.value enriched=notes.enriched toggled=true}} {{formInput notes.field value=notes.value enriched=notes.enriched toggled=true}}

View file

@ -19,7 +19,7 @@
{{> "systems/daggerheart/templates/sheets/global/partials/gold.hbs" currencies=inventory.currencies}} {{> "systems/daggerheart/templates/sheets/global/partials/gold.hbs" currencies=inventory.currencies}}
{{/if}} {{/if}}
<div class="items-section scroll-container"> <div class="items-section">
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title='TYPES.Item.weapon' title='TYPES.Item.weapon'
type='weapon' type='weapon'

View file

@ -1,7 +1,7 @@
<section <section
class="tab {{tabs.notes.cssClass}} {{tabs.notes.id}}" class='tab {{tabs.notes.cssClass}} {{tabs.notes.id}}'
data-tab="{{tabs.notes.id}}" data-tab='{{tabs.notes.id}}'
data-group="{{tabs.notes.group}}" data-group='{{tabs.notes.group}}'
> >
{{formInput notes.field value=notes.value enriched=notes.value toggled=true}} {{formInput notes.field value=notes.value enriched=notes.value toggled=true}}
</section> </section>

View file

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

View file

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

View file

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

View file

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