@tmorrow/cre8-wc 2.0.3 → 2.0.4
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/a2ui/catalog.json +5622 -0
- package/a2ui/demo.html +287 -0
- package/a2ui/generate-catalog.mjs +243 -0
- package/a2ui/index.d.ts +4 -0
- package/a2ui/index.js +2 -0
- package/a2ui/index.ts +12 -0
- package/a2ui/registry.d.ts +3 -0
- package/a2ui/registry.js +166 -0
- package/a2ui/registry.ts +182 -0
- package/a2ui/renderer.d.ts +7 -0
- package/a2ui/renderer.js +108 -0
- package/a2ui/renderer.ts +156 -0
- package/a2ui/smoke-test.mjs +238 -0
- package/a2ui/types.d.ts +75 -0
- package/a2ui/types.js +1 -0
- package/a2ui/types.ts +80 -0
- package/lib/a2ui/index.d.ts +5 -0
- package/lib/a2ui/index.d.ts.map +1 -0
- package/lib/a2ui/index.js +3 -0
- package/lib/a2ui/index.js.map +1 -0
- package/lib/a2ui/registry.d.ts +4 -0
- package/lib/a2ui/registry.d.ts.map +1 -0
- package/lib/a2ui/registry.js +167 -0
- package/lib/a2ui/registry.js.map +1 -0
- package/lib/a2ui/renderer.d.ts +8 -0
- package/lib/a2ui/renderer.d.ts.map +1 -0
- package/lib/a2ui/renderer.js +109 -0
- package/lib/a2ui/renderer.js.map +1 -0
- package/lib/a2ui/types.d.ts +76 -0
- package/lib/a2ui/types.d.ts.map +1 -0
- package/lib/a2ui/types.js +2 -0
- package/lib/a2ui/types.js.map +1 -0
- package/mcp-manifest.json +1 -1
- package/package.json +15 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { validateSpec } from './registry.js';
|
|
2
|
+
export function render(spec, catalog, options = {}) {
|
|
3
|
+
validateSpec(spec, catalog);
|
|
4
|
+
const doc = options.doc ?? document;
|
|
5
|
+
const el = buildElement(spec, catalog, doc, '$', options.onEvent);
|
|
6
|
+
if (options.root)
|
|
7
|
+
options.root.replaceChildren(el);
|
|
8
|
+
return el;
|
|
9
|
+
}
|
|
10
|
+
function buildElement(spec, catalog, doc, path, onEvent) {
|
|
11
|
+
const def = catalog.components.get(spec.component);
|
|
12
|
+
const propDefs = def.properties?.props?.properties ?? {};
|
|
13
|
+
const el = doc.createElement(spec.component);
|
|
14
|
+
if (spec.props) {
|
|
15
|
+
for (const [key, value] of Object.entries(spec.props)) {
|
|
16
|
+
applyProp(el, key, value, propDefs[key]);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (spec.events && onEvent) {
|
|
20
|
+
for (const [evtName, binding] of Object.entries(spec.events)) {
|
|
21
|
+
attachEvent(el, spec.component, path, evtName, binding, onEvent);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (spec.children) {
|
|
25
|
+
spec.children.forEach((child, i) => {
|
|
26
|
+
if (typeof child === 'string') {
|
|
27
|
+
el.appendChild(doc.createTextNode(child));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
el.appendChild(buildElement(child, catalog, doc, `${path}.children[${i}]`, onEvent));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (spec.slots) {
|
|
34
|
+
for (const [slotName, children] of Object.entries(spec.slots)) {
|
|
35
|
+
children.forEach((child, i) => {
|
|
36
|
+
if (typeof child === 'string') {
|
|
37
|
+
if (slotName === 'default') {
|
|
38
|
+
el.appendChild(doc.createTextNode(child));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const wrap = doc.createElement('span');
|
|
42
|
+
wrap.setAttribute('slot', slotName);
|
|
43
|
+
wrap.textContent = child;
|
|
44
|
+
el.appendChild(wrap);
|
|
45
|
+
}
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const childEl = buildElement(child, catalog, doc, `${path}.slots.${slotName}[${i}]`, onEvent);
|
|
49
|
+
if (slotName !== 'default')
|
|
50
|
+
childEl.setAttribute('slot', slotName);
|
|
51
|
+
el.appendChild(childEl);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return el;
|
|
56
|
+
}
|
|
57
|
+
function attachEvent(el, component, path, eventName, binding, onEvent) {
|
|
58
|
+
const handler = typeof binding === 'string' ? binding : binding.handler;
|
|
59
|
+
const stop = typeof binding === 'object' && binding.stopPropagation === true;
|
|
60
|
+
const prevent = typeof binding === 'object' && binding.preventDefault === true;
|
|
61
|
+
el.addEventListener(eventName, (nativeEvent) => {
|
|
62
|
+
if (stop)
|
|
63
|
+
nativeEvent.stopPropagation();
|
|
64
|
+
if (prevent)
|
|
65
|
+
nativeEvent.preventDefault();
|
|
66
|
+
const detail = 'detail' in nativeEvent
|
|
67
|
+
? nativeEvent.detail
|
|
68
|
+
: undefined;
|
|
69
|
+
onEvent({
|
|
70
|
+
component,
|
|
71
|
+
path,
|
|
72
|
+
event: eventName,
|
|
73
|
+
handler,
|
|
74
|
+
detail,
|
|
75
|
+
nativeEvent,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function applyProp(el, key, value, schema) {
|
|
80
|
+
if (value === undefined || value === null)
|
|
81
|
+
return;
|
|
82
|
+
if (schema?.['x-kind'] === 'property') {
|
|
83
|
+
el[key] = value;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (typeof value === 'boolean') {
|
|
87
|
+
if (value)
|
|
88
|
+
el.setAttribute(key, '');
|
|
89
|
+
else
|
|
90
|
+
el.removeAttribute(key);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (Array.isArray(value) || (typeof value === 'object' && value !== null)) {
|
|
94
|
+
el[key] = value;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (schema && isComplexSchema(schema)) {
|
|
98
|
+
el[key] = value;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
el.setAttribute(key, String(value));
|
|
102
|
+
}
|
|
103
|
+
function isComplexSchema(schema) {
|
|
104
|
+
const t = schema.type;
|
|
105
|
+
if (Array.isArray(t))
|
|
106
|
+
return t.some((x) => x === 'object' || x === 'array');
|
|
107
|
+
return t === 'object' || t === 'array';
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../a2ui/renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ComponentSpec,\n EmittedEvent,\n EventBinding,\n PropSchema,\n RegisteredCatalog,\n} from './types.js';\nimport { validateSpec } from './registry.js';\n\nexport interface RenderOptions {\n root?: HTMLElement;\n doc?: Document;\n onEvent?: (evt: EmittedEvent) => void;\n}\n\nexport function render(\n spec: ComponentSpec,\n catalog: RegisteredCatalog,\n options: RenderOptions = {}\n): HTMLElement {\n validateSpec(spec, catalog);\n const doc = options.doc ?? document;\n const el = buildElement(spec, catalog, doc, '$', options.onEvent);\n if (options.root) options.root.replaceChildren(el);\n return el;\n}\n\nfunction buildElement(\n spec: ComponentSpec,\n catalog: RegisteredCatalog,\n doc: Document,\n path: string,\n onEvent?: (evt: EmittedEvent) => void\n): HTMLElement {\n const def = catalog.components.get(spec.component)!;\n const propDefs = def.properties?.props?.properties ?? {};\n const el = doc.createElement(spec.component);\n\n if (spec.props) {\n for (const [key, value] of Object.entries(spec.props)) {\n applyProp(el, key, value, propDefs[key]);\n }\n }\n\n if (spec.events && onEvent) {\n for (const [evtName, binding] of Object.entries(spec.events)) {\n attachEvent(el, spec.component, path, evtName, binding, onEvent);\n }\n }\n\n if (spec.children) {\n spec.children.forEach((child, i) => {\n if (typeof child === 'string') {\n el.appendChild(doc.createTextNode(child));\n return;\n }\n el.appendChild(buildElement(child, catalog, doc, `${path}.children[${i}]`, onEvent));\n });\n }\n\n if (spec.slots) {\n for (const [slotName, children] of Object.entries(spec.slots)) {\n children.forEach((child, i) => {\n if (typeof child === 'string') {\n if (slotName === 'default') {\n el.appendChild(doc.createTextNode(child));\n } else {\n const wrap = doc.createElement('span');\n wrap.setAttribute('slot', slotName);\n wrap.textContent = child;\n el.appendChild(wrap);\n }\n return;\n }\n const childEl = buildElement(\n child,\n catalog,\n doc,\n `${path}.slots.${slotName}[${i}]`,\n onEvent\n );\n if (slotName !== 'default') childEl.setAttribute('slot', slotName);\n el.appendChild(childEl);\n });\n }\n }\n\n return el;\n}\n\nfunction attachEvent(\n el: HTMLElement,\n component: string,\n path: string,\n eventName: string,\n binding: EventBinding,\n onEvent: (evt: EmittedEvent) => void\n): void {\n const handler = typeof binding === 'string' ? binding : binding.handler;\n const stop = typeof binding === 'object' && binding.stopPropagation === true;\n const prevent = typeof binding === 'object' && binding.preventDefault === true;\n\n el.addEventListener(eventName, (nativeEvent) => {\n if (stop) nativeEvent.stopPropagation();\n if (prevent) nativeEvent.preventDefault();\n const detail = 'detail' in nativeEvent\n ? (nativeEvent as CustomEvent).detail\n : undefined;\n onEvent({\n component,\n path,\n event: eventName,\n handler,\n detail,\n nativeEvent,\n });\n });\n}\n\nfunction applyProp(\n el: HTMLElement,\n key: string,\n value: unknown,\n schema: PropSchema | undefined\n): void {\n if (value === undefined || value === null) return;\n\n if (schema?.['x-kind'] === 'property') {\n (el as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n if (typeof value === 'boolean') {\n if (value) el.setAttribute(key, '');\n else el.removeAttribute(key);\n return;\n }\n\n if (Array.isArray(value) || (typeof value === 'object' && value !== null)) {\n (el as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n if (schema && isComplexSchema(schema)) {\n (el as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n el.setAttribute(key, String(value));\n}\n\nfunction isComplexSchema(schema: PropSchema): boolean {\n const t = schema.type;\n if (Array.isArray(t)) return t.some((x) => x === 'object' || x === 'array');\n return t === 'object' || t === 'array';\n}\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export type SpecChild = ComponentSpec | string;
|
|
2
|
+
export interface ComponentSpec {
|
|
3
|
+
component: string;
|
|
4
|
+
props?: Record<string, unknown>;
|
|
5
|
+
children?: SpecChild[];
|
|
6
|
+
slots?: Record<string, SpecChild[]>;
|
|
7
|
+
events?: Record<string, EventBinding>;
|
|
8
|
+
}
|
|
9
|
+
export type EventBinding = string | {
|
|
10
|
+
handler: string;
|
|
11
|
+
stopPropagation?: boolean;
|
|
12
|
+
preventDefault?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export interface EmittedEvent {
|
|
15
|
+
component: string;
|
|
16
|
+
path: string;
|
|
17
|
+
event: string;
|
|
18
|
+
handler: string;
|
|
19
|
+
detail: unknown;
|
|
20
|
+
nativeEvent: Event;
|
|
21
|
+
}
|
|
22
|
+
export interface CatalogSchema {
|
|
23
|
+
$id?: string;
|
|
24
|
+
$defs?: {
|
|
25
|
+
components?: Record<string, CatalogComponentDef>;
|
|
26
|
+
};
|
|
27
|
+
'x-a2ui'?: {
|
|
28
|
+
catalogId?: string;
|
|
29
|
+
library?: string;
|
|
30
|
+
libraryVersion?: string;
|
|
31
|
+
tagPrefix?: string;
|
|
32
|
+
framework?: string;
|
|
33
|
+
};
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
export interface CatalogComponentDef {
|
|
37
|
+
title?: string;
|
|
38
|
+
description?: string;
|
|
39
|
+
'x-category'?: string;
|
|
40
|
+
'x-slot-descriptions'?: Record<string, string>;
|
|
41
|
+
'x-events'?: Record<string, {
|
|
42
|
+
detail?: unknown;
|
|
43
|
+
}>;
|
|
44
|
+
properties?: {
|
|
45
|
+
component?: {
|
|
46
|
+
const?: string;
|
|
47
|
+
};
|
|
48
|
+
props?: {
|
|
49
|
+
properties?: Record<string, PropSchema>;
|
|
50
|
+
};
|
|
51
|
+
children?: unknown;
|
|
52
|
+
slots?: {
|
|
53
|
+
properties?: Record<string, unknown>;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export interface PropSchema {
|
|
58
|
+
type?: string | string[];
|
|
59
|
+
enum?: string[];
|
|
60
|
+
const?: unknown;
|
|
61
|
+
default?: unknown;
|
|
62
|
+
description?: string;
|
|
63
|
+
items?: PropSchema;
|
|
64
|
+
properties?: Record<string, PropSchema>;
|
|
65
|
+
required?: string[];
|
|
66
|
+
additionalProperties?: boolean;
|
|
67
|
+
oneOf?: PropSchema[];
|
|
68
|
+
'x-tsType'?: string;
|
|
69
|
+
'x-kind'?: 'attribute' | 'property';
|
|
70
|
+
}
|
|
71
|
+
export interface RegisteredCatalog {
|
|
72
|
+
id: string;
|
|
73
|
+
schema: CatalogSchema;
|
|
74
|
+
components: Map<string, CatalogComponentDef>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../a2ui/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../a2ui/types.ts"],"names":[],"mappings":"","sourcesContent":["export type SpecChild = ComponentSpec | string;\n\nexport interface ComponentSpec {\n component: string;\n props?: Record<string, unknown>;\n children?: SpecChild[];\n slots?: Record<string, SpecChild[]>;\n events?: Record<string, EventBinding>;\n}\n\nexport type EventBinding =\n | string\n | {\n handler: string;\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n\nexport interface EmittedEvent {\n component: string;\n path: string;\n event: string;\n handler: string;\n detail: unknown;\n nativeEvent: Event;\n}\n\nexport interface CatalogSchema {\n $id?: string;\n $defs?: {\n components?: Record<string, CatalogComponentDef>;\n };\n 'x-a2ui'?: {\n catalogId?: string;\n library?: string;\n libraryVersion?: string;\n tagPrefix?: string;\n framework?: string;\n };\n [key: string]: unknown;\n}\n\nexport interface CatalogComponentDef {\n title?: string;\n description?: string;\n 'x-category'?: string;\n 'x-slot-descriptions'?: Record<string, string>;\n 'x-events'?: Record<string, { detail?: unknown }>;\n properties?: {\n component?: { const?: string };\n props?: {\n properties?: Record<string, PropSchema>;\n };\n children?: unknown;\n slots?: {\n properties?: Record<string, unknown>;\n };\n };\n}\n\nexport interface PropSchema {\n type?: string | string[];\n enum?: string[];\n const?: unknown;\n default?: unknown;\n description?: string;\n items?: PropSchema;\n properties?: Record<string, PropSchema>;\n required?: string[];\n additionalProperties?: boolean;\n oneOf?: PropSchema[];\n 'x-tsType'?: string;\n 'x-kind'?: 'attribute' | 'property';\n}\n\nexport interface RegisteredCatalog {\n id: string;\n schema: CatalogSchema;\n components: Map<string, CatalogComponentDef>;\n}\n"]}
|
package/mcp-manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tmorrow/cre8-wc",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "cre8 Web Components is a library of presentational UI web components to be consumed by # web applications.",
|
|
5
5
|
"license": "BSD-3-Clause",
|
|
6
6
|
"scripts": {
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
"build:mcp-manifest": "npx web-component-analyzer analyze \"components/*/*.ts\" --format json --outFile /tmp/wca-raw.json && npx tsx scripts/generate-mcp-manifest.ts",
|
|
11
11
|
"build:cdn": "rm -rf cdn && vite build --config vite.config.cdn.ts",
|
|
12
12
|
"build:react": "rm -rf react-wrappers/components react-wrappers/dist react-wrappers/index.ts && npx tsx scripts/generate-react-wrappers.ts && cd react-wrappers && npx tsc",
|
|
13
|
+
"build:a2ui": "pnpm run build:a2ui:catalog && pnpm run build:a2ui:compile",
|
|
14
|
+
"build:a2ui:catalog": "node a2ui/generate-catalog.mjs",
|
|
15
|
+
"build:a2ui:compile": "tsc --module esnext --moduleResolution bundler --target es2022 --lib es2022,dom,dom.iterable --strict --skipLibCheck --declaration --outDir a2ui a2ui/types.ts a2ui/registry.ts a2ui/renderer.ts a2ui/index.ts",
|
|
16
|
+
"a2ui:demo": "python3 -m http.server 8765",
|
|
13
17
|
"storybook:react": "pnpm run build:react && cd react-wrappers && npx storybook dev -p 9009",
|
|
14
18
|
"build-storybook:react": "pnpm run build:react && cd react-wrappers && npx storybook build -o dist-storybook",
|
|
15
19
|
"build:all": "pnpm run build:cdn && pnpm run build",
|
|
@@ -44,6 +48,7 @@
|
|
|
44
48
|
"dist",
|
|
45
49
|
"lib",
|
|
46
50
|
"cdn",
|
|
51
|
+
"a2ui",
|
|
47
52
|
"mcp-manifest.json"
|
|
48
53
|
],
|
|
49
54
|
"exports": {
|
|
@@ -74,6 +79,15 @@
|
|
|
74
79
|
},
|
|
75
80
|
"./global.d.ts": "./global.d.ts",
|
|
76
81
|
"./mcp-manifest.json": "./mcp-manifest.json",
|
|
82
|
+
"./a2ui": {
|
|
83
|
+
"import": "./a2ui/index.js",
|
|
84
|
+
"types": "./a2ui/index.d.ts"
|
|
85
|
+
},
|
|
86
|
+
"./a2ui/catalog.json": "./a2ui/catalog.json",
|
|
87
|
+
"./a2ui/*": {
|
|
88
|
+
"import": "./a2ui/*",
|
|
89
|
+
"types": "./a2ui/*"
|
|
90
|
+
},
|
|
77
91
|
"./package.json": "./package.json"
|
|
78
92
|
},
|
|
79
93
|
"repository": {
|