@burojs/ui-shadcn 0.6.0 → 0.8.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 (158) hide show
  1. package/README.md +9 -0
  2. package/dist/bulk-summary-2HLgz7Il.cjs +169 -0
  3. package/dist/bulk-summary-2HLgz7Il.cjs.map +1 -0
  4. package/dist/bulk-summary-D6A0ua21.js +169 -0
  5. package/dist/bulk-summary-D6A0ua21.js.map +1 -0
  6. package/dist/{candidates-relation-picker-Cy0rTxvI.cjs → candidates-relation-picker-C47mF260.cjs} +4 -4
  7. package/dist/{candidates-relation-picker-Cy0rTxvI.cjs.map → candidates-relation-picker-C47mF260.cjs.map} +1 -1
  8. package/dist/{candidates-relation-picker-B116Bmqi.js → candidates-relation-picker-CGXItMN0.js} +3 -3
  9. package/dist/{candidates-relation-picker-B116Bmqi.js.map → candidates-relation-picker-CGXItMN0.js.map} +1 -1
  10. package/dist/{check-confirm-dialog--gPFnEeg.cjs → check-confirm-dialog-BT04Mieo.cjs} +475 -107
  11. package/dist/check-confirm-dialog-BT04Mieo.cjs.map +1 -0
  12. package/dist/{check-confirm-dialog-bRT8lt0d.js → check-confirm-dialog-CtiRzOAt.js} +391 -108
  13. package/dist/check-confirm-dialog-CtiRzOAt.js.map +1 -0
  14. package/dist/{dialog-B_rt9S1c.js → dialog-C123sVQ8.js} +4 -4
  15. package/dist/dialog-C123sVQ8.js.map +1 -0
  16. package/dist/{dialog-DRNUq9EA.cjs → dialog-vmMdfUWs.cjs} +3 -3
  17. package/dist/dialog-vmMdfUWs.cjs.map +1 -0
  18. package/dist/{filter-builder-nXqtM_h4.cjs → filter-builder-ByGhxLf_.cjs} +1021 -154
  19. package/dist/filter-builder-ByGhxLf_.cjs.map +1 -0
  20. package/dist/{filter-builder-Bhn-dhZV.js → filter-builder-z3Axzf9Y.js} +929 -140
  21. package/dist/filter-builder-z3Axzf9Y.js.map +1 -0
  22. package/dist/{flow-runtime-D3avVH0I.cjs → flow-runtime-BVFjMU5-.cjs} +64 -29
  23. package/dist/flow-runtime-BVFjMU5-.cjs.map +1 -0
  24. package/dist/{flow-runtime-s6lkRPKF.js → flow-runtime-DrUWyTS0.js} +65 -30
  25. package/dist/flow-runtime-DrUWyTS0.js.map +1 -0
  26. package/dist/{flow-screen-CCvgDI9G.js → flow-screen-3fk6J33y.js} +130 -87
  27. package/dist/flow-screen-3fk6J33y.js.map +1 -0
  28. package/dist/{flow-screen-Ci_Sik4Y.cjs → flow-screen-6y5E_HT6.cjs} +130 -87
  29. package/dist/flow-screen-6y5E_HT6.cjs.map +1 -0
  30. package/dist/index.cjs +1186 -950
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +631 -322
  33. package/dist/index.d.ts +631 -322
  34. package/dist/index.js +1100 -870
  35. package/dist/index.js.map +1 -1
  36. package/dist/{inline-flow-host-DV1et3c6.cjs → inline-flow-host-C4KmZIYE.cjs} +5 -5
  37. package/dist/inline-flow-host-C4KmZIYE.cjs.map +1 -0
  38. package/dist/{inline-flow-host-B6FI0ctQ.js → inline-flow-host-YnnvWjdU.js} +5 -5
  39. package/dist/inline-flow-host-YnnvWjdU.js.map +1 -0
  40. package/dist/{candidates-gate-D33jXLHO.cjs → lazy-relation-picker-dialog-BAKBRn3V.cjs} +10 -10
  41. package/dist/lazy-relation-picker-dialog-BAKBRn3V.cjs.map +1 -0
  42. package/dist/{candidates-gate-Bb70LPAy.js → lazy-relation-picker-dialog-DN4bvQfg.js} +11 -11
  43. package/dist/lazy-relation-picker-dialog-DN4bvQfg.js.map +1 -0
  44. package/dist/{page-flow-route-i3ZfJ1sd.js → page-flow-route-CtEfqAvU.js} +35 -23
  45. package/dist/page-flow-route-CtEfqAvU.js.map +1 -0
  46. package/dist/{page-flow-route-hdnULWqd.cjs → page-flow-route-DEjAxHe3.cjs} +42 -30
  47. package/dist/page-flow-route-DEjAxHe3.cjs.map +1 -0
  48. package/dist/{place-node-NraNYKPx.js → place-node-BdxT-30h.js} +1980 -1041
  49. package/dist/place-node-BdxT-30h.js.map +1 -0
  50. package/dist/{place-node-C5SmIAYU.cjs → place-node-Bhl8B3fF.cjs} +2038 -1087
  51. package/dist/place-node-Bhl8B3fF.cjs.map +1 -0
  52. package/dist/{related-list-cards-CFq3meUn.cjs → related-list-cards-Bc_vfCE_.cjs} +9 -4
  53. package/dist/{related-list-cards-CFq3meUn.cjs.map → related-list-cards-Bc_vfCE_.cjs.map} +1 -1
  54. package/dist/{related-list-cards-BWZ9GfOG.js → related-list-cards-BvkD5OcC.js} +9 -4
  55. package/dist/{related-list-cards-BWZ9GfOG.js.map → related-list-cards-BvkD5OcC.js.map} +1 -1
  56. package/dist/related-list-timeline-DCrwN9oO.js +167 -0
  57. package/dist/related-list-timeline-DCrwN9oO.js.map +1 -0
  58. package/dist/related-list-timeline-k0DtnxTs.cjs +167 -0
  59. package/dist/related-list-timeline-k0DtnxTs.cjs.map +1 -0
  60. package/dist/{related-rows-ea43qhhy.cjs → related-rows-BW9Jr07T.cjs} +27 -16
  61. package/dist/related-rows-BW9Jr07T.cjs.map +1 -0
  62. package/dist/{related-rows-o0_t-Yce.js → related-rows-CPE-9FFr.js} +25 -14
  63. package/dist/related-rows-CPE-9FFr.js.map +1 -0
  64. package/dist/{search-access-CPPmfuvy.js → relation-create-C43cdPQt.js} +595 -13
  65. package/dist/relation-create-C43cdPQt.js.map +1 -0
  66. package/dist/{search-access-Dugvttlg.cjs → relation-create-DDEYcKfw.cjs} +633 -14
  67. package/dist/relation-create-DDEYcKfw.cjs.map +1 -0
  68. package/dist/{relation-many-picker-bvkjkv-k.js → relation-many-picker-BlrGRwMV.js} +210 -104
  69. package/dist/relation-many-picker-BlrGRwMV.js.map +1 -0
  70. package/dist/{relation-many-picker-C8zFEjwd.cjs → relation-many-picker-Br-zBHxT.cjs} +218 -112
  71. package/dist/relation-many-picker-Br-zBHxT.cjs.map +1 -0
  72. package/dist/{relation-picker-gag0qSR5.cjs → relation-picker-ADjxI_TI.cjs} +36 -73
  73. package/dist/relation-picker-ADjxI_TI.cjs.map +1 -0
  74. package/dist/{relation-picker-dialog-B6nIiJBf.js → relation-picker-dialog-CyKliBkN.js} +134 -36
  75. package/dist/relation-picker-dialog-CyKliBkN.js.map +1 -0
  76. package/dist/{relation-picker-dialog-0IzkjmiA.cjs → relation-picker-dialog-DimVQF9Y.cjs} +133 -35
  77. package/dist/relation-picker-dialog-DimVQF9Y.cjs.map +1 -0
  78. package/dist/{relation-picker-Z0ZJJ5uS.js → relation-picker-x7P5HKie.js} +30 -61
  79. package/dist/relation-picker-x7P5HKie.js.map +1 -0
  80. package/dist/relation-select-B8Fq4o-t.js +48 -0
  81. package/dist/relation-select-B8Fq4o-t.js.map +1 -0
  82. package/dist/relation-select-Cr3CfNLy.cjs +55 -0
  83. package/dist/relation-select-Cr3CfNLy.cjs.map +1 -0
  84. package/dist/{resource-page-router-3RUf9d1j.js → resource-page-router-BRpUnhay.js} +634 -264
  85. package/dist/resource-page-router-BRpUnhay.js.map +1 -0
  86. package/dist/{resource-page-router-PXfMW9nh.cjs → resource-page-router-qEd2xb55.cjs} +694 -312
  87. package/dist/resource-page-router-qEd2xb55.cjs.map +1 -0
  88. package/dist/{rich-text-vTyVjDoa.cjs → rich-text-C_7JCvRo.cjs} +2 -2
  89. package/dist/{rich-text-vTyVjDoa.cjs.map → rich-text-C_7JCvRo.cjs.map} +1 -1
  90. package/dist/{rich-text-DFerywgz.js → rich-text-RcPBf6hr.js} +2 -2
  91. package/dist/{rich-text-DFerywgz.js.map → rich-text-RcPBf6hr.js.map} +1 -1
  92. package/dist/success-notices-Dl3M1fZP.cjs +46 -0
  93. package/dist/success-notices-Dl3M1fZP.cjs.map +1 -0
  94. package/dist/success-notices-LDEgEkc4.js +41 -0
  95. package/dist/success-notices-LDEgEkc4.js.map +1 -0
  96. package/dist/{toaster-Cr51X7bz.cjs → toaster-BbByOytP.cjs} +60 -15
  97. package/dist/toaster-BbByOytP.cjs.map +1 -0
  98. package/dist/{toaster-C02XbB9r.js → toaster-Ct_YHGs6.js} +43 -16
  99. package/dist/toaster-Ct_YHGs6.js.map +1 -0
  100. package/dist/{use-dialog-filter-state-C--oMAZG.js → use-dialog-filter-state-B_MqzHaT.js} +5 -4
  101. package/dist/use-dialog-filter-state-B_MqzHaT.js.map +1 -0
  102. package/dist/{use-dialog-filter-state-Dhe8PcB5.cjs → use-dialog-filter-state-tNvqAAjh.cjs} +6 -5
  103. package/dist/use-dialog-filter-state-tNvqAAjh.cjs.map +1 -0
  104. package/dist/use-record-subtitle-bfwIoUme.cjs +70 -0
  105. package/dist/use-record-subtitle-bfwIoUme.cjs.map +1 -0
  106. package/dist/use-record-subtitle-gIaCGgbI.js +53 -0
  107. package/dist/use-record-subtitle-gIaCGgbI.js.map +1 -0
  108. package/package.json +11 -11
  109. package/dist/bulk-summary-CwSd6Yjb.cjs +0 -108
  110. package/dist/bulk-summary-CwSd6Yjb.cjs.map +0 -1
  111. package/dist/bulk-summary-GxMDP4bw.js +0 -108
  112. package/dist/bulk-summary-GxMDP4bw.js.map +0 -1
  113. package/dist/candidates-gate-Bb70LPAy.js.map +0 -1
  114. package/dist/candidates-gate-D33jXLHO.cjs.map +0 -1
  115. package/dist/check-confirm-dialog--gPFnEeg.cjs.map +0 -1
  116. package/dist/check-confirm-dialog-bRT8lt0d.js.map +0 -1
  117. package/dist/dialog-B_rt9S1c.js.map +0 -1
  118. package/dist/dialog-DRNUq9EA.cjs.map +0 -1
  119. package/dist/filter-builder-Bhn-dhZV.js.map +0 -1
  120. package/dist/filter-builder-nXqtM_h4.cjs.map +0 -1
  121. package/dist/flow-runtime-D3avVH0I.cjs.map +0 -1
  122. package/dist/flow-runtime-s6lkRPKF.js.map +0 -1
  123. package/dist/flow-screen-CCvgDI9G.js.map +0 -1
  124. package/dist/flow-screen-Ci_Sik4Y.cjs.map +0 -1
  125. package/dist/inline-flow-host-B6FI0ctQ.js.map +0 -1
  126. package/dist/inline-flow-host-DV1et3c6.cjs.map +0 -1
  127. package/dist/page-flow-route-hdnULWqd.cjs.map +0 -1
  128. package/dist/page-flow-route-i3ZfJ1sd.js.map +0 -1
  129. package/dist/place-node-C5SmIAYU.cjs.map +0 -1
  130. package/dist/place-node-NraNYKPx.js.map +0 -1
  131. package/dist/related-list-timeline-CCzl71aA.cjs +0 -142
  132. package/dist/related-list-timeline-CCzl71aA.cjs.map +0 -1
  133. package/dist/related-list-timeline-yrPsjA3F.js +0 -142
  134. package/dist/related-list-timeline-yrPsjA3F.js.map +0 -1
  135. package/dist/related-rows-ea43qhhy.cjs.map +0 -1
  136. package/dist/related-rows-o0_t-Yce.js.map +0 -1
  137. package/dist/relation-create-IA40t1hi.cjs +0 -364
  138. package/dist/relation-create-IA40t1hi.cjs.map +0 -1
  139. package/dist/relation-create-h6F9B4C4.js +0 -339
  140. package/dist/relation-create-h6F9B4C4.js.map +0 -1
  141. package/dist/relation-many-picker-C8zFEjwd.cjs.map +0 -1
  142. package/dist/relation-many-picker-bvkjkv-k.js.map +0 -1
  143. package/dist/relation-picker-Z0ZJJ5uS.js.map +0 -1
  144. package/dist/relation-picker-dialog-0IzkjmiA.cjs.map +0 -1
  145. package/dist/relation-picker-dialog-B6nIiJBf.js.map +0 -1
  146. package/dist/relation-picker-gag0qSR5.cjs.map +0 -1
  147. package/dist/resource-page-router-3RUf9d1j.js.map +0 -1
  148. package/dist/resource-page-router-PXfMW9nh.cjs.map +0 -1
  149. package/dist/search-access-CPPmfuvy.js.map +0 -1
  150. package/dist/search-access-Dugvttlg.cjs.map +0 -1
  151. package/dist/shell-BPlk8hEa.js +0 -205
  152. package/dist/shell-BPlk8hEa.js.map +0 -1
  153. package/dist/shell-DxhlsPwm.cjs +0 -271
  154. package/dist/shell-DxhlsPwm.cjs.map +0 -1
  155. package/dist/toaster-C02XbB9r.js.map +0 -1
  156. package/dist/toaster-Cr51X7bz.cjs.map +0 -1
  157. package/dist/use-dialog-filter-state-C--oMAZG.js.map +0 -1
  158. package/dist/use-dialog-filter-state-Dhe8PcB5.cjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  const require_use_theme = require("./use-theme-DFlpXils.cjs");
2
- const require_check_confirm_dialog = require("./check-confirm-dialog--gPFnEeg.cjs");
2
+ const require_check_confirm_dialog = require("./check-confirm-dialog-BT04Mieo.cjs");
3
3
  const require_button = require("./button-BxnnE28H.cjs");
4
- const require_shell = require("./shell-DxhlsPwm.cjs");
5
- const require_place_node = require("./place-node-C5SmIAYU.cjs");
4
+ const require_place_node = require("./place-node-Bhl8B3fF.cjs");
5
+ const require_success_notices = require("./success-notices-Dl3M1fZP.cjs");
6
6
  let _burojs_core = require("@burojs/core");
7
7
  let _burojs_react = require("@burojs/react");
8
8
  let _tabler_icons_react = require("@tabler/icons-react");
@@ -32,11 +32,7 @@ const same = (a, b) => {
32
32
  }
33
33
  };
34
34
  function ReviewDiff({ form, initial, values, i18nPrefix, testid }) {
35
- const t = (0, _burojs_react.useOptionalT)();
36
- const changedText = (() => {
37
- const value = t("review.changed");
38
- return value === "review.changed" ? "changed" : value;
39
- })();
35
+ const changedText = (0, _burojs_react.useOptionalT)()("review.changed", { defaultValue: "changed" });
40
36
  const rows = form.fields.filter((binding) => !same(initial[binding.name], values[binding.name]));
41
37
  return (0, react_jsx_runtime.jsx)("dl", {
42
38
  "data-testid": `${testid}:review`,
@@ -120,32 +116,43 @@ function OverlayBinding({ children }) {
120
116
  function WithBinding({ children }) {
121
117
  return (0, react.useContext)(FlowHostBindingContext) !== null ? (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children }) : (0, react_jsx_runtime.jsx)(OverlayBinding, { children });
122
118
  }
123
- function text(t, key, fallback, params) {
124
- const value = t(key, params === void 0 ? void 0 : { params });
125
- return value === key ? fallback : value;
126
- }
127
- const REJECTED_KEYS = {
128
- validation: "validation",
129
- conflict: "conflict",
130
- forbidden: "forbidden",
131
- "not-found": "notFound"
132
- };
133
- function outcomeMessage(snapshot, busy, t) {
134
- if (busy) return text(t, "flow.busyElsewhere", "This action is running in another tab.");
119
+ function outcomeMessage(snapshot, busy, t, caps, textPrefix, flow, reasonOf) {
120
+ if (busy) return t("flow.busyElsewhere", { defaultValue: "This action is running in another tab." });
135
121
  const outcome = snapshot.outcome;
136
122
  if (outcome === void 0 || outcome.outcome === "success") {
137
- if (snapshot.control === "disabled" && snapshot.reason !== void 0) return snapshot.reason;
123
+ if (snapshot.control === "disabled" && snapshot.reason !== void 0) return reasonOf(snapshot.reason);
138
124
  return null;
139
125
  }
140
- if (outcome.outcome === "unknown") return [text(t, "flow.unknown", "The request timed out. It may have been applied. Nothing was resent."), ...snapshot.reason === void 0 ? [] : [snapshot.reason]].join(" ");
126
+ if (outcome.outcome === "unknown") return [outcome.applied === "partial" ? t("flow.unknownPartial", { defaultValue: "Part of this may have been applied. Nothing was resent." }) : t("flow.unknown", { defaultValue: "It may have been applied. Nothing was resent." }), ...snapshot.reason === void 0 ? [] : [reasonOf(snapshot.reason)]].join(" ");
141
127
  if (outcome.outcome === "rejected") {
142
- if (snapshot.reason !== void 0) return snapshot.reason;
143
- const kind = "errorKind" in outcome ? outcome.errorKind : void 0;
144
- const key = kind === void 0 ? void 0 : REJECTED_KEYS[kind];
145
- if (key !== void 0) return text(t, `flow.rejected.${key}`, "Nothing was saved.");
146
- return text(t, "flow.rejected.precondition", "The record changed. Nothing was sent.");
128
+ if (snapshot.reason !== void 0) return reasonOf(snapshot.reason);
129
+ const kind = "kind" in outcome ? outcome.kind : void 0;
130
+ const code = "code" in outcome ? outcome.code : void 0;
131
+ if (code !== void 0) {
132
+ const specific = (0, _burojs_react.specificErrorText)({
133
+ code,
134
+ ..."message" in outcome && outcome.message !== void 0 ? { message: outcome.message } : {}
135
+ }, caps, { action: {
136
+ prefix: textPrefix,
137
+ texts: flow?.texts
138
+ } });
139
+ if (specific !== void 0) return specific;
140
+ }
141
+ const key = kind === void 0 ? void 0 : _burojs_react.REJECTED_KEYS[kind];
142
+ if (key !== void 0) return t(`${textPrefix}.rejected.${key}`, { defaultValue: (0, _burojs_core.textsValueAt)(flow?.texts, ["rejected", key]) ?? t(`flow.rejected.${key}`, { defaultValue: "Nothing was saved." }) });
143
+ return t("flow.rejected.precondition", { defaultValue: "The record changed. Nothing was sent." });
144
+ }
145
+ if (outcome.outcome === "failed") {
146
+ if (snapshot.reason !== void 0) return reasonOf(snapshot.reason);
147
+ const code = "code" in outcome ? outcome.code : void 0;
148
+ return (code === void 0 ? void 0 : (0, _burojs_react.specificErrorText)({
149
+ code,
150
+ ..."message" in outcome && outcome.message !== void 0 ? { message: outcome.message } : {}
151
+ }, caps, { action: {
152
+ prefix: textPrefix,
153
+ texts: flow?.texts
154
+ } })) ?? t("flow.failed", { defaultValue: "The request could not be sent. Nothing was saved." });
147
155
  }
148
- if (outcome.outcome === "failed") return snapshot.reason ?? text(t, "flow.failed", "The request could not be sent. Nothing was saved.");
149
156
  return null;
150
157
  }
151
158
  function FlowScreen(props) {
@@ -160,13 +167,25 @@ function FlowScreen(props) {
160
167
  });
161
168
  return null;
162
169
  }
170
+ function SelectionScope(props) {
171
+ if (props.selection === void 0 || props.resource === null) return (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: props.children });
172
+ return (0, react_jsx_runtime.jsx)(_burojs_react.BulkSelectionScope, {
173
+ resource: props.resource,
174
+ ids: props.selection.ids,
175
+ children: props.children
176
+ });
177
+ }
163
178
  function HeldFlowScreen(props) {
164
179
  const [generation, setGeneration] = (0, react.useState)(0);
165
180
  return (0, react_jsx_runtime.jsx)(_burojs_react_flows.FlowTextsScope, {
166
181
  compiled: props.compiled,
167
- children: (0, react_jsx_runtime.jsx)(WithBinding, { children: (0, react_jsx_runtime.jsx)(_burojs_react.ScreenStateProvider, { children: (0, react_jsx_runtime.jsx)(FlowScreenBody, {
168
- ...props,
169
- onFreshForm: () => setGeneration((value) => value + 1)
182
+ children: (0, react_jsx_runtime.jsx)(WithBinding, { children: (0, react_jsx_runtime.jsx)(_burojs_react.ScreenStateProvider, { children: (0, react_jsx_runtime.jsx)(SelectionScope, {
183
+ selection: props.selection,
184
+ resource: props.compiled.resource,
185
+ children: (0, react_jsx_runtime.jsx)(FlowScreenBody, {
186
+ ...props,
187
+ onFreshForm: () => setGeneration((value) => value + 1)
188
+ })
170
189
  }) }, generation) })
171
190
  });
172
191
  }
@@ -195,6 +214,7 @@ function OwnedFlowScreen(props) {
195
214
  }, [outcome, onSettle]);
196
215
  const instance = (0, _burojs_react.useUIInstance)();
197
216
  const t = (0, _burojs_react.useOptionalT)();
217
+ const caps = (0, _burojs_react.useI18nCaps)(compiled?.resource ?? void 0);
198
218
  const tid = (0, _burojs_react.useTestIds)();
199
219
  if (run !== null && compiled !== null && (snapshot.history.includes("open") || snapshot.step === "outcome")) return (0, react_jsx_runtime.jsx)(HeldFlowScreen, {
200
220
  ...props,
@@ -209,11 +229,11 @@ function OwnedFlowScreen(props) {
209
229
  "aria-busy": refused ? void 0 : "true",
210
230
  className: "flex min-h-0 flex-1 flex-col gap-4",
211
231
  children: [
212
- (0, react_jsx_runtime.jsx)(OwnTitleHeading, { label: props.label }),
232
+ (0, react_jsx_runtime.jsx)(require_check_confirm_dialog.OwnTitleHeading, { label: props.label }),
213
233
  refused ? (0, react_jsx_runtime.jsx)("p", {
214
234
  role: "alert",
215
235
  className: "text-sm",
216
- children: snapshot.reason ?? text(t, "flow.unavailable", "Not allowed.")
236
+ children: snapshot.reason === void 0 ? t("flow.unavailable", { defaultValue: "Not allowed." }) : require_check_confirm_dialog.reasonText(caps, snapshot.reason, compiled?.resource ?? void 0)
217
237
  }) : (0, react_jsx_runtime.jsx)(_tabler_icons_react.IconLoader2, {
218
238
  className: "h-5 w-5 animate-spin self-center",
219
239
  "aria-hidden": "true"
@@ -224,33 +244,22 @@ function OwnedFlowScreen(props) {
224
244
  type: "button",
225
245
  variant: "ghost",
226
246
  onClick: () => instance.dismiss(),
227
- children: text(t, "flow.close", "Close")
247
+ children: t("flow.close", { defaultValue: "Close" })
228
248
  })
229
249
  })
230
250
  ]
231
251
  });
232
252
  }
233
- function OwnTitleHeading({ label }) {
234
- const ownTitle = (0, react.useContext)(require_shell.OwnTitleContext);
235
- const heading = (0, react_jsx_runtime.jsx)("h2", {
236
- tabIndex: -1,
237
- "data-buro-overlay-heading": "",
238
- className: "text-lg font-semibold",
239
- children: label
240
- });
241
- return ownTitle ? (0, react_jsx_runtime.jsx)(_radix_ui_react_dialog.Title, {
242
- asChild: true,
243
- children: heading
244
- }) : heading;
245
- }
246
- function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record, args, selection, onFreshForm }) {
253
+ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record: givenRecord, args, selection, onFreshForm }) {
254
+ const record = (0, _burojs_core.flowRecordOf)(compiled, givenRecord);
247
255
  const snapshot = useSyncSnapshot(run);
248
256
  const binding = (0, react.useContext)(FlowHostBindingContext);
249
257
  const tid = (0, _burojs_react.useTestIds)();
250
258
  const t = (0, _burojs_react.useOptionalT)();
259
+ const chromeT = (0, _burojs_react.useChromeT)();
251
260
  const resource = compiled.resource ?? void 0;
252
261
  const caps = (0, _burojs_react.useI18nCaps)(resource);
253
- const ownTitle = (0, react.useContext)(require_shell.OwnTitleContext);
262
+ const ownTitle = (0, react.useContext)(require_check_confirm_dialog.OwnTitleContext);
254
263
  const flowId = compiled.flowId;
255
264
  const recordId = record?.[compiled.idField] ?? record?.id;
256
265
  const recordTitle = (0, _burojs_react.useProjectedTitle)(resource, recordId, record);
@@ -260,6 +269,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
260
269
  ...args === void 0 ? {} : { args },
261
270
  ...selection === void 0 ? {} : { selection: selection.ids }
262
271
  });
272
+ const formControl = require_place_node.useFormControlOf(form);
263
273
  const hasForm = compiled.flow.form !== void 0;
264
274
  const [busy, setBusy] = (0, react.useState)(false);
265
275
  const [initial] = (0, react.useState)(() => run.getSnapshot().values);
@@ -271,6 +281,17 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
271
281
  const succeeded = outcome === "success";
272
282
  const finalStep = snapshot.step === "review" || snapshot.step === "accept";
273
283
  const openBlock = succeeded ? blockOpen(snapshot.effects?.open) : null;
284
+ const showNotices = require_success_notices.useNoticeSink(resource);
285
+ const shownNotices = (0, react.useRef)(null);
286
+ (0, react.useEffect)(() => {
287
+ if (!succeeded || snapshot.notices.length === 0 || shownNotices.current === snapshot.notices) return;
288
+ shownNotices.current = snapshot.notices;
289
+ showNotices(snapshot.notices);
290
+ }, [
291
+ succeeded,
292
+ snapshot.notices,
293
+ showNotices
294
+ ]);
274
295
  (0, react.useEffect)(() => {
275
296
  if (succeeded && !locked && openBlock === null) binding.finish();
276
297
  }, [
@@ -312,8 +333,18 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
312
333
  };
313
334
  const pendingKey = compiled.resource === null ? `appActions.${compiled.name}.pending` : `resources.${compiled.resource}.actions.${compiled.name}.pending`;
314
335
  const pendingLabel = caps.has(pendingKey) ? caps.t(pendingKey) : `${label}…`;
315
- const message = outcomeMessage(snapshot, busy, t);
316
- const couldNotCheck = snapshot.control === "disabled" && snapshot.reason !== void 0 && snapshot.reason === text(t, "flow.couldNotCheck", "Couldn't check");
336
+ const message = outcomeMessage(snapshot, busy, t, caps, compiled.textKeys.prefix, compiled.flow, (reason) => require_check_confirm_dialog.reasonText(caps, reason, resource));
337
+ const formErrorTexts = formErrors.map((issue) => (0, _burojs_react.resolveValidationMessage)({
338
+ code: issue.code ?? "",
339
+ message: issue.message,
340
+ ...issue.check === void 0 ? {} : { check: issue.check }
341
+ }, {
342
+ has: caps.has,
343
+ t: caps.t
344
+ })).filter((text) => text !== message);
345
+ const dismissKey = `${compiled.textKeys.prefix}.dismiss`;
346
+ const cancelWord = (caps.has(dismissKey) ? caps.t(dismissKey) : void 0) ?? (0, _burojs_core.declaredText)("flow", compiled.flow, "dismiss") ?? chromeT("actions.cancel", { defaultValue: "Cancel" });
347
+ const couldNotCheck = snapshot.control === "disabled" && snapshot.unverified === true;
317
348
  const steps = form.steps;
318
349
  const lastStep = steps === null || steps.ids.length === 0 || steps.current === steps.ids[steps.ids.length - 1];
319
350
  const showSubmit = !unknown && !succeeded && (!hasForm || finalStep || lastStep);
@@ -328,7 +359,10 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
328
359
  if (binding.kind === "inline" && hasForm && !unknown) form.draft.discard();
329
360
  binding.close();
330
361
  };
362
+ const headingRef = (0, react.useRef)(null);
363
+ require_check_confirm_dialog.useFocusOnMount(headingRef);
331
364
  const heading = (0, react_jsx_runtime.jsxs)("h2", {
365
+ ref: headingRef,
332
366
  tabIndex: -1,
333
367
  "data-buro-overlay-heading": "",
334
368
  className: "min-w-0 flex-1 break-words text-lg font-semibold tracking-tight focus-visible:outline-hidden",
@@ -363,7 +397,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
363
397
  size: "icon",
364
398
  className: "h-8 w-8 shrink-0",
365
399
  "data-testid": tid.flowClose(flowId),
366
- "aria-label": text(t, "flow.close", "Close"),
400
+ "aria-label": t("flow.close", { defaultValue: "Close" }),
367
401
  onClick: close,
368
402
  children: (0, react_jsx_runtime.jsx)(_tabler_icons_react.IconX, {
369
403
  className: "h-4 w-4",
@@ -384,7 +418,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
384
418
  variant: "outline",
385
419
  "data-testid": tid.flowClose(flowId),
386
420
  onClick: close,
387
- children: text(t, "flow.done", "Done")
421
+ children: t("flow.done", { defaultValue: "Done" })
388
422
  })
389
423
  }) : null,
390
424
  (0, react_jsx_runtime.jsxs)("form", {
@@ -410,7 +444,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
410
444
  variant: "outline",
411
445
  className: "ml-auto",
412
446
  onClick: () => run.retryChecks(),
413
- children: text(t, "actions.retry", "Retry")
447
+ children: chromeT("actions.retry", { defaultValue: "Retry" })
414
448
  }) : null]
415
449
  }),
416
450
  hasForm && form.draft.pending !== null && (!unknown || editingNew) ? (0, react_jsx_runtime.jsxs)("div", {
@@ -420,7 +454,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
420
454
  className: "flex flex-wrap items-center gap-2 rounded-md border border-warning/50 bg-warning/10 px-3 py-2 text-sm",
421
455
  children: [(0, react_jsx_runtime.jsx)("span", {
422
456
  className: "font-medium",
423
- children: text(t, "draft.restorePrompt", "Restore draft?")
457
+ children: t("draft.restorePrompt", { defaultValue: "Restore draft?" })
424
458
  }), (0, react_jsx_runtime.jsxs)("div", {
425
459
  className: "ml-auto flex gap-2",
426
460
  children: [(0, react_jsx_runtime.jsx)(require_button.Button, {
@@ -429,26 +463,22 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
429
463
  variant: "outline",
430
464
  "data-testid": `${tid.flowDraft(flowId)}:restore`,
431
465
  onClick: form.draft.restore,
432
- children: text(t, "draft.restore", "Restore")
466
+ children: t("draft.restore", { defaultValue: "Restore" })
433
467
  }), (0, react_jsx_runtime.jsx)(require_button.Button, {
434
468
  type: "button",
435
469
  size: "sm",
436
470
  variant: "ghost",
437
471
  "data-testid": `${tid.flowDraft(flowId)}:discard`,
438
472
  onClick: form.draft.discard,
439
- children: text(t, "draft.discard", "Discard")
473
+ children: t("draft.discard", { defaultValue: "Discard" })
440
474
  })]
441
475
  })]
442
476
  }) : null,
443
- formErrors.length > 0 ? (0, react_jsx_runtime.jsx)("div", {
477
+ formErrorTexts.length > 0 ? (0, react_jsx_runtime.jsx)("div", {
444
478
  role: "alert",
445
479
  "data-testid": `${tid.flowHost(flowId)}:form-errors`,
446
480
  className: "flex flex-col gap-1 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive",
447
- children: formErrors.map((issue, index) => (0, react_jsx_runtime.jsx)("p", { children: (0, _burojs_react.resolveValidationMessage)({
448
- code: issue.code ?? "",
449
- message: issue.message,
450
- ...issue.params === void 0 ? {} : { params: issue.params }
451
- }, { t }) }, index))
481
+ children: formErrorTexts.map((text, index) => (0, react_jsx_runtime.jsx)("p", { children: text }, index))
452
482
  }) : null,
453
483
  finalStep && compiled.flow.review === true ? (0, react_jsx_runtime.jsx)(ReviewDiff, {
454
484
  form,
@@ -460,15 +490,21 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
460
490
  compiled,
461
491
  tree: compiled.flow.review,
462
492
  values: snapshot.values,
463
- prefix
464
- }) : hasForm ? (0, react_jsx_runtime.jsx)(require_place_node.ScreenTree, {
465
- region: "form-body",
466
- resource: prefix,
467
- mode: "create",
468
- compiled: form.screen,
469
- controller: form,
470
- leafIds: "record",
471
- disabled: locked || unknown && !editingNew || finalStep || succeeded
493
+ prefix,
494
+ run,
495
+ ...record === void 0 ? {} : { record },
496
+ ...args === void 0 ? {} : { args }
497
+ }) : hasForm ? (0, react_jsx_runtime.jsx)(require_place_node.FormControlProvider, {
498
+ value: formControl,
499
+ children: (0, react_jsx_runtime.jsx)(require_place_node.ScreenTree, {
500
+ region: "form-body",
501
+ resource: prefix,
502
+ mode: "create",
503
+ compiled: form.screen,
504
+ controller: form,
505
+ leafIds: "record",
506
+ disabled: locked || unknown && !editingNew || finalStep || succeeded
507
+ })
472
508
  }) : null,
473
509
  finalStep && snapshot.warnings.length > 0 ? (0, react_jsx_runtime.jsx)("ul", {
474
510
  role: "status",
@@ -484,14 +520,14 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
484
520
  unhandled ? (0, react_jsx_runtime.jsx)("p", {
485
521
  "data-testid": `${tid.flowOutcome(flowId)}:unhandled`,
486
522
  className: "text-sm",
487
- children: text(t, "flow.unknownUnhandled", "Check the record before trying again.")
523
+ children: t("flow.unknownUnhandled", { defaultValue: "Check the record before trying again." })
488
524
  }) : null,
489
525
  unknown && confirmingNew ? (0, react_jsx_runtime.jsxs)("div", {
490
526
  role: "alertdialog",
491
- "aria-label": text(t, "flow.sendAsNew", "Send as new"),
527
+ "aria-label": t("flow.sendAsNew", { defaultValue: "Send as new" }),
492
528
  "data-testid": `${tid.flowSendAsNew(flowId)}:confirm`,
493
529
  className: "flex flex-wrap items-center gap-2 rounded-md border border-warning/50 bg-warning/10 px-3 py-2 text-sm",
494
- children: [(0, react_jsx_runtime.jsx)("span", { children: text(t, "flow.sendAsNewConfirm", "This may apply the change twice. Send it as a new request?") }), (0, react_jsx_runtime.jsxs)("div", {
530
+ children: [(0, react_jsx_runtime.jsx)("span", { children: t("flow.sendAsNewConfirm", { defaultValue: "This may apply the change twice. Send it as a new request?" }) }), (0, react_jsx_runtime.jsxs)("div", {
495
531
  className: "ml-auto flex gap-2",
496
532
  children: [(0, react_jsx_runtime.jsx)(require_button.Button, {
497
533
  type: "button",
@@ -499,7 +535,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
499
535
  variant: "ghost",
500
536
  "data-testid": `${tid.flowSendAsNew(flowId)}:cancel`,
501
537
  onClick: () => setConfirmingNew(false),
502
- children: text(t, "actions.cancel", "Cancel")
538
+ children: cancelWord
503
539
  }), (0, react_jsx_runtime.jsx)(require_button.Button, {
504
540
  type: "button",
505
541
  size: "sm",
@@ -509,7 +545,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
509
545
  setConfirmingNew(false);
510
546
  exit(() => run.sendAsNew({ confirmed: true }))();
511
547
  },
512
- children: text(t, "flow.sendAsNew", "Send as new")
548
+ children: t("flow.sendAsNew", { defaultValue: "Send as new" })
513
549
  })]
514
550
  })]
515
551
  }) : null,
@@ -523,7 +559,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
523
559
  "data-testid": tid.flowCheckAgain(flowId),
524
560
  disabled: locked,
525
561
  onClick: exit(() => run.checkAgain()),
526
- children: text(t, "flow.checkAgain", "Check again")
562
+ children: t("flow.checkAgain", { defaultValue: "Check again" })
527
563
  }) : null,
528
564
  snapshot.canResend ? (0, react_jsx_runtime.jsx)(require_button.Button, {
529
565
  type: "button",
@@ -531,7 +567,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
531
567
  "data-testid": tid.flowResend(flowId),
532
568
  disabled: locked,
533
569
  onClick: exit(() => run.resend()),
534
- children: text(t, "flow.resend", "Resend")
570
+ children: t("flow.resend", { defaultValue: "Resend" })
535
571
  }) : null,
536
572
  (0, react_jsx_runtime.jsx)(require_button.Button, {
537
573
  type: "button",
@@ -542,7 +578,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
542
578
  if (hasForm) setEditingNew(true);
543
579
  else setConfirmingNew(true);
544
580
  },
545
- children: text(t, "flow.sendAsNew", "Send as new")
581
+ children: t("flow.sendAsNew", { defaultValue: "Send as new" })
546
582
  }),
547
583
  (0, react_jsx_runtime.jsx)(require_button.Button, {
548
584
  type: "button",
@@ -553,7 +589,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
553
589
  run.startOver();
554
590
  onFreshForm();
555
591
  },
556
- children: text(t, "flow.startOver", "I've checked — start over")
592
+ children: t("flow.startOver", { defaultValue: "I've checked — start over" })
557
593
  })
558
594
  ]
559
595
  }) : null,
@@ -565,7 +601,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
565
601
  variant: "outline",
566
602
  "data-testid": tid.flowBack(flowId),
567
603
  onClick: () => run.back(),
568
- children: text(t, "flow.back", "Back")
604
+ children: t("flow.back", { defaultValue: "Back" })
569
605
  }) : null, (0, react_jsx_runtime.jsxs)("div", {
570
606
  className: "ml-auto flex gap-2",
571
607
  children: [
@@ -575,7 +611,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
575
611
  "data-testid": tid.flowCancel(flowId),
576
612
  disabled: locked,
577
613
  onClick: close,
578
- children: unknown ? text(t, "flow.close", "Close") : binding.kind === "inline" ? text(t, "flow.reset", "Reset") : text(t, "actions.cancel", "Cancel")
614
+ children: unknown ? t("flow.close", { defaultValue: "Close" }) : binding.kind === "inline" ? t("flow.reset", { defaultValue: "Reset" }) : cancelWord
579
615
  }),
580
616
  unknown && editingNew ? (0, react_jsx_runtime.jsx)(require_button.Button, {
581
617
  type: "submit",
@@ -583,7 +619,7 @@ function FlowScreenBody({ run, host, label, title: givenTitle, compiled, record,
583
619
  "data-testid": `${tid.flowSendAsNew(flowId)}:submit`,
584
620
  disabled: locked || confirmingNew,
585
621
  onMouseDown: (event) => event.preventDefault(),
586
- children: text(t, "flow.sendAsNew", "Send as new")
622
+ children: t("flow.sendAsNew", { defaultValue: "Send as new" })
587
623
  }) : null,
588
624
  showSubmit ? (0, react_jsx_runtime.jsxs)(require_button.Button, {
589
625
  type: "submit",
@@ -609,7 +645,7 @@ function useSyncSnapshot(run) {
609
645
  return (0, react.useSyncExternalStore)(run.subscribe, run.getSnapshot, run.getSnapshot);
610
646
  }
611
647
  const NO_FIELDS = Object.freeze({});
612
- function ReviewTree({ compiled, tree, values, prefix }) {
648
+ function ReviewTree({ compiled, tree, values, prefix, run, record, args }) {
613
649
  const fields = compiled.flow.form?.fields;
614
650
  const map = (0, react.useState)(() => {
615
651
  if (fields === void 0) return NO_FIELDS;
@@ -621,8 +657,15 @@ function ReviewTree({ compiled, tree, values, prefix }) {
621
657
  })[0];
622
658
  const body = (0, react.useState)(() => () => tree)[0];
623
659
  const blocks = (0, _burojs_react.useFlowFormCatalog)();
660
+ const metaSources = (0, _burojs_react_flows.useFlowMetaSources)(record, args, compiled.resource);
661
+ const fieldConditions = (0, _burojs_react_flows.useFlowFieldConditions)(compiled);
624
662
  const review = (0, _burojs_react.useFormController)({
625
663
  blocks,
664
+ flowRun: run,
665
+ formId: compiled.formId,
666
+ metaSources,
667
+ ...fieldConditions === void 0 ? {} : { flowFieldConditions: fieldConditions },
668
+ review: true,
626
669
  fields: map,
627
670
  body,
628
671
  mode: "show",
@@ -686,7 +729,7 @@ function FlowOpenBlock({ open, testid }) {
686
729
  children: failed ? (0, react_jsx_runtime.jsx)("p", {
687
730
  role: "alert",
688
731
  className: "text-sm text-muted-foreground",
689
- children: text(t, "block.notImplemented", "This section is not available.")
732
+ children: t("block.notImplemented", { defaultValue: "This section is not available." })
690
733
  }) : View === null || validation?.status !== "ready" ? null : (0, react_jsx_runtime.jsx)(react.Suspense, {
691
734
  fallback: null,
692
735
  children: (0, react_jsx_runtime.jsx)(View, {
@@ -705,4 +748,4 @@ exports.FlowHostBindingContext = FlowHostBindingContext;
705
748
  exports.FlowScreen = FlowScreen;
706
749
  exports.HostedFlowScreen = HostedFlowScreen;
707
750
 
708
- //# sourceMappingURL=flow-screen-Ci_Sik4Y.cjs.map
751
+ //# sourceMappingURL=flow-screen-6y5E_HT6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-screen-6y5E_HT6.cjs","names":["fieldSensitivity","useOptionalT","humanizeKey","FieldDisplay","createContext","useUIInstance","useUIPresentationRuntime","useMemo","useContext","specificErrorText","REJECTED_KEYS","textsValueAt","BulkSelectionScope","useState","FlowTextsScope","ScreenStateProvider","useFlowRun","useRef","useOptionalT","useI18nCaps","useTestIds","OwnTitleHeading","reasonText","IconLoader2","Button","flowRecordOf","useChromeT","OwnTitleContext","useProjectedTitle","useFlowForm","useFormControlOf","useNoticeSink","resolveValidationMessage","declaredText","DialogPrimitive","DocInfo","IconX","FormControlProvider","ScreenTree","useSyncExternalStore","fieldEntriesToMap","useFlowFormCatalog","useFlowMetaSources","useFlowFieldConditions","useFormController","selectImplementation","useFlowOpenImplementation","validatePlacementProps","viewOf","Suspense"],"sources":["../src/flows/review-diff.tsx","../src/flows/flow-screen.tsx"],"sourcesContent":["'use client';\nimport { fieldSensitivity, humanizeKey, type Row } from '@burojs/core';\nimport { type FormController, useOptionalT } from '@burojs/react';\nimport type { ReactElement } from 'react';\nimport { FieldDisplay } from '../forms/field.js';\n\n/** The built-in review block of a flow (`review: true`, P4 spec 4.4). */\nexport const REVIEW_DIFF_BLOCK = 'buro:review-diff';\n\nexport interface ReviewDiffProps {\n /** The flow's form: its active fields, their definitions and labels. */\n readonly form: FormController;\n /** The values the form opened on (`form.initial`): the baseline of the diff. */\n readonly initial: Row;\n /** The values as they will be submitted. */\n readonly values: Row;\n /** Text and doc keys of the form (`<resource>.actions.<name>`). */\n readonly i18nPrefix: string;\n /** The test id base (the flow's host). */\n readonly testid: string;\n}\n\n/** Whether a field is `sensitive` (a mark or a mask). */\nfunction sensitive(definition: unknown): boolean {\n if (fieldSensitivity(definition) !== undefined) return true;\n if (definition === null || typeof definition !== 'object') return false;\n const opts = (definition as { readonly opts?: unknown }).opts;\n const marked =\n opts !== null && typeof opts === 'object'\n ? (opts as { readonly sensitive?: unknown }).sensitive\n : undefined;\n return marked !== undefined && marked !== false && marked !== null;\n}\n\nconst same = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n const empty = (value: unknown) => value === undefined || value === null || value === '';\n if (empty(a) && empty(b)) return true;\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch {\n return false;\n }\n};\n\n/**\n * The review of a flow (`review: true`, 4.4): one row per active form field whose value differs\n * from the one the form opened on — its label, the old display value and the new one. A\n * `sensitive` field says \"changed\" and shows no value, old or new.\n */\nexport function ReviewDiff({\n form,\n initial,\n values,\n i18nPrefix,\n testid,\n}: ReviewDiffProps): ReactElement {\n const t = useOptionalT();\n const changedText = t('review.changed', { defaultValue: 'changed' });\n const rows = form.fields.filter((binding) => !same(initial[binding.name], values[binding.name]));\n return (\n <dl data-testid={`${testid}:review`} data-buro-block={REVIEW_DIFF_BLOCK} className=\"grid gap-2\">\n {rows.map((binding) => {\n const definition = binding.field as unknown as { readonly label?: unknown };\n const label =\n typeof definition.label === 'string' ? definition.label : humanizeKey(binding.name);\n const hidden = sensitive(binding.field);\n return (\n <div\n key={binding.name}\n data-testid={`${testid}:review:${binding.name}`}\n className=\"grid grid-cols-[minmax(0,1fr)_minmax(0,2fr)] gap-2 text-sm\"\n >\n <dt className=\"font-medium\">{label}</dt>\n <dd className=\"flex flex-wrap items-center gap-2\">\n {hidden ? (\n <span className=\"text-muted-foreground\">{changedText}</span>\n ) : (\n <>\n <span data-buro-review=\"old\" className=\"text-muted-foreground line-through\">\n <FieldDisplay\n i18nPrefix={i18nPrefix}\n name={binding.name}\n field={binding.field as never}\n value={initial[binding.name]}\n fallback={<span>{display(initial[binding.name])}</span>}\n />\n </span>\n <span aria-hidden=\"true\">→</span>\n <span data-buro-review=\"new\">\n <FieldDisplay\n i18nPrefix={i18nPrefix}\n name={binding.name}\n field={binding.field as never}\n value={values[binding.name]}\n fallback={<span>{display(values[binding.name])}</span>}\n />\n </span>\n </>\n )}\n </dd>\n </div>\n );\n })}\n </dl>\n );\n}\n\nconst display = (value: unknown): string =>\n value === undefined || value === null || value === '' ? '—' : String(value);\n","'use client';\nimport {\n type CompiledFlow,\n type FlowResult,\n type FlowRun,\n declaredText,\n flowRecordOf,\n type FlowSnapshot,\n type PropValidation,\n textsValueAt,\n validatePlacementProps,\n} from '@burojs/core';\nimport {\n BulkSelectionScope,\n type ErrorTextCaps,\n REJECTED_KEYS,\n specificErrorText,\n type FlowScreenProps,\n type FlowStart,\n ScreenStateProvider,\n resolveValidationMessage,\n useFlowOpenImplementation,\n useDismissPending,\n useFlowFormCatalog,\n useFormController,\n useI18nCaps,\n useChromeT,\n useOptionalT,\n useProjectedTitle,\n useTestIds,\n useUIInstance,\n useUIPresentationRuntime,\n} from '@burojs/react';\nimport { fieldEntriesToMap } from '@burojs/core/internal';\nimport {\n FlowTextsScope,\n useFlowFieldConditions,\n useFlowForm,\n useFlowMetaSources,\n useFlowRun,\n} from '@burojs/react/flows';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { IconLoader2, IconX } from '@tabler/icons-react';\nimport {\n type ReactElement,\n type ReactNode,\n Suspense,\n createContext,\n useContext,\n useMemo,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport { DocInfo } from '../doc/doc-info.js';\nimport { useNoticeSink } from '../forms/success-notices.js';\nimport { reasonText } from '../lib/reason-text.js';\nimport { Button } from '../primitives/button.js';\nimport { FormControlProvider, useFormControlOf } from '../resource/form-context.js';\nimport { ScreenTree } from '../screen/screen-tree.js';\nimport { selectImplementation, viewOf } from '../blocks/place-node.js';\nimport { ReviewDiff } from './review-diff.js';\nimport { OwnTitleContext } from '../ui-presentations/shell.js';\nimport { OwnTitleHeading, useFocusOnMount } from './overlay-heading.js';\n\n/**\n * Thrown from the form controller's write: the controller validated (and revealed the first\n * failing field), and the run — not the controller — sends. A write that throws leaves the form\n * dirty and its draft in place (the controller re-baselines only on a write that resolves), and\n * an abort-shaped value is no reportable failure.\n */\nconst HELD = Object.freeze({ name: 'AbortError', message: 'The flow run sends the values.' });\n\n/**\n * How the flow screen leaves its host (P6): an overlay dismisses its presentation instance, a\n * page navigates to the record through the guard, an inline placement shows the next form. The\n * screen asks `close()` for Cancel, ✕ and Back, and `finish()` once a success needs nothing more\n * shown (no `then.open: { block }`).\n * @internal\n */\nexport interface FlowHostBinding {\n readonly kind: 'overlay' | 'page' | 'inline';\n close(): void;\n finish(): void;\n}\n\n/** @internal Provided by the page and inline hosts; an overlay builds its own. */\n/** @internal */\nexport function HostedFlowScreen(\n props: FlowScreenProps & { readonly binding: FlowHostBinding },\n): ReactElement | null {\n const { binding, ...rest } = props;\n return (\n <FlowHostBindingContext.Provider value={binding}>\n <FlowScreen {...rest} />\n </FlowHostBindingContext.Provider>\n );\n}\n\nexport const FlowHostBindingContext = createContext<FlowHostBinding | null>(null);\n\n/** Gives the screen below it the overlay's binding: its presentation instance. */\nfunction OverlayBinding({ children }: { readonly children: ReactNode }): ReactElement {\n const instance = useUIInstance();\n const runtime = useUIPresentationRuntime();\n const binding = useMemo<FlowHostBinding>(\n () => ({\n kind: 'overlay',\n close: () => instance.dismiss(),\n finish: () => runtime.dismiss(instance.id),\n }),\n [instance, runtime],\n );\n return (\n <FlowHostBindingContext.Provider value={binding}>{children}</FlowHostBindingContext.Provider>\n );\n}\n\n/** The screen's binding when a page or inline host provided one, else the overlay's. */\nfunction WithBinding({ children }: { readonly children: ReactNode }): ReactElement {\n const provided = useContext(FlowHostBindingContext);\n return provided !== null ? <>{children}</> : <OverlayBinding>{children}</OverlayBinding>;\n}\n\ntype Translate = ReturnType<typeof useOptionalT>;\n\n/**\n * What the outcome area says, or `null` when the screen has nothing to report. A rejection reads\n * the specific text of its code first (spec 4.15 steps 1 to 4: the flow's `<textPrefix>.validation.<code>`\n * and declared `texts.validation`, the provider's reference, the shared code texts). Only when none\n * resolves does a mapped kind read the flow's own `<textPrefix>.rejected.<kind>`, then its declared\n * `texts.rejected.<kind>` (`flow`), before the framework's neutral `flow.rejected.<kind>`;\n * `textPrefix` is the compiled flow's `textKeys.prefix`.\n */\nfunction outcomeMessage(\n snapshot: FlowSnapshot,\n busy: boolean,\n t: Translate,\n caps: ErrorTextCaps,\n textPrefix: string,\n flow: { readonly texts?: unknown } | undefined,\n reasonOf: (reason: string) => string,\n): string | null {\n if (busy)\n return t('flow.busyElsewhere', { defaultValue: 'This action is running in another tab.' });\n const outcome = snapshot.outcome;\n if (outcome === undefined || outcome.outcome === 'success') {\n // A check that could not decide blocks the flow (4.3): its reason, with Retry.\n if (snapshot.control === 'disabled' && snapshot.reason !== undefined)\n return reasonOf(snapshot.reason);\n return null;\n }\n if (outcome.outcome === 'unknown')\n return [\n outcome.applied === 'partial'\n ? t('flow.unknownPartial', {\n defaultValue: 'Part of this may have been applied. Nothing was resent.',\n })\n : t('flow.unknown', {\n defaultValue: 'It may have been applied. Nothing was resent.',\n }),\n ...(snapshot.reason === undefined ? [] : [reasonOf(snapshot.reason)]),\n ].join(' ');\n if (outcome.outcome === 'rejected') {\n if (snapshot.reason !== undefined) return reasonOf(snapshot.reason);\n const kind = 'kind' in outcome ? outcome.kind : undefined;\n const code = 'code' in outcome ? outcome.code : undefined;\n if (code !== undefined) {\n const specific = specificErrorText(\n {\n code,\n ...('message' in outcome && outcome.message !== undefined\n ? { message: outcome.message }\n : {}),\n },\n caps,\n { action: { prefix: textPrefix, texts: flow?.texts } },\n );\n if (specific !== undefined) return specific;\n }\n const key = kind === undefined ? undefined : REJECTED_KEYS[kind];\n if (key !== undefined)\n return t(`${textPrefix}.rejected.${key}`, {\n defaultValue:\n textsValueAt(flow?.texts, ['rejected', key]) ??\n t(`flow.rejected.${key}`, { defaultValue: 'Nothing was saved.' }),\n });\n return t('flow.rejected.precondition', {\n defaultValue: 'The record changed. Nothing was sent.',\n });\n }\n if (outcome.outcome === 'failed') {\n if (snapshot.reason !== undefined) return reasonOf(snapshot.reason);\n // The code's own text first (spec 4.15), as the bulk summary and the record frame read it.\n const code = 'code' in outcome ? outcome.code : undefined;\n const specific =\n code === undefined\n ? undefined\n : specificErrorText(\n {\n code,\n ...('message' in outcome && outcome.message !== undefined\n ? { message: outcome.message }\n : {}),\n },\n caps,\n { action: { prefix: textPrefix, texts: flow?.texts } },\n );\n return (\n specific ??\n t('flow.failed', { defaultValue: 'The request could not be sent. Nothing was saved.' })\n );\n }\n return null;\n}\n\n/**\n * The UI kit's flow host screen (`presentationHosts.screens.flow`, presented under `buro:flow`;\n * P4 spec 4.15, 4.19): the action's label and the record's title with its «i» and ✕; the form\n * (a `steps` body is a wizard), the final screen's warnings and `confirm`, and the outcome\n * screens; a footer of Back, Cancel and the submit button, labelled with the action's label and\n * its pending text while the write runs.\n *\n * The presentation is a dismiss scope (P3-30): Escape, an outside click, ✕ and Cancel close\n * through it, so a dirty form asks first; Back between steps stays in the host and asks nothing.\n * From the send to the outcome the screen holds the scope's pending lock — nothing closes it,\n * and the run holds every route change. `success` closes the host without asking; `rejected`\n * and `failed` return to the dirty form; `unknown` closes without asking and keeps the attempt.\n */\nexport function FlowScreen(props: FlowScreenProps): ReactElement | null {\n if (props.run !== undefined && props.compiled !== undefined)\n return <HeldFlowScreen {...props} run={props.run} compiled={props.compiled} />;\n if (props.start !== undefined) return <OwnedFlowScreen {...props} start={props.start} />;\n return null;\n}\n\ntype HeldProps = FlowScreenProps & { readonly run: FlowRun; readonly compiled: CompiledFlow };\n\n/**\n * A bulk run's record frame (read-scope spec 4, rule 1): the form's `'context'` reads take the\n * value every selected row agrees on, else the session's. A run without a selection adds nothing.\n */\nfunction SelectionScope(props: {\n readonly selection: FlowScreenProps['selection'];\n readonly resource: string | null;\n readonly children: ReactNode;\n}): ReactElement {\n if (props.selection === undefined || props.resource === null) return <>{props.children}</>;\n return (\n <BulkSelectionScope resource={props.resource} ids={props.selection.ids}>\n {props.children}\n </BulkSelectionScope>\n );\n}\n\n/** The screen over a run it is given. */\nfunction HeldFlowScreen(props: HeldProps): ReactElement {\n // \"I've checked — start over\" (4.8) opens a fresh form: the body mounts again, so the form\n // takes the run's fresh values as its baseline and offers the stored draft.\n const [generation, setGeneration] = useState(0);\n // An app flow's form reads its texts in its `common.appActions.<name>` entry.\n return (\n <FlowTextsScope compiled={props.compiled}>\n <WithBinding>\n <ScreenStateProvider key={generation}>\n <SelectionScope selection={props.selection} resource={props.compiled.resource}>\n <FlowScreenBody {...props} onFreshForm={() => setGeneration((value) => value + 1)} />\n </SelectionScope>\n </ScreenStateProvider>\n </WithBinding>\n </FlowTextsScope>\n );\n}\n\n/**\n * The host owning its run (P4-C review I1): the run lives as long as the host, not as long as\n * the control that opened it — a row that left the page, a menu item that closed — so a dirty\n * form still asks before it closes and a pending write still holds its lock. `then` waits until\n * the host has gone (its form and its blocker with it), then runs through the opener's\n * dispatcher scope; each outcome is reported to the opener.\n */\nfunction OwnedFlowScreen(props: FlowScreenProps & { readonly start: FlowStart }): ReactElement {\n const { start, effects, onSettle } = props;\n const flow = useFlowRun(start.target, {\n ...(start.record === undefined ? {} : { record: start.record }),\n ...(start.args === undefined ? {} : { args: start.args }),\n ...(start.selection === undefined ? {} : { selection: start.selection }),\n surface: 'host',\n ...(effects === undefined ? {} : { thenEffects: effects }),\n });\n // `then` is the host's to run, after it closed.\n flow.holdThen(true);\n const latest = useRef(flow);\n latest.current = flow;\n useEffect(\n () => () => {\n // After the commit that removed the host: its form's blocker is gone.\n setTimeout(() => {\n latest.current.holdThen(false);\n latest.current.runThen();\n }, 0);\n },\n [],\n );\n const { run, snapshot, compiled } = flow;\n const outcome = snapshot.outcome;\n useEffect(() => {\n if (outcome !== undefined) onSettle?.(outcome);\n }, [outcome, onSettle]);\n const instance = useUIInstance();\n const t = useOptionalT();\n const caps = useI18nCaps(compiled?.resource ?? undefined);\n const tid = useTestIds();\n const opened =\n run !== null &&\n compiled !== null &&\n (snapshot.history.includes('open') || snapshot.step === 'outcome');\n if (opened) return <HeldFlowScreen {...props} run={run} compiled={compiled} />;\n // Not opened yet: its gate, its sources and a stored attempt decide first. A run that\n // decided against opening says why.\n const refused = snapshot.control === 'disabled' || snapshot.control === 'absent';\n return (\n <div\n data-testid={compiled === null ? undefined : `${tid.flowHost(compiled.flowId)}:opening`}\n data-buro-host={props.host}\n data-buro-flow-step={refused ? 'refused' : 'opening'}\n aria-busy={refused ? undefined : 'true'}\n className=\"flex min-h-0 flex-1 flex-col gap-4\"\n >\n <OwnTitleHeading label={props.label} />\n {refused ? (\n <p role=\"alert\" className=\"text-sm\">\n {snapshot.reason === undefined\n ? t('flow.unavailable', { defaultValue: 'Not allowed.' })\n : reasonText(caps, snapshot.reason, compiled?.resource ?? undefined)}\n </p>\n ) : (\n <IconLoader2 className=\"h-5 w-5 animate-spin self-center\" aria-hidden=\"true\" />\n )}\n <div className=\"flex justify-end\">\n <Button type=\"button\" variant=\"ghost\" onClick={() => instance.dismiss()}>\n {t('flow.close', { defaultValue: 'Close' })}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction FlowScreenBody({\n run,\n host,\n label,\n title: givenTitle,\n compiled,\n record: givenRecord,\n args,\n selection,\n onFreshForm,\n}: HeldProps & { readonly onFreshForm: () => void }): ReactElement {\n // A collection-level flow has no record, whoever passed one (spec 5.1): its title, its form and\n // its review read none.\n const record = flowRecordOf(compiled, givenRecord);\n const snapshot = useSyncSnapshot(run);\n const binding = useContext(FlowHostBindingContext) as FlowHostBinding;\n const tid = useTestIds();\n const t = useOptionalT();\n const chromeT = useChromeT();\n const resource = compiled.resource ?? undefined;\n const caps = useI18nCaps(resource);\n const ownTitle = useContext(OwnTitleContext);\n const flowId = compiled.flowId;\n const recordId = record?.[compiled.idField] ?? record?.id;\n const recordTitle = useProjectedTitle(resource, recordId, record);\n const title =\n givenTitle ?? (record === undefined || recordTitle === '' ? undefined : recordTitle);\n const form = useFlowForm(run, compiled, snapshot, {\n ...(record === undefined ? {} : { record }),\n ...(args === undefined ? {} : { args }),\n ...(selection === undefined ? {} : { selection: selection.ids }),\n });\n const formControl = useFormControlOf(form);\n const hasForm = compiled.flow.form !== undefined;\n const [busy, setBusy] = useState(false);\n // The values the form opened on: the review's baseline (4.4). The host opens on an opened run,\n // before anything was typed.\n const [initial] = useState(() => run.getSnapshot().values);\n // Form-level messages: a server's validation refusal on a key no field holds (M14), a\n // resource-level validator's.\n const formErrors = form.errors.filter((issue) => issue.field === '_form');\n\n // The pending lock (4.19): from the re-read to the persisted outcome nothing closes the host.\n const locked = snapshot.control === 'running';\n useDismissPending(locked);\n\n const outcome = snapshot.outcome?.outcome;\n const unknown = outcome === 'unknown';\n const succeeded = outcome === 'success';\n const finalStep = snapshot.step === 'review' || snapshot.step === 'accept';\n\n // `success` closes the host, unasked: nothing unsaved remains (4.19). The run settled the\n // mutation's effects before it answered (4.13).\n // `then.open: { block, props }` keeps the host and draws the block instead (4.13): its close is\n // the block's own button and ✕, and `result` goes with the host.\n const openBlock = succeeded ? blockOpen(snapshot.effects?.open) : null;\n // The write's own notices (spec 4.7), once per success, before the host closes.\n const showNotices = useNoticeSink(resource);\n const shownNotices = useRef<unknown>(null);\n useEffect(() => {\n if (!succeeded || snapshot.notices.length === 0 || shownNotices.current === snapshot.notices)\n return;\n shownNotices.current = snapshot.notices;\n showNotices(snapshot.notices);\n }, [succeeded, snapshot.notices, showNotices]);\n useEffect(() => {\n if (succeeded && !locked && openBlock === null) binding.finish();\n }, [succeeded, locked, openBlock, binding]);\n\n const prefix =\n compiled.resource === null\n ? `appActions.${compiled.name}`\n : `${compiled.resource}.actions.${compiled.name}`;\n\n const settle = (result: FlowResult) => {\n setBusy(result.outcome === 'failed' && 'reason' in result && result.reason === 'busy');\n };\n const submit = async () => {\n if (locked) return;\n setBusy(false);\n if (finalStep) {\n settle(await run.accept());\n return;\n }\n if (unknown && editingNew) {\n // Send as new: the form as filled now, validated, then the confirmation (P4-C review C2).\n let valid = false;\n await form.handleSubmit(() => {\n valid = true;\n throw HELD;\n })();\n if (valid) setConfirmingNew(true);\n return;\n }\n if (unknown) return;\n if (hasForm) {\n // The controller validates the active fields and reveals the first failing one (its step\n // included); the run sends.\n let validated = false;\n await form.handleSubmit(() => {\n validated = true;\n throw HELD;\n })();\n if (!validated) return;\n }\n settle(await run.submit());\n };\n\n const pendingKey =\n compiled.resource === null\n ? `appActions.${compiled.name}.pending`\n : `resources.${compiled.resource}.actions.${compiled.name}.pending`;\n const pendingLabel = caps.has(pendingKey) ? caps.t(pendingKey) : `${label}…`;\n const message = outcomeMessage(\n snapshot,\n busy,\n t,\n caps,\n compiled.textKeys.prefix,\n compiled.flow,\n (reason) => reasonText(caps, reason, resource),\n );\n // The form-level issues, resolved here so a language switch re-renders them; one that says\n // what the outcome heading already says is not shown twice.\n const formErrorTexts = formErrors\n .map((issue) =>\n resolveValidationMessage(\n {\n code: issue.code ?? '',\n message: issue.message,\n ...(issue.check === undefined ? {} : { check: issue.check }),\n },\n { has: caps.has, t: caps.t },\n ),\n )\n .filter((text) => text !== message);\n // The flow's own word for its cancel buttons (`<prefix>.dismiss`, then its declared\n // `texts.dismiss`), else the kit's.\n const dismissKey = `${compiled.textKeys.prefix}.dismiss`;\n const cancelWord =\n (caps.has(dismissKey) ? caps.t(dismissKey) : undefined) ??\n declaredText('flow', compiled.flow, 'dismiss') ??\n chromeT('actions.cancel', { defaultValue: 'Cancel' });\n // The run flags a check that could not decide; its reason is a translation, never compared.\n const couldNotCheck = snapshot.control === 'disabled' && snapshot.unverified === true;\n const steps = form.steps;\n const lastStep =\n steps === null || steps.ids.length === 0 || steps.current === steps.ids[steps.ids.length - 1];\n const showSubmit = !unknown && !succeeded && (!hasForm || finalStep || lastStep);\n // The unknown screen's exits (4.8).\n const [confirmingNew, setConfirmingNew] = useState(false);\n // Send as new sends the form as it is now (4.8): the user fills it again and it is validated\n // first — after a reload it holds only its initial values (P4-C review C2).\n const [editingNew, setEditingNew] = useState(false);\n const checkable = compiled.flow.submit.onUnknown !== undefined;\n const unhandled = unknown && !checkable && !snapshot.canResend;\n const exit = (action: () => Promise<FlowResult>) => () => {\n if (!locked) void action().then(settle);\n };\n // An overlay's Cancel keeps the draft so it survives the close (4.19); an inline Reset means\n // \"start over\", so the next form must not offer the input it just threw away (REF-51). An\n // unknown outcome's Close keeps it, like every unresolved attempt (4.11).\n const close = () => {\n if (binding.kind === 'inline' && hasForm && !unknown) form.draft.discard();\n binding.close();\n };\n\n const headingRef = useRef<HTMLHeadingElement>(null);\n useFocusOnMount(headingRef);\n const heading = (\n <h2\n ref={headingRef}\n tabIndex={-1}\n data-buro-overlay-heading=\"\"\n className=\"min-w-0 flex-1 break-words text-lg font-semibold tracking-tight focus-visible:outline-hidden\"\n >\n {label}\n {title === undefined ? null : (\n <span className=\"ml-2 font-normal text-muted-foreground\">{title}</span>\n )}\n </h2>\n );\n\n return (\n <div\n data-testid={tid.flowHost(flowId)}\n data-buro-host={host}\n data-buro-flow-step={snapshot.step}\n aria-busy={locked ? 'true' : undefined}\n className=\"flex min-h-0 flex-1 flex-col gap-4\"\n >\n {binding.kind === 'inline' ? null : (\n <div data-buro-region=\"flow-header\" className=\"flex items-center gap-2 pr-1\">\n {ownTitle ? <DialogPrimitive.Title asChild>{heading}</DialogPrimitive.Title> : heading}\n {compiled.resource === null ? null : (\n <DocInfo\n address={`${compiled.resource}/actions/${compiled.name}`}\n name={label}\n testId={`${tid.flowHost(flowId)}:info`}\n />\n )}\n {binding.kind === 'overlay' ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n data-testid={tid.flowClose(flowId)}\n aria-label={t('flow.close', { defaultValue: 'Close' })}\n onClick={close}\n >\n <IconX className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n ) : null}\n </div>\n )}\n {openBlock !== null ? (\n <FlowOpenBlock open={openBlock} prefix={prefix} testid={tid.flowHost(flowId)} />\n ) : null}\n {openBlock !== null && binding.kind !== 'overlay' ? (\n <div className=\"flex justify-end\">\n <Button\n type=\"button\"\n variant=\"outline\"\n data-testid={tid.flowClose(flowId)}\n onClick={close}\n >\n {t('flow.done', { defaultValue: 'Done' })}\n </Button>\n </div>\n ) : null}\n <form\n hidden={openBlock !== null}\n noValidate\n className={openBlock === null ? 'flex min-h-0 flex-1 flex-col gap-4' : 'hidden'}\n onSubmit={(event) => {\n event.preventDefault();\n void submit();\n }}\n >\n <div className=\"-mx-1 flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-1\">\n {message === null ? null : (\n <div\n role={unknown || outcome === 'rejected' || outcome === 'failed' ? 'alert' : 'status'}\n data-testid={tid.flowOutcome(flowId)}\n data-buro-flow-outcome={busy ? 'busy' : (outcome ?? snapshot.control)}\n className=\"flex flex-wrap items-center gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive\"\n >\n <span>{message}</span>\n {couldNotCheck ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"ml-auto\"\n onClick={() => run.retryChecks()}\n >\n {chromeT('actions.retry', { defaultValue: 'Retry' })}\n </Button>\n ) : null}\n </div>\n )}\n {hasForm && form.draft.pending !== null && (!unknown || editingNew) ? (\n <div\n data-testid={tid.flowDraft(flowId)}\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex flex-wrap items-center gap-2 rounded-md border border-warning/50 bg-warning/10 px-3 py-2 text-sm\"\n >\n <span className=\"font-medium\">\n {t('draft.restorePrompt', { defaultValue: 'Restore draft?' })}\n </span>\n <div className=\"ml-auto flex gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n data-testid={`${tid.flowDraft(flowId)}:restore`}\n onClick={form.draft.restore}\n >\n {t('draft.restore', { defaultValue: 'Restore' })}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n data-testid={`${tid.flowDraft(flowId)}:discard`}\n onClick={form.draft.discard}\n >\n {t('draft.discard', { defaultValue: 'Discard' })}\n </Button>\n </div>\n </div>\n ) : null}\n {formErrorTexts.length > 0 ? (\n <div\n role=\"alert\"\n data-testid={`${tid.flowHost(flowId)}:form-errors`}\n className=\"flex flex-col gap-1 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive\"\n >\n {formErrorTexts.map((text, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: one failed write's fixed list\n <p key={index}>{text}</p>\n ))}\n </div>\n ) : null}\n {finalStep && compiled.flow.review === true ? (\n <ReviewDiff\n form={form}\n initial={initial}\n values={snapshot.values}\n i18nPrefix={prefix}\n testid={tid.flowHost(flowId)}\n />\n ) : finalStep && Array.isArray(compiled.flow.review) ? (\n <ReviewTree\n compiled={compiled}\n tree={compiled.flow.review}\n values={snapshot.values}\n prefix={prefix}\n run={run}\n {...(record === undefined ? {} : { record })}\n {...(args === undefined ? {} : { args })}\n />\n ) : hasForm ? (\n <FormControlProvider value={formControl}>\n <ScreenTree\n region=\"form-body\"\n resource={prefix}\n mode=\"create\"\n compiled={form.screen}\n controller={form}\n // The record scheme: the leaves carry `form-field-input:<prefix>:create:<name>`\n // test ids, and their texts key as `resources.<prefix>.fields.<name>.…` (4.4).\n leafIds=\"record\"\n disabled={locked || (unknown && !editingNew) || finalStep || succeeded}\n />\n </FormControlProvider>\n ) : null}\n {finalStep && snapshot.warnings.length > 0 ? (\n <ul\n role=\"status\"\n data-buro-region=\"flow-warnings\"\n className=\"flex flex-col gap-1 rounded-md border border-warning/50 bg-warning/10 px-3 py-2 text-sm text-warning-emphasis\"\n >\n {snapshot.warnings.map((warning) => (\n <li key={warning.id} data-testid={`${tid.flowHost(flowId)}:warning:${warning.id}`}>\n {warning.message}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n {unhandled ? (\n <p data-testid={`${tid.flowOutcome(flowId)}:unhandled`} className=\"text-sm\">\n {t('flow.unknownUnhandled', { defaultValue: 'Check the record before trying again.' })}\n </p>\n ) : null}\n {unknown && confirmingNew ? (\n <div\n role=\"alertdialog\"\n aria-label={t('flow.sendAsNew', { defaultValue: 'Send as new' })}\n data-testid={`${tid.flowSendAsNew(flowId)}:confirm`}\n className=\"flex flex-wrap items-center gap-2 rounded-md border border-warning/50 bg-warning/10 px-3 py-2 text-sm\"\n >\n <span>\n {t('flow.sendAsNewConfirm', {\n defaultValue: 'This may apply the change twice. Send it as a new request?',\n })}\n </span>\n <div className=\"ml-auto flex gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n data-testid={`${tid.flowSendAsNew(flowId)}:cancel`}\n onClick={() => setConfirmingNew(false)}\n >\n {cancelWord}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"destructive\"\n data-testid={`${tid.flowSendAsNew(flowId)}:ok`}\n onClick={() => {\n setConfirmingNew(false);\n exit(() => run.sendAsNew({ confirmed: true }))();\n }}\n >\n {t('flow.sendAsNew', { defaultValue: 'Send as new' })}\n </Button>\n </div>\n </div>\n ) : null}\n {unknown ? (\n <div data-buro-region=\"flow-unknown-exits\" className=\"flex flex-wrap gap-2\">\n {checkable ? (\n <Button\n type=\"button\"\n variant=\"default\"\n data-testid={tid.flowCheckAgain(flowId)}\n disabled={locked}\n onClick={exit(() => run.checkAgain())}\n >\n {t('flow.checkAgain', { defaultValue: 'Check again' })}\n </Button>\n ) : null}\n {snapshot.canResend ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n data-testid={tid.flowResend(flowId)}\n disabled={locked}\n onClick={exit(() => run.resend())}\n >\n {t('flow.resend', { defaultValue: 'Resend' })}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"outline\"\n data-testid={tid.flowSendAsNew(flowId)}\n disabled={locked || confirmingNew || editingNew}\n onClick={() => {\n if (hasForm) setEditingNew(true);\n else setConfirmingNew(true);\n }}\n >\n {t('flow.sendAsNew', { defaultValue: 'Send as new' })}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n data-testid={tid.flowStartOver(flowId)}\n disabled={locked}\n onClick={() => {\n run.startOver();\n onFreshForm();\n }}\n >\n {t('flow.startOver', { defaultValue: \"I've checked — start over\" })}\n </Button>\n </div>\n ) : null}\n <div data-buro-region=\"flow-footer\" className=\"flex flex-wrap items-center gap-2\">\n {finalStep && hasForm && !locked ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n data-testid={tid.flowBack(flowId)}\n onClick={() => run.back()}\n >\n {t('flow.back', { defaultValue: 'Back' })}\n </Button>\n ) : null}\n <div className=\"ml-auto flex gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n data-testid={tid.flowCancel(flowId)}\n disabled={locked}\n onClick={close}\n >\n {unknown\n ? t('flow.close', { defaultValue: 'Close' })\n : binding.kind === 'inline'\n ? t('flow.reset', { defaultValue: 'Reset' })\n : cancelWord}\n </Button>\n {unknown && editingNew ? (\n <Button\n type=\"submit\"\n variant=\"destructive\"\n data-testid={`${tid.flowSendAsNew(flowId)}:submit`}\n disabled={locked || confirmingNew}\n onMouseDown={(event) => event.preventDefault()}\n >\n {t('flow.sendAsNew', { defaultValue: 'Send as new' })}\n </Button>\n ) : null}\n {showSubmit ? (\n <Button\n type=\"submit\"\n variant={compiled.flow.variant === 'destructive' ? 'destructive' : 'default'}\n data-testid={tid.flowSubmit(flowId)}\n disabled={locked || couldNotCheck}\n aria-busy={locked ? 'true' : undefined}\n // Without this, focusing out of a field a blur error just inserted moves the\n // button, and the click that lands on its old position is swallowed.\n onMouseDown={(event) => event.preventDefault()}\n >\n {locked ? (\n <IconLoader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n ) : null}\n {locked ? pendingLabel : label}\n </Button>\n ) : null}\n </div>\n </div>\n </form>\n </div>\n );\n}\n\n/** The run's snapshot, re-rendering on each change. */\nfunction useSyncSnapshot(run: FlowRun): FlowSnapshot {\n return useSyncExternalStore(run.subscribe, run.getSnapshot, run.getSnapshot);\n}\n\nconst NO_FIELDS = Object.freeze({});\n\n/**\n * `review: (l) => [...]` (4.4): a show tree over the flow's values — displays and placements\n * only, no inputs — drawn by a show-mode form over the flow's fields.\n */\nfunction ReviewTree({\n compiled,\n tree,\n values,\n prefix,\n run,\n record,\n args,\n}: {\n readonly compiled: CompiledFlow;\n readonly tree: readonly unknown[];\n readonly values: Readonly<Record<string, unknown>>;\n readonly prefix: string;\n readonly run: FlowRun;\n readonly record?: Row;\n readonly args?: Row;\n}): ReactElement {\n const fields = compiled.flow.form?.fields;\n // A review places what it shows: a field the tree does not place leaves the show mode (its\n // `in`), so a review of blocks alone (spec 3.6) is not refused for the fields it leaves out.\n const map = useState(() => {\n if (fields === undefined) return NO_FIELDS;\n const placed = placedLeaves(tree);\n return fieldEntriesToMap(\n (fields as readonly Readonly<Record<string, unknown>>[]).map((field) =>\n placed.has(String(field.name)) ? field : { ...field, in: ['create'] },\n ) as never,\n );\n })[0];\n const body = useState(() => () => tree as never)[0];\n // The app's blocks: a review tree places them (P4-D, spec 3.6's `l.place(offeringReview)`).\n const blocks = useFlowFormCatalog();\n // The run's record and args, like the form step reads them (G35): the controller honours meta\n // sources only under the run's claim, so the review carries the run and its form id. Compiled\n // as a review, the tree's `values` stay the form's values while `record` is the run's.\n const metaSources = useFlowMetaSources(record, args, compiled.resource);\n // The form's `fieldConditions` (REF-132 §4.8): the review plans its fields as the form did, so a\n // field a callback removed from the form is not shown here either.\n const fieldConditions = useFlowFieldConditions(compiled);\n const review = useFormController({\n blocks,\n flowRun: run,\n formId: compiled.formId,\n metaSources,\n ...(fieldConditions === undefined ? {} : { flowFieldConditions: fieldConditions }),\n review: true,\n fields: map as never,\n body,\n mode: 'show',\n i18nPrefix: prefix,\n value: values as never,\n });\n return (\n <ScreenTree\n region=\"form-body\"\n resource={prefix}\n mode=\"show\"\n compiled={review.screen}\n controller={review}\n leafIds=\"record\"\n />\n );\n}\n\n/** The field names a tree places as leaves (a string child of any node). */\nfunction placedLeaves(tree: readonly unknown[]): ReadonlySet<string> {\n const out = new Set<string>();\n const walk = (node: unknown): void => {\n if (typeof node === 'string') {\n out.add(node);\n return;\n }\n if (node === null || typeof node !== 'object') return;\n const children = (node as { readonly children?: unknown }).children;\n if (Array.isArray(children)) for (const child of children) walk(child);\n };\n for (const node of tree) walk(node);\n return out;\n}\n\n/** A `then.open` block target, once resolved (`{ block, props }`); `null` for anything else. */\nfunction blockOpen(open: unknown): { readonly block: EntityRefLike; readonly props: Row } | null {\n if (open === null || typeof open !== 'object' || !Object.hasOwn(open, 'block')) return null;\n const { block, props } = open as { readonly block?: unknown; readonly props?: unknown };\n const ref =\n block !== null && typeof block === 'object' && 'ref' in block\n ? (block as { readonly ref: unknown }).ref\n : block;\n if (\n ref === null ||\n typeof ref !== 'object' ||\n typeof (ref as EntityRefLike).namespace !== 'string' ||\n typeof (ref as EntityRefLike).id !== 'string'\n )\n return null;\n return {\n block: ref as EntityRefLike,\n props: props !== null && typeof props === 'object' ? (props as Row) : {},\n };\n}\n\ninterface EntityRefLike {\n readonly namespace: string;\n readonly id: string;\n}\ntype Row = Readonly<Record<string, unknown>>;\n\n/**\n * The block `then.open` names, drawn in the host after success (4.13): its implementation from\n * the mounted catalog (an app's over the kit's), its props validated against the block's schemas\n * at mount (P1b+P1c decision 35); a failed validation, or a block nothing implements, says so.\n */\nfunction FlowOpenBlock({\n open,\n testid,\n}: {\n readonly open: { readonly block: EntityRefLike; readonly props: Row };\n readonly prefix: string;\n readonly testid: string;\n}): ReactElement {\n const t = useOptionalT();\n const id = `${open.block.namespace}:${open.block.id}`;\n const implementation = selectImplementation(id, useFlowOpenImplementation(id) as never);\n const [validation, setValidation] = useState<PropValidation | null>(() =>\n implementation === undefined\n ? null\n : validatePlacementProps(implementation.definition as never, open.props),\n );\n useEffect(() => {\n if (validation?.status !== 'pending') return;\n let live = true;\n void validation.settled.then((settled) => {\n if (live) setValidation(settled);\n });\n return () => {\n live = false;\n };\n }, [validation]);\n const failed = implementation === undefined || validation?.status === 'failed';\n const View = implementation === undefined ? null : viewOf(implementation);\n return (\n <div\n data-testid={`${testid}:open`}\n data-buro-block={id}\n className=\"min-h-0 flex-1 overflow-y-auto\"\n >\n {failed ? (\n <p role=\"alert\" className=\"text-sm text-muted-foreground\">\n {t('block.notImplemented', { defaultValue: 'This section is not available.' })}\n </p>\n ) : View === null || validation?.status !== 'ready' ? null : (\n <Suspense fallback={null}>\n <View\n props={validation.props as never}\n data={NO_FIELDS as never}\n t={(key, options) =>\n t(`blocks.${id}.${key}`, {\n ...(options?.params === undefined ? {} : { params: options.params }),\n ...(options?.count === undefined ? {} : { count: options.count }),\n })\n }\n />\n </Suspense>\n )}\n </div>\n );\n}\n"],"mappings":"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"}