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

@@ -301,7 +301,7 @@ visualización de la plataforma:
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/login` | Inicio de sesión (solo sin sesión) |
| `/auth/callback` | Retorno de Pireon (PKCE) |
| `/` | Inicio: saludo según la hora con el resumen del día, «Ir a…» (`WEB-12`), primeros pasos, cuatro cifras (`ts-home-kpis`: abiertos míos, esperando QA, terminados por mí y por el equipo esta semana), la semana (`ts-week-agenda`), mis vistas guardadas y dos columnas: mis tickets y lo último en mis proyectos; sprints en curso, esperando QA, que sigo, próximas releases, quién está ahora y «Retomar». Debajo, mis proyectos con su actividad |
| `/` | Inicio: saludo según la hora con el resumen del día, «Ir a…» (`WEB-12`), primeros pasos, mis proyectos con su actividad (lo primero, para llegar antes), cuatro cifras (`ts-home-kpis`: abiertos míos, esperando QA, terminados por mí y por el equipo esta semana), la semana (`ts-week-agenda`), mis vistas guardadas y dos columnas: mis tickets y lo último en mis proyectos; sprints en curso, esperando QA, que sigo, próximas releases, quién está ahora y «Retomar» |
| `/portfolio` | Cartera (con sesión): una tarjeta por proyecto activo con lo abierto y en riesgo, el sprint en curso (¿llega?), las próximas releases con su previsión y las épicas abiertas; en directo: se vuelve a leer sola cuando cambia un ticket, sprint o release de esos proyectos |
| `/explore` | Proyectos públicos (sin sesión) |
| `/p/:key/board` | Tablero kanban (`?release=` y `?assignee=` preseleccionan los filtros) |

Binary file not shown.

Binary file not shown.

View File

@@ -360,10 +360,15 @@ const PER_DAY = 3;
flex: none;
height: calc(var(--rows, 0) * 1.375rem);
}
/* A small square, past @pi/ui's global button look: as a 40 px pill it
ran into the sprint bands under it (today's, coloured, showed it). */
.ts-cal__number {
flex: none;
width: 1.75rem;
height: 1.5rem;
width: 1.75rem !important;
min-width: 0 !important;
height: 1.5rem !important;
padding: 0 !important;
line-height: 1.5rem;
border: 0;
border-radius: 0.375rem;
background: none;

View File

@@ -533,9 +533,24 @@ a.ts-key {
font-style: italic;
}
// A text link, past @pi/ui's global button look: as a 40 px pill it sat on
// the line under the comment.
.ts-reply__open {
justify-self: start;
height: auto !important;
min-width: 0 !important;
margin-top: 0.375rem;
padding: 0.125rem 0 !important;
border: 0;
background: none !important;
color: var(--ts-brand);
font-size: 0.8125rem;
font-weight: 600;
cursor: pointer;
&:hover {
text-decoration: underline;
}
}
.ts-reply__actions {

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,

View File

@@ -174,12 +174,17 @@ const ICON: Record<NotificationKind, string> = {
display: grid;
gap: 0.25rem;
}
/* As tall as its text: past @pi/ui's global button look (a fixed
height that let a two-line notice run over the next one). */
.ts-inbox__item {
width: 100%;
height: auto !important;
min-width: 0 !important;
display: flex;
align-items: flex-start;
gap: 0.75rem;
padding: 0.625rem 0.5rem;
padding: 0.625rem 0.5rem !important;
line-height: 1.35;
border: 0;
border-radius: 0.5rem;
background: transparent;