Files
fvtt-celestopol/styles/character.less
LeRatierBretonnier 9dbd614c5a feat: gestion de l'expérience (XP)
- Schéma xp dans CelestopolCharacter : actuel (éditable), log[] ({montant, raison, date}), depense (calculé dans prepareDerivedData)
- Bouton 'Dépenser XP' → DialogV2 (montant + raison) : décrémente actuel, logge l'entrée
- Suppression d'entrée de log avec remboursement des points (mode édition)
- Section XP en haut de l'onglet Biographie : compteurs, tableau du log, référentiel des coûts
- i18n : section CELESTOPOL.XP.* complète
- CSS : .xp-section avec compteurs, tableau de log et accordéon de référence

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-31 00:33:59 +02:00

712 lines
18 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import "mixins";
// ─── Character sheet specifics ───────────────────────────────────────────────
.fvtt-celestopol.character {
// ── header-stats-row : initiative + attributs sur une seule ligne ──────────
.header-stats-row {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 4px;
align-items: flex-end;
}
.header-stat {
display: flex;
flex-direction: column;
align-items: center;
background: rgba(0,0,0,0.25);
border: 1px solid var(--cel-orange);
border-radius: 4px;
padding: 3px 8px;
min-width: 54px;
label {
font-size: 0.58em;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--cel-orange-light);
white-space: nowrap;
}
.stat-value, .attr-display {
color: var(--cel-orange);
font-family: var(--cel-font-title);
font-size: 1.05em;
font-weight: bold;
line-height: 1.2;
}
.attr-sep { color: rgba(196,154,26,0.5); margin: 0 1px; font-size: 0.85em; }
input.attr-val, input.attr-max {
width: 24px;
text-align: center;
background: transparent;
border: none;
border-bottom: 1px solid var(--cel-orange-light);
color: var(--cel-orange);
font-family: var(--cel-font-title);
font-size: 1em;
font-weight: bold;
}
}
// Stats × Domaines grid
.stats-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
padding: 8px 0;
.stat-block {
border: 1px solid var(--cel-border);
border-radius: 4px;
overflow: hidden;
.stat-header {
background: var(--cel-green);
background-image: url("../assets/ui/fond_cadrille.jpg");
background-blend-mode: soft-light;
color: var(--cel-orange);
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 8px;
border-bottom: 1px solid rgba(196,154,26,0.4);
.stat-name {
font-family: var(--cel-font-title);
font-weight: bold;
font-size: 1em;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.stat-res {
display: flex;
align-items: center;
gap: 4px;
font-size: 0.8em;
label { color: var(--cel-orange-light); }
input[type="number"] { width: 30px; .cel-input-std(); }
.stat-res-value {
font-size: 1.3em;
font-weight: bold;
min-width: 24px;
text-align: center;
}
}
}
.skills-list {
background: var(--cel-cream);
.skill-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 3px 8px;
border-bottom: 1px solid rgba(122,92,32,0.18);
font-size: 0.85em;
// Alternating cream-dark rows for legibility
&:nth-child(even) { background: var(--cel-cream-dark); }
&.rollable { .cel-rollable(); }
.skill-name { flex: 1; }
.skill-value {
font-weight: bold;
min-width: 24px;
text-align: center;
color: var(--cel-orange);
}
.skill-value-input {
width: 36px;
.cel-input-std();
text-align: center;
}
// Points de niveau Art Déco (remplacent les cases à cocher)
.skill-checkboxes-container {
.skill-checkboxes {
display: flex;
gap: 3px;
align-items: center;
}
.skill-level-dot {
display: inline-block;
width: 13px;
height: 13px;
border: 1px solid var(--cel-border);
border-radius: 1px;
background: rgba(255,255,255,0.3);
vertical-align: middle;
transition: background 0.1s, border-color 0.1s;
&.filled {
background: var(--cel-orange);
border-color: var(--cel-border);
}
&[data-action] { cursor: pointer; }
}
}
}
}
}
}
// Items (anomalies, aspects, attributs)
.items-section {
display: flex;
flex-direction: column;
gap: 8px;
padding: 8px 0;
.items-group {
.items-header {
.cel-section-header();
display: flex;
justify-content: space-between;
align-items: center;
a { color: var(--cel-orange); cursor: pointer; }
}
.item-row { .cel-item-row(); }
}
}
// Tracks (Blessures, Destin, Spleen)
.track-section {
border: 1px solid var(--cel-border);
border-radius: 4px;
margin-bottom: 12px;
overflow: hidden;
.track-header {
background: var(--cel-green);
background-image: url("../assets/ui/fond_cadrille.jpg");
background-blend-mode: soft-light;
color: var(--cel-orange);
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 8px;
border-bottom: 1px solid rgba(196,154,26,0.4);
.track-title {
font-family: var(--cel-font-title);
font-weight: bold;
text-transform: uppercase;
font-size: 0.9em;
}
.track-title-destin {
cursor: help;
border-bottom: 1px dashed currentColor;
text-decoration: none;
}
}
.track-boxes {
display: flex;
padding: 8px;
gap: 8px;
flex-wrap: wrap;
background: var(--cel-cream);
.track-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 2px;
width: 22px;
min-height: 22px;
border: 2px solid var(--cel-border);
border-radius: 2px;
background: rgba(255,255,255,0.45);
transition: background 0.1s, border-color 0.1s;
&.filled {
background: var(--cel-orange);
border-color: var(--cel-orange);
}
&[data-action] { cursor: pointer; }
.box-label {
font-size: 0.6em;
color: var(--cel-border);
line-height: 1;
}
&.filled .box-label { color: rgba(30,10,0,0.65); }
}
}
.track-level {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 8px;
background: rgba(139,115,85,0.1);
font-size: 0.85em;
label { color: var(--cel-border); }
input[type="number"] { width: 40px; .cel-input-std(); }
}
}
// Factions table
.factions-table {
width: 100%;
border-collapse: collapse;
font-size: 0.9em;
thead tr {
background: var(--cel-green);
background-image: url("../assets/ui/fond_cadrille.jpg");
background-blend-mode: soft-light;
color: var(--cel-orange);
th { padding: 5px 8px; font-family: var(--cel-font-title); letter-spacing: 0.06em; }
}
.faction-row {
&:nth-child(odd) td { background: rgba(122,92,32,0.06); }
&:nth-child(even) td { background: var(--cel-cream-dark); }
td { padding: 4px 8px; border-bottom: 1px solid rgba(122,92,32,0.2); }
&.custom td { font-style: italic; color: #666; }
.faction-checkboxes-container {
display: flex;
align-items: center;
gap: 8px;
}
.faction-checkboxes {
display: flex;
gap: 3px;
align-items: center;
}
.faction-dot {
display: inline-block;
width: 12px;
height: 12px;
border: 1px solid var(--cel-border);
border-radius: 1px;
background: rgba(255,255,255,0.3);
transition: background 0.1s;
&.filled { background: var(--cel-orange); border-color: var(--cel-orange); }
&[data-action] { cursor: pointer; }
}
.faction-count {
font-size: 0.85em;
font-weight: bold;
color: var(--cel-orange);
min-width: 16px;
text-align: center;
}
.faction-value input[type="number"] {
width: 50px;
.cel-input-std();
text-align: center;
}
}
}
// Biography / Equipment
.equipments-section {
margin-bottom: 12px;
.section-header { .cel-section-header(); display: flex; justify-content: space-between; }
.item-row { .cel-item-row(); }
.item-qty { font-size: 0.8em; color: var(--cel-border); }
}
// Onglet Équipement
.tab.equipement {
.equip-section {
margin-bottom: 14px;
.section-header {
.cel-section-header();
display: flex;
align-items: center;
gap: 8px;
i { opacity: 0.75; }
span { flex: 1; }
a { color: var(--cel-orange); cursor: pointer; }
}
.item-row {
.cel-item-row();
.item-tag {
font-size: 0.75em;
padding: 1px 7px;
border-radius: 10px;
background: rgba(12,76,12,0.15);
border: 1px solid rgba(12,76,12,0.3);
color: #3a5a1e;
white-space: nowrap;
&.malus { background: rgba(192,68,68,0.1); border-color: rgba(192,68,68,0.35); color: #922; }
}
}
.equip-empty {
font-size: 0.85em;
font-style: italic;
color: var(--cel-border);
padding: 4px 8px;
}
}
}
.biography-section, .notes-section {
margin-bottom: 12px;
.section-header { .cel-section-header(); }
.enriched-html { font-size: 0.9em; line-height: 1.6; }
}
// ── Section Expérience (onglet Biographie) ──────────────────────────────
.xp-section {
margin-bottom: 14px;
.section-header { .cel-section-header(); }
.xp-counters {
display: flex;
align-items: center;
gap: 12px;
padding: 6px 0 8px;
flex-wrap: wrap;
.xp-counter {
display: flex;
flex-direction: column;
align-items: center;
background: rgba(0,0,0,0.18);
border: 1px solid var(--cel-orange);
border-radius: 4px;
padding: 4px 12px;
min-width: 80px;
label {
font-size: 0.6em;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--cel-orange-light);
white-space: nowrap;
}
input[type="number"] {
width: 52px;
text-align: center;
.cel-input-std();
font-family: var(--cel-font-title);
font-size: 1.1em;
font-weight: bold;
color: var(--cel-orange);
}
}
.xp-depense-counter {
border-color: rgba(196,154,26,0.4);
.xp-depense-value {
font-family: var(--cel-font-title);
font-size: 1.1em;
font-weight: bold;
color: rgba(196,154,26,0.7);
}
}
.xp-btn-depenser {
background: var(--cel-green);
border: 1px solid var(--cel-orange);
color: var(--cel-orange);
font-size: 0.78em;
padding: 5px 12px;
cursor: pointer;
font-family: var(--cel-font-title);
text-transform: uppercase;
letter-spacing: 0.04em;
border-radius: 2px;
transition: background 0.15s;
margin-left: auto;
&:hover { background: var(--cel-green-light); }
i { margin-right: 4px; }
}
}
.xp-log-table {
width: 100%;
border-collapse: collapse;
font-size: 0.82em;
margin-bottom: 8px;
thead tr {
background: rgba(12,76,12,0.35);
th {
color: var(--cel-orange-light);
font-size: 0.75em;
text-transform: uppercase;
letter-spacing: 0.04em;
padding: 3px 6px;
text-align: left;
border-bottom: 1px solid rgba(196,154,26,0.3);
}
}
tbody tr {
border-bottom: 1px solid rgba(196,154,26,0.12);
&:nth-child(even) { background: rgba(0,0,0,0.08); }
td { padding: 3px 6px; color: var(--cel-text-dark, #3a2a0a); }
.xp-date { white-space: nowrap; color: var(--cel-border); font-size: 0.9em; }
.xp-montant { font-weight: bold; color: #c04040; white-space: nowrap; }
.xp-suppr-cell {
text-align: center;
.xp-btn-suppr {
background: none;
border: none;
color: rgba(180,60,60,0.6);
cursor: pointer;
font-size: 0.9em;
padding: 1px 4px;
&:hover { color: #c04040; }
}
}
}
}
// Référentiel de coûts (accordéon)
.xp-ref {
margin-top: 6px;
summary {
font-size: 0.78em;
color: var(--cel-orange-light);
cursor: pointer;
letter-spacing: 0.03em;
text-transform: uppercase;
user-select: none;
&:hover { color: var(--cel-orange); }
}
.xp-ref-table {
width: 100%;
border-collapse: collapse;
font-size: 0.78em;
margin-top: 5px;
opacity: 0.75;
th {
color: var(--cel-orange-light);
text-transform: uppercase;
font-size: 0.85em;
letter-spacing: 0.03em;
padding: 2px 6px;
border-bottom: 1px solid rgba(196,154,26,0.25);
text-align: left;
}
td {
padding: 2px 6px;
border-bottom: 1px solid rgba(196,154,26,0.1);
color: var(--cel-text-dark, #3a2a0a);
}
}
}
}
// ── Bloc Anomalie sur l'onglet Domaines ──────────────────────────────────
.anomaly-block {
border: 1px solid rgba(196,154,26,0.5);
border-radius: 4px;
margin-bottom: 12px;
overflow: hidden;
.anomaly-block-header {
background: var(--cel-green);
background-image: url("../assets/ui/fond_cadrille.jpg");
background-blend-mode: soft-light;
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 10px;
border-bottom: 2px solid var(--cel-orange);
.anomaly-block-title {
font-family: var(--cel-font-title);
font-size: 0.85em;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--cel-orange);
}
a { color: var(--cel-orange-light); &:hover { color: var(--cel-orange); } }
}
.anomaly-empty {
padding: 12px;
text-align: center;
color: var(--cel-border);
font-style: italic;
font-size: 0.85em;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
i { font-size: 1.1em; }
}
.anomaly-content {
padding: 8px 10px;
background: var(--cel-green-dark, #0c4c0c);
.anomaly-info-row {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 7px;
.anomaly-icon {
width: 40px;
height: 40px;
object-fit: cover;
border: 1px solid var(--cel-orange);
border-radius: 3px;
}
.anomaly-details {
flex: 1;
.anomaly-name {
font-family: var(--cel-font-title);
font-size: 1em;
color: var(--cel-orange);
font-weight: bold;
}
.anomaly-subtype {
font-size: 0.75em;
color: var(--cel-cream, #f0e8d4);
text-transform: uppercase;
letter-spacing: 0.05em;
opacity: 0.75;
}
}
.anomaly-controls {
display: flex;
gap: 6px;
a { color: rgba(240,232,212,0.5); font-size: 0.9em; &:hover { color: var(--cel-orange); } }
}
}
.anomaly-level-row {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 6px;
.anomaly-level-label {
font-size: 0.72em;
text-transform: uppercase;
color: var(--cel-cream, #f0e8d4);
opacity: 0.7;
white-space: nowrap;
}
.anomaly-level-dots {
display: flex;
gap: 4px;
.anomaly-level-dot {
width: 10px;
height: 10px;
border-radius: 50%;
border: 2px solid var(--cel-orange);
&.active { background: var(--cel-orange); }
&.inactive { background: transparent; border-color: rgba(196,154,26,0.25); }
}
}
}
.anomaly-uses-row {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
.anomaly-uses-label {
font-size: 0.72em;
text-transform: uppercase;
color: var(--cel-cream, #f0e8d4);
opacity: 0.7;
white-space: nowrap;
}
.anomaly-uses-dots {
display: flex;
gap: 4px;
.anomaly-dot {
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid var(--cel-orange);
&.available { background: var(--cel-orange); }
&.spent { background: transparent; }
&.inactive { background: transparent; border-color: rgba(196,154,26,0.25); }
}
}
.anomaly-use-btn {
background: var(--cel-green);
border: 1px solid var(--cel-orange);
color: var(--cel-orange);
font-size: 0.72em;
padding: 2px 8px;
cursor: pointer;
font-family: var(--cel-font-title);
text-transform: uppercase;
letter-spacing: 0.04em;
border-radius: 2px;
transition: background 0.15s;
&:hover:not(:disabled) { background: var(--cel-green-light); }
&:disabled { opacity: 0.4; cursor: default; }
}
.anomaly-reset-btn {
color: rgba(240,232,212,0.5);
font-size: 0.9em;
&:hover { color: var(--cel-orange); }
}
}
.anomaly-skills {
margin-top: 6px;
display: flex;
flex-wrap: wrap;
gap: 4px;
align-items: center;
.anomaly-skills-label {
font-size: 0.7em;
color: var(--cel-cream, #f0e8d4);
opacity: 0.6;
text-transform: uppercase;
}
.anomaly-skill-chip {
background: rgba(196,154,26,0.18);
border: 1px solid rgba(196,154,26,0.45);
border-radius: 3px;
padding: 1px 5px;
font-size: 0.7em;
color: var(--cel-cream, #f0e8d4);
}
}
}
}
}