markstream-angular 0.0.1-alpha.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 (77) hide show
  1. package/README.md +94 -0
  2. package/dist/index.css +1 -0
  3. package/dist/index.js +7967 -0
  4. package/dist/types/components/AdmonitionNode/AdmonitionNode.component.d.ts +11 -0
  5. package/dist/types/components/BlockquoteNode/BlockquoteNode.component.d.ts +9 -0
  6. package/dist/types/components/CheckboxNode/CheckboxNode.component.d.ts +5 -0
  7. package/dist/types/components/CodeBlockNode/CodeBlockNode.component.d.ts +84 -0
  8. package/dist/types/components/CodeBlockNode/HtmlPreviewFrame.component.d.ts +9 -0
  9. package/dist/types/components/D2BlockNode/D2BlockNode.component.d.ts +44 -0
  10. package/dist/types/components/DefinitionListNode/DefinitionListNode.component.d.ts +11 -0
  11. package/dist/types/components/DynamicNodeHost/DynamicNodeHost.component.d.ts +16 -0
  12. package/dist/types/components/EmojiNode/EmojiNode.component.d.ts +5 -0
  13. package/dist/types/components/EmphasisNode/EmphasisNode.component.d.ts +8 -0
  14. package/dist/types/components/FallbackComponent/FallbackComponent.component.d.ts +14 -0
  15. package/dist/types/components/FootnoteAnchorNode/FootnoteAnchorNode.component.d.ts +7 -0
  16. package/dist/types/components/FootnoteNode/FootnoteNode.component.d.ts +9 -0
  17. package/dist/types/components/FootnoteReferenceNode/FootnoteReferenceNode.component.d.ts +6 -0
  18. package/dist/types/components/HardBreakNode/HardBreakNode.component.d.ts +2 -0
  19. package/dist/types/components/HeadingNode/HeadingNode.component.d.ts +10 -0
  20. package/dist/types/components/HighlightNode/HighlightNode.component.d.ts +8 -0
  21. package/dist/types/components/HtmlBlockNode/HtmlBlockNode.component.d.ts +10 -0
  22. package/dist/types/components/HtmlInlineNode/HtmlInlineNode.component.d.ts +10 -0
  23. package/dist/types/components/ImageNode/ImageNode.component.d.ts +8 -0
  24. package/dist/types/components/InfographicBlockNode/InfographicBlockNode.component.d.ts +58 -0
  25. package/dist/types/components/InlineCodeNode/InlineCodeNode.component.d.ts +5 -0
  26. package/dist/types/components/InsertNode/InsertNode.component.d.ts +8 -0
  27. package/dist/types/components/LinkNode/LinkNode.component.d.ts +24 -0
  28. package/dist/types/components/ListItemNode/ListItemNode.component.d.ts +9 -0
  29. package/dist/types/components/ListNode/ListNode.component.d.ts +11 -0
  30. package/dist/types/components/MathBlockNode/MathBlockNode.component.d.ts +17 -0
  31. package/dist/types/components/MathInlineNode/MathInlineNode.component.d.ts +18 -0
  32. package/dist/types/components/MermaidBlockNode/MermaidBlockNode.component.d.ts +67 -0
  33. package/dist/types/components/NestedRenderer/NestedRenderer.component.d.ts +33 -0
  34. package/dist/types/components/NodeOutlet/NodeOutlet.component.d.ts +15 -0
  35. package/dist/types/components/NodeRenderer/NodeRenderer.component.d.ts +120 -0
  36. package/dist/types/components/ParagraphNode/ParagraphNode.component.d.ts +20 -0
  37. package/dist/types/components/PreCodeNode/PreCodeNode.component.d.ts +9 -0
  38. package/dist/types/components/ReferenceNode/ReferenceNode.component.d.ts +5 -0
  39. package/dist/types/components/StrikethroughNode/StrikethroughNode.component.d.ts +8 -0
  40. package/dist/types/components/StrongNode/StrongNode.component.d.ts +8 -0
  41. package/dist/types/components/SubscriptNode/SubscriptNode.component.d.ts +8 -0
  42. package/dist/types/components/SuperscriptNode/SuperscriptNode.component.d.ts +8 -0
  43. package/dist/types/components/TableNode/TableNode.component.d.ts +14 -0
  44. package/dist/types/components/TextNode/TextNode.component.d.ts +6 -0
  45. package/dist/types/components/ThematicBreakNode/ThematicBreakNode.component.d.ts +2 -0
  46. package/dist/types/components/VmrContainerNode/VmrContainerNode.component.d.ts +8 -0
  47. package/dist/types/components/shared/node-helpers.d.ts +99 -0
  48. package/dist/types/components/shared/node-outlet-helpers.d.ts +7 -0
  49. package/dist/types/components/shared/render-window.d.ts +18 -0
  50. package/dist/types/components/shared/rich-block-helpers.d.ts +6 -0
  51. package/dist/types/components/shared/safe-attrs.directive.d.ts +11 -0
  52. package/dist/types/customComponents.d.ts +9 -0
  53. package/dist/types/enhanceRenderedHtml.d.ts +20 -0
  54. package/dist/types/hydrateCustomTagContent.d.ts +2 -0
  55. package/dist/types/i18n/useSafeI18n.d.ts +4 -0
  56. package/dist/types/index.d.ts +71 -0
  57. package/dist/types/markstream-angular.component.d.ts +2 -0
  58. package/dist/types/optional/d2.d.ts +6 -0
  59. package/dist/types/optional/infographic.d.ts +1 -0
  60. package/dist/types/optional/katex.d.ts +6 -0
  61. package/dist/types/optional/mermaid.d.ts +6 -0
  62. package/dist/types/optional/monaco.d.ts +1 -0
  63. package/dist/types/parseNestedMarkdownToNodes.d.ts +14 -0
  64. package/dist/types/renderMarkdownHtml.d.ts +28 -0
  65. package/dist/types/sanitizeHtmlContent.d.ts +1 -0
  66. package/dist/types/sanitizeSvg.d.ts +2 -0
  67. package/dist/types/tooltip/singletonTooltip.d.ts +3 -0
  68. package/dist/types/utils/languageIcon.d.ts +6 -0
  69. package/dist/types/workers/katexCdnWorker.d.ts +20 -0
  70. package/dist/types/workers/katexRenderer.worker.d.ts +0 -0
  71. package/dist/types/workers/katexWorkerClient.d.ts +35 -0
  72. package/dist/types/workers/mermaidCdnWorker.d.ts +15 -0
  73. package/dist/types/workers/mermaidParser.worker.d.ts +1 -0
  74. package/dist/types/workers/mermaidWorkerClient.d.ts +15 -0
  75. package/dist/workers/katexRenderer.worker.js +45 -0
  76. package/dist/workers/mermaidParser.worker.js +69 -0
  77. package/package.json +86 -0
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # markstream-angular
2
+
3
+ Angular version of Markstream: a streaming-friendly Markdown renderer with KaTeX, Mermaid, Monaco code blocks, D2, infographic blocks, custom HTML tags, and cross-framework playground parity.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add markstream-angular @angular/core @angular/common
9
+ ```
10
+
11
+ Optional peer dependencies:
12
+
13
+ - `stream-monaco` for Monaco-powered code blocks
14
+ - `mermaid` for Mermaid diagrams
15
+ - `katex` for math rendering
16
+ - `@terrastruct/d2` for D2 diagrams
17
+ - `@antv/infographic` for infographic blocks
18
+
19
+ Example:
20
+
21
+ ```bash
22
+ pnpm add stream-monaco mermaid katex @terrastruct/d2 @antv/infographic
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ Import the stylesheet once in your Angular app entry:
28
+
29
+ ```ts
30
+ import 'markstream-angular/index.css'
31
+ import 'katex/dist/katex.min.css'
32
+ ```
33
+
34
+ Use the standalone component directly:
35
+
36
+ ```ts
37
+ import { Component, signal } from '@angular/core'
38
+ import { bootstrapApplication } from '@angular/platform-browser'
39
+ import { MarkstreamAngularComponent } from 'markstream-angular'
40
+
41
+ @Component({
42
+ selector: 'app-root',
43
+ standalone: true,
44
+ imports: [MarkstreamAngularComponent],
45
+ template: `
46
+ <markstream-angular
47
+ [content]="markdown()"
48
+ [final]="true"
49
+ [codeBlockStream]="true"
50
+ />
51
+ `,
52
+ })
53
+ class AppComponent {
54
+ readonly markdown = signal(`# Hello Angular
55
+
56
+ - streaming markdown
57
+ - code blocks
58
+ - Mermaid / KaTeX / D2`)
59
+ }
60
+
61
+ bootstrapApplication(AppComponent)
62
+ ```
63
+
64
+ ## Workers
65
+
66
+ KaTeX and Mermaid can use the same off-thread worker path as the React/Vue packages:
67
+
68
+ ```ts
69
+ import { setKaTeXWorker, setMermaidWorker } from 'markstream-angular'
70
+ import KatexWorker from 'markstream-angular/workers/katexRenderer.worker?worker'
71
+ import MermaidWorker from 'markstream-angular/workers/mermaidParser.worker?worker'
72
+
73
+ setKaTeXWorker(new KatexWorker())
74
+ setMermaidWorker(new MermaidWorker())
75
+ ```
76
+
77
+ ## Playground
78
+
79
+ In this monorepo:
80
+
81
+ - Angular playground: `pnpm play:angular`
82
+ - Angular regression lab: `http://127.0.0.1:4175/test`
83
+ - Angular version sandbox: `http://127.0.0.1:4175/test-sandbox`
84
+
85
+ ## Status
86
+
87
+ This package is still tagged `alpha`, but the current direction is already aligned with `markstream-react` / `markstream-vue2` for:
88
+
89
+ - node-component renderer structure
90
+ - streaming code block behavior
91
+ - shared `/test` fixtures and cross-framework comparison
92
+ - KaTeX / Mermaid worker integration
93
+
94
+ Issue tracker and source: [Simon-He95/markstream-vue](https://github.com/Simon-He95/markstream-vue)
package/dist/index.css ADDED
@@ -0,0 +1 @@
1
+ :where(.markstream-angular) button{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:transparent;border:0;font:inherit;color:inherit}.markstream-angular{--border: 214.3 31.8% 91.4%;--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--secondary: 210 40% 96%;--muted: 210 40% 96%;--muted-foreground: 215.4 16.3% 46.9%;color:hsl(var(--foreground));font:400 16px/1.72 IBM Plex Sans,Segoe UI,sans-serif;word-break:break-word;position:relative;contain:layout;content-visibility:auto;contain-intrinsic-size:800px 600px}.markstream-angular.virtualized{content-visibility:visible;contain-intrinsic-size:auto}.dark .markstream-angular,.markstream-angular.dark{--border: 217.2 32.6% 17.5%;--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--secondary: 217.2 32.6% 17.5%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%}.markstream-angular>:first-child{margin-top:0}.markstream-angular>:last-child{margin-bottom:0}.markstream-angular .node-slot,.markstream-angular .node-content{width:100%}.markstream-angular markstream-angular-blockquote-node,.markstream-angular markstream-angular-paragraph-node,.markstream-angular markstream-angular-image-node{display:flow-root;width:100%}.markstream-angular markstream-angular-nested-renderer,.markstream-angular markstream-angular-node-outlet{display:contents}.markstream-angular .node-placeholder{width:100%;min-height:1rem;margin:.25rem 0;border-radius:.5rem;background-image:linear-gradient(90deg,#94a3b82e,#94a3b80d,#94a3b82e);background-size:200% 100%;animation:node-placeholder-shimmer 1.1s ease-in-out infinite}.markstream-angular .node-spacer{width:100%}.markstream-angular .typewriter-node{opacity:0;animation:typewriter-fade .9s ease-out forwards}.markstream-angular h1,.markstream-angular h2,.markstream-angular h3,.markstream-angular h4,.markstream-angular h5,.markstream-angular h6{margin:1.8rem 0 .8rem;line-height:1.15;font-weight:700;letter-spacing:-.02em}.markstream-angular h1{font-size:clamp(2rem,4vw,2.65rem)}.markstream-angular h2{font-size:clamp(1.55rem,3vw,2rem)}.markstream-angular h3{font-size:1.35rem}.markstream-angular h4{font-size:1.15rem}.markstream-angular p,.markstream-angular ul,.markstream-angular ol,.markstream-angular blockquote,.markstream-angular pre,.markstream-angular table,.markstream-angular details,.markstream-angular dl{margin:1rem 0}.markstream-angular ul,.markstream-angular ol{padding-left:1.45rem}.markstream-angular li+li{margin-top:.35rem}.markstream-angular li>p{margin:.35rem 0}.markstream-angular a{color:#2563eb;text-decoration:underline;text-underline-offset:.18em}.markstream-angular .link-node{color:var(--link-color, #0366d6);text-decoration:none}.markstream-angular .link-node:hover{text-decoration:underline;text-underline-offset:.2rem}.markstream-angular .link-loading{display:inline-flex;align-items:baseline;gap:.375rem}.markstream-angular .link-loading .link-text-wrapper{position:relative;display:inline-flex}.markstream-angular .link-loading .link-text{position:relative;z-index:2}.markstream-angular .underline-anim{position:absolute;left:0;right:0;height:var(--underline-height, 2px);bottom:var(--underline-bottom, -3px);background:currentColor;transform-origin:center center;will-change:transform,opacity;opacity:var(--underline-opacity, .9);transform:scaleX(0);animation:underlineLoop var(--underline-duration, .8s) var(--underline-timing, linear) var(--underline-iteration, infinite)}@keyframes underlineLoop{0%{transform:scaleX(0);opacity:var(--underline-opacity, .9)}75%{transform:scaleX(1);opacity:var(--underline-opacity, .9)}99%{transform:scaleX(1);opacity:var(--underline-opacity, .9)}to{transform:scaleX(0);opacity:0}}.markstream-angular strong{font-weight:700}.markstream-angular em{font-style:italic}.markstream-angular code{padding:.12rem .35rem;border-radius:.42rem;background:#0f172a0f;font:500 .92em/1.5 IBM Plex Mono,SFMono-Regular,Consolas,monospace}.markstream-angular pre{overflow:auto;padding:1rem 1.1rem;border-radius:1rem;background:#0f172a;color:#e2e8f0;box-shadow:inset 0 0 0 1px #94a3b824}.markstream-angular pre code{padding:0;background:transparent;color:inherit}.markstream-angular blockquote,.markstream-angular .blockquote-node{font-weight:500;font-style:italic;border-left:.25rem solid var(--blockquote-border-color, #e2e8f0);quotes:"“" "”" "‘" "’";margin:1.6em 0;padding-left:1em;background:transparent;border-radius:0;color:inherit}.markstream-angular .blockquote-node .markstream-angular,.markstream-angular blockquote .markstream-angular{content-visibility:visible;contain:content;contain-intrinsic-size:0 0}.markstream-angular .blockquote-node>markstream-angular-nested-renderer,.markstream-angular blockquote>markstream-angular-nested-renderer,.markstream-angular .blockquote-node>markstream-angular-node-outlet,.markstream-angular blockquote>markstream-angular-node-outlet{display:block;width:100%}.markstream-angular hr{margin:1.5rem 0;border:0;border-top:1px solid rgba(15,23,42,.12)}.markstream-angular table{width:100%;border-collapse:collapse;overflow:hidden;border-radius:1rem;box-shadow:inset 0 0 0 1px #0f172a14}.markstream-angular th,.markstream-angular td{padding:.7rem .8rem;border:1px solid rgba(15,23,42,.08);text-align:left;vertical-align:top}.markstream-angular th{background:#0f172a0d;font-weight:700}.markstream-angular img{display:block;max-width:100%;height:auto;border-radius:.9rem}.markstream-angular .image-node{margin:2rem 0;text-align:center}.markstream-angular .image-node__inner{position:relative;display:inline-block;width:min(100%,24rem);max-width:24rem}.markstream-angular .image-node__img{display:inline-block;width:100%;max-width:24rem;height:auto;border-radius:.75rem;box-shadow:0 15px 35px #0f172a14}.markstream-angular .image-node__img--svg{box-shadow:none}.markstream-angular details{padding:.85rem 1rem;border-radius:.9rem;border:1px solid rgba(15,23,42,.08);background:#0f172a08}.markstream-angular summary{cursor:pointer;font-weight:700}.markstream-angular dl{display:grid;gap:.45rem}.markstream-angular dt{font-weight:700}.markstream-angular dd{margin:0 0 .45rem 1rem}.markstream-angular input[type=checkbox]{margin-right:.4rem}.markstream-angular mark{padding:.08rem .24rem;border-radius:.3rem;background:#facc1547}.markstream-angular ins,.markstream-angular del{text-decoration-thickness:.08em}body>div[id^=dmermaid-]{position:fixed;top:0;left:0;width:0;height:0;overflow:hidden;pointer-events:none}.markstream-angular .markstream-nested-custom{display:block;margin:1rem 0;padding:.9rem 1rem;border-radius:.9rem;background:#0f172a0a;border:1px solid rgba(15,23,42,.08)}.markstream-angular .markstream-nested-custom--thinking{background:linear-gradient(180deg,#0ea5e914,#ffffffeb);border-color:#0ea5e92e}.markstream-angular .markstream-nested-admonition{margin:1rem 0;padding:1rem 1.1rem;border-radius:1rem;border:1px solid rgba(37,99,235,.14);background:#2563eb0d}.markstream-angular .markstream-nested-admonition__title{margin-bottom:.55rem;font-weight:700}.markstream-angular .markstream-nested-admonition--warning{border-color:#f59e0b3d;background:#f59e0b14}.markstream-angular .markstream-nested-admonition--error,.markstream-angular .markstream-nested-admonition--danger{border-color:#ef444438;background:#ef444412}.markstream-angular .markstream-nested-admonition--tip{border-color:#10b98133;background:#10b98112}.markstream-angular .markstream-nested-reference,.markstream-angular .markstream-nested-footnote-ref{font-family:IBM Plex Mono,SFMono-Regular,Consolas,monospace}.markstream-angular .math-inline-wrapper{position:relative;display:inline-block}.markstream-angular .math-inline{display:inline-block;vertical-align:middle}.markstream-angular .math-inline--hidden{visibility:hidden}.markstream-angular .math-inline__loading{display:inline-flex;align-items:center;justify-content:center;pointer-events:none}.markstream-angular .math-inline__spinner{width:1rem;height:1rem;border-radius:9999px;border:2px solid rgba(94,104,121,.25);border-top-color:#5e6879cc;animation:spin 1s linear infinite}.markstream-angular .math-block,.markstream-angular .markstream-nested-math-block{position:relative;text-align:center;overflow-x:auto;min-height:40px;padding:.5rem}.markstream-angular .math-rendering{opacity:.3;transition:opacity .2s ease}.markstream-angular .markstream-nested-math-block__render .katex-display{margin:0;overflow-x:auto;overflow-y:hidden}.markstream-angular .markstream-angular-mermaid{background:#fffffff5;color:#0f172a}.markstream-angular.dark .markstream-angular-mermaid,.dark .markstream-angular .markstream-angular-mermaid{background:#0f172aeb;color:#e2e8f0}.markstream-angular .markstream-angular-mermaid svg{display:block;max-width:100%;height:auto;margin:0 auto}.markstream-angular .mermaid-block{border:1px solid rgba(148,163,184,.3);border-radius:1rem;background:#fff;color:#0f172a;margin:1.25rem 0;overflow:hidden}.markstream-angular.dark .mermaid-block,.dark .markstream-angular .mermaid-block{background:#0f172a;color:#e2e8f0;border-color:#94a3b866}.markstream-angular .mermaid-modal-overlay{position:fixed;inset:0;z-index:9999;display:flex;flex-direction:column;background:#0009}.markstream-angular .mermaid-modal-panel{position:relative;width:min(64rem,calc(100% - 2rem));margin:2rem auto;border-radius:.75rem;overflow:hidden;background:#fff;color:#0f172a;box-shadow:0 24px 60px #00000038}.markstream-angular .mermaid-modal-panel.is-dark{background:#0f172a;color:#e2e8f0}.markstream-angular .mermaid-modal-header{display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;border-bottom:1px solid rgba(148,163,184,.25)}.markstream-angular .mermaid-modal-title{font-size:.875rem;font-weight:600}.markstream-angular .mermaid-modal-close{font-size:.875rem;padding:.25rem .5rem;border-radius:.375rem;cursor:pointer;opacity:.9}.markstream-angular .mermaid-modal-close:hover{opacity:1;background:#94a3b829}.markstream-angular .mermaid-modal-body{padding:1rem;max-height:80vh;overflow:auto}.markstream-angular .mermaid-modal-content{width:100%;height:100%;display:flex;justify-content:center;transform-origin:center center}.markstream-angular .fullscreen{width:100%;max-height:100%!important;height:100%!important}.markstream-angular .mermaid-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.65rem .9rem;border-bottom:1px solid rgba(148,163,184,.3);background:#f8fafcd9}.markstream-angular.dark .mermaid-header,.dark .markstream-angular .mermaid-header{background:#0f172ad9;border-color:#47556999}.markstream-angular .mermaid-title__text{font-size:.85rem;letter-spacing:.08em;text-transform:uppercase;color:inherit}.markstream-angular .mermaid-actions{display:flex;align-items:center;gap:.35rem;flex-wrap:wrap;justify-content:flex-end}.markstream-angular .mermaid-btn{border:1px solid rgba(148,163,184,.4);background:transparent;color:inherit;font-size:.75rem;padding:.2rem .65rem;border-radius:.35rem;cursor:pointer;transition:background .2s ease,color .2s ease,opacity .2s ease}.markstream-angular .mermaid-btn:hover:not(:disabled){background:#3b82f626;color:#1d4ed8}.markstream-angular.dark .mermaid-btn:hover:not(:disabled),.dark .markstream-angular .mermaid-btn:hover:not(:disabled){background:#3b82f64d;color:#bfdbfe}.markstream-angular .mermaid-btn:disabled{opacity:.4;cursor:not-allowed}.markstream-angular .mermaid-toggle{display:inline-flex;border-radius:9999px;border:1px solid rgba(148,163,184,.3);overflow:hidden}.markstream-angular .mermaid-toggle-btn{border:none;background:transparent;color:inherit;font-size:.75rem;padding:.2rem .65rem;cursor:pointer;transition:background .2s ease}.markstream-angular .mermaid-toggle-btn--active{background:#3b82f62e;color:#1d4ed8}.markstream-angular.dark .mermaid-toggle-btn--active,.dark .markstream-angular .mermaid-toggle-btn--active{background:#3b82f64d;color:#bfdbfe}.markstream-angular .mermaid-body{position:relative;padding:1rem}.markstream-angular .mermaid-preview{width:100%;min-height:180px;display:flex;align-items:center;justify-content:center;text-align:center;transform-origin:top center}.markstream-angular .mermaid-preview svg{width:100%;height:auto}.markstream-angular .mermaid-source{background:#0f172af2;color:#e2e8f0;border-radius:.5rem;padding:1rem;overflow-x:auto}.markstream-angular .mermaid-error{padding:.85rem 1rem;color:#b91c1c;background:#f8717126;border-top:1px solid rgba(248,113,113,.25)}.markstream-angular .mermaid-loading{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem 1rem;font-size:.85rem;color:#0f172a99}.markstream-angular.dark .mermaid-loading,.dark .markstream-angular .mermaid-loading{color:#e2e8f0b3}.markstream-angular .mermaid-spinner{width:.85rem;height:.85rem;border-radius:9999px;border:2px solid rgba(59,130,246,.2);border-top-color:#2563eb;animation:spin 1s linear infinite}.markstream-angular .markstream-angular-enhanced-block{margin:1rem 0;border-radius:1rem;overflow:hidden;border:1px solid rgba(15,23,42,.08);background:#f8fafcf0;box-shadow:inset 0 1px #fff6}.markstream-angular .markstream-angular-enhanced-block__header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.75rem .95rem;border-bottom:1px solid rgba(15,23,42,.08);background:#ffffffb8}.markstream-angular .markstream-angular-enhanced-block__actions{display:inline-flex;align-items:center;gap:.45rem}.markstream-angular .markstream-angular-enhanced-block__action{padding:.28rem .62rem;border-radius:999px;background:#0f172a0f;box-shadow:inset 0 0 0 1px #0f172a14;font:600 .78rem/1 IBM Plex Mono,SFMono-Regular,Consolas,monospace;cursor:pointer;transition:background-color .18s ease}.markstream-angular .markstream-angular-enhanced-block__action:hover{background:#2563eb1f}.markstream-angular .markstream-angular-enhanced-block__badge{display:inline-flex;align-items:center;padding:.22rem .55rem;border-radius:999px;background:#2563eb1a;color:#1d4ed8;font:700 .72rem/1 IBM Plex Mono,SFMono-Regular,Consolas,monospace;letter-spacing:.04em;text-transform:uppercase}.markstream-angular .markstream-angular-enhanced-block__body{position:relative;overflow:auto;padding:.95rem;background:#ffffffd1}.markstream-angular .markstream-angular-enhanced-block__body>:first-child{margin-top:0}.markstream-angular .markstream-angular-enhanced-block__body>:last-child{margin-bottom:0}.markstream-angular .markstream-angular-enhanced-block__body--code{padding:0;background:#0b1220}.markstream-angular .markstream-angular-enhanced-block__body--code .monaco-editor,.markstream-angular .markstream-angular-enhanced-block__body--code .monaco-diff-editor{min-height:inherit}.markstream-angular .markstream-angular-enhanced-block__details{margin:0;border-top:1px solid rgba(15,23,42,.08);border-radius:0;background:#f8fafceb}.markstream-angular .markstream-angular-enhanced-block__details summary{padding:.8rem .95rem}.markstream-angular .markstream-angular-enhanced-block__source{margin:0;border-radius:0}.markstream-angular .markstream-angular-enhanced-block--d2 svg,.markstream-angular .markstream-angular-enhanced-block--infographic svg{display:block;width:100%;height:auto}.markstream-angular.dark .markstream-angular-enhanced-block,.dark .markstream-angular .markstream-angular-enhanced-block{border-color:#94a3b82e;background:#0f172ad1}.markstream-angular.dark .markstream-angular-enhanced-block__header,.dark .markstream-angular .markstream-angular-enhanced-block__header{border-bottom-color:#94a3b82e;background:#0f172af0}.markstream-angular.dark .markstream-angular-enhanced-block__action,.dark .markstream-angular .markstream-angular-enhanced-block__action{background:#94a3b824;box-shadow:inset 0 0 0 1px #94a3b833}.markstream-angular.dark .markstream-angular-enhanced-block__action:hover,.dark .markstream-angular .markstream-angular-enhanced-block__action:hover{background:#60a5fa33}.markstream-angular.dark .markstream-angular-enhanced-block__badge,.dark .markstream-angular .markstream-angular-enhanced-block__badge{background:#60a5fa29;color:#93c5fd}.markstream-angular.dark .markstream-angular-enhanced-block__body,.dark .markstream-angular .markstream-angular-enhanced-block__body{background:#0f172ae6}.markstream-angular.dark .markstream-angular-enhanced-block__details,.dark .markstream-angular .markstream-angular-enhanced-block__details{border-top-color:#94a3b82e;background:#0f172af5}@keyframes node-placeholder-shimmer{0%{background-position:200% 0%}to{background-position:-200% 0%}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes typewriter-fade{0%{opacity:0}to{opacity:1}}.markstream-angular .code-block-container{margin:1rem 0;overflow:hidden;border:1px solid rgba(148,163,184,.24);border-radius:.75rem;background:#fff;box-shadow:0 18px 38px -28px #0f172a73}.markstream-angular .code-block-container.is-dark,.dark .markstream-angular .code-block-container{border-color:#4755698c;background:#0f172a;box-shadow:0 22px 44px -30px #020617f2}.markstream-angular .code-block-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.625rem 1rem;border-bottom:1px solid rgba(148,163,184,.1)}.markstream-angular .code-block-header__meta{display:flex;flex:1 1 auto;align-items:center;gap:.5rem;min-width:0}.markstream-angular .code-block-header__label{min-width:0;overflow:hidden;color:inherit;text-overflow:ellipsis;white-space:nowrap;font:500 .95rem/1.2 IBM Plex Mono,SFMono-Regular,Consolas,monospace}.markstream-angular .code-block-header__actions{display:flex;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:.25rem;margin-left:auto}.markstream-angular .code-block-language-icon{width:1rem;height:1rem;flex:0 0 1rem;color:#2563eb}.markstream-angular.dark .code-block-language-icon,.dark .markstream-angular .code-block-language-icon{color:#93c5fd}.markstream-angular .code-block-language-icon svg,.markstream-angular .code-block-language-icon img{display:block;width:100%;height:100%}.markstream-angular .code-block-language-icon__image{-o-object-fit:contain;object-fit:contain}.markstream-angular .code-block-body{position:relative;min-height:120px}.code-block-body--expanded{max-height:none}.code-block-body--collapsed{min-height:0;height:0;overflow:hidden}.markstream-angular .code-action-btn{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;border-radius:.375rem;color:inherit;transition:background-color .14s ease,color .14s ease,transform .14s ease,opacity .14s ease}.markstream-angular .code-action-btn:hover{background:var(--vscode-editor-selectionBackground, rgba(148, 163, 184, .18))}.markstream-angular .code-action-btn__icon,.markstream-angular .code-action-btn svg{display:block;width:.8rem;height:.8rem;flex:0 0 auto}.markstream-angular .code-action-btn:active{transform:scale(.98)}.markstream-angular .code-action-btn:disabled{opacity:.5;cursor:not-allowed}.markstream-angular .code-action-btn:disabled:hover{background:transparent}.html-preview-frame__backdrop{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:50}.html-preview-frame__backdrop--dark{background-color:#0f172acc}.html-preview-frame{width:80vw;max-width:960px;height:70vh;background-color:#fff;border-radius:.5rem;overflow:hidden;box-shadow:0 10px 40px #00000040;display:flex;flex-direction:column}.html-preview-frame--dark{background-color:#020617;color:#e5e7eb;box-shadow:0 10px 40px #0009}.html-preview-frame__header{display:flex;justify-content:space-between;align-items:center;padding:.4rem .75rem;border-bottom:1px solid rgba(0,0,0,.06)}.html-preview-frame--dark .html-preview-frame__header{border-bottom-color:#94a3b859}.html-preview-frame__title{display:inline-flex;align-items:center;gap:.4rem;font-size:.75rem;font-weight:500;letter-spacing:.02em;text-transform:uppercase;opacity:.85}.html-preview-frame__dot{width:.5rem;height:.5rem;border-radius:999px;background-color:#22c55e}.html-preview-frame--dark .html-preview-frame__dot{background-color:#4ade80}.html-preview-frame__label{white-space:nowrap}.html-preview-frame__close{border:none;background:transparent;font-size:1.25rem;line-height:1;cursor:pointer}.html-preview-frame__close--dark{color:#e5e7eb}.html-preview-frame__iframe{width:100%;height:100%;border:none;display:block}@media(max-width:640px){.html-preview-frame{width:100vw;height:80vh;border-radius:0}}.ms-tooltip{position:fixed;padding:.4rem .65rem;font-size:.875rem;border-radius:.375rem;border-width:1px;border-style:solid;box-shadow:0 10px 15px #00000014;pointer-events:none;z-index:9999;opacity:0;transition:opacity .12s linear,transform .22s cubic-bezier(.16,1,.3,1)}.ms-tooltip[data-visible=true]{opacity:1}.ms-tooltip[data-dark=true]{background-color:#111827;color:#f9fafb;border-color:#374151}.ms-tooltip[data-dark=false],.ms-tooltip:not([data-dark=true]){background-color:#fff;color:#111827;border-color:#e5e7eb}.markstream-angular .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.markstream-angular .d2-block-body{position:relative}.markstream-angular .d2-source{font-family:var(--vscode-editor-font-family, "Fira Code", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace)}.markstream-angular .d2-code{white-space:pre;font-size:.875rem;line-height:1.5}.markstream-angular .d2-render{overflow:auto}.markstream-angular .d2-svg svg,.markstream-angular .infographic-render svg{max-width:100%;height:auto;display:block;margin:0 auto}.markstream-angular .mode-btn{opacity:.7;transition:opacity .2s}.markstream-angular .mode-btn.is-active{opacity:1;font-weight:600}.markstream-angular .d2-action-btn{opacity:.7;transition:opacity .2s}.markstream-angular .d2-action-btn:hover:not(:disabled){opacity:1}.markstream-angular .d2-action-btn:disabled{opacity:.3;cursor:not-allowed}.markstream-angular .d2-error{color:#dc2626;margin-top:.75rem}.markstream-angular .infographic-render{width:100%;min-height:320px;overflow:auto}