diff --git a/src/app/ckb-v2-tokens.css b/src/app/ckb-v2-tokens.css
index 16dc2344c1..c33b25ee0a 100644
--- a/src/app/ckb-v2-tokens.css
+++ b/src/app/ckb-v2-tokens.css
@@ -57,6 +57,11 @@
--measure: 68ch; /* prose measure - never wider */
--header-h: 4rem; /* 64 */
+ /* Responsive breakpoint tokens - standard named scale (Task #336) */
+ --bp-phone: 640px;
+ --bp-tablet: 768px;
+ --bp-desktop: 1024px;
+
/* Type - 7 steps, each with its own line-height and tracking */
--text-xs: 0.75rem;
--text-xs-lh: 1rem;
diff --git a/src/app/globals.css b/src/app/globals.css
index 4fef90d7ad..4bc854abde 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -72,6 +72,11 @@
* New overlays go through components/ui/sheet.tsx rather than a new layer.
*/
@theme {
+ /* Named responsive breakpoint tokens (Task #336) */
+ --breakpoint-phone: 640px;
+ --breakpoint-tablet: 768px;
+ --breakpoint-desktop: 1024px;
+
/* Radius ladder: 4 · 6 · 10 · 12 · 16 · 20 — the 4px grid with two deliberate
half-steps. `sm` is 6px, for chips and pills that read as too heavy at 8.
`md` is 10px because it is the control rung, and it is the one value the v2
@@ -277,6 +282,11 @@
/* Theme tokens */
:root {
+ /* Named responsive breakpoint tokens (Task #336) */
+ --bp-phone: 640px;
+ --bp-tablet: 768px;
+ --bp-desktop: 1024px;
+
/* Layout constraints */
--content-max-width: 1440px;
--rail-width: 480px;
diff --git a/src/components/clinical-dashboard/search-results-header-band.tsx b/src/components/clinical-dashboard/search-results-header-band.tsx
index ae70d088bb..91150ecaf3 100644
--- a/src/components/clinical-dashboard/search-results-header-band.tsx
+++ b/src/components/clinical-dashboard/search-results-header-band.tsx
@@ -802,7 +802,7 @@ export function ResultSortControl({
* floor from `sm`, exactly like the filter controls.
*/
const emptyStateAction =
- "inline-flex min-h-tap items-center gap-1.5 rounded-lg border border-[color:var(--border)] px-3 text-xs font-extrabold text-[color:var(--text-muted)] hover:text-[color:var(--text)] sm:min-h-10";
+ "inline-flex min-h-tap items-center gap-1.5 rounded-lg border border-[color:var(--border)] px-3 text-xs font-semibold text-[color:var(--text-muted)] hover:text-[color:var(--text)] sm:min-h-10";
export function SearchResultsEmptyState({
modeId,
@@ -978,7 +978,7 @@ export function SearchResultsEmptyState({
)}
-
{emptyTitle}
+ {emptyTitle}
{emptyBody}
{!filtered ? (
@@ -999,7 +999,7 @@ export function SearchResultsEmptyState({
onClick={lastFilter.onRemove}
data-testid="search-results-empty-remove-filter"
className={cn(
- "inline-flex min-h-9 items-center gap-1.5 rounded-lg border border-[color:var(--clinical-accent-border)] bg-[color:var(--clinical-accent-soft)] px-3 text-xs font-extrabold text-[color:var(--clinical-accent)] hover:border-[color:var(--clinical-accent)]",
+ "inline-flex min-h-tap items-center gap-1.5 rounded-lg border border-[color:var(--clinical-accent-border)] bg-[color:var(--clinical-accent-soft)] px-3 text-xs font-semibold text-[color:var(--clinical-accent)] hover:border-[color:var(--clinical-accent)] sm:min-h-9",
focusRing,
)}
>
diff --git a/src/components/forms/form-detail-page.tsx b/src/components/forms/form-detail-page.tsx
index f98a06840e..0f117ad414 100644
--- a/src/components/forms/form-detail-page.tsx
+++ b/src/components/forms/form-detail-page.tsx
@@ -335,7 +335,7 @@ function DetailCard({