diff --git a/.memory/worklog.json b/.memory/worklog.json index 5940161..6b7cbad 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -97,6 +97,13 @@ "message": "auto-save 2026-04-22 16:35 (~1)", "hash": "34e05c6", "files_changed": 1 + }, + { + "ts": "2026-04-22T16:41:21+08:00", + "type": "commit", + "message": "auto-save 2026-04-22 16:41 (~1)", + "hash": "89dacb7", + "files_changed": 1 } ] } diff --git a/figma-match-report.json b/figma-match-report.json index f651614..f43d8c3 100644 --- a/figma-match-report.json +++ b/figma-match-report.json @@ -3,423 +3,730 @@ "W": "W1", "name": "Saascuy - Saas Landing Page UI KIT", "kind": "fig", - "source_stem": "saascuy", - "matched": "saascuy", - "key": "pxsKzhDM8UL8oTSB4hUpOZ", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "saascuy", + "matched": "saascuy", + "key": "pxsKzhDM8UL8oTSB4hUpOZ", + "score": 1.0 + } + ] }, { "W": "W10", "name": "Havoc Agency UI Kit", "kind": "fig", - "source_stem": "Havoc Agency UI Kit", - "matched": "Havoc Agency UI Kit", - "key": "EKp3ZDo2A3kDp88DMvFqte", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Havoc Agency UI Kit", + "matched": "Havoc Agency UI Kit", + "key": "EKp3ZDo2A3kDp88DMvFqte", + "score": 1.0 + } + ] }, { "W": "W11", "name": "Limitless for Web", "kind": "sketch", - "source_stem": "yoyolabs-Limitless-for-Web-file", - "matched": "yoyolabs-Limitless-for-Web-file", - "key": "IGfS4r69yANQazOxLSjnyQ", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "yoyolabs-Limitless-for-Web-file", + "matched": "yoyolabs-Limitless-for-Web-file", + "key": "IGfS4r69yANQazOxLSjnyQ", + "score": 1.0 + } + ] }, { "W": "W12", "name": "Premise - Website and Landing Page Wireframe Kit - Desktop", "kind": "sketch", - "source_stem": "DARK:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", - "matched": "DARK:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", - "key": "RCAZWKHkrBzwikzpBCebMz", - "score": 1.0 + "source_count": 2, + "variants": [ + { + "source_stem": "DARK:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "matched": "DARK:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "key": "RCAZWKHkrBzwikzpBCebMz", + "score": 1.0 + }, + { + "source_stem": "LIGHT:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "matched": "LIGHT:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "key": "pEKy0RBAp93TLIDlnoTsFi", + "score": 1.0 + } + ] }, { "W": "W13", "name": "Premium Online Shop UI Kit & Dashboard", "kind": "fig", - "source_stem": "Online Shop UI Kit", - "matched": "Online Shop UI Kit", - "key": "ms5OYBa3fRlDwRmSLWWorY", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Online Shop UI Kit", + "matched": "Online Shop UI Kit", + "key": "ms5OYBa3fRlDwRmSLWWorY", + "score": 1.0 + } + ] }, { "W": "W14", "name": "Ui Max", "kind": "fig", - "source_stem": "Figmaland-UI MAX ( ui8 )", - "matched": "Figmaland-UI MAX ( ui8 )", - "key": "s5KbowY6N6M4IkjHbgLjOc", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Figmaland-UI MAX ( ui8 )", + "matched": "Figmaland-UI MAX ( ui8 )", + "key": "s5KbowY6N6M4IkjHbgLjOc", + "score": 1.0 + } + ] }, { "W": "W15", "name": "BelloBlue Fashion + Delivery Web App", "kind": "sketch", - "source_stem": "Sketch File", - "matched": "Sketch File", - "key": "dM5zUotUlacnEPU9Oo0RcJ", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Sketch File", + "matched": "Sketch File", + "key": "dM5zUotUlacnEPU9Oo0RcJ", + "score": 1.0 + } + ] }, { "W": "W16", "name": "Eco -Ecommerce Analytics Admin Dashboard Kit", "kind": "fig", - "source_stem": "Eco -Ecommerce Analytics Admin Dashboard", - "matched": "Eco -Ecommerce Analytics Admin Dashboard", - "key": "fsufV596UmcNyM8yfCYlAr", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Eco -Ecommerce Analytics Admin Dashboard", + "matched": "Eco -Ecommerce Analytics Admin Dashboard", + "key": "fsufV596UmcNyM8yfCYlAr", + "score": 1.0 + } + ] }, { "W": "W18", "name": "Elemento UI Kit", "kind": "sketch", - "source_stem": "Elemento-UI-Kit", - "matched": "Elemento-UI-Kit", - "key": "byZYVoOiuEEtSMjH7JxcQO", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Elemento-UI-Kit", + "matched": "Elemento-UI-Kit", + "key": "byZYVoOiuEEtSMjH7JxcQO", + "score": 1.0 + } + ] }, { "W": "W2", "name": "Core – Dashboard Builder", "kind": "fig", - "source_stem": "Core - Dashboard Builder", - "matched": "Core - Dashboard Builder", - "key": "G4mWQN0IWGkAKpD7Ga0bG3", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Core - Dashboard Builder", + "matched": "Core - Dashboard Builder", + "key": "G4mWQN0IWGkAKpD7Ga0bG3", + "score": 1.0 + } + ] }, { "W": "W20", "name": "Kovid Flew - Coronavirus Awareness", "kind": "sketch", - "source_stem": "Kovid Flew", - "matched": "Kovid Flew", - "key": "crK1Yhtws6yWkBKcN1OCqB", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Kovid Flew", + "matched": "Kovid Flew", + "key": "crK1Yhtws6yWkBKcN1OCqB", + "score": 1.0 + } + ] }, { "W": "W21", "name": "Landing Page UI kit fully compatible", "kind": "sketch", - "source_stem": "Login_page_2020", - "matched": "Login_page_2020", - "key": "SYINzgEkzGIwZF15AvuDcn", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Login_page_2020", + "matched": "Login_page_2020", + "key": "SYINzgEkzGIwZF15AvuDcn", + "score": 1.0 + } + ] }, { "W": "W24", "name": "Webflew Agency Template UI Kit", "kind": "fig", - "source_stem": "Webflew Agency UI Kit", - "matched": "Webflew Agency UI Kit", - "key": "Sarco9c50gDttu37szmurE", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Webflew Agency UI Kit", + "matched": "Webflew Agency UI Kit", + "key": "Sarco9c50gDttu37szmurE", + "score": 1.0 + } + ] }, { "W": "W25", "name": "Core – Dashboard Builder", "kind": "fig", - "source_stem": "Core - Dashboard Builder", - "matched": "Core - Dashboard Builder", - "key": "x3g1FivshKeZ9PwccE7w3w", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Core - Dashboard Builder", + "matched": "Core - Dashboard Builder", + "key": "x3g1FivshKeZ9PwccE7w3w", + "score": 1.0 + } + ] }, { "W": "W26", "name": "Jobhuntly - Job Board & Portal UI Kit", "kind": "fig", - "source_stem": "Jobhuntly - Job Board & Portal UI Kit", - "matched": "Jobhuntly - Job Board & Portal UI Kit", - "key": "oyHlh6eh7TjxYhCUbFTvBS", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Jobhuntly - Job Board & Portal UI Kit", + "matched": "Jobhuntly - Job Board & Portal UI Kit", + "key": "oyHlh6eh7TjxYhCUbFTvBS", + "score": 1.0 + } + ] }, { "W": "W27", "name": "Omega - Landing Page Design Template", "kind": "sketch", - "source_stem": "Omega", - "matched": "Omega", - "key": "yIhPCq93LSUkzrJUVQjU1r", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Omega", + "matched": "Omega", + "key": "yIhPCq93LSUkzrJUVQjU1r", + "score": 1.0 + } + ] }, { "W": "W28", "name": "Finity - Landing Page Template", "kind": "fig", - "source_stem": "Landing UI Kit", - "matched": "Landing UI Kit", - "key": "5R9tevOwnk4iJzU3jEjg0q", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Landing UI Kit", + "matched": "Landing UI Kit", + "key": "5R9tevOwnk4iJzU3jEjg0q", + "score": 1.0 + } + ] }, { "W": "W29", "name": "Loomi", "kind": "fig", - "source_stem": "LOOMI", - "matched": "LOOMI", - "key": "dvPWtG7KaEWr895iCI0Ioy", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "LOOMI", + "matched": "LOOMI", + "key": "dvPWtG7KaEWr895iCI0Ioy", + "score": 1.0 + } + ] }, { "W": "W3", "name": "UXFlow Web Kit Design", "kind": "fig", - "source_stem": "UXFlow Web Kit", - "matched": "UXFlow Web Kit", - "key": "5CZLD5lcxxRQNE1QWjqbmP", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "UXFlow Web Kit", + "matched": "UXFlow Web Kit", + "key": "5CZLD5lcxxRQNE1QWjqbmP", + "score": 1.0 + } + ] }, { "W": "W30", "name": "Rybble TM", "kind": "sketch", - "source_stem": "Rybble TM", - "matched": "Rybble TM", - "key": "AcNy87P0xlqDvkeeBqrQpO", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Rybble TM", + "matched": "Rybble TM", + "key": "AcNy87P0xlqDvkeeBqrQpO", + "score": 1.0 + } + ] }, { "W": "W31", "name": "Sydney Oasis Hotel - Websites Template", "kind": "fig", - "source_stem": "Sydney Oasis Hotel Websites", - "matched": "Sydney Oasis Hotel Websites", - "key": "khWI1rrgwj5702NilEcha2", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Sydney Oasis Hotel Websites", + "matched": "Sydney Oasis Hotel Websites", + "key": "khWI1rrgwj5702NilEcha2", + "score": 1.0 + } + ] }, { "W": "W32", "name": "DevAgency - Web Ui Kits", "kind": "fig", - "source_stem": "DevAgency - Web Ui Kits", - "matched": "DevAgency - Web Ui Kits", - "key": "qFC0pVEHe9Toc2aJ2MgO32", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "DevAgency - Web Ui Kits", + "matched": "DevAgency - Web Ui Kits", + "key": "qFC0pVEHe9Toc2aJ2MgO32", + "score": 1.0 + } + ] }, { "W": "W33", "name": "Insight - Dashboard UI Kit", "kind": "fig", - "source_stem": "Social Media Dashboard - UI Kit", - "matched": "Social Media Dashboard - UI Kit", - "key": "RKIYTIOCADVsASHNxZ5tr2", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Social Media Dashboard - UI Kit", + "matched": "Social Media Dashboard - UI Kit", + "key": "RKIYTIOCADVsASHNxZ5tr2", + "score": 1.0 + } + ] }, { "W": "W34", "name": "Intirior Architecture web ui kit", "kind": "fig", - "source_stem": "Intirior Architecture web ui kit", - "matched": "Intirior Architecture web ui kit", - "key": "BfBzvqu4VK53iSD5fbKNAo", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Intirior Architecture web ui kit", + "matched": "Intirior Architecture web ui kit", + "key": "BfBzvqu4VK53iSD5fbKNAo", + "score": 1.0 + } + ] }, { "W": "W35", "name": "JackCreative Personal Portfolio Website Design", "kind": "fig", - "source_stem": "JackCreative", - "matched": "JackCreative", - "key": "RNRNDiF6gFcTCi6wJncvgv", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "JackCreative", + "matched": "JackCreative", + "key": "RNRNDiF6gFcTCi6wJncvgv", + "score": 1.0 + } + ] }, { "W": "W36", "name": "AppStarter UI Kit", "kind": "sketch", - "source_stem": "AppStarter Sample (Wireframe)", - "matched": "AppStarter Sample (Wireframe)", - "key": "4lPiQwfUnlIh2cRvqFabSn", - "score": 1.0 + "source_count": 4, + "variants": [ + { + "source_stem": "AppStarter Sample (Wireframe)", + "matched": "AppStarter Sample (Wireframe)", + "key": "4lPiQwfUnlIh2cRvqFabSn", + "score": 1.0 + }, + { + "source_stem": "AppStarter Sample", + "matched": "AppStarter Sample", + "key": "qhPf33kALID79IthiURFfK", + "score": 1.0 + }, + { + "source_stem": "AppStarter (Wireframe)", + "matched": "AppStarter (Wireframe)", + "key": "R0U9H8KEfOJdYPVZRMmLK6", + "score": 1.0 + }, + { + "source_stem": "AppStarter", + "matched": "AppStarter", + "key": "m7bMqyeFaaO8XG8JqZYUu2", + "score": 1.0 + } + ] }, { "W": "W37", "name": "Daily UI Starter Pages - A ready-made UI Kits", "kind": "fig", - "source_stem": "04_DailyUI_Video_Landing_Website", - "matched": "04_DailyUI_Video_Landing_Website", - "key": "PJHgFt29Lyo3JwMKxa5Tsm", - "score": 1.0 + "source_count": 30, + "variants": [ + { + "source_stem": "04_DailyUI_Video_Landing_Website", + "matched": "04_DailyUI_Video_Landing_Website", + "key": "PJHgFt29Lyo3JwMKxa5Tsm", + "score": 1.0 + } + ] }, { "W": "W38", "name": "Figmaland - Startup Ui Kit", "kind": "fig", - "source_stem": "Figmaland- UI Kit (Startup)", - "matched": "Figmaland- UI Kit (Startup)", - "key": "fL1KqwIS3OmHCsUwhgJusG", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Figmaland- UI Kit (Startup)", + "matched": "Figmaland- UI Kit (Startup)", + "key": "fL1KqwIS3OmHCsUwhgJusG", + "score": 1.0 + } + ] }, { "W": "W4", "name": "UI KIT Grocery Store", "kind": "sketch", - "source_stem": "UI KIT Desktop - Froots", - "matched": "UI KIT Desktop - Froots", - "key": "yfsZXkLQbiWwQW9C2fwyDW", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "UI KIT Desktop - Froots", + "matched": "UI KIT Desktop - Froots", + "key": "yfsZXkLQbiWwQW9C2fwyDW", + "score": 1.0 + } + ] }, { "W": "W40", "name": "IOTASK UI Kit", "kind": "fig", - "source_stem": "iotask", - "matched": "iotask", - "key": "uAcopfnDXakv7l5Jr6sMqG", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "iotask", + "matched": "iotask", + "key": "uAcopfnDXakv7l5Jr6sMqG", + "score": 1.0 + } + ] }, { "W": "W41", "name": "Master Flow - Responsive Template for Figma", "kind": "fig", - "source_stem": "MasterFlow_UI_Kit", - "matched": "MasterFlow_UI_Kit", - "key": "4OTPxx5sgN8eFJ3joudoVH", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "MasterFlow_UI_Kit", + "matched": "MasterFlow_UI_Kit", + "key": "4OTPxx5sgN8eFJ3joudoVH", + "score": 1.0 + } + ] }, { "W": "W43", "name": "Modularity Web Design System for Figma", "kind": "fig", - "source_stem": "Modularity", - "matched": "Modularity", - "key": "huDsMAoVThpYnGAU9j8WVB", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Modularity", + "matched": "Modularity", + "key": "huDsMAoVThpYnGAU9j8WVB", + "score": 1.0 + } + ] }, { "W": "W44", "name": "Modularity Web Design System for Sketch", "kind": "sketch", - "source_stem": "Modularity", - "matched": "Modularity", - "key": "8Yk0Nw1JK1mLGBmAIhAVXR", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Modularity", + "matched": "Modularity", + "key": "8Yk0Nw1JK1mLGBmAIhAVXR", + "score": 1.0 + } + ] }, { "W": "W45", "name": "Wiredunk - Landing Page Template for Multipurposes", "kind": "fig", - "source_stem": "Wiredunk_Wireframe", - "matched": "Wiredunk_Wireframe", - "key": "oZ7a2aFNZ21bg128ixnB3k", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Wiredunk_Wireframe", + "matched": "Wiredunk_Wireframe", + "key": "oZ7a2aFNZ21bg128ixnB3k", + "score": 1.0 + } + ] }, { "W": "W46", "name": "agency website template", "kind": "fig", - "source_stem": "3 template Agency", - "matched": "3 template Agency", - "key": "sHmAQQxmvRTIxOg8OgQQFG", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "3 template Agency", + "matched": "3 template Agency", + "key": "sHmAQQxmvRTIxOg8OgQQFG", + "score": 1.0 + } + ] }, { "W": "W47", "name": "Estatery - Real Estate SaaS Web UI Kit", "kind": "fig", - "source_stem": "Real Estate SaaS Kit & Dashboard (UI8)", - "matched": "Real Estate SaaS Kit & Dashboard (UI8)", - "key": "Suvu5K5DSKPngkMKRb01MK", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Real Estate SaaS Kit & Dashboard (UI8)", + "matched": "Real Estate SaaS Kit & Dashboard (UI8)", + "key": "Suvu5K5DSKPngkMKRb01MK", + "score": 1.0 + } + ] }, { "W": "W48", "name": "LANDINGKUY - Landing Page Design Templates", "kind": "fig", - "source_stem": "LANDINGKUY - Landing Page Design", - "matched": "LANDINGKUY - Landing Page Design", - "key": "df0oLsZta06a79s5iepJdF", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "LANDINGKUY - Landing Page Design", + "matched": "LANDINGKUY - Landing Page Design", + "key": "df0oLsZta06a79s5iepJdF", + "score": 1.0 + } + ] }, { "W": "W5", "name": "Wiloa 2.0 - Landing Page UI-Kit", "kind": "fig", - "source_stem": "WILOA - HOTEL", - "matched": "WILOA - HOTEL", - "key": "7C3QNOG6FhBRguT3nQ3dzf", - "score": 1.0 + "source_count": 4, + "variants": [ + { + "source_stem": "WILOA - HOTEL", + "matched": "WILOA - HOTEL", + "key": "7C3QNOG6FhBRguT3nQ3dzf", + "score": 1.0 + }, + { + "source_stem": "WILOA - PLANT", + "matched": "WILOA - PLANT", + "key": "lv1hy5bS3Wx86slIXgorFn", + "score": 1.0 + }, + { + "source_stem": "WILOA - RESTAURANT", + "matched": "WILOA - RESTAURANT", + "key": "1zIi1k19ngpoGixSB3upum", + "score": 1.0 + }, + { + "source_stem": "WILOA - TRAVEL", + "matched": "WILOA - TRAVEL", + "key": "3rhRDK0NC4oniMRGLNGnte", + "score": 1.0 + } + ] }, { "W": "W51", "name": "Quickr Design System", "kind": "fig", - "source_stem": "Quicker Design system", - "matched": "Quicker Design system", - "key": "KtGIx2vrYNtApMiPYCTiiB", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Quicker Design system", + "matched": "Quicker Design system", + "key": "KtGIx2vrYNtApMiPYCTiiB", + "score": 1.0 + } + ] }, { "W": "W52", "name": "RealStatic - Real State Website Design", "kind": "fig", - "source_stem": "Ui8_RealStatic_Static Mania", - "matched": "Ui8_RealStatic_Static Mania", - "key": "U4YDJ7B0Sefem9r8LiEs8b", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Ui8_RealStatic_Static Mania", + "matched": "Ui8_RealStatic_Static Mania", + "key": "U4YDJ7B0Sefem9r8LiEs8b", + "score": 1.0 + } + ] }, { "W": "W53", "name": "Skill Shoot - Online course website and responsive uikit", "kind": "fig", - "source_stem": "Aset - skill Shoot", - "matched": "Aset - skill Shoot", - "key": "pMjAEiLKAFE57eaI4f4vva", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Aset - skill Shoot", + "matched": "Aset - skill Shoot", + "key": "pMjAEiLKAFE57eaI4f4vva", + "score": 1.0 + } + ] }, { "W": "W54", "name": "GetPay - 6 Unique Finance Landing Pages", "kind": "fig", - "source_stem": "GETPAY - FINANCE TEMPLATES DESIGN", - "matched": "GETPAY - FINANCE TEMPLATES DESIGN", - "key": "vcb4bLF79NTpybgXvAtkNM", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "GETPAY - FINANCE TEMPLATES DESIGN", + "matched": "GETPAY - FINANCE TEMPLATES DESIGN", + "key": "vcb4bLF79NTpybgXvAtkNM", + "score": 1.0 + } + ] }, { "W": "W55", "name": "Fecca - Landing Page UI Kit (Figma)", "kind": "fig", - "source_stem": "Fecca", - "matched": "Fecca", - "key": "IpdxPbiWuGZQpr3aNXsVpC", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Fecca", + "matched": "Fecca", + "key": "IpdxPbiWuGZQpr3aNXsVpC", + "score": 1.0 + } + ] }, { "W": "W56", "name": "Orabel Web UI Kit", "kind": "fig", - "source_stem": "01 Home - Orabel Web UI Kit", - "matched": "01 Home - Orabel Web UI Kit", - "key": "IoQBzPjHw51WjFKL52kJKN", - "score": 1.0 + "source_count": 6, + "variants": [ + { + "source_stem": "01 Home - Orabel Web UI Kit", + "matched": "01 Home - Orabel Web UI Kit", + "key": "IoQBzPjHw51WjFKL52kJKN", + "score": 1.0 + }, + { + "source_stem": "02 About - Orabel Web UI Kit", + "matched": "02 About - Orabel Web UI Kit", + "key": "AEZMbGAy5IfnDAkFrbYwB6", + "score": 1.0 + }, + { + "source_stem": "03 Portfolio - Orabel Web UI Kit", + "matched": "03 Portfolio - Orabel Web UI Kit", + "key": "BOnT7oN2pavJlDCdAO9Yih", + "score": 1.0 + }, + { + "source_stem": "04 Blog - Orabel Web UI Kit", + "matched": "04 Blog - Orabel Web UI Kit", + "key": "Dc4uWhUeLCC6f2wiblXiBa", + "score": 1.0 + }, + { + "source_stem": "05 Contact - Orabel Web UI Kit", + "matched": "05 Contact - Orabel Web UI Kit", + "key": "bCrGhKu5PwOZh4F2EbyLk8", + "score": 1.0 + }, + { + "source_stem": "06 Open Menu - Orabel Web UI Kit", + "matched": "06 Open Menu - Orabel Web UI Kit", + "key": "tLnL0G13yvkQtBZeQmPeq5", + "score": 1.0 + } + ] }, { "W": "W6", "name": "AKASHA Pages Building Kit", "kind": "fig", - "source_stem": "AKASHA-PAGEBUILDING-KIT", - "matched": "AKASHA-PAGEBUILDING-KIT", - "key": "LA2daTQaigGkMUUNgPr6fp", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "AKASHA-PAGEBUILDING-KIT", + "matched": "AKASHA-PAGEBUILDING-KIT", + "key": "LA2daTQaigGkMUUNgPr6fp", + "score": 1.0 + } + ] }, { "W": "W7", "name": "Bright Kit Web Layouts", "kind": "fig", - "source_stem": "Bright Kit", - "matched": "Bright Kit", - "key": "CLZepne3voPYx198q3wUHO", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Bright Kit", + "matched": "Bright Kit", + "key": "CLZepne3voPYx198q3wUHO", + "score": 1.0 + } + ] }, { "W": "W9", "name": "Fresh Grocery - Landing Page Design Template", "kind": "sketch", - "source_stem": "Grocery Delivery Landing Page", - "matched": "Grocery Delivery Landing Page", - "key": "V6qWYeL6Hr5QA5Jz9rDmc7", - "score": 1.0 + "source_count": 1, + "variants": [ + { + "source_stem": "Grocery Delivery Landing Page", + "matched": "Grocery Delivery Landing Page", + "key": "V6qWYeL6Hr5QA5Jz9rDmc7", + "score": 1.0 + } + ] } ] \ No newline at end of file diff --git a/scripts/match-and-update.py b/scripts/match-and-update.py index 958d3b0..64c48c5 100755 --- a/scripts/match-and-update.py +++ b/scripts/match-and-update.py @@ -35,61 +35,62 @@ def main(): sys.exit(1) figma_files = json.loads(figma_files_path.read_text()) # list of {key, name, ...} - # Match each template (fig preferred, else sketch) against cloud files + # Match each template source file to ALL matching cloud files (supports multi-variant) matches = [] used_keys = set() for t in manifest['templates']: source_files = t['fig'] if t['fig'] else t['sketch'] if not source_files: continue kind = 'fig' if t['fig'] else 'sketch' - targets = [Path(f).stem for f in source_files] - if t.get('archive'): - targets.append(Path(t['archive']).stem) - targets.append(t['name']) - best_overall = (0, None) - for tgt in targets: - score, cand = best_match(tgt, [f for f in figma_files if f['key'] not in used_keys]) - if score > best_overall[0]: - best_overall = (score, cand) - if score > 0.95: - break - score, cand = best_overall - stem = Path(source_files[0]).stem - if cand and score >= 0.6: - used_keys.add(cand['key']) - matches.append({ - 'W': t['id'], 'name': t['name'], 'kind': kind, 'source_stem': stem, - 'matched': cand['name'], 'key': cand['key'], 'score': round(score, 3) - }) - else: - matches.append({ - 'W': t['id'], 'name': t['name'], 'kind': kind, 'source_stem': stem, - 'matched': None, 'best_score': round(best_overall[0], 3) if cand else 0, - 'best_candidate': cand['name'] if cand else None - }) + variants = [] + for src in source_files: + stem = Path(src).stem + # Match this specific source stem to best unused cloud file + score, cand = best_match(stem, [f for f in figma_files if f['key'] not in used_keys]) + if cand and score >= 0.6: + used_keys.add(cand['key']) + variants.append({ + 'source_stem': stem, + 'matched': cand['name'], + 'key': cand['key'], + 'score': round(score, 3) + }) + matches.append({ + 'W': t['id'], 'name': t['name'], 'kind': kind, + 'source_count': len(source_files), + 'variants': variants, + }) # Update web/data.json data_path = ROOT/'web'/'data.json' data = json.loads(data_path.read_text()) - by_W = {m['W']: m for m in matches if m.get('key')} + by_W = {m['W']: m for m in matches} for t in data['templates']: m = by_W.get(t['id']) - if m: - t['figma_key'] = m['key'] - t['figma_url'] = f"https://www.figma.com/file/{m['key']}" + if m and m['variants']: + first = m['variants'][0] + t['figma_key'] = first['key'] + t['figma_url'] = f"https://www.figma.com/file/{first['key']}" + t['figma_variants'] = [ + {'name': v['source_stem'], 'matched': v['matched'], 'key': v['key'], + 'url': f"https://www.figma.com/file/{v['key']}"} + for v in m['variants'] + ] else: t['figma_key'] = None t['figma_url'] = None + t['figma_variants'] = [] - # update banner with imported count + # update banner with imported count + variant total imported = sum(1 for t in data['templates'] if t['figma_key']) + total_variants = sum(len(t.get('figma_variants', [])) for t in data['templates']) fig_cnt = sum(1 for t in manifest['templates'] if t['fig']) sketch_only_cnt = sum(1 for t in manifest['templates'] if not t['fig'] and t['sketch']) data['imported_summary'] = ( - f"✅ {imported}/56 套已云端就位在 " + f"✅ {imported}/56 套(共 {total_variants} 个文件)已云端就位在 " f"Figma Drafts" - f"({fig_cnt} 个 .fig 原生 + {sketch_only_cnt} 个 .sketch 经 Figma 转换)。" - f"点卡片 → modal → iframe 实时投射。" + f"({fig_cnt} .fig + {sketch_only_cnt} .sketch 转换)。" + f"点卡片 → modal → 多变体 tab 切换 + iframe 实时投射。" ) data_path.write_text(json.dumps(data, ensure_ascii=False, indent=2)) @@ -97,13 +98,14 @@ def main(): report = ROOT/'figma-match-report.json' report.write_text(json.dumps(matches, ensure_ascii=False, indent=2)) total_matchable = sum(1 for t in manifest['templates'] if t['fig'] or t['sketch']) - print(f"Matched {imported}/{total_matchable} templates ({fig_cnt} fig + {sketch_only_cnt} sketch-only)") + multi_variant = sum(1 for m in matches if len(m['variants']) > 1) + print(f"Matched {imported}/{total_matchable} templates, {total_variants} total file keys, {multi_variant} with multi variants") print(f"Report: {report.relative_to(ROOT)}") - unmatched = [m for m in matches if not m.get('key')] + unmatched = [m for m in matches if not m['variants']] if unmatched: print(f"\n⚠️ {len(unmatched)} unmatched:") for m in unmatched: - print(f" {m['W']:4s} {m['name'][:50]:50s} best='{m.get('best_candidate','')[:40]}' score={m.get('best_score',0)}") + print(f" {m['W']:4s} {m['name'][:50]:50s}") if __name__ == '__main__': main() diff --git a/web/app.js b/web/app.js index 7adfe1c..13c11c5 100644 --- a/web/app.js +++ b/web/app.js @@ -89,11 +89,28 @@ function openModal(id) { const t = DATA.templates.find(x => x.id === id); if (!t) return; const body = document.getElementById('modalBody'); - const figmaSection = t.figma_key - ? `` + const variants = t.figma_variants || (t.figma_key ? [{name: t.name, key: t.figma_key, url: t.figma_url}] : []); + const hasMulti = variants.length > 1; + + const tabsHtml = hasMulti + ? `
+ ${variants.map((v, i) => ``).join('')} +
` : ''; + + const firstVariant = variants[0]; + const iframeHtml = firstVariant + ? `` + : ''; + + const openBtn = firstVariant + ? `在 Figma 打开 →` + : (t.has_fig + ? `在 Figma Drafts 搜 "${escapeAttr(t.name.split(/[\s\-–—]/)[0])}" →` + : ''); + body.innerHTML = ` -

${escapeHtml(t.name)}

+

${escapeHtml(t.name)}${hasMulti ? ` ${variants.length} 变体` : ''}

${t.id} ${t.archive_size_mb} MB @@ -103,24 +120,35 @@ function openModal(id) { ${t.has_psd ? `PSD` : ''}
- ${t.figma_url - ? `在 Figma 打开 →` - : (t.has_fig - ? `在 Figma Drafts 搜 "${escapeAttr(t.name.split(/[\s\-–—]/)[0])}" →` - : '')} + ${openBtn} 在 Finder 中显示源包 复制源文件路径
- ${figmaSection} + ${tabsHtml} + ${iframeHtml}
源包
source/${t.id}/${t.archive}
解压目录
extracted/${t.id}/
- ${t.figma_key ? `
Figma Key
${t.figma_key}
` : ''} + ${firstVariant ? `
Figma Key
${firstVariant.key}
` : ''}
`; + + if (hasMulti) { + document.getElementById('variantTabs').addEventListener('click', e => { + const btn = e.target.closest('.vtab'); + if (!btn) return; + const idx = +btn.dataset.idx; + const v = variants[idx]; + document.querySelectorAll('.vtab').forEach(b => b.classList.toggle('active', b === btn)); + document.getElementById('variantFrame').src = `https://embed.figma.com/design/${v.key}/?embed-host=kang&footer=false`; + document.getElementById('variantOpenBtn').href = v.url; + document.getElementById('variantKey').textContent = v.key; + }); + } + document.getElementById('modal').hidden = false; document.body.style.overflow = 'hidden'; } diff --git a/web/data.json b/web/data.json index efea544..f0fc8cf 100644 --- a/web/data.json +++ b/web/data.json @@ -22,7 +22,15 @@ "archive_size_mb": 123.1, "source_rel": "../extracted/W1", "figma_key": "pxsKzhDM8UL8oTSB4hUpOZ", - "figma_url": "https://www.figma.com/file/pxsKzhDM8UL8oTSB4hUpOZ" + "figma_url": "https://www.figma.com/file/pxsKzhDM8UL8oTSB4hUpOZ", + "figma_variants": [ + { + "name": "saascuy", + "matched": "saascuy", + "key": "pxsKzhDM8UL8oTSB4hUpOZ", + "url": "https://www.figma.com/file/pxsKzhDM8UL8oTSB4hUpOZ" + } + ] }, { "id": "W10", @@ -44,7 +52,15 @@ "archive_size_mb": 102.5, "source_rel": "../extracted/W10", "figma_key": "EKp3ZDo2A3kDp88DMvFqte", - "figma_url": "https://www.figma.com/file/EKp3ZDo2A3kDp88DMvFqte" + "figma_url": "https://www.figma.com/file/EKp3ZDo2A3kDp88DMvFqte", + "figma_variants": [ + { + "name": "Havoc Agency UI Kit", + "matched": "Havoc Agency UI Kit", + "key": "EKp3ZDo2A3kDp88DMvFqte", + "url": "https://www.figma.com/file/EKp3ZDo2A3kDp88DMvFqte" + } + ] }, { "id": "W11", @@ -70,7 +86,15 @@ "archive_size_mb": 54.7, "source_rel": "../extracted/W11", "figma_key": "IGfS4r69yANQazOxLSjnyQ", - "figma_url": "https://www.figma.com/file/IGfS4r69yANQazOxLSjnyQ" + "figma_url": "https://www.figma.com/file/IGfS4r69yANQazOxLSjnyQ", + "figma_variants": [ + { + "name": "yoyolabs-Limitless-for-Web-file", + "matched": "yoyolabs-Limitless-for-Web-file", + "key": "IGfS4r69yANQazOxLSjnyQ", + "url": "https://www.figma.com/file/IGfS4r69yANQazOxLSjnyQ" + } + ] }, { "id": "W12", @@ -93,7 +117,21 @@ "archive_size_mb": 12.2, "source_rel": "../extracted/W12", "figma_key": "RCAZWKHkrBzwikzpBCebMz", - "figma_url": "https://www.figma.com/file/RCAZWKHkrBzwikzpBCebMz" + "figma_url": "https://www.figma.com/file/RCAZWKHkrBzwikzpBCebMz", + "figma_variants": [ + { + "name": "DARK:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "matched": "DARK:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "key": "RCAZWKHkrBzwikzpBCebMz", + "url": "https://www.figma.com/file/RCAZWKHkrBzwikzpBCebMz" + }, + { + "name": "LIGHT:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "matched": "LIGHT:DESKTOP - Premise Landing Page Wireframe Kit - Jamie Syke", + "key": "pEKy0RBAp93TLIDlnoTsFi", + "url": "https://www.figma.com/file/pEKy0RBAp93TLIDlnoTsFi" + } + ] }, { "id": "W13", @@ -116,7 +154,15 @@ "archive_size_mb": 25.3, "source_rel": "../extracted/W13", "figma_key": "ms5OYBa3fRlDwRmSLWWorY", - "figma_url": "https://www.figma.com/file/ms5OYBa3fRlDwRmSLWWorY" + "figma_url": "https://www.figma.com/file/ms5OYBa3fRlDwRmSLWWorY", + "figma_variants": [ + { + "name": "Online Shop UI Kit", + "matched": "Online Shop UI Kit", + "key": "ms5OYBa3fRlDwRmSLWWorY", + "url": "https://www.figma.com/file/ms5OYBa3fRlDwRmSLWWorY" + } + ] }, { "id": "W14", @@ -138,7 +184,15 @@ "archive_size_mb": 100.4, "source_rel": "../extracted/W14", "figma_key": "s5KbowY6N6M4IkjHbgLjOc", - "figma_url": "https://www.figma.com/file/s5KbowY6N6M4IkjHbgLjOc" + "figma_url": "https://www.figma.com/file/s5KbowY6N6M4IkjHbgLjOc", + "figma_variants": [ + { + "name": "Figmaland-UI MAX ( ui8 )", + "matched": "Figmaland-UI MAX ( ui8 )", + "key": "s5KbowY6N6M4IkjHbgLjOc", + "url": "https://www.figma.com/file/s5KbowY6N6M4IkjHbgLjOc" + } + ] }, { "id": "W15", @@ -162,7 +216,15 @@ "archive_size_mb": 65.6, "source_rel": "../extracted/W15", "figma_key": "dM5zUotUlacnEPU9Oo0RcJ", - "figma_url": "https://www.figma.com/file/dM5zUotUlacnEPU9Oo0RcJ" + "figma_url": "https://www.figma.com/file/dM5zUotUlacnEPU9Oo0RcJ", + "figma_variants": [ + { + "name": "Sketch File", + "matched": "Sketch File", + "key": "dM5zUotUlacnEPU9Oo0RcJ", + "url": "https://www.figma.com/file/dM5zUotUlacnEPU9Oo0RcJ" + } + ] }, { "id": "W16", @@ -186,7 +248,15 @@ "archive_size_mb": 22.3, "source_rel": "../extracted/W16", "figma_key": "fsufV596UmcNyM8yfCYlAr", - "figma_url": "https://www.figma.com/file/fsufV596UmcNyM8yfCYlAr" + "figma_url": "https://www.figma.com/file/fsufV596UmcNyM8yfCYlAr", + "figma_variants": [ + { + "name": "Eco -Ecommerce Analytics Admin Dashboard", + "matched": "Eco -Ecommerce Analytics Admin Dashboard", + "key": "fsufV596UmcNyM8yfCYlAr", + "url": "https://www.figma.com/file/fsufV596UmcNyM8yfCYlAr" + } + ] }, { "id": "W17", @@ -209,7 +279,8 @@ "archive_size_mb": 920.4, "source_rel": "../extracted/W17", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W18", @@ -236,7 +307,15 @@ "archive_size_mb": 84.2, "source_rel": "../extracted/W18", "figma_key": "byZYVoOiuEEtSMjH7JxcQO", - "figma_url": "https://www.figma.com/file/byZYVoOiuEEtSMjH7JxcQO" + "figma_url": "https://www.figma.com/file/byZYVoOiuEEtSMjH7JxcQO", + "figma_variants": [ + { + "name": "Elemento-UI-Kit", + "matched": "Elemento-UI-Kit", + "key": "byZYVoOiuEEtSMjH7JxcQO", + "url": "https://www.figma.com/file/byZYVoOiuEEtSMjH7JxcQO" + } + ] }, { "id": "W19", @@ -258,7 +337,8 @@ "archive_size_mb": 161.8, "source_rel": "../extracted/W19", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W2", @@ -276,7 +356,15 @@ "archive_size_mb": 606.0, "source_rel": "../extracted/W2", "figma_key": "G4mWQN0IWGkAKpD7Ga0bG3", - "figma_url": "https://www.figma.com/file/G4mWQN0IWGkAKpD7Ga0bG3" + "figma_url": "https://www.figma.com/file/G4mWQN0IWGkAKpD7Ga0bG3", + "figma_variants": [ + { + "name": "Core - Dashboard Builder", + "matched": "Core - Dashboard Builder", + "key": "G4mWQN0IWGkAKpD7Ga0bG3", + "url": "https://www.figma.com/file/G4mWQN0IWGkAKpD7Ga0bG3" + } + ] }, { "id": "W20", @@ -299,7 +387,15 @@ "archive_size_mb": 200.4, "source_rel": "../extracted/W20", "figma_key": "crK1Yhtws6yWkBKcN1OCqB", - "figma_url": "https://www.figma.com/file/crK1Yhtws6yWkBKcN1OCqB" + "figma_url": "https://www.figma.com/file/crK1Yhtws6yWkBKcN1OCqB", + "figma_variants": [ + { + "name": "Kovid Flew", + "matched": "Kovid Flew", + "key": "crK1Yhtws6yWkBKcN1OCqB", + "url": "https://www.figma.com/file/crK1Yhtws6yWkBKcN1OCqB" + } + ] }, { "id": "W21", @@ -321,7 +417,15 @@ "archive_size_mb": 18.9, "source_rel": "../extracted/W21", "figma_key": "SYINzgEkzGIwZF15AvuDcn", - "figma_url": "https://www.figma.com/file/SYINzgEkzGIwZF15AvuDcn" + "figma_url": "https://www.figma.com/file/SYINzgEkzGIwZF15AvuDcn", + "figma_variants": [ + { + "name": "Login_page_2020", + "matched": "Login_page_2020", + "key": "SYINzgEkzGIwZF15AvuDcn", + "url": "https://www.figma.com/file/SYINzgEkzGIwZF15AvuDcn" + } + ] }, { "id": "W22", @@ -345,7 +449,8 @@ "archive_size_mb": 37.0, "source_rel": "../extracted/W22", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W23", @@ -367,7 +472,8 @@ "archive_size_mb": 34.3, "source_rel": "../extracted/W23", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W24", @@ -391,7 +497,15 @@ "archive_size_mb": 75.1, "source_rel": "../extracted/W24", "figma_key": "Sarco9c50gDttu37szmurE", - "figma_url": "https://www.figma.com/file/Sarco9c50gDttu37szmurE" + "figma_url": "https://www.figma.com/file/Sarco9c50gDttu37szmurE", + "figma_variants": [ + { + "name": "Webflew Agency UI Kit", + "matched": "Webflew Agency UI Kit", + "key": "Sarco9c50gDttu37szmurE", + "url": "https://www.figma.com/file/Sarco9c50gDttu37szmurE" + } + ] }, { "id": "W25", @@ -416,7 +530,15 @@ "archive_size_mb": 606.2, "source_rel": "../extracted/W25", "figma_key": "x3g1FivshKeZ9PwccE7w3w", - "figma_url": "https://www.figma.com/file/x3g1FivshKeZ9PwccE7w3w" + "figma_url": "https://www.figma.com/file/x3g1FivshKeZ9PwccE7w3w", + "figma_variants": [ + { + "name": "Core - Dashboard Builder", + "matched": "Core - Dashboard Builder", + "key": "x3g1FivshKeZ9PwccE7w3w", + "url": "https://www.figma.com/file/x3g1FivshKeZ9PwccE7w3w" + } + ] }, { "id": "W26", @@ -439,7 +561,15 @@ "archive_size_mb": 82.3, "source_rel": "../extracted/W26", "figma_key": "oyHlh6eh7TjxYhCUbFTvBS", - "figma_url": "https://www.figma.com/file/oyHlh6eh7TjxYhCUbFTvBS" + "figma_url": "https://www.figma.com/file/oyHlh6eh7TjxYhCUbFTvBS", + "figma_variants": [ + { + "name": "Jobhuntly - Job Board & Portal UI Kit", + "matched": "Jobhuntly - Job Board & Portal UI Kit", + "key": "oyHlh6eh7TjxYhCUbFTvBS", + "url": "https://www.figma.com/file/oyHlh6eh7TjxYhCUbFTvBS" + } + ] }, { "id": "W27", @@ -462,7 +592,15 @@ "archive_size_mb": 1542.5, "source_rel": "../extracted/W27", "figma_key": "yIhPCq93LSUkzrJUVQjU1r", - "figma_url": "https://www.figma.com/file/yIhPCq93LSUkzrJUVQjU1r" + "figma_url": "https://www.figma.com/file/yIhPCq93LSUkzrJUVQjU1r", + "figma_variants": [ + { + "name": "Omega", + "matched": "Omega", + "key": "yIhPCq93LSUkzrJUVQjU1r", + "url": "https://www.figma.com/file/yIhPCq93LSUkzrJUVQjU1r" + } + ] }, { "id": "W28", @@ -486,7 +624,15 @@ "archive_size_mb": 249.9, "source_rel": "../extracted/W28", "figma_key": "5R9tevOwnk4iJzU3jEjg0q", - "figma_url": "https://www.figma.com/file/5R9tevOwnk4iJzU3jEjg0q" + "figma_url": "https://www.figma.com/file/5R9tevOwnk4iJzU3jEjg0q", + "figma_variants": [ + { + "name": "Landing UI Kit", + "matched": "Landing UI Kit", + "key": "5R9tevOwnk4iJzU3jEjg0q", + "url": "https://www.figma.com/file/5R9tevOwnk4iJzU3jEjg0q" + } + ] }, { "id": "W29", @@ -509,7 +655,15 @@ "archive_size_mb": 206.8, "source_rel": "../extracted/W29", "figma_key": "dvPWtG7KaEWr895iCI0Ioy", - "figma_url": "https://www.figma.com/file/dvPWtG7KaEWr895iCI0Ioy" + "figma_url": "https://www.figma.com/file/dvPWtG7KaEWr895iCI0Ioy", + "figma_variants": [ + { + "name": "LOOMI", + "matched": "LOOMI", + "key": "dvPWtG7KaEWr895iCI0Ioy", + "url": "https://www.figma.com/file/dvPWtG7KaEWr895iCI0Ioy" + } + ] }, { "id": "W3", @@ -531,7 +685,15 @@ "archive_size_mb": 36.7, "source_rel": "../extracted/W3", "figma_key": "5CZLD5lcxxRQNE1QWjqbmP", - "figma_url": "https://www.figma.com/file/5CZLD5lcxxRQNE1QWjqbmP" + "figma_url": "https://www.figma.com/file/5CZLD5lcxxRQNE1QWjqbmP", + "figma_variants": [ + { + "name": "UXFlow Web Kit", + "matched": "UXFlow Web Kit", + "key": "5CZLD5lcxxRQNE1QWjqbmP", + "url": "https://www.figma.com/file/5CZLD5lcxxRQNE1QWjqbmP" + } + ] }, { "id": "W30", @@ -554,7 +716,15 @@ "archive_size_mb": 23.2, "source_rel": "../extracted/W30", "figma_key": "AcNy87P0xlqDvkeeBqrQpO", - "figma_url": "https://www.figma.com/file/AcNy87P0xlqDvkeeBqrQpO" + "figma_url": "https://www.figma.com/file/AcNy87P0xlqDvkeeBqrQpO", + "figma_variants": [ + { + "name": "Rybble TM", + "matched": "Rybble TM", + "key": "AcNy87P0xlqDvkeeBqrQpO", + "url": "https://www.figma.com/file/AcNy87P0xlqDvkeeBqrQpO" + } + ] }, { "id": "W31", @@ -576,7 +746,15 @@ "archive_size_mb": 58.9, "source_rel": "../extracted/W31", "figma_key": "khWI1rrgwj5702NilEcha2", - "figma_url": "https://www.figma.com/file/khWI1rrgwj5702NilEcha2" + "figma_url": "https://www.figma.com/file/khWI1rrgwj5702NilEcha2", + "figma_variants": [ + { + "name": "Sydney Oasis Hotel Websites", + "matched": "Sydney Oasis Hotel Websites", + "key": "khWI1rrgwj5702NilEcha2", + "url": "https://www.figma.com/file/khWI1rrgwj5702NilEcha2" + } + ] }, { "id": "W32", @@ -599,7 +777,15 @@ "archive_size_mb": 137.8, "source_rel": "../extracted/W32", "figma_key": "qFC0pVEHe9Toc2aJ2MgO32", - "figma_url": "https://www.figma.com/file/qFC0pVEHe9Toc2aJ2MgO32" + "figma_url": "https://www.figma.com/file/qFC0pVEHe9Toc2aJ2MgO32", + "figma_variants": [ + { + "name": "DevAgency - Web Ui Kits", + "matched": "DevAgency - Web Ui Kits", + "key": "qFC0pVEHe9Toc2aJ2MgO32", + "url": "https://www.figma.com/file/qFC0pVEHe9Toc2aJ2MgO32" + } + ] }, { "id": "W33", @@ -621,7 +807,15 @@ "archive_size_mb": 11.6, "source_rel": "../extracted/W33", "figma_key": "RKIYTIOCADVsASHNxZ5tr2", - "figma_url": "https://www.figma.com/file/RKIYTIOCADVsASHNxZ5tr2" + "figma_url": "https://www.figma.com/file/RKIYTIOCADVsASHNxZ5tr2", + "figma_variants": [ + { + "name": "Social Media Dashboard - UI Kit", + "matched": "Social Media Dashboard - UI Kit", + "key": "RKIYTIOCADVsASHNxZ5tr2", + "url": "https://www.figma.com/file/RKIYTIOCADVsASHNxZ5tr2" + } + ] }, { "id": "W34", @@ -644,7 +838,15 @@ "archive_size_mb": 20.7, "source_rel": "../extracted/W34", "figma_key": "BfBzvqu4VK53iSD5fbKNAo", - "figma_url": "https://www.figma.com/file/BfBzvqu4VK53iSD5fbKNAo" + "figma_url": "https://www.figma.com/file/BfBzvqu4VK53iSD5fbKNAo", + "figma_variants": [ + { + "name": "Intirior Architecture web ui kit", + "matched": "Intirior Architecture web ui kit", + "key": "BfBzvqu4VK53iSD5fbKNAo", + "url": "https://www.figma.com/file/BfBzvqu4VK53iSD5fbKNAo" + } + ] }, { "id": "W35", @@ -667,7 +869,15 @@ "archive_size_mb": 17.5, "source_rel": "../extracted/W35", "figma_key": "RNRNDiF6gFcTCi6wJncvgv", - "figma_url": "https://www.figma.com/file/RNRNDiF6gFcTCi6wJncvgv" + "figma_url": "https://www.figma.com/file/RNRNDiF6gFcTCi6wJncvgv", + "figma_variants": [ + { + "name": "JackCreative", + "matched": "JackCreative", + "key": "RNRNDiF6gFcTCi6wJncvgv", + "url": "https://www.figma.com/file/RNRNDiF6gFcTCi6wJncvgv" + } + ] }, { "id": "W36", @@ -690,7 +900,33 @@ "archive_size_mb": 716.5, "source_rel": "../extracted/W36", "figma_key": "4lPiQwfUnlIh2cRvqFabSn", - "figma_url": "https://www.figma.com/file/4lPiQwfUnlIh2cRvqFabSn" + "figma_url": "https://www.figma.com/file/4lPiQwfUnlIh2cRvqFabSn", + "figma_variants": [ + { + "name": "AppStarter Sample (Wireframe)", + "matched": "AppStarter Sample (Wireframe)", + "key": "4lPiQwfUnlIh2cRvqFabSn", + "url": "https://www.figma.com/file/4lPiQwfUnlIh2cRvqFabSn" + }, + { + "name": "AppStarter Sample", + "matched": "AppStarter Sample", + "key": "qhPf33kALID79IthiURFfK", + "url": "https://www.figma.com/file/qhPf33kALID79IthiURFfK" + }, + { + "name": "AppStarter (Wireframe)", + "matched": "AppStarter (Wireframe)", + "key": "R0U9H8KEfOJdYPVZRMmLK6", + "url": "https://www.figma.com/file/R0U9H8KEfOJdYPVZRMmLK6" + }, + { + "name": "AppStarter", + "matched": "AppStarter", + "key": "m7bMqyeFaaO8XG8JqZYUu2", + "url": "https://www.figma.com/file/m7bMqyeFaaO8XG8JqZYUu2" + } + ] }, { "id": "W37", @@ -712,7 +948,15 @@ "archive_size_mb": 67.7, "source_rel": "../extracted/W37", "figma_key": "PJHgFt29Lyo3JwMKxa5Tsm", - "figma_url": "https://www.figma.com/file/PJHgFt29Lyo3JwMKxa5Tsm" + "figma_url": "https://www.figma.com/file/PJHgFt29Lyo3JwMKxa5Tsm", + "figma_variants": [ + { + "name": "04_DailyUI_Video_Landing_Website", + "matched": "04_DailyUI_Video_Landing_Website", + "key": "PJHgFt29Lyo3JwMKxa5Tsm", + "url": "https://www.figma.com/file/PJHgFt29Lyo3JwMKxa5Tsm" + } + ] }, { "id": "W38", @@ -735,7 +979,15 @@ "archive_size_mb": 21.9, "source_rel": "../extracted/W38", "figma_key": "fL1KqwIS3OmHCsUwhgJusG", - "figma_url": "https://www.figma.com/file/fL1KqwIS3OmHCsUwhgJusG" + "figma_url": "https://www.figma.com/file/fL1KqwIS3OmHCsUwhgJusG", + "figma_variants": [ + { + "name": "Figmaland- UI Kit (Startup)", + "matched": "Figmaland- UI Kit (Startup)", + "key": "fL1KqwIS3OmHCsUwhgJusG", + "url": "https://www.figma.com/file/fL1KqwIS3OmHCsUwhgJusG" + } + ] }, { "id": "W39", @@ -759,7 +1011,8 @@ "archive_size_mb": 18.1, "source_rel": "../extracted/W39", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W4", @@ -781,7 +1034,15 @@ "archive_size_mb": 352.7, "source_rel": "../extracted/W4", "figma_key": "yfsZXkLQbiWwQW9C2fwyDW", - "figma_url": "https://www.figma.com/file/yfsZXkLQbiWwQW9C2fwyDW" + "figma_url": "https://www.figma.com/file/yfsZXkLQbiWwQW9C2fwyDW", + "figma_variants": [ + { + "name": "UI KIT Desktop - Froots", + "matched": "UI KIT Desktop - Froots", + "key": "yfsZXkLQbiWwQW9C2fwyDW", + "url": "https://www.figma.com/file/yfsZXkLQbiWwQW9C2fwyDW" + } + ] }, { "id": "W40", @@ -805,7 +1066,15 @@ "archive_size_mb": 964.0, "source_rel": "../extracted/W40", "figma_key": "uAcopfnDXakv7l5Jr6sMqG", - "figma_url": "https://www.figma.com/file/uAcopfnDXakv7l5Jr6sMqG" + "figma_url": "https://www.figma.com/file/uAcopfnDXakv7l5Jr6sMqG", + "figma_variants": [ + { + "name": "iotask", + "matched": "iotask", + "key": "uAcopfnDXakv7l5Jr6sMqG", + "url": "https://www.figma.com/file/uAcopfnDXakv7l5Jr6sMqG" + } + ] }, { "id": "W41", @@ -827,7 +1096,15 @@ "archive_size_mb": 144.8, "source_rel": "../extracted/W41", "figma_key": "4OTPxx5sgN8eFJ3joudoVH", - "figma_url": "https://www.figma.com/file/4OTPxx5sgN8eFJ3joudoVH" + "figma_url": "https://www.figma.com/file/4OTPxx5sgN8eFJ3joudoVH", + "figma_variants": [ + { + "name": "MasterFlow_UI_Kit", + "matched": "MasterFlow_UI_Kit", + "key": "4OTPxx5sgN8eFJ3joudoVH", + "url": "https://www.figma.com/file/4OTPxx5sgN8eFJ3joudoVH" + } + ] }, { "id": "W42", @@ -851,7 +1128,8 @@ "archive_size_mb": 496.6, "source_rel": "../extracted/W42", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W43", @@ -874,7 +1152,15 @@ "archive_size_mb": 130.8, "source_rel": "../extracted/W43", "figma_key": "huDsMAoVThpYnGAU9j8WVB", - "figma_url": "https://www.figma.com/file/huDsMAoVThpYnGAU9j8WVB" + "figma_url": "https://www.figma.com/file/huDsMAoVThpYnGAU9j8WVB", + "figma_variants": [ + { + "name": "Modularity", + "matched": "Modularity", + "key": "huDsMAoVThpYnGAU9j8WVB", + "url": "https://www.figma.com/file/huDsMAoVThpYnGAU9j8WVB" + } + ] }, { "id": "W44", @@ -899,7 +1185,15 @@ "archive_size_mb": 127.6, "source_rel": "../extracted/W44", "figma_key": "8Yk0Nw1JK1mLGBmAIhAVXR", - "figma_url": "https://www.figma.com/file/8Yk0Nw1JK1mLGBmAIhAVXR" + "figma_url": "https://www.figma.com/file/8Yk0Nw1JK1mLGBmAIhAVXR", + "figma_variants": [ + { + "name": "Modularity", + "matched": "Modularity", + "key": "8Yk0Nw1JK1mLGBmAIhAVXR", + "url": "https://www.figma.com/file/8Yk0Nw1JK1mLGBmAIhAVXR" + } + ] }, { "id": "W45", @@ -923,7 +1217,15 @@ "archive_size_mb": 46.6, "source_rel": "../extracted/W45", "figma_key": "oZ7a2aFNZ21bg128ixnB3k", - "figma_url": "https://www.figma.com/file/oZ7a2aFNZ21bg128ixnB3k" + "figma_url": "https://www.figma.com/file/oZ7a2aFNZ21bg128ixnB3k", + "figma_variants": [ + { + "name": "Wiredunk_Wireframe", + "matched": "Wiredunk_Wireframe", + "key": "oZ7a2aFNZ21bg128ixnB3k", + "url": "https://www.figma.com/file/oZ7a2aFNZ21bg128ixnB3k" + } + ] }, { "id": "W46", @@ -946,7 +1248,15 @@ "archive_size_mb": 38.0, "source_rel": "../extracted/W46", "figma_key": "sHmAQQxmvRTIxOg8OgQQFG", - "figma_url": "https://www.figma.com/file/sHmAQQxmvRTIxOg8OgQQFG" + "figma_url": "https://www.figma.com/file/sHmAQQxmvRTIxOg8OgQQFG", + "figma_variants": [ + { + "name": "3 template Agency", + "matched": "3 template Agency", + "key": "sHmAQQxmvRTIxOg8OgQQFG", + "url": "https://www.figma.com/file/sHmAQQxmvRTIxOg8OgQQFG" + } + ] }, { "id": "W47", @@ -970,7 +1280,15 @@ "archive_size_mb": 203.4, "source_rel": "../extracted/W47", "figma_key": "Suvu5K5DSKPngkMKRb01MK", - "figma_url": "https://www.figma.com/file/Suvu5K5DSKPngkMKRb01MK" + "figma_url": "https://www.figma.com/file/Suvu5K5DSKPngkMKRb01MK", + "figma_variants": [ + { + "name": "Real Estate SaaS Kit & Dashboard (UI8)", + "matched": "Real Estate SaaS Kit & Dashboard (UI8)", + "key": "Suvu5K5DSKPngkMKRb01MK", + "url": "https://www.figma.com/file/Suvu5K5DSKPngkMKRb01MK" + } + ] }, { "id": "W48", @@ -993,7 +1311,15 @@ "archive_size_mb": 79.5, "source_rel": "../extracted/W48", "figma_key": "df0oLsZta06a79s5iepJdF", - "figma_url": "https://www.figma.com/file/df0oLsZta06a79s5iepJdF" + "figma_url": "https://www.figma.com/file/df0oLsZta06a79s5iepJdF", + "figma_variants": [ + { + "name": "LANDINGKUY - Landing Page Design", + "matched": "LANDINGKUY - Landing Page Design", + "key": "df0oLsZta06a79s5iepJdF", + "url": "https://www.figma.com/file/df0oLsZta06a79s5iepJdF" + } + ] }, { "id": "W49", @@ -1015,7 +1341,8 @@ "archive_size_mb": 114.5, "source_rel": "../extracted/W49", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W5", @@ -1037,7 +1364,33 @@ "archive_size_mb": 75.9, "source_rel": "../extracted/W5", "figma_key": "7C3QNOG6FhBRguT3nQ3dzf", - "figma_url": "https://www.figma.com/file/7C3QNOG6FhBRguT3nQ3dzf" + "figma_url": "https://www.figma.com/file/7C3QNOG6FhBRguT3nQ3dzf", + "figma_variants": [ + { + "name": "WILOA - HOTEL", + "matched": "WILOA - HOTEL", + "key": "7C3QNOG6FhBRguT3nQ3dzf", + "url": "https://www.figma.com/file/7C3QNOG6FhBRguT3nQ3dzf" + }, + { + "name": "WILOA - PLANT", + "matched": "WILOA - PLANT", + "key": "lv1hy5bS3Wx86slIXgorFn", + "url": "https://www.figma.com/file/lv1hy5bS3Wx86slIXgorFn" + }, + { + "name": "WILOA - RESTAURANT", + "matched": "WILOA - RESTAURANT", + "key": "1zIi1k19ngpoGixSB3upum", + "url": "https://www.figma.com/file/1zIi1k19ngpoGixSB3upum" + }, + { + "name": "WILOA - TRAVEL", + "matched": "WILOA - TRAVEL", + "key": "3rhRDK0NC4oniMRGLNGnte", + "url": "https://www.figma.com/file/3rhRDK0NC4oniMRGLNGnte" + } + ] }, { "id": "W50", @@ -1059,7 +1412,8 @@ "archive_size_mb": 116.1, "source_rel": "../extracted/W50", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W51", @@ -1081,7 +1435,15 @@ "archive_size_mb": 22.6, "source_rel": "../extracted/W51", "figma_key": "KtGIx2vrYNtApMiPYCTiiB", - "figma_url": "https://www.figma.com/file/KtGIx2vrYNtApMiPYCTiiB" + "figma_url": "https://www.figma.com/file/KtGIx2vrYNtApMiPYCTiiB", + "figma_variants": [ + { + "name": "Quicker Design system", + "matched": "Quicker Design system", + "key": "KtGIx2vrYNtApMiPYCTiiB", + "url": "https://www.figma.com/file/KtGIx2vrYNtApMiPYCTiiB" + } + ] }, { "id": "W52", @@ -1103,7 +1465,15 @@ "archive_size_mb": 57.0, "source_rel": "../extracted/W52", "figma_key": "U4YDJ7B0Sefem9r8LiEs8b", - "figma_url": "https://www.figma.com/file/U4YDJ7B0Sefem9r8LiEs8b" + "figma_url": "https://www.figma.com/file/U4YDJ7B0Sefem9r8LiEs8b", + "figma_variants": [ + { + "name": "Ui8_RealStatic_Static Mania", + "matched": "Ui8_RealStatic_Static Mania", + "key": "U4YDJ7B0Sefem9r8LiEs8b", + "url": "https://www.figma.com/file/U4YDJ7B0Sefem9r8LiEs8b" + } + ] }, { "id": "W53", @@ -1125,7 +1495,15 @@ "archive_size_mb": 52.0, "source_rel": "../extracted/W53", "figma_key": "pMjAEiLKAFE57eaI4f4vva", - "figma_url": "https://www.figma.com/file/pMjAEiLKAFE57eaI4f4vva" + "figma_url": "https://www.figma.com/file/pMjAEiLKAFE57eaI4f4vva", + "figma_variants": [ + { + "name": "Aset - skill Shoot", + "matched": "Aset - skill Shoot", + "key": "pMjAEiLKAFE57eaI4f4vva", + "url": "https://www.figma.com/file/pMjAEiLKAFE57eaI4f4vva" + } + ] }, { "id": "W54", @@ -1147,7 +1525,15 @@ "archive_size_mb": 49.2, "source_rel": "../extracted/W54", "figma_key": "vcb4bLF79NTpybgXvAtkNM", - "figma_url": "https://www.figma.com/file/vcb4bLF79NTpybgXvAtkNM" + "figma_url": "https://www.figma.com/file/vcb4bLF79NTpybgXvAtkNM", + "figma_variants": [ + { + "name": "GETPAY - FINANCE TEMPLATES DESIGN", + "matched": "GETPAY - FINANCE TEMPLATES DESIGN", + "key": "vcb4bLF79NTpybgXvAtkNM", + "url": "https://www.figma.com/file/vcb4bLF79NTpybgXvAtkNM" + } + ] }, { "id": "W55", @@ -1170,7 +1556,15 @@ "archive_size_mb": 48.3, "source_rel": "../extracted/W55", "figma_key": "IpdxPbiWuGZQpr3aNXsVpC", - "figma_url": "https://www.figma.com/file/IpdxPbiWuGZQpr3aNXsVpC" + "figma_url": "https://www.figma.com/file/IpdxPbiWuGZQpr3aNXsVpC", + "figma_variants": [ + { + "name": "Fecca", + "matched": "Fecca", + "key": "IpdxPbiWuGZQpr3aNXsVpC", + "url": "https://www.figma.com/file/IpdxPbiWuGZQpr3aNXsVpC" + } + ] }, { "id": "W56", @@ -1192,7 +1586,45 @@ "archive_size_mb": 299.9, "source_rel": "../extracted/W56", "figma_key": "IoQBzPjHw51WjFKL52kJKN", - "figma_url": "https://www.figma.com/file/IoQBzPjHw51WjFKL52kJKN" + "figma_url": "https://www.figma.com/file/IoQBzPjHw51WjFKL52kJKN", + "figma_variants": [ + { + "name": "01 Home - Orabel Web UI Kit", + "matched": "01 Home - Orabel Web UI Kit", + "key": "IoQBzPjHw51WjFKL52kJKN", + "url": "https://www.figma.com/file/IoQBzPjHw51WjFKL52kJKN" + }, + { + "name": "02 About - Orabel Web UI Kit", + "matched": "02 About - Orabel Web UI Kit", + "key": "AEZMbGAy5IfnDAkFrbYwB6", + "url": "https://www.figma.com/file/AEZMbGAy5IfnDAkFrbYwB6" + }, + { + "name": "03 Portfolio - Orabel Web UI Kit", + "matched": "03 Portfolio - Orabel Web UI Kit", + "key": "BOnT7oN2pavJlDCdAO9Yih", + "url": "https://www.figma.com/file/BOnT7oN2pavJlDCdAO9Yih" + }, + { + "name": "04 Blog - Orabel Web UI Kit", + "matched": "04 Blog - Orabel Web UI Kit", + "key": "Dc4uWhUeLCC6f2wiblXiBa", + "url": "https://www.figma.com/file/Dc4uWhUeLCC6f2wiblXiBa" + }, + { + "name": "05 Contact - Orabel Web UI Kit", + "matched": "05 Contact - Orabel Web UI Kit", + "key": "bCrGhKu5PwOZh4F2EbyLk8", + "url": "https://www.figma.com/file/bCrGhKu5PwOZh4F2EbyLk8" + }, + { + "name": "06 Open Menu - Orabel Web UI Kit", + "matched": "06 Open Menu - Orabel Web UI Kit", + "key": "tLnL0G13yvkQtBZeQmPeq5", + "url": "https://www.figma.com/file/tLnL0G13yvkQtBZeQmPeq5" + } + ] }, { "id": "W6", @@ -1216,7 +1648,15 @@ "archive_size_mb": 413.7, "source_rel": "../extracted/W6", "figma_key": "LA2daTQaigGkMUUNgPr6fp", - "figma_url": "https://www.figma.com/file/LA2daTQaigGkMUUNgPr6fp" + "figma_url": "https://www.figma.com/file/LA2daTQaigGkMUUNgPr6fp", + "figma_variants": [ + { + "name": "AKASHA-PAGEBUILDING-KIT", + "matched": "AKASHA-PAGEBUILDING-KIT", + "key": "LA2daTQaigGkMUUNgPr6fp", + "url": "https://www.figma.com/file/LA2daTQaigGkMUUNgPr6fp" + } + ] }, { "id": "W7", @@ -1239,7 +1679,15 @@ "archive_size_mb": 106.5, "source_rel": "../extracted/W7", "figma_key": "CLZepne3voPYx198q3wUHO", - "figma_url": "https://www.figma.com/file/CLZepne3voPYx198q3wUHO" + "figma_url": "https://www.figma.com/file/CLZepne3voPYx198q3wUHO", + "figma_variants": [ + { + "name": "Bright Kit", + "matched": "Bright Kit", + "key": "CLZepne3voPYx198q3wUHO", + "url": "https://www.figma.com/file/CLZepne3voPYx198q3wUHO" + } + ] }, { "id": "W8", @@ -1262,7 +1710,8 @@ "archive_size_mb": 69.0, "source_rel": "../extracted/W8", "figma_key": null, - "figma_url": null + "figma_url": null, + "figma_variants": [] }, { "id": "W9", @@ -1284,8 +1733,16 @@ "archive_size_mb": 15.5, "source_rel": "../extracted/W9", "figma_key": "V6qWYeL6Hr5QA5Jz9rDmc7", - "figma_url": "https://www.figma.com/file/V6qWYeL6Hr5QA5Jz9rDmc7" + "figma_url": "https://www.figma.com/file/V6qWYeL6Hr5QA5Jz9rDmc7", + "figma_variants": [ + { + "name": "Grocery Delivery Landing Page", + "matched": "Grocery Delivery Landing Page", + "key": "V6qWYeL6Hr5QA5Jz9rDmc7", + "url": "https://www.figma.com/file/V6qWYeL6Hr5QA5Jz9rDmc7" + } + ] } ], - "imported_summary": "✅ 47/56 套已云端就位在 Figma Drafts(35 个 .fig 原生 + 12 个 .sketch 经 Figma 转换)。点卡片 → modal → iframe 实时投射。" + "imported_summary": "✅ 47/56 套(共 59 个文件)已云端就位在 Figma Drafts(35 .fig + 12 .sketch 转换)。点卡片 → modal → 多变体 tab 切换 + iframe 实时投射。" } \ No newline at end of file diff --git a/web/styles.css b/web/styles.css index d551aa6..b1048a3 100644 --- a/web/styles.css +++ b/web/styles.css @@ -79,6 +79,12 @@ main{padding:32px 0 80px} .spec .v{color:var(--text);font-family:ui-monospace,monospace;font-size:12px;word-break:break-all} .figma-embed{width:100%;aspect-ratio:16/10;border:0;border-radius:10px;background:var(--panel2);margin-bottom:16px} +.modal-body h2 .vcount{display:inline-block;margin-left:8px;padding:2px 10px;background:rgba(107,92,255,.2);color:#b5bbf8;font-size:12px;font-weight:500;border-radius:999px;vertical-align:middle} +.variant-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid var(--line)} +.vtab{background:var(--panel2);border:1px solid var(--line);color:var(--muted);padding:6px 12px;border-radius:8px;cursor:pointer;font-size:12px;transition:all .15s;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.vtab:hover{color:var(--text);border-color:#3a3f55} +.vtab.active{background:var(--brand);border-color:var(--brand);color:#fff} + /* FOOTER */ footer{border-top:1px solid var(--line);padding:20px 0;color:var(--muted);font-size:12px} footer .wrap{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}