633 lines
20 KiB
JSON
633 lines
20 KiB
JSON
{
|
||
"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
|
||
}
|
||
]
|
||
}
|