markstream-angular 0.0.2-beta.10 → 0.0.2-beta.11

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.
@@ -5,11 +5,13 @@ export declare class InlineCodeNodeComponent implements OnChanges {
5
5
  context?: AngularRenderContext;
6
6
  indexKey?: string;
7
7
  typewriter?: boolean;
8
+ fade?: boolean;
8
9
  settledCode: string;
9
10
  streamedDelta: string;
10
11
  private streamFadeVersion;
11
12
  ngOnChanges(): void;
12
13
  get streamedDeltaClass(): "markstream-angular-text__stream-delta--a" | "markstream-angular-text__stream-delta--b";
14
+ get fadeEnabled(): boolean;
13
15
  get typewriterEnabled(): boolean;
14
16
  settleStreamedDelta(): void;
15
17
  }
@@ -1,4 +1,5 @@
1
1
  import { AfterViewInit, OnChanges, OnDestroy, OnInit, SimpleChanges, EventEmitter } from '@angular/core';
2
+ import { SmoothMarkdownStreamOptions } from '../../../../markstream-core/src/index.ts';
2
3
  import { AngularRenderableNode, AngularRenderContext, CodeBlockPreviewPayload, NodeRendererProps } from '../shared/node-helpers';
3
4
  interface VisibleNodeEntry {
4
5
  node: AngularRenderableNode;
@@ -10,7 +11,10 @@ interface VisibleNodeEntry {
10
11
  export declare class NodeRendererComponent implements NodeRendererProps, OnChanges, OnInit, AfterViewInit, OnDestroy {
11
12
  private readonly cdr;
12
13
  private readonly hostRef;
14
+ private readonly smoothStream;
15
+ private readonly parentSmoothStreamingScope;
13
16
  private rootRef?;
17
+ private typewriterCursorRef?;
14
18
  content: string;
15
19
  nodes?: readonly AngularRenderableNode[] | null;
16
20
  final?: boolean;
@@ -37,7 +41,10 @@ export declare class NodeRendererComponent implements NodeRendererProps, OnChang
37
41
  isDark: boolean;
38
42
  customId?: string;
39
43
  indexKey?: number | string;
44
+ /** Show a blinking typewriter cursor while streamed content grows. Default: false */
40
45
  typewriter: boolean;
46
+ /** Enable/disable non-code-node enter and streamed-text fade animations. Default: true */
47
+ fade: boolean;
41
48
  batchRendering: boolean;
42
49
  initialRenderBatchSize: number;
43
50
  renderBatchSize: number;
@@ -48,6 +55,8 @@ export declare class NodeRendererComponent implements NodeRendererProps, OnChang
48
55
  maxLiveNodes: number;
49
56
  liveNodeBuffer: number;
50
57
  allowHtml: boolean;
58
+ smoothStreaming: boolean | 'auto';
59
+ smoothStreamingOptions?: SmoothMarkdownStreamOptions;
51
60
  copy: EventEmitter<string>;
52
61
  handleArtifactClick: EventEmitter<CodeBlockPreviewPayload>;
53
62
  click: EventEmitter<MouseEvent>;
@@ -80,7 +89,26 @@ export declare class NodeRendererComponent implements NodeRendererProps, OnChang
80
89
  private enhancementHandle;
81
90
  private postRenderTimer;
82
91
  private unsubscribeCustomComponents?;
92
+ private isSyncingSmoothStream;
93
+ private hasMountedForSmoothStreaming;
94
+ private unsubscribeSmoothStream?;
95
+ private previousRenderContent;
96
+ private previousEffectiveFinal;
97
+ private previousRenderVersionSource;
98
+ showTypewriterCursor: boolean;
99
+ private typewriterCursorTimeout;
100
+ private lastTypewriterContentLength;
101
+ private static readonly TYPEWRITER_CURSOR_EXCLUDED_NODE_TYPES;
102
+ get hasNodes(): boolean;
103
+ get smoothStreamingEligible(): boolean;
104
+ get smoothStreamingEnabled(): boolean;
105
+ get renderContent(): string;
106
+ get rawContent(): string;
107
+ get smoothSourceSynced(): boolean;
108
+ get requestedFinal(): boolean | undefined;
109
+ get effectiveFinal(): boolean | undefined;
83
110
  get resolvedIndexPrefix(): string;
111
+ isSmoothStreamingEnabled(): boolean;
84
112
  get resolvedInitialBatchSize(): number;
85
113
  get resolvedRenderBatchSize(): number;
86
114
  get resolvedMaxLiveNodes(): number;
@@ -99,6 +127,8 @@ export declare class NodeRendererComponent implements NodeRendererProps, OnChang
99
127
  entryIndexKey(index: number): string;
100
128
  handleMouseOver(event: MouseEvent): void;
101
129
  handleMouseOut(event: MouseEvent): void;
130
+ private ensureSmoothStreamInitialized;
131
+ private syncSmoothStream;
102
132
  private rebuild;
103
133
  private cleanupTransientState;
104
134
  private trimMeasuredState;
@@ -119,5 +149,13 @@ export declare class NodeRendererComponent implements NodeRendererProps, OnChang
119
149
  private scheduleEnhancements;
120
150
  private applyEnhancements;
121
151
  private disposeEnhancements;
152
+ private shouldSkipTypewriterCursorForNode;
153
+ private shouldShowTypewriterCursorForCurrentNodes;
154
+ private getNodeTextLength;
155
+ private getTypewriterContentLength;
156
+ private clearTypewriterCursorTimeout;
157
+ private getLastTextNode;
158
+ private updateTypewriterCursorPosition;
159
+ private updateTypewriterCursorState;
122
160
  }
123
161
  export {};
@@ -5,6 +5,7 @@ export declare class TextNodeComponent implements OnChanges {
5
5
  context?: AngularRenderContext;
6
6
  indexKey?: string;
7
7
  typewriter?: boolean;
8
+ fade?: boolean;
8
9
  settledText: string;
9
10
  streamedDelta: string;
10
11
  private streamFadeVersion;
@@ -12,6 +13,7 @@ export declare class TextNodeComponent implements OnChanges {
12
13
  ngOnChanges(): void;
13
14
  get centered(): boolean;
14
15
  get streamedDeltaClass(): "markstream-angular-text__stream-delta--a" | "markstream-angular-text__stream-delta--b";
16
+ get fadeEnabled(): boolean;
15
17
  get typewriterEnabled(): boolean;
16
18
  settleStreamedDelta(): void;
17
19
  }
@@ -1,11 +1,2 @@
1
- export interface ResolveStreamingTextStateOptions {
2
- nextContent: string;
3
- previousContent: string;
4
- typewriterEnabled: boolean;
5
- }
6
- export interface StreamingTextStateResult {
7
- settledContent: string;
8
- streamedDelta: string;
9
- appended: boolean;
10
- }
11
- export declare function resolveStreamingTextState({ nextContent, previousContent, typewriterEnabled, }: ResolveStreamingTextStateOptions): StreamingTextStateResult;
1
+ export { resolveStreamingTextState } from '../../../../markstream-core/src/index.ts';
2
+ export type { ResolveStreamingTextStateOptions, StreamingTextStateResult } from '../../../../markstream-core/src/index.ts';
@@ -1,3 +1,4 @@
1
+ import { SmoothMarkdownStreamOptions } from '../../../../markstream-core/src/index.ts';
1
2
  import { BaseNode, HtmlPolicy, MarkdownIt, ParsedNode, ParseOptions, getHtmlTagFromContent, hasCompleteHtmlTagContent, normalizeCustomHtmlTags, normalizeCustomHtmlTagName as normalizeTagName, stripCustomHtmlWrapper } from '../../../../markdown-parser/src/index.ts';
2
3
  import { CustomComponentMap } from '../../customComponents';
3
4
  import { CodeBlockMonacoOptions, CodeBlockMonacoTheme } from '../../types/monaco';
@@ -98,6 +99,8 @@ export interface NodeRendererProps {
98
99
  customId?: string;
99
100
  indexKey?: number | string;
100
101
  typewriter?: boolean;
102
+ /** Enable/disable non-code-node enter and streamed-text fade animations. Default: true */
103
+ fade?: boolean;
101
104
  batchRendering?: boolean;
102
105
  initialRenderBatchSize?: number;
103
106
  renderBatchSize?: number;
@@ -108,6 +111,8 @@ export interface NodeRendererProps {
108
111
  maxLiveNodes?: number;
109
112
  liveNodeBuffer?: number;
110
113
  allowHtml?: boolean;
114
+ smoothStreaming?: boolean | 'auto';
115
+ smoothStreamingOptions?: SmoothMarkdownStreamOptions;
111
116
  }
112
117
  export interface AngularRenderContext {
113
118
  customId?: string;
@@ -115,6 +120,7 @@ export interface AngularRenderContext {
115
120
  indexKey?: string;
116
121
  final?: boolean;
117
122
  typewriter?: boolean;
123
+ fade?: boolean;
118
124
  textStreamState?: Map<string, string>;
119
125
  streamRenderVersion?: number;
120
126
  showTooltips?: boolean;
@@ -0,0 +1,5 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export interface SmoothStreamingScope {
3
+ isSmoothStreamingEnabled: () => boolean;
4
+ }
5
+ export declare const MARKSTREAM_SMOOTH_STREAMING_SCOPE: InjectionToken<SmoothStreamingScope>;
@@ -36,6 +36,8 @@ export { ReferenceNodeComponent as ReferenceNode } from './components/ReferenceN
36
36
  export type { AngularRenderableNode, AngularRenderContext, CodeBlockPreviewPayload, NodeRendererCodeBlockProps, NodeRendererD2Props, NodeRendererEvents, NodeRendererInfographicProps, NodeRendererMermaidProps, NodeRendererProps, } from './components/shared/node-helpers';
37
37
  export { buildRenderContext, resolveParsedNodes, } from './components/shared/node-helpers';
38
38
  export { SafeAttrsDirective } from './components/shared/safe-attrs.directive';
39
+ export { MARKSTREAM_SMOOTH_STREAMING_SCOPE } from './components/shared/smooth-streaming-scope';
40
+ export type { SmoothStreamingScope } from './components/shared/smooth-streaming-scope';
39
41
  export { StrikethroughNodeComponent as StrikethroughNode } from './components/StrikethroughNode/StrikethroughNode.component';
40
42
  export { StrongNodeComponent as StrongNode } from './components/StrongNode/StrongNode.component';
41
43
  export { SubscriptNodeComponent as SubscriptNode } from './components/SubscriptNode/SubscriptNode.component';
@@ -64,6 +66,8 @@ export type { NestedMarkdownNodesInput, NestedMarkdownNodesOptions, } from './pa
64
66
  export { renderMarkdownNodesToHtml, renderMarkdownNodeToHtml, renderMarkdownToHtml, renderNestedMarkdownToHtml, } from './renderMarkdownHtml';
65
67
  export type { MarkstreamAngularRenderOptions, NestedMarkdownHtmlInput, NestedMarkdownHtmlOptions, RenderableMarkdownNode, } from './renderMarkdownHtml';
66
68
  export { sanitizeHtmlContent } from './sanitizeHtmlContent';
69
+ export { SmoothMarkdownStreamService } from './services/smooth-markdown-stream.service';
70
+ export type { SmoothMarkdownStreamOptions } from './services/smooth-markdown-stream.service';
67
71
  export type { CodeBlockDiffAppearance, CodeBlockDiffHideUnchangedRegions, CodeBlockDiffHideUnchangedRegionsOptions, CodeBlockDiffHunkActionContext, CodeBlockDiffHunkActionKind, CodeBlockDiffHunkSide, CodeBlockDiffLineStyle, CodeBlockDiffUnchangedRegionStyle, CodeBlockMonacoLanguage, CodeBlockMonacoOptions, CodeBlockMonacoTheme, CodeBlockMonacoThemeObject, } from './types/monaco';
68
72
  export { getLanguageIcon, languageMap, normalizeLanguageIdentifier, resolveMonacoLanguageId, setLanguageIconResolver, } from './utils/languageIcon';
69
73
  export type { LanguageIconResolver } from './utils/languageIcon';
@@ -0,0 +1,33 @@
1
+ import { OnDestroy } from '@angular/core';
2
+ import { SmoothMarkdownStreamOptions } from '../../../markstream-core/src/index.ts';
3
+ export type { SmoothMarkdownStreamOptions };
4
+ export declare class SmoothMarkdownStreamService implements OnDestroy {
5
+ private controller;
6
+ private snapshot;
7
+ private readonly listeners;
8
+ private unsubscribeFromController?;
9
+ init(options?: SmoothMarkdownStreamOptions): void;
10
+ ngOnDestroy(): void;
11
+ /**
12
+ * Subscribe to snapshot updates. Called when the controller's visible
13
+ * content advances during smooth streaming. The listener is invoked
14
+ * after each snapshot sync so that Angular components can trigger
15
+ * rebuild / markForCheck.
16
+ */
17
+ subscribe(listener: () => void): () => void;
18
+ get source(): string;
19
+ get visible(): string;
20
+ get done(): boolean;
21
+ get caughtUp(): boolean;
22
+ get final(): boolean;
23
+ get pendingChars(): number;
24
+ enqueue(chunk: string): void;
25
+ finish(options?: {
26
+ flush?: boolean;
27
+ }): void;
28
+ flush(): void;
29
+ reset(initialMarkdown?: string): void;
30
+ pause(): void;
31
+ resume(): void;
32
+ private syncSnapshot;
33
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "markstream-angular",
3
3
  "type": "module",
4
- "version": "0.0.2-beta.10",
4
+ "version": "0.0.2-beta.11",
5
5
  "description": "Experimental Angular Markdown renderer for Markstream, built on stream-markdown AST and a stable HTML baseline renderer.",
6
6
  "author": "Simon He",
7
7
  "license": "MIT",
@@ -68,7 +68,8 @@
68
68
  },
69
69
  "dependencies": {
70
70
  "@floating-ui/dom": "^1.7.6",
71
- "stream-markdown-parser": "0.0.93"
71
+ "markstream-core": "0.0.1",
72
+ "stream-markdown-parser": "0.0.95"
72
73
  },
73
74
  "devDependencies": {
74
75
  "@types/node": "^18.19.130",
@@ -78,10 +79,11 @@
78
79
  "vite-plugin-dts": "^4.5.4"
79
80
  },
80
81
  "scripts": {
81
- "build": "vite build --mode npm",
82
+ "build": "pnpm --dir ../markstream-core build && vite build --mode npm",
82
83
  "dev": "vite dev",
83
84
  "preview": "vite preview",
84
85
  "typecheck": "tsc --noEmit",
85
- "release": "bumpp --commit --no-tag --no-push && pnpm publish --access public && node ../../scripts/tag-package.mjs --package-json package.json --push"
86
+ "check:core-published": "node ../../scripts/check-core-published.mjs --package-json package.json --core-package-json ../markstream-core/package.json",
87
+ "release": "pnpm run check:core-published && bumpp --commit --no-tag --no-push && pnpm publish --access public && node ../../scripts/tag-package.mjs --package-json package.json --push"
86
88
  }
87
89
  }