Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Open Design's revenue-driver narrative: what actually moves ARR, the leverage points, and the forecast. Built as a decision-grade data & finance deck for board, finance leadership.
.claude/skills/nexu-io-huashu-sparkline-arc/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 144% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 180% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 120% | 0% |
Produce a single-file, Duarte-style narrative deck. You are a story cartographer working in HTML: every page is built on one oscillating waveform that travels between "what is" and "what could be", and orange appears only where the story turns. The visual system, canvas contract, and navigation runtime are locked by example.html. Start from example.html, replace content only — do not rewrite the design or the script. Do not introduce any color or font outside this spec.
Generated from the Sparkline叙事波形 / Narrative Sparkline (Duarte式) spec (中性派, 还原91%) in references/design-styles.md of huashu-design by 花叔 (alchaincyf), MIT licensed. Lineage: Nancy Duarte《Resonate》sparkline structure, Al Gore An Inconvenient Truth, Duarte Inc. data storytelling.
<div id="stage"> fixed at 1920 × 1080 px, centered withposition: fixed; top: 50%; left: 50%; a fit() function applies translate(-50%, -50%) scale(min(innerWidth/1920, innerHeight/1080)) on load and resize. All inner layout in px — the scaler owns responsiveness.
<section class="slide"> inside #stage with adata-screen-label="01 封面"-style label; exactly one slide carries .active; dark pages add .dark.
←/↑/PageUp previous,→/↓/Space/PageDown next, Home/End first/last; #/N hash routing (1-indexed) read on load + hashchange, written via history.replaceState; click left third = back, rest = forward; fixed counter pill bottom-right, key-hint bottom-left. No external JS, no build step — the file must open inside a sandboxed iframe via file://.
:root — keep the names, re-theme values only)| Token | Value | Role | |---|---|---| | --paper | #FFFFFF | light page background | | --night | #0E0E0C | dark pages (solo-line, closing) | | --ink | #1A1814 | primary text on light | | --night-ink | #F5F3EE | primary text on dark | | --accent | #FF6B2C | the brand orange — the only accent | | --accent-dim | rgba(255,107,44,.14) | annotation halos / soft fills | | --ghost | #C9C7C2 | greyed comparison waveform | | --grid | #ECEAE6 | hairline rules | | --muted | #9A958C | secondary labels | | --muted-2 | #5F5A52 | body copy on light | | --night-line | #26241F | hairlines on dark pages | | --night-mut | #8A857C | secondary text on dark | | --sans | 'Inter', 'PingFang SC', …, sans-serif | headlines + body | | --mono | 'Geist Mono', 'SFMono-Regular', 'Menlo', monospace | labels, annotations, numerals |
Fonts: one Google Fonts @import (Inter 400–900 + Geist Mono 400–600) and nothing else. No CDN scripts, no chart libraries, no images — every chart is a hand-written inline SVG path. A second accent color is the cardinal sin of this style; grey is the only other voice.
.spark SVG with a smooth cubic-bézier oscillating path. Line layer uses preserveAspectRatio="none" so the path stretches; annotation dots/text live in a second, non-stretched SVG layer with the same viewBox so circles stay round and type stays true. Line weights: .arc 5px orange hero line, .arc-thin 3.5px, .ghost-line 3px grey, .ghost-dash stroke-dasharray: 2 10 grey baseline/industry reference.
.pt group = soft halo circle(--accent-dim), solid orange dot (r≈6–7), optional 2px orange ring for THE inflection point, plus Geist Mono uppercase .lab (12px, 2px tracking) and .val (20px, 600) value text. Grey .pt-ghost dots mark pain points on comparison lines. Orange marks turning points only — if every dot is orange, nothing turns.
pathLength="1" + class draw(stroke-dasharray: 1; stroke-dashoffset: 1); .slide.active .draw animates stroke-dashoffset to 0 (spark-draw, ~1.8s, ease-out-ish cubic-bezier). Segment stagger via d1/d2/d3, dot fade-ins via p1…p5 (animation-delay ladder). Because .active toggles display, the reveal replays every time a slide is entered — keep it that way.
.chrome-top / .chrome-bottom strips onevery page — Geist Mono 11px uppercase, 2px tracking, --grid hairline border (--night-line on dark), org name left with an orange / separator, orange uppercase tag right, orange P.NN page marker bottom right. No solid bars, no logos — type and one hairline only.
baseline, the old process line above the new one, or a flat ghost line under the rising arc. The grey line is the "what is"; the orange line is the "what could be".
.giant, 160–220px Geist Mono 600,negative tracking, font-variant-numeric: tabular-nums) with one orange glyph (%, ×, unit); stat strips (.stat-strip) with a --grid top hairline, 44px mono numbers and 11px uppercase captions.
| Layout | Role | |---|---| | cover | giant statement headline (orange full stop) + waveform below with what-is / turn / new-bliss dots | | contents | chapters hung directly on the waveform as numbered annotation points | | what-is | left action-title column + low, flat grey waveform with dashed industry ghost + stat strip | | turning-point | giant mono numeral + V-shaped inflection waveform, THE ringed orange dot, dated annotation | | before-after | stacked contrast: grey jagged line top half, orange rising line bottom half, hairline divider | | solo-line | dark page, one orange line crossing the void, one annotation, one big number | | evidence | rising waveform with 4 labelled value dots + summary strip of mini inline-SVG sparklines | | roadmap | three waveform segments revealed in sequence (d1/d2/d3) + three phase columns below | | quote | orange SVG quote marks + 56px/800 quote with orange key phrase + ghost waveline footer | | closing | dark page, 6px orange curve climbing out of the top-right edge + giant CTA |
glyph (。 or .) of a hero headline is orange — never the whole headline.
--muted-2, emphasized spans --ink 700, max-width~620px. Labels/annotations/numerals: always Geist Mono, uppercase, 2–4px tracking. Chinese copy uses 「」 quotes and full-width punctuation.
pages (solo-line + closing). Orange budget: turning points, annotation dots, chrome tags and single glyphs — roughly ≤ 5 orange touches per page.
one explicit dated turning point, oscillate through evidence, end with the line climbing out of frame ("new bliss"). One story, one line.
content only — the user's actual numbers and dates; missing data gets an honest <!-- 待用户提供 --> placeholder, never invented statistics. (The seed deck's 「澈流 / CHELIU」 data is fictional demo content and must be fully replaced.)
what is the "what is", what is THE dated turning point, which 3–4 numbers prove the climb. This style dies without a real inflection moment.
example.html, retitle, then replace each section's contentfollowing the layout enumeration. Keep chrome strips, spark/reveal CSS, token names, and the script intact. Reshape the bézier paths to match the user's actual data direction (down-then-up, stepped, etc.) but keep the two-layer SVG pattern and pathLength="1" reveal mechanics.
page, confirm the grammar, then batch the rest.
#/N hash stay in sync; reveal animation replays on each entry; no overflow beyond 1920×1080; annotation dots sit visually on their lines at 16:9; orange appears only at turning points; every page has the chrome strips and at least one waveform; no leftover demo (「澈流」/"CHELIU") text; grep for TODO.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 46,083 | 79,608 | +73% | 1 | 1 | 0% | 8,273 | 10,824 | +31% | 0 | 0 | — |
case-02 | fail→fail | 38,710 | 50,807 | +31% | 1 | 1 | 0% | 8,293 | 10,844 | +31% | 0 | 0 | — |
case-03 | fail→pass | 33,126 | 62,933 | +90% | 1 | 1 | 0% | 7,074 | 10,789 | +53% | 0 | 0 | — |
case-04 | pass→pass | 17,358 | 16,640 | -4% | 1 | 1 | 0% | 2,033 | 5,129 | +152% | 0 | 0 | — |
case-05 | fail→fail | 15,239 | 49,210 | +223% | 1 | 1 | 0% | 2,416 | 10,783 | +346% | 0 | 0 | — |
case-06 | fail→fail | 15,913 | 38,691 | +143% | 1 | 1 | 0% | 2,578 | 10,792 | +319% | 0 | 0 | — |
case-07 | fail→pass | 15,295 | 15,432 | +1% | 1 | 1 | 0% | 2,269 | 5,539 | +144% | 0 | 0 | — |
case-08 | fail→fail | 13,452 | 8,481 | -37% | 1 | 1 | 0% | 1,674 | 3,990 | +138% | 0 | 0 | — |
case-09 | fail→fail | 20,110 | 28,233 | +40% | 1 | 1 | 0% | 2,707 | 8,190 | +203% | 0 | 0 | — |
case-10 | fail→pass | 16,553 | 9,964 | -40% | 1 | 1 | 0% | 2,475 | 3,989 | +61% | 0 | 0 | — |
case-11 | fail→fail | 24,698 | 38,294 | +55% | 1 | 1 | 0% | 5,310 | 10,761 | +103% | 0 | 0 | — |
case-12 | fail→pass | 14,136 | 18,976 | +34% | 1 | 1 | 0% | 1,908 | 5,336 | +180% | 0 | 0 | — |
case-13 | fail→pass | 12,888 | 10,258 | -20% | 1 | 1 | 0% | 1,978 | 4,351 | +120% | 0 | 0 | — |
case-14 | pass→fail | 13,640 | 39,851 | +192% | 1 | 1 | 0% | 1,852 | 10,772 | +482% | 0 | 0 | — |
case-15 | fail→pass | 13,632 | 49,991 | +267% | 1 | 1 | 0% | 2,224 | 10,774 | +384% | 0 | 0 | — |
case-16 | fail→pass | 14,075 | 18,215 | +29% | 1 | 1 | 0% | 2,718 | 5,373 | +98% | 0 | 0 | — |
case-17 | pass→pass | 20,106 | 44,211 | +120% | 1 | 1 | 0% | 1,683 | 10,780 | +541% | 0 | 0 | — |
case-18 | pass→fail | 12,326 | 49,796 | +304% | 1 | 1 | 0% | 1,983 | 10,783 | +444% | 0 | 0 | — |
case-19 | fail→pass | 15,480 | 27,747 | +79% | 1 | 1 | 0% | 2,394 | 8,311 | +247% | 0 | 0 | — |
case-20 | pass→fail | 63,102 | 41,510 | -34% | 1 | 1 | 0% | 8,006 | 10,798 | +35% | 0 | 0 | — |
case-21 | pass→fail | 49,634 | 42,181 | -15% | 1 | 1 | 0% | 8,237 | 10,788 | +31% | 0 | 0 | — |
case-22 | fail→fail | 56,414 | 41,599 | -26% | 1 | 1 | 0% | 8,242 | 10,793 | +31% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.