Tos update#3916
Conversation
Revise legal resources to reflect current services and compliance. privacy-policy.html: major rewrite and reorganization — updated "Last Updated" date, added structured sections (Who We Are, Scope/Definitions, Information We Collect, Cookies, Legal Bases, Public Profiles, Data Retention, Transfers, Security, Your Rights, Automated Decision-Making, Children's Privacy, Third-Party Links, Changes, Contact), added table styles, cookie categories, retention table, international transfer safeguards, processor and advertising details (Stripe, Playwire), and contact/legal emails. terms-of-service.html: update styles and date, expand "Service" scope to include game clients (Steam, Crazy Games, etc.) and Discord bot, add eligibility/age requirements, strengthen conduct rules and add a detailed Fair Play / competitive integrity section (offensive identifiers, teaming in FFA, multi-accounting, rating manipulation, cheating, exploits, disruptive play, enforcement and appeals). These changes improve clarity, legal compliance (EEA/UK/CA references), and moderation/anti-abuse policies.
Update privacy policy and terms of service
## Description: Show bonus amount on currency packs - Add `bonusAmount` field to `PackSchema` (non-negative int) - Render a rotated green corner ribbon (`+X FREE!`) on pack tiles when `bonusAmount > 0` - Add `cosmetics.free` translation key with `numFree` param <img width="720" height="359" alt="Screenshot 2026-05-12 at 7 40 12 AM" src="https://github.com/user-attachments/assets/3dd70fc4-c922-47f4-aee6-055047b58563" /> Describe the PR. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: evan
Replace OpenFront LLC with OpenFront Inc. and add corporate identification in Privacy Policy and Terms of Service. Update registered agent and mailing address to Paracorp Incorporated (Camden, DE), change governing law to Delaware, and update "Last Updated" dates to 5/13/2026. Applies to resources/privacy-policy.html and resources/terms-of-service.html to reflect the company's legal and contact details.
WalkthroughThis PR introduces a bonus cosmetics feature with UI display, adds a loading spinner to the game mode selector, updates navigation styling with a CSS class, and comprehensively restructures the privacy policy and terms of service documents with revised legal language, new sections, and updated entity references. ChangesBonus cosmetics feature
Game mode loading state
Navigation styling updates
Legal documents restructure
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Warning Review ran into problems🔥 ProblemsStopped waiting for pipeline failures after 30000ms. One of your pipelines takes longer than our 30000ms fetch window to run, so review may not consider pipeline-failure results for inline comments if any failures occurred after the fetch window. Increase the timeout if you want to wait longer or run a Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/client/components/MobileNavBar.ts (1)
113-116:⚠️ Potential issue | 🟠 Major | ⚡ Quick winLeaderboard is still missing
no-crazygames.Mobile has the same partial update: clans is gated, leaderboard is not. Add the class here as well to match intended CrazyGames hiding behavior.
Suggested fix
- <button - class="nav-menu-item block w-full text-left font-bold uppercase tracking-[0.05em] text-white/70 transition-all duration-200 cursor-pointer hover:text-blue-600 hover:translate-x-2.5 hover:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] [&.active]:text-blue-600 [&.active]:translate-x-2.5 [&.active]:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] text-[clamp(18px,2.8vh,32px)] py-[clamp(0.2rem,0.8vh,0.75rem)]" + <button + class="no-crazygames nav-menu-item block w-full text-left font-bold uppercase tracking-[0.05em] text-white/70 transition-all duration-200 cursor-pointer hover:text-blue-600 hover:translate-x-2.5 hover:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] [&.active]:text-blue-600 [&.active]:translate-x-2.5 [&.active]:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] text-[clamp(18px,2.8vh,32px)] py-[clamp(0.2rem,0.8vh,0.75rem)]" data-page="page-leaderboard" data-i18n="main.leaderboard" ></button>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/client/components/MobileNavBar.ts` around lines 113 - 116, In the MobileNavBar component, the leaderboard button (the element with class "nav-menu-item" and data-page="page-leaderboard") is missing the no-crazygames class; update that button's class list to include "no-crazygames" so it follows the same CrazyGames gating as the clans item and hides correctly on CrazyGames builds.src/client/components/DesktopNavBar.ts (1)
122-125:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAdd
no-crazygamesto leaderboard button too.This layer’s goal looks only partially implemented in this file: clans has
no-crazygames, but leaderboard does not, so it can still appear on CrazyGames.Suggested fix
- <button - class="nav-menu-item text-white/70 hover:text-malibu-blue font-medium tracking-wider uppercase cursor-pointer transition-colors [&.active]:text-malibu-blue " + <button + class="no-crazygames nav-menu-item text-white/70 hover:text-malibu-blue font-medium tracking-wider uppercase cursor-pointer transition-colors [&.active]:text-malibu-blue " data-page="page-leaderboard" data-i18n="main.leaderboard" ></button>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/client/components/DesktopNavBar.ts` around lines 122 - 125, The leaderboard button in DesktopNavBar (the element with data-page="page-leaderboard" and data-i18n="main.leaderboard") is missing the no-crazygames class; update that button's class attribute to include "no-crazygames" alongside the existing classes (matching how the clans button is implemented) so the leaderboard is also hidden on CrazyGames.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@resources/privacy-policy.html`:
- Around line 55-70: Add a horizontal-scroll wrapper for long tables to prevent
overflow on small screens by wrapping each table element in a responsive
container (e.g., a div with a class like "table-responsive") and/or adding CSS
rules that target tables directly; update the HTML where tables are rendered
(the table elements referenced in the diff) to be wrapped in that container and
add CSS for .table-responsive { overflow-x: auto; -webkit-overflow-scrolling:
touch; } and ensure the table itself has max-width: 100% and display: table;
keep the existing th, td rules intact but add word-break: break-word; or
white-space: normal; to th, td to allow long legal text to wrap.
In `@resources/terms-of-service.html`:
- Around line 271-279: Replace plain-text email addresses with mailto: anchor
links wherever they appear (e.g., the "support@openfront.io" occurrence inside
the "6.9 Appeals" section and the other two occurrences noted). Find the <h3>6.9
Appeals</h3> paragraph and the other paragraphs containing the literal
"support@openfront.io" and wrap the email text in an <a
href="mailto:support@openfront.io">...</a> anchor so users can click to open
their mail client; ensure the visible text remains the email address and do the
same for any other plain-text emails at the other referenced locations.
In `@src/client/components/CosmeticButton.ts`:
- Around line 91-99: The bonus ribbon rendered when pack.bonusAmount > 0 in
CosmeticButton is being clipped by the parent container's overflow-hidden;
update the parent container (the wrapper element around the preview/ribbon in
the CosmeticButton component) to use overflow-visible instead of overflow-hidden
or apply overflow-visible conditionally when the ribbon will be rendered (i.e.,
when pack.bonusAmount > 0) so the absolutely-positioned ribbon (-right-8) is not
clipped; locate the wrapper in CosmeticButton and change the CSS class logic to
toggle overflow-visible when rendering the bonus ribbon.
In `@src/core/CosmeticSchemas.ts`:
- Line 86: Add unit tests for the new bonusAmount field on PackSchema in
CosmeticSchemas: create or update a test that imports PackSchema (from
CosmeticSchemas) and verifies PackSchema.safeParse/parse accepts valid integer
nonnegative values (e.g., 0 and positive ints) and rejects negative numbers,
non-integers (floats), and non-number types; also include a test for required
behavior (ensure omission fails if field is required, or succeeds if optional).
Use the existing test conventions for core schemas (safeParse assertions and
expectation of error messages) and place the test alongside other core/schema
tests so the test runner detects it.
---
Outside diff comments:
In `@src/client/components/DesktopNavBar.ts`:
- Around line 122-125: The leaderboard button in DesktopNavBar (the element with
data-page="page-leaderboard" and data-i18n="main.leaderboard") is missing the
no-crazygames class; update that button's class attribute to include
"no-crazygames" alongside the existing classes (matching how the clans button is
implemented) so the leaderboard is also hidden on CrazyGames.
In `@src/client/components/MobileNavBar.ts`:
- Around line 113-116: In the MobileNavBar component, the leaderboard button
(the element with class "nav-menu-item" and data-page="page-leaderboard") is
missing the no-crazygames class; update that button's class list to include
"no-crazygames" so it follows the same CrazyGames gating as the clans item and
hides correctly on CrazyGames builds.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 0b6ee07f-4a1b-4b2f-aeac-0f74c265ddd9
📒 Files selected for processing (8)
resources/lang/en.jsonresources/privacy-policy.htmlresources/terms-of-service.htmlsrc/client/GameModeSelector.tssrc/client/components/CosmeticButton.tssrc/client/components/DesktopNavBar.tssrc/client/components/MobileNavBar.tssrc/core/CosmeticSchemas.ts
| table { | ||
| border-collapse: collapse; | ||
| width: 100%; | ||
| margin: 15px 0; | ||
| } | ||
| th, | ||
| td { | ||
| border: 1px solid #ddd; | ||
| padding: 8px 12px; | ||
| text-align: left; | ||
| vertical-align: top; | ||
| } | ||
| th { | ||
| background-color: #f4f4f4; | ||
| color: #2980b9; | ||
| } |
There was a problem hiding this comment.
Improve table readability on small screens.
Line 55 and the table blocks at Line 248 and Line 474 can overflow on mobile because cells contain long legal text. Add a horizontal-scroll wrapper for tables.
Proposed fix
th {
background-color: `#f4f4f4`;
color: `#2980b9`;
}
+ .table-scroll {
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-scroll table {
+ min-width: 640px;
+ }- <table>
+ <div class="table-scroll">
+ <table>
<thead>
<tr>
<th>Purpose</th>
<th>Legal basis</th>
</tr>
</thead>
<tbody>
...
</tbody>
- </table>
+ </table>
+ </div>- <table>
+ <div class="table-scroll">
+ <table>
<thead>
<tr>
<th>Category of data</th>
<th>Typical retention period</th>
</tr>
</thead>
<tbody>
...
</tbody>
- </table>
+ </table>
+ </div>Also applies to: 248-337, 474-534
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@resources/privacy-policy.html` around lines 55 - 70, Add a horizontal-scroll
wrapper for long tables to prevent overflow on small screens by wrapping each
table element in a responsive container (e.g., a div with a class like
"table-responsive") and/or adding CSS rules that target tables directly; update
the HTML where tables are rendered (the table elements referenced in the diff)
to be wrapped in that container and add CSS for .table-responsive { overflow-x:
auto; -webkit-overflow-scrolling: touch; } and ensure the table itself has
max-width: 100% and display: table; keep the existing th, td rules intact but
add word-break: break-word; or white-space: normal; to th, td to allow long
legal text to wrap.
| <h3>6.9 Appeals</h3> | ||
| <p> | ||
| If you believe an enforcement action against your account was made in | ||
| error, you may contact us at support@openfront.io within 30 days of the | ||
| action. We will review appeals in good faith but reserve the right to | ||
| maintain or modify any enforcement action at our sole discretion. We do | ||
| not commit to a specific response timeframe and our decision on an appeal | ||
| is final. | ||
| </p> |
There was a problem hiding this comment.
Make support/legal emails clickable.
Line 274, Line 475, and Line 479 use plain text emails. Use mailto: links so users can contact faster, especially for appeals.
Proposed fix
- error, you may contact us at support@openfront.io within 30 days of the
+ error, you may contact us at
+ <a href="mailto:support@openfront.io">support@openfront.io</a>
+ within 30 days of the- legal@openfront.io
+ <a href="mailto:legal@openfront.io">legal@openfront.io</a>
<br /><br />
To appeal an enforcement action, please contact:
<br />
- support@openfront.io
+ <a href="mailto:support@openfront.io">support@openfront.io</a>Also applies to: 475-479
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@resources/terms-of-service.html` around lines 271 - 279, Replace plain-text
email addresses with mailto: anchor links wherever they appear (e.g., the
"support@openfront.io" occurrence inside the "6.9 Appeals" section and the other
two occurrences noted). Find the <h3>6.9 Appeals</h3> paragraph and the other
paragraphs containing the literal "support@openfront.io" and wrap the email text
in an <a href="mailto:support@openfront.io">...</a> anchor so users can click to
open their mail client; ensure the visible text remains the email address and do
the same for any other plain-text emails at the other referenced locations.
| ${pack.bonusAmount > 0 | ||
| ? html`<div | ||
| class="absolute top-3 -right-8 bg-green-500 text-white text-[10px] font-black px-8 py-0.5 rotate-45 shadow-md uppercase tracking-wide pointer-events-none" | ||
| > | ||
| ${translateText("cosmetics.free", { | ||
| numFree: pack.bonusAmount.toLocaleString(), | ||
| })} | ||
| </div>` | ||
| : nothing} |
There was a problem hiding this comment.
The bonus ribbon will be clipped by overflow-hidden.
The ribbon is positioned with -right-8 (extends outside its container), but the parent div at line 163 has overflow-hidden, which will clip the ribbon. The bonus indicator won't be visible as intended.
🎨 Proposed fix
Change line 163 from overflow-hidden to overflow-visible:
<div
- class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 overflow-hidden"
+ class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 overflow-visible"
>Or, if overflow control is needed for other preview types (flags), you could conditionally apply it:
<div
- class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 overflow-hidden"
+ class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 ${this.resolved.type === 'pack' ? 'overflow-visible' : 'overflow-hidden'}"
>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/client/components/CosmeticButton.ts` around lines 91 - 99, The bonus
ribbon rendered when pack.bonusAmount > 0 in CosmeticButton is being clipped by
the parent container's overflow-hidden; update the parent container (the wrapper
element around the preview/ribbon in the CosmeticButton component) to use
overflow-visible instead of overflow-hidden or apply overflow-visible
conditionally when the ribbon will be rendered (i.e., when pack.bonusAmount > 0)
so the absolutely-positioned ribbon (-right-8) is not clipped; locate the
wrapper in CosmeticButton and change the CSS class logic to toggle
overflow-visible when rendering the bonus ribbon.
| displayName: z.string(), | ||
| currency: z.enum(["hard", "soft"]), | ||
| amount: z.number().int().positive(), | ||
| bonusAmount: z.number().int().nonnegative(), |
There was a problem hiding this comment.
Add tests for the schema change.
The coding guidelines require that all changes to src/core/ must include tests. Please add test coverage for the new bonusAmount field in PackSchema.
Run the following script to check for existing test coverage:
#!/bin/bash
# Description: Search for test files covering PackSchema or CosmeticSchemas
# Search for test files that might cover this schema
rg -l 'PackSchema|CosmeticSchemas' --glob '*test*' --glob '*spec*'
# Search for any tests in the core directory
fd -e test.ts -e spec.ts . src/core/As per coding guidelines: "All changes to src/core/ must include tests"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/core/CosmeticSchemas.ts` at line 86, Add unit tests for the new
bonusAmount field on PackSchema in CosmeticSchemas: create or update a test that
imports PackSchema (from CosmeticSchemas) and verifies
PackSchema.safeParse/parse accepts valid integer nonnegative values (e.g., 0 and
positive ints) and rejects negative numbers, non-integers (floats), and
non-number types; also include a test for required behavior (ensure omission
fails if field is required, or succeeds if optional). Use the existing test
conventions for core schemas (safeParse assertions and expectation of error
messages) and place the test alongside other core/schema tests so the test
runner detects it.
Tos updates, altering the current registered address and other legal changes. Effecitve date of today 13/05/2026
Describe the PR.
Tos updates, altering the current registered address and other legal changes. Effecitve date of today 13/05/2026
Please complete the following:
Please put your Discord username so you can be contacted if a bug or regression is found:
Iamlewis