Rend le tableau de bord du jeu plus compact, sobre et sans défilement de page

Réutilise le système déjà en place pour l'édition d'objet (body.objectEditBody
+ .content-objectEdit) : la page occupe exactement la hauteur de la fenêtre,
seules les deux colonnes défilent chacune de leur côté si besoin - plus la
page elle-même, qui ne doit jamais défiler.

Colonne de gauche ("Créer") : nouvelle nav à une ligne (.navRow/.navList,
icône + libellé, sous-titre en info-bulle) plutôt que des cartes à deux
lignes - plus dense, plus sobre.

Colonne de droite ("Objets définis") : remplace les cartes par le tableau
compact à en-tête collant déjà utilisé pour les champs d'un objet
(.fieldsTable) - format nettement plus adapté à beaucoup de lignes.

Réduit aussi le padding par défaut de .listRow/.dangerZone (encore utilisés
par la page Variables), dans le même esprit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-25 10:31:43 +02:00
co-authored by Claude Sonnet 5
parent 20ef86e039
commit ac0f003663
2 changed files with 39 additions and 40 deletions
+14 -6
View File
@@ -36,24 +36,32 @@ button.danger{ color:var(--danger); border-color:rgba(226,104,95,.4); }
.addBtn{ display:inline-block; margin:10px 0; padding:9px 14px; border-radius:6px; border:1px dashed var(--border); color:var(--accent); text-decoration:none; font-size:13px; }
.actionsRow{ margin-top:16px; }
.list{ display:flex; flex-direction:column; gap:6px; }
.listRow{ display:block; padding:10px 12px; border:1px solid var(--border); border-radius:8px; background:var(--panel); text-decoration:none; color:var(--text); }
.list{ display:flex; flex-direction:column; gap:4px; }
.listRow{ display:block; padding:7px 10px; border:1px solid var(--border); border-radius:6px; background:var(--panel); text-decoration:none; color:var(--text); }
.listRow:hover{ background:var(--panel2); }
.listRowFlex{ display:flex; align-items:center; justify-content:space-between; gap:10px; }
.listRowFlex .rowLink{ flex:1; text-decoration:none; color:var(--text); }
.listRowFlex form{ margin:0; }
.rowTitle{ font-size:14px; }
.rowSub{ font-size:11px; color:var(--text-dim); margin-top:2px; }
.rowTitle{ font-size:13px; }
.rowSub{ font-size:10.5px; color:var(--text-dim); margin-top:1px; }
.rowActions{ display:flex; gap:6px; align-items:center; }
/* Nav compacte à une seule ligne (icône + libellé) — pour une liste
d'actions fixe (ex. tableau de bord d'un jeu) où le sous-titre de
.listRow prendrait trop de place utile pour rien : sobre et dense plutôt
que "carte" explicative. */
.navList{ display:flex; flex-direction:column; gap:3px; }
.navRow{ display:flex; align-items:center; gap:8px; padding:7px 10px; border:1px solid var(--border); border-radius:6px; background:var(--panel); text-decoration:none; color:var(--text); font-size:12.5px; }
.navRow:hover{ background:var(--panel2); border-color:var(--accent); }
.hint{ font-size:11.5px; color:var(--text-dim); line-height:1.5; }
.autosaveStatus{ display:inline-flex; align-items:center; gap:6px; transition:color .2s ease; }
.autosaveStatus.saving{ color:var(--text-dim); }
.autosaveStatus.saved{ color:#7bd88f; }
.warningBanner{ border:1px solid var(--danger); background:rgba(226,104,95,.1); color:var(--text);
border-radius:8px; padding:10px 14px; font-size:12.5px; margin:12px 0; }
.dangerZone{ border:1px solid rgba(226,104,95,.4); border-radius:10px; padding:14px; margin-top:20px; }
.dangerZone h3{ color:var(--danger); }
.dangerZone{ border:1px solid rgba(226,104,95,.4); border-radius:8px; padding:10px 12px; margin-top:14px; }
.dangerZone h3{ color:var(--danger); margin-top:0; }
.fieldsExistingRow{ display:flex; align-items:center; justify-content:space-between;
padding:8px 10px; border:1px solid var(--border); border-radius:6px; margin-bottom:6px; font-size:12.5px; }
.fieldsExistingRow form{ margin:0; }
+25 -34
View File
@@ -1,6 +1,7 @@
{% extends "base.html" %}
{% block title %}{{ game.name }} — Forge Engine{% endblock %}
{% block content_class %}content-wide{% endblock %}
{% block content_class %}content-wide content-objectEdit{% endblock %}
{% block body_class %}objectEditBody{% endblock %}
{% block breadcrumb %}<li class="is-active"><a>{{ game.name }}</a></li>{% endblock %}
{% block content %}
<h1 class="title">{{ game.name }}</h1>
@@ -9,27 +10,12 @@
<div class="twoCol">
<div class="colLeft">
<h2>Créer</h2>
<div class="list">
<a href="{{ url_for('screens_list', slug=game.slug) }}" class="listRow">
<div class="rowTitle">🖥️ Écrans du jeu</div>
<div class="rowSub">Créer et enchaîner les écrans jouables (accueil, formulaires, scènes...)</div>
</a>
<a href="{{ url_for('element_types', slug=game.slug) }}" class="listRow">
<div class="rowTitle">🧩 Éléments de jeu</div>
<div class="rowSub">Catalogue réutilisable (Personnage, Outil, IA...)</div>
</a>
<a href="{{ url_for('game_variables', slug=game.slug) }}" class="listRow">
<div class="rowTitle">🔧 Variables</div>
<div class="rowSub">Valeurs globales au jeu entier (ex. porte ouverte, niveau débloqué...)</div>
</a>
<a href="{{ url_for('game_play', slug=game.slug) }}" target="_blank" class="listRow">
<div class="rowTitle">▶️ Jouer</div>
<div class="rowSub">Aperçu jouable du jeu</div>
</a>
<a href="{{ url_for('object_new', slug=game.slug) }}" class="listRow">
<div class="rowTitle">🗂️ Objet</div>
<div class="rowSub">Comme une table de base de données : un nom, et des champs typés</div>
</a>
<div class="navList">
<a href="{{ url_for('screens_list', slug=game.slug) }}" class="navRow" title="Créer et enchaîner les écrans jouables">🖥️ Écrans du jeu</a>
<a href="{{ url_for('element_types', slug=game.slug) }}" class="navRow" title="Catalogue réutilisable (Personnage, Outil, IA...)">🧩 Éléments de jeu</a>
<a href="{{ url_for('game_variables', slug=game.slug) }}" class="navRow" title="Valeurs globales au jeu entier">🔧 Variables</a>
<a href="{{ url_for('game_play', slug=game.slug) }}" target="_blank" class="navRow" title="Aperçu jouable du jeu">▶️ Jouer</a>
<a href="{{ url_for('object_new', slug=game.slug) }}" class="navRow" title="Comme une table de base de données : un nom, et des champs typés">🗂️ Objet</a>
</div>
<div class="dangerZone">
@@ -51,18 +37,23 @@
<div class="colRight">
<h2>Objets définis</h2>
{% if definitions %}
<div class="list">
{% for d in definitions %}
<div class="listRow listRowFlex">
<a href="{{ url_for('object_view', slug=game.slug, definition_id=d.id) }}" class="rowLink">
<div class="rowTitle">{{ d.name }}</div>
<div class="rowSub">table SQL : {{ d.table_name }}</div>
</a>
<div class="rowActions">
<a class="button is-small" href="{{ url_for('object_edit', slug=game.slug, definition_id=d.id) }}" title="Modifier cet objet">✏️</a>
</div>
</div>
{% endfor %}
<div class="fieldsTableWrap">
<table class="table is-fullwidth is-hoverable fieldsTable">
<thead>
<tr><th>Nom</th><th>Table SQL</th><th></th></tr>
</thead>
<tbody>
{% for d in definitions %}
<tr>
<td><a href="{{ url_for('object_view', slug=game.slug, definition_id=d.id) }}">{{ d.name }}</a></td>
<td class="has-text-grey">{{ d.table_name }}</td>
<td class="fieldsTableActions">
<a class="button is-small" href="{{ url_for('object_edit', slug=game.slug, definition_id=d.id) }}" title="Modifier cet objet">✏️</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="hint">Aucun objet défini pour l'instant — un objet, c'est comme une table de base de données : un nom, et des champs typés.</p>