@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.
Files changed (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -0
  3. package/dist/components/ApprovalGateRenderer.d.ts +2 -0
  4. package/dist/components/ApprovalGateRenderer.d.ts.map +1 -0
  5. package/dist/components/ApprovalGateRenderer.js +43 -0
  6. package/dist/components/ApprovalGateRenderer.js.map +1 -0
  7. package/dist/components/ButtonRenderer.d.ts +2 -0
  8. package/dist/components/ButtonRenderer.d.ts.map +1 -0
  9. package/dist/components/ButtonRenderer.js +23 -0
  10. package/dist/components/ButtonRenderer.js.map +1 -0
  11. package/dist/components/CalloutRenderer.d.ts +2 -0
  12. package/dist/components/CalloutRenderer.d.ts.map +1 -0
  13. package/dist/components/CalloutRenderer.js +33 -0
  14. package/dist/components/CalloutRenderer.js.map +1 -0
  15. package/dist/components/ChartRenderer.d.ts +3 -0
  16. package/dist/components/ChartRenderer.d.ts.map +1 -0
  17. package/dist/components/ChartRenderer.js +52 -0
  18. package/dist/components/ChartRenderer.js.map +1 -0
  19. package/dist/components/CustomRenderer.d.ts +8 -0
  20. package/dist/components/CustomRenderer.d.ts.map +1 -0
  21. package/dist/components/CustomRenderer.js +51 -0
  22. package/dist/components/CustomRenderer.js.map +1 -0
  23. package/dist/components/FormRenderer.d.ts +8 -0
  24. package/dist/components/FormRenderer.d.ts.map +1 -0
  25. package/dist/components/FormRenderer.js +149 -0
  26. package/dist/components/FormRenderer.js.map +1 -0
  27. package/dist/components/MdmaBlockLoading.d.ts +11 -0
  28. package/dist/components/MdmaBlockLoading.d.ts.map +1 -0
  29. package/dist/components/MdmaBlockLoading.js +26 -0
  30. package/dist/components/MdmaBlockLoading.js.map +1 -0
  31. package/dist/components/TableRenderer.d.ts +2 -0
  32. package/dist/components/TableRenderer.d.ts.map +1 -0
  33. package/dist/components/TableRenderer.js +66 -0
  34. package/dist/components/TableRenderer.js.map +1 -0
  35. package/dist/components/TasklistRenderer.d.ts +7 -0
  36. package/dist/components/TasklistRenderer.d.ts.map +1 -0
  37. package/dist/components/TasklistRenderer.js +80 -0
  38. package/dist/components/TasklistRenderer.js.map +1 -0
  39. package/dist/components/ThinkingRenderer.d.ts +3 -0
  40. package/dist/components/ThinkingRenderer.d.ts.map +1 -0
  41. package/dist/components/ThinkingRenderer.js +36 -0
  42. package/dist/components/ThinkingRenderer.js.map +1 -0
  43. package/dist/components/WebhookRenderer.d.ts +2 -0
  44. package/dist/components/WebhookRenderer.d.ts.map +1 -0
  45. package/dist/components/WebhookRenderer.js +33 -0
  46. package/dist/components/WebhookRenderer.js.map +1 -0
  47. package/dist/components/form/default-elements.d.ts +10 -0
  48. package/dist/components/form/default-elements.d.ts.map +1 -0
  49. package/dist/components/form/default-elements.js +198 -0
  50. package/dist/components/form/default-elements.js.map +1 -0
  51. package/dist/components/form/element-props.d.ts +58 -0
  52. package/dist/components/form/element-props.d.ts.map +1 -0
  53. package/dist/components/form/element-props.js +2 -0
  54. package/dist/components/form/element-props.js.map +1 -0
  55. package/dist/context/render-context.d.ts +40 -0
  56. package/dist/context/render-context.d.ts.map +1 -0
  57. package/dist/context/render-context.js +7 -0
  58. package/dist/context/render-context.js.map +1 -0
  59. package/dist/document/mount-block.d.ts +19 -0
  60. package/dist/document/mount-block.d.ts.map +1 -0
  61. package/dist/document/mount-block.js +31 -0
  62. package/dist/document/mount-block.js.map +1 -0
  63. package/dist/document/mount-document.d.ts +33 -0
  64. package/dist/document/mount-document.d.ts.map +1 -0
  65. package/dist/document/mount-document.js +177 -0
  66. package/dist/document/mount-document.js.map +1 -0
  67. package/dist/document/partial-yaml.d.ts +10 -0
  68. package/dist/document/partial-yaml.d.ts.map +1 -0
  69. package/dist/document/partial-yaml.js +48 -0
  70. package/dist/document/partial-yaml.js.map +1 -0
  71. package/dist/dom/el.d.ts +26 -0
  72. package/dist/dom/el.d.ts.map +1 -0
  73. package/dist/dom/el.js +59 -0
  74. package/dist/dom/el.js.map +1 -0
  75. package/dist/index.d.ts +23 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +22 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/markdown/render-mdast.d.ts +21 -0
  80. package/dist/markdown/render-mdast.d.ts.map +1 -0
  81. package/dist/markdown/render-mdast.js +89 -0
  82. package/dist/markdown/render-mdast.js.map +1 -0
  83. package/dist/renderers/renderer-props.d.ts +41 -0
  84. package/dist/renderers/renderer-props.d.ts.map +1 -0
  85. package/dist/renderers/renderer-props.js +31 -0
  86. package/dist/renderers/renderer-props.js.map +1 -0
  87. package/dist/renderers/renderer-registry.d.ts +14 -0
  88. package/dist/renderers/renderer-registry.d.ts.map +1 -0
  89. package/dist/renderers/renderer-registry.js +48 -0
  90. package/dist/renderers/renderer-registry.js.map +1 -0
  91. package/dist/theme/theme.d.ts +68 -0
  92. package/dist/theme/theme.d.ts.map +1 -0
  93. package/dist/theme/theme.js +120 -0
  94. package/dist/theme/theme.js.map +1 -0
  95. package/package.json +56 -0
  96. 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,7 @@
1
+ export function resolveElementOverride(context, scope, element) {
2
+ const overrides = context.elementOverrides;
3
+ if (!overrides)
4
+ return undefined;
5
+ return (overrides[scope]?.[element] ?? overrides['*']?.[element]);
6
+ }
7
+ //# sourceMappingURL=render-context.js.map
@@ -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"}
@@ -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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"}
@@ -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"}