Yiwei Ho 329d83ca43 refactor(core): quieter, more minimal viewer UI (#417)
* refactor(core): quieter, more minimal viewer UI

Strip decoration and tighten hierarchy across the viewer chrome:

- Replace system-view emoji (all slides, draft, themes, assets) with line
  icons via a shared SystemViewIcon; user folders keep their custom
  emoji/color chips.
- Compact the home, themes, and theme-detail page headers from hero-sized
  titles down to a dense header row with icon and folio count.
- Calm selected states: sidebar rows and rail thumbnails drop their accent
  bars and rely on background, weight, and outline instead.
- Remove content zoom on card hovers; keep the shadow/ring lift and press
  feedback only.
- Add a capped stagger entrance (rise-in) to the home and themes grids,
  disabled under reduced motion.
- Simplify empty states to a bare icon and text, and drop the inline
  shortcut chip from the Present button.
- Fix the slide card actions menu never opening: the freeze-motion click
  shield inside thumbnails (z-10) sat above the unlayered actions button,
  swallowing pointerdown; the trigger also cancelled Base UI's open action
  with preventDefault. Raise the button to z-20 and drop preventDefault.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): redesign the sidebar

- Replace the bold wordmark + icon-button cluster with an identity row:
  a small brand mark chip beside the app name.
- Add a full-width command-menu search field under the header with a
  keyboard shortcut hint, replacing the icon-only trigger.
- Move folder creation to a hover-revealed plus button in the Folders
  section header and drop the persistent bottom row; the inline creation
  input is unchanged.
- Move the language and theme toggles into the footer next to the
  version label.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): use the product icon as the sidebar brand mark

Replace the placeholder Play glyph with the open-slide app icon, bundled
at 128px (22KB) and rendered with a hairline ring so its edge reads on
the dark sidebar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): inset shell layout with elevated content cards

Replace the bordered-chrome layout with the inset pattern: separation
comes from background contrast, rounded corners, and hairline rings
instead of structural borders.

- Retone --sidebar to match --canvas so the sidebar, thumbnail rail,
  panels, toolbar, and notes drawer sit on one continuous chrome ground.
- Float the home content area and the slide viewport as rounded
  elevated cards (bg-background + hairline ring + edge shadow) with an
  8px gutter; the dev assets view gets the same treatment.
- Drop the border-r/border-l/border-t/border-b chrome separators on the
  sidebar, rail, panels, viewer toolbar, and notes drawer; the panel
  open/close animation now transitions width only.
- Make the selected sidebar row an elevated pill (background + ring +
  edge shadow) instead of a muted fill.
- Give the editor slide canvas a real floating shadow instead of the
  inset hairline; the white slide now reads against the near-white card.
  Only the editor viewport renders non-flat, so thumbnails, the player,
  and exports keep their clipped edge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): deepen the dark chrome ground for card contrast

Drop the dark-mode ground from L 0.125 to 0.1 so the elevated content
cards read clearly against the sidebar and rails.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): lift dark content surfaces off the chrome ground

Raising --background to L 0.175 (vs the 0.1 ground) makes the inset
cards read clearly even on dim displays, where both prior tones crushed
to near-black.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(core): update sidebar toolbar e2e for the redesigned chrome

The command-menu trigger is now a labelled search field with no tooltip,
so assert its visible label instead of a hover tooltip; language and
theme toggles keep their tooltip checks in the footer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): address review feedback

- Use SystemViewIcon for every system view in the home command menu so
  the assets entry matches the sidebar's FolderOpen icon and all four
  share the same size and stroke.
- Cap the grid stagger at twelve items (Math.min(i, 11)).
- Remove the notes drawer's remaining inner divider.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: consolidate the branch changesets into one

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): align the sidebar search field with the nav rows

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(core): space sidebar rows so states don't touch

A 2px gap between rows keeps adjacent hover and selected backgrounds
from fusing into one block.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:33:28 +08:00
2026-04-24 23:07:37 +08:00
2026-05-18 16:36:05 +08:00

open-slide github cover

Vercel OSS Program

open-slide

GitHub stars GitHub forks License: MIT

The slide framework built for agents. Describe your deck in natural language — your coding agent writes the React. open-slide handles the canvas, scaling, navigation, hot reload, and present mode so the agent can focus on content.

Every slide renders into a fixed 1920 × 1080 canvas. Pages are arbitrary React components, not a constrained DSL.

npx @open-slide/cli init my-slide

Why open-slide

Slides are visual code. Agents are great at writing code. open-slide is the missing runtime that turns "make slides about X" into a polished, presentable deck — without you ever leaving the chat.

Highlights

🤖 Agent-native authoring

Works with any coding agent (Claude Code, Codex, Cursor, …). The scaffolder ships with built-in skills:

  • /create-slide — drafts a deck end-to-end. Asks four scoping questions (topic & aesthetic, page count, text density, motion vs. static), picks an id, plans the structure, and writes the pages.
  • /slide-authoring — the technical reference for the 1920 × 1080 canvas, type scale, palette, and layout rules. The agent reads this before writing.

From a one-line prompt to a polished deck, no boilerplate.

🎯 In-browser inspector

Click any element in the dev server and attach a comment — "make this red", "change to 'Open Slide Rocks'", "shrink the headline". Comments are persisted as @slide-comment markers in source. Run /apply-comments and the agent applies every pending edit, then clears the markers.

The loop: present → click to comment → /apply-comments → repeat.

Manage images, videos, and fonts per deck through a built-in assets panel. Search and drop in any brand logo via the integrated svgl catalogue — no more hunting for SVGs.

🎬 Professional present mode

Fullscreen playback with keyboard navigation, plus a presenter mode with current/next slide preview, speaker notes, and a timer. Built for the stage, not just the browser tab.

📦 Export to static HTML & PDF

One command exports your deck as a self-contained static HTML site or a print-ready PDF. Share without a server.

📁 Slide manager

Organise decks into folders with custom emoji and drag-and-drop to reorder. Useful once you've built more than three decks and need to find anything.

🚀 Deploy-friendly

Outputs a plain static build — one-click deploy to Vercel, Cloudflare Pages, Zeabur, Netlify, or any static host. No server, no runtime, no lock-in.

Get started

npx @open-slide/cli init my-slide
cd my-slide
pnpm dev

The scaffolded workspace ships with agent skills preconfigured for Claude Code. From there you drive the deck through your agent — or edit slides/<id>/index.tsx directly. See CLAUDE.md for the hard rules.

Repo layout

This repo is a pnpm + Turbo monorepo.

Path Description
packages/core @open-slide/core — runtime (home page, slide viewer, present mode, inspector), Vite plugin, and the open-slide dev/build/preview CLI.
packages/cli @open-slide/clinpx @open-slide/cli init scaffolder. Generates a minimal workspace where Vite/React/tsconfig stay hidden inside core.
apps/demo Example workspace that consumes @open-slide/core via workspace:*. Used for local development of the framework.

Development

pnpm install
pnpm dev      # runs the demo against the local @open-slide/core
pnpm build    # builds all packages
pnpm check    # type-checks all packages
pnpm lint     # lints via biome

Support

If open-slide has been useful to you, consider supporting development:

ko-fi

License

MIT © Yiwei Ho

S
Description
面向 AI Agent 的幻灯片框架,基于 React,支持通过自然语言对话一键生成专业 PPT 演示文稿。5614 stars,有官网 open-slide.dev。|GitHub 镜像 6.9k · 🍴 494
https://github.com/1weiho/open-slide Readme MIT 6.2 MiB
Languages
TypeScript 96%
MDX 2.5%
CSS 1.2%
JavaScript 0.2%