@pilotiq/pilotiq 0.8.1 → 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.
Files changed (74) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/CHANGELOG.md +209 -0
  3. package/dist/Resource.d.ts +39 -0
  4. package/dist/Resource.d.ts.map +1 -1
  5. package/dist/Resource.js +30 -0
  6. package/dist/Resource.js.map +1 -1
  7. package/dist/pageData/navigation.d.ts +17 -1
  8. package/dist/pageData/navigation.d.ts.map +1 -1
  9. package/dist/pageData/navigation.js +14 -0
  10. package/dist/pageData/navigation.js.map +1 -1
  11. package/dist/react/AppShell.d.ts +5 -0
  12. package/dist/react/AppShell.d.ts.map +1 -1
  13. package/dist/react/AppShell.js +1 -1
  14. package/dist/react/AppShell.js.map +1 -1
  15. package/dist/react/FieldFocusReporterRegistry.d.ts +29 -0
  16. package/dist/react/FieldFocusReporterRegistry.d.ts.map +1 -0
  17. package/dist/react/FieldFocusReporterRegistry.js +14 -0
  18. package/dist/react/FieldFocusReporterRegistry.js.map +1 -0
  19. package/dist/react/FieldPresenceRegistry.d.ts +38 -0
  20. package/dist/react/FieldPresenceRegistry.d.ts.map +1 -0
  21. package/dist/react/FieldPresenceRegistry.js +14 -0
  22. package/dist/react/FieldPresenceRegistry.js.map +1 -0
  23. package/dist/react/FormCollabBindingRegistry.d.ts +71 -1
  24. package/dist/react/FormCollabBindingRegistry.d.ts.map +1 -1
  25. package/dist/react/FormCollabBindingRegistry.js.map +1 -1
  26. package/dist/react/FormStateContext.d.ts +17 -0
  27. package/dist/react/FormStateContext.d.ts.map +1 -1
  28. package/dist/react/FormStateContext.js +44 -3
  29. package/dist/react/FormStateContext.js.map +1 -1
  30. package/dist/react/RecordWrapperGate.d.ts +19 -6
  31. package/dist/react/RecordWrapperGate.d.ts.map +1 -1
  32. package/dist/react/RecordWrapperGate.js +18 -8
  33. package/dist/react/RecordWrapperGate.js.map +1 -1
  34. package/dist/react/fields/FieldShell.d.ts.map +1 -1
  35. package/dist/react/fields/FieldShell.js +27 -3
  36. package/dist/react/fields/FieldShell.js.map +1 -1
  37. package/dist/react/fields/MarkdownInput.d.ts.map +1 -1
  38. package/dist/react/fields/MarkdownInput.js +105 -3
  39. package/dist/react/fields/MarkdownInput.js.map +1 -1
  40. package/dist/react/fields/TextLikeInput.d.ts +10 -0
  41. package/dist/react/fields/TextLikeInput.d.ts.map +1 -1
  42. package/dist/react/fields/TextLikeInput.js +179 -0
  43. package/dist/react/fields/TextLikeInput.js.map +1 -1
  44. package/dist/react/fields/textDelta.d.ts +44 -0
  45. package/dist/react/fields/textDelta.d.ts.map +1 -0
  46. package/dist/react/fields/textDelta.js +80 -0
  47. package/dist/react/fields/textDelta.js.map +1 -0
  48. package/dist/react/index.d.ts +4 -2
  49. package/dist/react/index.d.ts.map +1 -1
  50. package/dist/react/index.js +3 -1
  51. package/dist/react/index.js.map +1 -1
  52. package/dist/react/parseRecordEditUrl.d.ts +33 -9
  53. package/dist/react/parseRecordEditUrl.d.ts.map +1 -1
  54. package/dist/react/parseRecordEditUrl.js +40 -2
  55. package/dist/react/parseRecordEditUrl.js.map +1 -1
  56. package/package.json +1 -1
  57. package/src/Resource.test.ts +44 -0
  58. package/src/Resource.ts +58 -0
  59. package/src/pageData/navigation.ts +32 -1
  60. package/src/pageData.test.ts +36 -0
  61. package/src/react/AppShell.tsx +6 -1
  62. package/src/react/FieldFocusReporterRegistry.ts +37 -0
  63. package/src/react/FieldPresenceRegistry.ts +46 -0
  64. package/src/react/FormCollabBindingRegistry.ts +63 -1
  65. package/src/react/FormStateContext.tsx +62 -3
  66. package/src/react/RecordWrapperGate.tsx +26 -8
  67. package/src/react/fields/FieldShell.tsx +39 -2
  68. package/src/react/fields/MarkdownInput.tsx +100 -3
  69. package/src/react/fields/TextLikeInput.tsx +203 -1
  70. package/src/react/fields/textDelta.test.ts +141 -0
  71. package/src/react/fields/textDelta.ts +86 -0
  72. package/src/react/index.ts +20 -1
  73. package/src/react/parseRecordEditUrl.test.ts +48 -1
  74. package/src/react/parseRecordEditUrl.ts +52 -13
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Module-level slot for focus / blur callbacks dispatched by pilotiq's
3
+ * `FieldShell`. A collab plugin (e.g. `@pilotiq-pro/collab`) registers
4
+ * a reporter at boot; on every controlled-field focus / blur event,
5
+ * `FieldShell` calls the matching method with `{ fieldName, formId }`
6
+ * so the plugin can mirror the local user's focus state into Yjs
7
+ * awareness.
8
+ *
9
+ * `FieldShell` skips dispatching for fields opted out via
10
+ * `Field.collab(false)` AND for dotted-path names (Repeater rows stay
11
+ * out of F4 presence in v1) — so the reporter never sees those events.
12
+ */
13
+ export interface FieldFocusEvent {
14
+ fieldName: string;
15
+ formId: string;
16
+ }
17
+ export interface FieldFocusReporter {
18
+ onFocus(event: FieldFocusEvent): void;
19
+ onBlur(event: FieldFocusEvent): void;
20
+ }
21
+ /**
22
+ * Register the reporter. Called once at boot by the collab plugin.
23
+ * No-op when no plugin registers — `FieldShell` doesn't wire focus
24
+ * listeners.
25
+ */
26
+ export declare function registerFieldFocusReporter(reporter: FieldFocusReporter): void;
27
+ /** Returns the registered reporter, or `null`. */
28
+ export declare function getFieldFocusReporter(): FieldFocusReporter | null;
29
+ //# sourceMappingURL=FieldFocusReporterRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldFocusReporterRegistry.d.ts","sourceRoot":"","sources":["../../src/react/FieldFocusReporterRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAK,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;IACrC,MAAM,CAAC,KAAK,EAAE,eAAe,GAAI,IAAI,CAAA;CACtC;AAID;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAE7E;AAED,kDAAkD;AAClD,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE"}
@@ -0,0 +1,14 @@
1
+ let _reporter = null;
2
+ /**
3
+ * Register the reporter. Called once at boot by the collab plugin.
4
+ * No-op when no plugin registers — `FieldShell` doesn't wire focus
5
+ * listeners.
6
+ */
7
+ export function registerFieldFocusReporter(reporter) {
8
+ _reporter = reporter;
9
+ }
10
+ /** Returns the registered reporter, or `null`. */
11
+ export function getFieldFocusReporter() {
12
+ return _reporter;
13
+ }
14
+ //# sourceMappingURL=FieldFocusReporterRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldFocusReporterRegistry.js","sourceRoot":"","sources":["../../src/react/FieldFocusReporterRegistry.ts"],"names":[],"mappings":"AAsBA,IAAI,SAAS,GAA8B,IAAI,CAAA;AAE/C;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAA4B;IACrE,SAAS,GAAG,QAAQ,CAAA;AACtB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,qBAAqB;IACnC,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { ComponentType } from 'react';
2
+ /**
3
+ * Props the per-field presence chip receives from `FieldShell` when a
4
+ * `@pilotiq-pro/collab`-style plugin has registered a component.
5
+ *
6
+ * The chip subscribes to the active collab room's awareness state and
7
+ * renders colored avatars / dots for every remote user currently
8
+ * focused on this field. Pilotiq core renders it alongside the field's
9
+ * label; the component owns the awareness lookup so pilotiq stays
10
+ * Yjs-free.
11
+ *
12
+ * Mounted only when:
13
+ *
14
+ * - A collab plugin has registered a component via
15
+ * `registerFieldPresenceComponent(...)`,
16
+ * - The field hasn't opted out via `Field.collab(false)`, and
17
+ * - The field has a stable `name` (dotted-path Repeater rows skip
18
+ * presence in v1 — Phase F.5 work).
19
+ */
20
+ export interface FieldPresenceProps {
21
+ /** Top-level field name. Dotted-path names are skipped by `FieldShell`. */
22
+ fieldName: string;
23
+ /**
24
+ * Stable form identifier — same value the form's `FormStateProvider`
25
+ * uses. Lets the chip scope presence by form when multiple forms
26
+ * render on the same record (action modals, etc.).
27
+ */
28
+ formId: string;
29
+ }
30
+ /**
31
+ * Register a component that renders inside `FieldShell`'s label area
32
+ * for every controlled field. Called once at boot by a collab plugin.
33
+ * No-op when no plugin registers — `FieldShell` skips the slot.
34
+ */
35
+ export declare function registerFieldPresenceComponent(C: ComponentType<FieldPresenceProps>): void;
36
+ /** Returns the registered presence component, or `null`. */
37
+ export declare function getFieldPresenceComponent(): ComponentType<FieldPresenceProps> | null;
38
+ //# sourceMappingURL=FieldPresenceRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldPresenceRegistry.d.ts","sourceRoot":"","sources":["../../src/react/FieldPresenceRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,MAAM,EAAK,MAAM,CAAA;CAClB;AAID;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAEzF;AAED,4DAA4D;AAC5D,wBAAgB,yBAAyB,IAAI,aAAa,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAEpF"}
@@ -0,0 +1,14 @@
1
+ let _component = null;
2
+ /**
3
+ * Register a component that renders inside `FieldShell`'s label area
4
+ * for every controlled field. Called once at boot by a collab plugin.
5
+ * No-op when no plugin registers — `FieldShell` skips the slot.
6
+ */
7
+ export function registerFieldPresenceComponent(C) {
8
+ _component = C;
9
+ }
10
+ /** Returns the registered presence component, or `null`. */
11
+ export function getFieldPresenceComponent() {
12
+ return _component;
13
+ }
14
+ //# sourceMappingURL=FieldPresenceRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldPresenceRegistry.js","sourceRoot":"","sources":["../../src/react/FieldPresenceRegistry.ts"],"names":[],"mappings":"AA+BA,IAAI,UAAU,GAA6C,IAAI,CAAA;AAE/D;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,CAAoC;IACjF,UAAU,GAAG,CAAC,CAAA;AAChB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,yBAAyB;IACvC,OAAO,UAAU,CAAA;AACnB,CAAC"}
@@ -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;;;;;;;;;;;;;;;;;;;;;GAqBG;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,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;CACjC;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
+ {"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":"AAyDA,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
+ {"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;AAavD,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;CAC7C;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;CACtB;AAED;;gEAEgE;AAChE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAuB/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,CAoU7C"}
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({ room: collabRoom, formId, initial: valuesRef.current });
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
- }), [values, setValue, triggerLive, errors, applyErrors, formMeta, inFlight, fieldStatus]);
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 edit
10
- * page. Pass-through in every other case:
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-edit URL (list / create / view / dashboard / …)
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
- * Scope limited to `/edit` URLs in v1; view-page support (read-only
22
- * collab cursors on `ViewPage`) is a follow-up.
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;AAItC,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAM,MAAM,CAAA;IACpB,QAAQ,EAAM,SAAS,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,sBAAsB,2CAY5F"}
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 { parseRecordEditUrl } from './parseRecordEditUrl.js';
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 edit
7
- * page. Pass-through in every other case:
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-edit URL (list / create / view / dashboard / …)
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
- * Scope limited to `/edit` URLs in v1; view-page support (read-only
19
- * collab cursors on `ViewPage`) is a follow-up.
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 = parseRecordEditUrl(currentPath, basePath);
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;AAQ5D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAA0B;IAC3F,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,OAAO,CACL,KAAC,OAAO,IAAC,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,YACtE,QAAQ,GACD,CACX,CAAA;AACH,CAAC"}
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":"FieldShell.d.ts","sourceRoot":"","sources":["../../../src/react/fields/FieldShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AA4B1D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAS,WAAW,CAAA;IACtB,IAAI,EAAO,MAAM,CAAA;IACjB,KAAK,EAAM,MAAM,CAAA;IACjB,QAAQ,EAAG,OAAO,CAAA;IAClB,QAAQ,EAAG,KAAK,CAAC,SAAS,CAAA;IAC1B;;;0DAGsD;IACtD,MAAM,CAAC,EAAI,KAAK,CAAC,SAAS,CAAA;IAC1B;0EACsE;IACtE,KAAK,CAAC,EAAK,KAAK,CAAC,SAAS,CAAA;IAC1B;gEAC4D;IAC5D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA8IjI"}
1
+ {"version":3,"file":"FieldShell.d.ts","sourceRoot":"","sources":["../../../src/react/fields/FieldShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AA8B1D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAS,WAAW,CAAA;IACtB,IAAI,EAAO,MAAM,CAAA;IACjB,KAAK,EAAM,MAAM,CAAA;IACjB,QAAQ,EAAG,OAAO,CAAA;IAClB,QAAQ,EAAG,KAAK,CAAC,SAAS,CAAA;IAC1B;;;0DAGsD;IACtD,MAAM,CAAC,EAAI,KAAK,CAAC,SAAS,CAAA;IAC1B;0EACsE;IACtE,KAAK,CAAC,EAAK,KAAK,CAAC,SAAS,CAAA;IAC1B;gEAC4D;IAC5D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAiLjI"}
@@ -5,6 +5,8 @@ import { usePendingSuggestions, usePendingSuggestionsForField } from '../Pending
5
5
  import { getPendingSuggestionOverlay } from '../PendingSuggestionOverlayRegistry.js';
6
6
  import { registerPendingSuggestionApplier } from '../PendingSuggestionApplierRegistry.js';
7
7
  import { FormIdContext, useFieldState } from '../FormStateContext.js';
8
+ import { getFieldPresenceComponent } from '../FieldPresenceRegistry.js';
9
+ import { getFieldFocusReporter } from '../FieldFocusReporterRegistry.js';
8
10
  /**
9
11
  * Field types whose visible state is driven by React (not by a matching
10
12
  * `[name]` DOM input). Each registers its own applier inside the field
@@ -102,7 +104,20 @@ export function FieldShell({ el, name, label, required, children, before, after,
102
104
  const labelClass = hiddenLabel
103
105
  ? 'sr-only'
104
106
  : 'text-sm font-medium leading-none';
105
- const labelEl = label !== '' ? (_jsxs("label", { htmlFor: name, className: labelClass, children: [label, required && _jsx("span", { className: "text-destructive ml-0.5", children: "*" }), labelSlot] })) : null;
107
+ // Phase F4 presence chip + focus reporter slots. The chip mounts
108
+ // alongside the label so remote-focus indicators don't shift the
109
+ // input geometry; the focus reporter sits on the outer wrapper using
110
+ // capture-phase listeners so any inner-input focus event flows
111
+ // through. Both slots are gated on `meta.collab !== false` (Q3 from
112
+ // the F-plan — opted-out fields are fully invisible to the collab
113
+ // layer) AND on the field having a stable top-level name (dotted-path
114
+ // Repeater rows skip presence in v1 — Phase F.5).
115
+ const collabOptedOut = el['collab'] === false;
116
+ const dottedName = name.includes('.');
117
+ const presenceSlotEligible = !collabOptedOut && !dottedName;
118
+ const PresenceChip = presenceSlotEligible ? getFieldPresenceComponent() : null;
119
+ const focusReporter = presenceSlotEligible ? getFieldFocusReporter() : null;
120
+ const labelEl = label !== '' ? (_jsxs("label", { htmlFor: name, className: labelClass, children: [label, required && _jsx("span", { className: "text-destructive ml-0.5", children: "*" }), labelSlot, PresenceChip && _jsx(PresenceChip, { fieldName: name, formId: formId ?? '' })] })) : null;
106
121
  const hasDecoration = !!(prefix || suffix || before || after);
107
122
  const input = hasDecoration
108
123
  ? (_jsxs("div", { className: "flex items-center gap-2", children: [before, prefix && _jsx(Decoration, { content: prefix, side: "prefix" }), _jsx("div", { className: "flex-1 min-w-0", children: children }), suffix && _jsx(Decoration, { content: suffix, side: "suffix" }), after] }))
@@ -116,10 +131,19 @@ export function FieldShell({ el, name, label, required, children, before, after,
116
131
  // `defaultValue` and silently undoing the approved write right after
117
132
  // the overlay closes.
118
133
  const inputBlock = (_jsxs(_Fragment, { children: [_jsx("div", { className: overlayNode !== null ? 'hidden' : 'contents', "aria-hidden": overlayNode !== null, children: input }), overlayNode] }));
134
+ // Capture-phase focus / blur dispatch — runs even when the inner
135
+ // input is wrapped in custom NodeViews (Select / Date / Slider). One
136
+ // wrapper-level handler covers every controlled input in the tree.
137
+ const onFocusCapture = focusReporter
138
+ ? () => focusReporter.onFocus({ fieldName: name, formId: formId ?? '' })
139
+ : undefined;
140
+ const onBlurCapture = focusReporter
141
+ ? () => focusReporter.onBlur({ fieldName: name, formId: formId ?? '' })
142
+ : undefined;
119
143
  if (inline) {
120
- return (_jsxs("div", { className: "flex items-baseline gap-3", ...wrapperAttrs, children: [labelEl && _jsx("div", { className: "min-w-32 pt-2", children: labelEl }), _jsxs("div", { className: "min-w-0 flex-1", children: [inputBlock, helperText && (_jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: helperText }))] })] }));
144
+ return (_jsxs("div", { className: "flex items-baseline gap-3", ...wrapperAttrs, ...(onFocusCapture ? { onFocusCapture } : {}), ...(onBlurCapture ? { onBlurCapture } : {}), children: [labelEl && _jsx("div", { className: "min-w-32 pt-2", children: labelEl }), _jsxs("div", { className: "min-w-0 flex-1", children: [inputBlock, helperText && (_jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: helperText }))] })] }));
121
145
  }
122
- return (_jsxs("div", { className: "flex flex-col gap-1.5", ...wrapperAttrs, children: [labelEl, inputBlock, helperText && (_jsx("p", { className: "text-xs text-muted-foreground", children: helperText }))] }));
146
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", ...wrapperAttrs, ...(onFocusCapture ? { onFocusCapture } : {}), ...(onBlurCapture ? { onBlurCapture } : {}), children: [labelEl, inputBlock, helperText && (_jsx("p", { className: "text-xs text-muted-foreground", children: helperText }))] }));
123
147
  }
124
148
  /**
125
149
  * Best-effort DOM apply for forms without a `<FormStateProvider>` (i.e.