Home / All Skills / Design & Motion / web-proto-soft
Design & Motion · nexu-io/html-anything

web-proto-soft

Apple aesthetic: silver/cream canvas + double-bezel cards + button-in-button + spring motion

L1 Basic · Source registration onlyV1 Commit-PinnedDual-pass Audit
Author nexu-ioGitHub nexu-io/html-anything ↗Stars 8827License Apache-2.0(仓库根 LICENSE 文件;GitHub API license.spdx_id = Apache-2.0)Commit 553ed98c28
Control levels describe skill capabilities and suggested control measures; they do not represent quality or safety certifications, nor do they dictate usability. Usage decisions rest entirely with users and administrators. Different agent hosts apply varying constraints; do not assume hosts provide automatic protection. Third-party skill copyrights belong to their original authors. Use at your own risk.

1How It Works & Mechanism

This skill is not an executable program, but a "template" for html-anything: a directory (SKILL.md + example.html[/example.md]) scanned and read from disk at runtime by loader.ts—adding a new template simply means adding a directory, without modifying any TypeScript code.

next/src/lib/templates/loader.ts
Adding a template = adding a folder. No TS code change required; the API
SKILLS_DIR is fixed at src/lib/templates/skills relative to the app's cwd; listSkills() traverses top-level subdirectories, filters them via isValidBundledId, and reads SKILL.md while parsing frontmatter on a per-directory basis. Consequently, the "selector metadata" and the "prompt body used for generation" originate from the very same file.

Frontmatter provides metadata for the selector/API (zh_name/en_name/emoji/description/category/scenario/aspect_hint/featured/recommended/tags) and is mapped to SkillMeta by fmToMeta(); the body following the frontmatter constitutes the actual specification supplied to the model.

next/src/lib/templates/loader.ts
zhName: fm.zh_name ?? fm.name ?? id,
id is derived from the directory name; example metadata (example_id/name/format/tagline/desc/source_url) produces SkillExampleMeta only when the directory includes example.md/html. The body is intentionally excluded from the listing API (code comment: "Body is excluded so we can return the entire registry in one cheap fetch").

During generation, the template body serves as the prompt body: /api/convert invokes assemblePrompt() to concatenate "global design directives + this template's body + user content" into a unified prompt passed to the host's local agent CLI, with the resulting HTML captured as a stream from stdout.

next/src/app/api/convert/route.ts
prompt = assemblePrompt({ body: skill.body, content, format });
The same route also contains editFromHtml/editFromContent branches for minimal-diff editing; along this execution pipeline, the template body remains purely a static string without evaluation or execution.

Above the template body sits a block of global lead directives (SHARED_DESIGN_DIRECTIVES), uniformly enforcing technical and content disciplines before each template—the external CDN and font links commonly found in example HTML originate here (injected by the host shell, not required by the template itself).

next/src/lib/templates/shared.ts
通过 CDN 引入 Tailwind v3 Play (https://cdn.tailwindcss.com) 与所需的 Google Fonts。
The template body is solely responsible for style, layout, and components without repeating these rigid requirements; ratings evaluate only the template's own directory. These endpoints reflect host shell behavior and are documented in security.reason for self-attestation.

Artifacts are returned as text via stdout: global directives explicitly forbid the agent from accessing the file system, leaving disk persistence to the frontend—thus the template directory has neither scripts nor disk-write capabilities.

next/src/lib/templates/shared.ts
**禁止使用 Write / Edit / MultiEdit / Bash / Create / 任何文件系统工具**。
The original instructions specify: "Do not write HTML to any .html files... The frontend directly captures your stdout text, and disk writes are handled by the frontend"; the artifact is ultimately recorded into task history and exported by the frontend.

example.html serves as a pre-rendered example bundled with the package: /api/templates/<id>/preview returns it verbatim as text/html to an iframe (for inline selector previews), while /api/templates/<id>/example returns both example.md and example.html together.

next/src/app/api/templates/[id]/preview/route.ts
return new Response(skill.exampleHtml, {
Examples are used purely for preview and documentation without participating in prompt generation (generation uses only the SKILL.md body), so its external links do not alter the template's own capability boundaries.

The body breaks down "Apple-tier soft tactile feel" into four actionable elements: a silver/cream canvas with an ambient mesh background, double-bezel cards, button-in-button CTAs, and subtle spring bounce motion.

next/src/lib/templates/skills/web-proto-soft/SKILL.md
- Double-bezel 卡片 (内外两层圆角 + 高光)
Accompanied by directives like "- Silver / cream canvas + ambient mesh background", "- Button-in-button CTA", and "- Spring motion (hover with subtle bounce)"—all four are structural-level specifications.

The double bezel is realized using a pair of border-radius variables: an outer layer --shell-radius 2.25rem, and an inner layer --core-radius = shell - 0.4rem, paired with an --innerlight highlight to create a "nested bezel" visual aesthetic.

next/src/lib/templates/skills/web-proto-soft/example.html
--shell-radius: 2.25rem;
The same variable block defines --core-radius: calc(2.25rem - 0.4rem) and --innerlight: rgba(255,255,255,0.65), with code comments in the example labeling this section as BENTO (double-bezel cards).

Spring motion is powered by a dedicated easing curve (--ease-spring: cubic-bezier(0.16, 1.16, 0.3, 1), with a bezier overshoot > 1), accompanied by a conventional --ease curve for non-elastic transitions.

next/src/lib/templates/skills/web-proto-soft/example.html
--ease-spring: cubic-bezier(0.16, 1.16, 0.3, 1);
The example applies this to hover displacement (transition: transform 360ms var(--ease-spring)), which is the technical implementation behind the "subtle bounce".

The ambient mesh background consists of two large-radius blurred color patches (.mesh::before/::after) drifting slowly, with full handling to disable animations under prefers-reduced-motion.

next/src/lib/templates/skills/web-proto-soft/example.html
@media (prefers-reduced-motion: reduce) { .mesh::before, .mesh::after { animation: none; } }
This is the only prototype among the three to explicitly accommodate reduced-motion, aligning with the requirements found in the vfx-text-cursor body, making it a distinct highlight.

The CLI side features a direct keyword matching channel: skills-matcher.ts maps keywords in user content directly to this template id; a match assigns confidence = match_count * 2 + 3, and reaching the threshold of 3 triggers local rules without asking the model to select a template.

cli/src/skills-matcher.ts
[["苹果", "Apple", "iOS", "soft", "squircle"], "web-proto-soft"],
Keywords like 苹果/Apple/iOS/soft/squircle match directly to this template, sharing design scenario signals with the other two prototypes.

Threshold constants used in the CLI fallback match: content length must exceed 60 characters before AI summary matching is enabled; the strong signal threshold is 3.

cli/src/skills-matcher.ts
const MIN_CONTENT_LENGTH_FOR_AI = 60;
Additionally, SCENARIO_SIGNALS weights keywords according to template scenario, and fallbackMatch scores using tags/zhName/description; agent summary matching is invoked only if both layers fail.

The host shell renders examples/artifacts using an iframe with sandbox="allow-scripts allow-same-origin" (allowing scripts and same-origin access)—this is an architectural tradeoff of the product shell documented as a risk and does not affect the safety grading of this skill.

next/src/components/template-picker.tsx
sandbox="allow-scripts allow-same-origin"
Identical implementation to preview-pane.tsx and deck-viewer.tsx; inline JS in example HTML executes solely during browser preview, whereas the skill itself executes no scripts.

2Core Capabilities

01Silver/cream canvas + ambient mesh background (including reduced-motion disable handling)
02Double-bezel cards (shell/core dual-layer border-radius + inner highlights)
03Button-in-button CTA
04Spring subtle bounce easing
05Squircle large border-radius system
06Entrance reveal micro-motion

3External Dependencies

KindDependency / Endpoint
networkGoogle Fonts(Plus Jakarta Sans / JetBrains Mono)
networkGoogle Fonts 静态资源域(preconnect)

4Recommended Governance & Evidence

Suggested Controls for Safe Operation
For Agent Runtime
Can be auto-loaded
For Administrators
Register source and version
Evidence & Triggers (File Paths & Excerpts)
  • SKILL.md: Comprises purely prompt instructions and rule text, without script execution or external side effects
Audit Notes: . Evaluation target = this skill directory (next/src/lib/templates/skills/web-proto-soft/), audited file-by-file: zero scripts, zero credential access, zero disk writes; endpoints appearing within the directory are strictly limited to Google Fonts (Plus Jakarta Sans / JetBrains Mono) and Google Fonts static asset domains (preconnect), all residing exclusively within example.html as an "artifact example"; the SKILL.md body only specifies layout, style, and font family names without referencing any runtime external interfaces, qualifying it as a pure directive template = green. Host-side notes (not counted towards rating): the html-anything product shell concatenates the body into prompts via assemblePrompt(), spawns a local agent CLI, injects cdn.tailwindcss.com and Google Fonts requirements (next/src/lib/templates/shared.ts), and uses an iframe with sandbox="allow-scripts allow-same-origin" for previewing (next/src/components/template-picker.tsx).

5Second-Pass Verification

  • [ok] skill 目录文件清单 — find 得 SKILL.md + example.html,无 scripts/references。
  • [ok] 外部端点仅字体 — example.html 仅 fonts.googleapis.com css2 与 fonts.gstatic.com preconnect;无 <script src> 外链;SKILL.md 正文无 URL。
  • [ok] Double-bezel 是否落地 — --shell-radius/--core-radius 变量 + BENTO 注释区块 + .b-card .core 结构(grep 命中 .b-card .core 与 .hero-preview .core)。
  • [discrepancy] Button-in-button 是否在示例中 — SKILL.md 写了「- Button-in-button CTA」,但示例中未找到该结构的类名或嵌套按钮标记(对 example.html grep 无 in-btn/btn-in-btn 类命中),属示例只演示其余三条。
  • [ok] spring 缓动是否真实使用 — --ease-spring 定义于 :root,并在 .hero-preview 等元素上以 transition: transform 360ms var(--ease-spring) 使用。
  • [ok] reduced-motion 处理 — 存在 @media (prefers-reduced-motion: reduce) 关闭 .mesh 动画;同系列的 brutalist/editorial 未见同等处理。
  • [ok] CLI 匹配器路由 — cli/src/skills-matcher.ts 存在 [["苹果", "Apple", "iOS", "soft", "squircle"], "web-proto-soft"] 行。
  • [ok] 判级 green 自证 — 目录零脚本文件(示例内联 reveal 属产物示例)、零凭证、零写盘;正文无运行时接口 → green。

6Verdict & Scenarios

  • "Premium feel" is parameterized: dual-layer border-radii follow calc relationships, and motion uses overshooting beziers, allowing models to reproduce aesthetics via exact values rather than intuition
  • Thoughtful accessibility: mesh animations explicitly respect prefers-reduced-motion
  • High component modularity: BENTO cards, pills, meta items, and other blocks form a cohesive design system in the example, ready for direct reuse
  • Restrained motion: features only hover displacement and a one-time reveal without scroll-driven gimmicks, staying true to its "ambient" focus
  • Best for: Ideal for consumer product landing pages, AI/SaaS tool marketing sites, and brand portals demanding a "smooth, premium" aesthetic; also serves well as a modern reference among the three style prototypes.
    Not for: Not suitable for pages requiring a rugged industrial aesthetic (use brutalist instead), nor for information-dense admin dashboards (double bezels and large border-radii consume valuable screen real estate).
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload web-proto-soft.tar.gz
    sha256: d75a8b1932228559…
    Option B · Copy Guide for Agent
    install.json
    Agents automatically download and verify mirrors from this JSON guide.
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 553ed98c28.