Compare commits

...

6 Commits

Author SHA1 Message Date
uberwald 883a84b7a0 Affichage des cartes améliorés dans la vue /tirage
Release Creation / build (release) Successful in 48s
2026-04-26 15:50:51 +02:00
uberwald 6f8b165745 v14 fixes again
Release Creation / build (release) Successful in 49s
2026-04-24 22:27:58 +02:00
uberwald c61179a790 Corrections sur commande /tirage
Release Creation / build (release) Successful in 1m3s
2026-04-24 21:05:02 +02:00
uberwald 956ed9e916 Corrections CSS sur fiche archetype et système
Release Creation / build (release) Successful in 50s
2026-04-21 13:43:29 +02:00
uberwald 5cc060b102 Foundryv14 migration 2026-04-01 22:21:54 +02:00
uberwald a816380679 Foundryv14 migration
Release Creation / build (release) Successful in 47s
2026-04-01 21:57:26 +02:00
58 changed files with 307 additions and 258 deletions
+2 -2
View File
@@ -58,5 +58,5 @@ jobs:
version: ${{github.event.release.tag_name}}
manifest: 'https://www.uberwald.me/gitea/public/fvtt-malefices/releases/download/latest/system.json'
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-malefices.zip'
compatibility-minimum: '11'
compatibility-verified: '13'
compatibility-minimum: '13'
compatibility-verified: '14'
+8
View File
@@ -1 +1,9 @@
# IDE
.idea/
.vs/
styles/*.css
# Node Modules
node_modules/
.github/
+24 -58
View File
@@ -4,71 +4,37 @@
src: url('../fonts/rivanna.ttf') format("truetype");
}
:root {
/* =================== 1. ACTOR SHEET FONT STYLES =========== */
--window-header-title-font-size: 1.3rem;
--window-header-title-font-weight: normal;
--window-header-title-color: #f5f5f5;
--major-button-font-size: 1.05rem;
--major-button-font-weight: normal;
--major-button-color: #dadada;
--tab-header-font-size: 1.0rem;
--tab-header-font-weight: 700;
--tab-header-color: #403f3e;
--tab-header-color-active: #4a0404;
--actor-input-font-size: 0.8rem;
--actor-input-font-weight: 500;
--actor-input-color: black;
--actor-label-font-size: 0.8rem;
--actor-label-font-weight: 700;
--actor-label-color: #464331c4;
/* =================== 2. DEBUGGING HIGHLIGHTERS ============ */
--debug-background-color-red: #ff000054;
--debug-background-color-blue: #1d00ff54;
--debug-background-color-green: #54ff0054;
--debug-box-shadow-red: inset 0 0 2px red;
--debug-box-shadow-blue: inset 0 0 2px blue;
--debug-box-shadow-green: inset 0 0 2px green;
}
/*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/
/* Global styles & Font */
/* Global styles scoped to Maléfices windows only */
.fvtt-malefices .window-app {
text-align: justify;
font-size: 16px;
letter-spacing: 1px;
text-align: justify;
font-size: 16px;
letter-spacing: 1px;
}
/* Fonts */
.sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item {
font-size: 1.0rem;
} /* For title, sidebar character and scene */
/* Fonts — scoped to system sheets */
.fvtt-malefices .sheet header.sheet-header h1 input,
#actors .directory-list,
#navigation #scene-list .scene.nav-item {
font-size: 1.0rem;
}
.fvtt-malefices .sheet nav.sheet-tabs {
font-size: 0.8rem;
} /* For nav and title */
.window-app input, .fvtt-malefices .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
font-size: 0.8rem;
font-size: 0.8rem;
}
.fvtt-malefices .item-form,
.fvtt-malefices .sheet header.sheet-header .flex-group-center.flex-compteurs,
.fvtt-malefices .sheet header.sheet-header .flex-group-center.flex-fatigue,
.fvtt-malefices .item-checkbox,
#sidebar, #players, #navigation #nav-toggle {
font-size: 0.8rem;
}
.window-header{
background: rgba(0,0,0,0.75);
}
.window-app.sheet .window-content {
margin: 0;
padding: 0;
}
.strong-text{
.strong-text {
font-weight: bold;
}
.tabs .item.active, .blessures-list li ul li:first-child:hover, a:hover {
.fvtt-malefices .tabs .item.active,
.blessures-list li ul li:first-child:hover {
text-shadow: 1px 0px 0px @color-accent;
}
@@ -78,15 +44,15 @@ background: rgba(0,0,0,0.75);
cursor: pointer;
}
input:hover, select:hover {
.fvtt-malefices input:hover, .fvtt-malefices select:hover {
border-width: 4px;
border-color: rgb(85, 65, 130);
}
input:disabled {
.fvtt-malefices input:disabled {
color:#1c2058;
}
select:disabled {
.fvtt-malefices select:disabled {
color:#1c2058;
}
table {border: 1px solid #7a7971;}
+24 -13
View File
@@ -391,24 +391,11 @@
width: 100px;
vertical-align: top;
&:hover {
position: relative;
z-index: 100;
.tirage-card-img {
transform: scale(2.2);
transform-origin: center top;
box-shadow: 3px 3px 12px rgba(0,0,0,0.4);
}
}
.tirage-card-img {
width: 100px;
border: 1px solid @be-gold-border;
border-radius: 2px;
box-shadow: 1px 1px 4px rgba(0,0,0,0.2);
transition: transform 0.2s ease, box-shadow 0.2s ease;
transform-origin: center center;
cursor: zoom-in;
}
@@ -467,3 +454,27 @@
}
}
}
// ── Overlay loupe pour les cartes du tirage ───────────────
#tirage-card-zoom-overlay {
position: fixed;
z-index: 10000;
pointer-events: none;
border: 2px solid @be-gold-border;
border-radius: 3px;
box-shadow: 4px 4px 20px rgba(0,0,0,0.55);
opacity: 0;
transition: opacity 0.15s ease;
background: #000;
&.visible { opacity: 1; }
img {
display: block;
width: 220px;
height: auto;
border-radius: 2px;
&.flip-tarot { transform: scaleY(-1); }
}
}
+9
View File
@@ -48,6 +48,15 @@
}
}
/* Description editor: ensure enough vertical room */
.tab.description {
prose-mirror,
.editor,
.ProseMirror {
min-height: 440px;
}
}
/* Header layout override for item sheets (smaller than actor sheet header) */
.sheet-header {
flex: 0 0 auto;
+19 -10
View File
@@ -204,23 +204,29 @@ li.folder > .folder-header h3 {
/*background: #494e6b;*/
}
input[type="text"], select[type="text"] {
.fvtt-malefices input[type="text"], .fvtt-malefices select[type="text"] {
background:white;
color: @color-input-text;
}
select {
.fvtt-malefices select {
background:white;
color: @color-input-text;
}
/* background: #011d33 url("../images/ui/fond1.webp") repeat left top;*/
/*color: rgba(168, 139, 139, 0.5);*/
.window-app.sheet .window-content .sheet-header select[type="text"], .window-app.sheet .window-content .sheet-header input[type="text"], .window-app.sheet .window-content .sheet-header input[type="number"], .window-app.sheet .window-content .sheet-body input[type="text"], .window-app.sheet .window-content .sheet-body input[type="number"], .window-app.sheet .window-content .sheet-body select[type="text"] {
.fvtt-malefices.window-app.sheet .window-content .sheet-header select[type="text"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="text"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="number"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="text"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="number"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body select[type="text"] {
color: @color-text;
/*color: #494e6b;*/
}
.window-app.sheet .window-content .sheet-header input[type="password"], .window-app.sheet .window-content .sheet-header input[type="date"], .window-app.sheet .window-content .sheet-header input[type="time"] {
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="password"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="date"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="time"] {
color: @color-text;
background: @bg-sheet;
border: 1 none;
@@ -228,7 +234,9 @@ select {
margin-left: 2px;
}
.window-app.sheet .window-content .sheet-body input[type="password"], .window-app.sheet .window-content .sheet-body input[type="date"], .window-app.sheet .window-content .sheet-body input[type="time"] {
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="password"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="date"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="time"] {
color: @color-text;
background: @bg-sheet;
border: 1 none;
@@ -236,7 +244,8 @@ select {
margin-left: 2px;
}
.window-app.sheet .window-content .sheet-body select, .window-app.sheet .window-content .sheet-header select {
.fvtt-malefices.window-app.sheet .window-content .sheet-body select,
.fvtt-malefices.window-app.sheet .window-content .sheet-header select {
color: @color-text;
background: #fff;
border: 1 none;
@@ -262,7 +271,7 @@ section.sheet-body{padding: 0.25rem 0.5rem;}
padding: 0;
}
nav.sheet-tabs {
.fvtt-malefices nav.sheet-tabs {
font-size: @tab-font-size;
font-weight: bold;
height: @tab-height;
@@ -289,7 +298,7 @@ nav.sheet-tabs {
color: #6d5923 !important;
}
nav.sheet-tabs .item {
.fvtt-malefices nav.sheet-tabs .item {
position: relative;
padding: 0 0.25rem;
color: @color-tab-text;
@@ -297,7 +306,7 @@ nav.sheet-tabs .item {
margin-bottom: 4px;
}
nav.sheet-tabs .item:after {
.fvtt-malefices nav.sheet-tabs .item:after {
content: "";
position: absolute;
top: 0;
@@ -29,7 +29,8 @@ export default class MaleficesArchetypeSheet extends MaleficesItemSheet {
async _prepareContext() {
const context = await super._prepareContext()
context.tabs = this.#getTabs()
context.tarots = MaleficesUtility.getTarots()
const tarots = MaleficesUtility.getTarots() ?? []
context.tarots = Object.fromEntries(tarots.map(t => [t._id, t.name]))
return context
}
}
+20 -24
View File
@@ -15,8 +15,8 @@ export class MaleficesActor extends Actor {
/**
* Override the create() function to provide additional SoS functionality.
*
* This overrided create() function adds initial items
* Namely: Basic skills, money,
* This overrided create() function adds initial items
* Namely: Basic skills, money,
*
* @param {Object} data Barebones actor data which this function adds onto.
* @param {Object} options (Unused) Additional options which customize the creation workflow.
@@ -43,10 +43,6 @@ export class MaleficesActor extends Actor {
return super.create(data, options);
}
/* -------------------------------------------- */
prepareBaseData() {
}
/* -------------------------------------------- */
async prepareData() {
@@ -92,7 +88,7 @@ export class MaleficesActor extends Actor {
return comp;
}
getArchetype() {
let comp = foundry.utils.duplicate(this.items.find(item => item.type == 'archetype') || {name: "Pas d'archetype"})
let comp = foundry.utils.duplicate(this.items.find(item => item.type == 'archetype') || { name: "Pas d'archetype" })
if (comp && comp.system) {
comp.tarot = MaleficesUtility.getTarot(comp.system.lametutelaire)
}
@@ -224,13 +220,13 @@ export class MaleficesActor extends Actor {
}
/* -------------------------------------------- */
clearInitiative(){
clearInitiative() {
this.getFlag("world", "initiative", -1)
}
/* -------------------------------------------- */
getInitiativeScore(combatId, combatantId) {
let init = Math.floor( (this.system.attributs.physique.value+this.system.attributs.habilite.value) / 2)
let subvalue = new Roll("1d20").roll({async: false})
let init = Math.floor((this.system.attributs.physique.value + this.system.attributs.habilite.value) / 2)
let subvalue = new Roll("1d20").roll({ async: false })
return init + (subvalue.total / 100)
}
@@ -275,25 +271,25 @@ export class MaleficesActor extends Actor {
/* -------------------------------------------- */
incDecFluide(value) {
let fluide = this.system.fluide + value
this.update( {'system.fluide': fluide} )
this.update({ 'system.fluide': fluide })
}
incDecDestin(value) {
let destin = this.system.pointdestin + value
this.update( {'system.pointdestin': destin} )
this.update({ 'system.pointdestin': destin })
}
incDecMPMB(value) {
let mpmb = this.system.mpmb + value
this.update( {'system.mpmb': mpmb} )
this.update({ 'system.mpmb': mpmb })
}
incDecMPMN(value) {
let mpmn = this.system.mpmn + value
this.update( {'system.mpmn': mpmn} )
this.update({ 'system.mpmn': mpmn })
}
/* -------------------------------------------- */
incDecAttr(attrKey, value) {
let attr = foundry.utils.duplicate(this.system.attributs[attrKey])
attr.value += value
this.update( { [`system.attributs.${attrKey}`]: attr})
this.update({ [`system.attributs.${attrKey}`]: attr })
}
/* -------------------------------------------- */
async incDecQuantity(objetId, incDec = 0) {
@@ -317,16 +313,16 @@ export class MaleficesActor extends Actor {
}
/* -------------------------------------------- */
getAtttributImage( attrKey) {
getAtttributImage(attrKey) {
return `systems/fvtt-malefices/images/icons/${attrKey}.webp`
}
/* -------------------------------------------- */
incDecDestin( value) {
let newValue = Math.max( this.system.pointdestin + value, 0)
this.update( {'system.pointdestin': newValue})
incDecDestin(value) {
let newValue = Math.max(this.system.pointdestin + value, 0)
this.update({ 'system.pointdestin': newValue })
}
/* -------------------------------------------- */
getCommonRollData() {
@@ -349,7 +345,7 @@ export class MaleficesActor extends Actor {
}
/* -------------------------------------------- */
getPhysiqueMalus() {
if ( this.system.attributs.constitution.value <= 8) {
if (this.system.attributs.constitution.value <= 8) {
return -(9 - this.system.attributs.constitution.value)
}
return 0
@@ -361,7 +357,7 @@ export class MaleficesActor extends Actor {
let rollData = this.getCommonRollData()
rollData.attr = foundry.utils.duplicate(attr)
rollData.mode = "attribut"
rollData.title = attr.label
rollData.title = attr.label
rollData.img = this.getAtttributImage(attrKey)
this.startRoll(rollData)
}
@@ -373,7 +369,7 @@ export class MaleficesActor extends Actor {
arme = foundry.utils.duplicate(arme)
let rollData = this.getCommonRollData()
if (arme.system.armetype == "mainsnues" || arme.system.armetype == "epee") {
rollData.attr = { label: "(Physique+Habilité)/2", value: Math.floor( (this.getPhysiqueMalus()+this.system.attributs.physique.value+this.system.attributs.habilite.value) / 2) }
rollData.attr = { label: "(Physique+Habilité)/2", value: Math.floor((this.getPhysiqueMalus() + this.system.attributs.physique.value + this.system.attributs.habilite.value) / 2) }
} else {
rollData.attr = foundry.utils.duplicate(this.system.attributs.habilite)
}
@@ -386,7 +382,7 @@ export class MaleficesActor extends Actor {
ui.notifications.warn("Impossible de trouver l'arme concernée ")
}
}
/* -------------------------------------------- */
async startRoll(rollData) {
await MaleficesRollDialog.create(this, rollData)
+5 -3
View File
@@ -131,10 +131,12 @@ Hooks.once("ready", function () {
/* Foundry VTT Initialization */
/* -------------------------------------------- */
Hooks.on("chatMessage", (html, content, msg) => {
if (content[0] == '/') {
// In Foundry v14+, ProseMirror wraps message in <p>...</p> — strip it like ChatLog.parse does
const stripped = content.replace(/^<p>|<\/p>$/gi, "").trim();
if (stripped[0] === '/') {
let regExp = /(\S+)/g;
let commands = content.match(regExp);
if (game.system.malefices.commands.processChatCommand(commands, content, msg)) {
let commands = stripped.match(regExp);
if (game.system.malefices.commands.processChatCommand(commands, stripped, msg)) {
return false;
}
}
+52
View File
@@ -53,6 +53,58 @@ export class MaleficesTirageTarotDialog extends HandlebarsApplicationMixin(Appli
})
el.querySelector('.tirage-close-btn')?.addEventListener('click', () => this.close())
this._setupCardZoom(el)
}
/* -------------------------------------------- */
_setupCardZoom(el) {
let overlay = document.getElementById('tirage-card-zoom-overlay')
if (!overlay) {
overlay = document.createElement('div')
overlay.id = 'tirage-card-zoom-overlay'
overlay.innerHTML = '<img src="" alt="" />'
document.body.appendChild(overlay)
}
const overlayImg = overlay.querySelector('img')
const ZOOM_W = 224 // 220px image + 2px border × 2
const TAROT_RATIO = 5 / 3 // hauteur / largeur (cartes tarot portrait)
const position = (rect) => {
const vw = window.innerWidth
const vh = window.innerHeight
const zoomH = Math.round(ZOOM_W * TAROT_RATIO)
let left = rect.left + rect.width / 2 - ZOOM_W / 2
let top = rect.top - zoomH - 10
left = Math.max(8, Math.min(left, vw - ZOOM_W - 8))
if (top < 8) top = rect.bottom + 8
if (top + zoomH > vh - 8) top = Math.max(8, vh - zoomH - 8)
overlay.style.left = left + 'px'
overlay.style.top = top + 'px'
}
const show = (cardImg) => {
overlayImg.src = cardImg.src
overlayImg.className = cardImg.className
overlay.classList.add('visible')
position(cardImg.getBoundingClientRect())
}
const hide = () => overlay.classList.remove('visible')
el.querySelectorAll('.tirage-card-img').forEach(img => {
img.addEventListener('mouseenter', () => show(img))
img.addEventListener('mouseleave', hide)
})
}
/* -------------------------------------------- */
_onClose(_options) {
document.getElementById('tirage-card-zoom-overlay')?.remove()
return super._onClose(_options)
}
/* -------------------------------------------- */
+17 -14
View File
@@ -7,7 +7,7 @@ export class MaleficesUtility {
/* -------------------------------------------- */
static async init() {
Hooks.on('renderChatLog', (log, html, data) => MaleficesUtility.chatListeners(html));
Hooks.on('renderChatMessageHTML', (message, html) => MaleficesUtility.chatListeners(message, html));
this.rollDataStore = {}
this.defenderStore = {}
@@ -73,7 +73,7 @@ export class MaleficesUtility {
/*-------------------------------------------- */
static getTarots() {
return foundry.utils.duplicate(this.tarots)
return foundry.utils.duplicate(this.tarots ?? [])
}
static getTarot(tId) {
return this.tarots.find(t => t._id == tId)
@@ -105,29 +105,32 @@ export class MaleficesUtility {
/* -------------------------------------------- */
static drawDeckCard(msgId) {
if (game.user.isGM) {
game.system.malefices.currentTirage.addCard(msgId)
const tirage = game.system.malefices.currentTirage
if (tirage) {
tirage.addCard(msgId)
} else {
ui.notifications.warn("Aucun tirage en cours.")
}
} else {
game.socket.emit("system.fvtt-malefices", { name: "msg-draw-card", data: { msgId: msgId } })
}
}
/* -------------------------------------------- */
static async chatListeners(html) {
static chatListeners(message, html) {
if (!html) return
$(html).on("click", '.roll-destin', event => {
let messageId = MaleficesUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "rolldata")
let actor = this.getActorFromRollData(rollData)
html.querySelector('.roll-destin')?.addEventListener('click', () => {
const rollData = message.getFlag("world", "rolldata")
const actor = MaleficesUtility.getActorFromRollData(rollData)
actor.incDecDestin(-1)
rollData.isReroll = true
this.rollMalefices(rollData)
})
$(html).on("click", '.draw-tarot-card', event => {
let messageId = MaleficesUtility.findChatMessageId(event.currentTarget)
this.drawDeckCard(messageId)
MaleficesUtility.rollMalefices(rollData)
})
html.querySelector('.draw-tarot-card')?.addEventListener('click', () => {
MaleficesUtility.drawDeckCard(message.id)
})
}
/* -------------------------------------------- */
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000064
MANIFEST-000014
+7 -7
View File
@@ -1,7 +1,7 @@
2026/02/27-10:28:01.892467 7f56f8bfd6c0 Recovering log #63
2026/02/27-10:28:01.948160 7f56f8bfd6c0 Delete type=0 #63
2026/02/27-10:28:01.948272 7f56f8bfd6c0 Delete type=3 #62
2026/02/27-14:29:37.861283 7f54e37ef6c0 Level-0 table #67: started
2026/02/27-14:29:37.861314 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
2026/02/27-14:29:37.867488 7f54e37ef6c0 Delete type=0 #65
2026/02/27-14:29:37.880370 7f54e37ef6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end)
2026/04/26-15:45:25.152297 7f5797fff6c0 Recovering log #12
2026/04/26-15:45:25.163242 7f5797fff6c0 Delete type=3 #10
2026/04/26-15:45:25.163372 7f5797fff6c0 Delete type=0 #12
2026/04/26-15:50:25.999778 7f57977fe6c0 Level-0 table #17: started
2026/04/26-15:50:25.999856 7f57977fe6c0 Level-0 table #17: 0 bytes OK
2026/04/26-15:50:26.044072 7f57977fe6c0 Delete type=0 #15
2026/04/26-15:50:26.163225 7f57977fe6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end)
+7 -3
View File
@@ -1,3 +1,7 @@
2026/02/27-00:10:01.008967 7fbc5bfff6c0 Recovering log #60
2026/02/27-00:10:01.061613 7fbc5bfff6c0 Delete type=3 #58
2026/02/27-00:10:01.061695 7fbc5bfff6c0 Delete type=0 #60
2026/04/24-22:28:39.384762 7f5797fff6c0 Recovering log #7
2026/04/24-22:28:39.395035 7f5797fff6c0 Delete type=3 #4
2026/04/24-22:28:39.395099 7f5797fff6c0 Delete type=0 #7
2026/04/24-22:28:50.922092 7f57977fe6c0 Level-0 table #13: started
2026/04/24-22:28:50.922111 7f57977fe6c0 Level-0 table #13: 0 bytes OK
2026/04/24-22:28:50.928410 7f57977fe6c0 Delete type=0 #11
2026/04/24-22:28:50.928567 7f57977fe6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000064
MANIFEST-000014
+7 -7
View File
@@ -1,7 +1,7 @@
2026/02/27-10:28:01.832073 7f56f93fe6c0 Recovering log #63
2026/02/27-10:28:01.886020 7f56f93fe6c0 Delete type=0 #63
2026/02/27-10:28:01.886089 7f56f93fe6c0 Delete type=3 #62
2026/02/27-14:29:37.854040 7f54e37ef6c0 Level-0 table #67: started
2026/02/27-14:29:37.854089 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
2026/02/27-14:29:37.861166 7f54e37ef6c0 Delete type=0 #65
2026/02/27-14:29:37.880355 7f54e37ef6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end)
2026/04/26-15:45:25.139939 7f57a5fef6c0 Recovering log #12
2026/04/26-15:45:25.149583 7f57a5fef6c0 Delete type=3 #10
2026/04/26-15:45:25.149682 7f57a5fef6c0 Delete type=0 #12
2026/04/26-15:50:26.086035 7f57977fe6c0 Level-0 table #17: started
2026/04/26-15:50:26.086057 7f57977fe6c0 Level-0 table #17: 0 bytes OK
2026/04/26-15:50:26.123168 7f57977fe6c0 Delete type=0 #15
2026/04/26-15:50:26.163252 7f57977fe6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end)
+7 -3
View File
@@ -1,3 +1,7 @@
2026/02/27-00:10:00.951941 7fbc5b7fe6c0 Recovering log #60
2026/02/27-00:10:01.006960 7fbc5b7fe6c0 Delete type=3 #58
2026/02/27-00:10:01.007022 7fbc5b7fe6c0 Delete type=0 #60
2026/04/24-22:28:39.371429 7f57a4fed6c0 Recovering log #7
2026/04/24-22:28:39.381830 7f57a4fed6c0 Delete type=3 #4
2026/04/24-22:28:39.381879 7f57a4fed6c0 Delete type=0 #7
2026/04/24-22:28:50.909112 7f57977fe6c0 Level-0 table #13: started
2026/04/24-22:28:50.909132 7f57977fe6c0 Level-0 table #13: 0 bytes OK
2026/04/24-22:28:50.915804 7f57977fe6c0 Delete type=0 #11
2026/04/24-22:28:50.928548 7f57977fe6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000064
MANIFEST-000014
+7 -7
View File
@@ -1,7 +1,7 @@
2026/02/27-10:28:01.956384 7f56e3fff6c0 Recovering log #63
2026/02/27-10:28:02.013265 7f56e3fff6c0 Delete type=0 #63
2026/02/27-10:28:02.013323 7f56e3fff6c0 Delete type=3 #62
2026/02/27-14:29:37.873932 7f54e37ef6c0 Level-0 table #67: started
2026/02/27-14:29:37.873976 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
2026/02/27-14:29:37.880214 7f54e37ef6c0 Delete type=0 #65
2026/02/27-14:29:37.880389 7f54e37ef6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end)
2026/04/26-15:45:25.166949 7f57a57ee6c0 Recovering log #12
2026/04/26-15:45:25.176930 7f57a57ee6c0 Delete type=3 #10
2026/04/26-15:45:25.177039 7f57a57ee6c0 Delete type=0 #12
2026/04/26-15:50:26.123322 7f57977fe6c0 Level-0 table #17: started
2026/04/26-15:50:26.123351 7f57977fe6c0 Level-0 table #17: 0 bytes OK
2026/04/26-15:50:26.163080 7f57977fe6c0 Delete type=0 #15
2026/04/26-15:50:26.163536 7f57977fe6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end)
+7 -3
View File
@@ -1,3 +1,7 @@
2026/02/27-00:10:01.064062 7fbc5affd6c0 Recovering log #60
2026/02/27-00:10:01.123843 7fbc5affd6c0 Delete type=3 #58
2026/02/27-00:10:01.123915 7fbc5affd6c0 Delete type=0 #60
2026/04/24-22:28:39.397236 7f57a5fef6c0 Recovering log #7
2026/04/24-22:28:39.407011 7f57a5fef6c0 Delete type=3 #4
2026/04/24-22:28:39.407078 7f57a5fef6c0 Delete type=0 #7
2026/04/24-22:28:50.902120 7f57977fe6c0 Level-0 table #13: started
2026/04/24-22:28:50.902174 7f57977fe6c0 Level-0 table #13: 0 bytes OK
2026/04/24-22:28:50.908974 7f57977fe6c0 Delete type=0 #11
2026/04/24-22:28:50.928535 7f57977fe6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000064
MANIFEST-000014
+7 -7
View File
@@ -1,7 +1,7 @@
2026/02/27-10:28:01.770730 7f56f9bff6c0 Recovering log #63
2026/02/27-10:28:01.825327 7f56f9bff6c0 Delete type=0 #63
2026/02/27-10:28:01.825401 7f56f9bff6c0 Delete type=3 #62
2026/02/27-14:29:37.867627 7f54e37ef6c0 Level-0 table #67: started
2026/02/27-14:29:37.867663 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
2026/02/27-14:29:37.873757 7f54e37ef6c0 Delete type=0 #65
2026/02/27-14:29:37.880380 7f54e37ef6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end)
2026/04/26-15:45:25.125828 7f5797fff6c0 Recovering log #12
2026/04/26-15:45:25.137218 7f5797fff6c0 Delete type=3 #10
2026/04/26-15:45:25.137347 7f5797fff6c0 Delete type=0 #12
2026/04/26-15:50:26.044212 7f57977fe6c0 Level-0 table #17: started
2026/04/26-15:50:26.044240 7f57977fe6c0 Level-0 table #17: 0 bytes OK
2026/04/26-15:50:26.085910 7f57977fe6c0 Delete type=0 #15
2026/04/26-15:50:26.163240 7f57977fe6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end)
+7 -3
View File
@@ -1,3 +1,7 @@
2026/02/27-00:10:00.890338 7fbca89ff6c0 Recovering log #60
2026/02/27-00:10:00.949636 7fbca89ff6c0 Delete type=3 #58
2026/02/27-00:10:00.949712 7fbca89ff6c0 Delete type=0 #60
2026/04/24-22:28:39.359656 7f5797fff6c0 Recovering log #7
2026/04/24-22:28:39.369413 7f5797fff6c0 Delete type=3 #4
2026/04/24-22:28:39.369477 7f5797fff6c0 Delete type=0 #7
2026/04/24-22:28:50.915944 7f57977fe6c0 Level-0 table #13: started
2026/04/24-22:28:50.915969 7f57977fe6c0 Level-0 table #13: 0 bytes OK
2026/04/24-22:28:50.922007 7f57977fe6c0 Delete type=0 #11
2026/04/24-22:28:50.928556 7f57977fe6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
+61 -85
View File
@@ -3,76 +3,35 @@
font-family: "Rivanna";
src: url('../fonts/rivanna.ttf') format("truetype");
}
:root {
/* =================== 1. ACTOR SHEET FONT STYLES =========== */
--window-header-title-font-size: 1.3rem;
--window-header-title-font-weight: normal;
--window-header-title-color: #f5f5f5;
--major-button-font-size: 1.05rem;
--major-button-font-weight: normal;
--major-button-color: #dadada;
--tab-header-font-size: 1rem;
--tab-header-font-weight: 700;
--tab-header-color: #403f3e;
--tab-header-color-active: #4a0404;
--actor-input-font-size: 0.8rem;
--actor-input-font-weight: 500;
--actor-input-color: black;
--actor-label-font-size: 0.8rem;
--actor-label-font-weight: 700;
--actor-label-color: #464331c4;
/* =================== 2. DEBUGGING HIGHLIGHTERS ============ */
--debug-background-color-red: #ff000054;
--debug-background-color-blue: #1d00ff54;
--debug-background-color-green: #54ff0054;
--debug-box-shadow-red: inset 0 0 2px red;
--debug-box-shadow-blue: inset 0 0 2px blue;
--debug-box-shadow-green: inset 0 0 2px green;
}
/*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/
/* Global styles & Font */
/* Global styles scoped to Maléfices windows only */
.fvtt-malefices .window-app {
text-align: justify;
font-size: 16px;
letter-spacing: 1px;
}
/* Fonts */
.sheet header.sheet-header h1 input,
.window-app .window-header,
/* Fonts — scoped to system sheets */
.fvtt-malefices .sheet header.sheet-header h1 input,
#actors .directory-list,
#navigation #scene-list .scene.nav-item {
font-size: 1rem;
}
/* For title, sidebar character and scene */
.fvtt-malefices .sheet nav.sheet-tabs {
font-size: 0.8rem;
}
/* For nav and title */
.window-app input,
.fvtt-malefices .item-form,
.sheet header.sheet-header .flex-group-center.flex-compteurs,
.sheet header.sheet-header .flex-group-center.flex-fatigue,
select,
button,
.item-checkbox,
.fvtt-malefices .sheet header.sheet-header .flex-group-center.flex-compteurs,
.fvtt-malefices .sheet header.sheet-header .flex-group-center.flex-fatigue,
.fvtt-malefices .item-checkbox,
#sidebar,
#players,
#navigation #nav-toggle {
font-size: 0.8rem;
}
.window-header {
background: rgba(0, 0, 0, 0.75);
}
.window-app.sheet .window-content {
margin: 0;
padding: 0;
}
.strong-text {
font-weight: bold;
}
.tabs .item.active,
.blessures-list li ul li:first-child:hover,
a:hover {
.fvtt-malefices .tabs .item.active,
.blessures-list li ul li:first-child:hover {
text-shadow: 1px 0px 0px #ff6600;
}
.rollable:hover,
@@ -81,15 +40,15 @@ a:hover {
text-shadow: 0 0 10px red;
cursor: pointer;
}
input:hover,
select:hover {
.fvtt-malefices input:hover,
.fvtt-malefices select:hover {
border-width: 4px;
border-color: #554182;
}
input:disabled {
.fvtt-malefices input:disabled {
color: #1c2058;
}
select:disabled {
.fvtt-malefices select:disabled {
color: #1c2058;
}
table {
@@ -365,46 +324,45 @@ li.folder > .folder-header h3 {
background: url("../images/ui/background_01_clear.webp");
/*background: #494e6b;*/
}
input[type="text"],
select[type="text"] {
.fvtt-malefices input[type="text"],
.fvtt-malefices select[type="text"] {
background: white;
color: #494e6b;
}
select {
.fvtt-malefices select {
background: white;
color: #494e6b;
}
/* background: #011d33 url("../images/ui/fond1.webp") repeat left top;*/
/*color: rgba(168, 139, 139, 0.5);*/
.window-app.sheet .window-content .sheet-header select[type="text"],
.window-app.sheet .window-content .sheet-header input[type="text"],
.window-app.sheet .window-content .sheet-header input[type="number"],
.window-app.sheet .window-content .sheet-body input[type="text"],
.window-app.sheet .window-content .sheet-body input[type="number"],
.window-app.sheet .window-content .sheet-body select[type="text"] {
.fvtt-malefices.window-app.sheet .window-content .sheet-header select[type="text"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="text"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="number"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="text"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="number"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body select[type="text"] {
color: rgba(19, 18, 18, 0.95);
/*color: #494e6b;*/
}
.window-app.sheet .window-content .sheet-header input[type="password"],
.window-app.sheet .window-content .sheet-header input[type="date"],
.window-app.sheet .window-content .sheet-header input[type="time"] {
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="password"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="date"],
.fvtt-malefices.window-app.sheet .window-content .sheet-header input[type="time"] {
color: rgba(19, 18, 18, 0.95);
background: url("../images/ui/background_01_clear.webp");
border: 1 none;
margin-bottom: 0.25rem;
margin-left: 2px;
}
.window-app.sheet .window-content .sheet-body input[type="password"],
.window-app.sheet .window-content .sheet-body input[type="date"],
.window-app.sheet .window-content .sheet-body input[type="time"] {
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="password"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="date"],
.fvtt-malefices.window-app.sheet .window-content .sheet-body input[type="time"] {
color: rgba(19, 18, 18, 0.95);
background: url("../images/ui/background_01_clear.webp");
border: 1 none;
margin-bottom: 0.25rem;
margin-left: 2px;
}
.window-app.sheet .window-content .sheet-body select,
.window-app.sheet .window-content .sheet-header select {
.fvtt-malefices.window-app.sheet .window-content .sheet-body select,
.fvtt-malefices.window-app.sheet .window-content .sheet-header select {
color: rgba(19, 18, 18, 0.95);
background: #fff;
border: 1 none;
@@ -428,7 +386,7 @@ section.sheet-body {
margin: 0.5rem 0 0.5rem 0.5rem;
padding: 0;
}
nav.sheet-tabs {
.fvtt-malefices nav.sheet-tabs {
font-size: 1.2rem;
font-weight: bold;
height: 3rem;
@@ -453,14 +411,14 @@ nav.sheet-tabs {
.dice-tray button {
color: #6d5923 !important;
}
nav.sheet-tabs .item {
.fvtt-malefices nav.sheet-tabs .item {
position: relative;
padding: 0 0.25rem;
color: beige;
margin-top: 4px;
margin-bottom: 4px;
}
nav.sheet-tabs .item:after {
.fvtt-malefices nav.sheet-tabs .item:after {
content: "";
position: absolute;
top: 0;
@@ -1589,22 +1547,11 @@ li {
width: 100px;
vertical-align: top;
}
.MaleficesDialog .tirage-tarot-dialog .tirage-card:hover {
position: relative;
z-index: 100;
}
.MaleficesDialog .tirage-tarot-dialog .tirage-card:hover .tirage-card-img {
transform: scale(2.2);
transform-origin: center top;
box-shadow: 3px 3px 12px rgba(0, 0, 0, 0.4);
}
.MaleficesDialog .tirage-tarot-dialog .tirage-card .tirage-card-img {
width: 100px;
border: 1px solid rgba(139, 105, 20, 0.45);
border-radius: 2px;
box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2);
transition: transform 0.2s ease, box-shadow 0.2s ease;
transform-origin: center center;
cursor: zoom-in;
}
.MaleficesDialog .tirage-tarot-dialog .tirage-card .tirage-card-name {
@@ -1658,6 +1605,29 @@ li {
border-color: #8b6914;
color: #5a0a14;
}
#tirage-card-zoom-overlay {
position: fixed;
z-index: 10000;
pointer-events: none;
border: 2px solid rgba(139, 105, 20, 0.45);
border-radius: 3px;
box-shadow: 4px 4px 20px rgba(0, 0, 0, 0.55);
opacity: 0;
transition: opacity 0.15s ease;
background: #000;
}
#tirage-card-zoom-overlay.visible {
opacity: 1;
}
#tirage-card-zoom-overlay img {
display: block;
width: 220px;
height: auto;
border-radius: 2px;
}
#tirage-card-zoom-overlay img.flip-tarot {
transform: scaleY(-1);
}
.malefices-chat-card {
font-size: 0.85rem;
color: #3d2b1f;
@@ -1957,6 +1927,7 @@ li {
/* Fixed header bar */
/* sheet-body: scroll container */
/* Override legacy height: 100% on tab divs; hide all tabs, show only the active one */
/* Description editor: ensure enough vertical room */
/* Header layout override for item sheets (smaller than actor sheet header) */
/* Tab navigation: AppV2 uses nav.tabs (not nav.sheet-tabs) */
}
@@ -1990,6 +1961,11 @@ li {
.fvtt-malefices.item .tab[data-tab].active {
display: block;
}
.fvtt-malefices.item .tab.description prose-mirror,
.fvtt-malefices.item .tab.description .editor,
.fvtt-malefices.item .tab.description .ProseMirror {
min-height: 440px;
}
.fvtt-malefices.item .sheet-header {
flex: 0 0 auto;
flex-direction: row;
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -70,8 +70,8 @@
"license": "LICENSE.txt",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-malefices/raw/branch/master/system.json",
"compatibility": {
"minimum": "11",
"verified": "13"
"minimum": "13",
"verified": "14"
},
"id": "fvtt-malefices",
"primaryTokenAttribute": "secondary.health",
+1 -1
View File
@@ -14,7 +14,7 @@
<li class="flexrow">
<label class="item-field-label-long">Lame tutélaire</label>
<select class="item-field-label-long" name="system.lametutelaire" data-dtype="String">
{{selectOptions tarots selected=system.lametutelaire nameAttr="_id" labelAttr="name"}}
{{selectOptions tarots selected=system.lametutelaire blank="— aucune —"}}
</select>
</li>
</ul>