diff --git a/services/web/frontend/js/features/project-list/components/project-list-lumiere.tsx b/services/web/frontend/js/features/project-list/components/project-list-lumiere.tsx
index 41bb396701..94bdfa7274 100644
--- a/services/web/frontend/js/features/project-list/components/project-list-lumiere.tsx
+++ b/services/web/frontend/js/features/project-list/components/project-list-lumiere.tsx
@@ -30,8 +30,9 @@ import { TrashProjectButtonTooltip } from './table/cells/action-buttons/trash-pr
// ── Tile zoom ─────────────────────────────────────────────────────────────────
-type ZoomLevel = 1 | 1.35 | 1.75
+type ZoomLevel = 0 | 1 | 1.35 | 1.75
const ZOOM_OPTIONS: { value: ZoomLevel; label: string }[] = [
+ { value: 0, label: 'XS' },
{ value: 1, label: 'S' },
{ value: 1.35, label: 'M' },
{ value: 1.75, label: 'L' },
@@ -304,9 +305,9 @@ export function ProjectListLumiere() {
{t('no_projects')}
) : (
{visibleProjects.map(project => (
diff --git a/services/web/frontend/stylesheets/pages/project-list-lumiere.scss b/services/web/frontend/stylesheets/pages/project-list-lumiere.scss
index 4fa57ea3be..12502f1c24 100644
--- a/services/web/frontend/stylesheets/pages/project-list-lumiere.scss
+++ b/services/web/frontend/stylesheets/pages/project-list-lumiere.scss
@@ -341,6 +341,11 @@ $lum-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' wi
flex-wrap: wrap;
}
+ // Search bar — wide enough to show the full placeholder
+ form.project-search .form-control {
+ min-width: 300px;
+ }
+
.lumiere-title {
font-family: Georgia, 'Times New Roman', 'DejaVu Serif', serif !important;
font-size: 2rem !important;
@@ -725,6 +730,91 @@ $lum-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' wi
cursor: default;
}
+ // ── XS compact list view ─────────────────────────────────────────────────
+ // Activated via .lumiere-card-grid--compact (cardScale === 0).
+ // Cards become flat rows; thumbnail is hidden; only name, badge, owner,
+ // date, and action strip remain.
+
+ .lumiere-card-grid--compact {
+ display: flex;
+ flex-direction: column;
+ gap: 0.3rem;
+ margin-top: 0.5rem;
+
+ // Card row — horizontal instead of vertical
+ .lumiere-card {
+ flex-direction: row;
+
+ &:hover,
+ &:focus-within {
+ transform: none;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.09);
+ }
+ }
+
+ // Checkbox: vertically centered in the row
+ .lumiere-card-checkbox {
+ top: 50%;
+ transform: translateY(-50%);
+ }
+
+ // Link area fills the row, items laid out horizontally
+ .lumiere-card-link {
+ flex-direction: row;
+ align-items: center;
+ padding: 0.45rem 0.75rem 0.45rem 2.2rem;
+ gap: 0.65rem;
+ }
+
+ // Hide the preview thumbnail
+ .lumiere-card-thumb {
+ display: none;
+ }
+
+ // Body becomes a horizontal strip
+ .lumiere-card-body {
+ flex-direction: row;
+ align-items: center;
+ gap: 0.65rem;
+ padding: 0;
+ flex: 1;
+ min-width: 0;
+ }
+
+ // Name stretches to fill remaining space, single line
+ .lumiere-card-name {
+ flex: 1;
+ min-width: 0;
+ font-size: 0.85rem;
+ -webkit-line-clamp: 1;
+ }
+
+ // More room for the owner label in list mode
+ .lumiere-card-owner {
+ max-width: 160px;
+ }
+
+ // Date sits inline, no top margin
+ .lumiere-card-date {
+ margin-top: 0;
+ flex-shrink: 0;
+ }
+
+ // Actions: vertical strip on the right, border-left instead of border-top
+ .lumiere-card-actions {
+ border-top: none;
+ border-left: 1px solid rgba($lum-teal, 0.10);
+ flex-direction: row;
+ align-self: stretch;
+ align-items: center;
+ padding: 0.25rem 0.4rem;
+
+ .action-btn {
+ padding: 3px !important;
+ }
+ }
+ }
+
// ── Selection bar — tool buttons ──────────────────────────────────────────
.lumiere-selection-bar {