用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill ensure-panelvisualappeal命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
基于 SOC 职业分类
正在显示 SKILL.md
| name | ensure-panelvisualappeal |
| description | | Use when this capability is needed. |
This skill validates that LCDPossible panels meet visual design standards for LCD signage displays (1280x480, viewed from 3-6 feet).
IMPORTANT: Before running this validation, read the visual appeal rules:
Read .claude/rules/panel-visual-appeal.md
This file contains the 16 visual appeal rules that panels must comply with.
/ensure-panelvisualappeal <panel-id>
/ensure-panelvisualappeal <screenshot-path>
/ensure-panelvisualappeal <panel-id> <screenshot-path>
Read .claude/rules/panel-visual-appeal.md to get the current visual appeal standards.
If panel ID provided:
dotnet run --project src/LCDPossible/LCDPossible.csproj -c Release -- test <panel-id> -w 2 --debug
%TEMP%\<panel-id>-debug.html~\<panel-id>-cyberpunk.jpgIf only screenshot provided:
Review the screenshot for each of the 16 rules. Score each as:
If HTML available, inspect:
Output a structured report with findings and recommendations.
# Panel Visual Appeal Report
**Panel ID:** <panel-id>
**Theme:** <theme-name>
**Resolution:** 1280x480
**Date:** <date>
## Summary
| Rule | Status | Notes |
|------|--------|-------|
| 1. Container Filling | PASS/WARN/FAIL | |
| 2. Element Centering | PASS/WARN/FAIL | |
| 3. Color Contrast | PASS/WARN/FAIL | |
| 4. Container Boundaries | PASS/WARN/FAIL | |
| 5. Panel Utilization | PASS/WARN/FAIL | |
| 6. Typography Hierarchy | PASS/WARN/FAIL | |
| 7. Consistent Spacing | PASS/WARN/FAIL | |
| 8. Grid Alignment | PASS/WARN/FAIL | |
| 9. Truncation Handling | PASS/WARN/FAIL | |
| 10. Every Value Needs a Label | PASS/WARN/FAIL | |
| 11. Avoid Orphaned Empty Space | PASS/WARN/FAIL | |
| 12. Empty/No-Data States | PASS/WARN/FAIL | |
| 13. Visual Balance | PASS/WARN/FAIL | |
| 14. Color Semantics | PASS/WARN/FAIL | |
| 15. Icon/Symbol Proportionality | PASS/WARN/FAIL | |
| 16. Theme Compliance | PASS/WARN/FAIL | |
**Overall Score:** X/16 PASS, Y WARN, Z FAIL
## Detailed Findings
### Issues Found
1. **[FAIL] Rule X: <Rule Name>**
- Problem: <description>
- Location: <widget/element>
- Recommendation: <fix suggestion>
2. **[WARN] Rule Y: <Rule Name>**
- Problem: <description>
- Recommendation:
// Before: Two 1-row widgets stacked (wastes space, forces tiny text)
yield return new WidgetDefinition("lcd-stat-card", 3, 1, new { // Only 1 row!
title = "GPU", value = "0%"
});
yield return new WidgetDefinition("lcd-stat-card", 3, 1, new { // Only 1 row!
title = "VRAM", value = "23%"
});
// After: Two 2-row widgets that fill the panel height
yield return new WidgetDefinition("lcd-stat-card", 3, 2, new { // 2 rows each
title = "GPU", value = "0%", size = "large"
});
yield return new WidgetDefinition("lcd-stat-card", 3, 2, new { // 2 rows each
title = "VRAM", = , size =
});
// Change from small text
yield return new WidgetDefinition("lcd-stat-card", 4, 2, new {
title = "CPU",
value = cpuName,
size = "small" // Too small!
});
// To larger text
yield return new WidgetDefinition("lcd-stat-card", 4, 2, new {
title = "CPU",
value = cpuName,
size = "large" // Better for the container size
});
<!-- Before: Fixed size -->
<svg width="200" height="100">
<!-- After: Fill container -->
<svg viewBox="0 0 100 60" class="w-full h-full" preserveAspectRatio="none">
<!-- Before: Default alignment (content at top-left) -->
<div class="card">
<span class="label">GPU</span>
<span class="value">0%</span>
</div>
<!-- After: Centered content (equal whitespace on all sides) -->
<div class="card flex flex-col items-center justify-center h-full">
<span class="label">GPU</span>
<span class="value">0%</span>
</div>
Key classes for centering:
flex flex-col - Stack label and value verticallyitems-center - Center horizontallyjustify-center - Center verticallyh-full - Ensure container takes full height to center within<!-- Before: Hardcoded -->
<div style="color: #00d4ff">
<!-- After: Theme variable -->
<div class="text-primary">
if (data.items.Count == 0)
{
yield return WidgetDefinition.FullWidth("empty-state", 4, new {
message = "No data available"
});
yield break;
}
// Before: Donut with no context
yield return new WidgetDefinition("lcd-donut", 4, 2, new {
value = data.cpuUsage,
max = 100
// Missing label!
});
// After: Donut with clear label
yield return new WidgetDefinition("lcd-donut", 4, 2, new {
value = data.cpuUsage,
max = 100,
label = "CPU" // Now users know what 47% means
});
// Before: Widgets clustered on left, right side empty
yield return new WidgetDefinition("lcd-stat-card", 2, 2, new { ... }); // cols 1-2
yield return new WidgetDefinition("lcd-stat-card", 2, 2, new { ... }); // cols 3-4
yield return new WidgetDefinition("lcd-stat-card", 2, 2, new { ... }); // cols 5-6
// Cols 7-12 empty!
// After: Widgets expanded to fill panel
yield return new WidgetDefinition("lcd-stat-card", 4, 2, new { ... }); // cols 1-4
yield return new WidgetDefinition("lcd-stat-card", 4, 2, new { ... }); // cols 5-8
;
// Before: 6 identical 2×4 stat-cards in a single row with tiny text
yield return new WidgetDefinition("lcd-stat-card", 2, 4, new { title = "CPU", value = "13%", size = "small" });
yield return new WidgetDefinition("lcd-stat-card", 2, 4, new { title = "TEMP", value = "-", size = "small" });
yield return new WidgetDefinition("lcd-stat-card", 2, 4, new { title = "RAM", value = "49%", size = "small" });
yield return new WidgetDefinition("lcd-stat-card", 2, 4, new { title = "USED", value = "31GB", size = "small" });
yield ();
;
;
;
;
;
;
;
Before approving a panel, verify:
Converted and distributed by TomeVault — claim your Tome and manage your conversions.