@openrails/contentkit-ui 0.104.0-rc.1 → 0.104.0-rc.3
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 +6 -6
- package/dist/client/beacons.js +4 -1
- package/dist/client/beacons.js.map +1 -1
- package/dist/client/contents.d.ts +9 -1
- package/dist/client/contents.js +73 -55
- package/dist/client/contents.js.map +1 -1
- package/dist/client/discovery.d.ts +6 -2
- package/dist/client/discovery.js +1 -1
- package/dist/client/discovery.js.map +1 -1
- package/dist/client/generated/error-codes.d.ts +1 -1
- package/dist/client/generated/error-codes.js +4 -0
- package/dist/client/generated/error-codes.js.map +1 -1
- package/dist/client/generated/routes.d.ts +43 -30
- package/dist/client/generated/routes.js +70 -63
- package/dist/client/generated/routes.js.map +1 -1
- package/dist/client/generated/wire.d.ts +36 -74
- package/dist/client/generated/wire.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/media/windows.d.ts +2 -0
- package/dist/client/media/windows.js +4 -1
- package/dist/client/media/windows.js.map +1 -1
- package/dist/client/stats.d.ts +4 -20
- package/dist/client/stats.js +0 -11
- package/dist/client/stats.js.map +1 -1
- package/dist/client/versions.d.ts +8 -6
- package/dist/client/versions.js +15 -10
- package/dist/client/versions.js.map +1 -1
- package/dist/components/admin/bulk-drafts.d.ts +17 -0
- package/dist/components/admin/bulk-drafts.js +41 -0
- package/dist/components/admin/bulk-drafts.js.map +1 -0
- package/dist/components/admin/content-admin.d.ts +1 -1
- package/dist/components/admin/content-admin.js.map +1 -1
- package/dist/components/admin/content-manager.d.ts +11 -3
- package/dist/components/admin/content-manager.js +739 -380
- package/dist/components/admin/content-manager.js.map +1 -1
- package/dist/components/admin/group-manager.d.ts +8 -3
- package/dist/components/admin/group-manager.js +218 -146
- package/dist/components/admin/group-manager.js.map +1 -1
- package/dist/components/admin/page-notices.d.ts +16 -0
- package/dist/components/admin/page-notices.js +113 -0
- package/dist/components/admin/page-notices.js.map +1 -0
- package/dist/components/admin/page-picker.d.ts +38 -0
- package/dist/components/admin/page-picker.js +159 -0
- package/dist/components/admin/page-picker.js.map +1 -0
- package/dist/components/admin/reader-content-editor.js +537 -500
- package/dist/components/admin/reader-content-editor.js.map +1 -1
- package/dist/components/admin/reader-manifest.js +181 -179
- package/dist/components/admin/reader-manifest.js.map +1 -1
- package/dist/components/admin/shell.d.ts +10 -2
- package/dist/components/admin/shell.js +114 -42
- package/dist/components/admin/shell.js.map +1 -1
- package/dist/components/admin/stats-dashboard.d.ts +4 -9
- package/dist/components/admin/stats-dashboard.js +300 -202
- package/dist/components/admin/stats-dashboard.js.map +1 -1
- package/dist/components/admin/upload-queue.d.ts +14 -0
- package/dist/components/admin/upload-queue.js +115 -98
- package/dist/components/admin/upload-queue.js.map +1 -1
- package/dist/components/content/card.d.ts +31 -3
- package/dist/components/content/card.js +324 -158
- package/dist/components/content/card.js.map +1 -1
- package/dist/components/content/daily-releases.js +14 -12
- package/dist/components/content/daily-releases.js.map +1 -1
- package/dist/components/content/editor-save.js +27 -25
- package/dist/components/content/editor-save.js.map +1 -1
- package/dist/components/content/editors.js +274 -253
- package/dist/components/content/editors.js.map +1 -1
- package/dist/components/content/favorites.d.ts +1 -1
- package/dist/components/content/favorites.js +36 -22
- package/dist/components/content/favorites.js.map +1 -1
- package/dist/components/content/grid.d.ts +11 -4
- package/dist/components/content/grid.js +52 -43
- package/dist/components/content/grid.js.map +1 -1
- package/dist/components/content/history.js +83 -63
- package/dist/components/content/history.js.map +1 -1
- package/dist/components/content/index.d.ts +5 -3
- package/dist/components/content/listing.d.ts +14 -3
- package/dist/components/content/listing.js +65 -56
- package/dist/components/content/listing.js.map +1 -1
- package/dist/components/content/offer-fields.js +6 -6
- package/dist/components/content/paged-grid.d.ts +10 -0
- package/dist/components/content/paged-grid.js +116 -0
- package/dist/components/content/paged-grid.js.map +1 -0
- package/dist/components/content/pagination.d.ts +19 -0
- package/dist/components/content/pagination.js +97 -0
- package/dist/components/content/pagination.js.map +1 -0
- package/dist/components/content/paywall.d.ts +9 -0
- package/dist/components/content/paywall.js +27 -3
- package/dist/components/content/paywall.js.map +1 -1
- package/dist/components/content/post-list.d.ts +37 -0
- package/dist/components/content/post-list.js +203 -0
- package/dist/components/content/post-list.js.map +1 -0
- package/dist/components/content/reader-settings.d.ts +2 -0
- package/dist/components/content/reader-settings.js +1 -1
- package/dist/components/content/reader-settings.js.map +1 -1
- package/dist/components/groups/banner.d.ts +6 -2
- package/dist/components/groups/banner.js +79 -61
- package/dist/components/groups/banner.js.map +1 -1
- package/dist/components/groups/directory.d.ts +12 -2
- package/dist/components/groups/directory.js +168 -105
- package/dist/components/groups/directory.js.map +1 -1
- package/dist/components/groups/editor.js +10 -10
- package/dist/components/groups/editor.js.map +1 -1
- package/dist/components/groups/entity-chips.d.ts +61 -0
- package/dist/components/groups/entity-chips.js +382 -0
- package/dist/components/groups/entity-chips.js.map +1 -0
- package/dist/components/groups/group-members.d.ts +29 -0
- package/dist/components/groups/group-members.js +474 -0
- package/dist/components/groups/group-members.js.map +1 -0
- package/dist/components/groups/header.js +53 -45
- package/dist/components/groups/header.js.map +1 -1
- package/dist/components/groups/index.d.ts +3 -1
- package/dist/components/groups/memberships.d.ts +3 -36
- package/dist/components/groups/memberships.js +105 -480
- package/dist/components/groups/memberships.js.map +1 -1
- package/dist/components/groups/scoped.d.ts +23 -0
- package/dist/components/groups/scoped.js +92 -0
- package/dist/components/groups/scoped.js.map +1 -0
- package/dist/components/media-folder-editor.d.ts +5 -0
- package/dist/components/media-folder-editor.js +418 -230
- package/dist/components/media-folder-editor.js.map +1 -1
- package/dist/components/social/poll.js +57 -48
- package/dist/components/social/poll.js.map +1 -1
- package/dist/components/sortable-list.d.ts +5 -1
- package/dist/components/sortable-list.js +97 -81
- package/dist/components/sortable-list.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +41 -37
- package/dist/locales/admin/de.js +78 -45
- package/dist/locales/admin/de.js.map +1 -1
- package/dist/locales/admin/en.d.ts +74 -41
- package/dist/locales/admin/en.js +78 -45
- package/dist/locales/admin/en.js.map +1 -1
- package/dist/locales/admin/es.js +78 -45
- package/dist/locales/admin/es.js.map +1 -1
- package/dist/locales/admin/ja.js +78 -45
- package/dist/locales/admin/ja.js.map +1 -1
- package/dist/locales/admin/ko.js +78 -45
- package/dist/locales/admin/ko.js.map +1 -1
- package/dist/locales/admin/zh.js +78 -45
- package/dist/locales/admin/zh.js.map +1 -1
- package/dist/locales/de.js +2 -0
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/discovery/de.js +25 -1
- package/dist/locales/discovery/de.js.map +1 -1
- package/dist/locales/discovery/en.d.ts +24 -0
- package/dist/locales/discovery/en.js +25 -1
- package/dist/locales/discovery/en.js.map +1 -1
- package/dist/locales/discovery/es.js +25 -1
- package/dist/locales/discovery/es.js.map +1 -1
- package/dist/locales/discovery/ja.js +25 -1
- package/dist/locales/discovery/ja.js.map +1 -1
- package/dist/locales/discovery/ko.js +25 -1
- package/dist/locales/discovery/ko.js.map +1 -1
- package/dist/locales/discovery/zh.js +25 -1
- package/dist/locales/discovery/zh.js.map +1 -1
- package/dist/locales/en.d.ts +120 -43
- package/dist/locales/en.js +2 -0
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +2 -0
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/groups/de.js +22 -4
- package/dist/locales/groups/de.js.map +1 -1
- package/dist/locales/groups/en.d.ts +20 -2
- package/dist/locales/groups/en.js +22 -4
- package/dist/locales/groups/en.js.map +1 -1
- package/dist/locales/groups/es.js +22 -4
- package/dist/locales/groups/es.js.map +1 -1
- package/dist/locales/groups/ja.js +22 -4
- package/dist/locales/groups/ja.js.map +1 -1
- package/dist/locales/groups/ko.js +22 -4
- package/dist/locales/groups/ko.js.map +1 -1
- package/dist/locales/groups/zh.js +22 -4
- package/dist/locales/groups/zh.js.map +1 -1
- package/dist/locales/ja.js +2 -0
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +2 -0
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/zh.js +2 -0
- package/dist/locales/zh.js.map +1 -1
- package/dist/react/contents.js +1 -1
- package/dist/react/contents.js.map +1 -1
- package/dist/react/discovery.d.ts +16 -0
- package/dist/react/discovery.js +69 -37
- package/dist/react/discovery.js.map +1 -1
- package/dist/react/groups.d.ts +19 -3
- package/dist/react/groups.js +49 -22
- package/dist/react/groups.js.map +1 -1
- package/dist/react/index.d.ts +6 -4
- package/dist/react/page-notices.d.ts +13 -0
- package/dist/react/page-notices.js +38 -0
- package/dist/react/page-notices.js.map +1 -0
- package/dist/react/post-reads.d.ts +23 -0
- package/dist/react/post-reads.js +90 -0
- package/dist/react/post-reads.js.map +1 -0
- package/dist/react/remembered-sort.d.ts +5 -0
- package/dist/react/remembered-sort.js +29 -0
- package/dist/react/remembered-sort.js.map +1 -0
- package/dist/react/resources.js +2 -2
- package/dist/react/resources.js.map +1 -1
- package/dist/react/stats.d.ts +3 -7
- package/dist/react/stats.js +2 -6
- package/dist/react/stats.js.map +1 -1
- package/dist/react/use-engagement.d.ts +2 -0
- package/dist/react/use-engagement.js +40 -34
- package/dist/react/use-engagement.js.map +1 -1
- package/dist/react.js +29 -27
- package/dist/styles.css +1 -1
- package/dist/urls/index.d.ts +1 -1
- package/dist/urls.js +2 -2
- package/dist/urls.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/admin/page-review.d.ts +0 -13
- package/dist/components/admin/page-review.js +0 -225
- package/dist/components/admin/page-review.js.map +0 -1
- package/dist/react/page-review.d.ts +0 -14
- package/dist/react/page-review.js +0 -37
- package/dist/react/page-review.js.map +0 -1
|
@@ -5,127 +5,135 @@ import { Button as a } from "../../ui/button.js";
|
|
|
5
5
|
import { Skeleton as o } from "../../ui/skeleton.js";
|
|
6
6
|
import { contentError as s, formatDate as c } from "../social/parts.js";
|
|
7
7
|
import { GroupCover as l, GroupLink as u, labelOf as d } from "./parts.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { ScopedGroups as f } from "./scoped.js";
|
|
9
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
10
|
+
import { cn as h } from "cn";
|
|
10
11
|
//#region src/components/groups/header.tsx
|
|
11
|
-
function
|
|
12
|
+
function g(e, t, n, r) {
|
|
12
13
|
return typeof n == "boolean" ? e.t(n ? "groups.yes" : "groups.no") : t?.type === "time" && typeof n == "string" ? c(e, n) : t?.type === "int" && typeof n == "number" ? new Intl.NumberFormat(e.language).format(n) : t?.type === "enum" && typeof n == "string" ? d(r, n) : String(n);
|
|
13
14
|
}
|
|
14
|
-
function
|
|
15
|
-
let
|
|
15
|
+
function _(c) {
|
|
16
|
+
let _ = t(), { t: v } = _, y = e(), b = r(c.group ? null : c.id, {
|
|
16
17
|
language: c.language,
|
|
17
18
|
client: c.client
|
|
18
|
-
}), { kinds:
|
|
19
|
+
}), { kinds: x } = i({ client: c.client }), S = c.group ?? b.group, C = (e) => /* @__PURE__ */ p(n, {
|
|
19
20
|
appearance: c.appearance,
|
|
20
|
-
className:
|
|
21
|
+
className: h("grid gap-4 text-sm", c.className),
|
|
21
22
|
"data-ckui": "group-header",
|
|
22
23
|
children: e
|
|
23
24
|
});
|
|
24
|
-
if (!
|
|
25
|
+
if (!S) return b.error ? C(/* @__PURE__ */ m("div", {
|
|
25
26
|
role: "alert",
|
|
26
27
|
className: "grid justify-items-start gap-2",
|
|
27
|
-
children: [/* @__PURE__ */
|
|
28
|
+
children: [/* @__PURE__ */ p("p", {
|
|
28
29
|
className: "text-destructive",
|
|
29
|
-
children: s(
|
|
30
|
-
}), /* @__PURE__ */
|
|
30
|
+
children: s(_, b.error)
|
|
31
|
+
}), /* @__PURE__ */ p(a, {
|
|
31
32
|
size: "sm",
|
|
32
33
|
variant: "outline",
|
|
33
|
-
onClick:
|
|
34
|
-
children:
|
|
34
|
+
onClick: b.reload,
|
|
35
|
+
children: v("common.retry")
|
|
35
36
|
})]
|
|
36
|
-
})) :
|
|
37
|
-
let
|
|
38
|
-
return
|
|
37
|
+
})) : C(/* @__PURE__ */ p(o, { className: "h-32 w-full" }));
|
|
38
|
+
let w = c.language ?? S.name_language, T = S.text.find((e) => e.language === w) ?? S.text.find((e) => e.description), E = S.names.filter((e) => e.name !== S.name), D = x?.entity_kinds?.[S.kind]?.attributes ?? {}, O = Object.entries(S.attributes).filter(([, e]) => e != null && e !== ""), k = S.counts.filter((e) => e.language === (c.language ?? "")).reduce((e, t) => e + t.count, 0);
|
|
39
|
+
return C(/* @__PURE__ */ m("div", {
|
|
39
40
|
className: "grid gap-4 sm:grid-cols-[10rem_minmax(0,1fr)]",
|
|
40
|
-
"data-kind":
|
|
41
|
-
children: [/* @__PURE__ */
|
|
42
|
-
group:
|
|
41
|
+
"data-kind": S.kind,
|
|
42
|
+
children: [/* @__PURE__ */ p(l, {
|
|
43
|
+
group: S,
|
|
43
44
|
className: "aspect-[3/4] w-32 sm:w-40"
|
|
44
|
-
}), /* @__PURE__ */
|
|
45
|
+
}), /* @__PURE__ */ m("div", {
|
|
45
46
|
className: "grid content-start gap-3",
|
|
46
47
|
children: [
|
|
47
|
-
/* @__PURE__ */
|
|
48
|
+
/* @__PURE__ */ m("div", {
|
|
48
49
|
className: "grid gap-1",
|
|
49
50
|
children: [
|
|
50
|
-
(
|
|
51
|
+
(S.parent || S.scope) && /* @__PURE__ */ p("p", {
|
|
51
52
|
className: "text-xs text-muted-foreground",
|
|
52
53
|
"data-ckui": "group-parent",
|
|
53
|
-
children: [
|
|
54
|
+
children: [S.scope, S.parent].filter((e, t, n) => !!e && n.findIndex((t) => t?.id === e.id) === t).map((e, t) => /* @__PURE__ */ m("span", { children: [t > 0 && " · ", /* @__PURE__ */ p(u, {
|
|
54
55
|
group: e,
|
|
55
56
|
href: c.href,
|
|
56
57
|
className: "hover:underline",
|
|
57
58
|
children: e.name || e.slug
|
|
58
59
|
})] }, e.id))
|
|
59
60
|
}),
|
|
60
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ p("h1", {
|
|
61
62
|
className: "text-xl font-semibold break-words",
|
|
62
|
-
children:
|
|
63
|
+
children: S.name || S.slug
|
|
63
64
|
}),
|
|
64
|
-
/* @__PURE__ */
|
|
65
|
+
/* @__PURE__ */ p("p", {
|
|
65
66
|
className: "text-xs text-muted-foreground tabular-nums",
|
|
66
|
-
children:
|
|
67
|
+
children: _.plural("groups.items", k)
|
|
67
68
|
})
|
|
68
69
|
]
|
|
69
70
|
}),
|
|
70
|
-
|
|
71
|
+
E.length > 0 && /* @__PURE__ */ m("p", {
|
|
71
72
|
className: "text-muted-foreground",
|
|
72
73
|
"data-ckui": "group-names",
|
|
73
|
-
children: [/* @__PURE__ */
|
|
74
|
+
children: [/* @__PURE__ */ m("span", {
|
|
74
75
|
className: "sr-only",
|
|
75
|
-
children: [
|
|
76
|
-
}),
|
|
76
|
+
children: [v("groups.alsoKnownAs"), " "]
|
|
77
|
+
}), E.map((e, t) => /* @__PURE__ */ m("span", {
|
|
77
78
|
lang: e.language,
|
|
78
79
|
children: [
|
|
79
80
|
t > 0 && " · ",
|
|
80
81
|
e.name,
|
|
81
|
-
e.kind === "name" && /* @__PURE__ */
|
|
82
|
+
e.kind === "name" && /* @__PURE__ */ m("span", {
|
|
82
83
|
className: "text-xs",
|
|
83
84
|
children: [
|
|
84
85
|
" (",
|
|
85
|
-
|
|
86
|
+
y(e.language),
|
|
86
87
|
")"
|
|
87
88
|
]
|
|
88
89
|
})
|
|
89
90
|
]
|
|
90
91
|
}, `${e.language}:${e.name}`))]
|
|
91
92
|
}),
|
|
92
|
-
|
|
93
|
+
T?.description && /* @__PURE__ */ p("p", {
|
|
93
94
|
className: "break-words whitespace-pre-line",
|
|
94
|
-
lang:
|
|
95
|
+
lang: T.language,
|
|
95
96
|
"data-ckui": "group-description",
|
|
96
|
-
children:
|
|
97
|
+
children: T.description
|
|
97
98
|
}),
|
|
98
|
-
|
|
99
|
+
O.length > 0 && /* @__PURE__ */ p("dl", {
|
|
99
100
|
className: "grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1",
|
|
100
101
|
"data-ckui": "group-attributes",
|
|
101
|
-
children:
|
|
102
|
+
children: O.map(([e, t]) => /* @__PURE__ */ m("div", {
|
|
102
103
|
className: "contents",
|
|
103
|
-
children: [/* @__PURE__ */
|
|
104
|
+
children: [/* @__PURE__ */ p("dt", {
|
|
104
105
|
className: "text-muted-foreground",
|
|
105
106
|
children: d(c.labels, e)
|
|
106
|
-
}), /* @__PURE__ */
|
|
107
|
+
}), /* @__PURE__ */ p("dd", {
|
|
107
108
|
className: "break-words",
|
|
108
|
-
children:
|
|
109
|
+
children: g(_, D[e], t, c.labels)
|
|
109
110
|
})]
|
|
110
111
|
}, e))
|
|
111
112
|
}),
|
|
112
|
-
|
|
113
|
-
"aria-label":
|
|
113
|
+
S.children.length > 0 && /* @__PURE__ */ p("nav", {
|
|
114
|
+
"aria-label": v("groups.children"),
|
|
114
115
|
className: "flex flex-wrap gap-2",
|
|
115
116
|
"data-ckui": "group-children",
|
|
116
|
-
children:
|
|
117
|
+
children: S.children.map((e) => /* @__PURE__ */ p(u, {
|
|
117
118
|
group: e,
|
|
118
119
|
href: c.href,
|
|
119
120
|
className: "rounded-md border border-border px-2 py-1 hover:bg-muted",
|
|
120
121
|
children: e.name || e.slug
|
|
121
122
|
}, e.id))
|
|
122
123
|
}),
|
|
124
|
+
/* @__PURE__ */ p(f, {
|
|
125
|
+
group: S,
|
|
126
|
+
language: c.language,
|
|
127
|
+
labels: c.labels,
|
|
128
|
+
href: c.href,
|
|
129
|
+
client: c.client
|
|
130
|
+
}),
|
|
123
131
|
c.children
|
|
124
132
|
]
|
|
125
133
|
})]
|
|
126
134
|
}));
|
|
127
135
|
}
|
|
128
136
|
//#endregion
|
|
129
|
-
export {
|
|
137
|
+
export { _ as GroupHeader, g as formatAttribute };
|
|
130
138
|
|
|
131
139
|
//# sourceMappingURL=header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","names":[],"sources":["../../../src/components/groups/header.tsx"],"sourcesContent":["import { cn } from \"cn\";\nimport type { ReactNode } from \"react\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport type { Attribute, GroupDetail } from \"../../client/generated/wire.js\";\nimport { useLanguageName, useMessages } from \"../../i18n/context.js\";\nimport type { Translator } from \"../../i18n/messages.js\";\nimport { useGroup, useKinds } from \"../../react/groups.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { contentError, formatDate } from \"../social/parts.js\";\nimport { GroupCover, GroupLink, labelOf, type GroupLike, type Labels } from \"./parts.js\";\n\nexport interface GroupHeaderProps {\n /** The group the host already read; or give id. */\n group?: GroupDetail;\n id?: string;\n /** Text, names and counts in this language; default the provider's. */\n language?: string;\n labels?: Labels;\n /** A group's link (parent, scope, children); default its canonical path. */\n href?: (group: GroupLike) => string | undefined;\n /** Below the description: the host's actions. */\n children?: ReactNode;\n client?: ContentKitClient;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/** A value as its attribute's type shows it. */\nexport function formatAttribute(m: Translator, spec: Attribute | undefined, value: unknown, labels?: Labels): string {\n if (typeof value === \"boolean\") return m.t(value ? \"groups.yes\" : \"groups.no\");\n if (spec?.type === \"time\" && typeof value === \"string\") return formatDate(m, value);\n if (spec?.type === \"int\" && typeof value === \"number\") return new Intl.NumberFormat(m.language).format(value);\n if (spec?.type === \"enum\" && typeof value === \"string\") return labelOf(labels, value);\n return String(value);\n}\n\n/** A group page's header: cover, name, other names, description, attributes, parent, scope, sub-groups and count. */\nexport function GroupHeader(p: GroupHeaderProps) {\n const m = useMessages();\n const { t } = m;\n const languageName = useLanguageName();\n const read = useGroup(p.group ? null : p.id, { language: p.language, client: p.client });\n const { kinds } = useKinds({ client: p.client });\n const g = p.group ?? read.group;\n const root = (children: ReactNode) => (\n <ContentKitUiRoot appearance={p.appearance} className={cn(\"grid gap-4 text-sm\", p.className)} data-ckui=\"group-header\">\n {children}\n </ContentKitUiRoot>\n );\n if (!g) {\n if (read.error)\n return root(\n <div role=\"alert\" className=\"grid justify-items-start gap-2\">\n <p className=\"text-destructive\">{contentError(m, read.error)}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={read.reload}>\n {t(\"common.retry\")}\n </Button>\n </div>,\n );\n return root(<Skeleton className=\"h-32 w-full\" />);\n }\n const lang = p.language ?? g.name_language;\n const text = g.text.find((x) => x.language === lang) ?? g.text.find((x) => x.description);\n const others = g.names.filter((n) => n.name !== g.name);\n const declared = kinds?.entity_kinds?.[g.kind]?.attributes ?? {};\n const attributes = Object.entries(g.attributes).filter(([, v]) => v !== null && v !== undefined && v !== \"\");\n const count = g.counts.filter((c) => c.language === (p.language ?? \"\")).reduce((n, c) => n + c.count, 0);\n return root(\n <div className=\"grid gap-4 sm:grid-cols-[10rem_minmax(0,1fr)]\" data-kind={g.kind}>\n <GroupCover group={g} className=\"aspect-[3/4] w-32 sm:w-40\" />\n <div className=\"grid content-start gap-3\">\n <div className=\"grid gap-1\">\n {(g.parent || g.scope) && (\n <p className=\"text-xs text-muted-foreground\" data-ckui=\"group-parent\">\n {[g.scope, g.parent]\n .filter((x, i, all): x is NonNullable<typeof x> => !!x && all.findIndex((y) => y?.id === x.id) === i)\n .map((x, i) => (\n <span key={x.id}>\n {i > 0 && \" · \"}\n <GroupLink group={x} href={p.href} className=\"hover:underline\">\n {x.name || x.slug}\n </GroupLink>\n </span>\n ))}\n </p>\n )}\n <h1 className=\"text-xl font-semibold break-words\">{g.name || g.slug}</h1>\n <p className=\"text-xs text-muted-foreground tabular-nums\">{m.plural(\"groups.items\", count)}</p>\n </div>\n {others.length > 0 && (\n <p className=\"text-muted-foreground\" data-ckui=\"group-names\">\n <span className=\"sr-only\">{t(\"groups.alsoKnownAs\")} </span>\n {others.map((n, i) => (\n <span key={`${n.language}:${n.name}`} lang={n.language}>\n {i > 0 && \" · \"}\n {n.name}\n {n.kind === \"name\" && <span className=\"text-xs\"> ({languageName(n.language)})</span>}\n </span>\n ))}\n </p>\n )}\n {text?.description && (\n <p className=\"break-words whitespace-pre-line\" lang={text.language} data-ckui=\"group-description\">\n {text.description}\n </p>\n )}\n {attributes.length > 0 && (\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1\" data-ckui=\"group-attributes\">\n {attributes.map(([name, v]) => (\n <div key={name} className=\"contents\">\n <dt className=\"text-muted-foreground\">{labelOf(p.labels, name)}</dt>\n <dd className=\"break-words\">{formatAttribute(m, declared[name], v, p.labels)}</dd>\n </div>\n ))}\n </dl>\n )}\n {g.children.length > 0 && (\n <nav aria-label={t(\"groups.children\")} className=\"flex flex-wrap gap-2\" data-ckui=\"group-children\">\n {g.children.map((c) => (\n <GroupLink key={c.id} group={c} href={p.href} className=\"rounded-md border border-border px-2 py-1 hover:bg-muted\">\n {c.name || c.slug}\n </GroupLink>\n ))}\n </nav>\n )}\n {p.children}\n </div>\n </div>,\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"header.js","names":[],"sources":["../../../src/components/groups/header.tsx"],"sourcesContent":["import { cn } from \"cn\";\nimport type { ReactNode } from \"react\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport type { Attribute, GroupDetail } from \"../../client/generated/wire.js\";\nimport { useLanguageName, useMessages } from \"../../i18n/context.js\";\nimport type { Translator } from \"../../i18n/messages.js\";\nimport { useGroup, useKinds } from \"../../react/groups.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { contentError, formatDate } from \"../social/parts.js\";\nimport { GroupCover, GroupLink, labelOf, type GroupLike, type Labels } from \"./parts.js\";\nimport { ScopedGroups } from \"./scoped.js\";\n\nexport interface GroupHeaderProps {\n /** The group the host already read; or give id. */\n group?: GroupDetail;\n id?: string;\n /** Text, names and counts in this language; default the provider's. */\n language?: string;\n labels?: Labels;\n /** A group's link (parent, scope, children); default its canonical path. */\n href?: (group: GroupLike) => string | undefined;\n /** Below the description: the host's actions. */\n children?: ReactNode;\n client?: ContentKitClient;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/** A value as its attribute's type shows it. */\nexport function formatAttribute(m: Translator, spec: Attribute | undefined, value: unknown, labels?: Labels): string {\n if (typeof value === \"boolean\") return m.t(value ? \"groups.yes\" : \"groups.no\");\n if (spec?.type === \"time\" && typeof value === \"string\") return formatDate(m, value);\n if (spec?.type === \"int\" && typeof value === \"number\") return new Intl.NumberFormat(m.language).format(value);\n if (spec?.type === \"enum\" && typeof value === \"string\") return labelOf(labels, value);\n return String(value);\n}\n\n/** A group page's header: cover, name, other names, description, attributes, parent, scope, sub-groups and count. */\nexport function GroupHeader(p: GroupHeaderProps) {\n const m = useMessages();\n const { t } = m;\n const languageName = useLanguageName();\n const read = useGroup(p.group ? null : p.id, { language: p.language, client: p.client });\n const { kinds } = useKinds({ client: p.client });\n const g = p.group ?? read.group;\n const root = (children: ReactNode) => (\n <ContentKitUiRoot appearance={p.appearance} className={cn(\"grid gap-4 text-sm\", p.className)} data-ckui=\"group-header\">\n {children}\n </ContentKitUiRoot>\n );\n if (!g) {\n if (read.error)\n return root(\n <div role=\"alert\" className=\"grid justify-items-start gap-2\">\n <p className=\"text-destructive\">{contentError(m, read.error)}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={read.reload}>\n {t(\"common.retry\")}\n </Button>\n </div>,\n );\n return root(<Skeleton className=\"h-32 w-full\" />);\n }\n const lang = p.language ?? g.name_language;\n const text = g.text.find((x) => x.language === lang) ?? g.text.find((x) => x.description);\n const others = g.names.filter((n) => n.name !== g.name);\n const declared = kinds?.entity_kinds?.[g.kind]?.attributes ?? {};\n const attributes = Object.entries(g.attributes).filter(([, v]) => v !== null && v !== undefined && v !== \"\");\n const count = g.counts.filter((c) => c.language === (p.language ?? \"\")).reduce((n, c) => n + c.count, 0);\n return root(\n <div className=\"grid gap-4 sm:grid-cols-[10rem_minmax(0,1fr)]\" data-kind={g.kind}>\n <GroupCover group={g} className=\"aspect-[3/4] w-32 sm:w-40\" />\n <div className=\"grid content-start gap-3\">\n <div className=\"grid gap-1\">\n {(g.parent || g.scope) && (\n <p className=\"text-xs text-muted-foreground\" data-ckui=\"group-parent\">\n {[g.scope, g.parent]\n .filter((x, i, all): x is NonNullable<typeof x> => !!x && all.findIndex((y) => y?.id === x.id) === i)\n .map((x, i) => (\n <span key={x.id}>\n {i > 0 && \" · \"}\n <GroupLink group={x} href={p.href} className=\"hover:underline\">\n {x.name || x.slug}\n </GroupLink>\n </span>\n ))}\n </p>\n )}\n <h1 className=\"text-xl font-semibold break-words\">{g.name || g.slug}</h1>\n <p className=\"text-xs text-muted-foreground tabular-nums\">{m.plural(\"groups.items\", count)}</p>\n </div>\n {others.length > 0 && (\n <p className=\"text-muted-foreground\" data-ckui=\"group-names\">\n <span className=\"sr-only\">{t(\"groups.alsoKnownAs\")} </span>\n {others.map((n, i) => (\n <span key={`${n.language}:${n.name}`} lang={n.language}>\n {i > 0 && \" · \"}\n {n.name}\n {n.kind === \"name\" && <span className=\"text-xs\"> ({languageName(n.language)})</span>}\n </span>\n ))}\n </p>\n )}\n {text?.description && (\n <p className=\"break-words whitespace-pre-line\" lang={text.language} data-ckui=\"group-description\">\n {text.description}\n </p>\n )}\n {attributes.length > 0 && (\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1\" data-ckui=\"group-attributes\">\n {attributes.map(([name, v]) => (\n <div key={name} className=\"contents\">\n <dt className=\"text-muted-foreground\">{labelOf(p.labels, name)}</dt>\n <dd className=\"break-words\">{formatAttribute(m, declared[name], v, p.labels)}</dd>\n </div>\n ))}\n </dl>\n )}\n {g.children.length > 0 && (\n <nav aria-label={t(\"groups.children\")} className=\"flex flex-wrap gap-2\" data-ckui=\"group-children\">\n {g.children.map((c) => (\n <GroupLink key={c.id} group={c} href={p.href} className=\"rounded-md border border-border px-2 py-1 hover:bg-muted\">\n {c.name || c.slug}\n </GroupLink>\n ))}\n </nav>\n )}\n <ScopedGroups group={g} language={p.language} labels={p.labels} href={p.href} client={p.client} />\n {p.children}\n </div>\n </div>,\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { GroupDirectory, type GroupDirectoryProps } from './directory.js';
|
|
2
2
|
export { GroupHeader, formatAttribute, type GroupHeaderProps } from './header.js';
|
|
3
3
|
export { GroupEditor, GroupMergeDialog, type GroupEditorProps, type GroupMergeDialogProps } from './editor.js';
|
|
4
|
-
export { GroupMembers,
|
|
4
|
+
export { GroupMembers, type GroupMembersProps } from './group-members.js';
|
|
5
|
+
export { MembershipEditor, type MembershipEditorProps, type VersionChoice } from './memberships.js';
|
|
5
6
|
export { GroupBanner, GroupImageEditor, MembershipBox, type GroupBannerProps, type GroupImageEditorProps, type MembershipBoxProps } from './banner.js';
|
|
7
|
+
export { ScopedGroups, type ScopedGroupsProps } from './scoped.js';
|
|
6
8
|
export { GroupAvatar, GroupCover, GroupLink, GroupPicker, labelOf, type GroupCoverProps, type GroupLike, type GroupPickerProps, type Labels } from './parts.js';
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
1
|
import { ContentKitUiAppearance } from '../../appearance.js';
|
|
3
2
|
import { ContentKitClient } from '../../client/client.js';
|
|
4
|
-
import { ContentMemberships
|
|
3
|
+
import { ContentMemberships } from '../../client/generated/wire.js';
|
|
5
4
|
import { ContentKitErrorHandler } from '../../react/context.js';
|
|
5
|
+
import { VersionChoice } from './entity-chips.js';
|
|
6
6
|
import { Labels } from './parts.js';
|
|
7
|
-
|
|
8
|
-
export interface VersionChoice {
|
|
9
|
-
id: string;
|
|
10
|
-
label: string;
|
|
11
|
-
}
|
|
7
|
+
export type { VersionChoice } from './entity-chips.js';
|
|
12
8
|
export interface MembershipEditorProps {
|
|
13
9
|
/** The content whose memberships are edited, its versions' included. */
|
|
14
10
|
content: string;
|
|
@@ -36,32 +32,3 @@ export interface MembershipEditorProps {
|
|
|
36
32
|
* content for the kinds shown.
|
|
37
33
|
*/
|
|
38
34
|
export declare function MembershipEditor(p: MembershipEditorProps): import('react').JSX.Element;
|
|
39
|
-
export declare function MembershipRow({ m: x, card, spec, labels, versions, versionLabel, onChange, onRemove, }: {
|
|
40
|
-
m: Membership;
|
|
41
|
-
card?: GroupCard;
|
|
42
|
-
spec: GroupKind;
|
|
43
|
-
labels?: Labels;
|
|
44
|
-
versions?: readonly VersionChoice[];
|
|
45
|
-
versionLabel: (id: string) => string;
|
|
46
|
-
onChange: (patch: Partial<Membership>) => void;
|
|
47
|
-
onRemove: () => void;
|
|
48
|
-
}): import('react').JSX.Element;
|
|
49
|
-
export interface GroupMembersProps {
|
|
50
|
-
group: Pick<GroupDetail, "id" | "kind" | "name" | "slug" | "cover">;
|
|
51
|
-
labels?: Labels;
|
|
52
|
-
/** One member, e.g. a link with its title; default its content id. */
|
|
53
|
-
renderContent?: (member: Membership) => ReactNode;
|
|
54
|
-
/** Select a member's cover as the group's. */
|
|
55
|
-
onUseCover?: (contentId: string) => Promise<unknown>;
|
|
56
|
-
pageSize?: number;
|
|
57
|
-
client?: ContentKitClient;
|
|
58
|
-
onError?: ContentKitErrorHandler;
|
|
59
|
-
className?: string;
|
|
60
|
-
appearance?: ContentKitUiAppearance;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Staff: a group's members in member order: add by content (and version),
|
|
64
|
-
* remove, reorder an ordered group, edit windows, accept proposed members,
|
|
65
|
-
* and use a member's cover as the group's.
|
|
66
|
-
*/
|
|
67
|
-
export declare function GroupMembers(p: GroupMembersProps): import('react').JSX.Element;
|