---
suivi: 1728
date: 2026-09-28
sujet: Accueil en colonnes sans trou
chantier: accueil
type: fix
statut: poussé
hash:
fichiers:
  - resources/js/Components/Dashboard/DashboardGrid.vue
  - public/build/manifest.json
  - docs/suivi/SUIVI_1728_accueil_colonnes_sans_trou.md
---

# SUIVI #1728 — colonnes empilées hors édition

Hors mode édition, l'accueil n'utilise plus la grille libre. Les cartes d'une même colonne s'empilent dans l'ordre de leur `y`, à 16 px, sans position verticale absolue. Un widget qui couvre plusieurs colonnes devient une bande pleine largeur, puis les colonnes reprennent dessous. Le mode édition garde `grid-layout-plus` et les positions enregistrées. Départ `4d17470b`.

## PROMPT ENVOYÉ

Hors édition, colonnes empilées depuis `x` / `w` / ordre `y`. Bande pleine largeur si un widget couvre plusieurs colonnes. Petit écran : une colonne, ordre de lecture. Aucune donnée de disposition réécrite. Pas de journal.

## SYNTHÈSE

MySQL local refusé (`127.0.0.1:3306`). Les coordonnées de Robin ne sont pas lues ici. Colonnes réelles : `user_dashboard_widgets.position_x`, `position_y`, `width`, `height`.

Les trous de #1725 restent parce que l'affichage posait encore chaque carte à `y = position_y` (`DashboardGrid.vue`, `toGridItem`). Ces `y` ont été calculés pour les anciennes hauteurs fixes. `onLayoutUpdated` ne renvoie rien hors édition, donc le compactage local ne remplace pas ce calage absolu.

Règle retenue : un widget est une bande pleine largeur dès qu'un autre widget a son `x` strictement à l'intérieur de `[x, x+w)`. Les autres restent dans la colonne de leur `x`, empilés par `y`. Sous 768 px, une seule colonne, ordre de lecture (`position_y` puis `position_x`).

## DÉPLOIEMENT

git pull origin main
php artisan view:clear

## LEÇON

Empiler par lignes CSS (la hauteur de ligne = la carte la plus haute) recrée un trou sous la carte courte d'à côté. Il faut une pile par colonne, coupée seulement par une bande pleine largeur.
