@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 +15 -2
- package/dist/DetailLinked-57SRZLYJ.js +18 -0
- package/dist/DetailLinked-57SRZLYJ.js.map +1 -0
- package/dist/react.cjs +147 -103
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +22 -13
- package/dist/react.js.map +1 -1
- package/package.json +13 -2
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
|
-
|
|
6
|
-
|
|
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
|
|
842
|
+
var import_react10 = require("react");
|
|
811
843
|
var import_design_system3 = require("@ai-matrx/design-system");
|
|
812
|
-
var
|
|
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
|
|
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,
|
|
1029
|
-
(0,
|
|
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,
|
|
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,
|
|
1051
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1106
|
-
/* @__PURE__ */ (0,
|
|
1107
|
-
ok ? null : /* @__PURE__ */ (0,
|
|
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,
|
|
1146
|
+
health.lastRefreshedAt ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
|
|
1116
1147
|
"Refreshed ",
|
|
1117
1148
|
formatWhen(health.lastRefreshedAt)
|
|
1118
|
-
] }) : /* @__PURE__ */ (0,
|
|
1119
|
-
health.grantDetail ? /* @__PURE__ */ (0,
|
|
1120
|
-
/* @__PURE__ */ (0,
|
|
1121
|
-
health.onRefresh ? /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1205
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Notice, { tone: "warn", children: [
|
|
1175
1206
|
sentence,
|
|
1176
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1205
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1237
|
-
slow ? /* @__PURE__ */ (0,
|
|
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,
|
|
1246
|
-
/* @__PURE__ */ (0,
|
|
1247
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
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,
|
|
1273
|
-
const lastKey = (0,
|
|
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,
|
|
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,
|
|
1302
|
-
/* @__PURE__ */ (0,
|
|
1303
|
-
state.status === "loading" ? /* @__PURE__ */ (0,
|
|
1304
|
-
/* @__PURE__ */ (0,
|
|
1305
|
-
/* @__PURE__ */ (0,
|
|
1306
|
-
] }) : state.status === "error" ? /* @__PURE__ */ (0,
|
|
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,
|
|
1309
|
-
] }) : state.entries.length === 0 ? /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1319
|
-
/* @__PURE__ */ (0,
|
|
1320
|
-
entry.isCurrent ? /* @__PURE__ */ (0,
|
|
1321
|
-
entry.actorId ? ActorName ? /* @__PURE__ */ (0,
|
|
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,
|
|
1324
|
-
] }) : actorToken ? /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1356
|
-
/* @__PURE__ */ (0,
|
|
1357
|
-
core.health ? /* @__PURE__ */ (0,
|
|
1358
|
-
core.about ? /* @__PURE__ */ (0,
|
|
1359
|
-
/* @__PURE__ */ (0,
|
|
1360
|
-
/* @__PURE__ */ (0,
|
|
1361
|
-
core.status === "ready" || core.status === "none" ? /* @__PURE__ */ (0,
|
|
1362
|
-
/* @__PURE__ */ (0,
|
|
1363
|
-
/* @__PURE__ */ (0,
|
|
1364
|
-
/* @__PURE__ */ (0,
|
|
1365
|
-
extra.map((section) => /* @__PURE__ */ (0,
|
|
1366
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1414
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailPresentationPane, { core })
|
|
1371
1415
|
] })
|
|
1372
1416
|
] })
|
|
1373
1417
|
);
|
|
1374
|
-
if (Frame && core.frameCtx) return /* @__PURE__ */ (0,
|
|
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
|
|
1441
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
1398
1442
|
function KeyboardSlot({ core, children }) {
|
|
1399
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1455
|
-
actions: /* @__PURE__ */ (0,
|
|
1456
|
-
navActions: /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
1475
|
-
actions: /* @__PURE__ */ (0,
|
|
1476
|
-
navActions: /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
1494
|
-
actions: /* @__PURE__ */ (0,
|
|
1495
|
-
navActions: /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
}
|