Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when generating an SVG UI panel (list, checklist, pipeline status, or report layout): apply the house design constants for size, font, status colors, shadow, and row spacing.
.claude/skills/svg-ui-panel-conventions/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 3 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.5-flashbest | +91% | — | 0% | 23 | 86d ago |
| gemini-3.6-flash | +74% | +84% | 0% | 23 | 54d ago |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-11 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
When you emit an SVG information panel (a list/table panel, a task checklist, a pipeline/dependency status diagram, or a rich-text report layout), every numeric constant and hex code below is fixed. Do not substitute "equivalent" values, near-shades, or system defaults — the house style is the deliverable.
<svg viewBox="0 0 1200 H" ...>. The viewBox width is always1200 (landscape, ~16:9). Only the height H varies with content.
<text> carries, in this exact order:font-family="'Inter','Helvetica Neue','Microsoft YaHei',sans-serif".
alone / system-ui. The 'Microsoft YaHei' fallback is what renders CJK on Windows — dropping it is a bug, not a simplification.
| Meaning | Hex | |---|---| | done / success / pass / healthy | #43A047 | | in-progress / warning / running / degraded / pending-review | #FF8F00 | | not-started / neutral / disabled / pending / todo / off | #90A4AE | | error / failed / blocked / down | #E53935 | | info / highlighted metric / KPI accent | #1565C0 |
Pick the color by the item's meaning, never by aesthetic preference. A "done" item is #43A047; a "failed" stage is #E53935; a "not started" item is #90A4AE.
The title band at the top of each panel uses a fixed deep accent per template: | Template | Header hex | |---|---| | list-panel | #1A237E (Indigo) | | checklist-panel | #004D40 (Teal) | | pipeline-status | #311B92 (Deep Purple) | | richtext-layout | #263238 (Blue Grey) |
<filter id="cardShadow"> once inside <defs>.<rect> references it via filter="url(#cardShadow)". No cardships without the shadow; there is exactly one filter, reused.
rx="8".rx="4"–rx="6".rx = half the element height (a full capsule).font-size="20" bold.font-size="14"–16 bold.font-size="13".font-size="11"–12.Each checklist item shows a leading status box plus styled text:
#43A047) filled box + strikethrough label.#FF8F00) border + light highlight behind the label.#90A4AE) empty box.#E53935) dashed border + red-tinted row background.output_width=2400:python3 -c "import cairosvg; cairosvg.svg2png(url='in.svg', write_to='out.png', output_width=2400)"
R1 Canvas — base picks an arbitrary width.
<svg viewBox="0 0 800 400"><svg viewBox="0 0 1200 400">R2 Font — base reaches for Arial.
<text font-family="Arial, sans-serif">Build</text><text font-family="'Inter','Helvetica Neue','Microsoft YaHei',sans-serif">Build</text>R3 Status color — base uses Material's default green #4CAF50.
<circle cx="1120" cy="50" r="8" fill="#4CAF50"/> <!-- done --><circle cx="1120" cy="50" r="8" fill="#43A047"/> <!-- done -->R3 Info accent — base colors a KPI the same green as "done".
<rect ... fill="#43A047"/> <text>Revenue $4.2M</text><rect ... fill="#1565C0"/> <text>Revenue $4.2M</text> (KPI = info blue)R4 Header band — base uses one neutral header everywhere.
<rect x="0" y="0" width="1200" height="72" fill="#333"/><rect x="0" y="0" width="1200" height="72" fill="#311B92"/> (pipeline = Deep Purple)R5 Shadow — base draws flat cards.
<rect x="20" y="20" width="1160" height="60" fill="#fff"/>svg <defs><filter id="cardShadow"><feDropShadow dx="0" dy="2" stdDeviation="3"/></filter></defs> <rect x="20" y="20" width="1160" height="60" fill="#fff" filter="url(#cardShadow)"/>
R6 Row spacing — base eyeballs ~50px between rows.
y="120", row2 y="170" (+50).y="120", row2 y="176" (+56). Checklist would be +60.R7 Corner radius — base leaves rects sharp.
<rect ... /> (no rx)<rect ... rx="8"/> for a card; rx="4" for an inline status chip.R8 Text sizes — base uses one font size for everything.
font-size="14".font-size="20" bold, body font-size="13".R9 Checklist glyph — base just colors the text and skips the box.
<text fill="#43A047">Build image</text>svg <rect x="40" y="100" width="18" height="18" rx="4" fill="#43A047"/> <text x="68" y="114" text-decoration="line-through" font-family="'Inter','Helvetica Neue','Microsoft YaHei',sans-serif">Build image</text>
R10 PNG — base downsizes for messaging.
cairosvg.svg2png(url='in.svg', write_to='out.png', output_width=800)cairosvg.svg2png(url='in.svg', write_to='out.png', output_width=2400)checklist with done + blocked + todo items uses #43A047, #E53935, and #90A4AE in the same panel — never one color for the whole panel.
amber #FF8F00. Not-started is untouched → grey #90A4AE. They are different states, different colors.
H in the viewBox; nevershrink width below 1200 to "fit" — width is locked.
execution state (running → #FF8F00); the risk goes in a separate RISK_NOTE, not by recoloring the node red.
#1565C0, not the green success color, even when the number is "good".
1200.font-family="Arial". ALWAYS the full 4-face stack in order.#4CAF50/#F44336/#9E9E9E (Material defaults). ALWAYS the househex #43A047/#E53935/#90A4AE.
#1565C0 for metrics.<filter id="cardShadow"> + filter="url(#cardShadow)" on each card.0 0 800 600 or the content's natural size.font-family="Arial, sans-serif" or "Helvetica, sans-serif".#4CAF50 (green) / #FFC107 (amber) / #F44336 (red)instead of the house #43A047 / #FF8F00 / #E53935.
viewBox="0 0 1200 H" (width 1200)<text> → the exact 4-face font stack#43A047 / #FF8F00 / #90A4AE / #E53935; info #1565C0<filter id="cardShadow">, applied to every cardoutput_width=2400| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.5-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +74 percentage points is the difference between those two pass rates over the 23 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 6/26/2026 | +91% |
Other measured skills in the registry, with their headline benchmark lift.