Content Widgets
以内容区块形式提供的文章小组件:提示框、手风琴、标签页、步骤、产品框、嵌入、代码、卡片、引用、目录和最新文章。
插件
Content Widgets
以内容区块形式提供的文章小组件:提示框、手风琴、标签页、步骤、产品框、嵌入、代码、卡片、引用、目录和最新文章。
描述
Content Widgets
在线演示: emdashhq.com/blog/widget-gallery — 全部十九个小组件在同一篇文章中渲染。
为 EmDash 站点提供的一组文章小组件:提示框、手风琴、标签页、清单、按钮、YouTube 和 iframe 嵌入、产品/评测框、引用语、事实表、自动目录、系列导航,以及实时的“最新文章”列表。
每个小组件都是一个 blocks 字段的区块类型,因此编辑可以把它们放进任何基于区块的字段——页面内容、博客文章正文、落地页——只要你的结构允许。
包含内容
十九种区块类型,全部以 widget_ 为前缀:Prose、Notice、Accordion、Tabs、Checklist、Steps、Button、YouTube、Embed、Image、Code、Product box、Link cards、Pull quote、Facts table、Table of contents、Series nav、Latest posts 和 Divider。
工作原理
沙盒插件无法提供 Astro 渲染组件,因此这些小组件以区块类型 JSON + 现成的 Astro 组件的形式,分发在软件包的 site/ 目录中。你只需把它们复制到站点中一次;插件通过组件在进程内调用的两个公开路由,提供共享的运行时行为(YouTube 的隐私模式、联盟披露文字、文章查询)——没有 HTTP 往返。
插件还添加了一个记录每个区块字段的 Widget catalog 管理页面,以及一个包含确切安装步骤和设置状态的 Setup guide 页面。
安装
安装
1. 安装插件
从 EmDash 插件注册表安装 @bitdoze.com/emdashhq-widgets,或将其作为文件依赖链接,并在 astro.config.mjs 的 sandboxed: 下注册:
import widgetsPlugin from "emdashhq-widgets";
emdash();
插件会请求 content:read 和 schema:read——请批准它们,这样 Latest posts 小组件和 posts 路由才能工作。静态小组件无需它们即可渲染。
2. 把区块类型添加到你的结构中
把 site/block-types/*.json 复制到你的 seed 文件的 blockTypes 数组中(或在运行中的站点上,把每个文件的内容 POST 到 /_emdash/api/schema/block-types),然后在应该接受它们的 blocks 字段的 allowedTypes 中列出这些类型——例如 pages.content 或 posts.body。
3. 注册渲染器
把 site/components/*.astro、site/components/config.ts、site/components/icons.ts、site/widget-components.ts 和 site/WidgetBlocks.astro 复制到你的项目中,然后要么为仅用于小组件的字段渲染 WidgetBlocks:
要么把 widgetComponents 展开到你现有的映射中:
const blockComponents = defineBlockComponents();
4. 配置
设置位于 Plugins → Content Widgets → Settings:
- Privacy-enhanced YouTube embeds — 从
youtube-nocookie.com提供播放器(默认开启)。 - Affiliate disclosure — Product box 小组件内的小字说明行;留空则隐藏。
- Posts collection — Latest posts 小组件和
posts路由的默认集合。
常见问题
常见问题
为什么我必须复制文件,而不是由插件来完成?
沙盒插件运行在隔离的运行时中,无法注册 Astro 渲染组件。site/ 目录提供了插件作者自己使用的同样的区块类型 JSON 和组件,因此安装就是向你的仓库一次性复制——之后这些小组件就和你自己的任何区块类型一样工作。
不安装插件,这些小组件能工作吗? 静态的可以——Prose、Notice、Accordion、Tabs、Checklist、Button、Embed、Quote、Facts、TOC 和 Series 只需要区块类型和组件。YouTube、Product box 和 Latest posts 会读取插件设置或路由;没有插件时,它们会退回到默认值(无 Cookie 开启、无披露文字、空列表)。
YouTube 小组件会设置 Cookie 吗?
在访客点击封面之前,不会加载任何播放器。使用默认的隐私设置时,播放器来自 youtube-nocookie.com,即使那时也不会设置跟踪 Cookie。
Latest posts 如何构建它的列表?
该组件在进程内调用插件的公开 posts 路由(没有 HTTP 请求)。该路由按从新到旧列出已配置集合中已发布的条目,并根据集合的 urlPattern 解析每个条目的公开 URL。
我能重新设计这些小组件的样式吗?
可以——每个组件都使用 wgt-* 类,并读取你的设计令牌(--color-brand、--color-surface 等),同时带有中性的回退值。覆盖这些类或令牌,即可匹配你的主题。
这些小组件也能在普通页面内使用吗?
可以。把 widget_* 类型添加到任何 blocks 字段的 allowedTypes 中——页面、文章或其他任何内容。
更新日志
更新日志
1.0.4
- 无 JavaScript 的标签页:标签会降级为页内锚点,每个面板都保持可见。启用 JS 后,它们会升级为真正的标签页,支持方向键、Home/End 和漫游式 tabindex。
- 文档:画廊演示链接带有 UTM 参数。
1.0.3
- Product box:修复了没有图片时的布局把内容挤进窄列的问题;现在只有设置了图片时才会渲染媒体列
- Product box 重新设计样式:等宽字体的披露行、价格标签、优缺点的对勾/叉号标记,以及与站点按钮一致的按钮样式
- 站点图标集新增了用于缺点列的
x图标
1.0.2
- 文档:描述中链接到在线的小组件画廊演示文章
1.0.1
- 注册表列表素材:插件图标、横幅和截图
- 文档修正:描述和更新日志中的 19 个区块列表
1.0.0
- 首次发布:19 种
widget_*区块类型(prose、notice、accordion、tabs、checklist、steps、button、YouTube、embed、image、code、product、link cards、quote、facts、table of contents、series nav、latest posts、divider) site/下的区块类型 JSON 和自包含的 Astro 组件- 用于共享设置(YouTube 隐私模式、联盟披露、文章集合)的公开
config路由 - 列出最新已发布条目及其解析后 URL 的公开
posts路由 - Block Kit 管理页面:小组件目录和设置指南