+ {pillsOverflow && (
+
+ )}
+
{tabs.map((tab) => {
if (tab.kind === "link") {
// The overview pill matches the mother page exactly; the
@@ -631,6 +720,23 @@ function InsightsTabStripImpl({
);
})}
+ {pillsOverflow && (
+
+ )}
{/* v1.4.27 MB7 / CF-72 — right-edge fade. The gradient
absolute-positions over the rightmost ~24 px of the strip
so the last visible pill softly fades into the background
diff --git a/src/components/insights/mood/mood-time-of-day-chart.tsx b/src/components/insights/mood/mood-time-of-day-chart.tsx
index 7c2d43d19..e1e8f61bc 100644
--- a/src/components/insights/mood/mood-time-of-day-chart.tsx
+++ b/src/components/insights/mood/mood-time-of-day-chart.tsx
@@ -25,11 +25,7 @@ import { useTranslations } from "@/lib/i18n/context";
* a muted zero-height bar so the four-column rhythm stays intact.
*/
-export type MoodTimeOfDayBucket =
- | "morning"
- | "afternoon"
- | "evening"
- | "night";
+export type MoodTimeOfDayBucket = "morning" | "afternoon" | "evening" | "night";
export interface MoodTimeOfDayRow {
bucket: MoodTimeOfDayBucket;
@@ -88,23 +84,28 @@ export function MoodTimeOfDayChart({
data={data}
margin={{ top: 8, right: 12, bottom: 8, left: 0 }}
>
+ {/* Muted chart language — same treatment as the weekday/distribution
+ siblings: `--muted-foreground` axis ticks, a quiet comment-grey
+ target guide, and 0.55 bar fill so the level hues inform without
+ shouting. */}
-
+
{data.map((row) => (
diff --git a/src/components/mood/mood-form.tsx b/src/components/mood/mood-form.tsx
index ed63cf8f2..e964e3cf1 100644
--- a/src/components/mood/mood-form.tsx
+++ b/src/components/mood/mood-form.tsx
@@ -498,7 +498,7 @@ export function MoodForm({ onSuccess, onCancel, footerSlot }: MoodFormProps) {
{t("common.cancel")}
{t("mood.formResetConfirmAction")}
diff --git a/src/components/mood/mood-list.tsx b/src/components/mood/mood-list.tsx
index cfcb170cd..d62a6e97b 100644
--- a/src/components/mood/mood-list.tsx
+++ b/src/components/mood/mood-list.tsx
@@ -1018,7 +1018,7 @@ export function MoodList({ onAddFirst }: MoodListProps = {}) {
{t("common.cancel")}
diff --git a/src/components/settings/account-section.tsx b/src/components/settings/account-section.tsx
index 8e546b13d..117dfbc23 100644
--- a/src/components/settings/account-section.tsx
+++ b/src/components/settings/account-section.tsx
@@ -940,9 +940,14 @@ function PasskeyListSection({ isAuthenticated }: { isAuthenticated: boolean }) {
{t("common.cancel")}
deletePasskey.mutate(pk.id)}
>
+ {deletePasskey.isPending && (
+
+ )}
{t("common.delete")}
@@ -1022,9 +1027,14 @@ function PasskeyListSection({ isAuthenticated }: { isAuthenticated: boolean }) {
{t("common.cancel")}
deletePasskey.mutate(pk.id)}
>
+ {deletePasskey.isPending && (
+
+ )}
{t("common.delete")}
diff --git a/src/components/settings/advanced-section.tsx b/src/components/settings/advanced-section.tsx
index e1802e895..8d7340cab 100644
--- a/src/components/settings/advanced-section.tsx
+++ b/src/components/settings/advanced-section.tsx
@@ -327,7 +327,7 @@ function DataResetCard() {
{t("common.cancel")}
{
e.preventDefault();
void handleDeleteAllData();
@@ -471,7 +471,7 @@ function AccountDeleteCard() {
{t("common.cancel")}
{
e.preventDefault();
void handleDeleteAccount();
diff --git a/src/components/settings/api-section.tsx b/src/components/settings/api-section.tsx
index bc7f1835d..fad61ed8d 100644
--- a/src/components/settings/api-section.tsx
+++ b/src/components/settings/api-section.tsx
@@ -134,13 +134,13 @@ function ApiEndpointsCard() {
{endpoint.path}
|
)}
+ {/* `flex-col-reverse` mirrors the DialogFooter idiom: the primary
+ action stacks on top on mobile, row order stays Cancel → Save
+ on `sm+`. */}
{dirty && priority && (
-