duskmoon-elements
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDuskMoon Elements
DuskMoon Elements
43 custom element packages built on . Each element is a standard Web Component with Shadow DOM.
@duskmoon-dev/el-base基于构建的43个自定义元素包。每个元素都是带有Shadow DOM的标准Web Component。
@duskmoon-dev/el-baseInstallation
安装
bash
undefinedbash
undefinedIndividual element
单独安装元素
bun add @duskmoon-dev/el-button
bun add @duskmoon-dev/el-button
All elements at once
一次性安装所有元素
bun add @duskmoon-dev/elements
undefinedbun add @duskmoon-dev/elements
undefinedRegistration
注册
typescript
// Option 1: Explicit (tree-shakable)
import { register } from '@duskmoon-dev/el-button';
register();
// Option 2: Side-effect auto-register
import '@duskmoon-dev/el-button/register';
// Option 3: Register all elements
import { registerAll } from '@duskmoon-dev/elements';
registerAll();typescript
// 方式1:显式注册(支持摇树优化)
import { register } from '@duskmoon-dev/el-button';
register();
// 方式2:副作用自动注册
import '@duskmoon-dev/el-button/register';
// 方式3:注册所有元素
import { registerAll } from '@duskmoon-dev/elements';
registerAll();Usage in HTML
HTML中的使用
html
<el-dm-button variant="filled" color="primary" size="md">
Click me
</el-dm-button>
<el-dm-dialog id="my-dialog">
<span slot="header">Title</span>
Dialog content here.
<div slot="footer">
<el-dm-button onclick="this.closest('el-dm-dialog').hide()">Close</el-dm-button>
</div>
</el-dm-dialog>html
<el-dm-button variant="filled" color="primary" size="md">
点击我
</el-dm-button>
<el-dm-dialog id="my-dialog">
<span slot="header">标题</span>
对话框内容在此。
<div slot="footer">
<el-dm-button onclick="this.closest('el-dm-dialog').hide()">关闭</el-dm-button>
</div>
</el-dm-dialog>Properties & Attributes
属性与特性
Set via HTML attributes (kebab-case) or JS properties (camelCase). Properties with sync both directions.
reflect: truehtml
<!-- HTML attributes -->
<el-dm-button variant="outlined" disabled>Save</el-dm-button>
<!-- JS properties -->
<script>
const btn = document.querySelector('el-dm-button');
btn.variant = 'outlined';
btn.disabled = true;
</script>Common properties across elements:
| Property | Type | Description |
|---|---|---|
| String | Visual variant ( |
| String | Color theme ( |
| String | Size ( |
| Boolean | Disable interaction |
Complex data (arrays, objects) must be set via JS — use :
attribute: falsejavascript
const table = document.querySelector('el-dm-table');
table.columns = [{ field: 'name', header: 'Name' }];
table.data = [{ name: 'Alice' }, { name: 'Bob' }];可通过HTML特性(短横线命名)或JS属性(驼峰命名)设置。带有的属性会双向同步。
reflect: truehtml
<!-- HTML特性 -->
<el-dm-button variant="outlined" disabled>保存</el-dm-button>
<!-- JS属性 -->
<script>
const btn = document.querySelector('el-dm-button');
btn.variant = 'outlined';
btn.disabled = true;
</script>元素通用属性:
| 属性 | 类型 | 描述 |
|---|---|---|
| 字符串 | 视觉变体( |
| 字符串 | 颜色主题( |
| 字符串 | 尺寸( |
| 布尔值 | 禁用交互 |
复杂数据(数组、对象)必须通过JS设置——使用:
attribute: falsejavascript
const table = document.querySelector('el-dm-table');
table.columns = [{ field: 'name', header: 'Name' }];
table.data = [{ name: 'Alice' }, { name: 'Bob' }];Events
事件
Listen with . Events bubble and are composed (cross shadow DOM).
addEventListenerjavascript
const table = document.querySelector('el-dm-table');
table.addEventListener('sort', (e) => {
console.log(e.detail); // { column: 'name', direction: 'asc' }
});
table.addEventListener('row-click', (e) => {
console.log(e.detail); // { row: {...}, rowIndex: 0 }
});Common events:
| Element | Event | Detail |
|---|---|---|
| dialog | | — |
| table | | |
| table | | |
| table | | |
| pagination | | |
| tabs | | |
| input | | |
使用监听事件。事件会冒泡且可穿透Shadow DOM。
addEventListenerjavascript
const table = document.querySelector('el-dm-table');
table.addEventListener('sort', (e) => {
console.log(e.detail); // { column: 'name', direction: 'asc' }
});
table.addEventListener('row-click', (e) => {
console.log(e.detail); // { row: {...}, rowIndex: 0 }
});通用事件:
| 元素 | 事件 | 详情 |
|---|---|---|
| dialog | | — |
| table | | |
| table | | |
| table | | |
| pagination | | |
| tabs | | |
| input | | |
Slots
插槽
Named slots project light DOM content into the element's shadow DOM.
html
<el-dm-button>
<span slot="prefix">🔍</span>
Search
<span slot="suffix">→</span>
</el-dm-button>
<el-dm-card>
<span slot="header">Card Title</span>
Card body content
<div slot="footer">Footer</div>
</el-dm-card>Common slots: (default), , , , , , .
headerfooterprefixsuffixemptyactions命名插槽可将普通DOM内容投射到元素的Shadow DOM中。
html
<el-dm-button>
<span slot="prefix">🔍</span>
搜索
<span slot="suffix">→</span>
</el-dm-button>
<el-dm-card>
<span slot="header">卡片标题</span>
卡片主体内容
<div slot="footer">页脚</div>
</el-dm-card>通用插槽:(默认)、、、、、、。
headerfooterprefixsuffixemptyactionsCSS Parts
CSS部件
Style shadow DOM internals from outside using :
::part()css
el-dm-button::part(button) {
border-radius: 0;
}
el-dm-dialog::part(backdrop) {
backdrop-filter: blur(4px);
}
el-dm-table::part(thead) {
background: var(--color-surface-container-high);
}使用从外部样式化Shadow DOM内部元素:
::part()css
el-dm-button::part(button) {
border-radius: 0;
}
el-dm-dialog::part(backdrop) {
backdrop-filter: blur(4px);
}
el-dm-table::part(thead) {
background: var(--color-surface-container-high);
}Theming
主题设置
Elements use CSS custom properties from . Apply a preset theme:
@duskmoon-dev/el-basetypescript
import { applyTheme } from '@duskmoon-dev/el-base';
applyTheme(document.documentElement, 'moonlight'); // dark
applyTheme(document.documentElement, 'sunshine'); // light
// Also: 'ocean', 'forest', 'rose'Override individual variables:
css
:root {
--color-primary: oklch(60% 0.15 250);
--color-surface: #ffffff;
}Key variables: , , , , .
--color-primary--color-surface--color-on-surface--color-outline--color-surface-containerSee references/core-api.md for full CSS variable list.
元素使用中的CSS自定义属性。应用预设主题:
@duskmoon-dev/el-basetypescript
import { applyTheme } from '@duskmoon-dev/el-base';
applyTheme(document.documentElement, 'moonlight'); // 深色
applyTheme(document.documentElement, 'sunshine'); // 浅色
// 还支持:'ocean'、'forest'、'rose'覆盖单个变量:
css
:root {
--color-primary: oklch(60% 0.15 250);
--color-surface: #ffffff;
}核心变量:、、、、。
--color-primary--color-surface--color-on-surface--color-outline--color-surface-container完整CSS变量列表请查看references/core-api.md。
Batched Rendering
批量渲染
Property changes are batched via . Multiple changes in the same tick produce a single re-render:
queueMicrotaskjavascript
const el = document.querySelector('el-dm-button');
el.variant = 'outlined';
el.color = 'error';
el.size = 'lg';
// → single re-render属性变更通过批量处理。同一事件循环中的多次变更只会触发一次重新渲染:
queueMicrotaskjavascript
const el = document.querySelector('el-dm-button');
el.variant = 'outlined';
el.color = 'error';
el.size = 'lg';
// → 仅一次重新渲染References
参考资料
- Element catalog — all 43 packages by category with class names
- Core API — BaseElement API, mixins, style utilities, CSS variables, themes, validation
For CSS art elements (), see the duskmoon-art-elements skill.
<el-dm-art-*>- 元素目录 — 按类别划分的全部43个包及类名
- 核心API — BaseElement API、混合器、样式工具、CSS变量、主题、验证
关于CSS艺术元素(),请查看duskmoon-art-elements技能文档。
<el-dm-art-*>