@placeholderco/placeholder-ui

中文文档
3.2.3发布于 2026/11/02MITTypeScriptES Module构建来源已验证

一个现代的、可定制的Svelte 5 UI组件库,具有全面的主题支持。用单个配置对象重新命名它。

中文使用文档
文档目录13 节
  1. 安装
  2. 快速启动
  3. 品牌
  4. 1. 配置对象(推荐)
  5. 明暗值
  6. 2. 纯CSS
  7. 色的角色
  8. 字体
  9. 标志
  10. 变体
  11. 主题(浅色/深色)
  12. 开发
  13. 许可证

PlaceholderUI

使用单个配置对象重新命名的Svelte 5组件库。 表单、覆盖、布局、数据显示、TipTap富文本编辑器和 CodeMirror代码编辑器,所有样式都通过一组 --ui-* CSS的令牌。

  • 在每个组件上添加5个runes、TypeScript和类型化的道具
  • 带有持续性的浅色/深色/系统主题
  • 中性默认调色板;在一个电话中交换您自己的颜色,字体和徽标
  • 150+图标导出为原始SVG字符串

安装

pnpm add @placeholderco/placeholder-ui

同行的依赖: svelte ^5.

快速启动

把你的应用包裹起来 AppShell (它加载基本样式表),然后使用组件:

<script lang="ts">
    import { AppShell, Navbar, Button } from '@placeholderco/placeholder-ui';
</script>

<AppShell>
    <Navbar appNav={{ href: '/', text: 'My App' }} />
    <Button variant="primary">Save</Button>
</AppShell>

或跳过 AppShell 然后自己导入标记样式表:

import '@placeholderco/placeholder-ui/app.css';

品牌

所有与颜色和字体相关的内容都解析为 --ui-* 自定义属性 有两种方法可以给图书馆打上品牌。

// src/routes/+layout.svelte (or any startup code)
import { applyTheme } from '@placeholderco/placeholder-ui';
import logo from '$lib/logo.svg?raw';

applyTheme({
    colors: {
        primary: '#1e3a5f', // dark brand colour: solid buttons, headings
        accent: '#93c5fd', // light brand colour: highlights, dark-mode accent
        tertiary: '#a5f3fc' // supporting color: links use its readable text color
    },
    fontFamily: "'Inter', system-ui, sans-serif",
    logo // raw SVG, rendered by <Logo />
});

每个品牌的颜色都有独立的 *HoverColor 和 *PressedColor 设置: primaryHoverColor, accentHoverColor, tertiaryHoverColor, primaryPressedColor, accentPressedColor 和 tertiaryPressedColor. 它们由坚实、轮廓和微妙的控制共享;微妙的变体使用 半透明的悬停填充在适当的地方。

这三种颜色都有两个相同的文本角色:

设置用于
primaryTextColor, accentTextColor, tertiaryTextColor在页面/纸张表面的彩色文本和轮廓边界。
primaryContrastColor, accentContrastColor, tertiaryContrastColor文字和图标上的匹配实体填充,包括悬停和按下填充。

例如, primaryTextColor 样式化静止时的主要轮廓按钮,而 primaryContrastColor 为填充的主按钮上的标签设置样式。 focusColor, link 和 linkHover 控制键盘焦点环和链接 独立。更改悬停颜色不会更改其他角色。

所有角色覆盖都是可选的。默认情况下,主悬停使用重音文本 颜色,重音悬停使用三级悬停,三级悬停使用重音。主要按 从它的底色变暗。Primary文本默认为Primary;口音和 三级文本颜色比它们的基色变暗。重音和三级 按下的颜色由三级调亮(或省略三级调时的重音)。 主对比度默认为白色;重音和三级对比度默认为主要对比度。

对于现有配置,请替换 primaryDark 与 primaryPressedColor, accentDark 与 accentTextColor, tertiaryDark 与 tertiaryTextColor. 取代 tertiaryLight 与 accentPressedColor 和 tertiaryPressedColor 来保持两组受压状态。分别设置悬停的颜色 定制的交互。重命名 primaryContrast 和 accentContrast 来 primaryContrastColor 和 accentContrastColor. 它们的CSS令牌也获得 -color 后缀。CSS重写使用相应的串大小写名称, 如 --ui-primary-hover-color 和 --ui-tertiary-text-color.

明暗值

配置中的所有内容都是亮模式值,也适用于暗模式。 当暗模式处于活动状态时,添加一个 dark 用相同的块 形状。只有你的名字被覆盖;色度是根据每种颜色得出的。

applyTheme({
    colors: { primary: '#1e293b', accent: '#fbbf24', tertiary: '#7dd3fc' },
    logo,
    dark: {
        colors: { accent: '#fde68a', link: '#fde68a' },
        fontFamily: "'Inter', system-ui, sans-serif", // optional
        logo: darkLogo // optional
    }
});

applyTheme 注入一个 <style> 元素 :root 规则和a :root.dark 规则,因此值与现有值切换 .dark 类。

为了避免默认调色板在第一次绘制时闪烁,请呈现相同的配置 作为服务器端的CSS:

import { themeToCss } from '@placeholderco/placeholder-ui';
const css = themeToCss(myTheme); // ":root { ... }\n:root.dark { ... }"

然后把它放在 <style> 标签 app.html 或者你的根布局头。

2. 纯CSS

覆盖在库之后加载的任何样式表中的标记:

:root {
    --ui-primary-rgb: 30 58 95;
    --ui-primary-rgbc: 30, 58, 95;
    --ui-primary: rgb(var(--ui-primary-rgb));
    --ui-primary-hover-color: #1d4ed8;
    --ui-primary-pressed-color: #12253d;
    --ui-primary-text-color: #1e3a5f;
    --ui-primary-contrast-color: #ffffff;
    --ui-accent-rgb: 147 197 253;
    --ui-accent-rgbc: 147, 197, 253;
    --ui-accent: rgb(var(--ui-accent-rgb));
    --ui-accent-hover-color: #a5f3fc;
    --ui-accent-pressed-color: #cffafe;
    --ui-accent-text-color: #1d4ed8;
    --ui-accent-contrast-color: #1e3a5f;
    --ui-tertiary: #a5f3fc;
    --ui-tertiary-hover-color: #93c5fd;
    --ui-tertiary-pressed-color: #cffafe;
    --ui-tertiary-text-color: #0e7490;
    --ui-tertiary-contrast-color: #1e3a5f;
    --ui-focus-color: #1d4ed8;
    --ui-font-family: 'Inter', system-ui, sans-serif;
}

完整的令牌列表以及对每个角色的注释位于顶部 src / lib / app.css.

色的角色

在选择颜色时保持这些关系,因为成分会假设它们:

令牌角色
--ui-primary默认为暗。实心按钮和活动背景。
--ui-accent光。悬停,高亮,重音在黑暗模式。
--ui-tertiary光。支持填充;它的文本颜色用于链接

字体

库从不捆绑一个字体。集 --ui-font-family (或 fontFamily 在 配置)并自己加载字体 @font-face 或者一个 <link>.

<Logo /> 渲染,按优先顺序:它 svg 道具、商标注册 通过 applyTheme({ logo }) / setLogo(),或通用占位符。使用 fill="currentColor" 在您的SVG中,使其遵循主题,或注册一个单独的 深色图案logo dark.logo / setLogo(light, dark).

变体

按钮,徽章,动作图标,下拉菜单,手风琴和进度条共享颜色 以令牌命名的变体: primary, accent, tertiary,再加上 -outline 和 -subtle 形式和中性词 secondary, white, danger 和 auto-* 变体。

使用额外的彩色按钮 tertiary, tertiary-outline 和 tertiary-subtle,通过配置 colors.tertiary 和现有的 --ui-tertiary* 令牌。这个 secondary, secondary-subtle 和 secondary-selected 变体保留其原有的中性风格;现有的 应用程序不需要重命名它们。现有的三级颜色和按钮样式 都被保留了下来,为家庭增加了轮廓支持。

主题(浅色/深色)

import { themeState, setTheme } from '@placeholderco/placeholder-ui';

setTheme('dark'); // 'light' | 'dark' | 'system'
themeState.isDarkMode; // reactive boolean

这个 .light / .dark 类应用于 <html>. 在您自己的组件中使用 :global(.dark) .my-class { ... } 或者表面符号(--page-bg, --paper-body-bg, --text-color, --border-color,……)。

开发

pnpm install
pnpm run dev      # showcase app at http://localhost:5173
pnpm run check    # svelte-check
pnpm run build    # library + showcase
pnpm run format

src/lib 是出版图书馆; src/routes 是橱窗。每一个 组件下有一个演示页面 src/routes/components/<name>.

许可证

麻省理工学院

版本与发布记录

@placeholderco/placeholder-ui 共发布 52 个版本,首次发布于 2026/02/07;过去 12 个月发布了 52 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.2.3latest2026/11/021 天前
3.2.22026/11/021 天前
3.2.12026/11/021 天前
3.2.02026/11/021 天前
3.1.32026/10/304 天前
3.1.22026/10/304 天前

关于 @placeholderco/placeholder-ui 的常见问题

@placeholderco/placeholder-ui 是什么?

一个现代的、可定制的Svelte 5 UI组件库,具有全面的主题支持。用单个配置对象重新命名它。

如何安装 @placeholderco/placeholder-ui?

在项目目录运行 npm install @placeholderco/placeholder-ui,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:svelte(^5.0.0)、@sveltejs/kit(^2.26.0 || ^3.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@placeholderco/placeholder-ui 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@placeholderco/placeholder-ui 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@placeholderco/placeholder-ui 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@placeholderco/placeholder-ui 可以商用吗?

@placeholderco/placeholder-ui 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@placeholderco/placeholder-ui 还在维护吗?

最新版本 3.2.3 发布于 2026/11/02(1 天前);至今共发布 52 个版本,其中过去 12 个月发布了 52 个;首次发布于 2026/02/07。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。