@mobile-reality/mdma-renderer-vanilla 0.2.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 +127 -0
- package/dist/components/ApprovalGateRenderer.d.ts +2 -0
- package/dist/components/ApprovalGateRenderer.d.ts.map +1 -0
- package/dist/components/ApprovalGateRenderer.js +43 -0
- package/dist/components/ApprovalGateRenderer.js.map +1 -0
- package/dist/components/ButtonRenderer.d.ts +2 -0
- package/dist/components/ButtonRenderer.d.ts.map +1 -0
- package/dist/components/ButtonRenderer.js +23 -0
- package/dist/components/ButtonRenderer.js.map +1 -0
- package/dist/components/CalloutRenderer.d.ts +2 -0
- package/dist/components/CalloutRenderer.d.ts.map +1 -0
- package/dist/components/CalloutRenderer.js +33 -0
- package/dist/components/CalloutRenderer.js.map +1 -0
- package/dist/components/ChartRenderer.d.ts +3 -0
- package/dist/components/ChartRenderer.d.ts.map +1 -0
- package/dist/components/ChartRenderer.js +52 -0
- package/dist/components/ChartRenderer.js.map +1 -0
- package/dist/components/CustomRenderer.d.ts +8 -0
- package/dist/components/CustomRenderer.d.ts.map +1 -0
- package/dist/components/CustomRenderer.js +51 -0
- package/dist/components/CustomRenderer.js.map +1 -0
- package/dist/components/FormRenderer.d.ts +8 -0
- package/dist/components/FormRenderer.d.ts.map +1 -0
- package/dist/components/FormRenderer.js +149 -0
- package/dist/components/FormRenderer.js.map +1 -0
- package/dist/components/MdmaBlockLoading.d.ts +11 -0
- package/dist/components/MdmaBlockLoading.d.ts.map +1 -0
- package/dist/components/MdmaBlockLoading.js +26 -0
- package/dist/components/MdmaBlockLoading.js.map +1 -0
- package/dist/components/TableRenderer.d.ts +2 -0
- package/dist/components/TableRenderer.d.ts.map +1 -0
- package/dist/components/TableRenderer.js +66 -0
- package/dist/components/TableRenderer.js.map +1 -0
- package/dist/components/TasklistRenderer.d.ts +7 -0
- package/dist/components/TasklistRenderer.d.ts.map +1 -0
- package/dist/components/TasklistRenderer.js +80 -0
- package/dist/components/TasklistRenderer.js.map +1 -0
- package/dist/components/ThinkingRenderer.d.ts +3 -0
- package/dist/components/ThinkingRenderer.d.ts.map +1 -0
- package/dist/components/ThinkingRenderer.js +36 -0
- package/dist/components/ThinkingRenderer.js.map +1 -0
- package/dist/components/WebhookRenderer.d.ts +2 -0
- package/dist/components/WebhookRenderer.d.ts.map +1 -0
- package/dist/components/WebhookRenderer.js +33 -0
- package/dist/components/WebhookRenderer.js.map +1 -0
- package/dist/components/form/default-elements.d.ts +10 -0
- package/dist/components/form/default-elements.d.ts.map +1 -0
- package/dist/components/form/default-elements.js +198 -0
- package/dist/components/form/default-elements.js.map +1 -0
- package/dist/components/form/element-props.d.ts +58 -0
- package/dist/components/form/element-props.d.ts.map +1 -0
- package/dist/components/form/element-props.js +2 -0
- package/dist/components/form/element-props.js.map +1 -0
- package/dist/context/render-context.d.ts +40 -0
- package/dist/context/render-context.d.ts.map +1 -0
- package/dist/context/render-context.js +7 -0
- package/dist/context/render-context.js.map +1 -0
- package/dist/document/mount-block.d.ts +19 -0
- package/dist/document/mount-block.d.ts.map +1 -0
- package/dist/document/mount-block.js +31 -0
- package/dist/document/mount-block.js.map +1 -0
- package/dist/document/mount-document.d.ts +33 -0
- package/dist/document/mount-document.d.ts.map +1 -0
- package/dist/document/mount-document.js +177 -0
- package/dist/document/mount-document.js.map +1 -0
- package/dist/document/partial-yaml.d.ts +10 -0
- package/dist/document/partial-yaml.d.ts.map +1 -0
- package/dist/document/partial-yaml.js +48 -0
- package/dist/document/partial-yaml.js.map +1 -0
- package/dist/dom/el.d.ts +26 -0
- package/dist/dom/el.d.ts.map +1 -0
- package/dist/dom/el.js +59 -0
- package/dist/dom/el.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/render-mdast.d.ts +21 -0
- package/dist/markdown/render-mdast.d.ts.map +1 -0
- package/dist/markdown/render-mdast.js +89 -0
- package/dist/markdown/render-mdast.js.map +1 -0
- package/dist/renderers/renderer-props.d.ts +41 -0
- package/dist/renderers/renderer-props.d.ts.map +1 -0
- package/dist/renderers/renderer-props.js +31 -0
- package/dist/renderers/renderer-props.js.map +1 -0
- package/dist/renderers/renderer-registry.d.ts +14 -0
- package/dist/renderers/renderer-registry.d.ts.map +1 -0
- package/dist/renderers/renderer-registry.js +48 -0
- package/dist/renderers/renderer-registry.js.map +1 -0
- package/dist/theme/theme.d.ts +68 -0
- package/dist/theme/theme.d.ts.map +1 -0
- package/dist/theme/theme.js +120 -0
- package/dist/theme/theme.js.map +1 -0
- package/package.json +56 -0
- package/styles.css +1045 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ComponentState } from '@mobile-reality/mdma-runtime';
|
|
2
|
+
import type { CustomComponent, StoreAction } from '@mobile-reality/mdma-spec';
|
|
3
|
+
/** Named option lists a form select can reference by string (`options: countries`). */
|
|
4
|
+
export type DataSources = Record<string, Array<{
|
|
5
|
+
label: string;
|
|
6
|
+
value: string;
|
|
7
|
+
}>>;
|
|
8
|
+
/** A mounted sub-element (a form input, a submit button) that can be re-fed props. */
|
|
9
|
+
export interface ElementInstance<TProps> {
|
|
10
|
+
el: HTMLElement;
|
|
11
|
+
update(props: TProps): void;
|
|
12
|
+
}
|
|
13
|
+
export type ElementRenderer<TProps> = (props: TProps) => ElementInstance<TProps>;
|
|
14
|
+
/**
|
|
15
|
+
* Scoped element overrides, keyed by scope (`'*'` global, `'form'` form-only)
|
|
16
|
+
* then by element name. Resolution: scope → `'*'` → built-in default.
|
|
17
|
+
*/
|
|
18
|
+
export type ElementOverrides = Record<string, Record<string, ElementRenderer<never>>>;
|
|
19
|
+
export interface CustomVariantProps {
|
|
20
|
+
component: CustomComponent;
|
|
21
|
+
props: Record<string, unknown>;
|
|
22
|
+
componentState: ComponentState | undefined;
|
|
23
|
+
dispatch: (action: StoreAction) => void;
|
|
24
|
+
resolveBinding: (expr: string) => unknown;
|
|
25
|
+
}
|
|
26
|
+
export type CustomVariantRenderer = (props: CustomVariantProps) => ElementInstance<CustomVariantProps>;
|
|
27
|
+
/** Map of a `custom` component's `name` to the variant that draws it. */
|
|
28
|
+
export type CustomVariants = Record<string, CustomVariantRenderer>;
|
|
29
|
+
/**
|
|
30
|
+
* Host customizations, passed explicitly down the render tree. The framework
|
|
31
|
+
* renderers use context/provide-inject for this; without a framework an ordinary
|
|
32
|
+
* argument is clearer and keeps every renderer a pure function of its inputs.
|
|
33
|
+
*/
|
|
34
|
+
export interface RenderContext {
|
|
35
|
+
dataSources?: DataSources;
|
|
36
|
+
elementOverrides?: ElementOverrides;
|
|
37
|
+
customVariants?: CustomVariants;
|
|
38
|
+
}
|
|
39
|
+
export declare function resolveElementOverride<TProps>(context: RenderContext, scope: string, element: string): ElementRenderer<TProps> | undefined;
|
|
40
|
+
//# sourceMappingURL=render-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-context.d.ts","sourceRoot":"","sources":["../../src/context/render-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE9E,uFAAuF;AACvF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAElF,sFAAsF;AACtF,MAAM,WAAW,eAAe,CAAC,MAAM;IACrC,EAAE,EAAE,WAAW,CAAC;IAChB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC,CAAC;AAEjF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEtF,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,kBAAkB,KACtB,eAAe,CAAC,kBAAkB,CAAC,CAAC;AAEzC,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAEnE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAC3C,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAMrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-context.js","sourceRoot":"","sources":["../../src/context/render-context.ts"],"names":[],"mappings":"AA8CA,MAAM,UAAU,sBAAsB,CACpC,OAAsB,EACtB,KAAa,EACb,OAAe;IAEf,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAC3C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAEnD,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DocumentStore } from '@mobile-reality/mdma-runtime';
|
|
2
|
+
import type { MdmaBlock } from '@mobile-reality/mdma-spec';
|
|
3
|
+
import type { RenderContext } from '../context/render-context.js';
|
|
4
|
+
import type { MdmaBlockRenderer, MdmaBlockRendererProps, RendererInstance } from '../renderers/renderer-props.js';
|
|
5
|
+
export interface MountBlockOptions {
|
|
6
|
+
block: MdmaBlock;
|
|
7
|
+
store: DocumentStore;
|
|
8
|
+
/** Host renderer overrides, tried before the built-ins. */
|
|
9
|
+
renderers?: Record<string, MdmaBlockRenderer>;
|
|
10
|
+
context?: RenderContext;
|
|
11
|
+
}
|
|
12
|
+
export declare function blockRendererProps(options: MountBlockOptions): MdmaBlockRendererProps;
|
|
13
|
+
/**
|
|
14
|
+
* Mount one parsed MDMA block: look up the renderer for its component type
|
|
15
|
+
* (host-supplied first, then the built-ins) and hand it the component, its
|
|
16
|
+
* state, and the store callbacks.
|
|
17
|
+
*/
|
|
18
|
+
export declare function mountMdmaBlock(options: MountBlockOptions): RendererInstance;
|
|
19
|
+
//# sourceMappingURL=mount-block.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-block.d.ts","sourceRoot":"","sources":["../../src/document/mount-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,gCAAgC,CAAC;AAGxC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,sBAAsB,CASrF;AAKD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAa3E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { el } from '../dom/el.js';
|
|
2
|
+
import { defaultRenderers } from '../renderers/renderer-registry.js';
|
|
3
|
+
export function blockRendererProps(options) {
|
|
4
|
+
const { block, store } = options;
|
|
5
|
+
return {
|
|
6
|
+
component: block.component,
|
|
7
|
+
componentState: store.getComponentState(block.component.id),
|
|
8
|
+
dispatch: (action) => store.dispatch(action),
|
|
9
|
+
resolveBinding: (expr) => store.resolveBinding(expr),
|
|
10
|
+
context: options.context ?? {},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const unknownType = (type) => el('div', { class: 'mdma-unknown-component' }, [`Unknown component type: ${type}`]);
|
|
14
|
+
/**
|
|
15
|
+
* Mount one parsed MDMA block: look up the renderer for its component type
|
|
16
|
+
* (host-supplied first, then the built-ins) and hand it the component, its
|
|
17
|
+
* state, and the store callbacks.
|
|
18
|
+
*/
|
|
19
|
+
export function mountMdmaBlock(options) {
|
|
20
|
+
const type = options.block.component.type;
|
|
21
|
+
const renderer = options.renderers?.[type] ?? defaultRenderers[type];
|
|
22
|
+
if (!renderer) {
|
|
23
|
+
const instance = {
|
|
24
|
+
el: unknownType(type),
|
|
25
|
+
update() { },
|
|
26
|
+
};
|
|
27
|
+
return instance;
|
|
28
|
+
}
|
|
29
|
+
return renderer(blockRendererProps(options));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=mount-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-block.js","sourceRoot":"","sources":["../../src/document/mount-block.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAMlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAUrE,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IAC3D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACjC,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3D,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;QACpD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CACnC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;AAEtF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAA0B;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAErE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,QAAQ,GAAqB;YACjC,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC;YACrB,MAAM,KAAI,CAAC;SACZ,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DocumentStore } from '@mobile-reality/mdma-runtime';
|
|
2
|
+
import { type MdmaRoot } from '@mobile-reality/mdma-spec';
|
|
3
|
+
import type { CustomVariants, DataSources, ElementRenderer } from '../context/render-context.js';
|
|
4
|
+
import type { MdmaBlockRenderer } from '../renderers/renderer-props.js';
|
|
5
|
+
import { type MdmaThemeInput } from '../theme/theme.js';
|
|
6
|
+
/**
|
|
7
|
+
* A component entry is either a renderer, or a config object carrying a renderer
|
|
8
|
+
* and/or sub-element overrides (form inputs, the submit button, …).
|
|
9
|
+
*/
|
|
10
|
+
export type ComponentEntry = MdmaBlockRenderer | {
|
|
11
|
+
renderer?: MdmaBlockRenderer;
|
|
12
|
+
elements?: Record<string, ElementRenderer<never>>;
|
|
13
|
+
};
|
|
14
|
+
export interface MdmaRenderCustomizations {
|
|
15
|
+
components?: Record<string, ComponentEntry>;
|
|
16
|
+
customVariants?: CustomVariants;
|
|
17
|
+
dataSources?: DataSources;
|
|
18
|
+
}
|
|
19
|
+
export interface MdmaDocumentOptions {
|
|
20
|
+
ast: MdmaRoot;
|
|
21
|
+
store: DocumentStore;
|
|
22
|
+
customizations?: MdmaRenderCustomizations;
|
|
23
|
+
theme?: MdmaThemeInput;
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface MdmaDocumentHandle {
|
|
27
|
+
el: HTMLElement;
|
|
28
|
+
/** Apply a new AST, store, customizations, or theme. Omitted fields are kept. */
|
|
29
|
+
update(next: Partial<MdmaDocumentOptions>): void;
|
|
30
|
+
destroy(): void;
|
|
31
|
+
}
|
|
32
|
+
export declare function mountMdmaDocument(container: HTMLElement, options: MdmaDocumentOptions): MdmaDocumentHandle;
|
|
33
|
+
//# sourceMappingURL=mount-document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-document.d.ts","sourceRoot":"","sources":["../../src/document/mount-document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAiC,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEzF,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EAEX,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiC,MAAM,mBAAmB,CAAC;AAQvF;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB;IAAE,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;CAAE,CAAC;AAExF,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,aAAa,CAAC;IACrB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,WAAW,CAAC;IAChB,iFAAiF;IACjF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB;AA4CD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CA0KpB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { MDMA_LANG_TAG } from '@mobile-reality/mdma-spec';
|
|
2
|
+
import { renderBlockLoading } from '../components/MdmaBlockLoading.js';
|
|
3
|
+
import { el } from '../dom/el.js';
|
|
4
|
+
import { renderMdast } from '../markdown/render-mdast.js';
|
|
5
|
+
import { applyTheme, resolveThemeProps } from '../theme/theme.js';
|
|
6
|
+
import { blockRendererProps, mountMdmaBlock } from './mount-block.js';
|
|
7
|
+
import { buildPartialThinkingBlock, extractIdFromYaml, extractTypeFromYaml, } from './partial-yaml.js';
|
|
8
|
+
function isMdmaBlock(node) {
|
|
9
|
+
return node?.type === 'mdmaBlock';
|
|
10
|
+
}
|
|
11
|
+
/** A `lang="mdma"` code node that never became a block — still streaming, or invalid. */
|
|
12
|
+
function isPendingMdmaBlock(node) {
|
|
13
|
+
const candidate = node;
|
|
14
|
+
return candidate?.type === 'code' && candidate?.lang === MDMA_LANG_TAG;
|
|
15
|
+
}
|
|
16
|
+
function splitComponents(components) {
|
|
17
|
+
const renderers = {};
|
|
18
|
+
const elementOverrides = {};
|
|
19
|
+
for (const [type, entry] of Object.entries(components ?? {})) {
|
|
20
|
+
if (typeof entry === 'function') {
|
|
21
|
+
renderers[type] = entry;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (entry.renderer)
|
|
25
|
+
renderers[type] = entry.renderer;
|
|
26
|
+
if (entry.elements)
|
|
27
|
+
elementOverrides[type] = entry.elements;
|
|
28
|
+
}
|
|
29
|
+
return { renderers, elementOverrides };
|
|
30
|
+
}
|
|
31
|
+
export function mountMdmaDocument(container, options) {
|
|
32
|
+
let current = options;
|
|
33
|
+
const root = el('div');
|
|
34
|
+
const slots = new Map();
|
|
35
|
+
// Once a block has parsed, keep it: while streaming, a completed fence can
|
|
36
|
+
// briefly revert to a pending code node as later text arrives, and falling
|
|
37
|
+
// back to the loading skeleton would make the document flicker.
|
|
38
|
+
const lastGood = new Map();
|
|
39
|
+
let renderers = {};
|
|
40
|
+
let context = {};
|
|
41
|
+
function applyOptions() {
|
|
42
|
+
const split = splitComponents(current.customizations?.components);
|
|
43
|
+
renderers = split.renderers;
|
|
44
|
+
context = {
|
|
45
|
+
dataSources: current.customizations?.dataSources,
|
|
46
|
+
customVariants: current.customizations?.customVariants,
|
|
47
|
+
elementOverrides: Object.keys(split.elementOverrides).length
|
|
48
|
+
? split.elementOverrides
|
|
49
|
+
: undefined,
|
|
50
|
+
};
|
|
51
|
+
root.className = `mdma-document ${current.className ?? ''}`.trim();
|
|
52
|
+
applyTheme(root, resolveThemeProps(current.theme));
|
|
53
|
+
}
|
|
54
|
+
// Keyed by type as well as id: mid-stream a truncated type (`approval-gat`)
|
|
55
|
+
// completes into a different one, and that block must be re-mounted with the
|
|
56
|
+
// renderer the new type resolves to, not updated in the old one.
|
|
57
|
+
const blockKey = (block) => `block:${block.component.id}:${block.component.type}`;
|
|
58
|
+
function planChild(child, index) {
|
|
59
|
+
if (isMdmaBlock(child)) {
|
|
60
|
+
lastGood.set(child.component.id, child);
|
|
61
|
+
return { key: blockKey(child), kind: 'block', block: child };
|
|
62
|
+
}
|
|
63
|
+
if (isPendingMdmaBlock(child)) {
|
|
64
|
+
const yaml = child.value;
|
|
65
|
+
const id = extractIdFromYaml(yaml);
|
|
66
|
+
const cached = id ? lastGood.get(id) : undefined;
|
|
67
|
+
if (cached)
|
|
68
|
+
return { key: blockKey(cached), kind: 'block', block: cached };
|
|
69
|
+
// A thinking block streams its content live rather than showing a skeleton.
|
|
70
|
+
if (extractTypeFromYaml(yaml) === 'thinking' && yaml) {
|
|
71
|
+
const partial = buildPartialThinkingBlock(yaml);
|
|
72
|
+
if (partial)
|
|
73
|
+
return { key: blockKey(partial), kind: 'block', block: partial };
|
|
74
|
+
}
|
|
75
|
+
return { key: `loading:${index}`, kind: 'loading', pending: child };
|
|
76
|
+
}
|
|
77
|
+
return { key: `markdown:${index}`, kind: 'markdown', markdown: child };
|
|
78
|
+
}
|
|
79
|
+
function createSlot(desired) {
|
|
80
|
+
if (desired.kind === 'block' && desired.block) {
|
|
81
|
+
const instance = mountMdmaBlock({
|
|
82
|
+
block: desired.block,
|
|
83
|
+
store: current.store,
|
|
84
|
+
renderers,
|
|
85
|
+
context,
|
|
86
|
+
});
|
|
87
|
+
return { kind: 'block', el: instance.el, instance };
|
|
88
|
+
}
|
|
89
|
+
if (desired.kind === 'loading') {
|
|
90
|
+
return { kind: 'loading', el: renderBlockLoading(desired.pending ?? {}) };
|
|
91
|
+
}
|
|
92
|
+
return { kind: 'markdown', el: renderMdast(desired.markdown ?? { type: 'text' }) };
|
|
93
|
+
}
|
|
94
|
+
function updateSlot(slot, desired) {
|
|
95
|
+
if (desired.kind === 'block' && desired.block && slot.instance) {
|
|
96
|
+
slot.instance.update(blockRendererProps({
|
|
97
|
+
block: desired.block,
|
|
98
|
+
store: current.store,
|
|
99
|
+
renderers,
|
|
100
|
+
context,
|
|
101
|
+
}));
|
|
102
|
+
slot.el = slot.instance.el;
|
|
103
|
+
return slot;
|
|
104
|
+
}
|
|
105
|
+
// Markdown and skeletons hold no state worth preserving — rebuild them.
|
|
106
|
+
const rebuilt = createSlot(desired);
|
|
107
|
+
slot.el.replaceWith(rebuilt.el);
|
|
108
|
+
return rebuilt;
|
|
109
|
+
}
|
|
110
|
+
// A repeated id would otherwise share one slot between two positions, and the
|
|
111
|
+
// second insertBefore would move that node out of the first — blurring it.
|
|
112
|
+
// The first occurrence keeps the bare key so it stays stable as prose shifts it.
|
|
113
|
+
function planChildren() {
|
|
114
|
+
const occurrences = new Map();
|
|
115
|
+
return current.ast.children.map((child, index) => {
|
|
116
|
+
const entry = planChild(child, index);
|
|
117
|
+
if (entry.kind !== 'block')
|
|
118
|
+
return entry;
|
|
119
|
+
const seenBefore = occurrences.get(entry.key) ?? 0;
|
|
120
|
+
occurrences.set(entry.key, seenBefore + 1);
|
|
121
|
+
return seenBefore === 0 ? entry : { ...entry, key: `${entry.key}#${seenBefore}` };
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function render() {
|
|
125
|
+
const desired = planChildren();
|
|
126
|
+
const seen = new Set();
|
|
127
|
+
for (const entry of desired) {
|
|
128
|
+
seen.add(entry.key);
|
|
129
|
+
const existing = slots.get(entry.key);
|
|
130
|
+
slots.set(entry.key, existing && existing.kind === entry.kind ? updateSlot(existing, entry) : createSlot(entry));
|
|
131
|
+
}
|
|
132
|
+
for (const [key, slot] of slots) {
|
|
133
|
+
if (seen.has(key))
|
|
134
|
+
continue;
|
|
135
|
+
slot.instance?.destroy?.();
|
|
136
|
+
slot.el.remove();
|
|
137
|
+
slots.delete(key);
|
|
138
|
+
}
|
|
139
|
+
// Insert only where the order actually differs. Re-appending a node that is
|
|
140
|
+
// already in place would detach it, and detaching blurs a focused input.
|
|
141
|
+
desired.forEach((entry, index) => {
|
|
142
|
+
const node = slots.get(entry.key)?.el;
|
|
143
|
+
if (!node)
|
|
144
|
+
return;
|
|
145
|
+
if (root.childNodes[index] !== node)
|
|
146
|
+
root.insertBefore(node, root.childNodes[index] ?? null);
|
|
147
|
+
});
|
|
148
|
+
while (root.childNodes.length > desired.length) {
|
|
149
|
+
root.removeChild(root.lastChild);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
let unsubscribe = current.store.subscribe(() => render());
|
|
153
|
+
applyOptions();
|
|
154
|
+
render();
|
|
155
|
+
container.appendChild(root);
|
|
156
|
+
return {
|
|
157
|
+
el: root,
|
|
158
|
+
update(next) {
|
|
159
|
+
const storeChanged = next.store !== undefined && next.store !== current.store;
|
|
160
|
+
current = { ...current, ...next };
|
|
161
|
+
if (storeChanged) {
|
|
162
|
+
unsubscribe();
|
|
163
|
+
unsubscribe = current.store.subscribe(() => render());
|
|
164
|
+
}
|
|
165
|
+
applyOptions();
|
|
166
|
+
render();
|
|
167
|
+
},
|
|
168
|
+
destroy() {
|
|
169
|
+
unsubscribe();
|
|
170
|
+
for (const slot of slots.values())
|
|
171
|
+
slot.instance?.destroy?.();
|
|
172
|
+
slots.clear();
|
|
173
|
+
root.remove();
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=mount-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-document.js","sourceRoot":"","sources":["../../src/document/mount-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MdmaBlock } from '@mobile-reality/mdma-spec';
|
|
2
|
+
export declare function extractIdFromYaml(yaml?: string): string | null;
|
|
3
|
+
export declare function extractTypeFromYaml(yaml?: string): string | null;
|
|
4
|
+
/**
|
|
5
|
+
* Build a synthetic `thinking` block from still-streaming YAML, so its content
|
|
6
|
+
* appears live instead of sitting behind a loading skeleton. Returns null when
|
|
7
|
+
* the fence hasn't produced an id yet.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildPartialThinkingBlock(yaml: string): MdmaBlock | null;
|
|
10
|
+
//# sourceMappingURL=partial-yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partial-yaml.d.ts","sourceRoot":"","sources":["../../src/document/partial-yaml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE;AAkBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAmBxE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function extractIdFromYaml(yaml) {
|
|
2
|
+
const match = yaml?.match(/^\s*id:\s*(\S+)/m);
|
|
3
|
+
return match ? match[1] : null;
|
|
4
|
+
}
|
|
5
|
+
export function extractTypeFromYaml(yaml) {
|
|
6
|
+
const match = yaml?.match(/^\s*type:\s*(\S+)/m);
|
|
7
|
+
return match ? match[1] : null;
|
|
8
|
+
}
|
|
9
|
+
function extractContent(yaml) {
|
|
10
|
+
const block = yaml.match(/^\s*content:\s*\|\s*\n([\s\S]*)$/m);
|
|
11
|
+
if (block) {
|
|
12
|
+
const lines = [];
|
|
13
|
+
for (const line of block[1].split('\n')) {
|
|
14
|
+
// A non-indented non-empty line starts a new YAML key — stop there.
|
|
15
|
+
if (line.length > 0 && !line.startsWith(' ') && !line.startsWith('\t'))
|
|
16
|
+
break;
|
|
17
|
+
lines.push(line.replace(/^ {1,2}/, ''));
|
|
18
|
+
}
|
|
19
|
+
return lines.join('\n').trimEnd();
|
|
20
|
+
}
|
|
21
|
+
const inline = yaml.match(/^\s*content:\s*(?:"([^"]*)"|'([^']*)'|(.+))$/m);
|
|
22
|
+
return inline ? (inline[1] ?? inline[2] ?? inline[3] ?? '').trim() : '';
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build a synthetic `thinking` block from still-streaming YAML, so its content
|
|
26
|
+
* appears live instead of sitting behind a loading skeleton. Returns null when
|
|
27
|
+
* the fence hasn't produced an id yet.
|
|
28
|
+
*/
|
|
29
|
+
export function buildPartialThinkingBlock(yaml) {
|
|
30
|
+
const id = extractIdFromYaml(yaml);
|
|
31
|
+
if (!id)
|
|
32
|
+
return null;
|
|
33
|
+
const labelMatch = yaml.match(/^\s*label:\s*(.+)$/m);
|
|
34
|
+
const label = labelMatch ? labelMatch[1].trim() : undefined;
|
|
35
|
+
return {
|
|
36
|
+
type: 'mdmaBlock',
|
|
37
|
+
rawYaml: yaml,
|
|
38
|
+
component: {
|
|
39
|
+
type: 'thinking',
|
|
40
|
+
id,
|
|
41
|
+
content: extractContent(yaml) || '...',
|
|
42
|
+
status: 'thinking',
|
|
43
|
+
collapsed: false,
|
|
44
|
+
...(label ? { label } : {}),
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=partial-yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partial-yaml.js","sourceRoot":"","sources":["../../src/document/partial-yaml.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC9D,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,oEAAoE;YACpE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,MAAM;YAC9E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAErB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE;YACT,IAAI,EAAE,UAAU;YAChB,EAAE;YACF,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK;YACtC,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,KAAK;YAChB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B;KACW,CAAC;AACjB,CAAC"}
|
package/dist/dom/el.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type Child = Node | string | number | false | null | undefined;
|
|
2
|
+
export interface ElementProps {
|
|
3
|
+
class?: string;
|
|
4
|
+
style?: Record<string, string>;
|
|
5
|
+
dataset?: Record<string, string | undefined>;
|
|
6
|
+
on?: Record<string, (event: Event) => void>;
|
|
7
|
+
/** Anything else is set as an attribute; `undefined` and `false` are skipped. */
|
|
8
|
+
[attribute: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create an element with attributes, inline styles, and listeners. Attributes
|
|
12
|
+
* are used rather than DOM properties so the output matches what the `.mdma-*`
|
|
13
|
+
* stylesheet and the framework renderers' markup expect.
|
|
14
|
+
*/
|
|
15
|
+
export declare function el<K extends keyof HTMLElementTagNameMap>(tag: K, props?: ElementProps, children?: Child[]): HTMLElementTagNameMap[K];
|
|
16
|
+
export declare function append(parent: Node, children: Child[]): void;
|
|
17
|
+
export declare function clear(node: Node): void;
|
|
18
|
+
/**
|
|
19
|
+
* Write a value into an input without disturbing the user. Skipped entirely
|
|
20
|
+
* while the field has focus: a streamed re-render must never move the caret or
|
|
21
|
+
* clobber what is being typed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function setInputValue(input: HTMLInputElement | HTMLTextAreaElement, value: string): void;
|
|
24
|
+
/** Resolved from the node's own root so the check also holds inside a shadow root. */
|
|
25
|
+
export declare function isFocused(node: Element): boolean;
|
|
26
|
+
//# sourceMappingURL=el.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"el.d.ts","sourceRoot":"","sources":["../../src/dom/el.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;IAC5C,iFAAiF;IACjF,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAID;;;;GAIG;AACH,wBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACtD,GAAG,EAAE,CAAC,EACN,KAAK,GAAE,YAAiB,EACxB,QAAQ,GAAE,KAAK,EAAO,GACrB,qBAAqB,CAAC,CAAC,CAAC,CA0B1B;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAK5D;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGhG;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAGhD"}
|
package/dist/dom/el.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const SPECIAL = new Set(['class', 'style', 'dataset', 'on']);
|
|
2
|
+
/**
|
|
3
|
+
* Create an element with attributes, inline styles, and listeners. Attributes
|
|
4
|
+
* are used rather than DOM properties so the output matches what the `.mdma-*`
|
|
5
|
+
* stylesheet and the framework renderers' markup expect.
|
|
6
|
+
*/
|
|
7
|
+
export function el(tag, props = {}, children = []) {
|
|
8
|
+
const node = document.createElement(tag);
|
|
9
|
+
if (props.class)
|
|
10
|
+
node.className = props.class;
|
|
11
|
+
if (props.style) {
|
|
12
|
+
for (const [key, value] of Object.entries(props.style))
|
|
13
|
+
node.style.setProperty(key, value);
|
|
14
|
+
}
|
|
15
|
+
if (props.dataset) {
|
|
16
|
+
for (const [key, value] of Object.entries(props.dataset)) {
|
|
17
|
+
if (value !== undefined)
|
|
18
|
+
node.setAttribute(`data-${key}`, value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (props.on) {
|
|
22
|
+
for (const [type, handler] of Object.entries(props.on))
|
|
23
|
+
node.addEventListener(type, handler);
|
|
24
|
+
}
|
|
25
|
+
for (const [key, value] of Object.entries(props)) {
|
|
26
|
+
if (SPECIAL.has(key) || value === undefined || value === false || value === null)
|
|
27
|
+
continue;
|
|
28
|
+
node.setAttribute(key, value === true ? '' : String(value));
|
|
29
|
+
}
|
|
30
|
+
append(node, children);
|
|
31
|
+
return node;
|
|
32
|
+
}
|
|
33
|
+
export function append(parent, children) {
|
|
34
|
+
for (const child of children) {
|
|
35
|
+
if (child === null || child === undefined || child === false)
|
|
36
|
+
continue;
|
|
37
|
+
parent.appendChild(typeof child === 'object' ? child : document.createTextNode(String(child)));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function clear(node) {
|
|
41
|
+
while (node.firstChild)
|
|
42
|
+
node.removeChild(node.firstChild);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Write a value into an input without disturbing the user. Skipped entirely
|
|
46
|
+
* while the field has focus: a streamed re-render must never move the caret or
|
|
47
|
+
* clobber what is being typed.
|
|
48
|
+
*/
|
|
49
|
+
export function setInputValue(input, value) {
|
|
50
|
+
if (input.value === value || isFocused(input))
|
|
51
|
+
return;
|
|
52
|
+
input.value = value;
|
|
53
|
+
}
|
|
54
|
+
/** Resolved from the node's own root so the check also holds inside a shadow root. */
|
|
55
|
+
export function isFocused(node) {
|
|
56
|
+
const root = node.getRootNode();
|
|
57
|
+
return root.activeElement === node;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=el.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"el.js","sourceRoot":"","sources":["../../src/dom/el.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { mountMdmaDocument, type ComponentEntry, type MdmaDocumentHandle, type MdmaDocumentOptions, type MdmaRenderCustomizations, } from './document/mount-document.js';
|
|
2
|
+
export { mountMdmaBlock, blockRendererProps, type MountBlockOptions, } from './document/mount-block.js';
|
|
3
|
+
export { extractIdFromYaml, extractTypeFromYaml, buildPartialThinkingBlock, } from './document/partial-yaml.js';
|
|
4
|
+
export { renderBlockLoading, extractTypeHint } from './components/MdmaBlockLoading.js';
|
|
5
|
+
export { renderMdast, type MdastNode } from './markdown/render-mdast.js';
|
|
6
|
+
export { stateless, withState, type MdmaBlockRenderer, type MdmaBlockRendererProps, type RendererInstance, } from './renderers/renderer-props.js';
|
|
7
|
+
export { RendererRegistry, createRendererRegistry, defaultRenderers, } from './renderers/renderer-registry.js';
|
|
8
|
+
export { resolveElementOverride, type CustomVariantProps, type CustomVariantRenderer, type CustomVariants, type DataSources, type ElementInstance, type ElementOverrides, type ElementRenderer, type RenderContext, } from './context/render-context.js';
|
|
9
|
+
export { applyTheme, darkTheme, lightTheme, resolveThemeProps, themeToCssVars, type MdmaTheme, type MdmaThemeInput, type ResolvedThemeProps, } from './theme/theme.js';
|
|
10
|
+
export { el, append, clear, setInputValue, type Child, type ElementProps } from './dom/el.js';
|
|
11
|
+
export { ApprovalGateRenderer } from './components/ApprovalGateRenderer.js';
|
|
12
|
+
export { ButtonRenderer } from './components/ButtonRenderer.js';
|
|
13
|
+
export { CalloutRenderer } from './components/CalloutRenderer.js';
|
|
14
|
+
export { ChartRenderer } from './components/ChartRenderer.js';
|
|
15
|
+
export { CustomRenderer } from './components/CustomRenderer.js';
|
|
16
|
+
export { FormRenderer } from './components/FormRenderer.js';
|
|
17
|
+
export { TableRenderer } from './components/TableRenderer.js';
|
|
18
|
+
export { TasklistRenderer } from './components/TasklistRenderer.js';
|
|
19
|
+
export { ThinkingRenderer } from './components/ThinkingRenderer.js';
|
|
20
|
+
export { WebhookRenderer } from './components/WebhookRenderer.js';
|
|
21
|
+
export type { FormCheckboxElementProps, FormFileElementProps, FormInputElementProps, FormSelectElementProps, FormSensitiveIndicatorElementProps, FormSubmitElementProps, FormTextareaElementProps, } from './components/form/element-props.js';
|
|
22
|
+
export { DefaultCheckbox, DefaultFile, DefaultInput, DefaultSelect, DefaultSensitiveIndicator, DefaultSubmitButton, DefaultTextarea, } from './components/form/default-elements.js';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EACL,SAAS,EACT,SAAS,EACT,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,kCAAkC,EAClC,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,GAChB,MAAM,uCAAuC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export { mountMdmaDocument, } from './document/mount-document.js';
|
|
2
|
+
export { mountMdmaBlock, blockRendererProps, } from './document/mount-block.js';
|
|
3
|
+
export { extractIdFromYaml, extractTypeFromYaml, buildPartialThinkingBlock, } from './document/partial-yaml.js';
|
|
4
|
+
export { renderBlockLoading, extractTypeHint } from './components/MdmaBlockLoading.js';
|
|
5
|
+
export { renderMdast } from './markdown/render-mdast.js';
|
|
6
|
+
export { stateless, withState, } from './renderers/renderer-props.js';
|
|
7
|
+
export { RendererRegistry, createRendererRegistry, defaultRenderers, } from './renderers/renderer-registry.js';
|
|
8
|
+
export { resolveElementOverride, } from './context/render-context.js';
|
|
9
|
+
export { applyTheme, darkTheme, lightTheme, resolveThemeProps, themeToCssVars, } from './theme/theme.js';
|
|
10
|
+
export { el, append, clear, setInputValue } from './dom/el.js';
|
|
11
|
+
export { ApprovalGateRenderer } from './components/ApprovalGateRenderer.js';
|
|
12
|
+
export { ButtonRenderer } from './components/ButtonRenderer.js';
|
|
13
|
+
export { CalloutRenderer } from './components/CalloutRenderer.js';
|
|
14
|
+
export { ChartRenderer } from './components/ChartRenderer.js';
|
|
15
|
+
export { CustomRenderer } from './components/CustomRenderer.js';
|
|
16
|
+
export { FormRenderer } from './components/FormRenderer.js';
|
|
17
|
+
export { TableRenderer } from './components/TableRenderer.js';
|
|
18
|
+
export { TasklistRenderer } from './components/TasklistRenderer.js';
|
|
19
|
+
export { ThinkingRenderer } from './components/ThinkingRenderer.js';
|
|
20
|
+
export { WebhookRenderer } from './components/WebhookRenderer.js';
|
|
21
|
+
export { DefaultCheckbox, DefaultFile, DefaultInput, DefaultSelect, DefaultSensitiveIndicator, DefaultSubmitButton, DefaultTextarea, } from './components/form/default-elements.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAKlB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,cAAc,EACd,kBAAkB,GAEnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAkB,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EACL,SAAS,EACT,SAAS,GAIV,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,sBAAsB,GASvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,cAAc,GAIf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAiC,MAAM,aAAa,CAAC;AAE9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAWlE,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,GAChB,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loose node shape: mdast types vary, and during streaming an incomplete node
|
|
3
|
+
* can appear, so every branch degrades instead of throwing.
|
|
4
|
+
*/
|
|
5
|
+
export interface MdastNode {
|
|
6
|
+
type: string;
|
|
7
|
+
children?: MdastNode[];
|
|
8
|
+
value?: string;
|
|
9
|
+
depth?: number;
|
|
10
|
+
ordered?: boolean;
|
|
11
|
+
start?: number;
|
|
12
|
+
checked?: boolean | null;
|
|
13
|
+
lang?: string;
|
|
14
|
+
url?: string;
|
|
15
|
+
title?: string;
|
|
16
|
+
alt?: string;
|
|
17
|
+
align?: (string | null)[];
|
|
18
|
+
}
|
|
19
|
+
/** Render one standard Markdown node into its `.mdma-markdown-content` wrapper. */
|
|
20
|
+
export declare function renderMdast(node: MdastNode): HTMLElement;
|
|
21
|
+
//# sourceMappingURL=render-mdast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-mdast.d.ts","sourceRoot":"","sources":["../../src/markdown/render-mdast.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC3B;AAwHD,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAIxD"}
|