@lapismd/mira 0.1.1 → 0.1.2
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/CHANGELOG.md +13 -0
- package/dist/extensions/markdown-editing.d.ts +2 -0
- package/dist/extensions/markdown-editing.d.ts.map +1 -1
- package/dist/internal/codemirror/base/index.d.ts.map +1 -1
- package/dist/internal/codemirror/base/index.js +3 -0
- package/dist/preview/components/frontmatter-property-text-input.svelte +13 -7
- package/dist/preview/components/frontmatter-property-text-input.svelte.d.ts.map +1 -1
- package/dist/preview/components/frontmatter.svelte +38 -3
- package/dist/preview/components/frontmatter.svelte.d.ts.map +1 -1
- package/dist/preview/editable-markdown-preview/editable-markdown-surface.svelte +15 -11
- package/dist/preview/editable-markdown-preview/editable-markdown-surface.svelte.d.ts.map +1 -1
- package/dist/preview/editable-markdown-preview/editing-session.d.ts.map +1 -1
- package/dist/preview/editable-markdown-preview/editing-session.js +1 -0
- package/dist/preview/editable-markdown-preview/serialized-writer.d.ts +1 -0
- package/dist/preview/editable-markdown-preview/serialized-writer.d.ts.map +1 -1
- package/dist/preview/editable-markdown-preview/serialized-writer.js +5 -2
- package/dist/preview/frontmatter/controller.svelte.d.ts +3 -1
- package/dist/preview/frontmatter/controller.svelte.d.ts.map +1 -1
- package/dist/preview/frontmatter/controller.svelte.js +16 -5
- package/dist/preview/frontmatter/record-snapshot.d.ts +3 -0
- package/dist/preview/frontmatter/record-snapshot.d.ts.map +1 -0
- package/dist/preview/frontmatter/record-snapshot.js +39 -0
- package/dist/preview/frontmatter/types.d.ts +1 -1
- package/dist/preview/frontmatter/types.d.ts.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @lapismd/mira
|
|
2
2
|
|
|
3
|
+
## 0.1.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#21](https://github.com/lapismd/mira-mde/pull/21) [`377bfc8`](https://github.com/lapismd/mira-mde/commit/377bfc805eac2961fd879f03e28e80273cb8702c) Thanks [@stevejuma](https://github.com/stevejuma)! - Expose immutable previous frontmatter records and retain focused text edits through external metadata refresh and deferred commits.
|
|
8
|
+
|
|
9
|
+
- [#21](https://github.com/lapismd/mira-mde/pull/21) [`caa2452`](https://github.com/lapismd/mira-mde/commit/caa24527be436a706ef083c63e76694a180044b7) Thanks [@stevejuma](https://github.com/stevejuma)! - Expose an optional synchronous Markdown input lease that leaves persistence and recovery under the existing save barriers.
|
|
10
|
+
|
|
11
|
+
- [#21](https://github.com/lapismd/mira-mde/pull/21) [`9142fa4`](https://github.com/lapismd/mira-mde/commit/9142fa4ed786d63fc54a04654f3b2c5ef48bfe47) Thanks [@stevejuma](https://github.com/stevejuma)! - Retain preview source sessions when adapter admission or diagnostic callbacks observe reactive state.
|
|
12
|
+
|
|
13
|
+
- [#21](https://github.com/lapismd/mira-mde/pull/21) [`a7ab556`](https://github.com/lapismd/mira-mde/commit/a7ab556fc55e612210097a060d1b96917fbb2ed3) Thanks [@stevejuma](https://github.com/stevejuma)! - Align the portable overlay runtime with released Bits UI 2.20.2 while preserving
|
|
14
|
+
the existing public editor and preview contracts.
|
|
15
|
+
|
|
3
16
|
## 0.1.1
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -20,6 +20,8 @@ export type MiraMarkdownTextSession = {
|
|
|
20
20
|
/** A portable persistence barrier owned by one source-bound Markdown writer. */
|
|
21
21
|
export type MiraMarkdownEditingSession = {
|
|
22
22
|
readonly dirty: boolean;
|
|
23
|
+
/** Block new input synchronously without flushing or acknowledging text. */
|
|
24
|
+
hold?(): () => void;
|
|
23
25
|
flush(): Promise<void>;
|
|
24
26
|
protect(): Promise<() => void>;
|
|
25
27
|
readonly text?: MiraMarkdownTextSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-editing.d.ts","sourceRoot":"","sources":["../../src/extensions/markdown-editing.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAAC;AAEH,sFAAsF;AACtF,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,IAAI,IAAI,CAAC;IACpB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,eAAe,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACvD,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC;CACzC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"markdown-editing.d.ts","sourceRoot":"","sources":["../../src/extensions/markdown-editing.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAAC;AAEH,sFAAsF;AACtF,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,IAAI,IAAI,CAAC;IACpB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,eAAe,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACvD,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,4EAA4E;IAC5E,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;IACpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC;CACzC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/internal/codemirror/base/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAIf,MAAM,0BAA0B,CAAC;AAkBlC,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAmBhE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,kCAAkC,EAClC,4BAA4B,EAC5B,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,MAAM,EACN,KAAK,gBAAgB,GACtB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,6BAA6B,EAC7B,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,GACnC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5E,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EACT,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GACxD,KAAK,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,wCAuC/B,CAAC;AAEH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/internal/codemirror/base/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAIf,MAAM,0BAA0B,CAAC;AAkBlC,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAmBhE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,kCAAkC,EAClC,4BAA4B,EAC5B,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,MAAM,EACN,KAAK,gBAAgB,GACtB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,6BAA6B,EAC7B,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,GACnC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5E,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EACT,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GACxD,KAAK,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,wCAuC/B,CAAC;AAEH,eAAO,MAAM,eAAe,WAuN1B,CAAC;AAgOH,wBAAgB,4BAA4B,IAAI,SAAS,CAExD;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qBAA0B,GAClC,SAAS,EAAE,CAoEb"}
|
|
@@ -52,6 +52,9 @@ export const miraClassHighlighter = tagHighlighter([
|
|
|
52
52
|
]);
|
|
53
53
|
export const miraEditorTheme = EditorView.theme({
|
|
54
54
|
"&": {
|
|
55
|
+
// CodeMirror's panel/gutter z-indices are internal to this editor, so they
|
|
56
|
+
// cannot outrank a surrounding host's settings or other modal overlays.
|
|
57
|
+
isolation: "isolate",
|
|
55
58
|
height: "100%",
|
|
56
59
|
color: "var(--mira-foreground)",
|
|
57
60
|
backgroundColor: "var(--mira-editor-background)",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
let suggestionVersion = 0;
|
|
32
32
|
let suggestions = $state<string[]>([]);
|
|
33
33
|
let committedSuggestion: string | null = null;
|
|
34
|
+
let editCommit: Props["onCommit"] | undefined;
|
|
34
35
|
|
|
35
36
|
const filteredSuggestions = $derived(
|
|
36
37
|
filterFrontmatterValueSuggestions(suggestions, query),
|
|
@@ -88,7 +89,9 @@
|
|
|
88
89
|
}
|
|
89
90
|
committedSuggestion = suggestion;
|
|
90
91
|
open = false;
|
|
91
|
-
onCommit
|
|
92
|
+
const commit = editCommit ?? onCommit;
|
|
93
|
+
editCommit = undefined;
|
|
94
|
+
commit(suggestion);
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
function handleBlur(event: FocusEvent): void {
|
|
@@ -96,16 +99,19 @@
|
|
|
96
99
|
if (nextFocus?.dataset.propertyValueSuggestion === "true") {
|
|
97
100
|
return;
|
|
98
101
|
}
|
|
102
|
+
const nextValue = currentValue();
|
|
103
|
+
const commit = editCommit ?? onCommit;
|
|
104
|
+
const alreadyCommitted = nextValue === committedSuggestion;
|
|
99
105
|
queueMicrotask(() => {
|
|
100
106
|
if (editorEl?.ownerDocument.activeElement !== editorEl) {
|
|
101
107
|
open = false;
|
|
102
|
-
|
|
103
|
-
if (
|
|
108
|
+
editCommit = undefined;
|
|
109
|
+
if (alreadyCommitted) {
|
|
104
110
|
committedSuggestion = null;
|
|
105
111
|
return;
|
|
106
112
|
}
|
|
107
113
|
committedSuggestion = null;
|
|
108
|
-
|
|
114
|
+
commit(nextValue);
|
|
109
115
|
}
|
|
110
116
|
});
|
|
111
117
|
}
|
|
@@ -179,12 +185,14 @@
|
|
|
179
185
|
void loadSuggestions(query);
|
|
180
186
|
}}
|
|
181
187
|
onfocus={() => {
|
|
188
|
+
editCommit = onCommit;
|
|
182
189
|
query = currentValue();
|
|
183
190
|
open = true;
|
|
184
191
|
activeIndex = -1;
|
|
185
192
|
void loadSuggestions(query);
|
|
186
193
|
}}
|
|
187
194
|
oninput={() => {
|
|
195
|
+
editCommit ??= onCommit;
|
|
188
196
|
committedSuggestion = null;
|
|
189
197
|
query = currentValue();
|
|
190
198
|
open = true;
|
|
@@ -193,9 +201,7 @@
|
|
|
193
201
|
}}
|
|
194
202
|
onblur={handleBlur}
|
|
195
203
|
onkeydown={handleKeydown}
|
|
196
|
-
>
|
|
197
|
-
{value}
|
|
198
|
-
</div>
|
|
204
|
+
></div>
|
|
199
205
|
{/snippet}
|
|
200
206
|
</Popover.Trigger>
|
|
201
207
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter-property-text-input.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/components/frontmatter-property-text-input.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAI7B,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;
|
|
1
|
+
{"version":3,"file":"frontmatter-property-text-input.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/components/frontmatter-property-text-input.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAI7B,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AA8LJ,QAAA,MAAM,4BAA4B,2CAAwC,CAAC;AAC3E,KAAK,4BAA4B,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;AACpF,eAAe,4BAA4B,CAAC"}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
import Link from "./link.svelte";
|
|
20
20
|
import FrontmatterPropertyNameInput from "./frontmatter-property-name-input.svelte";
|
|
21
21
|
import FrontmatterPropertyTextInput from "./frontmatter-property-text-input.svelte";
|
|
22
|
+
import { snapshotFrontmatterRecord } from "../frontmatter/record-snapshot";
|
|
22
23
|
import FrontmatterPropertyValueInput from "./frontmatter-property-value-input.svelte";
|
|
23
24
|
import * as DropdownMenu from "../../ui/dropdown-menu/index.js";
|
|
24
25
|
import type { MiraFileAdapter } from "@lapismd/mira/extensions";
|
|
@@ -122,12 +123,20 @@
|
|
|
122
123
|
});
|
|
123
124
|
|
|
124
125
|
const parseError = $derived(controller.parseError);
|
|
126
|
+
const renderedTextCommits = new WeakMap<
|
|
127
|
+
FrontmatterProperty,
|
|
128
|
+
(value: string) => void
|
|
129
|
+
>();
|
|
125
130
|
const rows = $derived.by(() => {
|
|
126
131
|
controller.revision;
|
|
127
132
|
if (controller.parseError) {
|
|
128
133
|
return [] as FrontmatterProperty[];
|
|
129
134
|
}
|
|
130
|
-
|
|
135
|
+
const owner = controller;
|
|
136
|
+
const previousRecord = snapshotFrontmatterRecord(owner.getRecord());
|
|
137
|
+
const properties = manager.properties(previousRecord);
|
|
138
|
+
bindRenderedTextCommits(properties, owner, previousRecord);
|
|
139
|
+
return properties;
|
|
131
140
|
});
|
|
132
141
|
const typeOptions = $derived.by(() => {
|
|
133
142
|
controller.revision;
|
|
@@ -154,6 +163,32 @@
|
|
|
154
163
|
controller.updateProperty(property.path, nextValue);
|
|
155
164
|
}
|
|
156
165
|
|
|
166
|
+
function bindRenderedTextCommits(
|
|
167
|
+
properties: FrontmatterProperty[],
|
|
168
|
+
owner: FrontmatterController,
|
|
169
|
+
previousRecord: Readonly<Record<string, unknown>>,
|
|
170
|
+
): void {
|
|
171
|
+
const sourcePath = owner.sourcePath;
|
|
172
|
+
const onActionError = manager.config.onActionError;
|
|
173
|
+
for (const property of properties) {
|
|
174
|
+
const path = [...property.path];
|
|
175
|
+
renderedTextCommits.set(property, (value) => {
|
|
176
|
+
if (owner.sourcePath !== sourcePath) {
|
|
177
|
+
onActionError?.(new Error("Frontmatter edit target changed"), "edit");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
owner.updateProperty(path, value, previousRecord);
|
|
181
|
+
});
|
|
182
|
+
bindRenderedTextCommits(property.children, owner, previousRecord);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function renderedTextCommit(property: FrontmatterProperty) {
|
|
187
|
+
const commit = renderedTextCommits.get(property);
|
|
188
|
+
if (!commit) throw new Error("Rendered frontmatter edit is unavailable");
|
|
189
|
+
return commit;
|
|
190
|
+
}
|
|
191
|
+
|
|
157
192
|
function addProperty(): void {
|
|
158
193
|
const nextName = controller.addProperty("text");
|
|
159
194
|
if (nextName) {
|
|
@@ -319,7 +354,7 @@
|
|
|
319
354
|
|
|
320
355
|
function handleActionError(
|
|
321
356
|
error: unknown,
|
|
322
|
-
action: "copy" | "cut" | "paste" | "remove",
|
|
357
|
+
action: "copy" | "cut" | "paste" | "remove" | "edit",
|
|
323
358
|
): void {
|
|
324
359
|
config.onActionError?.(error, action);
|
|
325
360
|
}
|
|
@@ -646,7 +681,7 @@
|
|
|
646
681
|
{config}
|
|
647
682
|
ariaLabel={`${property.pathString} value`}
|
|
648
683
|
class={`metadata-input metadata-input-longtext metadata-property-value-item min-w-0 grow bg-transparent px-2 py-1 outline-none ${valueClass(property.kind)}`}
|
|
649
|
-
onCommit={(
|
|
684
|
+
onCommit={renderedTextCommit(property)}
|
|
650
685
|
/>
|
|
651
686
|
{:else if toBuiltinFrontmatterKind(property.kind) === "number"}
|
|
652
687
|
<input
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/components/frontmatter.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EASH,qBAAqB,EAIrB,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"frontmatter.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/components/frontmatter.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EASH,qBAAqB,EAIrB,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AAS/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAO9D,KAAK,KAAK,GAAG;IACX,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,eAAe,CAAC,EAAE,0BAA0B,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC,CAAC;AAmrBJ,QAAA,MAAM,WAAW,8CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -146,17 +146,21 @@
|
|
|
146
146
|
},
|
|
147
147
|
});
|
|
148
148
|
writer = activeWriter;
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
:
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
:
|
|
158
|
-
|
|
159
|
-
|
|
149
|
+
// Adapter observations must not become dependencies of this source lifetime.
|
|
150
|
+
const attached = untrack(() =>
|
|
151
|
+
attachMarkdownEditingSession({
|
|
152
|
+
writer: activeWriter,
|
|
153
|
+
sourcePath: key,
|
|
154
|
+
register: adapter?.registerEditingSession
|
|
155
|
+
? (path, session) => adapter.registerEditingSession?.(path, session)
|
|
156
|
+
: undefined,
|
|
157
|
+
bind: adapter?.bindMarkdownEditingSession
|
|
158
|
+
? (path, session) =>
|
|
159
|
+
adapter.bindMarkdownEditingSession!(path, session)
|
|
160
|
+
: undefined,
|
|
161
|
+
synchronizeProtection: tick,
|
|
162
|
+
}),
|
|
163
|
+
);
|
|
160
164
|
persist = attached.write ?? write;
|
|
161
165
|
|
|
162
166
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable-markdown-surface.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/editable-markdown-surface.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EACR,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAclC,KAAK,mBAAmB,GAAG,CACzB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,KACP,IAAI,CAAC;AAEV,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,2BAA2B,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;
|
|
1
|
+
{"version":3,"file":"editable-markdown-surface.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/editable-markdown-surface.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EACR,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAclC,KAAK,mBAAmB,GAAG,CACzB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,KACP,IAAI,CAAC;AAEV,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,2BAA2B,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;AAyUJ,QAAA,MAAM,uBAAuB;iBA1CF,OAAO,CAAC,OAAO,CAAC;gBAIjB,OAAO,CAAC,OAAO,CAAC;iCAsC2B,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editing-session.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/editing-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,+FAA+F;AAC/F,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,MAAM,EAAE,wBAAwB,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,eAAe,CAAC,4BAA4B,CAAC,CAAC;IACrD,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C,GAAG;IACF,OAAO,EAAE,0BAA0B,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,IAAI,IAAI,CAAC;CAChB,
|
|
1
|
+
{"version":3,"file":"editing-session.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/editing-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,+FAA+F;AAC/F,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,MAAM,EAAE,wBAAwB,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,eAAe,CAAC,4BAA4B,CAAC,CAAC;IACrD,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C,GAAG;IACF,OAAO,EAAE,0BAA0B,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,IAAI,IAAI,CAAC;CAChB,CAkGA"}
|
|
@@ -25,6 +25,7 @@ export declare class SerializedMarkdownWriter {
|
|
|
25
25
|
update(value: string): boolean;
|
|
26
26
|
subscribe(listener: (state: SerializedMarkdownWriterState) => void): () => void;
|
|
27
27
|
protectRecovery(): Promise<MiraMarkdownRecoveryLease>;
|
|
28
|
+
hold(): () => void;
|
|
28
29
|
protect(): Promise<() => void>;
|
|
29
30
|
replaceExternal(value: string): boolean;
|
|
30
31
|
flush(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialized-writer.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/serialized-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,mCAAmC,CAAC;AAC3C,MAAM,MAAM,6BAA6B,GAAG,qBAAqB,CAAC;AAElE,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IAEzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA2B;IAE1D,OAAO,CAAC,KAAK,CAA8C;IAE3D,OAAO,CAAC,YAAY,CAAiC;IAErD,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAEtB;IAEJ,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,KAAK,CAAsB;gBAEvB,OAAO,EAAE,OAAO;IAS5B,IAAI,KAAK,IAAI,6BAA6B,CASzC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQ9B,SAAS,CACP,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,GACvD,MAAM,IAAI;IAQP,eAAe,IAAI,OAAO,CAAC,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"serialized-writer.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/serialized-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,mCAAmC,CAAC;AAC3C,MAAM,MAAM,6BAA6B,GAAG,qBAAqB,CAAC;AAElE,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IAEzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA2B;IAE1D,OAAO,CAAC,KAAK,CAA8C;IAE3D,OAAO,CAAC,YAAY,CAAiC;IAErD,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAEtB;IAEJ,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,KAAK,CAAsB;gBAEvB,OAAO,EAAE,OAAO;IAS5B,IAAI,KAAK,IAAI,6BAA6B,CASzC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQ9B,SAAS,CACP,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,GACvD,MAAM,IAAI;IAQP,eAAe,IAAI,OAAO,CAAC,yBAAyB,CAAC;IA2C3D,IAAI,IAAI,MAAM,IAAI;IAYZ,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;IAYpC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAiBjC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IA0B/B,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,QAAQ;YAYF,WAAW;IA2BzB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,IAAI;CAIb"}
|
|
@@ -91,17 +91,20 @@ export class SerializedMarkdownWriter {
|
|
|
91
91
|
throw error;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
|
-
|
|
94
|
+
hold() {
|
|
95
95
|
this.protections++;
|
|
96
96
|
this.emit();
|
|
97
97
|
let released = false;
|
|
98
|
-
|
|
98
|
+
return () => {
|
|
99
99
|
if (released)
|
|
100
100
|
return;
|
|
101
101
|
released = true;
|
|
102
102
|
this.protections--;
|
|
103
103
|
this.emit();
|
|
104
104
|
};
|
|
105
|
+
}
|
|
106
|
+
async protect() {
|
|
107
|
+
const release = this.hold();
|
|
105
108
|
try {
|
|
106
109
|
if (!(await this.flush()))
|
|
107
110
|
throw this.error ?? new Error("Unable to protect unsaved Markdown");
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { FrontmatterPathSegment, FrontmatterProperty, FrontmatterPropertyKind } from "./types";
|
|
2
2
|
import { type FrontmatterPropertyManager } from "./manager";
|
|
3
3
|
export type FrontmatterControllerCommit = {
|
|
4
|
+
readonly previousRecord: Readonly<Record<string, unknown>>;
|
|
4
5
|
record: Record<string, unknown>;
|
|
5
6
|
yaml: string;
|
|
6
7
|
replacement: string;
|
|
@@ -45,9 +46,10 @@ export declare class FrontmatterController {
|
|
|
45
46
|
syncRecord(nextRecord: Record<string, unknown>, options?: {
|
|
46
47
|
commit?: boolean;
|
|
47
48
|
}): void;
|
|
49
|
+
private replaceRecord;
|
|
48
50
|
commitYaml(nextYaml: string): void;
|
|
49
51
|
commitRecord(nextRecord: Record<string, unknown>): void;
|
|
50
|
-
updateProperty(path: FrontmatterPathSegment[], nextValue: unknown): void;
|
|
52
|
+
updateProperty(path: FrontmatterPathSegment[], nextValue: unknown, previousRecord?: Readonly<Record<string, unknown>>): void;
|
|
51
53
|
addProperty(kind?: FrontmatterPropertyKind): string | null;
|
|
52
54
|
renameProperty(path: FrontmatterPathSegment[], nextKey: string): void;
|
|
53
55
|
removeProperty(path: FrontmatterPathSegment[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/frontmatter/controller.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"controller.svelte.d.ts","sourceRoot":"","sources":["../../../src/preview/frontmatter/controller.svelte.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parseFrontmatterYaml } from "./parse";
|
|
2
|
+
import { snapshotFrontmatterRecord } from "./record-snapshot";
|
|
2
3
|
import { addFrontmatterRecordProperty, mergeFrontmatterRecordProperties, removeFrontmatterRecordProperty, renameFrontmatterRecordProperty, updateFrontmatterRecord, } from "./properties";
|
|
3
4
|
import { createFrontmatterReplacement, serializeFrontmatterRecord, } from "./serialize";
|
|
4
5
|
import { createFrontmatterPropertyManager, } from "./manager";
|
|
@@ -72,6 +73,9 @@ export class FrontmatterController {
|
|
|
72
73
|
if (!options.commit && nextYaml === this.yaml && this.revision > 0) {
|
|
73
74
|
return;
|
|
74
75
|
}
|
|
76
|
+
const previousRecord = options.commit
|
|
77
|
+
? snapshotFrontmatterRecord(this.record)
|
|
78
|
+
: undefined;
|
|
75
79
|
const parsed = parseFrontmatterYaml(nextYaml);
|
|
76
80
|
this.yaml = nextYaml;
|
|
77
81
|
if (parsed.ok) {
|
|
@@ -84,20 +88,26 @@ export class FrontmatterController {
|
|
|
84
88
|
}
|
|
85
89
|
this.revision += 1;
|
|
86
90
|
if (options.commit) {
|
|
87
|
-
void this.commitCurrent();
|
|
91
|
+
void this.commitCurrent(previousRecord);
|
|
88
92
|
}
|
|
89
93
|
}
|
|
90
94
|
syncRecord(nextRecord, options = {}) {
|
|
95
|
+
this.replaceRecord(nextRecord, options);
|
|
96
|
+
}
|
|
97
|
+
replaceRecord(nextRecord, options, priorRecord = this.record) {
|
|
91
98
|
const nextYaml = serializeFrontmatterRecord(nextRecord);
|
|
92
99
|
if (!options.commit && nextYaml === this.yaml && this.revision > 0) {
|
|
93
100
|
return;
|
|
94
101
|
}
|
|
102
|
+
const previousRecord = options.commit
|
|
103
|
+
? snapshotFrontmatterRecord(priorRecord)
|
|
104
|
+
: undefined;
|
|
95
105
|
this.record = cloneRecord(nextRecord);
|
|
96
106
|
this.yaml = nextYaml;
|
|
97
107
|
this.parseError = null;
|
|
98
108
|
this.revision += 1;
|
|
99
109
|
if (options.commit) {
|
|
100
|
-
void this.commitCurrent();
|
|
110
|
+
void this.commitCurrent(previousRecord);
|
|
101
111
|
}
|
|
102
112
|
}
|
|
103
113
|
commitYaml(nextYaml) {
|
|
@@ -106,11 +116,11 @@ export class FrontmatterController {
|
|
|
106
116
|
commitRecord(nextRecord) {
|
|
107
117
|
this.syncRecord(nextRecord, { commit: true });
|
|
108
118
|
}
|
|
109
|
-
updateProperty(path, nextValue) {
|
|
119
|
+
updateProperty(path, nextValue, previousRecord = this.record) {
|
|
110
120
|
if (this.parseError) {
|
|
111
121
|
return;
|
|
112
122
|
}
|
|
113
|
-
this.
|
|
123
|
+
this.replaceRecord(updateFrontmatterRecord(previousRecord, path, nextValue), { commit: true }, previousRecord);
|
|
114
124
|
}
|
|
115
125
|
addProperty(kind = "text") {
|
|
116
126
|
if (this.parseError) {
|
|
@@ -149,7 +159,7 @@ export class FrontmatterController {
|
|
|
149
159
|
}
|
|
150
160
|
this.updateProperty(property.path, this.propertyManager.coerceValue(property.value, kind, property));
|
|
151
161
|
}
|
|
152
|
-
async commitCurrent() {
|
|
162
|
+
async commitCurrent(previousRecord) {
|
|
153
163
|
if (this.suppressCommit) {
|
|
154
164
|
return;
|
|
155
165
|
}
|
|
@@ -167,6 +177,7 @@ export class FrontmatterController {
|
|
|
167
177
|
? `${markdown.slice(0, from)}${replacement}${markdown.slice(to)}`
|
|
168
178
|
: undefined;
|
|
169
179
|
const commit = {
|
|
180
|
+
previousRecord,
|
|
170
181
|
record: cloneRecord(this.record),
|
|
171
182
|
yaml,
|
|
172
183
|
replacement,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-snapshot.d.ts","sourceRoot":"","sources":["../../../src/preview/frontmatter/record-snapshot.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASnC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Independent portable record authority for one rendered edit or commit. */
|
|
2
|
+
export function snapshotFrontmatterRecord(record) {
|
|
3
|
+
let snapshot;
|
|
4
|
+
try {
|
|
5
|
+
snapshot = JSON.parse(JSON.stringify(record));
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
snapshot = copyValue(record, new WeakMap());
|
|
9
|
+
}
|
|
10
|
+
freezeValue(snapshot, new WeakSet());
|
|
11
|
+
return snapshot;
|
|
12
|
+
}
|
|
13
|
+
function copyValue(value, seen) {
|
|
14
|
+
if (!value || typeof value !== "object")
|
|
15
|
+
return value;
|
|
16
|
+
if (value instanceof Date)
|
|
17
|
+
return value.toISOString();
|
|
18
|
+
const existing = seen.get(value);
|
|
19
|
+
if (existing)
|
|
20
|
+
return existing;
|
|
21
|
+
const copy = Array.isArray(value) ? [] : {};
|
|
22
|
+
seen.set(value, copy);
|
|
23
|
+
for (const [key, item] of Object.entries(value))
|
|
24
|
+
Object.defineProperty(copy, key, {
|
|
25
|
+
value: copyValue(item, seen),
|
|
26
|
+
enumerable: true,
|
|
27
|
+
writable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
});
|
|
30
|
+
return copy;
|
|
31
|
+
}
|
|
32
|
+
function freezeValue(value, seen) {
|
|
33
|
+
if (!value || typeof value !== "object" || seen.has(value))
|
|
34
|
+
return;
|
|
35
|
+
seen.add(value);
|
|
36
|
+
for (const item of Object.values(value))
|
|
37
|
+
freezeValue(item, seen);
|
|
38
|
+
Object.freeze(value);
|
|
39
|
+
}
|
|
@@ -36,7 +36,7 @@ export type FrontmatterConfig = {
|
|
|
36
36
|
propertySuggestions?: FrontmatterPropertySuggestionSource;
|
|
37
37
|
valueSuggestions?: FrontmatterValueSuggestionSource;
|
|
38
38
|
clipboard?: FrontmatterClipboard;
|
|
39
|
-
onActionError?: (error: unknown, action: "copy" | "cut" | "paste" | "remove") => void;
|
|
39
|
+
onActionError?: (error: unknown, action: "copy" | "cut" | "paste" | "remove" | "edit") => void;
|
|
40
40
|
};
|
|
41
41
|
export type FrontmatterParseResult = {
|
|
42
42
|
ok: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/preview/frontmatter/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,8BAA8B,GACtC,SAAS,GACT,MAAM,GACN,SAAS,GACT,WAAW,GACX,OAAO,GACP,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,UAAU,GACV,MAAM,GACN,UAAU,GACV,MAAM,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAC/B,8BAA8B,GAC9B,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,wBAAwB,KAC9B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEzB,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,8BAA8B,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC;IACtE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC;IACxE,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,uBAAuB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAC1C,MAAM,GACN,6BAA6B,CAAC;AAElC,MAAM,MAAM,mCAAmC,GAC3C,SAAS,kCAAkC,EAAE,GAC7C,CAAC,MACG,SAAS,kCAAkC,EAAE,GAC7C,OAAO,CAAC,SAAS,kCAAkC,EAAE,CAAC,CAAC,CAAC;AAEhE,MAAM,MAAM,gCAAgC,GAAG,CAC7C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,KACV,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAEpD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,yBAAyB,CAAC,CAAC;IAC5E,UAAU,CAAC,EAAE,MAAM,CACjB,MAAM,EACN,uBAAuB,GAAG,yBAAyB,CACpD,CAAC;IACF,OAAO,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACtC,mBAAmB,CAAC,EAAE,mCAAmC,CAAC;IAC1D,gBAAgB,CAAC,EAAE,gCAAgC,CAAC;IACpD,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/preview/frontmatter/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lapismd/mira",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Composable Markdown editor, extension SDK, preview renderer, and UI for Mira.",
|
|
5
5
|
"author": "Steve Juma <help@lapis.md>",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"@dnd-kit/svelte": "^0.4.0",
|
|
88
88
|
"@fontsource/source-code-pro": "^5.2.7",
|
|
89
89
|
"@lucide/svelte": "^0.525.0",
|
|
90
|
-
"bits-ui": "2.
|
|
90
|
+
"bits-ui": "2.20.2",
|
|
91
91
|
"clsx": "^2.1.1",
|
|
92
92
|
"hast-util-to-text": "^4.0.2",
|
|
93
93
|
"katex": "0.18.10",
|