# @design\.estate/dees-element 中文文档

规范地址：https://npmcn.com/package/%40design.estate/dees-element/

版本：4\.0\.2
npm 元数据更新时间：2026-10-08T17:46:16.017Z
中文译文更新时间：2026-11-12T01:08:18.418Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40design.estate/dees-element
原文对照：https://npmcn.com/package/%40design.estate/dees-element/?lang=original

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：6.4 MB，49 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：6 个
- 首次发布：2023-08-07T15:10:49.865Z
- 最新版本发布：2026-10-08T17:46:15.696Z
- 近 30 天下载量：10251（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：43（近 12 个月 20 个）

## 中文简介

用于创建自定义元素的库, 扩展所显示的元素类, 并附加功能 .

## 安装

```sh
npm install @design.estate/dees-element
```

也可以使用：`pnpm add @design.estate/dees-element`、`yarn add @design.estate/dees-element`、`bun add @design.estate/dees-element`

## README

# @ dedesign.estate/dees-emlement (英语)

扩展 Lit 的强大的自定义元素基础类 `LitElement` 与集成主题,反应灵敏的 CSS 公用事业,RxJS 驱动指令,和 DOM 工具化——这样你就可以构建一些看起来很棒的网络组件,并保持在框外的反应.

## 问题报告和安全

关于报告错误、问题或安全弱点,请访问 [社区. fos.global/](https://community.foss.global/)这是所有问题报告的中央社区中心。 签署和遵守我们缴款协议并经过身份验证的开发者也可获得 [代码.fos.global/](https://code.foss.global/) 账户直接提交 Pull 请求.

## 安装

```bash
npm install @design.estate/dees-element
# or
pnpm install @design.estate/dees-element
```

本包船作为无害环境管理,并用TypeScript来书写. 请用现代模块解析策略(例如:. `NodeNext`) (中文(简体) ).

## 使用量

您需要的都从主入口输出 :

```typescript
import {
  DeesElement,
  customElement,
  property,
  state,
  html,
  css,
  cssManager,
  directives,
} from '@design.estate/dees-element';
```

### QQ 创建自定义元素

扩展 `DeesElement` 并应用 `@customElement` 装饰 :

```typescript
import { DeesElement, customElement, html, css, cssManager } from '@design.estate/dees-element';

@customElement('my-button')
class MyButton extends DeesElement {
  static styles = [
    cssManager.defaultStyles,
    css`
      .btn {
        padding: 8px 16px;
        border-radius: 4px;
        background: ${cssManager.bdTheme('#0060df', '#3a8fff')};
        color: ${cssManager.bdTheme('#fff', '#fff')};
        border: none;
        cursor: pointer;
      }
    `,
  ];

  render() {
    return html`<button class="btn"><slot></slot></button>`;
  }
}
```

那个单身 `bdTheme()` 调用生成一个 CSS 变量, 当用户的主题改变时, 在亮值和暗值之间自动翻转—— 不需要手动拖动 .

### \* 电子包装设备

组件演示可以导入 `demotools` 要注册的子路径 `<dees-demowrapper>`。包装器会制作其分档的演示内容,然后运行 `runAfterRender`,用于需要设置状态的演示,查询提供了光-DOM子,或者在第一次渲染后模拟用户交互.

```typescript
import { html } from '@design.estate/dees-element';
import { DeesDemoWrapper } from '@design.estate/dees-element/demotools';

export const demo = () => html`
  <dees-demowrapper
    .runAfterRender=${(wrapper: DeesDemoWrapper) => {
      const button = wrapper.querySelector('button');
      button?.dispatchEvent(new Event('click', { bubbles: true }));
    }}
  >
    <button>Demo action</button>
  </dees-demowrapper>
`;
```

### 主题管理 `cssManager`

单子 `cssManager` 它是主题和反应性布局的中心枢纽:

| 方法 | 目的 |
| --- | --- |
| `cssManager.defaultStyles` | 一致元素渲染的基础样式 |
| `cssManager.bdTheme(bright, dark)` | 回返a `CSSResult` 在亮/暗值之间自动切换 |
| `cssManager.cssForDesktop(css, this?)` | 桌面断点; 通过 `this` 用于组件范围d |
| `cssManager.cssForNotebook(css, this?)` | 笔记本断点; 通过 `this` 用于组件范围d |
| `cssManager.cssForTablet(css, this?)` | 平板电脑的断点; 通过 `this` 用于组件范围d |
| `cssManager.cssForPhablet(css, this?)` | Phablet 的断点; 通过 `this` 用于组件范围d |
| `cssManager.cssForPhone(css, this?)` | 电话断点; 通过 `this` 用于组件范围d |
| `cssManager.cssForConstraint({ maxWidth, minWidth })` | 自定义视图级约束( 已查询) |
| `cssManager.cssGridColumns(cols, gap)` | 生成 CSS 网格宽度 |

示例——应答+主题样式:

```typescript
@customElement('my-card')
class MyCard extends DeesElement {
  static styles = [
    cssManager.defaultStyles,
    css`
      :host {
        display: block;
        padding: 16px;
        background: ${cssManager.bdTheme('#ffffff', '#1e1e1e')};
        color: ${cssManager.bdTheme('#111', '#eee')};
        border-radius: 8px;
      }
    `,
    cssManager.cssForPhone(css`
      :host { padding: 8px; }
    `),
  ];

  render() {
    return html`<slot></slot>`;
  }
}
```

### 集装箱反应组件

对需要应对其 **自有宽度** (不是取景口),使用 `@containerResponsive()` 装饰和通过 `this` 作为第二个参数 `cssManager.cssFor*`数字 :

```typescript
import {
  DeesElement, customElement, html, css, cssManager,
  containerResponsive,
} from '@design.estate/dees-element';

@containerResponsive()
@customElement('my-stats-grid')
class MyStatsGrid extends DeesElement {
  static styles = [
    cssManager.defaultStyles,
    css`.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }`,

    // Component-level: when THIS element is narrower than tablet width
    cssManager.cssForTablet(css`
      .grid { grid-template-columns: repeat(2, 1fr); }
    `, this),

    // Viewport-level: when the browser window is phone-sized
    cssManager.cssForPhone(css`
      .grid { grid-template-columns: 1fr; }
    `),

    // Component-level with custom width constraint
    this.cssForConstraint({ maxWidth: 500 })(css`
      .grid { gap: 8px; }
    `),
  ];

  render() {
    return html`<div class="grid"><slot></slot></div>`;
  }
}
```

**如何运作:**

| API 密码 | 范围 | 生成的 CSS |
| --- | --- | --- |
| `cssManager.cssForPhablet(css)` | 视图端口 | `@media` + 键 `@container wccToolsViewport` |
| `cssManager.cssForPhablet(css, this)` | 构成部分 | `@container <tag-name>` 仅限 |
| `cssManager.cssForConstraint({maxWidth:800})(css)` | 视图端口 | `@media` + 键 `@container wccToolsViewport` |
| `this.cssForConstraint({maxWidth:500})(css)` | 构成部分 | `@container <tag-name>` 仅限 |
| `@containerResponsive()` | 装饰 | 设定 `container-type: inline-size` + 键 `container-name` 打开 `:host` |

这个 `@containerResponsive()` 需要装订器来进行组件范围查询——它确定了CSS的封装上下文 `:host`。 。 。 .

### & 状态

使用标准立特装饰器,为方便再出:

```typescript
import { DeesElement, customElement, property, state, html } from '@design.estate/dees-element';

@customElement('my-counter')
class MyCounter extends DeesElement {
  @property({ type: String })
  accessor label = 'Count';

  @state()
  accessor count = 0;

  render() {
    return html`
      <button @click=${() => this.count++}>
        ${this.label}: ${this.count}
      </button>
    `;
  }
}
```

> **说明:** 此库使用 TC39 标准装潢器与 `accessor` 装饰类属性的关键词 .

### QQ 主题更改回调

`DeesElement` 通过 `goBright` 属性并显示可选 `themeChanged` 回调 :

```typescript
@customElement('theme-aware')
class ThemeAware extends DeesElement {
  protected themeChanged(goBright: boolean) {
    console.log(goBright ? 'Switched to bright' : 'Switched to dark');
  }

  render() {
    return html`<p>Current theme: ${this.goBright ? 'bright' : 'dark'}</p>`;
  }
}
```

`goBright` 反映为 `gobright` 属性在主机元素上,所以主题可以在没有 JavaScript 或每值的平面 CSS 中被样式化 `bdTheme()` 配对 :

```typescript
public static styles = [
  css`
    :host {
      background: #000;
    }
    :host([gobright]) {
      background: #fff;
    }
  `,
];
```

主题切换时属性会自动更新 。 一个元素在连接时取出生效的主题,所以它的第一个渲染已经在这个主题中,没有颜色从黑暗的默认中消失. 一个元素创建于 `ignoreGlobal` 遵循它自己的多姆工具,一旦它被设置,它的主题就会被采纳.

### \* 生命周期帮助者

`DeesElement` 在 LitElement 上添加生命周期公用事业:

```typescript
@customElement('my-widget')
class MyWidget extends DeesElement {
  constructor() {
    super();

    // Runs for each connection, after the previous connection has finished cleanup.
    this.registerStartupFunction(async (signal) => {
      if (signal.aborted) return;
      console.log('Widget connected!');
    });

    // Runs when the element is disconnected — perfect for cleanup
    this.registerGarbageFunction(() => {
      console.log('Widget removed');
    });
  }

  render() {
    return html`<p>Hello World</p>`;
  }
}
```

此外, `this.elementDomReady` 一个承诺,在之后解决 `firstUpdated`,这在等待初始渲染时是有用的:

```typescript
await this.elementDomReady;
// The element's shadow DOM is now fully rendered
```

启动钩接受 `AbortSignal` 在删除时同步中止。 用这个 取消支持取消的工作。 已经运行的虎克可以安顿下来; 垃圾钩在下次连接开始前完成。 登记钩,通常一次 在建筑师。 由起动钩所创造的资源属于这种连接.

指令断开 `rxSubscriptions` 删除时立即取消订阅. 完成启动后加入的订阅在清理完成前被排出. 每条垃圾钩都尝试过,即使再扔一次;返回的断开承诺 以 `AggregateError`,以后的连接仍然可以运行。 子类应 立即拨打超阶级的生命周期方法,等待它回归的承诺 开始一个同步的工作.

这个 `resolve` 指令无视陈旧的承诺,保留有待清除的工作,以及 使当前承诺在重新连接后实现,即使承诺在分离时已经实现.

### 语言 `localize` 财务报告和审定财务报表 `provideI18n`

组件表达其软件包目录中的单词,一个键入 [`@push.rocks/smarti18n`](https://code.foss.global/push.rocks/smarti18n) iCU消息目录. 应用程序 通过提供 `I18n` 实例; 下方的每个组件在变化时重递.

**1\. 一揽子组成部分界定其目录** (关于消息、翻译和检查,见smarti18n读取器):

```typescript
import { defineCatalog } from '@push.rocks/smarti18n';

export const messages = defineCatalog({
  namespace: '@my/components',
  source: 'en',
  messages: {
    counter: 'Step {current, number} of {total, number}',
    help: 'Read the <link>guide</link>.',
  },
});
messages.addTranslation('de', () => import('./messages.de.js'));
```

**2\. 构成部分的用词是: `localize`数字 :**

```typescript
import { DeesElement, customElement, html, localize } from '@design.estate/dees-element';
import { messages } from './messages.js';

@customElement('my-stepper')
class MyStepper extends DeesElement {
  private t = localize(this, messages);

  render() {
    return html`
      <span>${this.t('counter', { current: 2, total: 4 })}</span>
      <p>${this.t.rich('help', { link: (chunks) => html`<a href="/guide">${chunks}</a>` })}</p>
      <small>${this.t.format.number(1234.5)}</small>
    `;
  }
}
```

-   键和参数为: `this.t('counter', { current: 2 })` 财务报告和审定财务报表 `this.t('countr')` 正在编译错误.
-   `this.t.format` 用目录格式写数字、钱、日期、列表和相对时间 写进,所以它总是同意 数字内的信息,和 `this.t.i18n` 元素为实例 现在说话.

**3\. 该应用程序提供了其实例**打开 `<html>` 因此,附件中的要点 `document.body` (模式,菜单)找到它 还有:

```typescript
import { createI18n } from '@push.rocks/smarti18n';
import { provideI18n } from '@design.estate/dees-element';

const i18n = createI18n({ locale: 'de-DE' });
provideI18n(document.documentElement, i18n, { reflect: true }); // keeps <html lang dir> in step

await i18n.setLocale('en-GB'); // every localized element re-renders in English
```

它的行为:

-   **没有供应商** a 元素表达其目录的源语言(smarti18n's `sourceI18n`) (中文(简体) ). 提供商 因此设置顺序并不重要.
    
-   **自己的倒计时:** `localize(this, messages, { fallback })` 说话 `fallback` 改为 `sourceI18n` 没有 供应商为要件服务,在供应商被处置时也是如此。 组件库保存自己的格式 这样一来,直到一个主机提供语言,例如没有分组的数字,在消息和 `t.format` 类似:
    
    ```typescript
    import { createSourceI18n, Formats } from '@push.rocks/smarti18n';
    
    class UngroupedFormats extends Formats {
      public override intlNumberFormat(options: Intl.NumberFormatOptions): Intl.NumberFormat {
        return super.intlNumberFormat({ useGrouping: false, ...options });
      }
    }
    const neutral = createSourceI18n({ createFormats: (settings) => new UngroupedFormats(settings) });
    
    // in the component
    private t = localize(this, messages, { fallback: neutral });
    ```
    
-   **一个子树可以说另一种语言:** `provideI18n(previewElement, documentI18n)` 为下列要素服务 `previewElement` (文档预览,并列演示). 在一个 `DeesElement` 主办供应商与东道方住在一起; `reflect` 套装 `lang` 财务报告和审定财务报表 `dir` 当它连接时. `provider.i18n = other` 将子树另一只 举个例子. `provider.dispose()` 停止提供者并恢复其主机 `lang` 财务报告和审定财务报表 `dir`;平原上的供货商 元素,例如 `<html>`住到那时.
    
-   **封面可以说开口语:** 提供者服务于主机下方的元素, 绝不是主机本身的 `localize()` 词. `provideI18n(overlay, openerI18n, { includeHost: true })` 也为东道主服务: 它使发言的内容 `openerI18n` 除页面外,请遵循一个本地端口或 `provider.i18n = other`,以及 返回页面语言 `provider.dispose()`。无论主机已经连接还是连接,它都有效 等会.
    
-   **话还没说完.** `DeesElement.scheduleUpdate()` 等待元素使用的目录 为它的语言加载,所以一个懒散定义的目录从不首先显示它的源词. 它只是等待 语言 仍然要加载 : 每个单词加载后, 更新是同步的, 所以一个本地化的孩子, 由父母所制作 电流,一旦父母的 `updateComplete` 决定。 无法加载的单词拒绝 `updateComplete` (与 翻译本身的失误,在 `AggregateError`; 下一次更新再次尝试. 覆盖的子类 `scheduleUpdate()` 必须呼叫 `super.scheduleUpdate()`。 。 。 .
    
-   **无有漏出.** 一个元素订阅其提供者,并在连接和断开时取消订阅.
    
-   **右为左.** `i18n.direction` 实值 `rtl` 阿拉伯语、希伯来语、波斯语和假语言 `ar-XB`; 与 `reflect`, (中文(简体) ), `dir="rtl"` 翻出一页. `en-XA` (单位:千美元)`createI18n({ locale: 'en-XA', pseudo: true })`显示已剪辑或 未译正文一览.
    
-   情况是 `i18nContext` (Web组件上下文协议,通过 `@lit/context`),按键 `Symbol.for('dees.i18n')`,所以每一份页面中的这个软件包都共享.
    

### \* 指令

这个 `directives` 命名空间包括强大的模板助手,可通过 `directives.*`数字 :

#### `resolve` ——兑现承诺

```typescript
import { html, directives } from '@design.estate/dees-element';

render() {
  return html`${directives.resolve(this.fetchData())}`;
}
```

#### `resolveExec` 解决懒惰的合成功能

```typescript
render() {
  return html`${directives.resolveExec(() => this.loadContent())}`;
}
```

#### `subscribe` - 显示 RxJS 观测器

```typescript
import { html, directives } from '@design.estate/dees-element';

render() {
  return html`<span>${directives.subscribe(this.count$)}</span>`;
}
```

#### `subscribeWithTemplate` ——可观察+模板转换

```typescript
render() {
  return html`
    ${directives.subscribeWithTemplate(
      this.items$,
      (items) => html`<ul>${items.map(i => html`<li>${i}</li>`)}</ul>`
    )}
  `;
}
```

#### 再出口 诉讼指令

指令命名空间还再出口这些常用的立特指令:

-   `until` ——使占位者,而允诺是解决的
-   `asyncAppend` — 辅助变量
-   `keyed` ——当关键更改时,强制重生成模板
-   `repeat` · 有效地使名单具有身份追踪

### ++ 完全导出参考

| 导出 | 说明 |
| --- | --- |
| `DeesElement` | 自定义元素的基础类 |
| `cssManager` | 单子 `CssManager` 实例 |
| `customElement` | 注册元素的类装饰器 |
| `property` | 反应属性装饰器 |
| `state` | 内部状态装饰器 |
| `query`, (中文(简体) ), `queryAll`, (中文(简体) ), `queryAsync` | 阴影 DOM 查询装饰器 |
| `html` | Lit html 模板标签 |
| `css` | Lit Css 模板标签 |
| `unsafeCSS` | 创建 `CSSResult` 从字符串 |
| `unsafeHTML` | 在模板中渲染原始 HTML |
| `render` | Lit 渲染函数 |
| `static` 编号 : `unsafeStatic` | 静态 html 模板助手 |
| `containerResponsive` | 添加 CSS 封装到 `:host` |
| `domtools` | DOM 工具公用事业 |
| `directives` | 所有指令(解决、签署等) |
| `localize`, (中文(简体) ), `ILocalizer` (类型), `ILocalizeOptions` (类型) | 某个元素的目录输入的单词, 使用提供的语言或者其倒置 |
| `provideI18n`, (中文(简体) ), `I18nProvider`, (中文(简体) ), `IProvideI18nOptions` (类型) | 提供 `I18n` 到页面或子树 |
| `i18nContext` | 背景情况 `I18n` 列于 |
| `rxjs` (类型) | RxJS 类型再导出 |
| `DeesDemoWrapper` 从 `@design.estate/dees-element/demotools` | Demo 后调用自定义元素 |

内容4 公众 `domtools` 命名空间(和 `DeesElement.domtools`(中文(简体) ) 揭发了"德多斯"5,"Typed Request 9"和"德多斯"2. 消费者升级 要件3必须:

-   替换 `domtools.plugins.smartdelay` 与 `domtools.plugins.smartpromise`,并在 替换多姆工具实例 `DeesElement.domtools.convenience.smartdelay` 与 `DeesElement.domtools.convenience.smartpromise` (单位:千美元)`delayFor`, (中文(简体) ), `delayForRandom` 财务报告和审定财务报表 `Timeout` 保持他们的签名;
-   导入 `DeesElement` 构造器选项类型为 `domtools.IDomToolsConstructorOptions` (密码) `IDomToolsContructorOptions` 已经消失);
-   将自己的打出的请求路由器和目标与Typed Request 9连接起来,后者 `routeAndAddResponse()` 决定 `T | null` 以及他们 `IPostMethod` 决定 `ITypedRequest | null`。 。 。 .

## 许可证和法律资料

这个寄存器包含根据麻省理工学院许可证许可的开源代码. 许可证副本可在 [许可证](https://npmcn.com/package/%40design.estate/dees-element/license.md) 文档.

**请注意:** 麻省理工学院许可证不准许使用该项目的商品名、商标、服务标记或产品名称,除非在描述作品来源和复制NOTICE文件内容时需要合理和习惯使用.

### 商标

这个项目由Task Venture Capital GmbH拥有和维护。 与Task Venture Capital GmbH相关的名称和标志以及任何相关的产品或服务是Task Venture Capital GmbH或第三方的商标,不属于本文授予的麻省理工学院许可证的范围.

使用这些商标必须符合Wasure Venture Capital GmbH的商标准则或各自的第三方所有者的准则,任何使用都必须获得书面批准。 此处使用的第三方商标是其各自所有者的财产并仅以描述方式使用,例如用于实施API或类似的.

### 企业信息

任务风险资本股份有限公司 在德国不来梅地区法院注册的HRB 35230 HB

如欲了解任何法律查询或进一步情况,请通过电子邮件与我们联系 [你好@ task.vc](mailto:hello@task.vc)。 。 。 .

通过使用这个寄存器,你承认你读过这个部分,同意遵守它的条款,并且明白代码的许可并不意味着Task Venture Capital GmbH认可任何衍生作品.

## 常见问题

### @design\.estate/dees-element 是什么？

用于创建自定义元素的库, 扩展所显示的元素类, 并附加功能 \.

### 如何安装 @design\.estate/dees-element？

在项目目录运行 npm install @design\.estate/dees-element，或使用 pnpm add / yarn add / bun add。

### @design\.estate/dees-element 支持 TypeScript 吗？

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

### @design\.estate/dees-element 支持 ESM 还是 CommonJS？

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

### @design\.estate/dees-element 可以商用吗？

@design\.estate/dees-element 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @design\.estate/dees-element 的下载量有多少？

根据 npm 官方下载统计，@design\.estate/dees-element 在 2026/10/12 – 2026/11/10 这 30 天内被下载 10,251 次，日均约 342 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @design\.estate/dees-element 还在维护吗？

最新版本 4\.0\.2 发布于 2026/10/09（1 个月前）；至今共发布 43 个版本，其中过去 12 个月发布了 20 个；首次发布于 2023/08/07。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

