Merge origin/main (v1.44.2) into fix/v145-sheet-motion

next stays on main's 16.4.2 (the RCE and Server Actions advisories) with its two companions; release's newer dev tools and its own additions are kept. The lockfile is release's, re-resolved. pt-BR, which main does not have, takes the one key main added.
This commit is contained in:
Marc-André Bombeck committed 2026-10-22 16:43:28 +02:00
commit 9c8972bc96
86 files changed
+5051 -487

No files matched your search

+12 -8
View File
@@ -1,7 +1,7 @@
openapi: 3.1.0
info:
title: HealthLog API
version: 1.44.0
version: 1.44.2
description: >-
Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest.
@@ -64112,7 +64112,8 @@ components:
- diaHigh
additionalProperties: false
- type: "null"
description: Personalised blood-pressure target numbers. Null when the profile has no date of birth.
description: "Blood-pressure target numbers: the user's own target (`/api/user/thresholds`) where set, else the
age-banded default. Null when there is neither a target nor a date of birth."
bpSysRange:
anyOf:
- type: object
@@ -64132,7 +64133,8 @@ components:
- orangeMax
additionalProperties: false
- type: "null"
description: Systolic traffic-light range. Null when the profile has no date of birth.
description: Systolic traffic-light range, the user's own target winning over the age default. Null when there is
neither a target nor a date of birth.
bpDiaRange:
anyOf:
- type: object
@@ -64152,7 +64154,8 @@ components:
- orangeMax
additionalProperties: false
- type: "null"
description: Diastolic traffic-light range. Null when the profile has no date of birth.
description: Diastolic traffic-light range, the user's own target winning over the age default. Null when there is
neither a target nor a date of birth.
pulseDisplayRange:
type: object
properties:
@@ -64170,7 +64173,8 @@ components:
- orangeMin
- orangeMax
additionalProperties: false
description: Resting-pulse display range. Always present — falls back to the AHA reference range with no date of birth.
description: "Resting-pulse display range: the user's own target where set, else the age / sex percentile band (the AHA
reference range with no date of birth). Always present."
pulseBands:
type: array
items:
@@ -64191,7 +64195,7 @@ components:
- max
- color
additionalProperties: false
description: Resting-pulse chart bands. Always present — AHA fallback with no date of birth.
description: Resting-pulse chart bands, drawn from the same range as `pulseDisplayRange`. Always present.
bodyFatRange:
type: object
properties:
@@ -64203,7 +64207,7 @@ components:
- min
- max
additionalProperties: false
description: Gender-aware body-fat target range. Always present.
description: "Body-fat target range: the user's own target where set, else the gender-aware default. Always present."
bodyFatBands:
type: array
items:
@@ -64224,7 +64228,7 @@ components:
- max
- color
additionalProperties: false
description: Body-fat chart bands. Always present.
description: Body-fat chart bands, drawn from the same range as `bodyFatRange`. Always present.
weightRange:
anyOf:
- type: object
+1
View File
@@ -98,6 +98,7 @@ No `text-[9px]`. No off-scale sizes (`text-[28px]`); round to the neighbouring s
| Mutation error inside a form/sheet | inline `role="alert"` text | `QueryErrorCard` (wrong shape) |
| Honest no-data state | `EmptyState` | reusing error copy: a failed query must never fall through to "no data yet" |
| Modal reachable on mobile | `ResponsiveSheet` (bottom sheet on phones) | raw `Dialog` (admin/desktop-only surfaces excepted) |
| A sheet from the bottom edge (phones) | `<SheetContent side="bottom">` or `ResponsiveSheet`, both of which render `BottomSheetContent` (`ui/bottom-sheet.tsx`): grip, swipe to close, X on the title row. `preview="58dvh"` for a sheet that opens part-way and pulls up to 90 dvh (its footer `data-sheet-footer`, its scroll body `data-sheet-body`); `draggable={false}` only for a sheet that fills the window | a hand-rolled grab handle or drag; a `fixed bottom-0` panel standing in for a sheet |
| Date / time entry | `DateField` / `TimeField` / `DateTimeField` | native `type="date | time | datetime-local"` inputs (browser-locale trap, v1.25.4) |
| Small text action inside a line (Open schedule, Select all, View all, Retry, Learn more) | `InlineAction` (`ui/inline-action.tsx`): tone `primary` / `muted` / `foreground`, size `xs` / `sm`, `asChild` for a `Link`; owns the focus ring and `pointer-coarse:min-h-11` | a hand-rolled underlined `<button>` / `<Link>` (`inline-action-guard.test.ts`) |
| Mutually exclusive choice on one track (range, zoom, cards vs table, recent vs all) | `Segmented` (`ui/segmented.tsx`): no track, the chosen segment filled in primary (the chart tabs' look; a muted track with a raised segment was tried in 1.43.8 and dropped in 1.43.10 as too heavy); `mode="radio"` (default, roving focus) or `"toggle"` (view switches, form sheets), `iconOnly` for icon segments, `size="sm"` for range rows in a chart header; 44 px per segment on a coarse pointer | a row of ghost/secondary Buttons, a fifth segmented variant (`segmented.test.tsx` holds the definition to one module) |