mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-21 13:20:43 +00:00
dcf5d1b103
## Description: Add dynamic alliance icon with time-based fill and extension request indicator - Implement bottom-up green fill on alliance icon proportional to remaining time - Use AllianceIconFaded.svg as base layer with green overlay clipped from top - Add 20-82.40% clip range to account for icon vertical offset ## 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 <img width="1132" height="631" alt="Screenshot 2025-11-18 205205" src="https://github.com/user-attachments/assets/4af71ddc-f847-4460-9046-167275efc773" /> <img width="1387" height="792" alt="Screenshot 2025-11-18 205532" src="https://github.com/user-attachments/assets/9dd0e018-323f-4de1-bae8-2633c09fe867" /> ## Please put your Discord username so you can be contacted if a bug or regression is found: hauke4707 --------- Co-authored-by: Evan <evanpelle@gmail.com>
42 lines
1.7 KiB
TypeScript
42 lines
1.7 KiB
TypeScript
import { computeAllianceClipPath } from "../src/client/graphics/PlayerIcons";
|
|
|
|
describe("PlayerIcons", () => {
|
|
describe("computeAllianceClipPath", () => {
|
|
test("returns full visibility (20% top cut) when alliance time is at 100%", () => {
|
|
const result = computeAllianceClipPath(1.0);
|
|
// topCut = 20 + (1 - 1.0) * 80 * 0.78 = 20 + 0 = 20.00
|
|
expect(result).toBe("inset(20.00% -2px 0 -2px)");
|
|
});
|
|
|
|
test("returns maximum cut (82.40% top cut) when alliance time is at 0%", () => {
|
|
const result = computeAllianceClipPath(0.0);
|
|
// topCut = 20 + (1 - 0.0) * 80 * 0.78 = 20 + 62.4 = 82.40
|
|
expect(result).toBe("inset(82.40% -2px 0 -2px)");
|
|
});
|
|
|
|
test("returns 51.20% top cut when alliance time is at 50%", () => {
|
|
const result = computeAllianceClipPath(0.5);
|
|
// topCut = 20 + (1 - 0.5) * 80 * 0.78 = 20 + 31.2 = 51.20
|
|
expect(result).toBe("inset(51.20% -2px 0 -2px)");
|
|
});
|
|
|
|
test("returns 27.80% top cut when alliance time is at 87.5%", () => {
|
|
const result = computeAllianceClipPath(0.875);
|
|
// topCut = 20 + (1 - 0.875) * 80 * 0.78 = 20 + 7.8 = 27.80
|
|
expect(result).toBe("inset(27.80% -2px 0 -2px)");
|
|
});
|
|
|
|
test("returns 74.60% top cut when alliance time is at 12.5%", () => {
|
|
const result = computeAllianceClipPath(0.125);
|
|
// topCut = 20 + (1 - 0.125) * 80 * 0.78 = 20 + 54.6 = 74.60
|
|
expect(result).toBe("inset(74.60% -2px 0 -2px)");
|
|
});
|
|
|
|
test("includes -2px horizontal overscan to prevent subpixel gaps", () => {
|
|
const result = computeAllianceClipPath(0.5);
|
|
expect(result).toContain("-2px");
|
|
expect(result.match(/-2px/g)).toHaveLength(2); // Should appear twice (left and right)
|
|
});
|
|
});
|
|
});
|