4 Commits
Author SHA1 Message Date
uberwald d499f60386 fix: dégâts d'arme négatifs autorisés (ex. Pierre Vigueur -1)
Release Creation / build (release) Failing after 1m30s
damage.value était plafonné à 0 dans le DataModel des armes,
empêchant la saisie de valeurs négatives (règles : Pierre = Vigueur -1).
min passe de 0 à -10.
2026-08-06 23:25:03 +02:00
uberwald 1c7e05bae6 fix: Fiabilité des objets modifiable au-delà de 5 (max 5 → 10)
Comme la Rareté, la Fiabilité était plafonnée à 5 dans le DataModel
(baseItemSchema), empêchant de saisir des valeurs supérieures sur les
fiches d'items. Alignée sur les véhicules (max 10).
2026-08-06 23:10:50 +02:00
uberwald 06603ceff7 feat: affichage des Traits des armes dans le message de jet en tchat
- templates/roll-message.hbs : ligne Traits dans le bloc arme (nom + valeur)
  avec description en infobulle au survol
- less/base.less : style .weapon-traits / .weapon-trait (badges lisibles)
2026-08-06 23:08:54 +02:00
uberwald ca74ff4a88 fix: lisibilité des textes - blancs/gris illisibles passés en sombre
Release Creation / build (release) Failing after 1m23s
- Textes blancs sur fond clair (fiches, dialogues, cartes de chat) → couleurs sombres
  - dialogs.less : conteneur roll-dialog-content + labels, options, boutons, valeurs
  - actor.less : inputs/select/textarea des fiches + badges Adaptation/Mutation
  - community.less : info taille, hint, valeur de jauge, niveau de moral
  - vehicle.less : unités ; npc.less : bouton de jet ; items.less : select
- Textes gris des dialogues core Foundry (FilePicker, compendiums, tables, journaux)
  → noirs : suppression des overrides gris theme-dark, texte sombre sur .window-content,
  sidebar sombre conservée en texte clair, messages de tchat en sombre
- CSS : moins/actor/totem.less (ligne influence + bouton en sombre)
2026-08-06 22:26:36 +02:00
11 changed files with 117 additions and 86 deletions
+3 -3
View File
@@ -21,7 +21,7 @@
input:not([type="radio"]):not([type="checkbox"]), input:not([type="radio"]):not([type="checkbox"]),
select, textarea { select, textarea {
color: @color-text-light-0; color: #333;
line-height: 1.2; line-height: 1.2;
padding: 1px 4px; padding: 1px 4px;
} }
@@ -706,13 +706,13 @@
border-radius: 3px; border-radius: 3px;
&.adaptation { &.adaptation {
color: @color-text-light-0; color: @color-text-dark-header;
background: fade(@color-acid-green, 25%); background: fade(@color-acid-green, 25%);
border: 1px solid @color-acid-green; border: 1px solid @color-acid-green;
} }
&.mutation { &.mutation {
color: @color-text-light-0; color: @color-text-dark-header;
background: fade(@color-hemolymph, 30%); background: fade(@color-hemolymph, 30%);
border: 1px solid @color-hemolymph; border: 1px solid @color-hemolymph;
} }
+5 -5
View File
@@ -76,7 +76,7 @@
.community-size-info { .community-size-info {
margin: 6px 0 0; margin: 6px 0 0;
font-size: @font-size-11; font-size: @font-size-11;
color: @color-text-light-0; color: @color-text-dark-secondary;
opacity: 0.85; opacity: 0.85;
} }
@@ -94,8 +94,8 @@
margin: 0; margin: 0;
font-size: @font-size-11; font-size: @font-size-11;
font-style: italic; font-style: italic;
color: @color-text-light-0; color: @color-text-dark-secondary;
opacity: 0.7; opacity: 0.8;
} }
// Jauges de Domaines // Jauges de Domaines
@@ -123,7 +123,7 @@
.gauge-value { .gauge-value {
font-family: "DistressBlack", sans-serif; font-family: "DistressBlack", sans-serif;
font-size: @font-size-16; font-size: @font-size-16;
color: @color-text-light-0; color: @color-text-dark-header;
} }
.gauge-state { .gauge-state {
@@ -145,7 +145,7 @@
font-weight: 700; font-weight: 700;
&.high { color: @color-acid-green; } &.high { color: @color-acid-green; }
&.normal { color: @color-text-light-0; } &.normal { color: @color-text-dark-secondary; }
&.low { color: @color-honeycomb; } &.low { color: @color-honeycomb; }
&.crisis { color: @color-hemolymph; } &.crisis { color: @color-hemolymph; }
} }
+3 -3
View File
@@ -71,13 +71,13 @@
} }
.npc-roll-btn { .npc-roll-btn {
color: @color-text-light-primary; color: @color-text-dark-secondary;
opacity: 0.7; opacity: 0.75;
transition: opacity 0.15s ease; transition: opacity 0.15s ease;
&:hover { &:hover {
opacity: 1; opacity: 1;
color: @color-text-light-1; color: @theme-color-dark;
text-shadow: 0 0 6px @theme-color-highlight; text-shadow: 0 0 6px @theme-color-highlight;
} }
} }
+4 -4
View File
@@ -134,7 +134,7 @@
font-size: 0.75rem; font-size: 0.75rem;
.totem-influence-label { .totem-influence-label {
color: @color-text-light-0; color: @color-text-dark-header;
strong.totem-human { color: @totem-human-color; } strong.totem-human { color: @totem-human-color; }
strong.totem-adapted { color: @totem-adapted-color; } strong.totem-adapted { color: @totem-adapted-color; }
@@ -144,9 +144,9 @@
flex: none; flex: none;
padding: 2px 8px; padding: 2px 8px;
cursor: pointer; cursor: pointer;
color: @color-text-light-0; color: @color-text-dark-header;
background: fade(@color-hemolymph, 20%); background: fade(@color-text-light-0, 30%);
border: 1px solid @color-hemolymph; border: 1px solid @color-text-dark-secondary;
border-radius: 3px; border-radius: 3px;
.transition(); .transition();
+1 -1
View File
@@ -152,7 +152,7 @@
.unit { .unit {
font-size: @font-size-11; font-size: @font-size-11;
color: @color-text-light-0; color: @color-text-dark-secondary;
opacity: 0.8; opacity: 0.8;
} }
+61 -41
View File
@@ -13,28 +13,42 @@ body.system-vermine2047 {
} }
// Override Foundry Core default CSS custom properties // Override Foundry Core default CSS custom properties
// for better readability on the dark Vermine2047 theme. // for better readability on the light Vermine2047 theme.
// AppV2 windows (sheets) use .themed.theme-dark on their content // Core windows (FilePicker, dialogs, compendium, RollTable, Journal, …) and chat
.system-vermine2047 .themed.theme-dark { // messages sit on the light box_background texture: force dark readable text.
--color-text-primary: #888888; // The dark sidebar keeps Foundry's default light-on-dark text colors.
--color-text-emphatic: #999999; body.system-vermine2047.theme-dark {
--color-text-secondary: #777777; .window-content,
.roll-table-sheet,
.journal-sheet,
.document-sheet,
.settings-sheet {
color: @color-text-dark-primary;
--color-text-primary: @color-text-dark-primary;
--color-text-emphatic: @color-text-dark-header;
--color-text-secondary: @color-text-dark-secondary;
--color-text-subtle: #666666; --color-text-subtle: #666666;
--color-text-light-highlight: #888888; --color-text-light-highlight: @color-acid-green;
--color-text-light-heading: #777777; --color-text-light-heading: @color-text-dark-header;
--color-text-light-primary: #666666; --color-text-light-primary: @color-text-dark-secondary;
--color-text-dark-primary: @color-text-dark-primary;
--color-text-dark-secondary: @color-text-dark-secondary;
--color-text-dark-header: @color-text-dark-header;
--text-color: @color-text-dark-primary;
}
} }
// Old-style Application windows (settings-config, dialogs) inherit from body.theme-dark #chat-log .message,
body.system-vermine2047.theme-dark { .chat-log .message {
--color-text-primary: #888888; .message-content {
--color-text-emphatic: #999999; color: @color-text-dark-primary;
--color-text-secondary: #777777; }
--color-text-subtle: #666666;
--color-text-light-highlight: #888888; header.message-header {
--color-text-light-heading: #777777; color: #fff;
--color-text-light-primary: #666666; text-shadow: 0 0 5px #000;
}
} }
#settings-config button, #settings-config button,
@@ -44,31 +58,13 @@ body.system-vermine2047.theme-dark {
color: #000000; color: #000000;
} }
// Core sheets the system doesn't restyle (RollTable, Journal, …) inherit the
// gray text overrides above, which are unreadable on their dark backgrounds.
// Restore Foundry's default light-on-dark text colors for those apps (dark theme only).
body.system-vermine2047.theme-dark {
.roll-table-sheet,
.journal-sheet,
.document-sheet,
.settings-sheet {
--color-text-primary: var(--color-light-2);
--color-text-emphatic: var(--color-light-1);
--color-text-secondary: var(--color-light-3);
--color-text-subtle: var(--color-light-5);
--color-text-light-highlight: #f0f0e0;
--color-text-light-heading: #c9c7b8;
--color-text-light-primary: #b5b3a4;
}
}
body.system-vermine2047.theme-dark .form-group > label { body.system-vermine2047.theme-dark .form-group > label {
color: #777777; color: @color-text-dark-secondary;
} }
#settings-config p, #settings-config p,
#settings-config .hint { #settings-config .hint {
color: #777777; color: @color-text-dark-secondary;
} }
img { img {
@@ -837,6 +833,30 @@ ol.chat-log {
} }
} }
} }
.weapon-traits {
gap: 4px 6px;
margin-top: 4px;
padding-top: 4px;
border-top: 1px dashed fade(@color-hemolymph, 35%);
align-items: center;
.weapon-traits-label {
flex: none;
}
.weapon-trait {
flex: none;
font-family: "Roboto", sans-serif;
font-size: @font-size-11;
font-weight: 600;
padding: 1px 6px;
border: 1px solid @color-border-dark-4;
border-radius: 3px;
background: fade(@color-acid-green, 10%);
cursor: help;
}
}
} }
// ── Échange de coups ───────────────────────────────────────────── // ── Échange de coups ─────────────────────────────────────────────
@@ -907,7 +927,7 @@ ol.chat-log {
font-size: @font-size-11; font-size: @font-size-11;
padding: 3px 12px; padding: 3px 12px;
cursor: pointer; cursor: pointer;
color: @color-text-light-0; color: @theme-color-dark;
background: fade(@color-hemolymph, 25%); background: fade(@color-hemolymph, 25%);
border: 1px solid @color-hemolymph; border: 1px solid @color-hemolymph;
border-radius: 3px; border-radius: 3px;
@@ -962,7 +982,7 @@ ol.chat-log {
font-size: @font-size-11; font-size: @font-size-11;
padding: 3px 12px; padding: 3px 12px;
cursor: pointer; cursor: pointer;
color: @color-text-light-0; color: @theme-color-dark;
background: fade(@color-hemolymph, 25%); background: fade(@color-hemolymph, 25%);
border: 1px solid @color-hemolymph; border: 1px solid @color-hemolymph;
border-radius: 3px; border-radius: 3px;
@@ -1084,7 +1104,7 @@ ol.chat-log {
font-size: @font-size-12; font-size: @font-size-12;
padding: 5px 14px; padding: 5px 14px;
cursor: pointer; cursor: pointer;
color: @color-text-light-0; color: @theme-color-dark;
background: fade(@color-hemolymph, 20%); background: fade(@color-hemolymph, 20%);
border: 1px solid @color-hemolymph; border: 1px solid @color-hemolymph;
border-radius: 3px; border-radius: 3px;
+24 -24
View File
@@ -148,7 +148,7 @@ iframe {
padding: 10px; padding: 10px;
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
color: @color-text-light-0; color: @theme-color-dark;
.dice-pool { .dice-pool {
flex: 1; flex: 1;
@@ -201,7 +201,7 @@ iframe {
.ability-score { .ability-score {
gap: 4px; gap: 4px;
font-size: @font-size-12; font-size: @font-size-12;
color: @color-text-light-0; color: @color-text-dark-secondary;
opacity: 0.85; opacity: 0.85;
#abilityScoreValue { #abilityScoreValue {
@@ -290,11 +290,11 @@ iframe {
font-size: @font-size-12; font-size: @font-size-12;
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
text-transform: none; text-transform: none;
color: @color-text-light-0; color: @color-text-dark-primary;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: @color-text-light-highlight; color: @color-acid-green;
} }
} }
@@ -317,7 +317,7 @@ iframe {
> label.label { > label.label {
font-size: @font-size-11; font-size: @font-size-11;
color: @color-text-light-0; color: @color-text-dark-secondary;
white-space: nowrap; white-space: nowrap;
} }
@@ -331,7 +331,7 @@ iframe {
font-size: @font-size-12; font-size: @font-size-12;
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
text-transform: none; text-transform: none;
color: @color-text-light-0; color: @color-text-dark-primary;
} }
.item-list { .item-list {
@@ -343,11 +343,11 @@ iframe {
font-size: @font-size-11; font-size: @font-size-11;
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
text-transform: none; text-transform: none;
color: @color-text-light-0; color: @color-text-dark-primary;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: @color-text-light-highlight; color: @color-acid-green;
} }
} }
} }
@@ -374,14 +374,14 @@ iframe {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 4px; gap: 4px;
color: @color-text-light-0; color: @color-text-dark-primary;
font-size: @font-size-12; font-size: @font-size-12;
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
text-transform: none; text-transform: none;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: @color-text-light-highlight; color: @color-acid-green;
} }
small { small {
@@ -392,8 +392,8 @@ iframe {
.totem-hint { .totem-hint {
width: 100%; width: 100%;
font-size: @font-size-11; font-size: @font-size-11;
color: @color-text-light-0; color: @color-text-dark-secondary;
opacity: 0.6; opacity: 0.8;
font-style: italic; font-style: italic;
} }
} }
@@ -448,7 +448,7 @@ iframe {
.weapon-detail { .weapon-detail {
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
font-size: @font-size-11; font-size: @font-size-11;
color: @color-text-light-0; color: @color-text-dark-primary;
strong { text-transform: uppercase; } strong { text-transform: uppercase; }
} }
@@ -466,7 +466,7 @@ iframe {
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
text-transform: none; text-transform: none;
font-size: @font-size-12; font-size: @font-size-12;
color: @color-text-light-0; color: @color-text-dark-primary;
cursor: pointer; cursor: pointer;
input[type="radio"] { flex: none; } input[type="radio"] { flex: none; }
@@ -494,7 +494,7 @@ iframe {
padding: 2px 8px; padding: 2px 8px;
font-size: @font-size-11; font-size: @font-size-11;
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
color: @color-text-light-0; color: @color-text-dark-header;
background: fade(@color-hemolymph, 20%); background: fade(@color-hemolymph, 20%);
border: 1px solid fade(@color-hemolymph, 50%); border: 1px solid fade(@color-hemolymph, 50%);
border-radius: 3px; border-radius: 3px;
@@ -550,12 +550,12 @@ iframe {
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
text-transform: none; text-transform: none;
font-size: @font-size-12; font-size: @font-size-12;
color: @color-text-light-0; color: @color-text-dark-primary;
cursor: pointer; cursor: pointer;
input[type="radio"] { flex: none; } input[type="radio"] { flex: none; }
&:hover { color: @color-text-light-highlight; } &:hover { color: @color-acid-green; }
} }
} }
@@ -571,8 +571,8 @@ iframe {
margin: 0; margin: 0;
font-size: @font-size-11; font-size: @font-size-11;
font-style: italic; font-style: italic;
color: @color-text-light-0; color: @color-text-dark-secondary;
opacity: 0.75; opacity: 0.8;
} }
} }
@@ -600,7 +600,7 @@ iframe {
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
font-size: @font-size-13; font-size: @font-size-13;
font-weight: 700; font-weight: 700;
color: @color-text-light-0; color: @color-text-dark-primary;
} }
} }
} }
@@ -613,7 +613,7 @@ iframe {
.experience-group { .experience-group {
font-size: @font-size-11; font-size: @font-size-11;
color: @color-text-light-0; color: @color-text-dark-secondary;
opacity: 0.8; opacity: 0.8;
#exp-group { #exp-group {
@@ -628,7 +628,7 @@ iframe {
font-size: @font-size-11; font-size: @font-size-11;
padding: 3px 12px; padding: 3px 12px;
cursor: pointer; cursor: pointer;
color: @color-text-light-0; color: @theme-color-dark;
background: fade(@color-acid-green, 15%); background: fade(@color-acid-green, 15%);
border: 1px solid @color-acid-green; border: 1px solid @color-acid-green;
border-radius: 3px; border-radius: 3px;
@@ -779,7 +779,7 @@ iframe {
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
font-size: @font-size-14; font-size: @font-size-14;
font-weight: 700; font-weight: 700;
color: @color-text-light-0; color: @color-text-dark-header;
} }
} }
} }
@@ -798,7 +798,7 @@ iframe {
font-size: @font-size-12; font-size: @font-size-12;
padding: 6px 10px; padding: 6px 10px;
cursor: pointer; cursor: pointer;
color: @color-text-light-0; color: @theme-color-dark;
background: fade(@color-hemolymph, 15%); background: fade(@color-hemolymph, 15%);
border: 1px solid @color-hemolymph; border: 1px solid @color-hemolymph;
border-radius: 3px; border-radius: 3px;
+1 -2
View File
@@ -66,11 +66,10 @@
select { select {
.custom-select-style(); .custom-select-style();
color: @color-text-light-1; color: @color-text-dark-primary;
font-family: "DistressBlack", sans-serif; font-family: "DistressBlack", sans-serif;
font-size: 0.875rem; font-size: 0.875rem;
text-align: center; text-align: center;
text-shadow: 0 0 3px rgba(0, 0, 0, 0.9);
option { option {
background: @color-bg-option; background: @color-bg-option;
+1 -1
View File
@@ -253,7 +253,7 @@ export function baseItemSchema() {
return { return {
description: new fields.HTMLField({ required: true, initial: "", textSearch: true }), description: new fields.HTMLField({ required: true, initial: "", textSearch: true }),
rarity: raritySchema(), rarity: raritySchema(),
reliability: new fields.NumberField({ ...reqInt, initial: 3, min: 1, max: 5 }), reliability: new fields.NumberField({ ...reqInt, initial: 3, min: 1, max: 10 }),
handicap: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), handicap: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
quantity: new fields.NumberField({ ...reqInt, initial: 1, min: 1 }), quantity: new fields.NumberField({ ...reqInt, initial: 1, min: 1 }),
weight: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), weight: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
+1 -1
View File
@@ -19,7 +19,7 @@ export default class VermineWeaponData extends foundry.abstract.TypeDataModel {
min_range: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), min_range: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
max_range: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), max_range: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
damage: new fields.SchemaField({ damage: new fields.SchemaField({
value: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), value: new fields.NumberField({ ...reqInt, initial: 0, min: -10 }),
type: new fields.StringField({ required: true, initial: "" }), type: new fields.StringField({ required: true, initial: "" }),
addVigor: new fields.BooleanField({ required: true, initial: false }) addVigor: new fields.BooleanField({ required: true, initial: false })
}), }),
+12
View File
@@ -36,6 +36,18 @@
{{param.weapon.system.ammo}} {{param.weapon.system.ammo}}
</span> </span>
</div> </div>
{{#if param.weapon.system.traits}}
<div class="flexrow flex-wrap weapon-traits">
<span class="weapon-detail weapon-traits-label">
<strong>{{localize "VERMINE.traits"}}:</strong>
</span>
{{#each param.weapon.system.traits as |trait key|}}
{{#if trait}}
<span class="weapon-trait" data-tooltip="{{trait.description}}">{{trait.name}}{{#if trait.value}} ({{trait.value}}){{/if}}</span>
{{/if}}
{{/each}}
</div>
{{/if}}
</div> </div>
{{/if}} {{/if}}