-
- {data.map((d, i) => {
- const total = d.inputTokens + d.outputTokens;
- const totalH = (total / maxTokens) * h;
- const inputH = (d.inputTokens / maxTokens) * h;
- const x = i * (barW + 2);
- return (
-
- {d.date}: {fmt(d.inputTokens)} in / {fmt(d.outputTokens)} out — {chf(d.spend)}
-
-
- {i % 7 === 0 && (
- {d.date.slice(8)}
- )}
-
- );
- })}
-
+
+ {/* Readout — the touch/keyboard-accessible equivalent of the old
+ hover-only tooltip. Always reflects the active day. */}
+
+
+ {dayLabel(active.date)}
+
+
+ {fmt(active.inputTokens)} {t("inputTokens")}
+
+
+ {fmt(active.outputTokens)} {t("outputTokens")}
+
+ {chf(active.spend)}
+
+
+
+
+ {data.map((d, i) => {
+ const total = d.inputTokens + d.outputTokens;
+ const totalH = (total / maxTokens) * h;
+ const inputH = (d.inputTokens / maxTokens) * h;
+ const x = i * (barW + 2);
+ const isActive = i === activeIndex;
+ return (
+ setSelected(i)}
+ onMouseEnter={() => setSelected(i)}
+ onFocus={() => setSelected(i)}
+ onKeyDown={(e) => {
+ if (e.key === "Enter" || e.key === " ") {
+ e.preventDefault();
+ setSelected(i);
+ }
+ }}
+ >
+ {barAria(d)}
+ {/* Full-height transparent hit area so thin bars stay
+ easy to tap on touch screens. */}
+
+
+
+ {isActive && (
+
+ )}
+ {i % 7 === 0 && (
+
+ {d.date.slice(8)}
+
+ )}
+
+ );
+ })}
+
+
- Input
+ {" "}
+ {t("legendInput")}
- Output
+ {" "}
+ {t("legendOutput")}
+ {t("chartHint")}
);
@@ -161,6 +268,7 @@ export function UsageDisplay({
canEditBudget?: boolean;
}) {
const t = useTranslations("usage");
+ const locale = useLocale();
const [month, setMonth] = useState(getCurrentMonth);
const [data, setData] = useState
(null);
const [loading, setLoading] = useState(true);
@@ -202,7 +310,7 @@ export function UsageDisplay({
←
- {formatMonth(month, "en")}
+ {formatMonth(month, locale)}
setMonth((m) => shiftMonth(m, 1))}
diff --git a/src/messages/de.json b/src/messages/de.json
index 7fda43e..fc09704 100644
--- a/src/messages/de.json
+++ b/src/messages/de.json
@@ -144,7 +144,10 @@
"discord": "Aktivieren Sie den Entwicklermodus in Discord (Erweiterte Einstellungen), Rechtsklick auf Ihren Namen → Benutzer-ID kopieren, und hier einfügen. Weitere Benutzer können Sie später auf der Mandantenseite hinzufügen.",
"threema": "Die 8 Zeichen, die in Ihrer Threema-App unter Einstellungen → Meine Threema-ID angezeigt werden. Sobald Ihr Mandant freigegeben ist und Threema aktiviert wurde, können Sie aus diesem Account heraus mit dem Assistenten chatten. Weitere autorisierte IDs können später auf der Mandantenseite hinzugefügt werden."
},
- "connectCta": "Assistenten verbinden"
+ "connectCta": "Assistenten verbinden",
+ "packagesIncompleteHint": "Bitte ergänzen Sie die erforderlichen Angaben für: {packages}",
+ "setupProgress": "Einrichtungsfortschritt",
+ "setupStepsComplete": "{done} von {total} Schritten"
},
"dashboard": {
"title": "Dashboard",
@@ -227,7 +230,10 @@
"budgetCadence_1mo": "Monatlich",
"budgetCadence_1y": "Jährlich",
"budgetInvalid": "Bitte einen positiven Betrag eingeben.",
- "budgetSaveFailed": "Budget konnte nicht gespeichert werden. Bitte erneut versuchen."
+ "budgetSaveFailed": "Budget konnte nicht gespeichert werden. Bitte erneut versuchen.",
+ "legendInput": "Input",
+ "legendOutput": "Output",
+ "chartHint": "Für Details auf einen Balken tippen"
},
"workspace": {
"save": "Speichern",
diff --git a/src/messages/en.json b/src/messages/en.json
index fecf6ac..7f3b549 100644
--- a/src/messages/en.json
+++ b/src/messages/en.json
@@ -144,7 +144,10 @@
"discord": "Enable Developer Mode in Discord (Advanced settings), right-click your name → Copy User ID, and paste it here. You can add more users later from the tenant page.",
"threema": "The 8 characters shown in your Threema app under Settings → My Threema ID. Once your tenant is approved and Threema is enabled, you'll be able to chat with the assistant from this account. More authorized IDs can be added later from the tenant page."
},
- "connectCta": "Connect your assistant"
+ "connectCta": "Connect your assistant",
+ "packagesIncompleteHint": "Add the required details for: {packages}",
+ "setupProgress": "Setup progress",
+ "setupStepsComplete": "{done} of {total} steps"
},
"dashboard": {
"title": "Dashboard",
@@ -227,7 +230,10 @@
"budgetCadence_1mo": "Monthly",
"budgetCadence_1y": "Yearly",
"budgetInvalid": "Please enter a positive amount.",
- "budgetSaveFailed": "Could not save budget. Please try again."
+ "budgetSaveFailed": "Could not save budget. Please try again.",
+ "legendInput": "Input",
+ "legendOutput": "Output",
+ "chartHint": "Tap a bar for that day"
},
"workspace": {
"save": "Save",
diff --git a/src/messages/fr.json b/src/messages/fr.json
index 76aa730..f11a0cf 100644
--- a/src/messages/fr.json
+++ b/src/messages/fr.json
@@ -144,7 +144,10 @@
"discord": "Activez le mode développeur dans Discord (paramètres avancés), clic-droit sur votre nom → Copier l'ID utilisateur, puis collez-le ici. Vous pourrez ajouter d'autres utilisateurs plus tard depuis la page du tenant.",
"threema": "Les 8 caractères affichés dans votre app Threema sous Réglages → Mon identifiant Threema. Une fois votre tenant approuvé et Threema activé, vous pourrez discuter avec l'assistant depuis ce compte. D'autres ID autorisés peuvent être ajoutés plus tard depuis la page du tenant."
},
- "connectCta": "Connecter votre assistant"
+ "connectCta": "Connecter votre assistant",
+ "packagesIncompleteHint": "Complétez les informations requises pour : {packages}",
+ "setupProgress": "Progression de la configuration",
+ "setupStepsComplete": "{done} sur {total} étapes"
},
"dashboard": {
"title": "Tableau de bord",
@@ -227,7 +230,10 @@
"budgetCadence_1mo": "Mensuelle",
"budgetCadence_1y": "Annuelle",
"budgetInvalid": "Veuillez saisir un montant positif.",
- "budgetSaveFailed": "Impossible d'enregistrer le budget. Veuillez réessayer."
+ "budgetSaveFailed": "Impossible d'enregistrer le budget. Veuillez réessayer.",
+ "legendInput": "Entrée",
+ "legendOutput": "Sortie",
+ "chartHint": "Touchez une barre pour le détail"
},
"workspace": {
"save": "Enregistrer",
diff --git a/src/messages/it.json b/src/messages/it.json
index bea6e6a..2c4ad05 100644
--- a/src/messages/it.json
+++ b/src/messages/it.json
@@ -144,7 +144,10 @@
"discord": "Attivi la Modalità sviluppatore in Discord (Impostazioni avanzate), clic destro sul suo nome → Copia ID utente, poi incolli qui. Potrà aggiungere altri utenti in seguito dalla pagina del tenant.",
"threema": "Gli 8 caratteri mostrati nella sua app Threema in Impostazioni → Il mio ID Threema. Una volta approvato il suo tenant e attivato Threema, potrà chattare con l'assistente da questo account. Altri ID autorizzati possono essere aggiunti in seguito dalla pagina del tenant."
},
- "connectCta": "Collega il tuo assistente"
+ "connectCta": "Collega il tuo assistente",
+ "packagesIncompleteHint": "Completa i dettagli richiesti per: {packages}",
+ "setupProgress": "Avanzamento configurazione",
+ "setupStepsComplete": "{done} di {total} passaggi"
},
"dashboard": {
"title": "Dashboard",
@@ -227,7 +230,10 @@
"budgetCadence_1mo": "Mensile",
"budgetCadence_1y": "Annuale",
"budgetInvalid": "Inserisca un importo positivo.",
- "budgetSaveFailed": "Impossibile salvare il budget. Riprova."
+ "budgetSaveFailed": "Impossibile salvare il budget. Riprova.",
+ "legendInput": "Input",
+ "legendOutput": "Output",
+ "chartHint": "Tocca una barra per i dettagli"
},
"workspace": {
"save": "Salvi",