Install any skill in seconds. Free to start, no credit card required.
Get Started Free →A computer-science capstone: an on-device ML keyboard that predicts next words privately — problem, method, evaluation, and defense answers. Built as a decision-grade coursework defense deck for professor, defense committee.
.claude/skills/nexu-io-fs-notebook-tabs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-17 | ✓→✗ | ▼ Worse | 26% | 0% |
| case-20 | ✓→✗ | ▼ Worse | 50% | 0% |
| case-22 | ✓→✗ | ▼ Worse | 432% | 0% |
A theme-locked deck plugin derived from the MIT-licensed zarazhangrui/frontend-slides "Notebook Tabs" style preset (STYLE_PRESETS.md section 5). The whole deck reads as one physical, editorially typeset notebook: every slide is a cream paper page floating on a dark desk, with a colorful tab index on the right fore-edge and binder holes on the left.
Start from example.html in this plugin folder. It is the proven seed: keep its stage CSS, the paper/holes/tabs device, the :root token block, and the entire SlidePresentation controller script verbatim — replace only the slide content. Do not redesign, do not introduce any color or font outside this spec.
.deck-viewport (fills the window) wraps .deck-stage (1920×1080, transform-origin: 0 0).factor = min(innerWidth/1920, innerHeight/1080), then translate(x, y) scale(factor) to center with letterbox/pillarbox; re-run on resize. This is the viewport-base.css system — the full file is already inlined in the seed.clamp() tab sizing is superseded by stage scaling — use fixed px)..active/.visible (visibility/opacity/pointer-events) — never display: none.←/→/↑/↓/Space/PageUp/PageDown/Home/End), debounced wheel (~650ms), touch swipe (≥40px), and #/<index> hash routing with deep-link restore. The page counter lives in .deck-controls, fixed-positioned outside the scaled stage.css:root { /* Colors */ --bg-outer: #2d2d2d; /* dark desk behind the notebook */ --bg-page: #f8f6f1; /* cream paper */ --text-primary: #1a1a1a; --text-secondary: #6b6358; --rule: #d8d2c4; /* hairline rules on paper */ --tab-1: #98d4bb; /* Mint */ --tab-2: #c7b8ea; /* Lavender */ --tab-3: #f4b8c5; /* Pink */ --tab-4: #a8d8ea; /* Sky */ --tab-5: #ffe6a7; /* Cream */ --stage-bg: var(--bg-outer); --slide-bg: var(--bg-outer); /* Typography */ --font-display: 'Bodoni Moda', 'Didot', serif; /* 400/700 + italic */ --font-body: 'DM Sans', 'Helvetica Neue', sans-serif; /* 400/500/700 */ --title-size: 150px; --h2-size: 84px; --subtitle-size: 30px; --body-size: 26px; --label-size: 17px; /* Paper geometry inside the 1920×1080 stage */ --paper-top: 56px; --paper-bottom: 56px; --paper-left: 120px; --paper-right: 150px; /* leaves room for the protruding tabs */ --paper-pad-x: 110px; --paper-pad-y: 78px; /* Motion */ --ease-page: cubic-bezier(0.16, 1, 0.3, 1); /* the one signature easing */ --duration-normal: 0.7s; }
Fonts load via one Google Fonts @import (Bodoni Moda ital,wght 0,400/0,700/1,400 + DM Sans 400/500/700). Forbidden: any other font, Inter/Roboto/Arial/system display fonts, any color outside the tokens above, gradients as decoration, indigo #6366f1, dark-glassmorphism panels.
.paper — absolutely positioned by the --paper-* insets, border-radius: 8px, layered shadow (0 2px 4px + 0 18px 50px dark drops + a 1px inner white highlight), faint 44px-pitch ruled-line grain via a layered linear-gradient, z-index: 1..holes — a left-margin flex column of 10 punched circles (26px, background: var(--bg-outer), inset dark shadow + 1px white bottom highlight), inside the paper at left: 38px..margin-rule — a 1px vertical line at left: 92px in var(--tab-3) at 0.55 opacity, echoing a real notebook's red margin line..tabs — a vertical column of 5 tabs on the right fore-edge, writing-mode: vertical-rl, DM Sans 700 uppercase letter-spaced, 56×158px, border-radius: 0 10px 10px 0, colored --tab-1…--tab-5 in order. The column is positioned against the stage (right: calc(--paper-right - 44px)) at z-index: 0 so 12px of each tab root tucks under the paper. The current section's tab gets .on (full opacity, translateX(0), stronger shadow); inactive tabs sit at 0.82 opacity, translateX(-6px). Tab labels name the deck's sections (seed: Intro / Craft / Numbers / Plan / End) — rename to the actual sections, keep the color order..runhead top ("No. NN" + running title, uppercase DM Sans, hairline bottom border) and .baseline bottom (section name + "NN / total", hairline top border). Keep both on every slide.cover (kicker with color chip + giant Bodoni display with one italic word + swatch row), contents (index rows: color chip + roman numeral + dotted leaders + page no.), section divider (430px outline-stroke Bodoni numeral + color bar + h2), bullets (max 3 points: colored circular pin with inline-SVG icon + Bodoni h3 + DM Sans support line), quote (lavender 220px quote mark + Bodoni italic 66px), big-stat (300px Bodoni number with italic unit + mint-left-border side note), CSS bar chart (scaleY-animated bars in tab colors over a solid axis), two-column comparison (plain column vs .hot column with 8px 8px 0 var(--tab-4) hard offset shadow), principle grid (2×2 cards, each with a 12px colored left edge via --edge), closing (display sign-off + underlined contact links + colophon line). Default 8-11 slides per deck; honor the requested slide count when the user picks one; split content rather than shrinking type. No scrolling, no overflow.
.reveal elements transitioning when the slide gains .visible; stagger with transition-delay steps of ~0.1s (.d1–.d6 helper classes).cubic-bezier(0.16, 1, 0.3, 1). Animate only transform and opacity. Chart bars grow with transform: scaleY from transform-origin: bottom.prefers-reduced-motion support is mandatory (already in the inlined stage CSS)..html: all CSS and JS inline, zero build step, zero external JS libraries or CDN scripts (no Chart.js, no mermaid — pure CSS/SVG only). Icons are inline SVG. No remote images. The only allowed external reference is the Google Fonts @import./* === SECTION NAME === */.example.html, change only the content (text, section/tab names, data values, icon paths). The tokens, paper device, tabs, chrome, and controller script are the product — do not rewrite them, and never introduce colors or fonts outside this spec.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 44,232 | 41,958 | -5% | 1 | 1 | 0% | 8,243 | 10,386 | +26% | 0 | 0 | — |
case-09 | fail→fail | 45,726 | 39,855 | -13% | 1 | 1 | 0% | 8,227 | 10,370 | +26% | 0 | 0 | — |
case-01 | fail→fail | 42,723 | 71,432 | +67% | 1 | 1 | 0% | 8,269 | 10,412 | +26% | 0 | 0 | — |
case-08 | fail→fail | 44,961 | 39,387 | -12% | 1 | 1 | 0% | 8,225 | 10,368 | +26% | 0 | 0 | — |
case-02 | fail→fail | 41,935 | 39,507 | -6% | 1 | 1 | 0% | 8,264 | 10,407 | +26% | 0 | 0 | — |
case-03 | fail→fail | 46,900 | 43,424 | -7% | 1 | 1 | 0% | 8,277 | 10,420 | +26% | 0 | 0 | — |
case-04 | fail→fail | 70,426 | 38,484 | -45% | 1 | 1 | 0% | 8,262 | 10,405 | +26% | 0 | 0 | — |
case-05 | fail→fail | 26,609 | 41,603 | +56% | 1 | 1 | 0% | 4,463 | 10,385 | +133% | 0 | 0 | — |
case-06 | fail→pass | 40,014 | 41,956 | +5% | 1 | 1 | 0% | 8,246 | 10,389 | +26% | 0 | 0 | — |
case-10 | fail→fail | 44,743 | 41,008 | -8% | 1 | 1 | 0% | 8,227 | 10,370 | +26% | 0 | 0 | — |
case-11 | fail→fail | 40,419 | 38,915 | -4% | 1 | 1 | 0% | 8,225 | 10,368 | +26% | 0 | 0 | — |
case-12 | fail→fail | 37,319 | 40,052 | +7% | 1 | 1 | 0% | 8,243 | 10,386 | +26% | 0 | 0 | — |
case-13 | fail→fail | 38,659 | 39,590 | +2% | 1 | 1 | 0% | 8,224 | 10,367 | +26% | 0 | 0 | — |
case-14 | fail→fail | 24,925 | 42,606 | +71% | 1 | 1 | 0% | 5,012 | 10,371 | +107% | 0 | 0 | — |
case-15 | fail→fail | 33,924 | 40,234 | +19% | 1 | 1 | 0% | 8,224 | 10,367 | +26% | 0 | 0 | — |
case-16 | fail→fail | 41,615 | 42,940 | +3% | 1 | 1 | 0% | 8,224 | 10,367 | +26% | 0 | 0 | — |
case-17 | pass→fail | 40,431 | 40,898 | +1% | 1 | 1 | 0% | 8,222 | 10,365 | +26% | 0 | 0 | — |
case-18 | fail→fail | 39,436 | 35,278 | -11% | 1 | 1 | 0% | 8,223 | 10,366 | +26% | 0 | 0 | — |
case-19 | fail→fail | 37,681 | 42,032 | +12% | 1 | 1 | 0% | 8,220 | 10,363 | +26% | 0 | 0 | — |
case-20 | pass→fail | 29,379 | 43,587 | +48% | 1 | 1 | 0% | 6,919 | 10,377 | +50% | 0 | 0 | — |
case-21 | pass→pass | 22,857 | 28,056 | +23% | 1 | 1 | 0% | 4,449 | 7,738 | +74% | 0 | 0 | — |
case-22 | pass→fail | 11,596 | 36,789 | +217% | 1 | 1 | 0% | 1,948 | 10,365 | +432% | 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 -5 percentage points is the difference between those two pass rates over the 22 comparable cases. 7 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.