@ai-matrx/detail 0.1.177 → 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/CHANGELOG.md CHANGED
@@ -1,9 +1,22 @@
1
1
  # Changelog — @ai-matrx/detail
2
2
 
3
+ ## 0.1.178
4
+
5
+ - **The Linked section loads behind one lazy edge (2026-10-27).** `DetailLinked` (the associations grid, its provider and the entity-token filter) is a separate chunk that `DetailBody` starts on mount, beside the record's read, so it is normally in before the record answers; while it is not, the section shows its heading and a skeleton. `@ai-matrx/detail/react` drops from 395 KB to 166 KB up front (Rolldown) and no longer ships the generated association/entity tables. Consumer action: none.
6
+
3
7
  ## 0.1.177
4
8
 
5
- UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
- Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/detail/src`.
9
+ SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
10
+ so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
11
+ Diff: `git diff f1984cb2e2 eabc648b2b -- apps/shared/detail/src`
12
+
13
+ Changed shipped source files (6):
14
+ - `apps/shared/detail/src/react/DetailBody.tsx`
15
+ - `apps/shared/detail/src/react/DetailHeader.tsx`
16
+ - `apps/shared/detail/src/react/DetailPresentationPane.tsx`
17
+ - `apps/shared/detail/src/react/host.tsx`
18
+ - `apps/shared/detail/src/react/useDetailCore.ts`
19
+ - `apps/shared/detail/src/react/useOpenDetail.ts`
7
20
 
8
21
  ## 0.1.176
9
22
 
@@ -0,0 +1,18 @@
1
+ "use client";
2
+
3
+ // src/react/DetailLinked.tsx
4
+ import { isEntityTypeToken } from "@ai-matrx/associations/contracts";
5
+ import { AssociationCardGrid, PrimaryEntityProvider } from "@ai-matrx/associations/react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ function DetailLinked({ token, id, label, wanted, heading }) {
8
+ const tokens = wanted.filter(isEntityTypeToken);
9
+ if (tokens.length === 0) return null;
10
+ return /* @__PURE__ */ jsxs("section", { className: "space-y-2", "data-detail-section": "associations", children: [
11
+ heading,
12
+ /* @__PURE__ */ jsx(PrimaryEntityProvider, { value: { type: token, id, label }, children: /* @__PURE__ */ jsx(AssociationCardGrid, { tokens }) })
13
+ ] });
14
+ }
15
+ export {
16
+ DetailLinked as default
17
+ };
18
+ //# sourceMappingURL=DetailLinked-57SRZLYJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/DetailLinked.tsx"],"sourcesContent":["// @ai-matrx/detail — src/react/DetailLinked.tsx\n//\n// The body of a record's \"Linked\" section, loaded behind ONE lazy edge from\n// DetailBody. It is the only part of the panel that needs the associations\n// faces and the generated entity-token vocabulary, so a details panel that\n// opens pays for neither until it has a record that can anchor links\n// (importing the panel does no work). DetailBody starts this chunk on mount, so\n// it is normally in before the record's read answers.\n\n\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { isEntityTypeToken, type AssociationTargetType } from \"@ai-matrx/associations/contracts\";\nimport { AssociationCardGrid, PrimaryEntityProvider } from \"@ai-matrx/associations/react\";\n\nexport interface DetailLinkedProps {\n token: AssociationTargetType;\n id: string;\n label: string;\n /** Candidate tokens (host or record-type), the record's own token already removed. */\n wanted: readonly string[];\n heading: ReactNode;\n}\n\nexport default function DetailLinked({ token, id, label, wanted, heading }: DetailLinkedProps) {\n const tokens = wanted.filter(isEntityTypeToken);\n if (tokens.length === 0) return null;\n return (\n <section className=\"space-y-2\" data-detail-section=\"associations\">\n {heading}\n <PrimaryEntityProvider value={{ type: token, id, label }}>\n <AssociationCardGrid tokens={tokens} />\n </PrimaryEntityProvider>\n </section>\n );\n}\n"],"mappings":";;;AAYA,SAAS,yBAAqD;AAC9D,SAAS,qBAAqB,6BAA6B;AAevD,SAGI,KAHJ;AAJW,SAAR,aAA8B,EAAE,OAAO,IAAI,OAAO,QAAQ,QAAQ,GAAsB;AAC7F,QAAM,SAAS,OAAO,OAAO,iBAAiB;AAC9C,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SACE,qBAAC,aAAQ,WAAU,aAAY,uBAAoB,gBAChD;AAAA;AAAA,IACD,oBAAC,yBAAsB,OAAO,EAAE,MAAM,OAAO,IAAI,MAAM,GACrD,8BAAC,uBAAoB,QAAgB,GACvC;AAAA,KACF;AAEJ;","names":[]}
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, {
@@ -807,10 +839,9 @@ function DetailActions({ core, optional = "inline" }) {
807
839
  }
808
840
 
809
841
  // src/react/DetailBody.tsx
810
- var import_react9 = require("react");
842
+ var import_react10 = require("react");
811
843
  var import_design_system3 = require("@ai-matrx/design-system");
812
- var import_associations = require("@ai-matrx/associations");
813
- var import_react10 = require("@ai-matrx/associations/react");
844
+ var import_contracts2 = require("@ai-matrx/associations/contracts");
814
845
  var import_format = require("@ai-matrx/kit/format");
815
846
 
816
847
  // src/format.ts
@@ -1022,11 +1053,11 @@ function DetailPresentationPane({ core }) {
1022
1053
  var import_icons7 = require("@ai-matrx/design-system/icons");
1023
1054
  var import_outbound_react = require("@ai-matrx/kit/outbound-react");
1024
1055
  var import_error_sentence = require("@ai-matrx/design-system/error-sentence");
1025
- var import_jsx_runtime4 = require("react/jsx-runtime");
1056
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1026
1057
  var SLOW_LOAD_NOTICE_MS = 6e3;
1027
1058
  function useSlowLoadNotice(active, key) {
1028
- const [slow, setSlow] = (0, import_react9.useState)(false);
1029
- (0, import_react9.useEffect)(() => {
1059
+ const [slow, setSlow] = (0, import_react10.useState)(false);
1060
+ (0, import_react10.useEffect)(() => {
1030
1061
  if (!active) {
1031
1062
  setSlow(false);
1032
1063
  return void 0;
@@ -1038,7 +1069,7 @@ function useSlowLoadNotice(active, key) {
1038
1069
  return slow;
1039
1070
  }
1040
1071
  function SectionHeading({ icon, children }) {
1041
- 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: [
1042
1073
  icon,
1043
1074
  children
1044
1075
  ] });
@@ -1047,8 +1078,8 @@ function Notice({
1047
1078
  tone,
1048
1079
  children
1049
1080
  }) {
1050
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex flex-col items-center gap-2 py-8 text-center", children: [
1051
- /* @__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)(
1052
1083
  AlertCircleIcon,
1053
1084
  {
1054
1085
  className: (0, import_design_system3.cn)(
@@ -1059,7 +1090,7 @@ function Notice({
1059
1090
  )
1060
1091
  }
1061
1092
  ),
1062
- /* @__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 })
1063
1094
  ] });
1064
1095
  }
1065
1096
  var GRANT_WORD = {
@@ -1080,7 +1111,7 @@ function deriveOpenAtSourceLabel(source) {
1080
1111
  }
1081
1112
  function HealthStrip({ health }) {
1082
1113
  const ok = health.grant === "ok";
1083
- const [refreshing, setRefreshing] = (0, import_react9.useState)(false);
1114
+ const [refreshing, setRefreshing] = (0, import_react10.useState)(false);
1084
1115
  const host = useDetailHost();
1085
1116
  const refresh = async () => {
1086
1117
  if (!health.onRefresh) return;
@@ -1093,7 +1124,7 @@ function HealthStrip({ health }) {
1093
1124
  setRefreshing(false);
1094
1125
  }
1095
1126
  };
1096
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1127
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1097
1128
  "div",
1098
1129
  {
1099
1130
  className: (0, import_design_system3.cn)(
@@ -1102,9 +1133,9 @@ function HealthStrip({ health }) {
1102
1133
  ),
1103
1134
  "data-detail-health": true,
1104
1135
  children: [
1105
- 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" }),
1106
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "font-medium", children: health.source }),
1107
- 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)(
1108
1139
  "span",
1109
1140
  {
1110
1141
  className: "rounded bg-destructive/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-destructive",
@@ -1112,13 +1143,13 @@ function HealthStrip({ health }) {
1112
1143
  children: GRANT_WORD[health.grant]
1113
1144
  }
1114
1145
  ),
1115
- health.lastRefreshedAt ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { children: [
1146
+ health.lastRefreshedAt ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
1116
1147
  "Refreshed ",
1117
1148
  formatWhen(health.lastRefreshedAt)
1118
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Never refreshed" }),
1119
- health.grantDetail ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: health.grantDetail }) : null,
1120
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "ml-auto flex items-center gap-1", children: [
1121
- 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)(
1122
1153
  "button",
1123
1154
  {
1124
1155
  type: "button",
@@ -1126,12 +1157,12 @@ function HealthStrip({ health }) {
1126
1157
  disabled: refreshing,
1127
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",
1128
1159
  children: [
1129
- /* @__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") }),
1130
1161
  "Refresh"
1131
1162
  ]
1132
1163
  }
1133
1164
  ) : null,
1134
- !ok && health.onReconnect ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1165
+ !ok && health.onReconnect ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1135
1166
  "button",
1136
1167
  {
1137
1168
  type: "button",
@@ -1140,13 +1171,13 @@ function HealthStrip({ health }) {
1140
1171
  children: "Reconnect"
1141
1172
  }
1142
1173
  ) : null,
1143
- health.openAtSourceHref ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1174
+ health.openAtSourceHref ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1144
1175
  import_outbound_react.OutboundLink,
1145
1176
  {
1146
1177
  href: health.openAtSourceHref,
1147
1178
  className: "inline-flex h-6 items-center gap-1 rounded px-1.5 hover:bg-accent hover:text-foreground pointer-coarse:h-10",
1148
1179
  children: [
1149
- /* @__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" }),
1150
1181
  health.openAtSourceLabel ?? deriveOpenAtSourceLabel(health.source)
1151
1182
  ]
1152
1183
  }
@@ -1164,16 +1195,16 @@ function FieldsSection({ core }) {
1164
1195
  const RefCell = host.doors.RefCell;
1165
1196
  const label = core.recordType?.label.toLowerCase() ?? "record";
1166
1197
  if (!core.recordType) {
1167
- 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)}` });
1168
1199
  }
1169
1200
  if (core.status === "loading") {
1170
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(LoadingFields, { core, label });
1201
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(LoadingFields, { core, label });
1171
1202
  }
1172
1203
  if (core.status === "not-found") {
1173
1204
  const sentence = `This ${label} couldn't be found \u2014 it may have been moved, deleted, or isn't shared with you.`;
1174
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Notice, { tone: "warn", children: [
1205
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Notice, { tone: "warn", children: [
1175
1206
  sentence,
1176
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1207
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1177
1208
  import_design_system3.ErrorActions,
1178
1209
  {
1179
1210
  origin: "detail/DetailBody",
@@ -1185,24 +1216,24 @@ function FieldsSection({ core }) {
1185
1216
  ] });
1186
1217
  }
1187
1218
  if (core.status === "error") {
1188
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Notice, { tone: "error", children: [
1219
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Notice, { tone: "error", children: [
1189
1220
  `Couldn't load the details for this ${label}. ${core.errorMessage ?? ""}`.trim(),
1190
- /* @__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 })
1191
1222
  ] });
1192
1223
  }
1193
1224
  if (core.status === "none") {
1194
- 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) });
1195
1226
  }
1196
1227
  if (core.fields.length === 0) {
1197
- 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." });
1198
1229
  }
1199
- 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)(
1200
1231
  "div",
1201
1232
  {
1202
1233
  className: "flex flex-col gap-0.5 border-b border-border/40 pb-2 last:border-b-0",
1203
1234
  children: [
1204
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("dt", { className: "text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: field.label }),
1205
- /* @__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)(
1206
1237
  "dd",
1207
1238
  {
1208
1239
  className: (0, import_design_system3.cn)(
@@ -1214,7 +1245,7 @@ function FieldsSection({ core }) {
1214
1245
  // `field.ref.id` alone, so a field whose text was "Brightwater Robotics"
1215
1246
  // printed a truncated uuid. The ref's own `name` wins; otherwise the
1216
1247
  // field's text, unless that text IS the id and says nothing more.
1217
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1248
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1218
1249
  RefCell,
1219
1250
  {
1220
1251
  value: field.ref.id,
@@ -1233,8 +1264,8 @@ function FieldsSection({ core }) {
1233
1264
  }
1234
1265
  function LoadingFields({ core, label }) {
1235
1266
  const slow = useSlowLoadNotice(true, `${core.ref.type}:${core.ref.id}`);
1236
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-3", "aria-busy": "true", "aria-label": `Loading ${label} details`, children: [
1237
- 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: [
1238
1269
  "Still loading this ",
1239
1270
  label,
1240
1271
  " \u2014 the read has been running for more than",
@@ -1242,38 +1273,48 @@ function LoadingFields({ core, label }) {
1242
1273
  (0, import_format.formatDurationMs)(SLOW_LOAD_NOTICE_MS, { style: "long" }),
1243
1274
  ". If nothing appears, the record may be unreachable from here; closing and reopening it starts a fresh read."
1244
1275
  ] }) : null,
1245
- Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-1.5", children: [
1246
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.Skeleton, { className: "h-2.5 w-20" }),
1247
- /* @__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") })
1248
1279
  ] }, i))
1249
1280
  ] });
1250
1281
  }
1251
1282
  function isAssociationTarget(token) {
1252
- return import_associations.ASSOCIATION_TARGET_TYPES.includes(token);
1283
+ return import_contracts2.ASSOCIATION_TARGET_TYPES.includes(token);
1253
1284
  }
1285
+ var loadDetailLinked = () => Promise.resolve().then(() => (init_DetailLinked(), DetailLinked_exports));
1286
+ var DetailLinked2 = (0, import_react10.lazy)(loadDetailLinked);
1254
1287
  function AssociationsSection({ core }) {
1255
1288
  const host = useDetailHost();
1256
1289
  const token = core.entityToken;
1257
1290
  if (!token || !isAssociationTarget(token) || !host.associations.canAnchor(token)) return null;
1258
1291
  if (core.recordType?.associationTokens === null) return null;
1259
- const wanted = core.recordType?.associationTokens ?? host.associations.defaultTokens;
1260
- const tokens = wanted.filter((t) => t !== token).filter(import_associations.isEntityTypeToken);
1261
- if (tokens.length === 0) return null;
1262
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": "associations", children: [
1263
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Link2Icon, { className: "h-3 w-3" }), children: "Linked" }),
1264
- /* @__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 }) })
1265
- ] });
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
+ );
1266
1307
  }
1267
1308
  var ACTOR_COLUMNS = ["actor_id", "user_id", "person_id", "created_by_id"];
1268
1309
  function HistorySection({ core }) {
1269
1310
  const host = useDetailHost();
1270
1311
  const token = core.entityToken;
1271
1312
  const wanted = core.recordType?.history ?? Boolean(token);
1272
- const [state, setState] = (0, import_react9.useState)({ status: "loading" });
1273
- 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);
1274
1315
  const listHistory = host.history.list;
1275
1316
  const recordId = core.ref.id;
1276
- (0, import_react9.useEffect)(() => {
1317
+ (0, import_react10.useEffect)(() => {
1277
1318
  if (!wanted || !token) return void 0;
1278
1319
  const key = `${token}:${recordId}`;
1279
1320
  if (lastKey.current !== key) {
@@ -1298,33 +1339,33 @@ function HistorySection({ core }) {
1298
1339
  (candidate) => Boolean(candidate)
1299
1340
  );
1300
1341
  const ActorName = host.history.ActorName ?? null;
1301
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": "history", children: [
1302
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HistoryIcon, { className: "h-3 w-3" }), children: "History" }),
1303
- state.status === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-1.5", "aria-busy": "true", "aria-label": "Loading history", children: [
1304
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-2/3" }),
1305
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-1/2" })
1306
- ] }) : 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: [
1307
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}`,
1308
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system3.ErrorActions, { origin: "detail/DetailBody", operation: "Read the history", error: state.message })
1309
- ] }) : 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)(
1310
1351
  "li",
1311
1352
  {
1312
1353
  className: "flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs",
1313
1354
  children: [
1314
- /* @__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: [
1315
1356
  "v",
1316
1357
  entry.version
1317
1358
  ] }),
1318
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "capitalize text-foreground", children: entry.operation.toLowerCase() }),
1319
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-muted-foreground", children: formatWhen(entry.occurredAt) }),
1320
- entry.isCurrent ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-[10px] uppercase tracking-wide text-primary", children: "current" }) : null,
1321
- 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: [
1322
1363
  "Changed by ",
1323
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ActorName, { actorId: entry.actorId, row: core.row })
1324
- ] }) : 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: [
1325
1366
  "Changed by",
1326
1367
  " ",
1327
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1368
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1328
1369
  "span",
1329
1370
  {
1330
1371
  className: "font-mono text-[10px]",
@@ -1332,7 +1373,7 @@ function HistorySection({ core }) {
1332
1373
  children: entry.actorId
1333
1374
  }
1334
1375
  )
1335
- ] }) : /* @__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" })
1336
1377
  ]
1337
1378
  },
1338
1379
  `${entry.version}-${entry.occurredAt}`
@@ -1344,34 +1385,37 @@ function CustomFieldsPort({ core }) {
1344
1385
  const Section = host.customFields?.Section;
1345
1386
  const token = core.entityToken;
1346
1387
  if (!Section || !token) return null;
1347
- 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 });
1348
1389
  }
1349
1390
  function DetailBody({ core }) {
1391
+ (0, import_react10.useEffect)(() => {
1392
+ loadDetailLinked().catch(() => void 0);
1393
+ }, []);
1350
1394
  const extra = core.recordType?.extraSections && core.frameCtx ? core.recordType.extraSections(core.row, core.frameCtx) : [];
1351
1395
  const Frame = core.recordType?.Frame ?? null;
1352
1396
  const body = (
1353
1397
  // `min-h-full` so a Frame's right-click menu answers anywhere in the body,
1354
1398
  // not only on the rows — a short dossier otherwise leaves a dead band.
1355
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex min-h-full flex-col", children: [
1356
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(DetailRecordMeta, { core }),
1357
- core.health ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HealthStrip, { health: core.health }) : null,
1358
- 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,
1359
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-6 p-4", children: [
1360
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(FieldsSection, { core }),
1361
- core.status === "ready" || core.status === "none" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1362
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CustomFieldsPort, { core }),
1363
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AssociationsSection, { core }),
1364
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HistorySection, { core }),
1365
- extra.map((section) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": section.id, children: [
1366
- /* @__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 }),
1367
1411
  section.content
1368
1412
  ] }, section.id))
1369
1413
  ] }) : null,
1370
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(DetailPresentationPane, { core })
1414
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailPresentationPane, { core })
1371
1415
  ] })
1372
1416
  ] })
1373
1417
  );
1374
- 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 });
1375
1419
  return body;
1376
1420
  }
1377
1421
 
@@ -1394,9 +1438,9 @@ function detailInstanceKey(ref) {
1394
1438
  var DEFAULT_PANEL_URL_RESERVE_BYTES = Math.floor(DETAIL_URL_BUDGET_BYTES / 2);
1395
1439
 
1396
1440
  // src/react/presentations.tsx
1397
- var import_jsx_runtime5 = require("react/jsx-runtime");
1441
+ var import_jsx_runtime6 = require("react/jsx-runtime");
1398
1442
  function KeyboardSlot({ core, children }) {
1399
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1443
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1400
1444
  "div",
1401
1445
  {
1402
1446
  onKeyDownCapture: core.keyboard.rootProps.onKeyDownCapture,
@@ -1407,7 +1451,7 @@ function KeyboardSlot({ core, children }) {
1407
1451
  );
1408
1452
  }
1409
1453
  function KeyboardActionsSlot({ core, children }) {
1410
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1454
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1411
1455
  "div",
1412
1456
  {
1413
1457
  onKeyDownCapture: core.keyboard.rootProps.onKeyDownCapture,
@@ -1426,7 +1470,7 @@ function KeyboardRoot({ core, children }) {
1426
1470
  if (active instanceof HTMLElement && active !== document.body && root.contains(active)) return;
1427
1471
  root.focus({ preventScroll: true });
1428
1472
  }, [core.ref.id, core.ref.type]);
1429
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1473
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1430
1474
  "div",
1431
1475
  {
1432
1476
  ref: rootRef,
@@ -1444,19 +1488,19 @@ function DetailWindowPresentation({ data, onClose }) {
1444
1488
  const core = useDetailCore(data, "window", { onClose });
1445
1489
  const menuActions = useDetailMenuActions(core);
1446
1490
  const Shell = requireShell(host.shells, "Window");
1447
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1491
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1448
1492
  Shell,
1449
1493
  {
1450
1494
  instanceKey: detailInstanceKey(core.ref),
1451
1495
  target: core.ref,
1452
1496
  list: core.list.context,
1453
1497
  title: core.title,
1454
- titleNode: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailTitle, { core }) }),
1455
- actions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core }) }),
1456
- 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" }) }),
1457
1501
  menuActions,
1458
1502
  onClose: core.close,
1459
- 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 }) })
1460
1504
  }
1461
1505
  );
1462
1506
  }
@@ -1465,18 +1509,18 @@ function DetailDockedPresentation({ data, onClose }) {
1465
1509
  const core = useDetailCore(data, "docked", { onClose });
1466
1510
  const menuActions = useDetailMenuActions(core);
1467
1511
  const Shell = requireShell(host.shells, "Docked");
1468
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1512
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1469
1513
  Shell,
1470
1514
  {
1471
1515
  instanceKey: detailInstanceKey(core.ref),
1472
1516
  target: core.ref,
1473
1517
  title: core.title,
1474
- titleNode: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailTitle, { core }) }),
1475
- actions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core }) }),
1476
- 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" }) }),
1477
1521
  menuActions,
1478
1522
  onClose: core.close,
1479
- 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 }) })
1480
1524
  }
1481
1525
  );
1482
1526
  }
@@ -1485,18 +1529,18 @@ function DetailPagePresentation({ data }) {
1485
1529
  const core = useDetailCore(data, "page", {});
1486
1530
  const menuActions = useDetailMenuActions(core);
1487
1531
  const Shell = requireShell(host.shells, "Page");
1488
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1532
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1489
1533
  Shell,
1490
1534
  {
1491
1535
  target: core.ref,
1492
1536
  title: core.title,
1493
- titleNode: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailTitle, { core }) }),
1494
- actions: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailActions, { core }) }),
1495
- 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" }) }),
1496
1540
  menuActions,
1497
1541
  onClose: core.close,
1498
1542
  onBack: core.leave,
1499
- 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 }) })
1500
1544
  }
1501
1545
  );
1502
1546
  }