Repository navigation
OpenConceptLab/ocl_issues#2844 | TBv2's footer links the Terms of Use and Privacy Policy - #55
Merged
paynejd merged 1 commit intoOct 14, 2026
Conversation
… and Privacy Policy The footer, on every page, signed in or not, now starts with Terms of Use and Privacy Policy links to the canonical openconceptlab.org pages, opening in a new tab. Labels are common.terms_of_use and common.privacy_policy in en, es and zh, with the same keys and strings as TBv3 and the Mapper (OpenConceptLab/ocl_issues#2899, OpenConceptLab/ocl_issues#2900). The left menu covers the footer's left end, so below 1100px the links take a row of their own and the rest wraps under them, right-aligned and clear of the closed menu. Footer publishes the extra height as --footer-extra-height, and .content's bottom margin adds it, so pages end above the taller footer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UML1sP39mf4a2ynq22C9RD
Member
Author
Codex review, pass 1 (codex-cli 0.162.1, commit d094636)Verdict: clean. No findings. findings.json{
"reviewer": "codex-cli 0.162.1",
"perspective": "defects",
"mode": "full",
"commit": "d094636a",
"verdict": "clean",
"prior": [],
"findings": []
} |
Member
Author
Simplification review (fresh Claude subagent, commit d094636)Verdict: one proposed cut.
simplify.json{
"reviewer": "claude subagent",
"perspective": "simplify",
"mode": "full",
"commit": "d094636a",
"verdict": "findings",
"prior": [],
"findings": [
{
"id": "S1",
"severity": null,
"tag": "native",
"file": "src/components/app/Footer.jsx",
"line": 37,
"claim": "The explicit `update();` before `new ResizeObserver(update)` is redundant. ResizeObserver sends an initial notification when observation starts on a rendered element whose size is not 0x0, and the footer always has a size. That callback runs during the rendering update, after layout and before paint, so --footer-extra-height is still set before the first frame is painted.",
"scenario": null,
"action": "Nothing replaces it: observer.observe(el) triggers the first update(). The same line is in the sibling OpenConceptLab/oclweb3#64 Footer.jsx, so drop it from both PRs or neither to keep them matching.",
"lines_delta": -1,
"confidence": "medium"
}
]
} |
5 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of OpenConceptLab/ocl_issues#2844. Using TBv2 means accepting OCL's Terms of Use, but TBv2 didn't link it or the Privacy Policy anywhere. The footer now does, on every page, signed in or not. The SSO sign-up screen is a separate PR: OpenConceptLab/oclsso#2.
What changed
The footer starts with Terms of Use (https://openconceptlab.org/terms-of-use) and Privacy Policy (https://openconceptlab.org/privacy-policy). Each opens in a new tab (
target="_blank",rel="noopener noreferrer").The URLs are
TERMS_OF_USE_URLandPRIVACY_POLICY_URLinsrc/common/constants.js.The labels are
common.terms_of_useandcommon.privacy_policyin en, es and zh, TBv2's three locales. The keys and strings are the same as in TBv3 (TBv3: link the Terms of Use and Privacy Policy from the footer ocl_issues#2899) and the Mapper (Mapper: link the Terms of Use and Privacy Policy from the footer ocl_issues#2900):common.terms_of_usecommon.privacy_policyThe link markup and the hover/focus fix match TBv3's footer. The links also get back a visible keyboard focus ring, which
App.scssremoves from every link, as the announcement banner's links do.Narrow screens
The footer row is right-aligned, and the left menu sits over its left end: 65 px closed, 250 px open. With the links added, the row is 640 px in English and 711 px in Spanish. Below 1100 px it would slide under the menu, and at 375 px the links would start off-screen.
.contentreserves only 50 px for it. So the footer publishes how much taller than 50 px it is as--footer-extra-height, and.content's bottom margin adds it. It uses aResizeObserver, asAnnouncementBannerdoes for--announcement-height. From 1100 px up the value is 0, so nothing changes there.TBv3 and the Mapper switch at 900 px. TBv2 needs a wider breakpoint because of its permanent left menu.
How I tested it
CI gate.
npm ci, then./node_modules/eslint/bin/eslint.js --ext .jsx,.js src/, both in anode:14container (the Node versionpr.ymluses). Both pass.Browser check. I ran the dev server in a
node:14container against the staging API, signed out. Headless Chromium checked en, es and zh, at 1280, 1100, 1099, 768, 600, 414 and 375 px, with the left menu closed, and at 1100, 1099 and 900 px with it open. On each it asserted that:target="_blank"andrel="noopener noreferrer", and the translated label;--footer-extra-heightequals the footer's height minus 50 px (0, 14, 36 or 68 px), the footer ends at the bottom of the page, and the page's content ends above it.The labels in es and zh were checked with a local, uncommitted override of
lnginsrc/i18n/config.js. TBv2's language menu shows only when signed in, and it lists only en and es. I also used a production-length build string (2.1.159-<sha>), so the measured widths match production.How to review it locally
Then open http://localhost:4000/ and check:
Terms of Use | Privacy Policy | © 2026 Open Concept Lab | Web … | API ….🤖 Generated with Claude Code
https://claude.ai/code/session_01UML1sP39mf4a2ynq22C9RD