feinai 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/package.json +1 -1
- package/src/cli.ts +1 -1
- package/src/dashboard.html +24 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
5
5
|
|
|
6
|
+
## [0.8.1] - 2026-09-02
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- Chips de estado con contador en las tarjetas Specs y Tasks del overview. Navegan a la lista completa filtrada (`#/specs?status=pending`) en vez de filtrar la tarjeta truncada, para que el filtro nunca opere sobre un recorte arbitrario. Se omiten los estados sin items.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- El contenedor del toast quedaba parcialmente visible en reposo: `translateY(140%)` sobre una caja de 30px la desplaza 42px, menos de los 54px necesarios para salir con `bottom: 24px`. Ahora usa `opacity` + `visibility`.
|
|
15
|
+
|
|
6
16
|
## [0.8.0] - 2026-09-02
|
|
7
17
|
|
|
8
18
|
### Changed
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
package/src/dashboard.html
CHANGED
|
@@ -330,6 +330,7 @@
|
|
|
330
330
|
font-family: inherit;
|
|
331
331
|
}
|
|
332
332
|
.filter-btn:hover { color: var(--fg); border-color: var(--fg-dim); }
|
|
333
|
+
.filter-count { margin-left: 6px; opacity: 0.7; font-variant-numeric: tabular-nums; }
|
|
333
334
|
.filter-btn.active { background: var(--border); color: var(--fg); border-color: var(--border-strong); }
|
|
334
335
|
|
|
335
336
|
.filter-btn[data-status="pending"] { border-color: var(--yellow); color: var(--yellow); }
|
|
@@ -461,10 +462,17 @@
|
|
|
461
462
|
max-width: 360px;
|
|
462
463
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
463
464
|
transform: translateY(140%);
|
|
464
|
-
|
|
465
|
+
opacity: 0;
|
|
466
|
+
visibility: hidden;
|
|
467
|
+
transition: transform 0.2s ease, opacity 0.2s ease, visibility 0s linear 0.2s;
|
|
465
468
|
z-index: 200;
|
|
466
469
|
}
|
|
467
|
-
.toast.visible {
|
|
470
|
+
.toast.visible {
|
|
471
|
+
transform: translateY(0);
|
|
472
|
+
opacity: 1;
|
|
473
|
+
visibility: visible;
|
|
474
|
+
transition: transform 0.2s ease, opacity 0.2s ease, visibility 0s;
|
|
475
|
+
}
|
|
468
476
|
.toast.error { border-left-color: var(--red); }
|
|
469
477
|
.toast-title { font-weight: 600; margin-bottom: 4px; }
|
|
470
478
|
.toast-body { color: var(--fg-dim); font-size: 12px; }
|
|
@@ -916,6 +924,18 @@
|
|
|
916
924
|
return `<div class="filter-bar">${btns.join("")}</div>`;
|
|
917
925
|
}
|
|
918
926
|
|
|
927
|
+
// Overview chips: navigate to the full filtered list instead of filtering
|
|
928
|
+
// the truncated card, so a filter never operates on an arbitrary slice.
|
|
929
|
+
// Statuses with no items are omitted — a chip leading nowhere is a dead end.
|
|
930
|
+
function filterLinks(basePath, statuses, items) {
|
|
931
|
+
const chips = statuses
|
|
932
|
+
.map((s) => ({ s, n: items.filter((it) => it.status === s).length }))
|
|
933
|
+
.filter(({ n }) => n > 0)
|
|
934
|
+
.map(({ s, n }) =>
|
|
935
|
+
`<button class="filter-btn" data-status="${s}" data-goto="${escapeHtml(basePath)}?status=${s}" title="View all ${statusLabel(s)}">${escapeHtml(statusLabel(s))}<span class="filter-count">${n}</span></button>`);
|
|
936
|
+
return chips.length > 1 ? `<div class="filter-bar">${chips.join("")}</div>` : "";
|
|
937
|
+
}
|
|
938
|
+
|
|
919
939
|
// ================= Event rendering =================
|
|
920
940
|
function eventRow(e) {
|
|
921
941
|
if (e._kind === "request") {
|
|
@@ -1003,6 +1023,7 @@
|
|
|
1003
1023
|
<h2>Specs <span class="count">${specs.length}</span>
|
|
1004
1024
|
<a class="btn sm" href="#/new/spec" style="margin-left:auto;">New spec</a>
|
|
1005
1025
|
</h2>
|
|
1026
|
+
${filterLinks("#/specs", ["pending", "in_progress", "completed", "archived"], specs)}
|
|
1006
1027
|
${listBlock(specs, specItem, {
|
|
1007
1028
|
limit: OVERVIEW_LIMIT,
|
|
1008
1029
|
moreHref: "#/specs",
|
|
@@ -1016,6 +1037,7 @@
|
|
|
1016
1037
|
<h2>Tasks <span class="count">${tasks.length}</span>
|
|
1017
1038
|
<a class="btn sm" href="#/new/task" style="margin-left:auto;">New task</a>
|
|
1018
1039
|
</h2>
|
|
1040
|
+
${filterLinks("#/tasks", ["pending", "in_progress", "completed", "failed"], tasks)}
|
|
1019
1041
|
${listBlock(tasks, taskItem, {
|
|
1020
1042
|
limit: OVERVIEW_LIMIT,
|
|
1021
1043
|
moreHref: "#/tasks",
|