@jboltai/tokui-webc 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/package.json +46 -0
- package/src/index.d.ts +20 -0
- package/src/index.js +74 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 jboltai.com
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# @jboltai/tokui-webc
|
|
2
|
+
|
|
3
|
+
> TokUI 的 Web Component 适配器 —— 一个框架无关的 `<tokui-view>` 自定义元素。
|
|
4
|
+
|
|
5
|
+
装一次,**任何框架**都能用:React / Vue / Svelte / Angular / 原生 HTML / 无框架。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @jboltai/tokui-webc
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 用法
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
import defineTokuiElement from '@jboltai/tokui-webc';
|
|
17
|
+
defineTokuiElement(); // 注册 <tokui-view>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
然后任意 HTML / JSX / template:
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<tokui-view dsl="[card tt:你好][p 流式 UI,零依赖][/card]"></tokui-view>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
属性:
|
|
27
|
+
- `dsl` —— 一次性渲染整段 DSL
|
|
28
|
+
- `theme` —— 切换主题(如 `dark`)
|
|
29
|
+
|
|
30
|
+
命令式 API(流式 / SSE):
|
|
31
|
+
|
|
32
|
+
```js
|
|
33
|
+
const view = document.querySelector('tokui-view');
|
|
34
|
+
view.startStream();
|
|
35
|
+
view.feed('[card tt:');
|
|
36
|
+
view.feed('流式卡片]');
|
|
37
|
+
view.endStream();
|
|
38
|
+
|
|
39
|
+
// SSE
|
|
40
|
+
view.connect('/api/chat', { prompt: '画一个登录卡片' });
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## CSS
|
|
44
|
+
|
|
45
|
+
`@jboltai/tokui` 的样式随包自动注入(通过 `import` 副作用),无需手动引入。如需显式引入:
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
import '@jboltai/tokui/css';
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
License: MIT
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jboltai/tokui-webc",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TokUI Web Component — framework-agnostic <tokui-view> custom element wrapping @jboltai/tokui. Works in React, Vue, Svelte, Angular, vanilla, or any HTML.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "sdxiaomu (https://jboltai.com)",
|
|
7
|
+
"homepage": "https://github.com/jboltai/tokui",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/jboltai/tokui.git",
|
|
11
|
+
"directory": "packages/webc"
|
|
12
|
+
},
|
|
13
|
+
"main": "src/index.js",
|
|
14
|
+
"module": "src/index.js",
|
|
15
|
+
"types": "src/index.d.ts",
|
|
16
|
+
"type": "module",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./src/index.d.ts",
|
|
20
|
+
"import": "./src/index.js",
|
|
21
|
+
"require": "./src/index.js",
|
|
22
|
+
"default": "./src/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./package.json": "./package.json"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@jboltai/tokui": "^0.1.0"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": [
|
|
30
|
+
"**/*.css"
|
|
31
|
+
],
|
|
32
|
+
"files": [
|
|
33
|
+
"src",
|
|
34
|
+
"README.md"
|
|
35
|
+
],
|
|
36
|
+
"keywords": [
|
|
37
|
+
"tokui",
|
|
38
|
+
"web-component",
|
|
39
|
+
"custom-element",
|
|
40
|
+
"tokui-view",
|
|
41
|
+
"framework-agnostic"
|
|
42
|
+
],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TokUI as TokUIClass } from '@jboltai/tokui';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* <tokui-view> 自定义元素。注册后可直接在 HTML / JSX / template 中使用。
|
|
5
|
+
*/
|
|
6
|
+
export class TokUIViewElement extends HTMLElement {
|
|
7
|
+
render(dsl: string): void;
|
|
8
|
+
startStream(): TokUIClass | null;
|
|
9
|
+
feed(chunk: string): void;
|
|
10
|
+
endStream(): void;
|
|
11
|
+
connect(url: string, body?: Record<string, any>): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 注册自定义元素(默认 'tokui-view')。
|
|
16
|
+
* SSR 下不注册(customElements 不存在),仅返回类。
|
|
17
|
+
*/
|
|
18
|
+
export default function defineTokuiElement(name?: string): typeof TokUIViewElement;
|
|
19
|
+
|
|
20
|
+
export { defineTokuiElement };
|
package/src/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TokUI Web Component —— 框架无关的 <tokui-view> 自定义元素。
|
|
4
|
+
// 在 React / Vue / Svelte / Angular / 原生 HTML 中均可使用同一套 DSL。
|
|
5
|
+
import { TokUI, setTheme } from '@jboltai/tokui';
|
|
6
|
+
|
|
7
|
+
// SSR 安全:Node 无 HTMLElement,用空基类兜底,避免 `extends HTMLElement` 在 import 求值期崩。
|
|
8
|
+
// 方法体内访问的 DOM API 仅在浏览器调用时执行,SSR 不会触发。
|
|
9
|
+
const BaseElement = (typeof HTMLElement !== 'undefined') ? HTMLElement : class {};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* <tokui-view> 自定义元素:把 TokUI 实例封装为标准 Custom Element。
|
|
13
|
+
* 属性:dsl(一次性渲染)、theme(主题切换)。
|
|
14
|
+
* 方法:render / startStream / feed / endStream / connect(透传到内部 TokUI 实例)。
|
|
15
|
+
*/
|
|
16
|
+
class TokUIViewElement extends BaseElement {
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
this._ui = null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static get observedAttributes() {
|
|
23
|
+
return ['dsl', 'theme'];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
connectedCallback() {
|
|
27
|
+
if (this._ui) return;
|
|
28
|
+
this._ui = new TokUI({ container: this });
|
|
29
|
+
const theme = this.getAttribute('theme');
|
|
30
|
+
if (theme) { try { setTheme(theme); } catch (e) { /* 主题可能未注册 */ } }
|
|
31
|
+
const dsl = this.getAttribute('dsl');
|
|
32
|
+
if (dsl) this.render(dsl);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
disconnectedCallback() {
|
|
36
|
+
if (this._ui && this._ui.disconnect) this._ui.disconnect();
|
|
37
|
+
this._ui = null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
attributeChangedCallback(name, oldVal, newVal) {
|
|
41
|
+
if (oldVal === newVal) return;
|
|
42
|
+
if (name === 'theme' && newVal) { try { setTheme(newVal); } catch (e) { /* ignore */ } }
|
|
43
|
+
if (name === 'dsl' && this._ui && newVal) this.render(newVal);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// —— 透传 TokUI 实例方法 ——
|
|
47
|
+
render(dsl) { if (this._ui) this._ui.render(dsl); }
|
|
48
|
+
startStream() { if (this._ui) this._ui.startStream(); return this._ui; }
|
|
49
|
+
feed(chunk) { if (this._ui) this._ui.feed(chunk); }
|
|
50
|
+
endStream() { if (this._ui) this._ui.endStream(); }
|
|
51
|
+
connect(url, body) {
|
|
52
|
+
return this._ui ? this._ui.connect(url, body)
|
|
53
|
+
: Promise.reject(new Error('@jboltai/tokui-webc: element not connected yet'));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 注册 <tokui-view>(或自定义元素名)。
|
|
59
|
+
* SSR 环境下 customElements 不存在,会给出告警并返回类本身(不注册)。
|
|
60
|
+
* @param {string} [name='tokui-view'] 自定义元素名(须含连字符)
|
|
61
|
+
* @returns {typeof TokUIViewElement}
|
|
62
|
+
*/
|
|
63
|
+
export function defineTokuiElement(name) {
|
|
64
|
+
name = name || 'tokui-view';
|
|
65
|
+
if (typeof customElements === 'undefined') {
|
|
66
|
+
console.warn('@jboltai/tokui-webc: customElements 不可用(SSR?)。请在浏览器环境调用 defineTokuiElement()。');
|
|
67
|
+
return TokUIViewElement;
|
|
68
|
+
}
|
|
69
|
+
if (!customElements.get(name)) customElements.define(name, TokUIViewElement);
|
|
70
|
+
return TokUIViewElement;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { TokUIViewElement };
|
|
74
|
+
export default defineTokuiElement;
|