@ai-matrx/detail 0.1.176 → 0.1.178

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.cjs CHANGED
@@ -4,6 +4,14 @@ var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __esm = (fn, res, err) => function __init() {
8
+ if (err) throw err[0];
9
+ try {
10
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ } catch (e) {
12
+ throw err = [e], e;
13
+ }
14
+ };
7
15
  var __export = (target, all) => {
8
16
  for (var name in all)
9
17
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -18,6 +26,30 @@ var __copyProps = (to, from, except, desc) => {
18
26
  };
19
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
28
 
29
+ // src/react/DetailLinked.tsx
30
+ var DetailLinked_exports = {};
31
+ __export(DetailLinked_exports, {
32
+ default: () => DetailLinked
33
+ });
34
+ function DetailLinked({ token, id, label, wanted, heading }) {
35
+ const tokens = wanted.filter(import_contracts.isEntityTypeToken);
36
+ if (tokens.length === 0) return null;
37
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": "associations", children: [
38
+ heading,
39
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react9.PrimaryEntityProvider, { value: { type: token, id, label }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react9.AssociationCardGrid, { tokens }) })
40
+ ] });
41
+ }
42
+ var import_contracts, import_react9, import_jsx_runtime4;
43
+ var init_DetailLinked = __esm({
44
+ "src/react/DetailLinked.tsx"() {
45
+ "use strict";
46
+ "use client";
47
+ import_contracts = require("@ai-matrx/associations/contracts");
48
+ import_react9 = require("@ai-matrx/associations/react");
49
+ import_jsx_runtime4 = require("react/jsx-runtime");
50
+ }
51
+ });
52
+
21
53
  // src/react/index.ts
22
54
  var react_exports = {};
23
55
  __export(react_exports, {
@@ -466,9 +498,7 @@ function useDetailCore(data, presentation, options) {
466
498
  onNext: hasNext ? () => openNeighbour(1) : null,
467
499
  // 🚨 NEW-22 — Cmd+Enter is one of the three promised bindings; on a record
468
500
  // with no editor open it ANSWERS rather than doing nothing in silence.
469
- onSaveUnavailable: () => host.notify.error(
470
- `There is nothing to save on this ${typeLabel.toLowerCase()} \u2014 nothing here is being edited. Changes to the record are made where it lives.`
471
- )
501
+ onSaveUnavailable: () => host.notify.error("Nothing to save", { description: `Edit this ${typeLabel.toLowerCase()} where it lives` })
472
502
  });
473
503
  return {
474
504
  ref,
@@ -532,9 +562,7 @@ function useOpenDetail(warmType) {
532
562
  } catch (error) {
533
563
  const message = error instanceof Error ? error.message : String(error);
534
564
  console.error(`[detail] ${DETAIL_PRESENTATION_KNOB} could not be resolved`, error);
535
- host.notify.error(
536
- `Your detail presentation setting could not be read (${DETAIL_PRESENTATION_KNOB}: ${message}). Opening as a window until it can be read; an administrator can register or repair the setting.`
537
- );
565
+ host.notify.error("Opened as a window", { description: "Detail setting couldn't be read" });
538
566
  presentation = "window";
539
567
  }
540
568
  }
@@ -654,7 +682,7 @@ function useDetailMenuActions(core) {
654
682
  onSelect: () => {
655
683
  void host.copyText(core.ref.id).then((ok) => {
656
684
  if (ok) host.notify.success("Record id copied");
657
- else host.notify.error("Could not copy the record id to the clipboard.");
685
+ else host.notify.error("Record id not copied");
658
686
  });
659
687
  }
660
688
  }
@@ -667,7 +695,7 @@ function DetailActions({ core, optional = "inline" }) {
667
695
  const copyId = async () => {
668
696
  const ok = await host.copyText(core.ref.id);
669
697
  if (!ok) {
670
- host.notify.error("Could not copy the record id to the clipboard.");
698
+ host.notify.error("Record id not copied");
671
699
  return;
672
700
  }
673
701
  host.notify.success("Record id copied");
@@ -811,10 +839,9 @@ function DetailActions({ core, optional = "inline" }) {
811
839
  }
812
840
 
813
841
  // src/react/DetailBody.tsx
814
- var import_react9 = require("react");
842
+ var import_react10 = require("react");
815
843
  var import_design_system3 = require("@ai-matrx/design-system");
816
- var import_associations = require("@ai-matrx/associations");
817
- var import_react10 = require("@ai-matrx/associations/react");
844
+ var import_contracts2 = require("@ai-matrx/associations/contracts");
818
845
  var import_format = require("@ai-matrx/kit/format");
819
846
 
820
847
  // src/format.ts
@@ -861,9 +888,9 @@ function DetailPresentationPane({ core }) {
861
888
  });
862
889
  if (result.ok) {
863
890
  setState({ status: "saved" });
864
- host.notify.success(
865
- forThisType ? `Every ${core.typeLabel.toLowerCase()} now opens as ${WORD[pending]} for you.` : `Record details now open as ${WORD[pending]} for you.`
866
- );
891
+ host.notify.success("Saved", {
892
+ description: forThisType ? `Every ${core.typeLabel.toLowerCase()} opens as ${WORD[pending]}` : `Details open as ${WORD[pending]}`
893
+ });
867
894
  } else {
868
895
  setState({ status: "refused", reason: result.reason });
869
896
  }
@@ -1025,11 +1052,12 @@ function DetailPresentationPane({ core }) {
1025
1052
  // src/react/DetailBody.tsx
1026
1053
  var import_icons7 = require("@ai-matrx/design-system/icons");
1027
1054
  var import_outbound_react = require("@ai-matrx/kit/outbound-react");
1028
- var import_jsx_runtime4 = require("react/jsx-runtime");
1055
+ var import_error_sentence = require("@ai-matrx/design-system/error-sentence");
1056
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1029
1057
  var SLOW_LOAD_NOTICE_MS = 6e3;
1030
1058
  function useSlowLoadNotice(active, key) {
1031
- const [slow, setSlow] = (0, import_react9.useState)(false);
1032
- (0, import_react9.useEffect)(() => {
1059
+ const [slow, setSlow] = (0, import_react10.useState)(false);
1060
+ (0, import_react10.useEffect)(() => {
1033
1061
  if (!active) {
1034
1062
  setSlow(false);
1035
1063
  return void 0;
@@ -1041,7 +1069,7 @@ function useSlowLoadNotice(active, key) {
1041
1069
  return slow;
1042
1070
  }
1043
1071
  function SectionHeading({ icon, children }) {
1044
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("h3", { className: "flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: [
1072
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("h3", { className: "flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: [
1045
1073
  icon,
1046
1074
  children
1047
1075
  ] });
@@ -1050,8 +1078,8 @@ function Notice({
1050
1078
  tone,
1051
1079
  children
1052
1080
  }) {
1053
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex flex-col items-center gap-2 py-8 text-center", children: [
1054
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1081
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex flex-col items-center gap-2 py-8 text-center", children: [
1082
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1055
1083
  AlertCircleIcon,
1056
1084
  {
1057
1085
  className: (0, import_design_system3.cn)(
@@ -1062,7 +1090,7 @@ function Notice({
1062
1090
  )
1063
1091
  }
1064
1092
  ),
1065
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "max-w-prose text-sm text-muted-foreground", children })
1093
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "max-w-prose text-sm text-muted-foreground", children })
1066
1094
  ] });
1067
1095
  }
1068
1096
  var GRANT_WORD = {
@@ -1083,7 +1111,7 @@ function deriveOpenAtSourceLabel(source) {
1083
1111
  }
1084
1112
  function HealthStrip({ health }) {
1085
1113
  const ok = health.grant === "ok";
1086
- const [refreshing, setRefreshing] = (0, import_react9.useState)(false);
1114
+ const [refreshing, setRefreshing] = (0, import_react10.useState)(false);
1087
1115
  const host = useDetailHost();
1088
1116
  const refresh = async () => {
1089
1117
  if (!health.onRefresh) return;
@@ -1091,14 +1119,12 @@ function HealthStrip({ health }) {
1091
1119
  try {
1092
1120
  await health.onRefresh();
1093
1121
  } catch (error) {
1094
- host.notify.error(
1095
- `Refresh from ${health.source} failed: ${error instanceof Error ? error.message : String(error)}`
1096
- );
1122
+ host.notify.error("Not refreshed", { description: `${health.source}: ${(0, import_error_sentence.peopleErrorSentence)(error, null, { card: true })}` });
1097
1123
  } finally {
1098
1124
  setRefreshing(false);
1099
1125
  }
1100
1126
  };
1101
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1127
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1102
1128
  "div",
1103
1129
  {
1104
1130
  className: (0, import_design_system3.cn)(
@@ -1107,9 +1133,9 @@ function HealthStrip({ health }) {
1107
1133
  ),
1108
1134
  "data-detail-health": true,
1109
1135
  children: [
1110
- ok ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ShieldCheckIcon, { className: "h-3.5 w-3.5 text-primary" }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ShieldAlertIcon, { className: "h-3.5 w-3.5 text-destructive" }),
1111
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "font-medium", children: health.source }),
1112
- ok ? null : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1136
+ ok ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ShieldCheckIcon, { className: "h-3.5 w-3.5 text-primary" }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ShieldAlertIcon, { className: "h-3.5 w-3.5 text-destructive" }),
1137
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "font-medium", children: health.source }),
1138
+ ok ? null : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1113
1139
  "span",
1114
1140
  {
1115
1141
  className: "rounded bg-destructive/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-destructive",
@@ -1117,13 +1143,13 @@ function HealthStrip({ health }) {
1117
1143
  children: GRANT_WORD[health.grant]
1118
1144
  }
1119
1145
  ),
1120
- health.lastRefreshedAt ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { children: [
1146
+ health.lastRefreshedAt ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
1121
1147
  "Refreshed ",
1122
1148
  formatWhen(health.lastRefreshedAt)
1123
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Never refreshed" }),
1124
- health.grantDetail ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: health.grantDetail }) : null,
1125
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "ml-auto flex items-center gap-1", children: [
1126
- health.onRefresh ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1149
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: "Never refreshed" }),
1150
+ health.grantDetail ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: health.grantDetail }) : null,
1151
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ml-auto flex items-center gap-1", children: [
1152
+ health.onRefresh ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1127
1153
  "button",
1128
1154
  {
1129
1155
  type: "button",
@@ -1131,12 +1157,12 @@ function HealthStrip({ health }) {
1131
1157
  disabled: refreshing,
1132
1158
  className: "inline-flex h-6 items-center gap-1 rounded px-1.5 hover:bg-accent hover:text-foreground disabled:opacity-50 pointer-coarse:h-10",
1133
1159
  children: [
1134
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons7.RefreshCwIcon, { className: (0, import_design_system3.cn)("h-3 w-3", refreshing && "animate-spin") }),
1160
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons7.RefreshCwIcon, { className: (0, import_design_system3.cn)("h-3 w-3", refreshing && "animate-spin") }),
1135
1161
  "Refresh"
1136
1162
  ]
1137
1163
  }
1138
1164
  ) : null,
1139
- !ok && health.onReconnect ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1165
+ !ok && health.onReconnect ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1140
1166
  "button",
1141
1167
  {
1142
1168
  type: "button",
@@ -1145,13 +1171,13 @@ function HealthStrip({ health }) {
1145
1171
  children: "Reconnect"
1146
1172
  }
1147
1173
  ) : null,
1148
- health.openAtSourceHref ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1174
+ health.openAtSourceHref ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1149
1175
  import_outbound_react.OutboundLink,
1150
1176
  {
1151
1177
  href: health.openAtSourceHref,
1152
1178
  className: "inline-flex h-6 items-center gap-1 rounded px-1.5 hover:bg-accent hover:text-foreground pointer-coarse:h-10",
1153
1179
  children: [
1154
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons7.ExternalLinkIcon, { className: "h-3 w-3" }),
1180
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons7.ExternalLinkIcon, { className: "h-3 w-3" }),
1155
1181
  health.openAtSourceLabel ?? deriveOpenAtSourceLabel(health.source)
1156
1182
  ]
1157
1183
  }
@@ -1169,16 +1195,16 @@ function FieldsSection({ core }) {
1169
1195
  const RefCell = host.doors.RefCell;
1170
1196
  const label = core.recordType?.label.toLowerCase() ?? "record";
1171
1197
  if (!core.recordType) {
1172
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { tone: "warn", children: `This is a ${core.ref.type} record. Nothing more about it is stored here yet, so there is nothing else to show. ${whatTheControlsDo(core)}` });
1198
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { tone: "warn", children: `This is a ${core.ref.type} record. Nothing more about it is stored here yet, so there is nothing else to show. ${whatTheControlsDo(core)}` });
1173
1199
  }
1174
1200
  if (core.status === "loading") {
1175
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(LoadingFields, { core, label });
1201
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(LoadingFields, { core, label });
1176
1202
  }
1177
1203
  if (core.status === "not-found") {
1178
1204
  const sentence = `This ${label} couldn't be found \u2014 it may have been moved, deleted, or isn't shared with you.`;
1179
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Notice, { tone: "warn", children: [
1205
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Notice, { tone: "warn", children: [
1180
1206
  sentence,
1181
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1207
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1182
1208
  import_design_system3.ErrorActions,
1183
1209
  {
1184
1210
  origin: "detail/DetailBody",
@@ -1190,24 +1216,24 @@ function FieldsSection({ core }) {
1190
1216
  ] });
1191
1217
  }
1192
1218
  if (core.status === "error") {
1193
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Notice, { tone: "error", children: [
1219
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Notice, { tone: "error", children: [
1194
1220
  `Couldn't load the details for this ${label}. ${core.errorMessage ?? ""}`.trim(),
1195
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.ErrorActions, { origin: "detail/DetailBody", operation: `Load this ${label}`, error: core.errorMessage })
1221
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.ErrorActions, { origin: "detail/DetailBody", operation: `Load this ${label}`, error: core.errorMessage })
1196
1222
  ] });
1197
1223
  }
1198
1224
  if (core.status === "none") {
1199
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { tone: "muted", children: `Nothing more about this ${label} is stored here, so there is nothing else to show. ` + whatTheControlsDo(core) });
1225
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { tone: "muted", children: `Nothing more about this ${label} is stored here, so there is nothing else to show. ` + whatTheControlsDo(core) });
1200
1226
  }
1201
1227
  if (core.fields.length === 0) {
1202
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-sm text-muted-foreground", children: "No additional fields to show." });
1228
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-sm text-muted-foreground", children: "No additional fields to show." });
1203
1229
  }
1204
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("dl", { className: "grid grid-cols-1 gap-x-4 gap-y-2.5", children: core.fields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1230
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("dl", { className: "grid grid-cols-1 gap-x-4 gap-y-2.5", children: core.fields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1205
1231
  "div",
1206
1232
  {
1207
1233
  className: "flex flex-col gap-0.5 border-b border-border/40 pb-2 last:border-b-0",
1208
1234
  children: [
1209
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("dt", { className: "text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: field.label }),
1210
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1235
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("dt", { className: "text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: field.label }),
1236
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1211
1237
  "dd",
1212
1238
  {
1213
1239
  className: (0, import_design_system3.cn)(
@@ -1219,7 +1245,7 @@ function FieldsSection({ core }) {
1219
1245
  // `field.ref.id` alone, so a field whose text was "Brightwater Robotics"
1220
1246
  // printed a truncated uuid. The ref's own `name` wins; otherwise the
1221
1247
  // field's text, unless that text IS the id and says nothing more.
1222
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1248
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1223
1249
  RefCell,
1224
1250
  {
1225
1251
  value: field.ref.id,
@@ -1238,8 +1264,8 @@ function FieldsSection({ core }) {
1238
1264
  }
1239
1265
  function LoadingFields({ core, label }) {
1240
1266
  const slow = useSlowLoadNotice(true, `${core.ref.type}:${core.ref.id}`);
1241
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-3", "aria-busy": "true", "aria-label": `Loading ${label} details`, children: [
1242
- slow ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("p", { className: "text-xs text-muted-foreground", "data-detail-slow-load": true, children: [
1267
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-3", "aria-busy": "true", "aria-label": `Loading ${label} details`, children: [
1268
+ slow ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "text-xs text-muted-foreground", "data-detail-slow-load": true, children: [
1243
1269
  "Still loading this ",
1244
1270
  label,
1245
1271
  " \u2014 the read has been running for more than",
@@ -1247,38 +1273,48 @@ function LoadingFields({ core, label }) {
1247
1273
  (0, import_format.formatDurationMs)(SLOW_LOAD_NOTICE_MS, { style: "long" }),
1248
1274
  ". If nothing appears, the record may be unreachable from here; closing and reopening it starts a fresh read."
1249
1275
  ] }) : null,
1250
- Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-1.5", children: [
1251
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.Skeleton, { className: "h-2.5 w-20" }),
1252
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.Skeleton, { className: (0, import_design_system3.cn)("h-4", i % 2 ? "w-3/4" : "w-1/2") })
1276
+ Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-1.5", children: [
1277
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-2.5 w-20" }),
1278
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: (0, import_design_system3.cn)("h-4", i % 2 ? "w-3/4" : "w-1/2") })
1253
1279
  ] }, i))
1254
1280
  ] });
1255
1281
  }
1256
1282
  function isAssociationTarget(token) {
1257
- return import_associations.ASSOCIATION_TARGET_TYPES.includes(token);
1283
+ return import_contracts2.ASSOCIATION_TARGET_TYPES.includes(token);
1258
1284
  }
1285
+ var loadDetailLinked = () => Promise.resolve().then(() => (init_DetailLinked(), DetailLinked_exports));
1286
+ var DetailLinked2 = (0, import_react10.lazy)(loadDetailLinked);
1259
1287
  function AssociationsSection({ core }) {
1260
1288
  const host = useDetailHost();
1261
1289
  const token = core.entityToken;
1262
1290
  if (!token || !isAssociationTarget(token) || !host.associations.canAnchor(token)) return null;
1263
1291
  if (core.recordType?.associationTokens === null) return null;
1264
- const wanted = core.recordType?.associationTokens ?? host.associations.defaultTokens;
1265
- const tokens = wanted.filter((t) => t !== token).filter(import_associations.isEntityTypeToken);
1266
- if (tokens.length === 0) return null;
1267
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": "associations", children: [
1268
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Link2Icon, { className: "h-3 w-3" }), children: "Linked" }),
1269
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react10.PrimaryEntityProvider, { value: { type: token, id: core.ref.id, label: core.title }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react10.AssociationCardGrid, { tokens }) })
1270
- ] });
1292
+ const wanted = (core.recordType?.associationTokens ?? host.associations.defaultTokens).filter(
1293
+ (t) => t !== token
1294
+ );
1295
+ if (wanted.length === 0) return null;
1296
+ const heading = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Link2Icon, { className: "h-3 w-3" }), children: "Linked" });
1297
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1298
+ import_react10.Suspense,
1299
+ {
1300
+ fallback: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "space-y-2", "data-detail-section": "associations", "aria-busy": "true", children: [
1301
+ heading,
1302
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-16 w-full" })
1303
+ ] }),
1304
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailLinked2, { token, id: core.ref.id, label: core.title, wanted, heading })
1305
+ }
1306
+ );
1271
1307
  }
1272
1308
  var ACTOR_COLUMNS = ["actor_id", "user_id", "person_id", "created_by_id"];
1273
1309
  function HistorySection({ core }) {
1274
1310
  const host = useDetailHost();
1275
1311
  const token = core.entityToken;
1276
1312
  const wanted = core.recordType?.history ?? Boolean(token);
1277
- const [state, setState] = (0, import_react9.useState)({ status: "loading" });
1278
- const lastKey = (0, import_react9.useRef)(null);
1313
+ const [state, setState] = (0, import_react10.useState)({ status: "loading" });
1314
+ const lastKey = (0, import_react10.useRef)(null);
1279
1315
  const listHistory = host.history.list;
1280
1316
  const recordId = core.ref.id;
1281
- (0, import_react9.useEffect)(() => {
1317
+ (0, import_react10.useEffect)(() => {
1282
1318
  if (!wanted || !token) return void 0;
1283
1319
  const key = `${token}:${recordId}`;
1284
1320
  if (lastKey.current !== key) {
@@ -1303,33 +1339,33 @@ function HistorySection({ core }) {
1303
1339
  (candidate) => Boolean(candidate)
1304
1340
  );
1305
1341
  const ActorName = host.history.ActorName ?? null;
1306
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": "history", children: [
1307
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HistoryIcon, { className: "h-3 w-3" }), children: "History" }),
1308
- state.status === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-1.5", "aria-busy": "true", "aria-label": "Loading history", children: [
1309
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-2/3" }),
1310
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-1/2" })
1311
- ] }) : state.status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
1342
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "space-y-2", "data-detail-section": "history", children: [
1343
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HistoryIcon, { className: "h-3 w-3" }), children: "History" }),
1344
+ state.status === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-1.5", "aria-busy": "true", "aria-label": "Loading history", children: [
1345
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-2/3" }),
1346
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-1/2" })
1347
+ ] }) : state.status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
1312
1348
  state.message.toLowerCase().includes("access denied") ? "History is only shown to people who can view this record." : `History could not be read: ${state.message}`,
1313
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.ErrorActions, { origin: "detail/DetailBody", operation: "Read the history", error: state.message })
1314
- ] }) : state.entries.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xs text-muted-foreground", children: "No recorded changes yet." }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ol", { className: "space-y-1", children: state.entries.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1349
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.ErrorActions, { origin: "detail/DetailBody", operation: "Read the history", error: state.message })
1350
+ ] }) : state.entries.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-xs text-muted-foreground", children: "No recorded changes yet." }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ol", { className: "space-y-1", children: state.entries.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1315
1351
  "li",
1316
1352
  {
1317
1353
  className: "flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs",
1318
1354
  children: [
1319
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: [
1355
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: [
1320
1356
  "v",
1321
1357
  entry.version
1322
1358
  ] }),
1323
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "capitalize text-foreground", children: entry.operation.toLowerCase() }),
1324
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-muted-foreground", children: formatWhen(entry.occurredAt) }),
1325
- entry.isCurrent ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-[10px] uppercase tracking-wide text-primary", children: "current" }) : null,
1326
- entry.actorId ? ActorName ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "text-muted-foreground", "data-detail-history-actor-person": true, children: [
1359
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "capitalize text-foreground", children: entry.operation.toLowerCase() }),
1360
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-muted-foreground", children: formatWhen(entry.occurredAt) }),
1361
+ entry.isCurrent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-[10px] uppercase tracking-wide text-primary", children: "current" }) : null,
1362
+ entry.actorId ? ActorName ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-muted-foreground", "data-detail-history-actor-person": true, children: [
1327
1363
  "Changed by ",
1328
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ActorName, { actorId: entry.actorId, row: core.row })
1329
- ] }) : actorToken ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "inline-flex items-center", "data-detail-history-actor": true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ActorCell, { value: entry.actorId, label: "Changed by", token: actorToken }) }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "text-muted-foreground", "data-detail-history-actor-raw": true, children: [
1364
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActorName, { actorId: entry.actorId, row: core.row })
1365
+ ] }) : actorToken ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "inline-flex items-center", "data-detail-history-actor": true, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActorCell, { value: entry.actorId, label: "Changed by", token: actorToken }) }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-muted-foreground", "data-detail-history-actor-raw": true, children: [
1330
1366
  "Changed by",
1331
1367
  " ",
1332
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1368
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1333
1369
  "span",
1334
1370
  {
1335
1371
  className: "font-mono text-[10px]",
@@ -1337,7 +1373,7 @@ function HistorySection({ core }) {
1337
1373
  children: entry.actorId
1338
1374
  }
1339
1375
  )
1340
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-muted-foreground", "data-detail-history-actor-absent": true, children: "No person recorded for this change" })
1376
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-muted-foreground", "data-detail-history-actor-absent": true, children: "No person recorded for this change" })
1341
1377
  ]
1342
1378
  },
1343
1379
  `${entry.version}-${entry.occurredAt}`
@@ -1349,34 +1385,37 @@ function CustomFieldsPort({ core }) {
1349
1385
  const Section = host.customFields?.Section;
1350
1386
  const token = core.entityToken;
1351
1387
  if (!Section || !token) return null;
1352
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Section, { token, id: core.ref.id });
1388
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Section, { token, id: core.ref.id });
1353
1389
  }
1354
1390
  function DetailBody({ core }) {
1391
+ (0, import_react10.useEffect)(() => {
1392
+ loadDetailLinked().catch(() => void 0);
1393
+ }, []);
1355
1394
  const extra = core.recordType?.extraSections && core.frameCtx ? core.recordType.extraSections(core.row, core.frameCtx) : [];
1356
1395
  const Frame = core.recordType?.Frame ?? null;
1357
1396
  const body = (
1358
1397
  // `min-h-full` so a Frame's right-click menu answers anywhere in the body,
1359
1398
  // not only on the rows — a short dossier otherwise leaves a dead band.
1360
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex min-h-full flex-col", children: [
1361
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(DetailRecordMeta, { core }),
1362
- core.health ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HealthStrip, { health: core.health }) : null,
1363
- core.about ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "line-clamp-3 border-b border-border/60 p-4 text-xs leading-snug text-muted-foreground", children: core.about }) : null,
1364
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-6 p-4", children: [
1365
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(FieldsSection, { core }),
1366
- core.status === "ready" || core.status === "none" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1367
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CustomFieldsPort, { core }),
1368
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AssociationsSection, { core }),
1369
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HistorySection, { core }),
1370
- extra.map((section) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": section.id, children: [
1371
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionHeading, { children: section.label }),
1399
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex min-h-full flex-col", children: [
1400
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailRecordMeta, { core }),
1401
+ core.health ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HealthStrip, { health: core.health }) : null,
1402
+ core.about ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "line-clamp-3 border-b border-border/60 p-4 text-xs leading-snug text-muted-foreground", children: core.about }) : null,
1403
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-6 p-4", children: [
1404
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FieldsSection, { core }),
1405
+ core.status === "ready" || core.status === "none" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
1406
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CustomFieldsPort, { core }),
1407
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AssociationsSection, { core }),
1408
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HistorySection, { core }),
1409
+ extra.map((section) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "space-y-2", "data-detail-section": section.id, children: [
1410
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeading, { children: section.label }),
1372
1411
  section.content
1373
1412
  ] }, section.id))
1374
1413
  ] }) : null,
1375
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(DetailPresentationPane, { core })
1414
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailPresentationPane, { core })
1376
1415
  ] })
1377
1416
  ] })
1378
1417
  );
1379
- if (Frame && core.frameCtx) return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Frame, { ctx: core.frameCtx, children: body });
1418
+ if (Frame && core.frameCtx) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Frame, { ctx: core.frameCtx, children: body });
1380
1419
  return body;
1381
1420
  }
1382
1421
 
@@ -1399,9 +1438,9 @@ function detailInstanceKey(ref) {
1399
1438
  var DEFAULT_PANEL_URL_RESERVE_BYTES = Math.floor(DETAIL_URL_BUDGET_BYTES / 2);
1400
1439
 
1401
1440
  // src/react/presentations.tsx
1402
- var import_jsx_runtime5 = require("react/jsx-runtime");
1441
+ var import_jsx_runtime6 = require("react/jsx-runtime");
1403
1442
  function KeyboardSlot({ core, children }) {
1404
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1443
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1405
1444
  "div",
1406
1445
  {
1407
1446
  onKeyDownCapture: core.keyboard.rootProps.onKeyDownCapture,
@@ -1412,7 +1451,7 @@ function KeyboardSlot({ core, children }) {
1412
1451
  );
1413
1452
  }
1414
1453
  function KeyboardActionsSlot({ core, children }) {
1415
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1454
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1416
1455
  "div",
1417
1456
  {
1418
1457
  onKeyDownCapture: core.keyboard.rootProps.onKeyDownCapture,
@@ -1431,7 +1470,7 @@ function KeyboardRoot({ core, children }) {
1431
1470
  if (active instanceof HTMLElement && active !== document.body && root.contains(active)) return;
1432
1471
  root.focus({ preventScroll: true });
1433
1472
  }, [core.ref.id, core.ref.type]);
1434
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1473
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1435
1474
  "div",
1436
1475
  {
1437
1476
  ref: rootRef,
@@ -1449,19 +1488,19 @@ function DetailWindowPresentation({ data, onClose }) {
1449
1488
  const core = useDetailCore(data, "window", { onClose });
1450
1489
  const menuActions = useDetailMenuActions(core);
1451
1490
  const Shell = requireShell(host.shells, "Window");
1452
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1491
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1453
1492
  Shell,
1454
1493
  {
1455
1494
  instanceKey: detailInstanceKey(core.ref),
1456
1495
  target: core.ref,
1457
1496
  list: core.list.context,
1458
1497
  title: core.title,
1459
- titleNode: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailTitle, { core }) }),
1460
- actions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core }) }),
1461
- navActions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core, optional: "none" }) }),
1498
+ titleNode: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailTitle, { core }) }),
1499
+ actions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core }) }),
1500
+ navActions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core, optional: "none" }) }),
1462
1501
  menuActions,
1463
1502
  onClose: core.close,
1464
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailBody, { core }) })
1503
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailBody, { core }) })
1465
1504
  }
1466
1505
  );
1467
1506
  }
@@ -1470,18 +1509,18 @@ function DetailDockedPresentation({ data, onClose }) {
1470
1509
  const core = useDetailCore(data, "docked", { onClose });
1471
1510
  const menuActions = useDetailMenuActions(core);
1472
1511
  const Shell = requireShell(host.shells, "Docked");
1473
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1512
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1474
1513
  Shell,
1475
1514
  {
1476
1515
  instanceKey: detailInstanceKey(core.ref),
1477
1516
  target: core.ref,
1478
1517
  title: core.title,
1479
- titleNode: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailTitle, { core }) }),
1480
- actions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core }) }),
1481
- navActions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core, optional: "none" }) }),
1518
+ titleNode: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailTitle, { core }) }),
1519
+ actions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core }) }),
1520
+ navActions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core, optional: "none" }) }),
1482
1521
  menuActions,
1483
1522
  onClose: core.close,
1484
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailBody, { core }) })
1523
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailBody, { core }) })
1485
1524
  }
1486
1525
  );
1487
1526
  }
@@ -1490,18 +1529,18 @@ function DetailPagePresentation({ data }) {
1490
1529
  const core = useDetailCore(data, "page", {});
1491
1530
  const menuActions = useDetailMenuActions(core);
1492
1531
  const Shell = requireShell(host.shells, "Page");
1493
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1532
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1494
1533
  Shell,
1495
1534
  {
1496
1535
  target: core.ref,
1497
1536
  title: core.title,
1498
- titleNode: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailTitle, { core }) }),
1499
- actions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core }) }),
1500
- navActions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core, optional: "none" }) }),
1537
+ titleNode: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailTitle, { core }) }),
1538
+ actions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core }) }),
1539
+ navActions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core, optional: "none" }) }),
1501
1540
  menuActions,
1502
1541
  onClose: core.close,
1503
1542
  onBack: core.leave,
1504
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailBody, { core }) })
1543
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailBody, { core }) })
1505
1544
  }
1506
1545
  );
1507
1546
  }