feat(tasks-ui): readability pass, height-budget fix and leftover sweep

The native port is finished off with the readability work the earlier rounds
left open, plus the cleanup of everything the shadcn era or the older canvas
left behind.

- Geometry: node height is now composed from named parts (chrome, two title
  lines, meta row) and per-node extras, so a teammate card that carries a task
  line no longer gets clipped by the old fixed 68px budget; the layout spec
  follows the new model and GRAPH_ROW_STRIDE stays exported for it.
- Readability: row rhythm (28-32px), three ink levels for title/meta/owner,
  truncation with title hints, current-row and hover expressed as an accent bar
  plus a hover fill (no shadows), phase frames and edges back on the l1/l2
  hairlines, control cluster uniformly 28px, drawer durations on tabular
  figures, kill action revealed on hover/focus without shifting the row, no
  horizontal overflow at 360px.
- Task window: the markdown body is pulled onto the page scale (12px body,
  12/13px headings, tightened list indent and paragraph spacing) while the
  shared MarkdownText/markdownTextProps contract is untouched.
- Cleanup: dead stylesheet rules, unused TSX exports and helpers, stale
  comments that still described the retired Variant-D canvas, zero-reference
  i18n keys across the dictionaries, and the Tailwind/shadcn/Variant-D
  narrative in the design doc, AGENTS.md and the plugin guide (kept as one
  short "why it was rolled back" section).

Verified here: typecheck and lint clean; 133 files / 1413 tests; build with no
radix-ui or --tw- strings in lib/client.js (988.9 KiB); the 70-assertion
real-browser contract at 70/70 with the 20 reference screenshots regenerated;
mount e2e 7/7.
This commit is contained in:
Menghuan1918
2026-09-27 22:18:19 +08:00
parent ae4280c70e
commit b554665bde
35 changed files with 856 additions and 1388 deletions
-36
View File
@@ -69,29 +69,16 @@ export const it: Record<string, string> = {
openWithSettingsRemove: 'Rimuovi',
openWithSettingsInvalidHint: 'Gli editor con nome mancante o modello senza {path} / scheme:// non vengono mostrati nel menu',
newTab: 'Nuova scheda',
openExplorer: 'Esplora risorse',
brokenSymlink: 'Collegamento simbolico interrotto',
openGit: 'Pannello Git',
newTerminal: 'Nuovo terminale',
terminalLimit: 'Numero massimo di terminali raggiunto (3)',
close: 'Chiudi',
closeOtherTabs: 'Chiudi le altre schede',
closeLeftTabs: 'Chiudi le schede a sinistra',
closeRightTabs: 'Chiudi le schede a destra',
floatDropHint: 'Rilascia per aprire in una finestra libera',
dockToSidebar: 'Torna alla barra laterale',
pinTerminal: 'Blocca Terminale',
pinAgentTerminal: 'Blocca Terminale Agent',
pinToWorkspace: 'Blocca in Workspace',
pinToGlobal: 'Blocca Globalmente',
unpinTerminal: 'Sblocca',
pinnedTerminalTooltip: '{kind} · {scope} · {cwd}',
pinnedTerminalKindUi: 'Terminale UI',
pinnedTerminalKindAgent: 'Terminale Agent',
pinnedTerminalScopeWorkspace: 'Bloccato in workspace',
pinnedTerminalScopeGlobal: 'Bloccato globalmente',
pinnedRailLabel: 'Terminali Bloccati',
closePinnedTerminal: 'Chiudi Terminale',
collapseBottomPanel: 'Comprimi pannello inferiore',
expandBottomPanel: 'Espandi pannello inferiore',
terminalError: 'Connessione del terminale non riuscita',
@@ -123,10 +110,6 @@ export const it: Record<string, string> = {
loading: 'Caricamento…',
error: 'Caricamento non riuscito',
retry: 'Riprova',
splitLeft: 'Dividi a sinistra',
splitRight: 'Dividi a destra',
splitUp: 'Dividi in alto',
splitDown: 'Dividi in basso',
notRepo: 'Questa directory non è un repository git',
noChanges: 'Nessuna modifica',
statusTruncated: 'Troppe modifiche; vengono mostrate solo le prime 2000 voci',
@@ -136,7 +119,6 @@ export const it: Record<string, string> = {
unstageAll: 'Rimuovi tutto dalla preparazione',
commitPlaceholder: 'Messaggio di commit (Ctrl+Enter)',
commit: 'Commit',
commitError: 'Commit non riuscito',
branch: 'Ramo',
worktree: 'Albero di lavoro',
checkoutError: 'Cambio di ramo non riuscito',
@@ -160,7 +142,6 @@ export const it: Record<string, string> = {
diffDeleted: 'Eliminato',
diffRenamed: 'Rinominato',
diffExpand: 'Espandi altre {count} righe',
diffCollapse: 'Comprimi',
discard: 'Annulla modifiche',
discardTitle: 'Annulla modifiche',
discardDesc: 'Questo annulla le modifiche della copia di lavoro di «{path}» (non recuperabile).',
@@ -181,18 +162,14 @@ export const it: Record<string, string> = {
loadMore: 'Carica altro',
historyLoadError: 'Caricamento di altra cronologia non riuscito',
produced: 'Prodotti',
producedOpen: 'Apri nella barra laterale',
disconnected: 'Terminale disconnesso, riconnessione…',
exited: 'Il processo del terminale è terminato',
noSession: 'Selezioni una conversazione per usare la barra laterale',
pluginNotLoaded: 'Plugin non caricato; scheda non disponibile:',
hiddenFiles: 'File nascosti',
parent: 'Directory superiore',
copied: 'Copiato',
copy: 'Copia',
newFile: 'Nuovo file',
openEditor: 'Apri editor',
gitDetail: 'Vedi i dettagli delle modifiche',
referenceFile: '@file',
addToConversation: 'Aggiungi alla conversazione',
copyRelative: 'Copia percorso relativo',
@@ -236,7 +213,6 @@ export const it: Record<string, string> = {
settingsSchemeCustomDesc: 'Controllo totale: inietti CSS personalizzato (può sovrascrivere gli stili integrati) e imposti la distanza di scorrimento della barra del titolo',
settingsSchemeDetectedSuffix: 'rilevato',
settingsCustomCssTitle: 'CSS personalizzato',
settingsCustomCssDesc: 'Stili accodati alla fine della pagina (in caso di parità vince chi è dopo; usi !important per sovrascrivere le variabili inline scritte da JS)',
settingsCustomCssPlaceholder: '/* es. riserva 36px per una shell con barra del titolo disegnata a mano */\nhtml[data-dsh-title-bar-height="36"] {\n --dsh-title-bar-strip: 36px !important;\n}',
settingsSaveFailed: 'Salvataggio non riuscito',
settingsConflict: 'L’impostazione è stata modificata in un’altra finestra — riprovi',
@@ -259,7 +235,6 @@ export const it: Record<string, string> = {
settingsFontFamilyPlaceholder: '"JetBrains Mono", monospace',
settingsFontSizeTitle: 'Dimensione del carattere del terminale',
settingsFontSizeDesc: 'Dimensione del carattere del terminale in px (9–32, predefinito 13)',
settingsFontSizeSuffix: 'px',
settingsShellTitle: 'Percorso della shell',
settingsShellDesc: 'Shell avviata per i terminali dell’interfaccia e del modello (percorso assoluto o nome eseguibile). Vuoto mantiene l’ordine preesistente: config.shell di yaml → $SHELL / shell di login / powershell.exe di Windows. Si applica ai terminali aperti successivamente',
settingsShellPlaceholder: 'es. /bin/zsh (vuoto = automatico)',
@@ -301,19 +276,14 @@ export const it: Record<string, string> = {
browserEmbedBlockedDesc: 'Il sito vieta di essere mostrato all’interno di altre pagine (X-Frame-Options / frame-ancestors), per cui non può essere caricato nella barra laterale. Lo apra direttamente nel browser.',
browserEmbedAnyway: 'Carica comunque',
subagent: 'Attività',
openSubagent: 'Attività',
subagentMainAgent: 'Agente principale',
subagentEmpty: 'Nessun sottoagente',
subagentEmptyDesc: 'I sottoagenti generati dall’agente principale compariranno qui',
subagentRunning: 'In esecuzione',
subagentInactive: 'Inattivo',
subagentModeOneShot: 'Monouso',
subagentModeContinuable: 'Proseguibile',
subagentCount: '{count} sottoagenti',
subagentCountRunning: '{count} sottoagenti · {running} in esecuzione',
subagentDiagCorrupt: 'Danneggiato',
subagentDiagUnsupported: 'Non supportato',
subagentDiagUnavailable: 'Non disponibile',
subagentThinking: 'In pensiero…',
sideChat: 'Chat laterale (beta)',
sideChatNew: 'Nuova conversazione',
@@ -334,10 +304,7 @@ export const it: Record<string, string> = {
sideChatThink: 'Pensiero',
sideChatInjection: 'Contesto iniettato',
sideChatSend: 'Invia',
sideChatCancel: 'Arresta',
sideChatCancelTitle: 'Interrompe il turno in corso (il lavoro in coda è conservato)',
sideChatClose: 'Chiudi conversazione',
sideChatCloseTitle: 'Rilascia l’agente della conversazione (la cronologia è conservata)',
sideChatError: 'Errore della chat laterale: {message}',
sideChatTurnUsage: 'Input {input} tok · Output {output} tok',
sideChatBlockCollapse: 'Comprimi',
@@ -373,7 +340,6 @@ export const it: Record<string, string> = {
jobDurationMinutes: '{minutes}min {seconds}s',
jobDurationHours: '{hours}h {minutes}min',
jobViewOutput: 'Vedi output',
jobHideOutput: 'Nascondi output',
jobNoOutput: 'Nessun output per ora',
jobNotReadYet: 'In attesa che il modello legga questa attività; il suo output compare qui quando il modello esegue job_output',
jobOutputTruncated: 'Output troncato',
@@ -391,7 +357,6 @@ export const it: Record<string, string> = {
settingsViewModeGraphDesc: 'Grafo di nodi a livelli, con zoom e pan',
settingsViewModeTree: 'Albero',
settingsViewModeTreeDesc: 'Albero a rientri classico, navigabile da tastiera',
tasksWorkflowMember: 'Membro del workflow',
tasksFoldCompleted: '✓ {count} completati',
tasksFoldExpand: 'Espandi i nodi completati',
tasksFoldCollapse: 'Comprimi i nodi completati',
@@ -412,7 +377,6 @@ export const it: Record<string, string> = {
tasksStateError: 'Errore',
teamBoard: 'Bacheca delle attività del team',
teamChip: 'Team {members} membri · {tasks} attività',
teamMembers: 'Membri',
teamTasksEmpty: 'Ancora nessuna attività condivisa',
teamTaskCreate: 'Nuova attività',
teamTaskSubject: 'Titolo',