@openrails/contentkit-ui 0.104.0-rc.1 → 0.104.0-rc.2

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.
Files changed (210) hide show
  1. package/README.md +6 -6
  2. package/dist/client/beacons.js +4 -1
  3. package/dist/client/beacons.js.map +1 -1
  4. package/dist/client/contents.d.ts +7 -1
  5. package/dist/client/contents.js +8 -0
  6. package/dist/client/contents.js.map +1 -1
  7. package/dist/client/discovery.d.ts +6 -2
  8. package/dist/client/discovery.js +1 -1
  9. package/dist/client/discovery.js.map +1 -1
  10. package/dist/client/generated/routes.d.ts +41 -28
  11. package/dist/client/generated/routes.js +63 -61
  12. package/dist/client/generated/routes.js.map +1 -1
  13. package/dist/client/generated/wire.d.ts +36 -74
  14. package/dist/client/generated/wire.js.map +1 -1
  15. package/dist/client/index.d.ts +1 -1
  16. package/dist/client/media/windows.d.ts +2 -0
  17. package/dist/client/media/windows.js +4 -1
  18. package/dist/client/media/windows.js.map +1 -1
  19. package/dist/client/stats.d.ts +4 -20
  20. package/dist/client/stats.js +0 -11
  21. package/dist/client/stats.js.map +1 -1
  22. package/dist/client/versions.d.ts +8 -6
  23. package/dist/client/versions.js +15 -10
  24. package/dist/client/versions.js.map +1 -1
  25. package/dist/components/admin/bulk-drafts.d.ts +17 -0
  26. package/dist/components/admin/bulk-drafts.js +41 -0
  27. package/dist/components/admin/bulk-drafts.js.map +1 -0
  28. package/dist/components/admin/content-admin.d.ts +1 -1
  29. package/dist/components/admin/content-admin.js.map +1 -1
  30. package/dist/components/admin/content-manager.d.ts +11 -3
  31. package/dist/components/admin/content-manager.js +739 -380
  32. package/dist/components/admin/content-manager.js.map +1 -1
  33. package/dist/components/admin/group-manager.d.ts +8 -3
  34. package/dist/components/admin/group-manager.js +218 -146
  35. package/dist/components/admin/group-manager.js.map +1 -1
  36. package/dist/components/admin/page-notices.d.ts +16 -0
  37. package/dist/components/admin/page-notices.js +113 -0
  38. package/dist/components/admin/page-notices.js.map +1 -0
  39. package/dist/components/admin/page-picker.d.ts +38 -0
  40. package/dist/components/admin/page-picker.js +159 -0
  41. package/dist/components/admin/page-picker.js.map +1 -0
  42. package/dist/components/admin/reader-content-editor.js +537 -500
  43. package/dist/components/admin/reader-content-editor.js.map +1 -1
  44. package/dist/components/admin/reader-manifest.js +181 -179
  45. package/dist/components/admin/reader-manifest.js.map +1 -1
  46. package/dist/components/admin/shell.d.ts +10 -2
  47. package/dist/components/admin/shell.js +114 -42
  48. package/dist/components/admin/shell.js.map +1 -1
  49. package/dist/components/admin/stats-dashboard.d.ts +4 -9
  50. package/dist/components/admin/stats-dashboard.js +300 -202
  51. package/dist/components/admin/stats-dashboard.js.map +1 -1
  52. package/dist/components/admin/upload-queue.d.ts +14 -0
  53. package/dist/components/admin/upload-queue.js +115 -98
  54. package/dist/components/admin/upload-queue.js.map +1 -1
  55. package/dist/components/content/card.d.ts +31 -3
  56. package/dist/components/content/card.js +324 -158
  57. package/dist/components/content/card.js.map +1 -1
  58. package/dist/components/content/daily-releases.js +14 -12
  59. package/dist/components/content/daily-releases.js.map +1 -1
  60. package/dist/components/content/editor-save.js +27 -25
  61. package/dist/components/content/editor-save.js.map +1 -1
  62. package/dist/components/content/editors.js +274 -253
  63. package/dist/components/content/editors.js.map +1 -1
  64. package/dist/components/content/favorites.d.ts +1 -1
  65. package/dist/components/content/favorites.js +36 -22
  66. package/dist/components/content/favorites.js.map +1 -1
  67. package/dist/components/content/grid.d.ts +11 -4
  68. package/dist/components/content/grid.js +52 -43
  69. package/dist/components/content/grid.js.map +1 -1
  70. package/dist/components/content/history.js +83 -63
  71. package/dist/components/content/history.js.map +1 -1
  72. package/dist/components/content/index.d.ts +5 -3
  73. package/dist/components/content/listing.d.ts +14 -3
  74. package/dist/components/content/listing.js +65 -56
  75. package/dist/components/content/listing.js.map +1 -1
  76. package/dist/components/content/offer-fields.js +6 -6
  77. package/dist/components/content/paged-grid.d.ts +10 -0
  78. package/dist/components/content/paged-grid.js +116 -0
  79. package/dist/components/content/paged-grid.js.map +1 -0
  80. package/dist/components/content/pagination.d.ts +19 -0
  81. package/dist/components/content/pagination.js +97 -0
  82. package/dist/components/content/pagination.js.map +1 -0
  83. package/dist/components/content/paywall.d.ts +9 -0
  84. package/dist/components/content/paywall.js +27 -3
  85. package/dist/components/content/paywall.js.map +1 -1
  86. package/dist/components/content/post-list.d.ts +37 -0
  87. package/dist/components/content/post-list.js +203 -0
  88. package/dist/components/content/post-list.js.map +1 -0
  89. package/dist/components/content/reader-settings.d.ts +2 -0
  90. package/dist/components/content/reader-settings.js +1 -1
  91. package/dist/components/content/reader-settings.js.map +1 -1
  92. package/dist/components/groups/banner.d.ts +6 -2
  93. package/dist/components/groups/banner.js +79 -61
  94. package/dist/components/groups/banner.js.map +1 -1
  95. package/dist/components/groups/directory.d.ts +12 -2
  96. package/dist/components/groups/directory.js +168 -105
  97. package/dist/components/groups/directory.js.map +1 -1
  98. package/dist/components/groups/editor.js +10 -10
  99. package/dist/components/groups/editor.js.map +1 -1
  100. package/dist/components/groups/entity-chips.d.ts +61 -0
  101. package/dist/components/groups/entity-chips.js +382 -0
  102. package/dist/components/groups/entity-chips.js.map +1 -0
  103. package/dist/components/groups/group-members.d.ts +29 -0
  104. package/dist/components/groups/group-members.js +474 -0
  105. package/dist/components/groups/group-members.js.map +1 -0
  106. package/dist/components/groups/header.js +53 -45
  107. package/dist/components/groups/header.js.map +1 -1
  108. package/dist/components/groups/index.d.ts +3 -1
  109. package/dist/components/groups/memberships.d.ts +3 -36
  110. package/dist/components/groups/memberships.js +105 -480
  111. package/dist/components/groups/memberships.js.map +1 -1
  112. package/dist/components/groups/scoped.d.ts +23 -0
  113. package/dist/components/groups/scoped.js +92 -0
  114. package/dist/components/groups/scoped.js.map +1 -0
  115. package/dist/components/media-folder-editor.d.ts +5 -0
  116. package/dist/components/media-folder-editor.js +418 -230
  117. package/dist/components/media-folder-editor.js.map +1 -1
  118. package/dist/components/sortable-list.d.ts +5 -1
  119. package/dist/components/sortable-list.js +97 -81
  120. package/dist/components/sortable-list.js.map +1 -1
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.js +41 -37
  123. package/dist/locales/admin/de.js +78 -45
  124. package/dist/locales/admin/de.js.map +1 -1
  125. package/dist/locales/admin/en.d.ts +74 -41
  126. package/dist/locales/admin/en.js +78 -45
  127. package/dist/locales/admin/en.js.map +1 -1
  128. package/dist/locales/admin/es.js +78 -45
  129. package/dist/locales/admin/es.js.map +1 -1
  130. package/dist/locales/admin/ja.js +78 -45
  131. package/dist/locales/admin/ja.js.map +1 -1
  132. package/dist/locales/admin/ko.js +78 -45
  133. package/dist/locales/admin/ko.js.map +1 -1
  134. package/dist/locales/admin/zh.js +78 -45
  135. package/dist/locales/admin/zh.js.map +1 -1
  136. package/dist/locales/de.js +1 -0
  137. package/dist/locales/de.js.map +1 -1
  138. package/dist/locales/discovery/de.js +25 -1
  139. package/dist/locales/discovery/de.js.map +1 -1
  140. package/dist/locales/discovery/en.d.ts +24 -0
  141. package/dist/locales/discovery/en.js +25 -1
  142. package/dist/locales/discovery/en.js.map +1 -1
  143. package/dist/locales/discovery/es.js +25 -1
  144. package/dist/locales/discovery/es.js.map +1 -1
  145. package/dist/locales/discovery/ja.js +25 -1
  146. package/dist/locales/discovery/ja.js.map +1 -1
  147. package/dist/locales/discovery/ko.js +25 -1
  148. package/dist/locales/discovery/ko.js.map +1 -1
  149. package/dist/locales/discovery/zh.js +25 -1
  150. package/dist/locales/discovery/zh.js.map +1 -1
  151. package/dist/locales/en.d.ts +119 -43
  152. package/dist/locales/en.js +1 -0
  153. package/dist/locales/en.js.map +1 -1
  154. package/dist/locales/es.js +1 -0
  155. package/dist/locales/es.js.map +1 -1
  156. package/dist/locales/groups/de.js +22 -4
  157. package/dist/locales/groups/de.js.map +1 -1
  158. package/dist/locales/groups/en.d.ts +20 -2
  159. package/dist/locales/groups/en.js +22 -4
  160. package/dist/locales/groups/en.js.map +1 -1
  161. package/dist/locales/groups/es.js +22 -4
  162. package/dist/locales/groups/es.js.map +1 -1
  163. package/dist/locales/groups/ja.js +22 -4
  164. package/dist/locales/groups/ja.js.map +1 -1
  165. package/dist/locales/groups/ko.js +22 -4
  166. package/dist/locales/groups/ko.js.map +1 -1
  167. package/dist/locales/groups/zh.js +22 -4
  168. package/dist/locales/groups/zh.js.map +1 -1
  169. package/dist/locales/ja.js +1 -0
  170. package/dist/locales/ja.js.map +1 -1
  171. package/dist/locales/ko.js +1 -0
  172. package/dist/locales/ko.js.map +1 -1
  173. package/dist/locales/zh.js +1 -0
  174. package/dist/locales/zh.js.map +1 -1
  175. package/dist/react/discovery.d.ts +16 -0
  176. package/dist/react/discovery.js +69 -37
  177. package/dist/react/discovery.js.map +1 -1
  178. package/dist/react/groups.d.ts +19 -3
  179. package/dist/react/groups.js +49 -22
  180. package/dist/react/groups.js.map +1 -1
  181. package/dist/react/index.d.ts +6 -4
  182. package/dist/react/page-notices.d.ts +13 -0
  183. package/dist/react/page-notices.js +38 -0
  184. package/dist/react/page-notices.js.map +1 -0
  185. package/dist/react/post-reads.d.ts +23 -0
  186. package/dist/react/post-reads.js +90 -0
  187. package/dist/react/post-reads.js.map +1 -0
  188. package/dist/react/remembered-sort.d.ts +5 -0
  189. package/dist/react/remembered-sort.js +29 -0
  190. package/dist/react/remembered-sort.js.map +1 -0
  191. package/dist/react/resources.js +2 -2
  192. package/dist/react/resources.js.map +1 -1
  193. package/dist/react/stats.d.ts +3 -7
  194. package/dist/react/stats.js +2 -6
  195. package/dist/react/stats.js.map +1 -1
  196. package/dist/react/use-engagement.d.ts +2 -0
  197. package/dist/react/use-engagement.js +8 -3
  198. package/dist/react/use-engagement.js.map +1 -1
  199. package/dist/react.js +29 -27
  200. package/dist/styles.css +1 -1
  201. package/dist/urls/index.d.ts +1 -1
  202. package/dist/urls.js +2 -2
  203. package/dist/urls.js.map +1 -1
  204. package/package.json +1 -1
  205. package/dist/components/admin/page-review.d.ts +0 -13
  206. package/dist/components/admin/page-review.js +0 -225
  207. package/dist/components/admin/page-review.js.map +0 -1
  208. package/dist/react/page-review.d.ts +0 -14
  209. package/dist/react/page-review.js +0 -37
  210. 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 { jsx as f, jsxs as p } from "react/jsx-runtime";
9
- import { cn as m } from "cn";
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 h(e, t, n, r) {
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 g(c) {
15
- let g = t(), { t: _ } = g, v = e(), y = r(c.group ? null : c.id, {
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: b } = i({ client: c.client }), x = c.group ?? y.group, S = (e) => /* @__PURE__ */ f(n, {
19
+ }), { kinds: x } = i({ client: c.client }), S = c.group ?? b.group, C = (e) => /* @__PURE__ */ p(n, {
19
20
  appearance: c.appearance,
20
- className: m("grid gap-4 text-sm", c.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 (!x) return y.error ? S(/* @__PURE__ */ p("div", {
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__ */ f("p", {
28
+ children: [/* @__PURE__ */ p("p", {
28
29
  className: "text-destructive",
29
- children: s(g, y.error)
30
- }), /* @__PURE__ */ f(a, {
30
+ children: s(_, b.error)
31
+ }), /* @__PURE__ */ p(a, {
31
32
  size: "sm",
32
33
  variant: "outline",
33
- onClick: y.reload,
34
- children: _("common.retry")
34
+ onClick: b.reload,
35
+ children: v("common.retry")
35
36
  })]
36
- })) : S(/* @__PURE__ */ f(o, { className: "h-32 w-full" }));
37
- let C = c.language ?? x.name_language, w = x.text.find((e) => e.language === C) ?? x.text.find((e) => e.description), T = x.names.filter((e) => e.name !== x.name), E = b?.entity_kinds?.[x.kind]?.attributes ?? {}, D = Object.entries(x.attributes).filter(([, e]) => e != null && e !== ""), O = x.counts.filter((e) => e.language === (c.language ?? "")).reduce((e, t) => e + t.count, 0);
38
- return S(/* @__PURE__ */ p("div", {
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": x.kind,
41
- children: [/* @__PURE__ */ f(l, {
42
- group: x,
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__ */ p("div", {
45
+ }), /* @__PURE__ */ m("div", {
45
46
  className: "grid content-start gap-3",
46
47
  children: [
47
- /* @__PURE__ */ p("div", {
48
+ /* @__PURE__ */ m("div", {
48
49
  className: "grid gap-1",
49
50
  children: [
50
- (x.parent || x.scope) && /* @__PURE__ */ f("p", {
51
+ (S.parent || S.scope) && /* @__PURE__ */ p("p", {
51
52
  className: "text-xs text-muted-foreground",
52
53
  "data-ckui": "group-parent",
53
- children: [x.scope, x.parent].filter((e, t, n) => !!e && n.findIndex((t) => t?.id === e.id) === t).map((e, t) => /* @__PURE__ */ p("span", { children: [t > 0 && " · ", /* @__PURE__ */ f(u, {
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__ */ f("h1", {
61
+ /* @__PURE__ */ p("h1", {
61
62
  className: "text-xl font-semibold break-words",
62
- children: x.name || x.slug
63
+ children: S.name || S.slug
63
64
  }),
64
- /* @__PURE__ */ f("p", {
65
+ /* @__PURE__ */ p("p", {
65
66
  className: "text-xs text-muted-foreground tabular-nums",
66
- children: g.plural("groups.items", O)
67
+ children: _.plural("groups.items", k)
67
68
  })
68
69
  ]
69
70
  }),
70
- T.length > 0 && /* @__PURE__ */ p("p", {
71
+ E.length > 0 && /* @__PURE__ */ m("p", {
71
72
  className: "text-muted-foreground",
72
73
  "data-ckui": "group-names",
73
- children: [/* @__PURE__ */ p("span", {
74
+ children: [/* @__PURE__ */ m("span", {
74
75
  className: "sr-only",
75
- children: [_("groups.alsoKnownAs"), " "]
76
- }), T.map((e, t) => /* @__PURE__ */ p("span", {
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__ */ p("span", {
82
+ e.kind === "name" && /* @__PURE__ */ m("span", {
82
83
  className: "text-xs",
83
84
  children: [
84
85
  " (",
85
- v(e.language),
86
+ y(e.language),
86
87
  ")"
87
88
  ]
88
89
  })
89
90
  ]
90
91
  }, `${e.language}:${e.name}`))]
91
92
  }),
92
- w?.description && /* @__PURE__ */ f("p", {
93
+ T?.description && /* @__PURE__ */ p("p", {
93
94
  className: "break-words whitespace-pre-line",
94
- lang: w.language,
95
+ lang: T.language,
95
96
  "data-ckui": "group-description",
96
- children: w.description
97
+ children: T.description
97
98
  }),
98
- D.length > 0 && /* @__PURE__ */ f("dl", {
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: D.map(([e, t]) => /* @__PURE__ */ p("div", {
102
+ children: O.map(([e, t]) => /* @__PURE__ */ m("div", {
102
103
  className: "contents",
103
- children: [/* @__PURE__ */ f("dt", {
104
+ children: [/* @__PURE__ */ p("dt", {
104
105
  className: "text-muted-foreground",
105
106
  children: d(c.labels, e)
106
- }), /* @__PURE__ */ f("dd", {
107
+ }), /* @__PURE__ */ p("dd", {
107
108
  className: "break-words",
108
- children: h(g, E[e], t, c.labels)
109
+ children: g(_, D[e], t, c.labels)
109
110
  })]
110
111
  }, e))
111
112
  }),
112
- x.children.length > 0 && /* @__PURE__ */ f("nav", {
113
- "aria-label": _("groups.children"),
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: x.children.map((e) => /* @__PURE__ */ f(u, {
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 { g as GroupHeader, h as formatAttribute };
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":"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"}
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, MembershipEditor, type GroupMembersProps, type MembershipEditorProps, type VersionChoice } from './memberships.js';
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, GroupCard, GroupDetail, GroupKind, Membership } from '../../client/generated/wire.js';
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
- /** A version a membership may target. */
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;