feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(ui): give skill rows the module page's browse dialect - #2494

Merged
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1
Aug 8, 2026
Merged

feat(ui): give skill rows the module page's browse dialect#2494
jackwener merged 1 commit into
mainfrom
feat/skills-page-wave1

Conversation

@jackwener

Copy link
Copy Markdown
Member

task #163 波 1。owner 反馈技能页「太素了」。

为什么:不是缺装饰,是没跟上隔壁

技能行和 MCP 行是同一种东西——可浏览的实体——但只有一边被打扮成实体。技能行是全 app 唯一用裸图标字形的浏览行,而数据里现成的分类、工具数在送进行的路上被丢掉了。

四处改动,零新增颜色

1 · 图标底共享化。.maka-mcp-market-icon 从 mcp.css 提升为 module-shell.css 的 .maka-module-market-icon,技能行采用。染色边界规则原样带走——这是当初真正花了心思的部分:带彩色官方 logo 的 tile 主动放弃染底、走安静中性板,因为 logo 已经提供了识别,再染底会和图标打架。技能无 logo,恒走中性板。共享这个类,是为了两个模块页从此不会漂成两套图标语言。

2 · 元数据回填,并且放在前面。 分类与 declaredTools.length 本来就在数据里。追加在描述末尾是错的:技能描述是给模型看的长 prose,一截断最先丢的就是元数据,需要分类的行恰恰一个都看不到。现在是「3 个工具 · 描述」。

3 · 内置按分类分组,每组一个 List 带自己的 header——结构才是浏览面变"富"的方式,找"能写文档的"的人需要的是标题。双守卫:只有一个分类时标题是纯开销;搜索时用户已经说了要什么,再按标题拆散反而埋掉命中。分组态下行内不再带分类(组标题已经说了)。

4 · 8 处手写图标尺寸 → 3 个角色常量,数值不变。

页头原本只数已安装,让一个另外两个 tab 都是目录的页面看起来空空如也;现在也数可安装(两个目录去重)。

怎么验证的

  • @maka/ui251 passed / 0 failed
  • skills 与 mcp 两个 e2e 都通过 —— MCP 的类名被指向了共享类,所以专门跑了它
  • typecheck / lint / format / build 全绿
  • 视觉两态截图已过审

已知遗留(不在本 PR,已批准单开)

长描述没有省略号、被面板右缘直接切掉——改动前就存在,非本次引入。根因:Astryx Item 只对字符串 description 做截断,包 span 反而关掉它;真正的问题在 ModulePage 的 flex 链缺 min-width: 0MCP 页同病。作为内容被切掉的 bug 单独修,两页截图为证。

@jackwenerjackwener changed the title feat(ui): give skill rows the module page's browse dialect[DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectAug 8, 2026
@jackwener

Copy link
Copy Markdown
MemberAuthor

Hold — do not merge. I found a layout regression in this branch after opening it.

Rows no longer shrink: the li.astryx-item measures 2532px inside a ~900px panel (main: 860px), which pushes each row's install button off-screen (x=2842) and lets long descriptions run past the panel edge. The install buttons are missing from every row.

I had reported the clipping as a pre-existing bug. That was wrong on two counts: I had no genuine before-screenshot, and clean main truncates correctly with a visible ellipsis and shows the install buttons. It is a regression introduced here.

Prime suspect is the category grouping — main renders one List, this branch renders one List per category with a header, and the rows stop shrinking. Fixing now; will repost with main / regression / fixed screenshots before this is considered again.

@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from d8a7085 to 390f9c6CompareAugust 8, 2026 08:31
@jackwenerjackwener changed the title [DO NOT MERGE] feat(ui): give skill rows the module page's browse dialectfeat(ui): give skill rows the module page's browse dialectAug 8, 2026
The skills page read as plain next to MCP, and the cause was not missing
decoration: a skill row and an MCP row are the same kind of thing — a
browsable entity — and only one of them was dressed as one.
The icon plate moves out of mcp.css into module-shell.css as
`.maka-module-market-icon`, and skill rows adopt it. The tinting BOUNDARY
moves with it, because that is the part that took thinking: a tile carrying a
colourful official logo drops the tint and rides the quiet neutral plate,
since the logo already supplies identity. Skills ship no logos, so they always
take the neutral plate. Sharing the class is what stops the two module pages
drifting into two icon languages.
Category and declared-tool count were already in the data and thrown away on
the way to the row. They now LEAD the supporting line: appended last they were
the first thing a long description pushed out of sight, so exactly the rows
that needed a category never showed one.
Built-in skills group by category, each group a List carrying its own header.
Structure is how a browse surface gets richer. Guarded twice: one category
makes headings pure overhead, and while searching the user has already said
what they want. Under a heading the row drops its own category.
Grouping exposed a latent bug in the shared shell, fixed here. The module
panel is a grid whose column sized to max-content, so a panel holding SEVERAL
row groups stretched to its widest row: rows grew to 2532px inside a 900px
panel, pushing every row's install button off screen and letting descriptions
run past the edge. A single group happened to collapse and hid it.
`grid-template-columns: minmax(0, 1fr)` states the intent — one column, never
wider than the panel. MCP inherits the fix.
Eight hand-written icon sizes become three role constants. Values unchanged.
The page header also counts what is available to install, deduplicated across
both catalogs, instead of only what is installed.
@jackwener
jackwenerforce-pushed the feat/skills-page-wave1 branch from 390f9c6 to 0f2a3fcCompareAugust 8, 2026 08:40
@jackwener
jackwener merged commit b9d94c3 into mainAug 8, 2026
12 checks passed
@jackwener
jackwener deleted the feat/skills-page-wave1 branch August 8, 2026 08:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener