Skip to content

Commit 285b2d1

Browse files
feat: hide author name on mobile footer and add contact links to legal page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4e7c0f1 commit 285b2d1

File tree

5 files changed

+195
-15
lines changed

5 files changed

+195
-15
lines changed

agentic/commands/context.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ This prompt helps you determine what documentation you should read based on the
4848
- When implementing new visualizations
4949
- When modifying existing plot implementations
5050

51+
- agentic/context/260207-footer-responsive-hide-name-add-contact-links.md
52+
- Conditions:
53+
- When working with the Footer component responsive behavior
54+
- When modifying contact or social links in the Legal page
55+
- When adjusting mobile breakpoint visibility of footer elements
56+
5157
- agentic/
5258
- Conditions:
5359
- When working with agentic commands or workflows
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Responsive Footer Name & Legal Contact Links
2+
3+
**Run ID:** d7e7bdf6
4+
**Date:** 2026-02-07
5+
**Specification:** agentic/specs/260207-footer-responsive-hide-name-add-contact-links.md
6+
7+
## Overview
8+
9+
The footer's "markus neusinger" link is hidden on mobile viewports (below 960px / `md` breakpoint) to prevent a cramped layout, and social contact links (LinkedIn, X, GitHub) were added to the Legal Notice page's Contact section to keep contact information discoverable.
10+
11+
## What Was Built
12+
13+
- Responsive hiding of the "markus neusinger" link and its dot separators in the footer on screens below the `md` breakpoint (960px)
14+
- LinkedIn, X (Twitter), and GitHub contact links added to the Legal Notice page Contact section with analytics tracking
15+
16+
## Technical Implementation
17+
18+
### Files Modified
19+
20+
- `app/src/components/Footer.tsx`: Wrapped the "markus neusinger" link and its surrounding dot separators in a `<Box>` with responsive `display` (`{ xs: 'none', md: 'contents' }`) to hide them on mobile
21+
- `app/src/pages/LegalPage.tsx`: Added three social links (LinkedIn, X, GitHub) to the Contact section below the existing email link, each with `target="_blank"`, `rel="noopener noreferrer"`, matching `#3776AB` color styling, and `trackEvent` analytics calls
22+
23+
### Key Changes
24+
25+
- Used MUI's responsive `sx` display prop for pure CSS-based hiding — no JavaScript media query hooks needed
26+
- The `<Box component="span" sx={{ display: { xs: 'none', md: 'contents' } }}>` wrapper ensures the name link and both adjacent dot separators are hidden/shown together, and `contents` on desktop means the Box has no visual impact
27+
- Social links in the Legal page follow the existing pattern: `<br />` line breaks within the `<Typography>` block, consistent `#3776AB` link color
28+
- Analytics tracking uses `trackEvent('external_link', { destination: 'linkedin' | 'x' | 'github_personal' })` matching the existing event pattern
29+
30+
## How to Use
31+
32+
1. On mobile devices or viewports narrower than 960px, the footer displays: `github · stats · mcp · legal`
33+
2. On desktop viewports (960px and wider), the footer displays the full set: `github · stats · markus neusinger · mcp · legal`
34+
3. Social contact links are always visible on the Legal Notice page (`/legal`) in the Contact section
35+
36+
## Configuration
37+
38+
No configuration needed. The `md` breakpoint (960px) is defined by the MUI theme and matches the FilterBar's mobile breakpoint.
39+
40+
## Testing
41+
42+
- `cd app && npx tsc --noEmit` — Verify TypeScript types
43+
- `cd app && yarn build` — Verify no compilation errors
44+
- Resize browser below/above 960px to confirm the footer name link hides/shows
45+
- Visit `/legal` and verify LinkedIn, X, and GitHub links appear in the Contact section
46+
47+
## Notes
48+
49+
- The 960px breakpoint was chosen to match where the FilterBar catalog/filter row wraps to 2 lines on the homepage
50+
- The LinkedIn URL in the footer and Legal page are intentionally the same — redundancy ensures discoverability
51+
- The `github_personal` destination in analytics distinguishes the personal GitHub profile link from the project repository link
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Feature: Responsive Footer Name & Legal Contact Links
2+
3+
## Metadata
4+
5+
run_id: `d7e7bdf6`
6+
prompt: `im footer mein name markus neusinger ist recht lang bei kleinen bildschrimen mobile... sieht das nichtmehr gut, minimal aus, ich möchte das ab der grösse bei der auch auf der startseite die filter zeile mit catolog... steht in 2 zeilen übergeht das mein name nichtmehr im footer zu sehen ist, dafür soll aber im legal tab bei contact links zu meinem linkedin x und github account sein zusätlich zu der email die schon da steht https://x.com/MarkusNeusinger https://github.com/MarkusNeusinger https://www.linkedin.com/in/markus-neusinger/`
7+
8+
## Feature Description
9+
10+
Two related changes to improve the mobile experience:
11+
12+
1. **Footer**: Hide the "markus neusinger" link on small screens (below `md` / 960px breakpoint) — the same breakpoint where the FilterBar catalog/filter row wraps to 2 lines on the homepage. The name is too long and makes the footer look cramped on mobile. The dot separator before/after the name link should also be hidden.
13+
14+
2. **Legal Page**: Add social/contact links (LinkedIn, X/Twitter, GitHub) to the Contact section in the Legal Notice, alongside the existing email. This ensures the contact information remains discoverable even when the footer name link is hidden on mobile.
15+
16+
## Requirements
17+
18+
- Hide the "markus neusinger" link (and its surrounding dot separators) in the footer when viewport width is below `md` (960px) — matching the FilterBar's `isMobile` breakpoint
19+
- On viewports `md` and above (960px+), the footer remains unchanged
20+
- Add LinkedIn, X (Twitter), and GitHub links to the Contact section of the Legal Notice on LegalPage
21+
- Social links: LinkedIn (`https://www.linkedin.com/in/markus-neusinger/`), X (`https://x.com/MarkusNeusinger`), GitHub (`https://github.com/MarkusNeusinger`)
22+
- Maintain consistent styling with existing Legal Page link patterns (color `#3776AB`, monospace font)
23+
- Track social link clicks via existing analytics (`onTrackEvent` / `trackEvent`)
24+
25+
## Relevant Files
26+
27+
### Existing Files to Modify
28+
29+
- **`app/src/components/Footer.tsx`** — Hide the "markus neusinger" `<Link>` and its adjacent dot `<span>` separators on screens below `md` breakpoint using MUI's `sx` display responsive prop
30+
- **`app/src/pages/LegalPage.tsx`** — Add LinkedIn, X, and GitHub links to the Contact section (lines 102-109) in the Legal Notice Paper, below the existing email link
31+
32+
### New Files to Create
33+
34+
None.
35+
36+
## Implementation Plan
37+
38+
IMPORTANT: Execute every step in order, top to bottom.
39+
40+
### 1. Update Footer to hide name on mobile
41+
42+
In `app/src/components/Footer.tsx`:
43+
44+
- Add `useMediaQuery` and `useTheme` imports from MUI
45+
- Add `const theme = useTheme()` and `const isMobile = useMediaQuery(theme.breakpoints.down('md'))` inside the component
46+
- Wrap the "markus neusinger" `<Link>` (lines 54-66) and the `<span>·</span>` separator immediately **before** it (line 53) in a `<Box>` (or use `sx={{ display: { xs: 'none', md: 'contents' } }}`) to hide them on small screens
47+
- The simplest approach: use MUI's responsive `display` prop on the separator span and the link:
48+
- On the `<span>·</span>` at line 53: add `sx={{ display: { xs: 'none', md: 'inline' } }}`
49+
- On the `<Link>` for "markus neusinger": add `display: { xs: 'none', md: 'inline' }` to its `sx` prop
50+
- This leaves the remaining 4 links (github · stats · mcp · legal) visible on mobile, with proper dot separation
51+
52+
### 2. Add social/contact links to Legal Page
53+
54+
In `app/src/pages/LegalPage.tsx`:
55+
56+
- Locate the Contact section inside the Legal Notice Paper (around lines 102-109)
57+
- After the existing email link `<Link>`, add three more links on separate lines:
58+
- LinkedIn: `https://www.linkedin.com/in/markus-neusinger/`
59+
- X: `https://x.com/MarkusNeusinger`
60+
- GitHub: `https://github.com/MarkusNeusinger`
61+
- Use the same styling pattern as the email link (`sx={{ color: '#3776AB' }}`)
62+
- Add `target="_blank"` and `rel="noopener noreferrer"` for external links
63+
- Add `onClick` analytics tracking with `trackEvent('external_link', { destination: 'linkedin' })` etc.
64+
- Structure: keep it as a simple list within the existing `<Typography sx={textStyle}>` block using `<br />` for line breaks (matching the existing pattern in the Contact section)
65+
66+
### 3. Verify responsive behavior
67+
68+
- Build the frontend to ensure no TypeScript/compilation errors
69+
- Verify the footer shows 4 links on mobile (<960px) and 5 links on desktop (>=960px)
70+
- Verify the Legal page Contact section shows email + 3 social links
71+
72+
### 4. Add Tests
73+
74+
- No frontend test files exist in the project currently — skip test creation as there is no test infrastructure for React components
75+
76+
## Validation Commands
77+
78+
Execute these commands to validate the feature:
79+
80+
- `cd app && npx tsc --noEmit` - Check TypeScript types
81+
- `cd app && yarn build` - Build frontend to verify no compilation errors
82+
83+
## Notes
84+
85+
- The `md` breakpoint (960px) was chosen because the user specifically asked for the same breakpoint where the FilterBar wraps to 2 lines, and `FilterBar.tsx` uses `theme.breakpoints.down('md')` for its `isMobile` check
86+
- Using MUI responsive `display` (`{ xs: 'none', md: 'inline' }`) is the lightest-weight approach — no JS needed, pure CSS media queries via MUI's system
87+
- The existing LinkedIn link in the footer (`markus neusinger`) already points to the same URL that will be added to the Legal page — this is intentional redundancy for discoverability
88+
- The GitHub link uses `GITHUB_URL` constant already imported in LegalPage for the Source Code section; the personal GitHub URL (`https://github.com/MarkusNeusinger`) is different from the project repo URL

app/src/components/Footer.tsx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,23 @@ export function Footer({ onTrackEvent, selectedSpec, selectedLibrary }: FooterPr
5050
>
5151
stats
5252
</Link>
53-
<span>·</span>
54-
<Link
55-
href="https://www.linkedin.com/in/markus-neusinger/"
56-
target="_blank"
57-
rel="noopener noreferrer"
58-
onClick={() => onTrackEvent?.('external_link', { destination: 'linkedin', spec: selectedSpec, library: selectedLibrary })}
59-
sx={{
60-
color: '#9ca3af',
61-
textDecoration: 'none',
62-
'&:hover': { color: '#6b7280' },
63-
}}
64-
>
65-
markus neusinger
66-
</Link>
67-
<span>·</span>
53+
<Box component="span" sx={{ display: { xs: 'none', md: 'contents' } }}>
54+
<span>·</span>
55+
<Link
56+
href="https://www.linkedin.com/in/markus-neusinger/"
57+
target="_blank"
58+
rel="noopener noreferrer"
59+
onClick={() => onTrackEvent?.('external_link', { destination: 'linkedin', spec: selectedSpec, library: selectedLibrary })}
60+
sx={{
61+
color: '#9ca3af',
62+
textDecoration: 'none',
63+
'&:hover': { color: '#6b7280' },
64+
}}
65+
>
66+
markus neusinger
67+
</Link>
68+
<span>·</span>
69+
</Box>
6870
<Link
6971
component={RouterLink}
7072
to="/mcp"

app/src/pages/LegalPage.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,39 @@ export function LegalPage() {
106106
<Link href="mailto:admin@pyplots.ai" sx={{ color: '#3776AB' }}>
107107
admin@pyplots.ai
108108
</Link>
109+
<br />
110+
LinkedIn:{' '}
111+
<Link
112+
href="https://www.linkedin.com/in/markus-neusinger/"
113+
target="_blank"
114+
rel="noopener noreferrer"
115+
onClick={() => trackEvent('external_link', { destination: 'linkedin' })}
116+
sx={{ color: '#3776AB' }}
117+
>
118+
markus-neusinger
119+
</Link>
120+
<br />
121+
X:{' '}
122+
<Link
123+
href="https://x.com/MarkusNeusinger"
124+
target="_blank"
125+
rel="noopener noreferrer"
126+
onClick={() => trackEvent('external_link', { destination: 'x' })}
127+
sx={{ color: '#3776AB' }}
128+
>
129+
@MarkusNeusinger
130+
</Link>
131+
<br />
132+
GitHub:{' '}
133+
<Link
134+
href="https://github.com/MarkusNeusinger"
135+
target="_blank"
136+
rel="noopener noreferrer"
137+
onClick={() => trackEvent('external_link', { destination: 'github_personal' })}
138+
sx={{ color: '#3776AB' }}
139+
>
140+
MarkusNeusinger
141+
</Link>
109142
</Typography>
110143

111144
<Typography sx={textStyle}>

0 commit comments

Comments
 (0)