fix(web): notices, day numbers and «Responder» as tall as they are

@pi/ui gives every button a fixed height, side padding and a minimum
width. Three of ours, laid out by their own component, took it:
- a notice in the bell's panel stayed 40 px tall, so a two-line one ran
  over the next;
- a day number in the calendar became a 40 px pill that ran into the
  sprint bands under it (today's, coloured, showed it);
- «Responder» under a comment became a grey pill sitting on its line.
They keep their own box now, and «Responder» is a text link.

The home page shows my projects first, right under the greeting: what
most visits come to open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-16 20:00:19 +02:00
parent 8fe581ff3e
commit fc90c79f7f
7 changed files with 76 additions and 41 deletions

View File

@@ -110,6 +110,50 @@ const REFRESH_MS = 60_000;
/>
}
<!-- My projects first: what most visits come to open. -->
<section class="ts-home-projects" aria-labelledby="projects-title">
@if (facade.projects().length) {
<div class="ts-section-header">
<h2 id="projects-title">
Proyectos
<span class="ts-mono ts-muted">{{
pad(facade.projects().length)
}}</span>
</h2>
</div>
} @else {
<h2 id="projects-title" class="visually-hidden">Proyectos</h2>
}
@if (facade.loading() && !facade.projects().length) {
<div class="ts-projects">
@for (i of [1, 2, 3]; track i) {
<pi-skeleton shape="block" height="12rem" />
}
</div>
} @else if (!facade.projects().length) {
<pi-empty-state
icon="kanban"
title="Aún no tienes proyectos"
description="Crea uno o pide que te añadan a un proyecto existente."
>
<pi-action-button
color="primary"
text="Crear el primero"
(execute)="openCreate()"
/>
</pi-empty-state>
} @else {
<div class="ts-projects">
@for (project of facade.sorted(); track project.id) {
<ts-project-card
[project]="project"
[stats]="statsOf().get(project.id) ?? null"
/>
}
</div>
}
</section>
@if (facade.projects().length) {
@if (myHome.home(); as h) {
<ts-home-kpis
@@ -145,43 +189,6 @@ const REFRESH_MS = 60_000;
<ts-resume />
</div>
</div>
<div class="ts-section-header">
<h2>
Proyectos
<span class="ts-mono ts-muted">{{
pad(facade.projects().length)
}}</span>
</h2>
</div>
}
@if (facade.loading() && !facade.projects().length) {
<div class="ts-projects">
@for (i of [1, 2, 3]; track i) {
<pi-skeleton shape="block" height="12rem" />
}
</div>
} @else if (!facade.projects().length) {
<pi-empty-state
icon="kanban"
title="Aún no tienes proyectos"
description="Crea uno o pide que te añadan a un proyecto existente."
>
<pi-action-button
color="primary"
text="Crear el primero"
(execute)="openCreate()"
/>
</pi-empty-state>
} @else {
<div class="ts-projects">
@for (project of facade.sorted(); track project.id) {
<ts-project-card
[project]="project"
[stats]="statsOf().get(project.id) ?? null"
/>
}
</div>
}
<ng-template #createForm>
@@ -260,6 +267,9 @@ const REFRESH_MS = 60_000;
color: var(--ts-muted);
font-size: 0.8125rem;
}
.ts-home-projects {
margin-bottom: 2rem;
}
ts-first-steps,
ts-home-kpis,
ts-week-agenda,