@aotter/mantle-ui 0.2.0-alpha.1

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 (184) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +163 -0
  3. package/dist/admin/assets/developer-workspace-D6ZBl-hH.js +27 -0
  4. package/dist/admin/assets/developer-workspace-DLioOiRN.css +1 -0
  5. package/dist/admin/assets/html-editor-aFwAzRmq.js +129 -0
  6. package/dist/admin/assets/index-C0Ini5Qc.css +2 -0
  7. package/dist/admin/assets/index-DQemY7Xp.js +71 -0
  8. package/dist/admin/assets/markdown-editor-rSCtXCtH.js +29 -0
  9. package/dist/admin/assets/with-selector-BnwVHY9y.js +1 -0
  10. package/dist/admin/favicon.png +0 -0
  11. package/dist/admin/favicon.svg +20 -0
  12. package/dist/admin/index.html +18 -0
  13. package/dist/admin/preview.html +18 -0
  14. package/dist/admin/theme.js +64 -0
  15. package/dist/app/bridge.d.ts +75 -0
  16. package/dist/app/bridge.d.ts.map +1 -0
  17. package/dist/app/bridge.js +96 -0
  18. package/dist/app/bridge.js.map +1 -0
  19. package/dist/controller/index.d.ts +142 -0
  20. package/dist/controller/index.d.ts.map +1 -0
  21. package/dist/controller/index.js +279 -0
  22. package/dist/controller/index.js.map +1 -0
  23. package/dist/index.d.ts +8 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +8 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/kit/components/auth-card.d.ts +15 -0
  28. package/dist/kit/components/auth-card.d.ts.map +1 -0
  29. package/dist/kit/components/auth-card.js +12 -0
  30. package/dist/kit/components/auth-card.js.map +1 -0
  31. package/dist/kit/components/one-time-code-input.d.ts +4 -0
  32. package/dist/kit/components/one-time-code-input.d.ts.map +1 -0
  33. package/dist/kit/components/one-time-code-input.js +7 -0
  34. package/dist/kit/components/one-time-code-input.js.map +1 -0
  35. package/dist/kit/components/sign-in-flow.d.ts +94 -0
  36. package/dist/kit/components/sign-in-flow.d.ts.map +1 -0
  37. package/dist/kit/components/sign-in-flow.js +108 -0
  38. package/dist/kit/components/sign-in-flow.js.map +1 -0
  39. package/dist/kit/components/ui/alert-dialog.d.ts +19 -0
  40. package/dist/kit/components/ui/alert-dialog.d.ts.map +1 -0
  41. package/dist/kit/components/ui/alert-dialog.js +43 -0
  42. package/dist/kit/components/ui/alert-dialog.js.map +1 -0
  43. package/dist/kit/components/ui/avatar.d.ts +12 -0
  44. package/dist/kit/components/ui/avatar.d.ts.map +1 -0
  45. package/dist/kit/components/ui/avatar.js +24 -0
  46. package/dist/kit/components/ui/avatar.js.map +1 -0
  47. package/dist/kit/components/ui/badge.d.ts +10 -0
  48. package/dist/kit/components/ui/badge.d.ts.map +1 -0
  49. package/dist/kit/components/ui/badge.js +25 -0
  50. package/dist/kit/components/ui/badge.js.map +1 -0
  51. package/dist/kit/components/ui/breadcrumb.d.ts +13 -0
  52. package/dist/kit/components/ui/breadcrumb.d.ts.map +1 -0
  53. package/dist/kit/components/ui/breadcrumb.js +25 -0
  54. package/dist/kit/components/ui/breadcrumb.js.map +1 -0
  55. package/dist/kit/components/ui/button.d.ts +11 -0
  56. package/dist/kit/components/ui/button.d.ts.map +1 -0
  57. package/dist/kit/components/ui/button.js +36 -0
  58. package/dist/kit/components/ui/button.js.map +1 -0
  59. package/dist/kit/components/ui/calendar.d.ts +11 -0
  60. package/dist/kit/components/ui/calendar.d.ts.map +1 -0
  61. package/dist/kit/components/ui/calendar.js +77 -0
  62. package/dist/kit/components/ui/calendar.js.map +1 -0
  63. package/dist/kit/components/ui/card.d.ts +12 -0
  64. package/dist/kit/components/ui/card.d.ts.map +1 -0
  65. package/dist/kit/components/ui/card.js +25 -0
  66. package/dist/kit/components/ui/card.js.map +1 -0
  67. package/dist/kit/components/ui/checkbox.d.ts +5 -0
  68. package/dist/kit/components/ui/checkbox.d.ts.map +1 -0
  69. package/dist/kit/components/ui/checkbox.js +9 -0
  70. package/dist/kit/components/ui/checkbox.js.map +1 -0
  71. package/dist/kit/components/ui/collapsible.d.ts +6 -0
  72. package/dist/kit/components/ui/collapsible.d.ts.map +1 -0
  73. package/dist/kit/components/ui/collapsible.js +14 -0
  74. package/dist/kit/components/ui/collapsible.js.map +1 -0
  75. package/dist/kit/components/ui/dialog.d.ts +17 -0
  76. package/dist/kit/components/ui/dialog.d.ts.map +1 -0
  77. package/dist/kit/components/ui/dialog.js +37 -0
  78. package/dist/kit/components/ui/dialog.js.map +1 -0
  79. package/dist/kit/components/ui/dropdown-menu.d.ts +30 -0
  80. package/dist/kit/components/ui/dropdown-menu.d.ts.map +1 -0
  81. package/dist/kit/components/ui/dropdown-menu.js +51 -0
  82. package/dist/kit/components/ui/dropdown-menu.js.map +1 -0
  83. package/dist/kit/components/ui/input-otp.d.ts +11 -0
  84. package/dist/kit/components/ui/input-otp.d.ts.map +1 -0
  85. package/dist/kit/components/ui/input-otp.js +17 -0
  86. package/dist/kit/components/ui/input-otp.js.map +1 -0
  87. package/dist/kit/components/ui/input.d.ts +4 -0
  88. package/dist/kit/components/ui/input.d.ts.map +1 -0
  89. package/dist/kit/components/ui/input.js +7 -0
  90. package/dist/kit/components/ui/input.js.map +1 -0
  91. package/dist/kit/components/ui/label.d.ts +5 -0
  92. package/dist/kit/components/ui/label.d.ts.map +1 -0
  93. package/dist/kit/components/ui/label.js +8 -0
  94. package/dist/kit/components/ui/label.js.map +1 -0
  95. package/dist/kit/components/ui/pagination.d.ts +19 -0
  96. package/dist/kit/components/ui/pagination.d.ts.map +1 -0
  97. package/dist/kit/components/ui/pagination.js +24 -0
  98. package/dist/kit/components/ui/pagination.js.map +1 -0
  99. package/dist/kit/components/ui/popover.d.ts +11 -0
  100. package/dist/kit/components/ui/popover.d.ts.map +1 -0
  101. package/dist/kit/components/ui/popover.js +26 -0
  102. package/dist/kit/components/ui/popover.js.map +1 -0
  103. package/dist/kit/components/ui/select.d.ts +16 -0
  104. package/dist/kit/components/ui/select.d.ts.map +1 -0
  105. package/dist/kit/components/ui/select.js +37 -0
  106. package/dist/kit/components/ui/select.js.map +1 -0
  107. package/dist/kit/components/ui/separator.d.ts +5 -0
  108. package/dist/kit/components/ui/separator.d.ts.map +1 -0
  109. package/dist/kit/components/ui/separator.js +8 -0
  110. package/dist/kit/components/ui/separator.js.map +1 -0
  111. package/dist/kit/components/ui/sheet.d.ts +16 -0
  112. package/dist/kit/components/ui/sheet.d.ts.map +1 -0
  113. package/dist/kit/components/ui/sheet.js +37 -0
  114. package/dist/kit/components/ui/sheet.js.map +1 -0
  115. package/dist/kit/components/ui/sidebar.d.ts +77 -0
  116. package/dist/kit/components/ui/sidebar.d.ts.map +1 -0
  117. package/dist/kit/components/ui/sidebar.js +207 -0
  118. package/dist/kit/components/ui/sidebar.js.map +1 -0
  119. package/dist/kit/components/ui/skeleton.d.ts +3 -0
  120. package/dist/kit/components/ui/skeleton.d.ts.map +1 -0
  121. package/dist/kit/components/ui/skeleton.js +7 -0
  122. package/dist/kit/components/ui/skeleton.js.map +1 -0
  123. package/dist/kit/components/ui/sonner.d.ts +4 -0
  124. package/dist/kit/components/ui/sonner.d.ts.map +1 -0
  125. package/dist/kit/components/ui/sonner.js +23 -0
  126. package/dist/kit/components/ui/sonner.js.map +1 -0
  127. package/dist/kit/components/ui/table.d.ts +11 -0
  128. package/dist/kit/components/ui/table.d.ts.map +1 -0
  129. package/dist/kit/components/ui/table.js +28 -0
  130. package/dist/kit/components/ui/table.js.map +1 -0
  131. package/dist/kit/components/ui/tabs.d.ts +12 -0
  132. package/dist/kit/components/ui/tabs.d.ts.map +1 -0
  133. package/dist/kit/components/ui/tabs.js +28 -0
  134. package/dist/kit/components/ui/tabs.js.map +1 -0
  135. package/dist/kit/components/ui/textarea.d.ts +4 -0
  136. package/dist/kit/components/ui/textarea.d.ts.map +1 -0
  137. package/dist/kit/components/ui/textarea.js +7 -0
  138. package/dist/kit/components/ui/textarea.js.map +1 -0
  139. package/dist/kit/components/ui/tooltip.d.ts +8 -0
  140. package/dist/kit/components/ui/tooltip.d.ts.map +1 -0
  141. package/dist/kit/components/ui/tooltip.js +18 -0
  142. package/dist/kit/components/ui/tooltip.js.map +1 -0
  143. package/dist/kit/hooks/use-mobile.d.ts +2 -0
  144. package/dist/kit/hooks/use-mobile.d.ts.map +1 -0
  145. package/dist/kit/hooks/use-mobile.js +16 -0
  146. package/dist/kit/hooks/use-mobile.js.map +1 -0
  147. package/dist/kit/index.d.ts +37 -0
  148. package/dist/kit/index.d.ts.map +1 -0
  149. package/dist/kit/index.js +37 -0
  150. package/dist/kit/index.js.map +1 -0
  151. package/dist/kit/kit.css +2 -0
  152. package/dist/kit/lib/utils.d.ts +3 -0
  153. package/dist/kit/lib/utils.d.ts.map +1 -0
  154. package/dist/kit/lib/utils.js +6 -0
  155. package/dist/kit/lib/utils.js.map +1 -0
  156. package/dist/kit/tokens.css +88 -0
  157. package/dist/mcp-app/index.d.ts +6 -0
  158. package/dist/mcp-app/index.js +6 -0
  159. package/dist/mcp-app/interaction.html +183 -0
  160. package/dist/react/components.d.ts +59 -0
  161. package/dist/react/components.d.ts.map +1 -0
  162. package/dist/react/components.js +102 -0
  163. package/dist/react/components.js.map +1 -0
  164. package/dist/react/fields.d.ts +62 -0
  165. package/dist/react/fields.d.ts.map +1 -0
  166. package/dist/react/fields.js +225 -0
  167. package/dist/react/fields.js.map +1 -0
  168. package/dist/react/labels.d.ts +33 -0
  169. package/dist/react/labels.d.ts.map +1 -0
  170. package/dist/react/labels.js +30 -0
  171. package/dist/react/labels.js.map +1 -0
  172. package/dist/react/schema-form.d.ts +34 -0
  173. package/dist/react/schema-form.d.ts.map +1 -0
  174. package/dist/react/schema-form.js +79 -0
  175. package/dist/react/schema-form.js.map +1 -0
  176. package/dist/react/use-interaction.d.ts +4 -0
  177. package/dist/react/use-interaction.d.ts.map +1 -0
  178. package/dist/react/use-interaction.js +6 -0
  179. package/dist/react/use-interaction.js.map +1 -0
  180. package/dist/react/values.d.ts +64 -0
  181. package/dist/react/values.d.ts.map +1 -0
  182. package/dist/react/values.js +123 -0
  183. package/dist/react/values.js.map +1 -0
  184. package/package.json +130 -0
@@ -0,0 +1,59 @@
1
+ import type { ReactNode } from "react";
2
+ import type { EntrySnapshot, FieldChange, InteractionController, InteractionState } from "../controller/index.js";
3
+ import { type InteractionLabels } from "./labels.js";
4
+ /**
5
+ * Presentational pieces for one interaction. Each reads only the controller
6
+ * snapshot and calls only controller actions, so Admin pages, dialogs, chat
7
+ * surfaces and MCP Apps compose the same parts. Colours come from the host's
8
+ * CSS variables through Tailwind token classes (`bg-muted`, `border`,
9
+ * `text-destructive`, …).
10
+ */
11
+ export interface FieldLabelProps {
12
+ /** Human label for a field name; defaults to the name itself. */
13
+ readonly fieldLabel?: (field: string) => string;
14
+ /** How a field's value reads (an option's label, a date); defaults to the value as text. Empty values always show `labels.empty`. */
15
+ readonly fieldValue?: (field: string, value: unknown) => ReactNode;
16
+ }
17
+ export declare function EntityPreview(props: FieldLabelProps & {
18
+ readonly entry: EntrySnapshot;
19
+ /** Fields to show, in order. Defaults to every data field. */
20
+ readonly fields?: readonly string[];
21
+ readonly labels?: Pick<InteractionLabels, "reviewedEntry" | "version" | "empty">;
22
+ }): ReactNode;
23
+ export declare function ChangeDiff(props: FieldLabelProps & {
24
+ readonly changes: readonly FieldChange[];
25
+ readonly caption?: string;
26
+ readonly labels?: Pick<InteractionLabels, "changes" | "field" | "before" | "after" | "empty">;
27
+ }): ReactNode;
28
+ /** What the person has to know or do next, per phase, with its one action. */
29
+ export declare function OperationStatus(props: FieldLabelProps & {
30
+ readonly controller: InteractionController;
31
+ readonly state: InteractionState;
32
+ readonly labels?: InteractionLabels;
33
+ }): ReactNode;
34
+ export declare function OperationOutcome(props: {
35
+ readonly state: InteractionState;
36
+ readonly labels?: Pick<InteractionLabels, "succeeded">;
37
+ /** Render the result; defaults to nothing beyond the success message. */
38
+ readonly renderResult?: (result: unknown) => ReactNode;
39
+ }): ReactNode;
40
+ /**
41
+ * One interaction, ready to place in a page, dialog or chat surface. The
42
+ * host renders the editable inputs as `children` and wires them to
43
+ * `controller.edit`; everything else comes from the controller.
44
+ */
45
+ export declare function OperationPanel(props: FieldLabelProps & {
46
+ readonly controller: InteractionController;
47
+ readonly title: ReactNode;
48
+ readonly description?: ReactNode;
49
+ readonly children?: ReactNode;
50
+ readonly labels?: InteractionLabels;
51
+ /** Fields of the reviewed entry to preview; omit to hide the preview. */
52
+ readonly previewFields?: readonly string[];
53
+ readonly renderResult?: (result: unknown) => ReactNode;
54
+ /** Called when the person closes the panel after it finished or was cancelled. */
55
+ readonly onClose?: () => void;
56
+ /** Called after Cancel; a dialog closes here. Defaults to showing "Cancelled". */
57
+ readonly onCancel?: () => void;
58
+ }): ReactNode;
59
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/react/components.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAA4B,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG/E;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,qIAAqI;IACrI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC;CACpE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG;IACrD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;CAClF,GAAG,SAAS,CAkBZ;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;CAC/F,GAAG,SAAS,CAyBZ;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG;IACvD,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CACrC,GAAG,SAAS,CAqDZ;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IACvD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC;CACxD,GAAG,SAAS,CASZ;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG;IACtD,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC;IACvD,kFAAkF;IAClF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,GAAG,SAAS,CAiFZ"}
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { defaultInteractionLabels } from "./labels.js";
3
+ import { useInteraction } from "./use-interaction.js";
4
+ export function EntityPreview(props) {
5
+ const labels = props.labels ?? defaultInteractionLabels;
6
+ const label = props.fieldLabel ?? ((field) => field);
7
+ const fields = props.fields ?? Object.keys(props.entry.data).filter((field) => field !== "version");
8
+ return (_jsx("section", { "data-slot": "entity-preview", "aria-label": labels.reviewedEntry, className: "rounded-md border p-3 text-sm", children: _jsxs("dl", { className: "grid grid-cols-[minmax(6rem,auto)_1fr] gap-x-3 gap-y-1", children: [fields.map((field) => (_jsxs("div", { className: "contents", children: [_jsx("dt", { className: "text-muted-foreground", children: label(field) }), _jsx("dd", { className: "min-w-0 break-words", children: show(props, field, props.entry.data[field], labels.empty) })] }, field))), _jsx("dt", { className: "text-muted-foreground", children: labels.version }), _jsx("dd", { children: props.entry.version })] }) }));
9
+ }
10
+ export function ChangeDiff(props) {
11
+ const labels = props.labels ?? defaultInteractionLabels;
12
+ const label = props.fieldLabel ?? ((field) => field);
13
+ if (props.changes.length === 0)
14
+ return null;
15
+ return (_jsxs("table", { "data-slot": "change-diff", className: "w-full text-sm", children: [_jsx("caption", { className: "text-muted-foreground mb-1 text-left", children: props.caption ?? labels.changes }), _jsx("thead", { children: _jsxs("tr", { className: "text-muted-foreground text-left", children: [_jsx("th", { scope: "col", className: "font-medium", children: labels.field }), _jsx("th", { scope: "col", className: "font-medium", children: labels.before }), _jsx("th", { scope: "col", className: "font-medium", children: labels.after })] }) }), _jsx("tbody", { children: props.changes.map((change) => (_jsxs("tr", { className: "border-t align-top", children: [_jsx("th", { scope: "row", className: "py-1 pr-2 text-left font-normal break-words", children: label(change.field) }), _jsx("td", { className: "py-1 pr-2 break-all line-through decoration-muted-foreground/60", children: show(props, change.field, change.before, labels.empty) }), _jsx("td", { className: "py-1 break-all", children: show(props, change.field, change.after, labels.empty) })] }, change.field))) })] }));
16
+ }
17
+ /** What the person has to know or do next, per phase, with its one action. */
18
+ export function OperationStatus(props) {
19
+ const { controller, state } = props;
20
+ const labels = props.labels ?? defaultInteractionLabels;
21
+ const label = props.fieldLabel ?? ((field) => field);
22
+ const notice = (tone, message, action, extra) => (_jsxs("div", { "data-slot": "operation-status", "data-phase": state.phase, role: tone === "error" ? "alert" : "status", className: `rounded-md border p-3 text-sm ${tone === "error" ? "border-destructive/50 text-destructive" : tone === "warning" ? "bg-muted" : ""}`, children: [_jsx("p", { children: message }), extra, action ? _jsx("div", { className: "mt-2", children: action }) : null] }));
23
+ const button = (text, onClick) => (_jsx("button", { type: "button", onClick: onClick, disabled: state.reading, className: "rounded-md border px-3 py-1 text-sm font-medium", children: text }));
24
+ const diagnostics = state.diagnostics.length > 0
25
+ ? _jsx("ul", { className: "mt-1 list-disc pl-5", children: state.diagnostics.map((diagnostic, index) => _jsx("li", { children: diagnostic.message }, index)) })
26
+ : null;
27
+ switch (state.phase) {
28
+ case "loading":
29
+ return notice("info", labels.loading);
30
+ case "unreadable":
31
+ return notice("error", labels.unreadable, button(labels.reread, () => void controller.reread()));
32
+ case "changedSinceList":
33
+ return notice("warning", labels.changedSinceList, button(labels.reviewLatest, () => controller.review()), (_jsxs(_Fragment, { children: [state.contested.length > 0
34
+ ? _jsxs("p", { className: "mt-1 font-medium", children: [labels.contested, " ", state.contested.map(label).join(", ")] })
35
+ : null, _jsx(ChangeDiff, { changes: controller.latestChanges(), caption: labels.latestChanges, labels: labels, fieldLabel: props.fieldLabel, fieldValue: props.fieldValue })] })));
36
+ case "conflict":
37
+ return state.canRead
38
+ ? notice("error", labels.conflict, button(labels.reread, () => void controller.reread()))
39
+ : notice("error", labels.conflictReopen);
40
+ case "uncertain":
41
+ return notice("error", labels.uncertain, !state.canRead
42
+ ? button(labels.acknowledgeUncertain, () => controller.acknowledgeUncertain())
43
+ : button(labels.reread, () => void controller.reread()), diagnostics);
44
+ case "failed":
45
+ return notice("error", labels.failed, undefined, diagnostics);
46
+ case "cancelled":
47
+ return notice("info", labels.cancelled);
48
+ default:
49
+ return state.reading ? notice("info", labels.reading) : null;
50
+ }
51
+ }
52
+ export function OperationOutcome(props) {
53
+ if (props.state.phase !== "succeeded")
54
+ return null;
55
+ const labels = props.labels ?? defaultInteractionLabels;
56
+ return (_jsxs("div", { "data-slot": "operation-outcome", role: "status", className: "rounded-md border p-3 text-sm", children: [_jsx("p", { className: "font-medium", children: labels.succeeded }), props.renderResult?.(props.state.result)] }));
57
+ }
58
+ /**
59
+ * One interaction, ready to place in a page, dialog or chat surface. The
60
+ * host renders the editable inputs as `children` and wires them to
61
+ * `controller.edit`; everything else comes from the controller.
62
+ */
63
+ export function OperationPanel(props) {
64
+ const { controller } = props;
65
+ const state = useInteraction(controller);
66
+ const labels = props.labels ?? defaultInteractionLabels;
67
+ const label = props.fieldLabel ?? ((field) => field);
68
+ const busy = state.phase === "submitting" || state.phase === "loading";
69
+ const done = state.phase === "succeeded" || state.phase === "cancelled";
70
+ const canSubmit = (state.phase === "ready" || state.phase === "failed") && !state.reading;
71
+ const bound = Object.entries(state.bound);
72
+ return (_jsxs("form", { "data-slot": "operation-panel", "aria-busy": busy || state.reading, className: "grid gap-4",
73
+ // Submit from script, never through the browser's form submission:
74
+ // MCP hosts commonly sandbox Apps with `allow-scripts` but without
75
+ // `allow-forms`, where a form submission is blocked outright.
76
+ onSubmit: (event) => event.preventDefault(), onKeyDown: (event) => {
77
+ const target = event.target;
78
+ if (event.key !== "Enter" || event.shiftKey || event.nativeEvent.isComposing)
79
+ return;
80
+ if (target.tagName !== "INPUT" || ["checkbox", "radio", "button", "submit"].includes(target.type))
81
+ return;
82
+ event.preventDefault();
83
+ if (canSubmit)
84
+ void controller.submit();
85
+ }, children: [_jsxs("header", { className: "grid gap-1", children: [_jsx("h2", { className: "text-base font-semibold", children: props.title }), props.description ? _jsx("p", { className: "text-muted-foreground text-sm", children: props.description }) : null] }), bound.length > 0 ? (_jsxs("section", { "aria-label": labels.boundInputs, className: "bg-muted rounded-md p-3 text-sm", children: [_jsx("p", { className: "text-muted-foreground mb-1", children: labels.boundInputs }), _jsx("dl", { className: "grid grid-cols-[minmax(6rem,auto)_1fr] gap-x-3", children: bound.map(([field, value]) => (_jsxs("div", { className: "contents", children: [_jsx("dt", { className: "text-muted-foreground", children: label(field) }), _jsx("dd", { className: "break-words", children: show(props, field, value, labels.empty) })] }, field))) })] })) : null, props.previewFields && state.reviewed
86
+ ? _jsx(EntityPreview, { entry: state.reviewed, fields: props.previewFields, labels: labels, fieldLabel: props.fieldLabel, fieldValue: props.fieldValue })
87
+ : null, _jsx("fieldset", { disabled: busy || done, className: "grid gap-3", children: props.children }), _jsx(ChangeDiff, { changes: controller.changes(), labels: labels, fieldLabel: props.fieldLabel, fieldValue: props.fieldValue }), _jsxs("div", { "aria-live": "polite", className: "grid gap-2", children: [_jsx(OperationStatus, { controller: controller, state: state, labels: labels, fieldLabel: props.fieldLabel, fieldValue: props.fieldValue }), _jsx(OperationOutcome, { state: state, labels: labels, renderResult: props.renderResult })] }), _jsx("footer", { className: "flex justify-end gap-2", children: done ? (_jsx("button", { type: "button", onClick: props.onClose, className: "rounded-md border px-3 py-2 text-sm font-medium", children: labels.close })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => { controller.cancel(); props.onCancel?.(); },
88
+ // A write in flight cannot be taken back; closing then would
89
+ // hide whether it landed.
90
+ disabled: state.phase === "submitting", className: "rounded-md border px-3 py-2 text-sm font-medium disabled:opacity-50", children: labels.cancel }), _jsx("button", { type: "button", onClick: () => void controller.submit(), disabled: !canSubmit, className: "bg-primary text-primary-foreground rounded-md px-3 py-2 text-sm font-medium disabled:opacity-50", children: state.phase === "submitting" ? labels.submitting : labels.submit })] })) })] }));
91
+ }
92
+ function show(props, field, value, empty) {
93
+ return props.fieldValue && value !== undefined && value !== null && value !== "" ? props.fieldValue(field, value) : formatValue(value, empty);
94
+ }
95
+ function formatValue(value, empty) {
96
+ if (value === undefined || value === null || value === "")
97
+ return empty;
98
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
99
+ return String(value);
100
+ return JSON.stringify(value);
101
+ }
102
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/react/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import * as React from "react";
2
+ import { type FieldSchema } from "./values.js";
3
+ /**
4
+ * A form over a JSON Schema: one control per property, by type, format, `x-mcp-hint` and option list. Admin's entry
5
+ * editor, its operation dialogs and an MCP App render the same fields; what only one host can do (a media library,
6
+ * a rich text editor) comes in through `renderField`.
7
+ */
8
+ /** Every string the fields render; hosts pass their own translations. */
9
+ export interface FieldLabels {
10
+ readonly emptyOption: string;
11
+ readonly chooseOption: string;
12
+ readonly boolean: string;
13
+ readonly dateTimeSelect: string;
14
+ readonly dateTimeTime: string;
15
+ readonly removeItem: string;
16
+ readonly addItem: string;
17
+ }
18
+ export declare const defaultFieldLabels: FieldLabels;
19
+ /** One field as a host's own control sees it. */
20
+ export interface FieldSlot {
21
+ readonly name: string;
22
+ readonly schema: FieldSchema;
23
+ readonly path: readonly string[];
24
+ readonly value: unknown;
25
+ readonly label: string;
26
+ /** The string widget the field asks for: `input`, `textarea`, `markdown` or `html`. */
27
+ readonly widget: StringWidget;
28
+ readonly setValue: (next: unknown) => void;
29
+ }
30
+ /** A host's control for a field, or undefined to keep the default one. */
31
+ export type RenderField = (field: FieldSlot) => React.ReactNode | undefined;
32
+ export type StringWidget = "input" | "textarea" | "markdown" | "html";
33
+ export interface SchemaFieldsProps {
34
+ readonly schema: FieldSchema;
35
+ /** A Schema or Procedure `uiSchema`: `fields.<name>.widget: textarea`. */
36
+ readonly uiSchema?: Readonly<Record<string, unknown>> | null;
37
+ /** The whole value the fields edit; `path` points into it. */
38
+ readonly value: Readonly<Record<string, unknown>>;
39
+ readonly path?: readonly string[];
40
+ readonly onChange: (value: Record<string, unknown>) => void;
41
+ readonly language: string;
42
+ readonly canonical?: string | null;
43
+ /** Root properties not shown (bound inputs, a translation's key). */
44
+ readonly hiddenRootFields?: readonly string[];
45
+ readonly labels?: FieldLabels;
46
+ readonly renderField?: RenderField;
47
+ /** How a field's label reads; defaults to its `title`, else its name humanized. */
48
+ readonly propertyLabel?: (name: string, schema: FieldSchema | undefined, language: string, canonical: string | null) => string;
49
+ }
50
+ export declare function SchemaFields(props: SchemaFieldsProps): React.ReactElement;
51
+ /** The string widget a field asks for: its `x-mcp-hint`, else the uiSchema widget, else an input. */
52
+ export declare function stringFieldWidget(schema: FieldSchema, widget: "textarea" | null): StringWidget;
53
+ /** The edits a SchemaFields change makes: it hands back a cloned value, and only fields that really changed are edits, so
54
+ * untouched fields keep following a newer review. */
55
+ export declare function applyFieldEdits(controller: {
56
+ edit(field: string, value: unknown): void;
57
+ }, before: Readonly<Record<string, unknown>>, next: Readonly<Record<string, unknown>>): void;
58
+ /** A cleared field: null where null is one of its values, else left out of the input. */
59
+ export declare function clearedValue(schema: FieldSchema): null | undefined;
60
+ /** A chosen option as the field declares it: a Select hands back text, so `2` of `enum: [1, 2]` is the number again. */
61
+ export declare function optionValue(schema: FieldSchema, chosen: string): unknown;
62
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/react/fields.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,225 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { CalendarIcon, LockKeyhole, Plus, Trash2 } from "lucide-react";
4
+ import { Button, Calendar, Checkbox, Input, Popover, PopoverContent, PopoverTrigger, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea } from "../kit/index.js";
5
+ import { dateFromFieldValue, enumOptions, formatMoneyMinor, formatTimestampMs, moneyMinorHint, optionLabel, propertyDescription, propertyLabel, timestampHint, } from "./values.js";
6
+ export const defaultFieldLabels = {
7
+ emptyOption: "No value",
8
+ chooseOption: "Choose…",
9
+ boolean: "Yes",
10
+ dateTimeSelect: "Pick a date",
11
+ dateTimeTime: "Time",
12
+ removeItem: "Remove",
13
+ addItem: "Add item",
14
+ };
15
+ export function SchemaFields(props) {
16
+ const path = props.path ?? [];
17
+ const required = new Set(props.schema.required ?? []);
18
+ return (_jsx("div", { className: "space-y-5", children: Object.entries(props.schema.properties ?? {})
19
+ .filter(([name]) => path.length > 0 || !(props.hiddenRootFields ?? []).includes(name))
20
+ .map(([name, fieldSchema]) => (_jsx(SchemaField, { ...props, name: name, fieldSchema: fieldSchema, widget: path.length === 0 ? fieldWidget(props.uiSchema ?? null, name) : null, required: required.has(name), path: [...path, name] }, [...path, name].join(".")))) }));
21
+ }
22
+ function SchemaField(props) {
23
+ const { name, fieldSchema: schema, required, path, language } = props;
24
+ const canonical = props.canonical ?? null;
25
+ const labels = props.labels ?? defaultFieldLabels;
26
+ const rootValue = props.value;
27
+ const value = readPath(rootValue, path);
28
+ const type = schemaType(schema);
29
+ const label = (props.propertyLabel ?? propertyLabel)(name, schema, language, canonical);
30
+ const description = propertyDescription(schema, language, canonical);
31
+ const setValue = (next) => props.onChange(writePath(rootValue, path, next));
32
+ // the runtime owns bound values, and a readOnly property is not the client's to set: the form shows both, read-only
33
+ const readOnly = typeof schema["x-mantle-bind"] === "string" || schema.readOnly === true;
34
+ const nullable = isNullable(schema);
35
+ const cleared = clearedValue(schema);
36
+ const id = React.useId();
37
+ const labelId = `${id}-label`;
38
+ const descriptionId = `${id}-description`;
39
+ // the label names the control, its description describes it, and a required field says so
40
+ const control = { id, "aria-describedby": description ? descriptionId : undefined, "aria-required": required && !readOnly ? true : undefined };
41
+ const nested = (childSchema, childPath) => _jsx(SchemaFields, { ...props, schema: childSchema, path: childPath });
42
+ const custom = readOnly ? undefined : props.renderField?.({ name, schema, path, value, label, widget: stringFieldWidget(schema, props.widget), setValue });
43
+ return (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { id: labelId, htmlFor: id, className: "flex items-center gap-1.5 text-sm font-semibold text-foreground", children: [label, required && !readOnly ? _jsx("span", { className: "text-destructive", children: "*" }) : null] }), description ? _jsx("p", { id: descriptionId, className: "text-xs leading-5 text-muted-foreground", children: description }) : null, custom !== undefined ? custom : readOnly ? (_jsxs("p", { ...control, role: "textbox", "aria-readonly": "true", className: "flex min-h-9 cursor-not-allowed items-center justify-between gap-3 rounded-lg border border-transparent bg-muted px-3 py-2 text-sm text-muted-foreground", children: [_jsx("span", { children: (timestampHint(schema) ? formatTimestampMs(value) : stringForInput(value)) || labels.emptyOption }), _jsx(LockKeyhole, { className: "size-4 shrink-0", "aria-hidden": "true" })] })) : schema.enum || enumOptions(schema) ? (_jsxs(Select
44
+ // a required field has no empty choice unless null is one of its values: it starts unchosen and the person picks one
45
+ , {
46
+ // a required field has no empty choice unless null is one of its values: it starts unchosen and the person picks one
47
+ value: stringForInput(value) || (required && !nullable ? "" : "__empty__"),
48
+ // the option's declared value, so a number stays a number
49
+ onValueChange: (next) => setValue(next === "__empty__" ? cleared : optionValue(schema, next)), children: [_jsx(SelectTrigger, { ...control, className: "w-full", "aria-label": label, children: _jsx(SelectValue, { placeholder: labels.chooseOption }) }), _jsxs(SelectContent, { children: [required && !nullable ? null : _jsx(SelectItem, { value: "__empty__", children: labels.emptyOption }), (enumOptions(schema) ?? schema.enum.filter((v) => v !== null).map((v) => ({ value: String(v) }))).map((option) => (_jsx(SelectItem, { value: option.value, children: optionLabel(schema, option.value, language, canonical) }, option.value)))] })] })) : type === "boolean" ? (_jsxs("label", { className: "inline-flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Checkbox, { ...control, "aria-labelledby": labelId, checked: Boolean(value), onCheckedChange: (checked) => setValue(checked === true) }), labels.boolean] })) : type === "number" || type === "integer" ? (_jsxs("div", { className: "space-y-1", children: [timestampHint(schema) ? (_jsx(DateTimePicker, { control: control, label: label, labels: labels, value: value, onChange: (date) => setValue(date?.getTime() ?? cleared) })) : (_jsx(Input, { ...control, type: "number", "aria-label": label, value: numberForInput(value), min: schema.minimum, max: schema.maximum, onChange: (event) => {
50
+ const raw = event.target.value;
51
+ setValue(raw === "" ? cleared : Number(raw));
52
+ } })), _jsx(NumberFieldPreview, { schema: schema, value: value, rootValue: rootValue })] })) : type === "object" ? (_jsx("div", { className: "rounded-lg border bg-muted/20 p-4", children: schema.properties ? nested(schema, path) : _jsx(JsonEditor, { value: value, onChange: setValue }) })) : type === "array" ? (_jsx(ArrayField, { schema: schema, value: Array.isArray(value) ? value : [], path: path, labels: labels, setArray: (next) => setValue(next), nested: nested })) : (_jsx(StringFieldControl, { control: control, schema: schema, widget: props.widget, value: value, label: label, labels: labels, onChange: setValue }))] }));
53
+ }
54
+ function DateTimePicker({ control, label, labels, value, onChange }) {
55
+ const selected = dateFromFieldValue(value);
56
+ const timeId = React.useId();
57
+ return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { ...control, type: "button", variant: "outline", className: "w-full justify-start font-normal", "aria-label": label, children: [_jsx(CalendarIcon, {}), selected ? formatTimestampMs(selected.getTime()) : labels.dateTimeSelect] }) }), _jsxs(PopoverContent, { className: "w-auto p-0", align: "start", children: [_jsx(Calendar, { mode: "single", selected: selected, defaultMonth: selected, onSelect: (day) => {
58
+ if (!day)
59
+ return;
60
+ const next = new Date(day);
61
+ next.setHours(selected?.getHours() ?? 0, selected?.getMinutes() ?? 0, 0, 0);
62
+ onChange(next);
63
+ } }), _jsxs("div", { className: "flex items-center gap-3 border-t p-3", children: [_jsx("label", { className: "text-sm font-medium", htmlFor: timeId, children: labels.dateTimeTime }), _jsx(Input, { id: timeId, type: "time", className: "w-32", disabled: !selected, value: selected ? `${String(selected.getHours()).padStart(2, "0")}:${String(selected.getMinutes()).padStart(2, "0")}` : "", onChange: (event) => {
64
+ const [hours, minutes] = event.target.value.split(":").map(Number);
65
+ // a cleared time input reads "": keep the time already chosen
66
+ if (!selected || !Number.isFinite(hours) || !Number.isFinite(minutes))
67
+ return;
68
+ const next = new Date(selected);
69
+ next.setHours(hours, minutes, 0, 0);
70
+ onChange(next);
71
+ } })] })] })] }));
72
+ }
73
+ /** A muted preview beside a money or timestamp number, in the sibling `currency` when the value has one. */
74
+ function NumberFieldPreview({ schema, value, rootValue }) {
75
+ const formatted = moneyMinorHint(schema) ? formatMoneyMinor(value, rootValue["currency"]) : timestampHint(schema) ? formatTimestampMs(value) : null;
76
+ return formatted ? _jsxs("p", { className: "text-xs text-muted-foreground", children: ["= ", formatted] }) : null;
77
+ }
78
+ function ArrayField({ schema, value, path, labels, setArray, nested }) {
79
+ const itemSchema = schema.items ?? {};
80
+ return (_jsxs("div", { className: "space-y-3 rounded-lg border bg-muted/20 p-3", children: [value.map((item, index) => (_jsxs("div", { className: "rounded-lg border border-border/70 bg-card/50 p-3", children: [_jsxs("div", { className: "mb-3 flex items-center justify-between gap-2", children: [_jsxs("span", { className: "text-xs font-semibold text-muted-foreground", children: ["#", index + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", title: labels.removeItem, "aria-label": labels.removeItem, onClick: () => setArray(value.filter((_, i) => i !== index)), children: _jsx(Trash2, { className: "size-3.5", "aria-hidden": true }) })] }), schemaType(itemSchema) === "object" && itemSchema.properties ? nested(itemSchema, [...path, String(index)]) : (_jsx(Input, { value: stringForInput(item), onChange: (event) => {
81
+ const next = [...value];
82
+ next[index] = event.target.value;
83
+ setArray(next);
84
+ } }))] }, index))), _jsxs(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setArray([...value, defaultValueForSchema(itemSchema)]), children: [_jsx(Plus, { className: "size-3.5", "aria-hidden": true }), labels.addItem] })] }));
85
+ }
86
+ function JsonEditor({ value, onChange }) {
87
+ const [draft, setDraft] = React.useState(JSON.stringify(value ?? {}, null, 2));
88
+ const [error, setError] = React.useState(null);
89
+ React.useEffect(() => setDraft(JSON.stringify(value ?? {}, null, 2)), [value]);
90
+ return (_jsxs("div", { className: "space-y-2", children: [_jsx(Textarea, { className: "min-h-32 font-mono", value: draft, onChange: (event) => {
91
+ const next = event.target.value;
92
+ setDraft(next);
93
+ try {
94
+ onChange(JSON.parse(next));
95
+ setError(null);
96
+ }
97
+ catch (err) {
98
+ setError(err instanceof Error ? err.message : String(err));
99
+ }
100
+ } }), error ? _jsx("p", { className: "text-xs text-destructive", children: error }) : null] }));
101
+ }
102
+ /** Markdown and HTML need a host's editor (`renderField`); without one they are a plain textarea. */
103
+ function StringFieldControl({ control, schema, widget, value, label, labels, onChange }) {
104
+ const kind = stringFieldWidget(schema, widget);
105
+ const text = stringForInput(value);
106
+ if (kind !== "input")
107
+ return _jsx(Textarea, { ...control, "aria-label": label, className: "min-h-24", value: text, maxLength: schema.maxLength, onChange: (event) => onChange(event.target.value) });
108
+ if (schema.format === "date-time")
109
+ return _jsx(DateTimePicker, { control: control, label: label, labels: labels, value: value, onChange: (date) => onChange(date?.toISOString() ?? "") });
110
+ return _jsx(Input, { ...control, type: "text", "aria-label": label, value: text, onChange: (event) => onChange(event.target.value) });
111
+ }
112
+ /** The string widget a field asks for: its `x-mcp-hint`, else the uiSchema widget, else an input. */
113
+ export function stringFieldWidget(schema, widget) {
114
+ const hint = typeof schema["x-mcp-hint"] === "string" ? schema["x-mcp-hint"] : "";
115
+ if (hint === "markdown" || hint === "html")
116
+ return hint;
117
+ if (hint === "richtext")
118
+ return "textarea";
119
+ return widget ?? "input";
120
+ }
121
+ function fieldWidget(uiSchema, name) {
122
+ const fields = uiSchema?.["fields"];
123
+ if (!fields || typeof fields !== "object" || Array.isArray(fields))
124
+ return null;
125
+ const config = fields[name];
126
+ if (!config || typeof config !== "object" || Array.isArray(config))
127
+ return null;
128
+ return config["widget"] === "textarea" ? "textarea" : null;
129
+ }
130
+ function schemaType(schema) {
131
+ const raw = Array.isArray(schema.type) ? schema.type.find((item) => item !== "null") : schema.type;
132
+ if (typeof raw === "string")
133
+ return raw;
134
+ if (schema.properties)
135
+ return "object";
136
+ if (schema.items)
137
+ return "array";
138
+ return "string";
139
+ }
140
+ function stringForInput(value) {
141
+ if (value == null)
142
+ return "";
143
+ if (typeof value === "string")
144
+ return value;
145
+ if (typeof value === "number" || typeof value === "boolean")
146
+ return String(value);
147
+ return JSON.stringify(value);
148
+ }
149
+ function numberForInput(value) {
150
+ if (typeof value === "number" && Number.isFinite(value))
151
+ return value;
152
+ if (typeof value === "string")
153
+ return value;
154
+ return "";
155
+ }
156
+ function defaultValueForSchema(schema) {
157
+ if (schema.default !== undefined)
158
+ return schema.default;
159
+ const type = schemaType(schema);
160
+ if (type === "object")
161
+ return {};
162
+ if (type === "array")
163
+ return [];
164
+ if (type === "boolean")
165
+ return false;
166
+ if (type === "number" || type === "integer")
167
+ return 0;
168
+ return "";
169
+ }
170
+ function readPath(root, path) {
171
+ let current = root;
172
+ for (const segment of path) {
173
+ if (Array.isArray(current))
174
+ current = current[Number(segment)];
175
+ else if (typeof current === "object" && current !== null)
176
+ current = current[segment];
177
+ else
178
+ return undefined;
179
+ }
180
+ return current;
181
+ }
182
+ function writePath(root, path, value) {
183
+ if (path.length === 0)
184
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
185
+ const clone = structuredClone(root);
186
+ let current = clone;
187
+ for (let index = 0; index < path.length - 1; index += 1) {
188
+ const segment = path[index];
189
+ const nextIsIndex = /^\d+$/.test(path[index + 1]);
190
+ if (Array.isArray(current)) {
191
+ const i = Number(segment);
192
+ current[i] = current[i] ?? (nextIsIndex ? [] : {});
193
+ current = current[i];
194
+ }
195
+ else if (typeof current === "object" && current !== null) {
196
+ const record = current;
197
+ record[segment] = record[segment] ?? (nextIsIndex ? [] : {});
198
+ current = record[segment];
199
+ }
200
+ }
201
+ const last = path[path.length - 1];
202
+ if (Array.isArray(current))
203
+ current[Number(last)] = value;
204
+ else if (typeof current === "object" && current !== null)
205
+ current[last] = value;
206
+ return clone;
207
+ }
208
+ /** The edits a SchemaFields change makes: it hands back a cloned value, and only fields that really changed are edits, so
209
+ * untouched fields keep following a newer review. */
210
+ export function applyFieldEdits(controller, before, next) {
211
+ for (const [field, value] of Object.entries(next)) {
212
+ if (JSON.stringify(before[field]) !== JSON.stringify(value))
213
+ controller.edit(field, value);
214
+ }
215
+ }
216
+ const isNullable = (schema) => schema.nullable === true || (schema.enum ?? []).includes(null) || [schema.type].flat().includes("null");
217
+ /** A cleared field: null where null is one of its values, else left out of the input. */
218
+ export function clearedValue(schema) {
219
+ return isNullable(schema) ? null : undefined;
220
+ }
221
+ /** A chosen option as the field declares it: a Select hands back text, so `2` of `enum: [1, 2]` is the number again. */
222
+ export function optionValue(schema, chosen) {
223
+ return schema.enum?.find((v) => v !== null && String(v) === chosen) ?? chosen;
224
+ }
225
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/react/fields.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /** Every string the components render; hosts pass their own translations. */
2
+ export interface InteractionLabels {
3
+ readonly submit: string;
4
+ readonly submitting: string;
5
+ readonly cancel: string;
6
+ readonly close: string;
7
+ readonly boundInputs: string;
8
+ readonly reviewedEntry: string;
9
+ readonly version: string;
10
+ readonly changes: string;
11
+ readonly latestChanges: string;
12
+ readonly field: string;
13
+ readonly before: string;
14
+ readonly after: string;
15
+ readonly empty: string;
16
+ readonly loading: string;
17
+ readonly reading: string;
18
+ readonly unreadable: string;
19
+ readonly changedSinceList: string;
20
+ readonly reviewLatest: string;
21
+ readonly contested: string;
22
+ readonly conflict: string;
23
+ /** A conflict where the host cannot read the entry again (no `read`). */
24
+ readonly conflictReopen: string;
25
+ readonly uncertain: string;
26
+ readonly reread: string;
27
+ readonly acknowledgeUncertain: string;
28
+ readonly failed: string;
29
+ readonly succeeded: string;
30
+ readonly cancelled: string;
31
+ }
32
+ export declare const defaultInteractionLabels: InteractionLabels;
33
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/react/labels.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,wBAAwB,EAAE,iBA4BtC,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const defaultInteractionLabels = {
2
+ submit: "Run",
3
+ submitting: "Running…",
4
+ cancel: "Cancel",
5
+ close: "Close",
6
+ boundInputs: "From the selected row",
7
+ reviewedEntry: "Entry you are reviewing",
8
+ version: "Version",
9
+ changes: "Your changes",
10
+ latestChanges: "What changed",
11
+ field: "Field",
12
+ before: "Before",
13
+ after: "After",
14
+ empty: "—",
15
+ loading: "Loading the latest version…",
16
+ reading: "Checking for changes…",
17
+ unreadable: "This entry could not be loaded, so nothing can be submitted yet.",
18
+ changedSinceList: "Someone changed this entry after you opened it. Review the newer version before you continue.",
19
+ reviewLatest: "Review newer version",
20
+ contested: "Someone else also changed fields you edited:",
21
+ conflict: "This entry changed before your update was saved. Nothing was saved. Load the latest version and review it again.",
22
+ conflictReopen: "This entry changed before your update was saved. Nothing was saved. Close this, then open the action again from the refreshed list.",
23
+ uncertain: "We could not confirm whether this was saved. Check the latest version before trying again.",
24
+ reread: "Load latest version",
25
+ acknowledgeUncertain: "I checked; continue",
26
+ failed: "This operation was refused.",
27
+ succeeded: "Done.",
28
+ cancelled: "Cancelled.",
29
+ };
30
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/react/labels.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,UAAU;IACtB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,uBAAuB;IACpC,aAAa,EAAE,yBAAyB;IACxC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,cAAc;IACvB,aAAa,EAAE,cAAc;IAC7B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,6BAA6B;IACtC,OAAO,EAAE,uBAAuB;IAChC,UAAU,EAAE,kEAAkE;IAC9E,gBAAgB,EAAE,+FAA+F;IACjH,YAAY,EAAE,sBAAsB;IACpC,SAAS,EAAE,8CAA8C;IACzD,QAAQ,EAAE,kHAAkH;IAC5H,cAAc,EAAE,qIAAqI;IACrJ,SAAS,EAAE,4FAA4F;IACvG,MAAM,EAAE,qBAAqB;IAC7B,oBAAoB,EAAE,qBAAqB;IAC3C,MAAM,EAAE,6BAA6B;IACrC,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,YAAY;CACxB,CAAC"}