diff --git a/static/style.css b/static/style.css index 73b67af4..ce06ad1e 100644 --- a/static/style.css +++ b/static/style.css @@ -14,10 +14,12 @@ input[type=text], input[type=number], input[type=date], textarea, select{ } input[type=checkbox]{ width:auto; margin-top:6px; } -.topbar{ display:flex; align-items:center; gap:10px; padding:12px 20px; background:var(--panel); border-bottom:1px solid var(--border); } -.brand{ color:var(--text); font-weight:700; text-decoration:none; } -.crumb{ color:var(--text-dim); text-decoration:none; font-size:13px; } -.crumb-sep{ color:var(--text-dim); } +/* .topbar/.breadcrumbBar : Bulma fournit déjà la mise en page (navbar, + breadcrumb) — ces classes ne servent plus qu'à les repérer dans les + layouts plein-écran (body.builderBody/objectEditBody, voir plus bas) et à + les rattacher au thème sombre. */ +.topbar{ border-bottom:1px solid var(--border); } +.breadcrumbBar{ padding:10px 20px; background:transparent; border-bottom:1px solid var(--border); margin-bottom:0; } .content{ max-width:760px; margin:0 auto; padding:28px 20px; } .card{ border:1px solid var(--border); border-radius:10px; padding:16px; background:var(--panel); margin:12px 0; } @@ -59,28 +61,16 @@ button.danger{ color:var(--danger); border-color:rgba(226,104,95,.4); } .fieldRowCard{ margin-bottom:10px; } .relationTarget{ margin-top:6px; } -.dataTableWrap{ overflow-x:auto; max-width:100%; } -.dataTable{ width:100%; border-collapse:collapse; font-size:12.5px; } -.dataTable th, .dataTable td{ border:1px solid var(--border); padding:6px 8px; text-align:left; } -.dataTable th{ background:var(--panel2); color:var(--text-dim); white-space:nowrap; } +/* .dataTable : Bulma fournit déjà la mise en page du tableau (classes + "table is-fullwidth is-hoverable", voir data_list.html) — ceci ne fait + plus que tronquer les cellules trop longues avec "...", pour garder une + vue d'ensemble compacte (le détail complet s'ouvre dans la modale Bulma + ci-dessous via le bouton 👁️). */ .dataTable td{ max-width:220px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } /* ---------- Détail d'une entrée (bouton 👁️) ---------- */ -/* Popup plein écran assombri, pour lire une ligne dont les colonnes sont - tronquées dans le tableau (voir .dataTable td ci-dessus) sans avoir à - ouvrir le formulaire de modification. */ -.rowDetailModal{ - display:none; position:fixed; inset:0; background:rgba(0,0,0,.6); - align-items:center; justify-content:center; z-index:100; padding:20px; -} -.rowDetailModal.open{ display:flex; } -.rowDetailCard{ - background:var(--panel); border:1px solid var(--border); border-radius:10px; - max-width:640px; width:100%; max-height:80vh; display:flex; flex-direction:column; -} -.rowDetailHeader{ display:flex; align-items:center; justify-content:space-between; padding:14px 16px; border-bottom:1px solid var(--border); flex:0 0 auto; } -.rowDetailHeader h3{ margin:0; color:var(--text); font-size:15px; } -.rowDetailBody{ padding:6px 16px 16px; overflow-y:auto; } +/* Contenu de la modale Bulma (.modal/.modal-card, voir data_list.html) — + affiche chaque champ en entier, sans troncature. */ .rowDetailField{ padding:10px 0; border-bottom:1px solid var(--border); } .rowDetailField:last-child{ border-bottom:none; } .rowDetailLabel{ font-size:11px; color:var(--text-dim); text-transform:uppercase; letter-spacing:.05em; margin-bottom:4px; } @@ -110,7 +100,7 @@ button.danger{ color:var(--danger); border-color:rgba(226,104,95,.4); } a beaucoup de champs, pour garder une vue d'ensemble sans perdre le formulaire "Ajouter un champ" hors de l'écran. */ body.objectEditBody{ display:flex; flex-direction:column; height:100vh; margin:0; overflow:hidden; } -body.objectEditBody > .topbar{ flex:0 0 auto; } +body.objectEditBody > .topbar, body.objectEditBody > .breadcrumbBar{ flex:0 0 auto; } body.objectEditBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; display:flex; flex-direction:column; } .content-objectEdit{ width:100%; display:flex; flex-direction:column; min-height:0; } @@ -136,7 +126,7 @@ body.objectEditBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden ce sont les zones internes (panneaux, écran, panneau de logique) qui défilent chacune de leur côté si besoin. */ body.builderBody{ display:flex; flex-direction:column; height:100vh; margin:0; overflow:hidden; } -body.builderBody > .topbar{ flex:0 0 auto; } +body.builderBody > .topbar, body.builderBody > .breadcrumbBar{ flex:0 0 auto; } body.builderBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; display:flex; flex-direction:column; } .content-builder{ diff --git a/templates/base.html b/templates/base.html index 81731cdf..7bdd0a15 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,17 +1,27 @@ - + {% block title %}Forge Engine{% endblock %} + {% block extra_head %}{% endblock %} -
- 🛠️ Forge Engine - {% block breadcrumb %}{% endblock %} -
+ +{% block breadcrumb_wrap %} + +{% endblock %}
{% block content %}{% endblock %}
diff --git a/templates/data_form.html b/templates/data_form.html index 07002dde..74c85b5a 100644 --- a/templates/data_form.html +++ b/templates/data_form.html @@ -1,57 +1,60 @@ {% extends "base.html" %} {% block title %}{{ 'Modifier' if row else 'Ajouter' }} — {{ definition.name }}{% endblock %} {% block breadcrumb %} -{{ game.name }} -/ -{{ definition.name }} -/{{ 'Modifier #' ~ row.id if row else 'Nouvelle entrée' }} +
  • {{ game.name }}
  • +
  • {{ definition.name }}
  • +
  • {{ 'Modifier #' ~ row.id if row else 'Nouvelle entrée' }}
  • {% endblock %} {% block content %} -

    {{ 'Modifier l\'entrée #' ~ row.id if row else 'Ajouter une entrée' }} — {{ definition.name }}

    -

    Formulaire généré automatiquement à partir de la définition de cet objet — aucun champ n'est codé en dur ici.

    +

    {{ 'Modifier l\'entrée #' ~ row.id if row else 'Ajouter une entrée' }} — {{ definition.name }}

    +

    Formulaire généré automatiquement à partir de la définition de cet objet — aucun champ n'est codé en dur ici.

    -
    + {% for f in definition.fields %} {% set col = f.name|colname %} {% set current = row[col] if row else none %} -
    - +
    + +
    {% if f.type == 'texte' %} - + {% elif f.type == 'texte_long' %} - + {% elif f.type == 'nombre_entier' %} - + {% elif f.type == 'nombre_decimal' %} - + {% elif f.type == 'booleen' %} - + {% elif f.type == 'date' %} - + {% elif f.type == 'relation' %} {% set current_rel = row[col ~ '_id'] if row else none %} - +
    + +
    {% if not relation_options.get(f.id) %} -

    Aucune entrée n'existe encore pour l'objet lié — crée-en une d'abord si tu veux pouvoir la sélectionner ici.

    +

    Aucune entrée n'existe encore pour l'objet lié — crée-en une d'abord si tu veux pouvoir la sélectionner ici.

    {% endif %} {% endif %} +
    {% endfor %} -
    - +
    +
    {% endblock %} diff --git a/templates/data_list.html b/templates/data_list.html index 48d4c3da..0bbeb939 100644 --- a/templates/data_list.html +++ b/templates/data_list.html @@ -1,17 +1,17 @@ {% extends "base.html" %} {% block title %}{{ definition.name }} — {{ game.name }}{% endblock %} {% block breadcrumb %} -{{ game.name }} -/{{ definition.name }} +
  • {{ game.name }}
  • +
  • {{ definition.name }}
  • {% endblock %} {% block content %} -

    {{ definition.name }} - ✏️ +

    {{ definition.name }} + ✏️

    -

    Table SQL : {{ definition.table_name }} — {{ definition.fields|length }} champ(s)

    +

    Table SQL : {{ definition.table_name }} — {{ definition.fields|length }} champ(s)

    {% if referenced_by %} -
    +
    ⚠️ D'autres objets ont une relation vers « {{ definition.name }} » : {{ referenced_by|map(attribute='name')|join(', ') }}. La suppression de cet objet est bloquée tant que ces relations existent. @@ -19,16 +19,16 @@ {% endif %} {% if blocked_row_id %} -
    +
    ⚠️ Impossible de supprimer l'entrée #{{ blocked_row_id }} : elle est référencée par {% for ref in blocked_row_refs %}{{ ref.count }} entrée(s) de « {{ ref.definition_name }} » (champ « {{ ref.field_name }} »){% if not loop.last %}, {% endif %}{% endfor %}. Modifie ou supprime d'abord ces entrées.
    {% endif %} -+ Ajouter une entrée ++ Ajouter une entrée -

    Données enregistrées

    +

    Données enregistrées

    {% if rows %} {% macro row_field_display(f, r) %} {%- if f.type == 'relation' -%} @@ -39,8 +39,8 @@ {{ r[f.name|colname] }} {%- endif -%} {% endmacro %} -
    - +
    +
    @@ -56,12 +56,12 @@ {% endfor %} @@ -72,41 +72,42 @@ {% for r in rows %} -
    -
    -
    -

    Entrée #{{ r.id }}

    - -
    -
    +
    {% endfor %} {% else %} -

    Aucune donnée enregistrée pour l'instant.

    +

    Aucune donnée enregistrée pour l'instant.

    {% endif %} diff --git a/templates/element_types.html b/templates/element_types.html index 081a0b10..8c862eb6 100644 --- a/templates/element_types.html +++ b/templates/element_types.html @@ -1,63 +1,76 @@ {% extends "base.html" %} {% block title %}Éléments de jeu — {{ game.name }}{% endblock %} {% block breadcrumb %} -{{ game.name }} -/Éléments de jeu +
  • {{ game.name }}
  • +
  • Éléments de jeu
  • {% endblock %} {% block content %} -

    Éléments de jeu

    -

    Un élément de jeu est un conteneur réutilisable.

    +

    Éléments de jeu

    +

    Un élément de jeu est un conteneur réutilisable.

    -
    -
    -
    - - + +
    +
    +
    + +
    +
    -
    - - +
    +
    + +
    +
    -
    -
    - - +
    + +
    +
    + +
    -
    +
    -

    Catalogue

    +

    Catalogue

    {% if types %} -
    +
    +
    #{{ row_field_display(f, r) }} -
    - - ✏️ +
    + + ✏️
    - +
    + {% for t in types %} -
    -
    + + + {% endfor %} + +
    + {{ t.icon }} {{ t.name }} +
    + {{ usage.get(t.id, 0) }} instance(s) posée(s) sur des écrans {% if t.bound_definition_id %} {% for d in definitions %}{% if d.id == t.bound_definition_id %} · lié à l'objet « {{ d.name }} »{% endif %}{% endfor %} {% endif %} + +
    +
    + ✏️ Modifier le contenu +
    + +
    - -
    - ✏️ Modifier le contenu -
    - -
    -
    - +
    {% else %} -

    Aucun élément de jeu défini pour l'instant.

    +

    Aucun élément de jeu défini pour l'instant.

    {% endif %} {% endblock %} diff --git a/templates/game_dashboard.html b/templates/game_dashboard.html index c6c92792..438db14d 100644 --- a/templates/game_dashboard.html +++ b/templates/game_dashboard.html @@ -1,61 +1,81 @@ {% extends "base.html" %} {% block title %}{{ game.name }} — Forge Engine{% endblock %} -{% block breadcrumb %}{{ game.name }}{% endblock %} +{% block breadcrumb %}
  • {{ game.name }}
  • {% endblock %} {% block content %} -

    {{ game.name }}

    -

    Base de données : projects/{{ game.slug }}/game.db

    +

    {{ game.name }}

    +

    Base de données : projects/{{ game.slug }}/game.db

    -
    - -
    🖥️ Écrans du jeu
    -
    Créer et enchaîner les écrans jouables (accueil, formulaires, scènes...)
    -
    - -
    🧩 Éléments de jeu
    -
    Catalogue réutilisable (Personnage, Outil, IA...)
    -
    - -
    ▶️ Jouer
    -
    Aperçu jouable du jeu
    -
    + - -
    ➕ Définir un nouvel objet
    -
    Comme une table de base de données : un nom, et des champs typés
    +
    +
    +

    ➕ Définir un nouvel objet

    +

    Comme une table de base de données : un nom, et des champs typés

    +
    -

    Objets définis

    +

    Objets définis

    {% if definitions %} -
    +
    + + {% for d in definitions %} - + + + + {% endfor %} + +
    + {{ d.name }} +
    table SQL : {{ d.table_name }} +
    + ✏️ +
    {% else %} -

    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.

    +

    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.

    {% endif %} -
    -

    Paramètres du jeu

    -
    -
    - - +
    +

    ⚠️ Paramètres du jeu

    + +
    + + +
    +
    +
    - -
    - +
    {% endblock %} diff --git a/templates/index.html b/templates/index.html index fdd2506c..9ed74e9c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,34 +1,47 @@ {% extends "base.html" %} {% block title %}Forge Engine — Mes jeux{% endblock %} +{% block breadcrumb_wrap %}{% endblock %} {% block content %} -

    Mes jeux

    +

    Mes jeux

    -
    - -
    - - + +
    + +
    +
    + +
    +
    + +
    +
    +

    Crée un dossier avec index.html / index.css / index.js reliés entre eux, et une base de données dédiée à ce jeu.

    -

    Crée un dossier avec index.html / index.css / index.js reliés entre eux, et une base de données dédiée à ce jeu.

    -

    Jeux existants

    +

    Jeux existants

    {% if games %} -
    +
    + + {% for g in games %} - + + + + {% endfor %} + +
    + {{ g.name }} +
    projects/{{ g.slug }}/ +
    +
    + +
    +
    {% else %} -

    Aucun jeu pour l'instant — crée le premier ci-dessus.

    +

    Aucun jeu pour l'instant — crée le premier ci-dessus.

    {% endif %} {% endblock %} diff --git a/templates/object_edit.html b/templates/object_edit.html index 09d85ca0..8f6db622 100644 --- a/templates/object_edit.html +++ b/templates/object_edit.html @@ -3,84 +3,105 @@ {% block content_class %}content-wide content-objectEdit{% endblock %} {% block body_class %}objectEditBody{% endblock %} {% block breadcrumb %} -{{ game.name }} -/ -{{ definition.name }} -/Modifier +
  • {{ game.name }}
  • +
  • {{ definition.name }}
  • +
  • Modifier
  • {% endblock %} {% block content %} -

    Modifier l'objet « {{ definition.name }} »

    -

    Table SQL : {{ definition.table_name }}

    +

    Modifier l'objet « {{ definition.name }} »

    +

    Table SQL : {{ definition.table_name }}

    -
    -
    - - + +
    + + +
    +
    +
    -
    -

    Ajouter un champ

    -
    - - +

    Ajouter un champ

    + +
    + +
    +
    - - +
    + +
    +
    + +
    +
    +
    -