markstream-vue2 0.0.49 → 0.0.50

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/dist/index.js CHANGED
@@ -56,7 +56,7 @@ export * from "stream-markdown-parser";
56
56
  import { KATEX_COMMANDS, normalizeStandaloneBackslashT, setDefaultMathOptions as setDefaultMathOptions2 } from "stream-markdown-parser";
57
57
  import * as VueModule from "vue-demi";
58
58
  import { defineComponent, getCurrentInstance, computed, shallowRef, h, inject, ref, watch, readonly, useAttrs, onMounted, nextTick, onUpdated, onBeforeUnmount, provide, getCurrentScope, onScopeDispose, markRaw, reactive, onUnmounted } from "vue-demi";
59
- import { resolveStreamingTextState, normalizeShikiLanguage, createSmoothMarkdownStream, getHighlightRegistrationKey, getRuntimeShikiRegistrationConfig, registerHighlightOnce } from "markstream-core";
59
+ import { normalizeShikiLanguage, createSmoothMarkdownStream, getHighlightRegistrationKey, getRuntimeShikiRegistrationConfig, registerHighlightOnce } from "markstream-core";
60
60
  import { autoUpdate, offset, flip, shift, computePosition } from "@floating-ui/dom";
61
61
  function getVue2MinorVersion$1(version) {
62
62
  const raw = typeof version === "string" ? version : "";
@@ -616,6 +616,20 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
616
616
  },
617
617
  setup(__props) {
618
618
  const props = __props;
619
+ function settleAndMergeSegments(current, segmentId) {
620
+ return current.reduce((result, segment) => {
621
+ const nextSegment = segment.id === segmentId ? __spreadProps(__spreadValues({}, segment), { fading: false }) : segment;
622
+ const previousSegment = result[result.length - 1];
623
+ if (previousSegment && !previousSegment.fading && !nextSegment.fading) {
624
+ result[result.length - 1] = __spreadProps(__spreadValues({}, previousSegment), {
625
+ content: previousSegment.content + nextSegment.content
626
+ });
627
+ } else {
628
+ result.push(nextSegment);
629
+ }
630
+ return result;
631
+ }, []);
632
+ }
619
633
  const instance = getCurrentInstance();
620
634
  const attrs = computed(() => {
621
635
  var _a2, _b;
@@ -645,39 +659,58 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
645
659
  return "";
646
660
  return String(raw);
647
661
  });
648
- const settledCode = ref(props.node.code);
649
- const streamedDelta = ref("");
650
- const streamFadeVersion = ref(0);
651
- function getRenderedContent() {
652
- return settledCode.value + streamedDelta.value;
653
- }
662
+ const segments = ref(props.node.code ? [{ id: 0, content: props.node.code, fading: false }] : []);
663
+ const renderedCode = ref(props.node.code);
664
+ let nextSegmentId = 1;
654
665
  function setFullContent(next) {
655
- settledCode.value = next;
656
- streamedDelta.value = "";
666
+ var _a2;
667
+ if (segments.value.length === 1 && !((_a2 = segments.value[0]) == null ? void 0 : _a2.fading) && segments.value[0].content === next)
668
+ return;
669
+ segments.value = next ? [{ id: nextSegmentId++, content: next, fading: false }] : [];
657
670
  }
658
- function settleStreamedDelta() {
659
- if (!streamedDelta.value)
671
+ function settleSegment(segmentId) {
672
+ if (!segments.value.some((segment) => segment.id === segmentId && segment.fading))
660
673
  return;
661
- settledCode.value = getRenderedContent();
662
- streamedDelta.value = "";
674
+ segments.value = settleAndMergeSegments(segments.value, segmentId);
675
+ }
676
+ function streamedDeltaClass(segment) {
677
+ return segment.id % 2 === 0 ? "inline-code-stream-delta--a" : "inline-code-stream-delta--b";
663
678
  }
664
679
  watch(
665
680
  [() => props.node.code, streamStateKey, fadeEnabled],
666
681
  ([next]) => {
667
682
  const normalized = String(next != null ? next : "");
668
- const rendered = getRenderedContent();
669
683
  const key = streamStateKey.value;
670
684
  const previousPersisted = key ? inheritedTextStreamState == null ? void 0 : inheritedTextStreamState.get(key) : void 0;
671
- const previousContent = previousPersisted != null ? previousPersisted : rendered;
672
- const nextState = resolveStreamingTextState({
673
- nextContent: normalized,
674
- previousContent,
675
- typewriterEnabled: fadeEnabled.value
676
- });
677
- settledCode.value = nextState.settledContent;
678
- streamedDelta.value = nextState.streamedDelta;
679
- if (nextState.appended)
680
- streamFadeVersion.value += 1;
685
+ const previousContent = previousPersisted != null ? previousPersisted : renderedCode.value;
686
+ const resumeFromPersistedContent = previousPersisted !== void 0 && previousPersisted !== renderedCode.value;
687
+ if (!fadeEnabled.value) {
688
+ setFullContent(normalized);
689
+ } else if (normalized !== previousContent) {
690
+ if (previousContent && normalized.startsWith(previousContent)) {
691
+ const appendedContent = normalized.slice(previousContent.length);
692
+ const lastSegment = segments.value[segments.value.length - 1];
693
+ if (resumeFromPersistedContent) {
694
+ segments.value = [
695
+ { id: nextSegmentId++, content: previousContent, fading: false },
696
+ { id: nextSegmentId++, content: appendedContent, fading: true }
697
+ ];
698
+ } else if (lastSegment == null ? void 0 : lastSegment.fading) {
699
+ segments.value = [
700
+ ...segments.value.slice(0, -1),
701
+ __spreadProps(__spreadValues({}, lastSegment), { content: lastSegment.content + appendedContent })
702
+ ];
703
+ } else {
704
+ segments.value = [
705
+ ...segments.value,
706
+ { id: nextSegmentId++, content: appendedContent, fading: true }
707
+ ];
708
+ }
709
+ } else {
710
+ setFullContent(normalized);
711
+ }
712
+ }
713
+ renderedCode.value = normalized;
681
714
  if (key)
682
715
  inheritedTextStreamState == null ? void 0 : inheritedTextStreamState.set(key, normalized);
683
716
  },
@@ -688,17 +721,20 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
688
721
  (enabled) => {
689
722
  if (enabled)
690
723
  return;
691
- setFullContent(getRenderedContent());
724
+ setFullContent(renderedCode.value);
692
725
  }
693
726
  );
694
- const streamedDeltaClass = computed(() => streamFadeVersion.value % 2 === 0 ? "inline-code-stream-delta--a" : "inline-code-stream-delta--b");
695
- return { __sfc: true, props, instance, attrs, inheritedFade, inheritedTextStreamState, explicitFade, fadeEnabled, streamStateKey, settledCode, streamedDelta, streamFadeVersion, getRenderedContent, setFullContent, settleStreamedDelta, streamedDeltaClass };
727
+ return { __sfc: true, props, settleAndMergeSegments, instance, attrs, inheritedFade, inheritedTextStreamState, explicitFade, fadeEnabled, streamStateKey, segments, renderedCode, nextSegmentId, setFullContent, settleSegment, streamedDeltaClass };
696
728
  }
697
729
  });
698
- const InlineCodeNode_vue_vue_type_style_index_0_scoped_820dbd10_lang = "";
730
+ const InlineCodeNode_vue_vue_type_style_index_0_scoped_6ea4ef26_lang = "";
699
731
  var _sfc_render$E = function render6() {
700
732
  var _vm = this, _c = _vm._self._c, _setup = _vm._self._setupProxy;
701
- return _c("code", { staticClass: "inline text-[85%] px-1 py-0.5 rounded font-mono bg-[hsl(var(--secondary))] whitespace-normal break-words max-w-full before:content-[''] after:content-['']" }, [_setup.settledCode ? _c("span", [_vm._v(_vm._s(_setup.settledCode))]) : _vm._e(), _setup.streamedDelta ? _c("span", { staticClass: "inline-code-stream-delta", class: [_setup.streamedDeltaClass], on: { "animationend": _setup.settleStreamedDelta } }, [_vm._v(" " + _vm._s(_setup.streamedDelta) + " ")]) : _vm._e()]);
733
+ return _c("code", { staticClass: "inline text-[85%] px-1 py-0.5 rounded font-mono bg-[hsl(var(--secondary))] whitespace-normal break-words max-w-full before:content-[''] after:content-['']" }, _vm._l(_setup.segments, function(segment) {
734
+ return _c("span", { key: segment.id, class: segment.fading ? ["inline-code-stream-delta", _setup.streamedDeltaClass(segment)] : void 0, on: { "animationend": function($event) {
735
+ segment.fading && _setup.settleSegment(segment.id);
736
+ } } }, [_vm._v(" " + _vm._s(segment.content) + " ")]);
737
+ }), 0);
702
738
  };
703
739
  var _sfc_staticRenderFns$E = [];
704
740
  var __component__$E = /* @__PURE__ */ normalizeComponent(
@@ -707,7 +743,7 @@ var __component__$E = /* @__PURE__ */ normalizeComponent(
707
743
  _sfc_staticRenderFns$E,
708
744
  false,
709
745
  null,
710
- "820dbd10",
746
+ "6ea4ef26",
711
747
  null,
712
748
  null
713
749
  );
@@ -1094,6 +1130,20 @@ const _sfc_main$C = /* @__PURE__ */ defineComponent({
1094
1130
  emits: ["copy"],
1095
1131
  setup(__props) {
1096
1132
  const props = __props;
1133
+ function settleAndMergeSegments(current, segmentId) {
1134
+ return current.reduce((result, segment) => {
1135
+ const nextSegment = segmentId == null || segment.id === segmentId ? __spreadProps(__spreadValues({}, segment), { fading: false }) : segment;
1136
+ const previousSegment = result[result.length - 1];
1137
+ if (previousSegment && !previousSegment.fading && !nextSegment.fading) {
1138
+ result[result.length - 1] = __spreadProps(__spreadValues({}, previousSegment), {
1139
+ content: previousSegment.content + nextSegment.content
1140
+ });
1141
+ } else {
1142
+ result.push(nextSegment);
1143
+ }
1144
+ return result;
1145
+ }, []);
1146
+ }
1097
1147
  const katexReady = useKatexReady();
1098
1148
  const instance = getCurrentInstance();
1099
1149
  const attrs = computed(() => {
@@ -1125,54 +1175,76 @@ const _sfc_main$C = /* @__PURE__ */ defineComponent({
1125
1175
  return "";
1126
1176
  return String(raw);
1127
1177
  });
1128
- const settledContent = ref(props.node.content);
1129
- const streamedDelta = ref("");
1130
- const streamFadeVersion = ref(0);
1131
- function getRenderedContent() {
1132
- return settledContent.value + streamedDelta.value;
1133
- }
1178
+ const segments = ref(props.node.content ? [{ id: 0, content: props.node.content, fading: false }] : []);
1179
+ const renderedContent = ref(props.node.content);
1180
+ let nextSegmentId = 1;
1134
1181
  function setFullContent(next) {
1135
- settledContent.value = next;
1136
- streamedDelta.value = "";
1182
+ var _a2;
1183
+ if (segments.value.length === 1 && !((_a2 = segments.value[0]) == null ? void 0 : _a2.fading) && segments.value[0].content === next)
1184
+ return;
1185
+ segments.value = next ? [{ id: nextSegmentId++, content: next, fading: false }] : [];
1186
+ }
1187
+ function settleSegment(segmentId) {
1188
+ if (!segments.value.some((segment) => segment.id === segmentId && segment.fading))
1189
+ return;
1190
+ segments.value = settleAndMergeSegments(segments.value, segmentId);
1137
1191
  }
1138
- function settleStreamedDelta() {
1139
- if (!streamedDelta.value)
1192
+ function settleFadingSegments() {
1193
+ if (!segments.value.some((segment) => segment.fading))
1140
1194
  return;
1141
- settledContent.value = getRenderedContent();
1142
- streamedDelta.value = "";
1195
+ segments.value = settleAndMergeSegments(segments.value);
1196
+ }
1197
+ function streamedDeltaClass(segment) {
1198
+ return segment.id % 2 === 0 ? "text-node-stream-delta--a" : "text-node-stream-delta--b";
1143
1199
  }
1144
1200
  watch(
1145
1201
  [() => props.node.content, streamStateKey, fadeEnabled, () => inheritedStreamVersion == null ? void 0 : inheritedStreamVersion.value],
1146
1202
  ([next]) => {
1147
1203
  const normalized = String(next != null ? next : "");
1148
- const rendered = getRenderedContent();
1149
1204
  const key = streamStateKey.value;
1150
1205
  const previousPersisted = key ? inheritedTextStreamState == null ? void 0 : inheritedTextStreamState.get(key) : void 0;
1151
- const previousContent = previousPersisted != null ? previousPersisted : rendered;
1206
+ const previousContent = previousPersisted != null ? previousPersisted : renderedContent.value;
1207
+ const resumeFromPersistedContent = previousPersisted !== void 0 && previousPersisted !== renderedContent.value;
1152
1208
  if (!fadeEnabled.value) {
1153
1209
  setFullContent(normalized);
1210
+ renderedContent.value = normalized;
1154
1211
  if (key)
1155
1212
  inheritedTextStreamState == null ? void 0 : inheritedTextStreamState.set(key, normalized);
1156
1213
  return;
1157
1214
  }
1158
1215
  if (normalized === previousContent) {
1159
- if (streamedDelta.value)
1160
- settleStreamedDelta();
1161
- else if (rendered !== normalized)
1216
+ if (segments.value.some((segment) => segment.fading))
1217
+ settleFadingSegments();
1218
+ else if (renderedContent.value !== normalized)
1162
1219
  setFullContent(normalized);
1163
1220
  if (key)
1164
1221
  inheritedTextStreamState == null ? void 0 : inheritedTextStreamState.set(key, normalized);
1222
+ renderedContent.value = normalized;
1165
1223
  return;
1166
1224
  }
1167
- const nextState = resolveStreamingTextState({
1168
- nextContent: normalized,
1169
- previousContent,
1170
- typewriterEnabled: fadeEnabled.value
1171
- });
1172
- settledContent.value = nextState.settledContent;
1173
- streamedDelta.value = nextState.streamedDelta;
1174
- if (nextState.appended)
1175
- streamFadeVersion.value += 1;
1225
+ if (previousContent && normalized.startsWith(previousContent)) {
1226
+ const appendedContent = normalized.slice(previousContent.length);
1227
+ const lastSegment = segments.value[segments.value.length - 1];
1228
+ if (resumeFromPersistedContent) {
1229
+ segments.value = [
1230
+ { id: nextSegmentId++, content: previousContent, fading: false },
1231
+ { id: nextSegmentId++, content: appendedContent, fading: true }
1232
+ ];
1233
+ } else if (lastSegment == null ? void 0 : lastSegment.fading) {
1234
+ segments.value = [
1235
+ ...segments.value.slice(0, -1),
1236
+ __spreadProps(__spreadValues({}, lastSegment), { content: lastSegment.content + appendedContent })
1237
+ ];
1238
+ } else {
1239
+ segments.value = [
1240
+ ...segments.value,
1241
+ { id: nextSegmentId++, content: appendedContent, fading: true }
1242
+ ];
1243
+ }
1244
+ } else {
1245
+ setFullContent(normalized);
1246
+ }
1247
+ renderedContent.value = normalized;
1176
1248
  if (key)
1177
1249
  inheritedTextStreamState == null ? void 0 : inheritedTextStreamState.set(key, normalized);
1178
1250
  },
@@ -1183,17 +1255,20 @@ const _sfc_main$C = /* @__PURE__ */ defineComponent({
1183
1255
  (enabled) => {
1184
1256
  if (enabled)
1185
1257
  return;
1186
- setFullContent(getRenderedContent());
1258
+ setFullContent(renderedContent.value);
1187
1259
  }
1188
1260
  );
1189
- const streamedDeltaClass = computed(() => streamFadeVersion.value % 2 === 0 ? "text-node-stream-delta--a" : "text-node-stream-delta--b");
1190
- return { __sfc: true, props, katexReady, instance, attrs, inheritedFade, inheritedTextStreamState, inheritedStreamVersion, explicitFade, fadeEnabled, streamStateKey, settledContent, streamedDelta, streamFadeVersion, getRenderedContent, setFullContent, settleStreamedDelta, streamedDeltaClass };
1261
+ return { __sfc: true, props, settleAndMergeSegments, katexReady, instance, attrs, inheritedFade, inheritedTextStreamState, inheritedStreamVersion, explicitFade, fadeEnabled, streamStateKey, segments, renderedContent, nextSegmentId, setFullContent, settleSegment, settleFadingSegments, streamedDeltaClass };
1191
1262
  }
1192
1263
  });
1193
- const TextNode_vue_vue_type_style_index_0_scoped_e8e0f51e_lang = "";
1264
+ const TextNode_vue_vue_type_style_index_0_scoped_00951658_lang = "";
1194
1265
  var _sfc_render$C = function render8() {
1195
1266
  var _vm = this, _c = _vm._self._c, _setup = _vm._self._setupProxy;
1196
- return _c("span", { staticClass: "whitespace-pre-wrap break-words text-node", class: [_setup.katexReady && _vm.node.center ? "text-node-center" : ""] }, [_setup.settledContent ? _c("span", [_vm._v(_vm._s(_setup.settledContent))]) : _vm._e(), _setup.streamedDelta ? _c("span", { staticClass: "text-node-stream-delta", class: [_setup.streamedDeltaClass], on: { "animationend": _setup.settleStreamedDelta } }, [_vm._v(" " + _vm._s(_setup.streamedDelta) + " ")]) : _vm._e()]);
1267
+ return _c("span", { staticClass: "whitespace-pre-wrap break-words text-node", class: [_setup.katexReady && _vm.node.center ? "text-node-center" : ""] }, _vm._l(_setup.segments, function(segment) {
1268
+ return _c("span", { key: segment.id, class: segment.fading ? ["text-node-stream-delta", _setup.streamedDeltaClass(segment)] : void 0, on: { "animationend": function($event) {
1269
+ segment.fading && _setup.settleSegment(segment.id);
1270
+ } } }, [_vm._v(" " + _vm._s(segment.content) + " ")]);
1271
+ }), 0);
1197
1272
  };
1198
1273
  var _sfc_staticRenderFns$C = [];
1199
1274
  var __component__$C = /* @__PURE__ */ normalizeComponent(
@@ -1202,7 +1277,7 @@ var __component__$C = /* @__PURE__ */ normalizeComponent(
1202
1277
  _sfc_staticRenderFns$C,
1203
1278
  false,
1204
1279
  null,
1205
- "e8e0f51e",
1280
+ "00951658",
1206
1281
  null,
1207
1282
  null
1208
1283
  );