@duskmoon-dev/el-base (日语)
DuskMoon定制要素的核心公用事业和基础课程.
安装
bun add @duskmoon-dev/el-base
使用量
基础元素
这个 BaseElement 类为创建自定义元素提供了基础:
- 阴影 DOM 设置
adoptedStyleSheets - 带有属性反射的反应属性
- 使用微任务队列校正更新
- 样式注入工具
- 事件排放助手
import { BaseElement, css } from '@duskmoon-dev/el-base';
const styles = css`
:host {
display: block;
}
.greeting {
color: var(--dm-primary);
}
`;
class MyGreeting extends BaseElement {
static properties = {
name: { type: String, reflect: true, default: 'World' },
};
declare name: string;
constructor() {
super();
this.attachStyles(styles);
}
render() {
return `<div class="greeting">Hello, ${this.name}!</div>`;
}
}
customElements.define('my-greeting', MyGreeting);
CSS 公用事业
css 模板标签
创建一个 CSSStyleSheet 从模板正文中:
import { css } from '@duskmoon-dev/el-base';
const styles = css`
:host {
display: inline-flex;
}
button {
padding: 0.5rem 1rem;
}
`;
combineStyles
组合多个样式表 :
import { combineStyles } from '@duskmoon-dev/el-base';
const combinedStyles = combineStyles(baseStyles, themeStyles, componentStyles);
cssVars
创建 CSS 自定义属性声明 :
import { cssVars } from '@duskmoon-dev/el-base';
const vars = cssVars({
'dm-primary': '#3b82f6',
'dm-spacing': '1rem',
});
// Returns: '--dm-primary: #3b82f6; --dm-spacing: 1rem;'
默认主题
该软件包包括用于主题的默认 CSS 自定义属性. 导入主题样式表 :
import { defaultTheme, resetStyles } from '@duskmoon-dev/el-base';
// Apply to shadow root
this.shadowRoot.adoptedStyleSheets = [resetStyles, defaultTheme, componentStyles];
颜色
| 变量 | 说明 |
|---|---|
--dm-primary | 主要品牌颜色 |
--dm-secondary | 次要颜色 |
--dm-success | 成功/正色 |
--dm-warning | 警告颜色 |
--dm-error | 错误/ 危险颜色 |
--dm-info | 信息颜色 |
灰度缩放
| 变量 | 说明 |
|---|---|
--dm-gray-50 | 最浅的灰色 |
--dm-gray-100 结束 --dm-gray-800 | 灰度缩放 |
--dm-gray-900 | 最暗的灰色 |
类型
| 变量 | 说明 |
|---|---|
--dm-font-family | 基本字体家族 |
--dm-font-size-xs 结束 --dm-font-size-2xl | 字体大小 |
--dm-font-weight-normal, (中文(简体) ), --dm-font-weight-medium, (中文(简体) ), --dm-font-weight-semibold, (中文(简体) ), --dm-font-weight-bold | 字体权重 |
--dm-line-height-tight, (中文(简体) ), --dm-line-height-normal, (中文(简体) ), --dm-line-height-relaxed | 线高 |
间距
| 变量 | 说明 |
|---|---|
--dm-spacing-xs | 额外小(0.25雷姆) |
--dm-spacing-sm | 小型(0.5雷姆) |
--dm-spacing-md | 中型(1雷姆) |
--dm-spacing-lg | 大型(1.5雷姆) |
--dm-spacing-xl | 额外大(2雷姆) |
边框半径
| 变量 | 说明 |
|---|---|
--dm-radius-sm | 小半径 |
--dm-radius-md | 中半径 |
--dm-radius-lg | 大半径 |
--dm-radius-full | 全/溢出半径 |
阴影
| 变量 | 说明 |
|---|---|
--dm-shadow-sm | 小阴影 |
--dm-shadow-md | 中阴影 |
--dm-shadow-lg | 大阴影 |
过渡
| 变量 | 说明 |
|---|---|
--dm-transition-fast | 快速过渡(150ms) |
--dm-transition-normal | 正常过渡( 200ms) |
--dm-transition-slow | 缓慢过渡( 300ms) |
API 密码
基础元素
| 方法 | 说明 |
|---|---|
attachStyles(styles) | 在阴影 DOM 中附加一个或多个样式表 |
render() | 覆盖以返回 HTML 内容字符串 |
update() | 当反应属性变化时调用( 有争议) |
emit(name, detail?) | 从元素中删除自定义事件 |
query(selector) | 在阴影 DOM 中查询单元素 |
queryAll(selector) | 查询阴影 DOM 中的所有匹配元素 |
财产定义
定义自动属性反射的反应性 :
static properties = {
// Simple string property
label: { type: String },
// Boolean with attribute reflection
disabled: { type: Boolean, reflect: true },
// Number with default value
count: { type: Number, default: 0 },
// Custom attribute name (kebab-case)
maxItems: { type: Number, attribute: 'max-items' },
// Object/Array (not reflected to attributes)
data: { type: Object },
items: { type: Array, default: [] },
};
属性定义选项 :
| 选项 | 类型 | 说明 |
|---|---|---|
type | Function | 类型构造器 : String, (中文(简体) ), Number, (中文(简体) ), Boolean, (中文(简体) ), Object, (中文(简体) ), Array |
reflect | boolean | 是否反映属性 |
attribute | string | 自定义属性名称( 小写属性名称的默认值) |
default | any | 财产的默认值 |
生命周期
class MyElement extends BaseElement {
// Called when element is added to DOM
connectedCallback() {
super.connectedCallback();
// Setup code
}
// Called when element is removed from DOM
disconnectedCallback() {
super.disconnectedCallback();
// Cleanup code
}
// Called when properties change (batched)
update() {
// Re-render or update DOM
this.shadowRoot.innerHTML = this.render();
}
// Return HTML string for Shadow DOM content
render() {
return `<div>Content</div>`;
}
}
类型脚本
import type {
PropertyDefinition,
PropertyDefinitions,
Size,
Variant,
ValidationState,
BaseElementProps,
SizableProps,
VariantProps,
FormElementProps,
ValidatableProps,
ValueChangeEventDetail,
} from '@duskmoon-dev/el-base';
创建自定义元素
自定义元素的全部示例 :
import { BaseElement, css, defaultTheme, resetStyles } from '@duskmoon-dev/el-base';
const styles = css`
:host {
display: inline-block;
}
.counter {
display: flex;
align-items: center;
gap: var(--dm-spacing-sm);
}
button {
padding: var(--dm-spacing-xs) var(--dm-spacing-sm);
border-radius: var(--dm-radius-sm);
background: var(--dm-primary);
color: white;
border: none;
cursor: pointer;
transition: opacity var(--dm-transition-fast);
}
button:hover {
opacity: 0.9;
}
.value {
min-width: 2rem;
text-align: center;
font-weight: var(--dm-font-weight-medium);
}
`;
export class MyCounter extends BaseElement {
static properties = {
value: { type: Number, reflect: true, default: 0 },
min: { type: Number, default: 0 },
max: { type: Number, default: 100 },
};
declare value: number;
declare min: number;
declare max: number;
constructor() {
super();
this.attachStyles(resetStyles, defaultTheme, styles);
}
connectedCallback() {
super.connectedCallback();
this.shadowRoot?.addEventListener('click', this.handleClick.bind(this));
}
private handleClick(e: Event) {
const target = e.target as HTMLElement;
if (target.matches('[data-action="decrement"]')) {
this.decrement();
} else if (target.matches('[data-action="increment"]')) {
this.increment();
}
}
private decrement() {
if (this.value > this.min) {
this.value--;
this.emit('change', { value: this.value });
}
}
private increment() {
if (this.value < this.max) {
this.value++;
this.emit('change', { value: this.value });
}
}
render() {
return `
<div class="counter">
<button data-action="decrement" ${this.value <= this.min ? 'disabled' : ''}>-</button>
<span class="value">${this.value}</span>
<button data-action="increment" ${this.value >= this.max ? 'disabled' : ''}>+</button>
</div>
`;
}
}
export function register() {
if (!customElements.get('my-counter')) {
customElements.define('my-counter', MyCounter);
}
}
许可证
麻省理工学院