@openrails/contentkit-ui 0.98.6 → 0.99.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/client/content/comments.d.ts +4 -2
- package/dist/client/content/comments.js +10 -6
- package/dist/client/content/comments.js.map +1 -1
- package/dist/client/generated/routes.d.ts +28 -2
- package/dist/client/generated/routes.js +39 -2
- package/dist/client/generated/routes.js.map +1 -1
- package/dist/client/generated/wire.d.ts +85 -0
- package/dist/client/generated/wire.js.map +1 -1
- package/dist/client/media/client.d.ts +4 -0
- package/dist/client/media/client.js +8 -4
- package/dist/client/media/client.js.map +1 -1
- package/dist/client/media/queue.js +42 -26
- package/dist/client/media/queue.js.map +1 -1
- package/dist/client/media/rules.d.ts +6 -0
- package/dist/client/media/rules.js +64 -10
- package/dist/client/media/rules.js.map +1 -1
- package/dist/client/versions.d.ts +6 -2
- package/dist/client/versions.js +26 -0
- package/dist/client/versions.js.map +1 -1
- package/dist/components/admin/page-review.d.ts +13 -0
- package/dist/components/admin/page-review.js +216 -0
- package/dist/components/admin/page-review.js.map +1 -0
- package/dist/components/content/card.js +98 -103
- package/dist/components/content/card.js.map +1 -1
- package/dist/components/content/daily-releases.d.ts +8 -1
- package/dist/components/content/daily-releases.js +291 -133
- package/dist/components/content/daily-releases.js.map +1 -1
- package/dist/components/content/editors.js +216 -210
- package/dist/components/content/editors.js.map +1 -1
- package/dist/components/content/filter-dialog.d.ts +11 -0
- package/dist/components/content/filter-dialog.js +29 -0
- package/dist/components/content/filter-dialog.js.map +1 -0
- package/dist/components/content/filters.d.ts +10 -0
- package/dist/components/content/filters.js +5 -2
- package/dist/components/content/filters.js.map +1 -1
- package/dist/components/content/grid.js +19 -14
- package/dist/components/content/grid.js.map +1 -1
- package/dist/components/content/index.d.ts +2 -1
- package/dist/components/content/release-reveal.d.ts +5 -0
- package/dist/components/content/release-reveal.js +62 -0
- package/dist/components/content/release-reveal.js.map +1 -0
- package/dist/components/social/comments.d.ts +1 -1
- package/dist/components/social/comments.js +15 -15
- package/dist/components/social/comments.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +24 -22
- package/dist/locales/admin/de.js +23 -0
- package/dist/locales/admin/de.js.map +1 -1
- package/dist/locales/admin/en.d.ts +23 -0
- package/dist/locales/admin/en.js +23 -0
- package/dist/locales/admin/en.js.map +1 -1
- package/dist/locales/admin/es.js +23 -0
- package/dist/locales/admin/es.js.map +1 -1
- package/dist/locales/admin/ja.js +23 -0
- package/dist/locales/admin/ja.js.map +1 -1
- package/dist/locales/admin/ko.js +23 -0
- package/dist/locales/admin/ko.js.map +1 -1
- package/dist/locales/admin/zh.js +23 -0
- package/dist/locales/admin/zh.js.map +1 -1
- package/dist/locales/discovery/de.js +11 -0
- package/dist/locales/discovery/de.js.map +1 -1
- package/dist/locales/discovery/en.d.ts +11 -0
- package/dist/locales/discovery/en.js +11 -0
- package/dist/locales/discovery/en.js.map +1 -1
- package/dist/locales/discovery/es.js +11 -0
- package/dist/locales/discovery/es.js.map +1 -1
- package/dist/locales/discovery/ja.js +11 -0
- package/dist/locales/discovery/ja.js.map +1 -1
- package/dist/locales/discovery/ko.js +11 -0
- package/dist/locales/discovery/ko.js.map +1 -1
- package/dist/locales/discovery/zh.js +11 -0
- package/dist/locales/discovery/zh.js.map +1 -1
- package/dist/locales/en.d.ts +34 -0
- package/dist/locales/social/en.js +2 -2
- package/dist/locales/social/en.js.map +1 -1
- package/dist/react/comments.d.ts +2 -1
- package/dist/react/comments.js +10 -8
- package/dist/react/comments.js.map +1 -1
- package/dist/react/folder.js +39 -39
- package/dist/react/folder.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/page-review.d.ts +14 -0
- package/dist/react/page-review.js +36 -0
- package/dist/react/page-review.js.map +1 -0
- package/dist/react/public.d.ts +3 -1
- package/dist/react/public.js +76 -72
- package/dist/react/public.js.map +1 -1
- package/dist/react/resources.d.ts +5 -13
- package/dist/react/resources.js +58 -49
- package/dist/react/resources.js.map +1 -1
- package/dist/react/use-resource.d.ts +1 -1
- package/dist/react/use-resource.js +23 -13
- package/dist/react/use-resource.js.map +1 -1
- package/dist/react/versions.js +70 -42
- package/dist/react/versions.js.map +1 -1
- package/dist/react.js +8 -7
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { useMessages as e } from "../../i18n/context.js";
|
|
2
|
+
import { ContentKitUiRoot as t } from "../../scope.js";
|
|
3
|
+
import { Button as n } from "../../ui/button.js";
|
|
4
|
+
import { SortableList as r } from "../sortable-list.js";
|
|
5
|
+
import { Badge as i } from "../../ui/badge.js";
|
|
6
|
+
import { Select as a, SelectContent as o, SelectItem as s, SelectTrigger as c, SelectValue as l } from "../../ui/select.js";
|
|
7
|
+
import { ErrorLine as u, useAction as d } from "../social/parts.js";
|
|
8
|
+
import { LoadFailed as f, Rows as p } from "./shell.js";
|
|
9
|
+
import { usePageReview as m } from "../../react/page-review.js";
|
|
10
|
+
import { useState as h } from "react";
|
|
11
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
12
|
+
import { cn as y } from "cn";
|
|
13
|
+
//#region src/components/admin/page-review.tsx
|
|
14
|
+
function b(e) {
|
|
15
|
+
if (e) try {
|
|
16
|
+
let t = new URL(e, globalThis.location?.href ?? "http://localhost/");
|
|
17
|
+
if (t.protocol === "http:" || t.protocol === "https:") return e;
|
|
18
|
+
} catch {}
|
|
19
|
+
}
|
|
20
|
+
var x = (e) => e.replace(/[_-]+/g, " "), S = (e) => e.source_entry || e.source_name;
|
|
21
|
+
function C({ content: C, version: w, client: T, onError: E, className: D, appearance: O }) {
|
|
22
|
+
let { t: k } = e(), A = m(C, w, { client: T }), j = d("reader.save", E), [M, N] = h(!1), P = A.review, F = P?.pages.some((e) => e.flags.includes("segmented_selection_preserved")) ?? !1, I = (e) => {
|
|
23
|
+
!P || F || j.pending || A.loading || (N(!1), j.run(() => A.update({
|
|
24
|
+
...e,
|
|
25
|
+
revision: P.revision
|
|
26
|
+
})).then((e) => e && N(!0)));
|
|
27
|
+
}, L = (() => {
|
|
28
|
+
if (!P) return A.error ? /* @__PURE__ */ _(f, {
|
|
29
|
+
error: A.error,
|
|
30
|
+
message: k("pageReview.loadFailed"),
|
|
31
|
+
retry: A.reload
|
|
32
|
+
}) : /* @__PURE__ */ _(p, { count: 2 });
|
|
33
|
+
if (!P.pages.length) return /* @__PURE__ */ _("p", {
|
|
34
|
+
className: "text-muted-foreground",
|
|
35
|
+
children: k("pageReview.empty")
|
|
36
|
+
});
|
|
37
|
+
let e = F || j.pending || A.loading;
|
|
38
|
+
return /* @__PURE__ */ v(g, { children: [
|
|
39
|
+
/* @__PURE__ */ _("p", {
|
|
40
|
+
className: "text-muted-foreground",
|
|
41
|
+
children: k("pageReview.summary", {
|
|
42
|
+
selected: P.selected,
|
|
43
|
+
total: P.pages.length,
|
|
44
|
+
flagged: P.flagged
|
|
45
|
+
})
|
|
46
|
+
}),
|
|
47
|
+
F ? /* @__PURE__ */ _("p", {
|
|
48
|
+
role: "status",
|
|
49
|
+
className: "rounded-md border border-border p-2 text-muted-foreground",
|
|
50
|
+
children: k("pageReview.chapterGuard")
|
|
51
|
+
}) : /* @__PURE__ */ _("p", {
|
|
52
|
+
className: "text-xs text-muted-foreground",
|
|
53
|
+
children: k("pageReview.help")
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ _("div", {
|
|
56
|
+
className: "max-h-[32rem] overflow-y-auto rounded-md border border-border p-2",
|
|
57
|
+
children: /* @__PURE__ */ _(r, {
|
|
58
|
+
items: P.pages,
|
|
59
|
+
id: (e) => e.id,
|
|
60
|
+
name: S,
|
|
61
|
+
label: k("pageReview.order"),
|
|
62
|
+
disabled: e || P.pages.length < 2,
|
|
63
|
+
onMove: (e, t) => {
|
|
64
|
+
if (e === t) return;
|
|
65
|
+
let n = P.pages.map((e) => e.id), [r] = n.splice(e, 1);
|
|
66
|
+
n.splice(t, 0, r), I({ order: n });
|
|
67
|
+
},
|
|
68
|
+
children: (t, n, r) => {
|
|
69
|
+
let u = b(t.preview_url), d = b(t.source_url);
|
|
70
|
+
return /* @__PURE__ */ v("div", {
|
|
71
|
+
className: "flex gap-2 rounded-md border border-border p-2",
|
|
72
|
+
"data-ckui": "page-review-row",
|
|
73
|
+
"data-included": t.included,
|
|
74
|
+
"data-mode": t.mode,
|
|
75
|
+
children: [/* @__PURE__ */ v("div", {
|
|
76
|
+
className: "flex shrink-0 flex-col items-center gap-1",
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ _("span", {
|
|
79
|
+
className: "text-xs text-muted-foreground",
|
|
80
|
+
children: r + 1
|
|
81
|
+
}),
|
|
82
|
+
n,
|
|
83
|
+
u && /* @__PURE__ */ _("img", {
|
|
84
|
+
src: u,
|
|
85
|
+
alt: "",
|
|
86
|
+
loading: "lazy",
|
|
87
|
+
decoding: "async",
|
|
88
|
+
className: "h-16 w-12 rounded object-contain"
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
}), /* @__PURE__ */ v("div", {
|
|
92
|
+
className: "grid min-w-0 flex-1 gap-1",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ v("p", {
|
|
95
|
+
className: "break-words",
|
|
96
|
+
children: [/* @__PURE__ */ v("span", {
|
|
97
|
+
className: "text-muted-foreground",
|
|
98
|
+
children: [k("pageReview.original"), " "]
|
|
99
|
+
}), S(t)]
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ v("p", {
|
|
102
|
+
className: "break-words",
|
|
103
|
+
children: [/* @__PURE__ */ v("span", {
|
|
104
|
+
className: "text-muted-foreground",
|
|
105
|
+
children: [k("pageReview.canonical"), " "]
|
|
106
|
+
}), t.id]
|
|
107
|
+
}),
|
|
108
|
+
/* @__PURE__ */ v("div", {
|
|
109
|
+
className: "flex flex-wrap items-center gap-2",
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ _(i, {
|
|
112
|
+
variant: t.included ? "outline" : "secondary",
|
|
113
|
+
children: k(t.included ? "pageReview.included" : "pageReview.excluded")
|
|
114
|
+
}),
|
|
115
|
+
!!t.flags.length && /* @__PURE__ */ _(i, {
|
|
116
|
+
variant: "outline",
|
|
117
|
+
children: k("pageReview.flagged")
|
|
118
|
+
}),
|
|
119
|
+
d && /* @__PURE__ */ _("a", {
|
|
120
|
+
href: d,
|
|
121
|
+
target: "_blank",
|
|
122
|
+
rel: "noopener noreferrer",
|
|
123
|
+
className: "text-xs underline",
|
|
124
|
+
children: k("pageReview.source")
|
|
125
|
+
})
|
|
126
|
+
]
|
|
127
|
+
}),
|
|
128
|
+
/* @__PURE__ */ v("p", {
|
|
129
|
+
className: "text-xs text-muted-foreground",
|
|
130
|
+
children: [
|
|
131
|
+
x(t.decision.reason),
|
|
132
|
+
" · ",
|
|
133
|
+
k("pageReview.confidence", { confidence: x(t.decision.confidence) })
|
|
134
|
+
]
|
|
135
|
+
}),
|
|
136
|
+
!!t.flags.length && /* @__PURE__ */ _("p", {
|
|
137
|
+
className: "text-xs text-muted-foreground",
|
|
138
|
+
children: t.flags.map(x).join(" · ")
|
|
139
|
+
}),
|
|
140
|
+
/* @__PURE__ */ v(a, {
|
|
141
|
+
value: t.mode,
|
|
142
|
+
onValueChange: (e) => {
|
|
143
|
+
e !== t.mode && (e === "auto" || e === "include" || e === "exclude") && I({ pages: [{
|
|
144
|
+
id: t.id,
|
|
145
|
+
mode: e
|
|
146
|
+
}] });
|
|
147
|
+
},
|
|
148
|
+
children: [/* @__PURE__ */ _(c, {
|
|
149
|
+
size: "sm",
|
|
150
|
+
className: "w-44",
|
|
151
|
+
disabled: e,
|
|
152
|
+
"aria-label": k("pageReview.choice", { name: S(t) }),
|
|
153
|
+
children: /* @__PURE__ */ _(l, { children: (e) => k(e === "include" ? "pageReview.include" : e === "exclude" ? "pageReview.exclude" : "pageReview.automatic") })
|
|
154
|
+
}), /* @__PURE__ */ v(o, { children: [
|
|
155
|
+
/* @__PURE__ */ _(s, {
|
|
156
|
+
value: "auto",
|
|
157
|
+
children: k("pageReview.automatic")
|
|
158
|
+
}),
|
|
159
|
+
/* @__PURE__ */ _(s, {
|
|
160
|
+
value: "include",
|
|
161
|
+
children: k("pageReview.include")
|
|
162
|
+
}),
|
|
163
|
+
/* @__PURE__ */ _(s, {
|
|
164
|
+
value: "exclude",
|
|
165
|
+
children: k("pageReview.exclude")
|
|
166
|
+
})
|
|
167
|
+
] })]
|
|
168
|
+
})
|
|
169
|
+
]
|
|
170
|
+
})]
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
})
|
|
174
|
+
}),
|
|
175
|
+
j.error?.status === 409 ? /* @__PURE__ */ _("p", {
|
|
176
|
+
role: "alert",
|
|
177
|
+
className: "text-destructive",
|
|
178
|
+
children: k("pageReview.conflict")
|
|
179
|
+
}) : /* @__PURE__ */ _(u, { error: j.error }),
|
|
180
|
+
A.error && /* @__PURE__ */ _(f, {
|
|
181
|
+
error: A.error,
|
|
182
|
+
message: k("pageReview.loadFailed"),
|
|
183
|
+
retry: A.reload
|
|
184
|
+
}),
|
|
185
|
+
M && /* @__PURE__ */ _("span", {
|
|
186
|
+
role: "status",
|
|
187
|
+
className: "text-muted-foreground",
|
|
188
|
+
children: k("pageReview.saved")
|
|
189
|
+
})
|
|
190
|
+
] });
|
|
191
|
+
})();
|
|
192
|
+
return /* @__PURE__ */ v(t, {
|
|
193
|
+
appearance: O,
|
|
194
|
+
className: y("grid gap-3 text-sm", D),
|
|
195
|
+
"data-ckui": "page-review",
|
|
196
|
+
"aria-busy": j.pending || A.loading,
|
|
197
|
+
children: [/* @__PURE__ */ v("div", {
|
|
198
|
+
className: "flex items-center justify-between gap-2",
|
|
199
|
+
children: [/* @__PURE__ */ _("h4", {
|
|
200
|
+
className: "font-medium",
|
|
201
|
+
children: k("pageReview.title")
|
|
202
|
+
}), /* @__PURE__ */ _(n, {
|
|
203
|
+
type: "button",
|
|
204
|
+
size: "xs",
|
|
205
|
+
variant: "ghost",
|
|
206
|
+
disabled: j.pending || A.loading,
|
|
207
|
+
onClick: A.reload,
|
|
208
|
+
children: k("pageReview.refresh")
|
|
209
|
+
})]
|
|
210
|
+
}), L]
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
//#endregion
|
|
214
|
+
export { C as PageReview };
|
|
215
|
+
|
|
216
|
+
//# sourceMappingURL=page-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-review.js","names":[],"sources":["../../../src/components/admin/page-review.tsx"],"sourcesContent":["import { cn } from \"cn\";\nimport { useState } from \"react\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport type { PageReviewEntry, PageReviewPatch } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport type { ContentKitErrorHandler } from \"../../react/context.js\";\nimport { usePageReview } from \"../../react/page-review.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Badge } from \"#ckui/ui/badge\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"#ckui/ui/select\";\nimport { SortableList } from \"../sortable-list.js\";\nimport { ErrorLine, useAction } from \"../social/parts.js\";\nimport { LoadFailed, Rows } from \"./shell.js\";\n\nexport interface PageReviewProps {\n content: string;\n version: string;\n client?: ContentKitClient;\n onError?: ContentKitErrorHandler;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/** Only link the editor media URLs supplied by the server, never upload paths. */\nfunction imageURL(value?: string): string | undefined {\n if (!value) return;\n try {\n const url = new URL(value, globalThis.location?.href ?? \"http://localhost/\");\n if (url.protocol === \"http:\" || url.protocol === \"https:\") return value;\n } catch { /* An invalid or unsupported URL has no preview. */ }\n}\n\nconst words = (value: string) => value.replace(/[_-]+/g, \" \");\nconst originalName = (page: PageReviewEntry) => page.source_entry || page.source_name;\n\n/** Review automatic page choices without holding up ordinary publication. */\nexport function PageReview({ content, version, client, onError, className, appearance }: PageReviewProps) {\n const { t } = useMessages();\n const r = usePageReview(content, version, { client });\n const save = useAction(\"reader.save\", onError);\n const [saved, setSaved] = useState(false);\n const review = r.review;\n const chapterGuarded = review?.pages.some((page) => page.flags.includes(\"segmented_selection_preserved\")) ?? false;\n const apply = (patch: Omit<PageReviewPatch, \"revision\">) => {\n if (!review || chapterGuarded || save.pending || r.loading) return;\n setSaved(false);\n void save.run(() => r.update({ ...patch, revision: review.revision })).then((result) => result && setSaved(true));\n };\n const body = (() => {\n if (!review) return r.error ? <LoadFailed error={r.error} message={t(\"pageReview.loadFailed\")} retry={r.reload} /> : <Rows count={2} />;\n if (!review.pages.length) return <p className=\"text-muted-foreground\">{t(\"pageReview.empty\")}</p>;\n const disabled = chapterGuarded || save.pending || r.loading;\n return <>\n <p className=\"text-muted-foreground\">{t(\"pageReview.summary\", { selected: review.selected, total: review.pages.length, flagged: review.flagged })}</p>\n {chapterGuarded\n ? <p role=\"status\" className=\"rounded-md border border-border p-2 text-muted-foreground\">{t(\"pageReview.chapterGuard\")}</p>\n : <p className=\"text-xs text-muted-foreground\">{t(\"pageReview.help\")}</p>}\n <div className=\"max-h-[32rem] overflow-y-auto rounded-md border border-border p-2\">\n <SortableList items={review.pages} id={(page) => page.id} name={originalName} label={t(\"pageReview.order\")} disabled={disabled || review.pages.length < 2}\n onMove={(from, to) => {\n if (from === to) return;\n const order = review.pages.map((page) => page.id);\n const [moved] = order.splice(from, 1);\n order.splice(to, 0, moved!);\n apply({ order });\n }}>\n {(page, handle, index) => {\n const preview = imageURL(page.preview_url);\n const source = imageURL(page.source_url);\n return <div className=\"flex gap-2 rounded-md border border-border p-2\" data-ckui=\"page-review-row\" data-included={page.included} data-mode={page.mode}>\n <div className=\"flex shrink-0 flex-col items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">{index + 1}</span>\n {handle}\n {preview && <img src={preview} alt=\"\" loading=\"lazy\" decoding=\"async\" className=\"h-16 w-12 rounded object-contain\" />}\n </div>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <p className=\"break-words\"><span className=\"text-muted-foreground\">{t(\"pageReview.original\")} </span>{originalName(page)}</p>\n <p className=\"break-words\"><span className=\"text-muted-foreground\">{t(\"pageReview.canonical\")} </span>{page.id}</p>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant={page.included ? \"outline\" : \"secondary\"}>{t(page.included ? \"pageReview.included\" : \"pageReview.excluded\")}</Badge>\n {!!page.flags.length && <Badge variant=\"outline\">{t(\"pageReview.flagged\")}</Badge>}\n {source && <a href={source} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-xs underline\">{t(\"pageReview.source\")}</a>}\n </div>\n <p className=\"text-xs text-muted-foreground\">{words(page.decision.reason)} · {t(\"pageReview.confidence\", { confidence: words(page.decision.confidence) })}</p>\n {!!page.flags.length && <p className=\"text-xs text-muted-foreground\">{page.flags.map(words).join(\" · \")}</p>}\n <Select value={page.mode} onValueChange={(mode) => {\n if (mode !== page.mode && (mode === \"auto\" || mode === \"include\" || mode === \"exclude\")) apply({ pages: [{ id: page.id, mode }] });\n }}>\n <SelectTrigger size=\"sm\" className=\"w-44\" disabled={disabled} aria-label={t(\"pageReview.choice\", { name: originalName(page) })}>\n <SelectValue>{(mode: string) => t(mode === \"include\" ? \"pageReview.include\" : mode === \"exclude\" ? \"pageReview.exclude\" : \"pageReview.automatic\")}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"auto\">{t(\"pageReview.automatic\")}</SelectItem>\n <SelectItem value=\"include\">{t(\"pageReview.include\")}</SelectItem>\n <SelectItem value=\"exclude\">{t(\"pageReview.exclude\")}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>;\n }}\n </SortableList>\n </div>\n {save.error?.status === 409 ? <p role=\"alert\" className=\"text-destructive\">{t(\"pageReview.conflict\")}</p> : <ErrorLine error={save.error} />}\n {r.error && <LoadFailed error={r.error} message={t(\"pageReview.loadFailed\")} retry={r.reload} />}\n {saved && <span role=\"status\" className=\"text-muted-foreground\">{t(\"pageReview.saved\")}</span>}\n </>;\n })();\n return <ContentKitUiRoot appearance={appearance} className={cn(\"grid gap-3 text-sm\", className)} data-ckui=\"page-review\" aria-busy={save.pending || r.loading}>\n <div className=\"flex items-center justify-between gap-2\">\n <h4 className=\"font-medium\">{t(\"pageReview.title\")}</h4>\n <Button type=\"button\" size=\"xs\" variant=\"ghost\" disabled={save.pending || r.loading} onClick={r.reload}>{t(\"pageReview.refresh\")}</Button>\n </div>\n {body}\n </ContentKitUiRoot>;\n}\n"],"mappings":"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"}
|