2026-07-17 11:54:43 +08:00

633 lines
20 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"schemaVersion": 2,
"figma": {
"fileKey": "OTOg5cwbhVNWxkImGmzTJl",
"canvas": {
"id": "721:2016",
"name": "Fami运营"
},
"entryFrames": {
"history": {
"id": "837:4472",
"name": "历史前三",
"width": 1080,
"height": 2651
},
"current": {
"id": "837:4545",
"name": "历史前三",
"width": 1080,
"height": 2460
},
"rewards": {
"id": "837:4615",
"name": "历史前三",
"width": 1080,
"height": 3532
}
},
"references": {
"hero": {
"groupNode": "837:4721",
"maskNode": "837:4722",
"imageNode": "837:4723",
"bounds": {
"x": 0,
"y": 0,
"width": 1080,
"height": 1080
},
"runtimeExported": false,
"purpose": "Trace the Figma hero and bottom fade only. The runtime header is decomposed into the body watermark plus DOM/CSS title, date, note, and controls."
}
}
},
"policy": {
"rule": "Only isolated single visual nodes are shippable assets. Root canvases, complete state frames, multi-element regions, text, controls, leaderboard rows, reward grids, and dynamic business media are never runtime screenshots.",
"forbiddenAggregateNodes": [
"721:2016",
"837:4472",
"837:4545",
"837:4615",
"837:4475",
"837:4491",
"837:4507",
"837:4548",
"837:4564",
"837:4579",
"837:4618",
"837:4634",
"837:4649",
"837:4721"
],
"allowedSourceTypes": ["RECTANGLE"],
"forbiddenRuntimeNamePatterns": [
"hero",
"header",
"full-page",
"whole-page",
"leaderboard",
"reward-grid",
"frame-837"
]
},
"compositions": {
"pageBackground": {
"layers": ["body-watermark.webp"],
"dynamicSlots": []
},
"giftCard": {
"layers": ["gift-frame.webp", "gift-glow.webp"],
"dynamicSlots": ["gift.media"]
},
"tabs": {
"layers": ["tab-active.webp", "tab-inactive.webp"],
"dynamicSlots": ["tab.label", "tab.state"]
},
"leaderboard": {
"layers": ["medal-1.webp", "medal-2.webp", "medal-3.webp"],
"dynamicSlots": [
"user.avatar.top",
"user.avatar",
"user.displayName",
"user.score"
]
},
"rewardPanel": {
"layers": [
"reward-panel.webp",
"reward-heading.webp",
"gift-frame.webp",
"gift-glow.webp"
],
"dynamicSlots": [
"reward.rank",
"reward.giftMedia",
"reward.duration"
]
}
},
"fixtureBindings": [
{
"slot": "gift.media",
"file": "../fixtures/mock-gift.webp",
"mockOnly": true
},
{
"slot": "user.avatar.top",
"file": "../fixtures/mock-avatar-top.webp",
"mockOnly": true
},
{
"slot": "user.avatar",
"file": "../fixtures/mock-avatar-user.webp",
"mockOnly": true
}
],
"assets": [
{
"file": "body-watermark.webp",
"scope": "runtime",
"kind": "single-raster-image-fill",
"sourceNode": "837:4544",
"equivalentNodes": ["837:4614", "837:4718"],
"sourceName": "image 5022",
"sourceType": "RECTANGLE",
"purpose": "Text-free palace background reused by the decomposed Hero and as a low-opacity watermark behind DOM leaderboard and reward content",
"bounds": {
"relativeTo": "837:4472",
"x": -65,
"y": 987,
"width": 1210,
"height": 2689
},
"original": {
"width": 841,
"height": 1870
},
"exported": {
"width": 841,
"height": 1870
},
"figmaOpacity": 0.1,
"exportFormat": "webp-lossy",
"quality": 88,
"alphaQuality": null,
"hasAlpha": false,
"bytes": 605038,
"sha256": "b09813ba3587478745f587dd2f7c599cf7e35abf8ca957525d7c1e8fbb8f9e8b",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "gift-frame.webp",
"scope": "runtime",
"kind": "single-raster-ornamental-frame",
"sourceNode": "837:4479",
"equivalentNodes": ["837:4661"],
"sourceName": "058 1",
"sourceType": "RECTANGLE",
"purpose": "Green-gold gift frame under live gift media",
"bounds": {
"relativeTo": "837:4472",
"x": 61,
"y": 1247,
"width": 257,
"height": 258
},
"original": {
"width": 1169,
"height": 1175
},
"exported": {
"width": 514,
"height": 516
},
"figmaOpacity": 1,
"exportFormat": "webp-lossy",
"quality": 86,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 40204,
"sha256": "37842036b84402bb1b43a091b023a00a4221a442c0b0b9c882f864dc034af980",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "gift-glow.webp",
"scope": "runtime",
"kind": "single-raster-ornamental-overlay",
"sourceNode": "837:4662",
"equivalentNodes": [],
"sourceName": "电商双十一通用弹窗广告_设计页稿定设计 1",
"sourceType": "RECTANGLE",
"purpose": "Soft radial glow layered between the gift frame and live gift media",
"bounds": {
"relativeTo": "837:4615",
"x": 153.5,
"y": 2041,
"width": 219,
"height": 219
},
"original": {
"width": 1183,
"height": 1183
},
"exported": {
"width": 438,
"height": 438
},
"figmaOpacity": 0.34,
"exportFormat": "webp-lossy",
"quality": 84,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 33306,
"sha256": "06a7cb9da121e77a8e938c98c35ccfacdf5542cac92ec64dcc32bd2eec729c16",
"dependencies": ["gift-frame.webp"],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "tab-active.webp",
"scope": "runtime",
"kind": "single-raster-tab-skin",
"sourceNode": "837:4493",
"equivalentNodes": ["837:4569", "837:4642"],
"sourceName": "图层 0 36",
"sourceType": "RECTANGLE",
"purpose": "Selected tab skin; tab labels and click targets remain DOM",
"bounds": {
"relativeTo": "837:4472",
"x": 21,
"y": 1557,
"width": 335,
"height": 149
},
"original": {
"width": 1567,
"height": 697
},
"exported": {
"width": 672,
"height": 298
},
"figmaOpacity": 1,
"exportFormat": "webp-lossy",
"quality": 86,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 32938,
"sha256": "34d4346275416d33c5cf670245f873f710d120531bd9a94d773cca43f3d79a97",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "tab-inactive.webp",
"scope": "runtime",
"kind": "single-raster-tab-skin",
"sourceNode": "837:4496",
"equivalentNodes": [
"837:4499",
"837:4566",
"837:4572",
"837:4636",
"837:4639"
],
"sourceName": "二二 1",
"sourceType": "RECTANGLE",
"purpose": "Unselected tab skin; tab labels and click targets remain DOM",
"bounds": {
"relativeTo": "837:4472",
"x": 374,
"y": 1559,
"width": 336,
"height": 149
},
"original": {
"width": 1024,
"height": 455
},
"exported": {
"width": 672,
"height": 298
},
"figmaOpacity": 1,
"paintAdjustments": {
"saturation": -0.49
},
"exportFormat": "webp-lossy",
"quality": 86,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 22864,
"sha256": "07603c2c22b4fdc22efe1554049928de593f47ccd0cfb0c78b3d268e4c190b9e",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "medal-1.webp",
"scope": "runtime",
"kind": "single-raster-rank-medal",
"sourceNode": "837:4519",
"equivalentNodes": ["837:4589"],
"sourceName": "图层 2 1",
"sourceType": "RECTANGLE",
"purpose": "Rank-one medal beside live leaderboard identity data",
"bounds": {
"relativeTo": "837:4472",
"x": 45,
"y": 1939,
"width": 69,
"height": 61
},
"original": {
"width": 625,
"height": 553
},
"exported": {
"width": 207,
"height": 183
},
"figmaOpacity": 1,
"exportFormat": "webp-lossy",
"quality": 90,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 11526,
"sha256": "16122fdee746330822feeb64abe143100c25ccb706e50eb6cbea5a0c197fb87a",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "medal-2.webp",
"scope": "runtime",
"kind": "single-raster-rank-medal",
"sourceNode": "837:4524",
"equivalentNodes": ["837:4594"],
"sourceName": "图层 2 2",
"sourceType": "RECTANGLE",
"purpose": "Rank-two medal beside live leaderboard identity data",
"bounds": {
"relativeTo": "837:4472",
"x": 45,
"y": 2079,
"width": 69,
"height": 61
},
"original": {
"width": 642,
"height": 582
},
"exported": {
"width": 207,
"height": 188
},
"figmaOpacity": 1,
"exportFormat": "webp-lossy",
"quality": 90,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 10310,
"sha256": "6fd3956dcace1ff7646a3207ac68a23a33dd095ca597e7b62df5b60be07552b7",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "medal-3.webp",
"scope": "runtime",
"kind": "single-raster-rank-medal",
"sourceNode": "837:4531",
"equivalentNodes": [],
"sourceName": "图层 4 1",
"sourceType": "RECTANGLE",
"purpose": "Rank-three medal beside live leaderboard identity data",
"bounds": {
"relativeTo": "837:4472",
"x": 47,
"y": 2219,
"width": 63,
"height": 61
},
"original": {
"width": 619,
"height": 595
},
"exported": {
"width": 207,
"height": 199
},
"figmaOpacity": 1,
"exportFormat": "webp-lossy",
"quality": 90,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 11086,
"sha256": "2a5984f4166e0b832b74f4753db52b5e6dd59061a16698710e10aa9f020876c1",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "reward-panel.webp",
"scope": "runtime",
"kind": "single-raster-panel-skin",
"sourceNode": "837:4650",
"equivalentNodes": [],
"sourceName": "图层 0 37",
"sourceType": "RECTANGLE",
"purpose": "Empty reward panel skin behind DOM reward groups",
"bounds": {
"relativeTo": "837:4615",
"x": 24,
"y": 1760,
"width": 1033,
"height": 1689
},
"original": {
"width": 931,
"height": 1522
},
"exported": {
"width": 931,
"height": 1522
},
"figmaOpacity": 1,
"exportFormat": "webp-lossy",
"quality": 85,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 98298,
"sha256": "96f8029823e50297c46cec97809ec255ae040879df58a32c9d5a6f28acd56983",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "reward-heading.webp",
"scope": "runtime",
"kind": "single-raster-node-crop",
"sourceNode": "837:4653",
"equivalentNodes": ["837:4675", "837:4697"],
"sourceName": "2323a16b-9cbe-4acd-b676-8fd51cd1db70 1",
"sourceType": "RECTANGLE",
"purpose": "Cropped empty reward rank heading bar; TOP labels remain DOM text",
"bounds": {
"relativeTo": "837:4615",
"x": 225,
"y": 1876,
"width": 632,
"height": 98
},
"original": {
"width": 632,
"height": 98
},
"exported": {
"width": 632,
"height": 98
},
"figmaOpacity": 1,
"exportFormat": "webp-lossy",
"quality": 90,
"alphaQuality": 100,
"hasAlpha": true,
"bytes": 11798,
"sha256": "41fb59bae1e6800e95a712772179c49697129590fc99bb9a43f7e781a8c5c9de",
"dependencies": ["reward-panel.webp"],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": false,
"mockOnly": false,
"dynamic": false
},
{
"file": "../fixtures/mock-gift.webp",
"scope": "fixture",
"kind": "single-dynamic-media-fixture",
"sourceNode": "837:4480",
"equivalentNodes": ["837:4663"],
"sourceName": "10",
"sourceType": "RECTANGLE",
"purpose": "Figma sample gift used only by an explicit mock or visual-QA mode",
"bounds": {
"relativeTo": "837:4472",
"x": 96,
"y": 1288,
"width": 188,
"height": 188
},
"original": {
"width": 144,
"height": 144
},
"exported": {
"width": 144,
"height": 144
},
"figmaOpacity": 1,
"exportFormat": "webp-lossless",
"quality": null,
"alphaQuality": null,
"hasAlpha": true,
"bytes": 16014,
"sha256": "6c222a35801df12a90627e69eaf3945e268003be34b745d81357f22b1cf98c75",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": true,
"mockOnly": true,
"dynamic": true
},
{
"file": "../fixtures/mock-avatar-top.webp",
"scope": "fixture",
"kind": "single-dynamic-media-fixture",
"sourceNode": "837:4518",
"equivalentNodes": [],
"sourceName": "Rectangle 34",
"sourceType": "RECTANGLE",
"purpose": "Figma first-place avatar used only by an explicit mock or visual-QA mode",
"bounds": {
"relativeTo": "837:4472",
"x": 160,
"y": 1913,
"width": 113,
"height": 113
},
"original": {
"width": 1200,
"height": 1200
},
"exported": {
"width": 1200,
"height": 1200
},
"figmaOpacity": 1,
"exportFormat": "webp-lossless",
"quality": null,
"alphaQuality": null,
"hasAlpha": false,
"bytes": 1476722,
"sha256": "3740a7decc5288288b1b1e52393ea7a76a633ac7832764a06dab36cd44d66af0",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": true,
"mockOnly": true,
"dynamic": true
},
{
"file": "../fixtures/mock-avatar-user.webp",
"scope": "fixture",
"kind": "single-dynamic-media-fixture",
"sourceNode": "837:4523",
"equivalentNodes": [],
"sourceName": "Rectangle 35",
"sourceType": "RECTANGLE",
"purpose": "Figma leaderboard avatar used only by an explicit mock or visual-QA mode",
"bounds": {
"relativeTo": "837:4472",
"x": 160,
"y": 2053,
"width": 113,
"height": 113
},
"original": {
"width": 768,
"height": 1024
},
"exported": {
"width": 768,
"height": 1024
},
"figmaOpacity": 1,
"exportFormat": "webp-lossless",
"quality": null,
"alphaQuality": null,
"hasAlpha": false,
"bytes": 911586,
"sha256": "b23c230ada8cbc217ae6b238dd2df2efb9d46d79ea4b9b7e8a36e7f4230eaf3b",
"dependencies": [],
"containsText": false,
"containsControls": false,
"containsDynamicMedia": true,
"mockOnly": true,
"dynamic": true
}
]
}