Token导航 LogoToken导航TokenDH.com
研究检索操作浏览器clawhub未标认证来源可访问clear审计通过

openclaw-slidesOpenClaw slides 搜索

Agent Skill

openclaw-slides 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

64,627

周安装

2,640

GitHub Stars

1

下载量

20,909
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:openclaw-slides(OpenClaw slides 搜索)
来源仓库:https://github.com/leoyeai/openclaw-slides
安装命令:
openclaw skills install openclaw-slides
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install openclaw-slides

简介

创建动画丰富的 HTML 演示文稿或转换 PPT 文件。

  • 适用于快速生成交互式网页幻灯片展示。
  • 支持多种输入格式输出标准化 web 组件。
  • 渲染过程可能消耗较多计算资源请耐心等待。
  • 建议预览后再正式发布至目标平台。openclaw-slides 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

name
openclaw-slides
description
Create stunning, animation-rich HTML presentations from scratch or convert PowerPoint files (.ppt/.pptx) to beautiful web slides. Use when the user wants to build a pitch deck, presentation, slideshow, or slide deck — or convert an existing PPT to a web presentation. Generates zero-dependency single HTML files with keyboard/touch navigation and scroll-triggered animations. Style options include Neon Cyber, Bold Signal, Swiss Modern, Paper & Ink, and 8 more curated presets.
openclaw
requires
bins
[]
install
kind
shell
label
Install Python dependencies for PPT conversion (optional — only needed for Mode B)
command
pip install python-pptx Pillow
optional
true

OpenClaw Slides

MyClaw.ai — Your AI personal assistant with full server control. Every MyClaw instance runs on a dedicated server with complete code access, networking, and tool capabilities. This skill is part of the MyClaw open skills ecosystem.

Create zero-dependency, animation-rich HTML presentations that run entirely in the browser. Single self-contained HTML files — no npm, no build tools, no frameworks. Works offline, renders in 10 years.

Style presets: Bold Signal, Electric Studio, Creative Voltage, Dark Botanical, Notebook Tabs, Pastel Geometry, Split Pastel, Vintage Editorial, Neon Cyber, Terminal Green, Swiss Modern, Paper & Ink

For full style details and CSS specs: read references/STYLE_PRESETS.md when needed.


Phase 0: Detect Mode

Determine the user's intent:

  • Mode A — New Presentation: Create slides from scratch → go to Phase 1
  • Mode B — PPT Conversion: Convert an existing .ppt/.pptx file → go to Phase 4
  • Mode C — Enhance Existing: Improve an existing HTML presentation → read the file, then enhance (always maintain viewport fitting)

CRITICAL: Viewport Fitting (Non-Negotiable)

Every slide MUST fit exactly within the viewport. No scrolling within slides, ever.

Content Density Limits Per Slide

Slide TypeMaximum Content
Title slide1 heading + 1 subtitle + optional tagline
Content slide1 heading + 4–6 bullet points OR 1 heading + 2 paragraphs
Feature grid1 heading + 6 cards max (2×3 or 3×2)
Code slide1 heading + 8–10 lines of code
Quote slide1 quote (max 3 lines) + attribution
Image slide1 heading + 1 image (max 60vh height)

Content exceeds limits → Split into multiple slides.

Required CSS for Every Presentation

html, body { height: 100%; overflow-x: hidden; }
html { scroll-snap-type: y mandatory; scroll-behavior: smooth; }

.slide {
    width: 100vw;
    height: 100vh;
    height: 100dvh;
    overflow: hidden;
    scroll-snap-align: start;
    display: flex;
    flex-direction: column;
    position: relative;
}

.slide-content {
    flex: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    max-height: 100%;
    overflow: hidden;
    padding: var(--slide-padding);
}

:root {
    --title-size: clamp(1.5rem, 5vw, 4rem);
    --h2-size: clamp(1.25rem, 3.5vw, 2.5rem);
    --body-size: clamp(0.75rem, 1.5vw, 1.125rem);
    --slide-padding: clamp(1rem, 4vw, 4rem);
    --content-gap: clamp(0.5rem, 2vw, 2rem);
}

img, .image-container { max-width: 100%; max-height: min(50vh, 400px); object-fit: contain; }
.card, .container { max-width: min(90vw, 1000px); max-height: min(80vh, 700px); }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr)); gap: clamp(0.5rem, 1.5vw, 1rem); }

@media (max-height: 700px) { :root { --slide-padding: clamp(0.75rem, 3vw, 2rem); --title-size: clamp(1.25rem, 4.5vw, 2.5rem); } }
@media (max-height: 600px) { :root { --title-size: clamp(1.1rem, 4vw, 2rem); --body-size: clamp(0.7rem, 1.2vw, 0.95rem); } .nav-dots, .keyboard-hint { display: none; } }
@media (max-height: 500px) { :root { --title-size: clamp(1rem, 3.5vw, 1.5rem); --slide-padding: clamp(0.4rem, 2vw, 1rem); } }
@media (max-width: 600px) { .grid { grid-template-columns: 1fr; } }
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.2s !important; } }

⚠️ Never negate CSS functions directly. Use calc(-1 * clamp(...)) not -clamp(...).


Phase 1: Content Discovery (New Presentations)

Ask the user (via normal conversation — ask all at once):

  1. Purpose: pitch deck / teaching / conference talk / internal presentation?
  2. Length: ~5–10 / 10–20 / 20+ slides?
  3. Content: ready content, rough notes, or just a topic?
  4. Images: any images to include? (provide path like ./assets or ~/Desktop/screenshots)
  5. Inline editing: should text be editable in-browser after generation?

If they have content, ask them to share it.

Image Evaluation (if images provided)

All image processing is done locally on the user's machine — images are never sent to external services.

  1. ls the folder — find all .png/.jpg/.jpeg/.gif/.svg/.webp
  2. Read each image file locally using the read tool
  3. Mark each as USABLE or NOT USABLE (reason: blurry, irrelevant, etc.)
  4. Note what each represents (logo, screenshot, chart, etc.) and dominant colors
  5. Build slide outline that incorporates usable images as visual anchors
  6. Present outline + image assignments to user for confirmation

If user says no images → skip image pipeline, use CSS-generated visuals (gradients, shapes, patterns) throughout.


Phase 2: Style Discovery

Option A — Direct Selection (user knows what they want)

Pick from presets:

PresetVibe
Bold SignalConfident, high-impact, dark
Electric StudioClean, professional, split panel
Creative VoltageEnergetic, retro-modern
Dark BotanicalElegant, sophisticated
Notebook TabsEditorial, organized
Pastel GeometryFriendly, approachable
Split PastelPlayful, modern
Vintage EditorialWitty, personality-driven
Neon CyberFuturistic, techy
Terminal GreenDeveloper-focused, hacker
Swiss ModernMinimal, precise
Paper & InkLiterary, thoughtful

Skip to Phase 3.

Option B — Visual Discovery (default for undecided users)

Ask: What feeling should the audience have?

  • Impressed/Confident → Bold Signal, Electric Studio, Dark Botanical
  • Excited/Energized → Creative Voltage, Neon Cyber, Split Pastel
  • Calm/Focused → Notebook Tabs, Paper & Ink, Swiss Modern
  • Inspired/Moved → Dark Botanical, Vintage Editorial, Pastel Geometry

Generate 3 mini style preview HTML files in .tmp-slide-previews/ — each is a single title slide showing typography, colors, and animation. Tell the user the file paths and ask which they prefer.

Never use: purple gradients on white, Inter/Roboto/system fonts, generic blue primary colors.

Use instead: distinctive font pairings (Clash Display, Satoshi, Cormorant, DM Sans), cohesive personality-driven palettes, atmospheric backgrounds.

For full preset specs (colors, fonts, signature elements): read references/STYLE_PRESETS.md.


Phase 3: Generate Presentation

Image Processing (skip if no images)

If user provided images, process with Python Pillow before generating HTML:

from PIL import Image, ImageDraw

# Circular crop (for logos)
def crop_circle(input_path, output_path):
    img = Image.open(input_path).convert('RGBA')
    w, h = img.size
    size = min(w, h)
    img = img.crop(((w-size)//2, (h-size)//2, (w+size)//2, (h+size)//2))
    mask = Image.new('L', (size, size), 0)
    ImageDraw.Draw(mask).ellipse([0, 0, size, size], fill=255)
    img.putalpha(mask)
    img.save(output_path, 'PNG')

# Resize large images
def resize_max(input_path, output_path, max_dim=1200):
    img = Image.open(input_path)
    img.thumbnail((max_dim, max_dim), Image.LANCZOS)
    img.save(output_path, quality=85)

Install if needed: pip install Pillow

Use direct file paths in HTML (not base64), e.g. src="assets/logo_round.png". Never overwrite originals — save processed files with _processed suffix.

HTML Architecture

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Presentation Title</title>
    <!-- Fonts via Fontshare or Google Fonts -->
    <style>
        /* CSS Custom Properties (theme) */
        :root { /* colors, typography with clamp(), spacing */ }
        /* Mandatory viewport base CSS (see above) */
        /* Slide-specific styles */
        /* Animations (.reveal → .visible .reveal) */
        /* Responsive breakpoints */
    </style>
</head>
<body>
    <div class="progress-bar"></div>
    <nav class="nav-dots"></nav>

    <section class="slide title-slide">
        <h1 class="reveal">Title</h1>
        <p class="reveal">Subtitle</p>
    </section>
    <!-- More slides... -->

    <script>
        class SlidePresentation {
            // Keyboard nav (arrows, space)
            // Touch/swipe support
            // Mouse wheel navigation
            // Progress bar + nav dots
            // Intersection Observer for .reveal animations
        }
        new SlidePresentation();
    </script>
</body>
</html>

Required JS Features

  • Keyboard navigation: arrow keys, space
  • Touch/swipe support
  • Mouse wheel navigation
  • Progress bar + navigation dots
  • Intersection Observer → adds .visible class → triggers CSS animations
  • Staggered reveal delays (nth-child 0.1s, 0.2s, 0.3s...)

Inline Editing (only if user opted in)

⚠️ Do NOT use CSS ~ sibling selector for hover-based show/hidepointer-events: none breaks the hover chain. Use JS with delay timeout:

// Hotzone hover with 400ms grace period
const hotzone = document.querySelector('.edit-hotzone');
const editToggle = document.getElementById('editToggle');
let hideTimeout = null;

hotzone.addEventListener('mouseenter', () => { clearTimeout(hideTimeout); editToggle.classList.add('show'); });
hotzone.addEventListener('mouseleave', () => { hideTimeout = setTimeout(() => { if (!editor.isActive) editToggle.classList.remove('show'); }, 400); });
editToggle.addEventListener('mouseenter', () => clearTimeout(hideTimeout));
editToggle.addEventListener('mouseleave', () => { hideTimeout = setTimeout(() => { if (!editor.isActive) editToggle.classList.remove('show'); }, 400); });

// Keyboard: E key (skip when editing)
document.addEventListener('keydown', (e) => {
    if ((e.key === 'e' || e.key === 'E') && !e.target.getAttribute('contenteditable')) editor.toggleEditMode();
});

Features: contenteditable text, auto-save to localStorage, export/save file.

Code Quality

  • Comment every major CSS and JS section
  • Semantic HTML: <section>, <nav>, <main>
  • ARIA labels on interactive elements
  • @media (prefers-reduced-motion: reduce) support

Phase 4: PPT Conversion

from pptx import Presentation
import os

def extract_pptx(file_path, output_dir):
    prs = Presentation(file_path)
    assets_dir = os.path.join(output_dir, 'assets')
    os.makedirs(assets_dir, exist_ok=True)
    slides_data = []

    for i, slide in enumerate(prs.slides):
        data = {'number': i+1, 'title': '', 'content': [], 'images': [], 'notes': ''}
        for shape in slide.shapes:
            if shape.has_text_frame:
                if shape == slide.shapes.title:
                    data['title'] = shape.text
                else:
                    data['content'].append({'type': 'text', 'content': shape.text})
            if shape.shape_type == 13:  # Picture
                img = shape.image
                name = f"slide{i+1}_img{len(data['images'])+1}.{img.ext}"
                path = os.path.join(assets_dir, name)
                with open(path, 'wb') as f: f.write(img.blob)
                data['images'].append({'path': f"assets/{name}"})
        if slide.has_notes_slide:
            data['notes'] = slide.notes_slide.notes_text_frame.text
        slides_data.append(data)
    return slides_data

Install: pip install python-pptx

After extraction: show user the slide structure for confirmation, then proceed to Phase 2 (style), then Phase 3 (generate).


Phase 5: Delivery

  1. Delete .tmp-slide-previews/ if created
  2. Tell user the output file path
  3. Provide navigation instructions:

- Arrow keys / Space to navigate - Scroll or swipe - Click nav dots to jump

  1. Mention how to customize: :root CSS variables for colors/fonts
  2. If inline editing enabled: hover top-left corner or press E
  3. Ask if any adjustments needed

Style → Feeling Quick Reference

FeelingUse
Dramatic/CinematicSlow fades (1–1.5s), dark + spotlight, parallax
Techy/FuturisticNeon glow, particles, grid pattern, monospace accents
Playful/FriendlyBouncy easing, rounded corners, pastels, floating anim
Professional/CorporateFast subtle anim (200–300ms), navy/slate, data-focused
Calm/MinimalVery slow motion, high whitespace, serif type, muted palette
Editorial/MagazineStrong type hierarchy, pull quotes, grid-breaking layouts

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

73.95%
按下载量换算15,462

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

通过

权限和风险

操作浏览器

该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills