Skip to content

Commit 65ae7ce

Browse files
hackmodscursoragent
andcommitted
refactor(public): shared fluid titles and examples hub prompts (batch 6)
Add public-type title tokens, drop email-broadcast tip measure pins, fluid ResourcesSourcesList heading, and examples footer catalog cards. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 1fb9313 commit 65ae7ce

6 files changed

Lines changed: 59 additions & 50 deletions

File tree

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Fluid UI migration checklist (in-scope)
22

3-
**Status:** Active — Batches 1–5 shipped 2026-09-08; pause for approval before Batch 6.
3+
**Status:** Active — Batches 1–6 shipped 2026-09-08; pause for approval before Batch 7.
44
**Standards:** [`.cursor/rules/guide-layout-standards.mdc`](../../.cursor/rules/guide-layout-standards.mdc), [`responsive-layouts.mdc`](../../.cursor/rules/responsive-layouts.mdc), [`public-marketing-ux.mdc`](../../.cursor/rules/public-marketing-ux.mdc).
5+
**Shared type tokens:** [`src/lib/constants/public-type.ts`](../../src/lib/constants/public-type.ts).
56
**Out of scope:** Officer Learning dark shell; `/privacy` `/security` `/accessibility`; canvas/`ToolEditorLayout` interiors; PDF export; Hub `/app/**` + Portal `/portal/**` (deferred product decision).
67

78
## Done (reference)
@@ -10,8 +11,7 @@
1011
- [x] `/guide` Blueprint (spotlight + link clusters)
1112
- [x] `/guide/workshops`, workshop outlines, land-ack, social-media-plan
1213
- [x] Most playbook shells on `guide-ui` barrel (GB-001/008)
13-
- [x] Batch 1–2: all `fullScenario` playbooks except joint-committee (then Batch 3)
14-
- [x] Batch 3: joint-committee + running-meetings + bylaws
14+
- [x] Batches 1–6 (playbook scenarios, hubs, simple polish)
1515

1616
---
1717

@@ -20,30 +20,19 @@
2020
| ID | Surface | Legacy signal | Target | Status |
2121
|----|---------|---------------|--------|--------|
2222
| S1 | `Steward101ModuleNav.tsx` | Raw `Callout` | `GuideCallout` | Done B4 |
23-
| S2 | `/guide/email-broadcast` | Inner prose pins in callouts | Rely on `GuideCallout` measure | |
23+
| S2 | `/guide/email-broadcast` | Inner prose pins in callouts | Rely on `GuideCallout` measure | Done B6 |
2424
| S3 | `/guide/union-boards` | `p.max-w-prose` inside accents | Drop redundant pins | Done B5 |
2525
| S4 | `/guide/website` CTAs only | `button-row max-w-lg` | `GuideActionRow` (keep `PartFrame`) | Done B4 |
26-
| S5 | `ResourcesSourcesList` heading | Rigid `text-xl` | Fluid clamp token | |
27-
| S6 | `/examples` title + footer prompts | Rigid h1; prose link dump | Fluid title; `GuideLinkCluster` | |
26+
| S5 | `ResourcesSourcesList` heading | Rigid `text-xl` | Fluid clamp token | Done B6 |
27+
| S6 | `/examples` title + footer prompts | Rigid h1; prose link dump | Fluid title; catalog cards | Done B6 |
2828
| S7 | `/updates` (`UpdatesContent`) | Rigid h1; raw Callout empty | Fluid title + marketing empty state | |
2929
| S8 | `/manifesto`, `/support`, `/feedback`, `/install`, `/assets` | Rigid page titles | Shared public title clamp | |
3030

3131
## Medium
3232

3333
| ID | Surface | Legacy signal | Target | Status |
3434
|----|---------|---------------|--------|--------|
35-
| M1 | `/guide/bargaining` `fullScenario` | `li.max-w-prose` | `GuideOutlineStep` | Done B1 |
36-
| M2 | `/guide/crisis` `fullScenario` | same | same | Done B1 |
37-
| M3 | `/guide/strike` `fullScenario` | same | same | Done B2 |
38-
| M4 | `/guide/photo-consent` `fullScenario` | same | same | Done B2 |
39-
| M5 | `/guide/dfr` `fullScenario` | same | same | Done B1 |
40-
| M6 | `/guide/right-to-refuse` `fullScenario` | same | same | Done B2 |
41-
| M7 | `/guide/joint-committee` `fullScenario` | same | same | Done B3 |
42-
| M8 | `/guide/running-meetings` | Agenda/motion pins; narrow diagrams | Outline/bullet + `GuideWideFigure` | Done B3 |
43-
| M9 | `/guide/bylaws` | Committee steps + figure pins | Outline + `GuideWideFigure` | Done B3 |
44-
| M10 | `/guide/grievance-process` | Local `ForumFlowFigure` `max-w-prose` | `GuideWideFigure` | Done B4 |
45-
| M11 | `/guide/resources` | Hand-rolled link grids / middot explore | `GuideLinkCluster` / catalog | Done B5 |
46-
| M12 | `/guide/short-form` | `Card` editor grid; `max-w-md` figure | Catalog cards + `GuideWideFigure` | Done B5 |
35+
| M1–M12 | Playbooks / hubs (see prior batches) | various | guide-ui primitives | Done B1–B5 |
4736
| M13 | `/guides` catalog | Local `StartHerePanel`; sparse lists | Shared catalog + fluid title | |
4837
| M14 | `/tools` catalog | Duplicate start-here; sparse groups | Align with `/guides` | |
4938
| M15 | `/captions` | Rigid h1; Card templates | Fluid title + catalog pattern | |
@@ -61,12 +50,10 @@
6150

6251
## Batch plan
6352

64-
1. ~~Batch 1~~ — M1/M2/M5 bargaining, crisis, dfr
65-
2. ~~Batch 2~~ — M3/M4/M6 strike, photo-consent, right-to-refuse
66-
3. ~~Batch 3~~ — M7/M8/M9 joint-committee, running-meetings, bylaws
67-
4. ~~Batch 4~~ — M10 grievance-process + S1 Steward101ModuleNav + S4 website CTA
68-
5. ~~Batch 5~~ — M11 resources + M12 short-form + S3 union-boards
69-
6. **Batch 6 (next):** Simple polish S2/S5 + catalog titles S6–S8 subset, or complex C4 steward-playbooks
70-
7. **Later:** M13–M16, C1–C3, C5
53+
1. ~~Batches 1–6~~ — playbook scenarios, hubs, simple polish through `/examples`
54+
2. **Batch 7 (next):** S7 updates + S8 public titles (manifesto/support/feedback/install/assets) — 2–3 files
55+
3. **Batch 8:** M13 `/guides` + M14 `/tools` catalog align
56+
4. **Batch 9:** M15 captions + M16 onboarding
57+
5. **Batch 10+:** Complex C1–C5
7158

7259
Pause for approval between batches.

src/app/[locale]/examples/page.tsx

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ import {
1111
import { ExampleCard } from "@/components/examples/ExampleCard";
1212
import { ComposedPageLayout } from "@/components/layout/ComposedPageLayout";
1313
import { WorkshopDemoPath } from "@/components/comms/WorkshopDemoPath";
14+
import {
15+
GuideCatalogCard,
16+
} from "@/components/comms/GuideSurfaces";
17+
import { guideCtaClassSm } from "@/components/comms/guideCtaClasses";
1418
import { useWorkshopDemoSession } from "@/hooks/use-workshop-demo-session";
19+
import { PUBLIC_PAGE_TITLE_CLASS } from "@/lib/constants/public-type";
1520
import { cn } from "@/lib/utils";
1621

1722
function ExampleFilters({
@@ -97,9 +102,7 @@ export default function ExamplesPage() {
97102
<WorkshopDemoPath variant="trail" className="mb-4" />
98103
) : null}
99104
<header className="max-w-3xl">
100-
<h1 className="text-2xl font-bold tracking-tight text-opseu-dark md:text-3xl">
101-
{t("title")}
102-
</h1>
105+
<h1 className={PUBLIC_PAGE_TITLE_CLASS}>{t("title")}</h1>
103106
<p className="mt-2 text-gray-600">{t("subtitle")}</p>
104107
</header>
105108

@@ -113,24 +116,26 @@ export default function ExamplesPage() {
113116
))}
114117
</div>
115118

116-
<p className="mt-10 max-w-prose text-sm text-gray-600">
117-
{t("planPrompt")}{" "}
118-
<Link
119-
href="/guide/social-media-plan"
120-
className="font-medium text-opseu-blue underline underline-offset-2 hover:text-opseu-dark"
121-
>
122-
{t("planLink")}
123-
</Link>
124-
</p>
125-
<p className="mt-3 max-w-prose text-sm text-gray-600">
126-
{t("captionsPrompt")}{" "}
127-
<Link
128-
href="/captions"
129-
className="font-medium text-opseu-blue underline underline-offset-2 hover:text-opseu-dark"
130-
>
131-
{t("captionsLink")}
132-
</Link>
133-
</p>
119+
<ul className="mt-10 grid list-none gap-6 p-0 sm:grid-cols-2">
120+
<GuideCatalogCard
121+
title={t("planLink")}
122+
body={t("planPrompt")}
123+
action={
124+
<Link href="/guide/social-media-plan" className={guideCtaClassSm}>
125+
{t("planLink")}
126+
</Link>
127+
}
128+
/>
129+
<GuideCatalogCard
130+
title={t("captionsLink")}
131+
body={t("captionsPrompt")}
132+
action={
133+
<Link href="/captions" className={guideCtaClassSm}>
134+
{t("captionsLink")}
135+
</Link>
136+
}
137+
/>
138+
</ul>
134139
</div>
135140

136141
<aside className="hidden lg:block print:hidden">

src/app/[locale]/guide/email-broadcast/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export default async function EmailBroadcastGuidePage({
116116
</GuideTipGrid>
117117
<GuideCallout className="mt-5">
118118
<p className="font-semibold text-opseu-dark">{t("tipLabel")}</p>
119-
<p className="mt-1 max-w-prose">{t("when.tip")}</p>
119+
<p className="mt-1">{t("when.tip")}</p>
120120
</GuideCallout>
121121
</GuideSection>
122122

src/components/comms/GuideLayout.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
type GuideCompositionPreset,
88
type PageComposition,
99
} from "@/lib/constants/page-composition";
10+
import { PUBLIC_PAGE_TITLE_CLASS } from "@/lib/constants/public-type";
1011
import {
1112
GuideRelatedLinkList,
1213
type GuideRelatedLink,
@@ -84,7 +85,7 @@ export function GuideLayout({
8485

8586
const headerBlock = (
8687
<header className={hub ? "max-w-3xl" : undefined}>
87-
<h1 className="text-[clamp(1.5rem,1.25rem+1vw,1.875rem)] font-bold tracking-tight text-opseu-dark">
88+
<h1 className={PUBLIC_PAGE_TITLE_CLASS}>
8889
{title}
8990
</h1>
9091
{subtitle && (

src/components/comms/ResourcesSourcesList.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
} from "@/lib/constants/comms-sources";
1111
import { useBrandStore } from "@/store/brand-store";
1212
import { GuideAccentBlock } from "@/components/comms/GuideOutline";
13+
import { PUBLIC_SECTION_TITLE_CLASS } from "@/lib/constants/public-type";
14+
import { cn } from "@/lib/utils";
1315

1416
const categoryOrder: CommsSourceCategory[] = [
1517
"branding",
@@ -34,8 +36,10 @@ export function ResourcesSourcesList() {
3436

3537
return (
3638
<div className="mt-10">
37-
<h2 className="text-xl font-bold text-opseu-dark">{t("allSources.title")}</h2>
38-
<p className="mt-2 text-gray-600">{t("allSources.intro")}</p>
39+
<h2 className={cn(PUBLIC_SECTION_TITLE_CLASS)}>
40+
{t("allSources.title")}
41+
</h2>
42+
<p className="mt-2 max-w-prose text-gray-600">{t("allSources.intro")}</p>
3943
{showScopeNote && (
4044
<p className="mt-2 text-sm text-gray-600">
4145
{t("allSources.scopedNote")}{" "}

src/lib/constants/public-type.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Shared fluid type tokens for public reading / catalog pages.
3+
* Keep GuideLayout / Home section titles in sync with these classes.
4+
*/
5+
export const PUBLIC_PAGE_TITLE_CLASS =
6+
"text-[clamp(1.5rem,1.25rem+1vw,1.875rem)] font-bold tracking-tight text-opseu-dark";
7+
8+
export const PUBLIC_SECTION_TITLE_CLASS =
9+
"text-[clamp(1.25rem,1.1rem+0.6vw,1.5rem)] font-bold text-opseu-dark";
10+
11+
export const PUBLIC_CARD_TITLE_CLASS =
12+
"text-[clamp(1.125rem,1.05rem+0.35vw,1.25rem)] font-bold text-opseu-dark";

0 commit comments

Comments
 (0)