// ==UserScript==
// @name GitHub 菜单助手
// @namespace http://tampermonkey.net/
// @version 2.0
// @description 完全原生GitHub样式,直接插入li到feed之后
// @match https://github.com/
// @icon https://github.githubassets.com/pinned-octocat.svg
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
function waitForElement(selector, callback) {
const el = document.querySelector(selector);
el ? callback(el) : setTimeout(() => waitForElement(selector, callback), 200);
}
function addNativeMenuItems() {
const feedItem = document.querySelector('li[data-item-id="feed"]');
if (!feedItem || document.querySelector('.custom-github-li')) return;
const menuItems = [
{ id: 'repo', text: '仓库', href: '/repos' },
{ id: 'stars', text: '星标', href: '/stars' },
{ id: 'trending', text: '热门', href: '/trending' },
{ id: 'explore', text: '探索', href: '/explore' },
{ id: 'marketplace', text: '市场', href: '/marketplace' },
{ id: 'settings', text: '设置', href: '/settings' }
];
let lastItem = feedItem;
menuItems.forEach(item => {
// 1:1 复刻你给的原生 li 结构
const li = document.createElement('li');
li.dataset.itemId = item.id;
li.dataset.targets = 'nav-list.items';
li.dataset.viewComponent = 'true';
li.className = 'ActionListItem custom-github-li';
const a = document.createElement('a');
a.href = item.href;
a.dataset.viewComponent = 'true';
a.className = 'ActionListContent ActionListContent--visual16';
// 视觉图标区域
const visualSpan = document.createElement('span');
visualSpan.className = 'ActionListItem-visual ActionListItem-visual--leading';
// === 仓库图标:官方SVG ===
if (item.id === 'repo') {
visualSpan.innerHTML = ``;
}
// === 星标图标:官方SVG ===
else if (item.id === 'stars') {
visualSpan.innerHTML = ``;
}
// === 探索图标:官方SVG ===
else if (item.id === 'explore') {
visualSpan.innerHTML = ``;
}
// === 市场图标:你提供的gift SVG ===
else if (item.id === 'marketplace') {
visualSpan.innerHTML = ``;
}
// === 设置图标:官方SVG ===
else if (item.id === 'settings') {
visualSpan.innerHTML = ``;
}
// 热门图标 + 垂直居中
else {
visualSpan.style.cssText = "display: flex; align-items: center; justify-content: center; width: 16px; height: 16px; font-size: 16px;";
visualSpan.textContent = '🔥';
}
// 文字label
const labelSpan = document.createElement('span');
labelSpan.dataset.viewComponent = 'true';
labelSpan.className = 'ActionListItem-label';
labelSpan.textContent = item.text;
a.append(visualSpan, labelSpan);
li.appendChild(a);
lastItem.after(li);
lastItem = li;
});
}
waitForElement('ul.ActionListWrap li[data-item-id="feed"]', addNativeMenuItems);
})();