@pilotiq/pilotiq 0.8.2 → 0.9.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.
- package/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +165 -0
- package/dist/Resource.d.ts +39 -0
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +30 -0
- package/dist/Resource.js.map +1 -1
- package/dist/pageData/navigation.d.ts +17 -1
- package/dist/pageData/navigation.d.ts.map +1 -1
- package/dist/pageData/navigation.js +14 -0
- package/dist/pageData/navigation.js.map +1 -1
- package/dist/react/AppShell.d.ts +5 -0
- package/dist/react/AppShell.d.ts.map +1 -1
- package/dist/react/AppShell.js +1 -1
- package/dist/react/AppShell.js.map +1 -1
- package/dist/react/FormCollabBindingRegistry.d.ts +71 -1
- package/dist/react/FormCollabBindingRegistry.d.ts.map +1 -1
- package/dist/react/FormCollabBindingRegistry.js.map +1 -1
- package/dist/react/FormStateContext.d.ts +17 -0
- package/dist/react/FormStateContext.d.ts.map +1 -1
- package/dist/react/FormStateContext.js +44 -3
- package/dist/react/FormStateContext.js.map +1 -1
- package/dist/react/RecordWrapperGate.d.ts +19 -6
- package/dist/react/RecordWrapperGate.d.ts.map +1 -1
- package/dist/react/RecordWrapperGate.js +18 -8
- package/dist/react/RecordWrapperGate.js.map +1 -1
- package/dist/react/fields/MarkdownInput.d.ts.map +1 -1
- package/dist/react/fields/MarkdownInput.js +105 -3
- package/dist/react/fields/MarkdownInput.js.map +1 -1
- package/dist/react/fields/TextLikeInput.d.ts +10 -0
- package/dist/react/fields/TextLikeInput.d.ts.map +1 -1
- package/dist/react/fields/TextLikeInput.js +179 -0
- package/dist/react/fields/TextLikeInput.js.map +1 -1
- package/dist/react/fields/textDelta.d.ts +44 -0
- package/dist/react/fields/textDelta.d.ts.map +1 -0
- package/dist/react/fields/textDelta.js +80 -0
- package/dist/react/fields/textDelta.js.map +1 -0
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/parseRecordEditUrl.d.ts +33 -9
- package/dist/react/parseRecordEditUrl.d.ts.map +1 -1
- package/dist/react/parseRecordEditUrl.js +40 -2
- package/dist/react/parseRecordEditUrl.js.map +1 -1
- package/package.json +1 -1
- package/src/Resource.test.ts +44 -0
- package/src/Resource.ts +58 -0
- package/src/pageData/navigation.ts +32 -1
- package/src/pageData.test.ts +36 -0
- package/src/react/AppShell.tsx +6 -1
- package/src/react/FormCollabBindingRegistry.ts +63 -1
- package/src/react/FormStateContext.tsx +62 -3
- package/src/react/RecordWrapperGate.tsx +26 -8
- package/src/react/fields/MarkdownInput.tsx +100 -3
- package/src/react/fields/TextLikeInput.tsx +203 -1
- package/src/react/fields/textDelta.test.ts +141 -0
- package/src/react/fields/textDelta.ts +86 -0
- package/src/react/index.ts +9 -1
- package/src/react/parseRecordEditUrl.test.ts +48 -1
- package/src/react/parseRecordEditUrl.ts +52 -13
|
@@ -1,4 +1,51 @@
|
|
|
1
|
+
import type { ElementMeta } from '../schema/Element.js';
|
|
1
2
|
import type { CollabRoom } from './CollabRoomContext.js';
|
|
3
|
+
/**
|
|
4
|
+
* Phase F.6 — character-level edit op emitted by `TextLikeInput` and
|
|
5
|
+
* applied through `TextBinding.applyDelta`. `replace` covers IME / paste
|
|
6
|
+
* / multi-char selections; `insert` and `delete` cover the single-key
|
|
7
|
+
* common path. Pilotiq core stays Yjs-free — the binding impl in
|
|
8
|
+
* `@pilotiq-pro/collab` translates these into `Y.Text.insert / delete`
|
|
9
|
+
* inside a transaction.
|
|
10
|
+
*/
|
|
11
|
+
export type TextDelta = {
|
|
12
|
+
kind: 'insert';
|
|
13
|
+
index: number;
|
|
14
|
+
text: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'delete';
|
|
17
|
+
index: number;
|
|
18
|
+
length: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'replace';
|
|
21
|
+
from: number;
|
|
22
|
+
to: number;
|
|
23
|
+
text: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Phase F.6 — per-field character-level CRDT handle. Issued by
|
|
27
|
+
* `FormCollabBinding.getTextBinding(name)` for text-shaped fields
|
|
28
|
+
* (`TextField / TextareaField / EmailField / SlugField / MarkdownField`);
|
|
29
|
+
* returns `null` for non-text fields or text fields opted out via
|
|
30
|
+
* `.collab(false)`. The surface stays intentionally narrow so pilotiq
|
|
31
|
+
* core never touches Yjs directly — same posture as `FormCollabBinding`.
|
|
32
|
+
*
|
|
33
|
+
* - `read()` returns the current full string. `TextLikeInput` calls
|
|
34
|
+
* this once on mount to seed its controlled value.
|
|
35
|
+
* - `applyDelta(delta)` is called from `onInput` events with a single
|
|
36
|
+
* `insert / delete / replace` op derived from the input's selection.
|
|
37
|
+
* - `observe(fn)` registers a remote-change listener; `fn(next)`
|
|
38
|
+
* receives the post-change string. Returns an unsubscribe function.
|
|
39
|
+
* - `destroy()` cleans up everything the handle holds. The owning
|
|
40
|
+
* `FormCollabBinding.destroy()` is expected to cascade — consumers
|
|
41
|
+
* don't need to call this directly.
|
|
42
|
+
*/
|
|
43
|
+
export interface TextBinding {
|
|
44
|
+
read(): string;
|
|
45
|
+
applyDelta(delta: TextDelta): void;
|
|
46
|
+
observe(fn: (next: string) => void): () => void;
|
|
47
|
+
destroy(): void;
|
|
48
|
+
}
|
|
2
49
|
/**
|
|
3
50
|
* Binding contract that a collab plugin returns from
|
|
4
51
|
* `registerFormCollabBinding` — wraps a single form's value map in a
|
|
@@ -15,8 +62,14 @@ import type { CollabRoom } from './CollabRoomContext.js';
|
|
|
15
62
|
* - `subscribe(fn)` registers a listener that fires when REMOTE
|
|
16
63
|
* changes land; `fn(snapshot)` receives the full updated map.
|
|
17
64
|
* The provider re-applies this snapshot onto its React state.
|
|
65
|
+
* - `getTextBinding(name)` (Phase F.6) returns a `Y.Text`-backed
|
|
66
|
+
* handle for text-shaped fields, or `null` for non-text fields and
|
|
67
|
+
* text fields opted out via `.collab(false)`. The text/non-text
|
|
68
|
+
* allowlist lives in the binding impl — `FormStateProvider` asks
|
|
69
|
+
* for every field and routes per-field on the answer.
|
|
18
70
|
* - `destroy()` is called on unmount — gives the plugin a chance to
|
|
19
|
-
* remove its CRDT observer.
|
|
71
|
+
* remove its CRDT observer. Implementations are expected to cascade
|
|
72
|
+
* into every `TextBinding` they issued.
|
|
20
73
|
*
|
|
21
74
|
* `unknown` payloads keep pilotiq core Yjs-free; the binding owns its
|
|
22
75
|
* own type knowledge. Same posture as `CollabExtensionFactory`.
|
|
@@ -28,6 +81,12 @@ export interface FormCollabBinding {
|
|
|
28
81
|
set(name: string, value: unknown): void;
|
|
29
82
|
/** Subscribe to remote changes. Returns an unsubscribe function. */
|
|
30
83
|
subscribe(fn: (snapshot: Record<string, unknown>) => void): () => void;
|
|
84
|
+
/** Phase F.6 — per-field text-CRDT handle. Returns `null` for non-text
|
|
85
|
+
* fields or text fields opted out via `.collab(false)`. Optional so
|
|
86
|
+
* existing F1-era plugins keep type-checking without a no-op stub;
|
|
87
|
+
* when absent, every text field stays on today's whole-string LWW
|
|
88
|
+
* path (i.e. F.6 character-level CRDT is opt-in by impl). */
|
|
89
|
+
getTextBinding?(name: string): TextBinding | null;
|
|
31
90
|
/** Cleanup hook called when the form unmounts. */
|
|
32
91
|
destroy(): void;
|
|
33
92
|
}
|
|
@@ -49,6 +108,17 @@ export interface FormCollabBindingFactoryArgs {
|
|
|
49
108
|
* map already populated and skip.
|
|
50
109
|
*/
|
|
51
110
|
initial: Record<string, unknown>;
|
|
111
|
+
/**
|
|
112
|
+
* Phase F.6 — initial form meta from the server. The binding walks
|
|
113
|
+
* this once at construction to decide which fields are text-shaped
|
|
114
|
+
* (`fieldType ∈ { text, textarea, email, slug, markdown }`) and
|
|
115
|
+
* which have opted out via `.collab(false)`. Text fields get a
|
|
116
|
+
* dedicated `Y.Text` and route through `getTextBinding`; non-text
|
|
117
|
+
* fields stay on the `Y.Map`. The meta is captured at mount; later
|
|
118
|
+
* structural changes from `live()` re-resolves aren't re-walked
|
|
119
|
+
* (rare in practice — dynamic field add/remove is an F-followup).
|
|
120
|
+
*/
|
|
121
|
+
formMeta: ElementMeta;
|
|
52
122
|
}
|
|
53
123
|
export type FormCollabBindingFactory = (args: FormCollabBindingFactoryArgs) => FormCollabBinding;
|
|
54
124
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormCollabBindingRegistry.d.ts","sourceRoot":"","sources":["../../src/react/FormCollabBindingRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD
|
|
1
|
+
{"version":3,"file":"FormCollabBindingRegistry.d.ts","sourceRoot":"","sources":["../../src/react/FormCollabBindingRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAG,MAAM,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAQ,MAAM,CAAA;IAClB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAC/C,OAAO,IAAK,IAAI,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,GAAG,IAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,uEAAuE;IACvE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IACvC,oEAAoE;IACpE,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACtE;;;;kEAI8D;IAC9D,cAAc,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAA;IACjD,kDAAkD;IAClD,OAAO,IAAO,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,wFAAwF;IACxF,IAAI,EAAK,UAAU,CAAA;IACnB;;;;;OAKG;IACH,MAAM,EAAG,MAAM,CAAA;IACf;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC;;;;;;;;;OASG;IACH,QAAQ,EAAE,WAAW,CAAA;CACtB;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,IAAI,EAAE,4BAA4B,KAAK,iBAAiB,CAAA;AAIhG;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAEjF;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,IAAI,wBAAwB,GAAG,IAAI,CAEtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormCollabBindingRegistry.js","sourceRoot":"","sources":["../../src/react/FormCollabBindingRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormCollabBindingRegistry.js","sourceRoot":"","sources":["../../src/react/FormCollabBindingRegistry.ts"],"names":[],"mappings":"AAuHA,IAAI,QAAQ,GAAoC,IAAI,CAAA;AAEpD;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAiC;IACzE,QAAQ,GAAG,OAAO,CAAA;AACpB,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ElementMeta } from '../schema/Element.js';
|
|
3
|
+
import { type TextBinding } from './FormCollabBindingRegistry.js';
|
|
3
4
|
export type FieldStatus = 'idle' | 'pending';
|
|
4
5
|
export interface FormStateApi {
|
|
5
6
|
values: Record<string, unknown>;
|
|
@@ -19,6 +20,13 @@ export interface FormStateApi {
|
|
|
19
20
|
formMeta: ElementMeta;
|
|
20
21
|
inFlight: boolean;
|
|
21
22
|
fieldStatus: (name: string) => FieldStatus;
|
|
23
|
+
/** Phase F.6 — per-field text-CRDT handles stashed at collab-room mount.
|
|
24
|
+
* `null` outside a room or before the binding effect has populated the
|
|
25
|
+
* map. The text/non-text allowlist lives in the binding impl —
|
|
26
|
+
* `FormStateProvider` asks for every top-level field and only stashes
|
|
27
|
+
* non-null answers, so a `Map.get()` hit means the binding has opted
|
|
28
|
+
* this field into the character-level path. */
|
|
29
|
+
textBindings: ReadonlyMap<string, TextBinding> | null;
|
|
22
30
|
}
|
|
23
31
|
/** Hook for direct access to the form context. Returns `null` outside a
|
|
24
32
|
* `FormStateProvider` (e.g. an action modal, or a form without any live
|
|
@@ -52,6 +60,15 @@ export interface UseFieldStateResult {
|
|
|
52
60
|
/** True while a live re-resolve POST is in flight for this field. */
|
|
53
61
|
pending: boolean;
|
|
54
62
|
errors: string[];
|
|
63
|
+
/** Phase F.6 — character-level CRDT handle for text-shaped fields when
|
|
64
|
+
* a collab room is mounted up-tree AND the binding strategy applies
|
|
65
|
+
* (allowlist + `.collab() !== false`). Null in every other case —
|
|
66
|
+
* outside a `FormStateProvider`, outside a `<RecordCollabRoom>`, on
|
|
67
|
+
* non-text fields, on dotted-path inner-Repeater rows (deferred to
|
|
68
|
+
* F.5), and on text fields opted out via `.collab(false)`. Text input
|
|
69
|
+
* renderers branch on this: non-null → character-level path with
|
|
70
|
+
* `applyDelta + observe`; null → today's whole-string LWW path. */
|
|
71
|
+
textBinding: TextBinding | null;
|
|
55
72
|
}
|
|
56
73
|
/** Per-field accessor. Inside a `FormStateProvider` it returns the controlled
|
|
57
74
|
* value + setter + live trigger; outside, it returns sentinels and callers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormStateContext.d.ts","sourceRoot":"","sources":["../../src/react/FormStateContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"FormStateContext.d.ts","sourceRoot":"","sources":["../../src/react/FormStateContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAWvD,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAA;AAEvC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,CAAA;AAE5C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACtC,QAAQ,EAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACrD;;;;;;qEAMiE;IACjE,WAAW,EAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9D,MAAM,EAAS,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACvC;8EAC0E;IAC1E,WAAW,EAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,IAAI,CAAA;IACzD,QAAQ,EAAO,WAAW,CAAA;IAC1B,QAAQ,EAAO,OAAO,CAAA;IACtB,WAAW,EAAI,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,CAAA;IAC5C;;;;;oDAKgD;IAChD,YAAY,EAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,CAAA;CACvD;AAID;;4DAE4D;AAC5D,wBAAgB,YAAY,IAAI,YAAY,GAAG,IAAI,CAElD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,uBAA4B,CAAA;AAetD,MAAM,WAAW,mBAAmB;IAClC;;;;;;oDAMgD;IAChD,UAAU,EAAG,OAAO,CAAA;IACpB,KAAK,EAAQ,OAAO,CAAA;IACpB,QAAQ,EAAK,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACjC;;;;mBAIe;IACf,WAAW,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9C,qEAAqE;IACrE,OAAO,EAAM,OAAO,CAAA;IACpB,MAAM,EAAO,MAAM,EAAE,CAAA;IACrB;;;;;;;wEAOoE;IACpE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;CAChC;AAED;;gEAEgE;AAChE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CA6B/D;AAWD,MAAM,WAAW,sBAAsB;IACrC;oDACgD;IAChD,WAAW,EAAI,WAAW,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACvC,QAAQ,EAAO,KAAK,CAAC,SAAS,CAAA;IAC9B,+EAA+E;IAC/E,SAAS,CAAC,EAAK,OAAO,KAAK,CAAA;IAC3B;gFAC4E;IAC5E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IAC1C;;;;wDAIoD;IACpD,OAAO,CAAC,EAAO,KAAK,CAAC,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;CACvD;AAED;;;uEAGuE;AACvE,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,aAAa,EACb,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,GACR,EAAE,sBAAsB,GAAG,KAAK,CAAC,YAAY,CAqW7C"}
|
|
@@ -4,7 +4,7 @@ import { collectFieldDefaults, findFieldMeta, parseFormDataToNested, readNestedV
|
|
|
4
4
|
import { runJsHandler } from './fieldJsHandler.js';
|
|
5
5
|
import { useToast } from './Toaster.js';
|
|
6
6
|
import { useCollabRoom } from './CollabRoomContext.js';
|
|
7
|
-
import { getFormCollabBinding } from './FormCollabBindingRegistry.js';
|
|
7
|
+
import { getFormCollabBinding, } from './FormCollabBindingRegistry.js';
|
|
8
8
|
const FormStateContext = createContext(null);
|
|
9
9
|
/** Hook for direct access to the form context. Returns `null` outside a
|
|
10
10
|
* `FormStateProvider` (e.g. an action modal, or a form without any live
|
|
@@ -45,6 +45,7 @@ export function useFieldState(name) {
|
|
|
45
45
|
triggerLive: () => { },
|
|
46
46
|
pending: false,
|
|
47
47
|
errors: [],
|
|
48
|
+
textBinding: null,
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
// Dotted-path fields (inner Repeater rows) always render uncontrolled
|
|
@@ -57,6 +58,11 @@ export function useFieldState(name) {
|
|
|
57
58
|
triggerLive: (valueOverride) => ctx.triggerLive(name, valueOverride),
|
|
58
59
|
pending: ctx.fieldStatus(name) === 'pending',
|
|
59
60
|
errors: ctx.errors[name] ?? [],
|
|
61
|
+
// Phase F.6 — dotted-path inner-Repeater rows skipped in v1 (deferred
|
|
62
|
+
// to F.5 alongside Y.Array row identity). Outside a collab room or
|
|
63
|
+
// for non-text fields, the stash returns null and the renderer falls
|
|
64
|
+
// back to today's whole-string LWW path.
|
|
65
|
+
textBinding: dotted ? null : (ctx.textBindings?.get(name) ?? null),
|
|
60
66
|
};
|
|
61
67
|
}
|
|
62
68
|
/** Provider component for the controlled form path. Holds the values map,
|
|
@@ -69,6 +75,13 @@ export function FormStateProvider({ initialMeta, initialErrors, children, fetchI
|
|
|
69
75
|
const [errors, setErrors] = useState(initialErrors);
|
|
70
76
|
const [pendingNames, setPendingNames] = useState(() => new Set());
|
|
71
77
|
const [inFlight, setInFlight] = useState(false);
|
|
78
|
+
// Phase F.6 — per-field text-CRDT stash. `null` until the collab effect
|
|
79
|
+
// populates it; stays `null` outside a collab room. Stored in state (not
|
|
80
|
+
// a ref) so consumers of `useFieldState` re-render once the bindings
|
|
81
|
+
// land. One extra render after collab-mount; acceptable since the
|
|
82
|
+
// existing `setValuesState` overlay below already triggers one when the
|
|
83
|
+
// room has pre-existing state.
|
|
84
|
+
const [textBindings, setTextBindings] = useState(null);
|
|
72
85
|
const { notify } = useToast();
|
|
73
86
|
// Track an incrementing in-flight id so out-of-order responses are dropped.
|
|
74
87
|
// useRef (not useState) so React StrictMode dev double-invokes don't
|
|
@@ -107,7 +120,12 @@ export function FormStateProvider({ initialMeta, initialErrors, children, fetchI
|
|
|
107
120
|
useEffect(() => {
|
|
108
121
|
if (!collabRoom || !bindingFactory || !formId)
|
|
109
122
|
return;
|
|
110
|
-
const binding = bindingFactory({
|
|
123
|
+
const binding = bindingFactory({
|
|
124
|
+
room: collabRoom,
|
|
125
|
+
formId,
|
|
126
|
+
initial: valuesRef.current,
|
|
127
|
+
formMeta: formMetaRef.current,
|
|
128
|
+
});
|
|
111
129
|
bindingRef.current = binding;
|
|
112
130
|
// Lift any state already in the room (subsequent joiners — first
|
|
113
131
|
// mover sees an empty snapshot here and the local SSR defaults
|
|
@@ -118,6 +136,27 @@ export function FormStateProvider({ initialMeta, initialErrors, children, fetchI
|
|
|
118
136
|
if (Object.keys(synced).length > 0) {
|
|
119
137
|
setValuesState((prev) => ({ ...prev, ...synced }));
|
|
120
138
|
}
|
|
139
|
+
// Phase F.6 — ask the binding for a `TextBinding` on every top-level
|
|
140
|
+
// field name. The text/non-text allowlist lives in the binding impl,
|
|
141
|
+
// not in core: the binding returns `null` for non-text fields and
|
|
142
|
+
// text fields opted out via `.collab(false)`. `getTextBinding` is
|
|
143
|
+
// optional on the contract — F1-era plugins that haven't implemented
|
|
144
|
+
// it short-circuit the whole stash and every text field stays on the
|
|
145
|
+
// LWW path. We stash only the non-null answers. Cleanup is owned by
|
|
146
|
+
// `binding.destroy()` (expected to cascade into every issued
|
|
147
|
+
// `TextBinding`).
|
|
148
|
+
if (binding.getTextBinding) {
|
|
149
|
+
const textStash = new Map();
|
|
150
|
+
for (const fieldName of Object.keys(valuesRef.current)) {
|
|
151
|
+
if (fieldName.includes('.'))
|
|
152
|
+
continue;
|
|
153
|
+
const tb = binding.getTextBinding(fieldName);
|
|
154
|
+
if (tb)
|
|
155
|
+
textStash.set(fieldName, tb);
|
|
156
|
+
}
|
|
157
|
+
if (textStash.size > 0)
|
|
158
|
+
setTextBindings(textStash);
|
|
159
|
+
}
|
|
121
160
|
// Subscribe to remote changes. Local writes ALSO trigger this
|
|
122
161
|
// (Yjs observers fire on local transactions too) — the per-key
|
|
123
162
|
// Object.is short-circuit below collapses them into no-op renders.
|
|
@@ -138,6 +177,7 @@ export function FormStateProvider({ initialMeta, initialErrors, children, fetchI
|
|
|
138
177
|
unsubscribe();
|
|
139
178
|
binding.destroy();
|
|
140
179
|
bindingRef.current = null;
|
|
180
|
+
setTextBindings(null);
|
|
141
181
|
};
|
|
142
182
|
// `valuesRef.current` is intentionally read once at mount — initial
|
|
143
183
|
// values seed the binding; subsequent edits flow through `setValue`
|
|
@@ -365,7 +405,8 @@ export function FormStateProvider({ initialMeta, initialErrors, children, fetchI
|
|
|
365
405
|
formMeta,
|
|
366
406
|
inFlight,
|
|
367
407
|
fieldStatus,
|
|
368
|
-
|
|
408
|
+
textBindings,
|
|
409
|
+
}), [values, setValue, triggerLive, errors, applyErrors, formMeta, inFlight, fieldStatus, textBindings]);
|
|
369
410
|
return (_jsx(FormStateContext.Provider, { value: api, children: children }));
|
|
370
411
|
}
|
|
371
412
|
//# sourceMappingURL=FormStateContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormStateContext.js","sourceRoot":"","sources":["../../src/react/FormStateContext.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormStateContext.js","sourceRoot":"","sources":["../../src/react/FormStateContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,38 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
+
import type { ResourceCollabConfig } from '../Resource.js';
|
|
3
|
+
/** Per-resource collab opt-in keyed by URL slug (`R.getSlug()` for
|
|
4
|
+
* non-clustered, `${cluster.slug}/${R.getSlug()}` for clustered). Built
|
|
5
|
+
* server-side by `panelInfo()` as `recordCollab`. */
|
|
6
|
+
export type RecordCollabMap = Record<string, ResourceCollabConfig>;
|
|
2
7
|
export interface RecordWrapperGateProps {
|
|
3
8
|
currentPath?: string;
|
|
4
9
|
basePath: string;
|
|
10
|
+
/** Resource opt-in map. Absent means no resource opted in (or the
|
|
11
|
+
* panel has no resources) — gate always passes through. */
|
|
12
|
+
recordCollab?: RecordCollabMap;
|
|
5
13
|
children: ReactNode;
|
|
6
14
|
}
|
|
7
15
|
/**
|
|
8
16
|
* Conditionally wraps the page tree with the plugin-registered
|
|
9
|
-
* `RecordWrapper` when the current URL resolves to a record-bound
|
|
10
|
-
*
|
|
17
|
+
* `RecordWrapper` when the current URL resolves to a record-bound page
|
|
18
|
+
* AND the underlying resource has opted into collab on that page role.
|
|
19
|
+
* Pass-through in every other case:
|
|
11
20
|
*
|
|
12
21
|
* - no plugin registered a wrapper (`getRecordWrapper() === null`)
|
|
13
|
-
* - the URL isn't a record
|
|
22
|
+
* - the URL isn't a record edit/view page
|
|
14
23
|
* - `currentPath` not yet known on the very first SSR render
|
|
24
|
+
* - the resource has not opted in via `static collab` (or has opted in
|
|
25
|
+
* but excluded the current page role)
|
|
15
26
|
*
|
|
16
27
|
* Mounted once inside `AppShell` around the page content area so
|
|
17
28
|
* record-scoped plugins (collab room, audit trail, …) get one
|
|
18
29
|
* lifetimed mount per record-view-or-edit without each plugin having
|
|
19
30
|
* to thread URL parsing into its own provider.
|
|
20
31
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
32
|
+
* v1 caveat: nested-relation edit URLs (`/articles/:parentId/comments/:childId/edit`)
|
|
33
|
+
* have a dynamic-id segment baked into the URL slug, so they don't match
|
|
34
|
+
* the resource-keyed `recordCollab` map and fall through to no-collab.
|
|
35
|
+
* Collab on nested-relation edits is a follow-up.
|
|
23
36
|
*/
|
|
24
|
-
export declare function RecordWrapperGate({ currentPath, basePath, children }: RecordWrapperGateProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export declare function RecordWrapperGate({ currentPath, basePath, recordCollab, children }: RecordWrapperGateProps): import("react/jsx-runtime").JSX.Element;
|
|
25
38
|
//# sourceMappingURL=RecordWrapperGate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordWrapperGate.d.ts","sourceRoot":"","sources":["../../src/react/RecordWrapperGate.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"RecordWrapperGate.d.ts","sourceRoot":"","sources":["../../src/react/RecordWrapperGate.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAE1D;;qDAEqD;AACrD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;AAElE,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAM,MAAM,CAAA;IACpB;gEAC4D;IAC5D,YAAY,CAAC,EAAE,eAAe,CAAA;IAC9B,QAAQ,EAAM,SAAS,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,sBAAsB,2CAgB1G"}
|
|
@@ -1,30 +1,40 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { getRecordWrapper } from './RecordWrapperRegistry.js';
|
|
3
|
-
import {
|
|
3
|
+
import { parseRecordPageUrl } from './parseRecordEditUrl.js';
|
|
4
4
|
/**
|
|
5
5
|
* Conditionally wraps the page tree with the plugin-registered
|
|
6
|
-
* `RecordWrapper` when the current URL resolves to a record-bound
|
|
7
|
-
*
|
|
6
|
+
* `RecordWrapper` when the current URL resolves to a record-bound page
|
|
7
|
+
* AND the underlying resource has opted into collab on that page role.
|
|
8
|
+
* Pass-through in every other case:
|
|
8
9
|
*
|
|
9
10
|
* - no plugin registered a wrapper (`getRecordWrapper() === null`)
|
|
10
|
-
* - the URL isn't a record
|
|
11
|
+
* - the URL isn't a record edit/view page
|
|
11
12
|
* - `currentPath` not yet known on the very first SSR render
|
|
13
|
+
* - the resource has not opted in via `static collab` (or has opted in
|
|
14
|
+
* but excluded the current page role)
|
|
12
15
|
*
|
|
13
16
|
* Mounted once inside `AppShell` around the page content area so
|
|
14
17
|
* record-scoped plugins (collab room, audit trail, …) get one
|
|
15
18
|
* lifetimed mount per record-view-or-edit without each plugin having
|
|
16
19
|
* to thread URL parsing into its own provider.
|
|
17
20
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
21
|
+
* v1 caveat: nested-relation edit URLs (`/articles/:parentId/comments/:childId/edit`)
|
|
22
|
+
* have a dynamic-id segment baked into the URL slug, so they don't match
|
|
23
|
+
* the resource-keyed `recordCollab` map and fall through to no-collab.
|
|
24
|
+
* Collab on nested-relation edits is a follow-up.
|
|
20
25
|
*/
|
|
21
|
-
export function RecordWrapperGate({ currentPath, basePath, children }) {
|
|
26
|
+
export function RecordWrapperGate({ currentPath, basePath, recordCollab, children }) {
|
|
22
27
|
const Wrapper = getRecordWrapper();
|
|
23
28
|
if (!Wrapper || !currentPath)
|
|
24
29
|
return _jsx(_Fragment, { children: children });
|
|
25
|
-
const identity =
|
|
30
|
+
const identity = parseRecordPageUrl(currentPath, basePath);
|
|
26
31
|
if (!identity)
|
|
27
32
|
return _jsx(_Fragment, { children: children });
|
|
33
|
+
const cfg = recordCollab?.[identity.resourceSlug];
|
|
34
|
+
if (!cfg)
|
|
35
|
+
return _jsx(_Fragment, { children: children });
|
|
36
|
+
if (!cfg.pages.includes(identity.role))
|
|
37
|
+
return _jsx(_Fragment, { children: children });
|
|
28
38
|
return (_jsx(Wrapper, { resourceSlug: identity.resourceSlug, recordId: identity.recordId, children: children }));
|
|
29
39
|
}
|
|
30
40
|
//# sourceMappingURL=RecordWrapperGate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordWrapperGate.js","sourceRoot":"","sources":["../../src/react/RecordWrapperGate.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"RecordWrapperGate.js","sourceRoot":"","sources":["../../src/react/RecordWrapperGate.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAiB5D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAA0B;IACzG,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAA;IAClC,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAA;IAEpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IAC1D,IAAI,CAAC,QAAQ;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAA;IAErC,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAA;IAChC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAA;IAE9D,OAAO,CACL,KAAC,OAAO,IAAC,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,YACtE,QAAQ,GACD,CACX,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownInput.d.ts","sourceRoot":"","sources":["../../../src/react/fields/MarkdownInput.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"MarkdownInput.d.ts","sourceRoot":"","sources":["../../../src/react/fields/MarkdownInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAA;AAYnE,KAAK,aAAa,GACd,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GACrC,SAAS,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,GACvD,WAAW,GAAG,aAAa,CAAA;AAE/B;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EACzC,cAAc,EAAE,SAAS,EAAE,SAAS,EACpC,wBAAwB,EAAE,yBAAyB,EACnD,SAAS,GACV,EAAE;IACD,IAAI,EAAwB,MAAM,CAAA;IAClC,YAAY,EAAgB,OAAO,CAAA;IACnC,QAAQ,EAAoB,OAAO,CAAA;IACnC,WAAW,EAAiB,MAAM,GAAG,SAAS,CAAA;IAC9C,cAAc,EAAc,aAAa,EAAE,CAAA;IAC3C,SAAS,EAAmB,MAAM,GAAG,SAAS,CAAA;IAC9C,SAAS,EAAmB,MAAM,GAAG,SAAS,CAAA;IAC9C,wBAAwB,EAAI,MAAM,GAAG,SAAS,CAAA;IAC9C,yBAAyB,EAAG,MAAM,GAAG,SAAS,CAAA;IAC9C,SAAS,EAAmB,MAAM,GAAG,SAAS,CAAA;CAC/C,GAAG,KAAK,CAAC,YAAY,CAmWrB"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { marked } from 'marked';
|
|
4
4
|
import { BoldIcon, ItalicIcon, StrikethroughIcon, LinkIcon, HeadingIcon, ListIcon, ListOrderedIcon, QuoteIcon, CodeIcon, PaperclipIcon, Loader2Icon, } from 'lucide-react';
|
|
5
5
|
import { useFieldState } from '../FormStateContext.js';
|
|
6
6
|
import { useToast } from '../Toaster.js';
|
|
7
7
|
import { Button } from '../ui/button.js';
|
|
8
|
+
import { computeDelta, preserveCursor } from './textDelta.js';
|
|
8
9
|
/**
|
|
9
10
|
* Plain-markdown editor. Stores the raw string under `name`. Renders a
|
|
10
11
|
* tab switcher (Write / Preview), a configurable formatting toolbar, and
|
|
@@ -22,12 +23,93 @@ export function MarkdownInput({ name, defaultValue, disabled, placeholder, toolb
|
|
|
22
23
|
const fs = useFieldState(name);
|
|
23
24
|
const { notify } = useToast();
|
|
24
25
|
const textareaRef = useRef(null);
|
|
26
|
+
// Phase F.6 — IME composition gate. Set between `compositionstart` /
|
|
27
|
+
// `compositionend`; the textarea's onChange skips `applyDelta` while
|
|
28
|
+
// composing so intermediate chars don't emit ops. Lives at the
|
|
29
|
+
// component scope so the onChange and composition handlers share it.
|
|
30
|
+
const isComposingRef = useRef(false);
|
|
25
31
|
const initial = useMemo(() => stringValue(defaultValue), []);
|
|
26
32
|
const [localValue, setLocalValue] = useState(initial);
|
|
27
33
|
const [tab, setTab] = useState('write');
|
|
28
34
|
const [busy, setBusy] = useState(false);
|
|
29
|
-
|
|
35
|
+
// Phase F.6 — when a `<RecordCollabRoom>` is mounted and the field has
|
|
36
|
+
// a `TextBinding`, the textarea is bound to a `Y.Text` and edits emit
|
|
37
|
+
// `TextDelta`s. Mirrors the architecture in `TextLikeInput.tsx` but
|
|
38
|
+
// wired in-line because MarkdownInput has its own toolbar + Preview
|
|
39
|
+
// tab that also need to flow through the binding.
|
|
40
|
+
const binding = fs.textBinding;
|
|
41
|
+
const [boundValue, setBoundValue] = useState(() => binding?.read() ?? initial);
|
|
42
|
+
const boundValueRef = useRef(boundValue);
|
|
43
|
+
useEffect(() => { boundValueRef.current = boundValue; }, [boundValue]);
|
|
44
|
+
// On binding swap: read current Y.Text state. If non-empty, lift it
|
|
45
|
+
// into local + form-map state. If empty (no peer has typed yet), leave
|
|
46
|
+
// the SSR-default-derived `boundValue` showing — first edit will
|
|
47
|
+
// emit a replace-from-empty delta that atomically populates Y.Text.
|
|
48
|
+
// No client-side seed: Y.Text isn't safe to seed under concurrent
|
|
49
|
+
// first-mounters (see @pilotiq-pro/collab `formCollabBinding.ts`).
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!binding)
|
|
52
|
+
return;
|
|
53
|
+
const next = binding.read();
|
|
54
|
+
if (next.length > 0) {
|
|
55
|
+
setBoundValue(next);
|
|
56
|
+
boundValueRef.current = next;
|
|
57
|
+
fs.setValue(next);
|
|
58
|
+
}
|
|
59
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
60
|
+
}, [binding]);
|
|
61
|
+
// Subscribe to remote changes. Local-echoes are filtered by the
|
|
62
|
+
// `next === prev` guard. Cursor preserved via the same heuristic
|
|
63
|
+
// used in `TextLikeInput.BoundTextInput`.
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!binding)
|
|
66
|
+
return;
|
|
67
|
+
return binding.observe((next) => {
|
|
68
|
+
const prev = boundValueRef.current;
|
|
69
|
+
if (next === prev)
|
|
70
|
+
return;
|
|
71
|
+
const ta = textareaRef.current;
|
|
72
|
+
const cursor = ta?.selectionStart ?? next.length;
|
|
73
|
+
const restored = preserveCursor(prev, next, cursor);
|
|
74
|
+
setBoundValue(next);
|
|
75
|
+
boundValueRef.current = next;
|
|
76
|
+
fs.setValue(next);
|
|
77
|
+
requestAnimationFrame(() => {
|
|
78
|
+
if (!ta)
|
|
79
|
+
return;
|
|
80
|
+
if (document.activeElement !== ta)
|
|
81
|
+
return;
|
|
82
|
+
try {
|
|
83
|
+
ta.setSelectionRange(restored, restored);
|
|
84
|
+
}
|
|
85
|
+
catch { /* defensive */ }
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
89
|
+
}, [binding]);
|
|
90
|
+
const value = binding
|
|
91
|
+
? boundValue
|
|
92
|
+
: (fs.controlled ? stringValue(fs.value) : localValue);
|
|
30
93
|
const setValue = (next) => {
|
|
94
|
+
if (binding) {
|
|
95
|
+
// Compute against current Y.Text contents (not the local ref) so:
|
|
96
|
+
// - first edit against empty Y.Text → `insert@0 <whole>` atomic
|
|
97
|
+
// populate (no separate seed op needed);
|
|
98
|
+
// - after a remote-applied update or server-resolve replace, the
|
|
99
|
+
// delta reflects the actual current shared state, not stale
|
|
100
|
+
// local bookkeeping.
|
|
101
|
+
const before = binding.read();
|
|
102
|
+
if (next !== before) {
|
|
103
|
+
const delta = computeDelta(before, next);
|
|
104
|
+
if (delta)
|
|
105
|
+
binding.applyDelta(delta);
|
|
106
|
+
setBoundValue(next);
|
|
107
|
+
boundValueRef.current = next;
|
|
108
|
+
}
|
|
109
|
+
fs.setValue(next);
|
|
110
|
+
fs.triggerLive(next);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
31
113
|
if (fs.controlled) {
|
|
32
114
|
fs.setValue(next);
|
|
33
115
|
fs.triggerLive(next);
|
|
@@ -227,7 +309,27 @@ export function MarkdownInput({ name, defaultValue, disabled, placeholder, toolb
|
|
|
227
309
|
? _jsx(Loader2Icon, { className: "size-4 animate-spin" })
|
|
228
310
|
: _jsx(Icon, { className: "size-4" }) }, b));
|
|
229
311
|
}) }))] }), tab === 'write' ? (_jsx("textarea", { ref: textareaRef, name: name, id: name, className: "w-full resize-y bg-transparent px-3 py-2 text-sm font-mono leading-relaxed outline-none disabled:opacity-50", style: taStyle, placeholder: placeholder, disabled: disabled, ...(fs.controlled
|
|
230
|
-
? {
|
|
312
|
+
? {
|
|
313
|
+
value,
|
|
314
|
+
onChange: (e) => {
|
|
315
|
+
// Phase F.6 — when the binding is active and the user
|
|
316
|
+
// is mid-IME, paint locally and hold the delta until
|
|
317
|
+
// compositionend so we never emit ops for the
|
|
318
|
+
// intermediate composing chars.
|
|
319
|
+
if (binding && isComposingRef.current) {
|
|
320
|
+
setBoundValue(e.target.value);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
setValue(e.target.value);
|
|
324
|
+
},
|
|
325
|
+
...(binding ? {
|
|
326
|
+
onCompositionStart: () => { isComposingRef.current = true; },
|
|
327
|
+
onCompositionEnd: (e) => {
|
|
328
|
+
isComposingRef.current = false;
|
|
329
|
+
setValue(e.currentTarget.value);
|
|
330
|
+
},
|
|
331
|
+
} : {}),
|
|
332
|
+
}
|
|
231
333
|
: { defaultValue: initial, onChange: (e) => setLocalValue(e.target.value) }), onPaste: onPaste, onKeyDown: onKeyDown })) : (_jsxs(_Fragment, { children: [_jsx("input", { type: "hidden", name: name, value: value, readOnly: true }), _jsx("div", { className: "prose prose-sm dark:prose-invert max-w-none px-3 py-2", style: taStyle, dangerouslySetInnerHTML: { __html: previewHtml || '<p class="text-muted-foreground italic">Nothing to preview</p>' } })] }))] }));
|
|
232
334
|
}
|
|
233
335
|
function TabButton({ active, onClick, children }) {
|