@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.
Files changed (217) 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 +9 -1
  5. package/dist/client/contents.js +73 -55
  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/error-codes.d.ts +1 -1
  11. package/dist/client/generated/error-codes.js +4 -0
  12. package/dist/client/generated/error-codes.js.map +1 -1
  13. package/dist/client/generated/routes.d.ts +43 -30
  14. package/dist/client/generated/routes.js +70 -63
  15. package/dist/client/generated/routes.js.map +1 -1
  16. package/dist/client/generated/wire.d.ts +36 -74
  17. package/dist/client/generated/wire.js.map +1 -1
  18. package/dist/client/index.d.ts +1 -1
  19. package/dist/client/media/windows.d.ts +2 -0
  20. package/dist/client/media/windows.js +4 -1
  21. package/dist/client/media/windows.js.map +1 -1
  22. package/dist/client/stats.d.ts +4 -20
  23. package/dist/client/stats.js +0 -11
  24. package/dist/client/stats.js.map +1 -1
  25. package/dist/client/versions.d.ts +8 -6
  26. package/dist/client/versions.js +15 -10
  27. package/dist/client/versions.js.map +1 -1
  28. package/dist/components/admin/bulk-drafts.d.ts +17 -0
  29. package/dist/components/admin/bulk-drafts.js +41 -0
  30. package/dist/components/admin/bulk-drafts.js.map +1 -0
  31. package/dist/components/admin/content-admin.d.ts +1 -1
  32. package/dist/components/admin/content-admin.js.map +1 -1
  33. package/dist/components/admin/content-manager.d.ts +11 -3
  34. package/dist/components/admin/content-manager.js +739 -380
  35. package/dist/components/admin/content-manager.js.map +1 -1
  36. package/dist/components/admin/group-manager.d.ts +8 -3
  37. package/dist/components/admin/group-manager.js +218 -146
  38. package/dist/components/admin/group-manager.js.map +1 -1
  39. package/dist/components/admin/page-notices.d.ts +16 -0
  40. package/dist/components/admin/page-notices.js +113 -0
  41. package/dist/components/admin/page-notices.js.map +1 -0
  42. package/dist/components/admin/page-picker.d.ts +38 -0
  43. package/dist/components/admin/page-picker.js +159 -0
  44. package/dist/components/admin/page-picker.js.map +1 -0
  45. package/dist/components/admin/reader-content-editor.js +537 -500
  46. package/dist/components/admin/reader-content-editor.js.map +1 -1
  47. package/dist/components/admin/reader-manifest.js +181 -179
  48. package/dist/components/admin/reader-manifest.js.map +1 -1
  49. package/dist/components/admin/shell.d.ts +10 -2
  50. package/dist/components/admin/shell.js +114 -42
  51. package/dist/components/admin/shell.js.map +1 -1
  52. package/dist/components/admin/stats-dashboard.d.ts +4 -9
  53. package/dist/components/admin/stats-dashboard.js +300 -202
  54. package/dist/components/admin/stats-dashboard.js.map +1 -1
  55. package/dist/components/admin/upload-queue.d.ts +14 -0
  56. package/dist/components/admin/upload-queue.js +115 -98
  57. package/dist/components/admin/upload-queue.js.map +1 -1
  58. package/dist/components/content/card.d.ts +31 -3
  59. package/dist/components/content/card.js +324 -158
  60. package/dist/components/content/card.js.map +1 -1
  61. package/dist/components/content/daily-releases.js +14 -12
  62. package/dist/components/content/daily-releases.js.map +1 -1
  63. package/dist/components/content/editor-save.js +27 -25
  64. package/dist/components/content/editor-save.js.map +1 -1
  65. package/dist/components/content/editors.js +274 -253
  66. package/dist/components/content/editors.js.map +1 -1
  67. package/dist/components/content/favorites.d.ts +1 -1
  68. package/dist/components/content/favorites.js +36 -22
  69. package/dist/components/content/favorites.js.map +1 -1
  70. package/dist/components/content/grid.d.ts +11 -4
  71. package/dist/components/content/grid.js +52 -43
  72. package/dist/components/content/grid.js.map +1 -1
  73. package/dist/components/content/history.js +83 -63
  74. package/dist/components/content/history.js.map +1 -1
  75. package/dist/components/content/index.d.ts +5 -3
  76. package/dist/components/content/listing.d.ts +14 -3
  77. package/dist/components/content/listing.js +65 -56
  78. package/dist/components/content/listing.js.map +1 -1
  79. package/dist/components/content/offer-fields.js +6 -6
  80. package/dist/components/content/paged-grid.d.ts +10 -0
  81. package/dist/components/content/paged-grid.js +116 -0
  82. package/dist/components/content/paged-grid.js.map +1 -0
  83. package/dist/components/content/pagination.d.ts +19 -0
  84. package/dist/components/content/pagination.js +97 -0
  85. package/dist/components/content/pagination.js.map +1 -0
  86. package/dist/components/content/paywall.d.ts +9 -0
  87. package/dist/components/content/paywall.js +27 -3
  88. package/dist/components/content/paywall.js.map +1 -1
  89. package/dist/components/content/post-list.d.ts +37 -0
  90. package/dist/components/content/post-list.js +203 -0
  91. package/dist/components/content/post-list.js.map +1 -0
  92. package/dist/components/content/reader-settings.d.ts +2 -0
  93. package/dist/components/content/reader-settings.js +1 -1
  94. package/dist/components/content/reader-settings.js.map +1 -1
  95. package/dist/components/groups/banner.d.ts +6 -2
  96. package/dist/components/groups/banner.js +79 -61
  97. package/dist/components/groups/banner.js.map +1 -1
  98. package/dist/components/groups/directory.d.ts +12 -2
  99. package/dist/components/groups/directory.js +168 -105
  100. package/dist/components/groups/directory.js.map +1 -1
  101. package/dist/components/groups/editor.js +10 -10
  102. package/dist/components/groups/editor.js.map +1 -1
  103. package/dist/components/groups/entity-chips.d.ts +61 -0
  104. package/dist/components/groups/entity-chips.js +382 -0
  105. package/dist/components/groups/entity-chips.js.map +1 -0
  106. package/dist/components/groups/group-members.d.ts +29 -0
  107. package/dist/components/groups/group-members.js +474 -0
  108. package/dist/components/groups/group-members.js.map +1 -0
  109. package/dist/components/groups/header.js +53 -45
  110. package/dist/components/groups/header.js.map +1 -1
  111. package/dist/components/groups/index.d.ts +3 -1
  112. package/dist/components/groups/memberships.d.ts +3 -36
  113. package/dist/components/groups/memberships.js +105 -480
  114. package/dist/components/groups/memberships.js.map +1 -1
  115. package/dist/components/groups/scoped.d.ts +23 -0
  116. package/dist/components/groups/scoped.js +92 -0
  117. package/dist/components/groups/scoped.js.map +1 -0
  118. package/dist/components/media-folder-editor.d.ts +5 -0
  119. package/dist/components/media-folder-editor.js +418 -230
  120. package/dist/components/media-folder-editor.js.map +1 -1
  121. package/dist/components/social/poll.js +57 -48
  122. package/dist/components/social/poll.js.map +1 -1
  123. package/dist/components/sortable-list.d.ts +5 -1
  124. package/dist/components/sortable-list.js +97 -81
  125. package/dist/components/sortable-list.js.map +1 -1
  126. package/dist/index.d.ts +1 -1
  127. package/dist/index.js +41 -37
  128. package/dist/locales/admin/de.js +78 -45
  129. package/dist/locales/admin/de.js.map +1 -1
  130. package/dist/locales/admin/en.d.ts +74 -41
  131. package/dist/locales/admin/en.js +78 -45
  132. package/dist/locales/admin/en.js.map +1 -1
  133. package/dist/locales/admin/es.js +78 -45
  134. package/dist/locales/admin/es.js.map +1 -1
  135. package/dist/locales/admin/ja.js +78 -45
  136. package/dist/locales/admin/ja.js.map +1 -1
  137. package/dist/locales/admin/ko.js +78 -45
  138. package/dist/locales/admin/ko.js.map +1 -1
  139. package/dist/locales/admin/zh.js +78 -45
  140. package/dist/locales/admin/zh.js.map +1 -1
  141. package/dist/locales/de.js +2 -0
  142. package/dist/locales/de.js.map +1 -1
  143. package/dist/locales/discovery/de.js +25 -1
  144. package/dist/locales/discovery/de.js.map +1 -1
  145. package/dist/locales/discovery/en.d.ts +24 -0
  146. package/dist/locales/discovery/en.js +25 -1
  147. package/dist/locales/discovery/en.js.map +1 -1
  148. package/dist/locales/discovery/es.js +25 -1
  149. package/dist/locales/discovery/es.js.map +1 -1
  150. package/dist/locales/discovery/ja.js +25 -1
  151. package/dist/locales/discovery/ja.js.map +1 -1
  152. package/dist/locales/discovery/ko.js +25 -1
  153. package/dist/locales/discovery/ko.js.map +1 -1
  154. package/dist/locales/discovery/zh.js +25 -1
  155. package/dist/locales/discovery/zh.js.map +1 -1
  156. package/dist/locales/en.d.ts +120 -43
  157. package/dist/locales/en.js +2 -0
  158. package/dist/locales/en.js.map +1 -1
  159. package/dist/locales/es.js +2 -0
  160. package/dist/locales/es.js.map +1 -1
  161. package/dist/locales/groups/de.js +22 -4
  162. package/dist/locales/groups/de.js.map +1 -1
  163. package/dist/locales/groups/en.d.ts +20 -2
  164. package/dist/locales/groups/en.js +22 -4
  165. package/dist/locales/groups/en.js.map +1 -1
  166. package/dist/locales/groups/es.js +22 -4
  167. package/dist/locales/groups/es.js.map +1 -1
  168. package/dist/locales/groups/ja.js +22 -4
  169. package/dist/locales/groups/ja.js.map +1 -1
  170. package/dist/locales/groups/ko.js +22 -4
  171. package/dist/locales/groups/ko.js.map +1 -1
  172. package/dist/locales/groups/zh.js +22 -4
  173. package/dist/locales/groups/zh.js.map +1 -1
  174. package/dist/locales/ja.js +2 -0
  175. package/dist/locales/ja.js.map +1 -1
  176. package/dist/locales/ko.js +2 -0
  177. package/dist/locales/ko.js.map +1 -1
  178. package/dist/locales/zh.js +2 -0
  179. package/dist/locales/zh.js.map +1 -1
  180. package/dist/react/contents.js +1 -1
  181. package/dist/react/contents.js.map +1 -1
  182. package/dist/react/discovery.d.ts +16 -0
  183. package/dist/react/discovery.js +69 -37
  184. package/dist/react/discovery.js.map +1 -1
  185. package/dist/react/groups.d.ts +19 -3
  186. package/dist/react/groups.js +49 -22
  187. package/dist/react/groups.js.map +1 -1
  188. package/dist/react/index.d.ts +6 -4
  189. package/dist/react/page-notices.d.ts +13 -0
  190. package/dist/react/page-notices.js +38 -0
  191. package/dist/react/page-notices.js.map +1 -0
  192. package/dist/react/post-reads.d.ts +23 -0
  193. package/dist/react/post-reads.js +90 -0
  194. package/dist/react/post-reads.js.map +1 -0
  195. package/dist/react/remembered-sort.d.ts +5 -0
  196. package/dist/react/remembered-sort.js +29 -0
  197. package/dist/react/remembered-sort.js.map +1 -0
  198. package/dist/react/resources.js +2 -2
  199. package/dist/react/resources.js.map +1 -1
  200. package/dist/react/stats.d.ts +3 -7
  201. package/dist/react/stats.js +2 -6
  202. package/dist/react/stats.js.map +1 -1
  203. package/dist/react/use-engagement.d.ts +2 -0
  204. package/dist/react/use-engagement.js +40 -34
  205. package/dist/react/use-engagement.js.map +1 -1
  206. package/dist/react.js +29 -27
  207. package/dist/styles.css +1 -1
  208. package/dist/urls/index.d.ts +1 -1
  209. package/dist/urls.js +2 -2
  210. package/dist/urls.js.map +1 -1
  211. package/package.json +1 -1
  212. package/dist/components/admin/page-review.d.ts +0 -13
  213. package/dist/components/admin/page-review.js +0 -225
  214. package/dist/components/admin/page-review.js.map +0 -1
  215. package/dist/react/page-review.d.ts +0 -14
  216. package/dist/react/page-review.js +0 -37
  217. package/dist/react/page-review.js.map +0 -1
@@ -1,123 +1,186 @@
1
1
  import { useMessages as e } from "../../i18n/context.js";
2
2
  import { ContentKitUiRoot as t } from "../../scope.js";
3
- import { useGroups as n } from "../../react/groups.js";
4
- import { Button as r } from "../../ui/button.js";
5
- import { Skeleton as i } from "../../ui/skeleton.js";
6
- import { contentError as a } from "../social/parts.js";
7
- import { LETTERS as o } from "../../client/group-fields.js";
8
- import { GroupCover as s, GroupLink as c } from "./parts.js";
9
- import { useState as l } from "react";
10
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
11
- import { cn as f } from "cn";
3
+ import { useGroups as n, useGroupsPage as r } from "../../react/groups.js";
4
+ import { Button as i } from "../../ui/button.js";
5
+ import { Skeleton as a } from "../../ui/skeleton.js";
6
+ import { contentError as o } from "../social/parts.js";
7
+ import { LETTERS as s } from "../../client/group-fields.js";
8
+ import { GroupCover as c, GroupLink as l } from "./parts.js";
9
+ import { Pagination as u } from "../content/pagination.js";
10
+ import { SortMenu as d } from "../content/listing.js";
11
+ import { useRef as f, useState as p } from "react";
12
+ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
13
+ import { cn as _ } from "cn";
12
14
  //#region src/components/groups/directory.tsx
13
- function p(p) {
14
- let m = e(), { t: h } = m, [g, _] = l(null), v = p.letter === void 0 ? g : p.letter, y = (e) => p.onLetterChange ? p.onLetterChange(e) : _(e), b = n({
15
- kind: p.kind,
16
- language: p.language,
17
- contentKind: p.contentKind,
18
- parent: p.parent,
19
- scope: p.scope,
20
- sort: p.sort,
21
- letter: v ?? void 0,
22
- pageSize: p.pageSize
23
- }, { client: p.client }), x = p.layout === "grid", S = (e) => new Intl.NumberFormat(m.language).format(e);
24
- return /* @__PURE__ */ d(t, {
25
- appearance: p.appearance,
26
- className: f("grid gap-4 text-sm", p.className),
15
+ function v(n) {
16
+ let { t: r } = e(), [a, o] = p(null), [c, l] = p("name"), u = n.letter === void 0 ? a : n.letter, f = n.sort ?? c, m = (e) => n.onLetterChange ? n.onLetterChange(e) : o(e), v = (e) => n.onSortChange ? n.onSortChange(e) : l(e), x = {
17
+ kind: n.kind,
18
+ language: n.language,
19
+ contentKind: n.contentKind,
20
+ parent: n.parent,
21
+ scope: n.scope,
22
+ sort: f,
23
+ letter: u ?? void 0,
24
+ pageSize: n.pageSize
25
+ };
26
+ return /* @__PURE__ */ g(t, {
27
+ appearance: n.appearance,
28
+ className: _("grid gap-4 text-sm", n.className),
27
29
  "data-ckui": "group-directory",
28
- "data-kind": p.kind,
29
- children: [
30
- p.letters !== !1 && /* @__PURE__ */ u("nav", {
31
- "aria-label": h("groups.byLetter"),
30
+ "data-kind": n.kind,
31
+ children: [(n.letters !== !1 || !!n.sorts?.length) && /* @__PURE__ */ g("div", {
32
+ className: "flex flex-wrap items-start justify-between gap-2",
33
+ children: [n.letters !== !1 && /* @__PURE__ */ h("nav", {
34
+ "aria-label": r("groups.byLetter"),
32
35
  className: "flex flex-wrap gap-1",
33
36
  "data-ckui": "letters",
34
- children: [null, ...o].map((e) => /* @__PURE__ */ u(r, {
37
+ children: [null, ...s].map((e) => /* @__PURE__ */ h(i, {
35
38
  size: "xs",
36
- variant: v === e ? "default" : "ghost",
37
- "aria-pressed": v === e,
38
- "aria-label": e === null ? void 0 : e === "#" ? h("groups.otherLetters") : e.toUpperCase(),
39
+ variant: u === e ? "default" : "ghost",
40
+ "aria-pressed": u === e,
41
+ "aria-label": e === null ? void 0 : e === "#" ? r("groups.otherLetters") : e.toUpperCase(),
39
42
  className: "min-w-7",
40
- onClick: () => y(e),
41
- children: e === null ? h("groups.all") : e.toUpperCase()
43
+ onClick: () => m(e),
44
+ children: e === null ? r("groups.all") : e.toUpperCase()
42
45
  }, e ?? "all"))
43
- }),
44
- b.loading && !b.items.length ? /* @__PURE__ */ u("div", {
45
- className: x ? "grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3" : "grid gap-2",
46
- "aria-busy": !0,
47
- children: Array.from({ length: 6 }, (e, t) => /* @__PURE__ */ u(i, { className: x ? "aspect-[3/4] w-full" : "h-6 w-48" }, t))
48
- }) : b.error && !b.items.length ? /* @__PURE__ */ d("div", {
49
- role: "alert",
50
- className: "grid justify-items-start gap-2",
51
- children: [/* @__PURE__ */ u("p", {
52
- className: "text-destructive",
53
- children: a(m, b.error)
54
- }), /* @__PURE__ */ u(r, {
55
- size: "sm",
56
- variant: "outline",
57
- onClick: b.reload,
58
- children: h("common.retry")
59
- })]
60
- }) : b.items.length ? /* @__PURE__ */ u("ul", {
61
- className: x ? "grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3" : "flex flex-wrap gap-2",
62
- "data-ckui": "groups",
63
- children: b.items.map((e) => /* @__PURE__ */ u("li", {
64
- "data-ckui": "group",
65
- "data-slug": e.slug,
66
- children: p.renderGroup ? p.renderGroup(e) : x ? /* @__PURE__ */ d(c, {
67
- group: e,
68
- href: p.href,
69
- className: "group grid gap-1.5",
70
- children: [
71
- /* @__PURE__ */ u(s, {
72
- group: e,
73
- className: "aspect-[3/4] w-full"
74
- }),
75
- /* @__PURE__ */ u("span", {
76
- className: "font-medium break-words group-hover:underline",
77
- children: e.name || e.slug
78
- }),
79
- /* @__PURE__ */ u("span", {
80
- className: "text-xs text-muted-foreground tabular-nums",
81
- children: m.plural("groups.items", e.count)
82
- })
83
- ]
84
- }) : /* @__PURE__ */ d(c, {
46
+ }), !!n.sorts?.length && /* @__PURE__ */ h(d, {
47
+ value: f,
48
+ sorts: n.sorts,
49
+ onChange: v,
50
+ label: (e) => r(`groups.directorySort_${e}`),
51
+ className: "ms-auto"
52
+ })]
53
+ }), n.pagination === "pages" ? /* @__PURE__ */ h(b, {
54
+ ...n,
55
+ filter: x
56
+ }) : /* @__PURE__ */ h(y, {
57
+ ...n,
58
+ filter: x
59
+ })]
60
+ });
61
+ }
62
+ function y({ filter: t, client: r, ...a }) {
63
+ let s = e(), { t: c } = s, l = n(t, { client: r });
64
+ return /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(x, {
65
+ ...a,
66
+ items: l.items,
67
+ loading: l.loading,
68
+ error: l.error,
69
+ reload: l.reload
70
+ }), l.hasMore && /* @__PURE__ */ g("div", {
71
+ className: "grid justify-items-center gap-2",
72
+ children: [l.error && /* @__PURE__ */ h("p", {
73
+ role: "alert",
74
+ className: "text-destructive",
75
+ children: o(s, l.error)
76
+ }), /* @__PURE__ */ h(i, {
77
+ variant: "outline",
78
+ size: "sm",
79
+ disabled: l.loadingMore,
80
+ onClick: () => void l.loadMore(),
81
+ children: l.loadingMore ? c("groups.loading") : l.error ? c("common.retry") : c("groups.loadMore")
82
+ })]
83
+ })] });
84
+ }
85
+ function b({ filter: e, client: t, ...n }) {
86
+ let i = JSON.stringify(e), [a, o] = p({
87
+ key: i,
88
+ page: 1
89
+ }), s = Math.max(1, Math.floor(n.page ?? (a.key === i ? a.page : 1))), c = f(null), l = r(e, s, { client: t }), d = e.pageSize ?? 50, _ = (e, t) => {
90
+ n.page === void 0 && o({
91
+ key: i,
92
+ page: e
93
+ }), n.onPageChange?.(e), t && c.current?.scrollIntoView({
94
+ block: "start",
95
+ behavior: "smooth"
96
+ });
97
+ }, v = (e) => l.total === void 0 ? null : /* @__PURE__ */ h(u, {
98
+ page: s,
99
+ total: l.total,
100
+ pageSize: d,
101
+ range: !e,
102
+ pageHref: n.pageHref,
103
+ onPageChange: (t) => _(t, e)
104
+ });
105
+ return /* @__PURE__ */ g(m, { children: [
106
+ /* @__PURE__ */ h("div", {
107
+ ref: c,
108
+ className: "scroll-mt-20",
109
+ children: v(!1)
110
+ }),
111
+ /* @__PURE__ */ h(x, {
112
+ ...n,
113
+ items: l.items,
114
+ loading: l.loading,
115
+ error: l.error,
116
+ reload: l.reload
117
+ }),
118
+ l.items.length > 0 && v(!0)
119
+ ] });
120
+ }
121
+ function x({ items: t, loading: n, error: r, reload: s, ...u }) {
122
+ let d = e(), { t: f } = d, p = u.layout === "grid", m = (e) => new Intl.NumberFormat(d.language).format(e);
123
+ return n && !t.length ? /* @__PURE__ */ h("div", {
124
+ className: p ? "grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3" : "grid gap-2",
125
+ "aria-busy": !0,
126
+ children: Array.from({ length: 6 }, (e, t) => /* @__PURE__ */ h(a, { className: p ? "aspect-[3/4] w-full" : "h-6 w-48" }, t))
127
+ }) : r && !t.length ? /* @__PURE__ */ g("div", {
128
+ role: "alert",
129
+ className: "grid justify-items-start gap-2",
130
+ children: [/* @__PURE__ */ h("p", {
131
+ className: "text-destructive",
132
+ children: o(d, r)
133
+ }), /* @__PURE__ */ h(i, {
134
+ size: "sm",
135
+ variant: "outline",
136
+ onClick: s,
137
+ children: f("common.retry")
138
+ })]
139
+ }) : t.length ? /* @__PURE__ */ h("ul", {
140
+ className: p ? "grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3" : "flex flex-wrap gap-2",
141
+ "data-ckui": "groups",
142
+ children: t.map((e) => /* @__PURE__ */ h("li", {
143
+ "data-ckui": "group",
144
+ "data-slug": e.slug,
145
+ children: u.renderGroup ? u.renderGroup(e) : p ? /* @__PURE__ */ g(l, {
146
+ group: e,
147
+ href: u.href,
148
+ className: "group grid gap-1.5",
149
+ children: [
150
+ /* @__PURE__ */ h(c, {
85
151
  group: e,
86
- href: p.href,
87
- className: "inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 hover:bg-muted",
88
- children: [/* @__PURE__ */ u("span", {
89
- className: "break-words",
90
- children: e.name || e.slug
91
- }), /* @__PURE__ */ u("span", {
92
- className: "text-xs text-muted-foreground tabular-nums",
93
- "aria-label": m.plural("groups.items", e.count),
94
- children: S(e.count)
95
- })]
152
+ className: "aspect-[3/4] w-full"
153
+ }),
154
+ /* @__PURE__ */ h("span", {
155
+ className: "font-medium break-words group-hover:underline",
156
+ children: e.name || e.slug
157
+ }),
158
+ /* @__PURE__ */ h("span", {
159
+ className: "text-xs text-muted-foreground tabular-nums",
160
+ children: d.plural("groups.items", e.count)
96
161
  })
97
- }, e.id))
98
- }) : /* @__PURE__ */ u("p", {
99
- className: "text-muted-foreground",
100
- role: "status",
101
- children: h("groups.empty")
102
- }),
103
- b.hasMore && /* @__PURE__ */ d("div", {
104
- className: "grid justify-items-center gap-2",
105
- children: [b.error && /* @__PURE__ */ u("p", {
106
- role: "alert",
107
- className: "text-destructive",
108
- children: a(m, b.error)
109
- }), /* @__PURE__ */ u(r, {
110
- variant: "outline",
111
- size: "sm",
112
- disabled: b.loadingMore,
113
- onClick: () => void b.loadMore(),
114
- children: b.loadingMore ? h("groups.loading") : b.error ? h("common.retry") : h("groups.loadMore")
162
+ ]
163
+ }) : /* @__PURE__ */ g(l, {
164
+ group: e,
165
+ href: u.href,
166
+ className: "inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 hover:bg-muted",
167
+ children: [/* @__PURE__ */ h("span", {
168
+ className: "break-words",
169
+ children: e.name || e.slug
170
+ }), /* @__PURE__ */ h("span", {
171
+ className: "text-xs text-muted-foreground tabular-nums",
172
+ "aria-label": d.plural("groups.items", e.count),
173
+ children: m(e.count)
115
174
  })]
116
175
  })
117
- ]
176
+ }, e.id))
177
+ }) : /* @__PURE__ */ h("p", {
178
+ className: "text-muted-foreground",
179
+ role: "status",
180
+ children: f("groups.empty")
118
181
  });
119
182
  }
120
183
  //#endregion
121
- export { p as GroupDirectory };
184
+ export { v as GroupDirectory };
122
185
 
123
186
  //# sourceMappingURL=directory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"directory.js","names":[],"sources":["../../../src/components/groups/directory.tsx"],"sourcesContent":["import { cn } from \"cn\";\nimport { useState, type ReactNode } from \"react\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport { LETTERS } from \"../../client/group-fields.js\";\nimport type { GroupCard } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useGroups, type GroupSort } from \"../../react/groups.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { contentError } from \"../social/parts.js\";\nimport { GroupCover, GroupLink, type GroupLike } from \"./parts.js\";\n\nexport interface GroupDirectoryProps {\n /** The group kind listed: tag, artist, series. */\n kind: string;\n /** Names, counts and paths in this language; default the provider's. */\n language?: string;\n /** Count contents of this kind only; default every kind. */\n contentKind?: string;\n /** Children of this group. */\n parent?: string;\n /** Groups scoped by this group (characters of a series). */\n scope?: string;\n /** Default \"name\". */\n sort?: GroupSort;\n /** The letter bucket shown, a-z or \"#\", null for every group. With onLetterChange the host keeps it (in its URL). */\n letter?: string | null;\n onLetterChange?: (letter: string | null) => void;\n /** Hide the A-Z bar. */\n letters?: boolean;\n /** \"list\" (names with counts, default) or \"grid\" (covers). */\n layout?: \"list\" | \"grid\";\n /** A group's link; default its canonical path. */\n href?: (group: GroupLike) => string | undefined;\n /** A group's entry instead of the default one. */\n renderGroup?: (group: GroupCard) => ReactNode;\n pageSize?: number;\n client?: ContentKitClient;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/** A directory of one kind's groups: A-Z buckets, names with content counts or covers, paged. */\nexport function GroupDirectory(p: GroupDirectoryProps) {\n const m = useMessages();\n const { t } = m;\n const [own, setOwn] = useState<string | null>(null);\n const letter = p.letter !== undefined ? p.letter : own;\n const choose = (l: string | null) => (p.onLetterChange ? p.onLetterChange(l) : setOwn(l));\n const list = useGroups(\n { kind: p.kind, language: p.language, contentKind: p.contentKind, parent: p.parent, scope: p.scope, sort: p.sort, letter: letter ?? undefined, pageSize: p.pageSize },\n { client: p.client },\n );\n const grid = p.layout === \"grid\";\n const count = (n: number) => new Intl.NumberFormat(m.language).format(n);\n return (\n <ContentKitUiRoot appearance={p.appearance} className={cn(\"grid gap-4 text-sm\", p.className)} data-ckui=\"group-directory\" data-kind={p.kind}>\n {p.letters !== false && (\n <nav aria-label={t(\"groups.byLetter\")} className=\"flex flex-wrap gap-1\" data-ckui=\"letters\">\n {[null, ...LETTERS].map((l) => (\n <Button\n key={l ?? \"all\"}\n size=\"xs\"\n variant={letter === l ? \"default\" : \"ghost\"}\n aria-pressed={letter === l}\n aria-label={l === null ? undefined : l === \"#\" ? t(\"groups.otherLetters\") : l.toUpperCase()}\n className=\"min-w-7\"\n onClick={() => choose(l)}\n >\n {l === null ? t(\"groups.all\") : l.toUpperCase()}\n </Button>\n ))}\n </nav>\n )}\n {list.loading && !list.items.length ? (\n <div className={grid ? \"grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3\" : \"grid gap-2\"} aria-busy>\n {Array.from({ length: 6 }, (_, i) => (\n <Skeleton key={i} className={grid ? \"aspect-[3/4] w-full\" : \"h-6 w-48\"} />\n ))}\n </div>\n ) : list.error && !list.items.length ? (\n <div role=\"alert\" className=\"grid justify-items-start gap-2\">\n <p className=\"text-destructive\">{contentError(m, list.error)}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={list.reload}>\n {t(\"common.retry\")}\n </Button>\n </div>\n ) : !list.items.length ? (\n <p className=\"text-muted-foreground\" role=\"status\">\n {t(\"groups.empty\")}\n </p>\n ) : (\n <ul className={grid ? \"grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3\" : \"flex flex-wrap gap-2\"} data-ckui=\"groups\">\n {list.items.map((g) => (\n <li key={g.id} data-ckui=\"group\" data-slug={g.slug}>\n {p.renderGroup ? (\n p.renderGroup(g)\n ) : grid ? (\n <GroupLink group={g} href={p.href} className=\"group grid gap-1.5\">\n <GroupCover group={g} className=\"aspect-[3/4] w-full\" />\n <span className=\"font-medium break-words group-hover:underline\">{g.name || g.slug}</span>\n <span className=\"text-xs text-muted-foreground tabular-nums\">{m.plural(\"groups.items\", g.count)}</span>\n </GroupLink>\n ) : (\n <GroupLink group={g} href={p.href} className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 hover:bg-muted\">\n <span className=\"break-words\">{g.name || g.slug}</span>\n <span className=\"text-xs text-muted-foreground tabular-nums\" aria-label={m.plural(\"groups.items\", g.count)}>\n {count(g.count)}\n </span>\n </GroupLink>\n )}\n </li>\n ))}\n </ul>\n )}\n {list.hasMore && (\n <div className=\"grid justify-items-center gap-2\">\n {list.error && <p role=\"alert\" className=\"text-destructive\">{contentError(m, list.error)}</p>}\n <Button variant=\"outline\" size=\"sm\" disabled={list.loadingMore} onClick={() => void list.loadMore()}>\n {list.loadingMore ? t(\"groups.loading\") : list.error ? t(\"common.retry\") : t(\"groups.loadMore\")}\n </Button>\n </div>\n )}\n </ContentKitUiRoot>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"directory.js","names":[],"sources":["../../../src/components/groups/directory.tsx"],"sourcesContent":["import { cn } from \"cn\";\nimport { useRef, useState, type ReactNode } from \"react\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport { LETTERS } from \"../../client/group-fields.js\";\nimport type { GroupCard } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useGroups, useGroupsPage, type GroupFilter, type GroupSort } from \"../../react/groups.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { contentError } from \"../social/parts.js\";\nimport { SortMenu } from \"../content/listing.js\";\nimport { Pagination } from \"../content/pagination.js\";\nimport { GroupCover, GroupLink, type GroupLike } from \"./parts.js\";\n\nexport interface GroupDirectoryProps {\n /** The group kind listed: tag, artist, series. */\n kind: string;\n /** Names, counts and paths in this language; default the provider's. */\n language?: string;\n /** Count contents of this kind only; default every kind. */\n contentKind?: string;\n /** Children of this group. */\n parent?: string;\n /** Groups scoped by this group (characters of a series). */\n scope?: string;\n /** Default \"name\". With sorts, the menu's choice; with onSortChange the host keeps it. */\n sort?: GroupSort;\n /** The sorts offered as a menu; none by default. */\n sorts?: readonly GroupSort[];\n onSortChange?: (sort: GroupSort) => void;\n /** The letter bucket shown, a-z or \"#\", null for every group. With onLetterChange the host keeps it (in its URL). */\n letter?: string | null;\n onLetterChange?: (letter: string | null) => void;\n /** Hide the A-Z bar. */\n letters?: boolean;\n /** \"list\" (names with counts, default) or \"grid\" (covers). */\n layout?: \"list\" | \"grid\";\n /** A group's link; default its canonical path. */\n href?: (group: GroupLike) => string | undefined;\n /** A group's entry instead of the default one. */\n renderGroup?: (group: GroupCard) => ReactNode;\n pageSize?: number;\n /** Numbered pages with a shown range instead of load more. */\n pagination?: \"pages\";\n /** The numbered page, from 1; with onPageChange the host keeps it. A changed letter or sort starts again at page 1: a host keeping the page drops it with them. */\n page?: number;\n onPageChange?: (page: number) => void;\n /** Each numbered page's link, for crawlers and opening in a new tab. */\n pageHref?: (page: number) => string;\n client?: ContentKitClient;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/** A directory of one kind's groups: A-Z buckets, an optional sort, names with content counts or covers, paged. */\nexport function GroupDirectory(p: GroupDirectoryProps) {\n const m = useMessages();\n const { t } = m;\n const [own, setOwn] = useState<string | null>(null);\n const [ownSort, setOwnSort] = useState<GroupSort>(\"name\");\n const letter = p.letter !== undefined ? p.letter : own;\n const sort = p.sort ?? ownSort;\n const choose = (l: string | null) => (p.onLetterChange ? p.onLetterChange(l) : setOwn(l));\n const chooseSort = (s: GroupSort) => (p.onSortChange ? p.onSortChange(s) : setOwnSort(s));\n const filter: GroupFilter = { kind: p.kind, language: p.language, contentKind: p.contentKind, parent: p.parent, scope: p.scope, sort, letter: letter ?? undefined, pageSize: p.pageSize };\n return (\n <ContentKitUiRoot appearance={p.appearance} className={cn(\"grid gap-4 text-sm\", p.className)} data-ckui=\"group-directory\" data-kind={p.kind}>\n {(p.letters !== false || !!p.sorts?.length) && (\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n {p.letters !== false && (\n <nav aria-label={t(\"groups.byLetter\")} className=\"flex flex-wrap gap-1\" data-ckui=\"letters\">\n {[null, ...LETTERS].map((l) => (\n <Button\n key={l ?? \"all\"}\n size=\"xs\"\n variant={letter === l ? \"default\" : \"ghost\"}\n aria-pressed={letter === l}\n aria-label={l === null ? undefined : l === \"#\" ? t(\"groups.otherLetters\") : l.toUpperCase()}\n className=\"min-w-7\"\n onClick={() => choose(l)}\n >\n {l === null ? t(\"groups.all\") : l.toUpperCase()}\n </Button>\n ))}\n </nav>\n )}\n {!!p.sorts?.length && <SortMenu value={sort} sorts={p.sorts} onChange={chooseSort} label={(s) => t(`groups.directorySort_${s}`)} className=\"ms-auto\" />}\n </div>\n )}\n {p.pagination === \"pages\" ? <NumberedGroups {...p} filter={filter} /> : <CursorGroups {...p} filter={filter} />}\n </ContentKitUiRoot>\n );\n}\n\ntype Shown = Pick<GroupDirectoryProps, \"layout\" | \"href\" | \"renderGroup\">;\n\nfunction CursorGroups({ filter, client, ...p }: GroupDirectoryProps & { filter: GroupFilter }) {\n const m = useMessages();\n const { t } = m;\n const list = useGroups(filter, { client });\n return (\n <>\n <Groups {...p} items={list.items} loading={list.loading} error={list.error} reload={list.reload} />\n {list.hasMore && (\n <div className=\"grid justify-items-center gap-2\">\n {list.error && <p role=\"alert\" className=\"text-destructive\">{contentError(m, list.error)}</p>}\n <Button variant=\"outline\" size=\"sm\" disabled={list.loadingMore} onClick={() => void list.loadMore()}>\n {list.loadingMore ? t(\"groups.loading\") : list.error ? t(\"common.retry\") : t(\"groups.loadMore\")}\n </Button>\n </div>\n )}\n </>\n );\n}\n\nfunction NumberedGroups({ filter, client, ...p }: GroupDirectoryProps & { filter: GroupFilter }) {\n const key = JSON.stringify(filter);\n const [own, setOwn] = useState({ key, page: 1 });\n const page = Math.max(1, Math.floor(p.page ?? (own.key === key ? own.page : 1)));\n const top = useRef<HTMLDivElement>(null);\n const r = useGroupsPage(filter, page, { client });\n const size = filter.pageSize ?? 50;\n const go = (next: number, scroll: boolean) => {\n if (p.page === undefined) setOwn({ key, page: next });\n p.onPageChange?.(next);\n if (scroll) top.current?.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\n };\n const controls = (bottom: boolean) =>\n r.total !== undefined ? <Pagination page={page} total={r.total} pageSize={size} range={!bottom} pageHref={p.pageHref} onPageChange={(n) => go(n, bottom)} /> : null;\n return (\n <>\n <div ref={top} className=\"scroll-mt-20\">\n {controls(false)}\n </div>\n <Groups {...p} items={r.items} loading={r.loading} error={r.error} reload={r.reload} />\n {r.items.length > 0 && controls(true)}\n </>\n );\n}\n\nfunction Groups({ items, loading, error, reload, ...p }: Shown & { items: GroupCard[]; loading: boolean; error?: Parameters<typeof contentError>[1]; reload: () => void }) {\n const m = useMessages();\n const { t } = m;\n const grid = p.layout === \"grid\";\n const count = (n: number) => new Intl.NumberFormat(m.language).format(n);\n if (loading && !items.length)\n return (\n <div className={grid ? \"grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3\" : \"grid gap-2\"} aria-busy>\n {Array.from({ length: 6 }, (_, i) => (\n <Skeleton key={i} className={grid ? \"aspect-[3/4] w-full\" : \"h-6 w-48\"} />\n ))}\n </div>\n );\n if (error && !items.length)\n return (\n <div role=\"alert\" className=\"grid justify-items-start gap-2\">\n <p className=\"text-destructive\">{contentError(m, error)}</p>\n <Button size=\"sm\" variant=\"outline\" onClick={reload}>\n {t(\"common.retry\")}\n </Button>\n </div>\n );\n if (!items.length)\n return (\n <p className=\"text-muted-foreground\" role=\"status\">\n {t(\"groups.empty\")}\n </p>\n );\n return (\n <ul className={grid ? \"grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3\" : \"flex flex-wrap gap-2\"} data-ckui=\"groups\">\n {items.map((g) => (\n <li key={g.id} data-ckui=\"group\" data-slug={g.slug}>\n {p.renderGroup ? (\n p.renderGroup(g)\n ) : grid ? (\n <GroupLink group={g} href={p.href} className=\"group grid gap-1.5\">\n <GroupCover group={g} className=\"aspect-[3/4] w-full\" />\n <span className=\"font-medium break-words group-hover:underline\">{g.name || g.slug}</span>\n <span className=\"text-xs text-muted-foreground tabular-nums\">{m.plural(\"groups.items\", g.count)}</span>\n </GroupLink>\n ) : (\n <GroupLink group={g} href={p.href} className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 hover:bg-muted\">\n <span className=\"break-words\">{g.name || g.slug}</span>\n <span className=\"text-xs text-muted-foreground tabular-nums\" aria-label={m.plural(\"groups.items\", g.count)}>\n {count(g.count)}\n </span>\n </GroupLink>\n )}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":"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"}
@@ -623,14 +623,14 @@ function ne({ group: e, g: r, languages: i, onError: a }) {
623
623
  }),
624
624
  /* @__PURE__ */ W("form", {
625
625
  className: "flex flex-wrap items-end gap-2",
626
- onSubmit: (e) => {
627
- e.preventDefault();
628
- let t = S.trim();
629
- t && T.run(() => r.names("add", [{
626
+ onSubmit: (t) => {
627
+ t.preventDefault();
628
+ let n = new Set(e.names.filter((e) => e.language === u).map((e) => e.name.toLowerCase())), i = f === "alias" ? [...new Set(S.split(/[,\n]/).map((e) => e.trim()).filter((e) => e && !n.has(e.toLowerCase())))] : [S.trim()].filter(Boolean);
629
+ i.length && T.run(() => r.names("add", i.map((e) => ({
630
630
  language: u,
631
631
  kind: f,
632
- name: t
633
- }])).then((e) => e && C(""));
632
+ name: e
633
+ })))).then((e) => e && C(""));
634
634
  },
635
635
  children: [
636
636
  O.length > 1 && /* @__PURE__ */ W(_, {
@@ -670,7 +670,7 @@ function ne({ group: e, g: r, languages: i, onError: a }) {
670
670
  className: "h-8 min-w-40 flex-1",
671
671
  lang: u,
672
672
  value: S,
673
- placeholder: o("groupEditor.newName"),
673
+ placeholder: o(f === "alias" ? "groupEditor.newAliases" : "groupEditor.newName"),
674
674
  onChange: (e) => C(e.target.value)
675
675
  }),
676
676
  /* @__PURE__ */ U(s, {
@@ -768,9 +768,9 @@ function re({ group: e, g: r, languages: i, onError: a }) {
768
768
  });
769
769
  }
770
770
  function ie({ group: e, spec: t, onError: r, client: i, management: a }) {
771
- let { t: o } = n(), s = e.cover, c = s?.image ? "image" : s?.content_id && !s.auto ? "content" : "auto";
771
+ let { t: o } = n(), s = e.cover, c = s?.image ? "image" : s?.content_id && !s.auto ? "content" : "auto", l = t.owner === "user" || !!t.avatar;
772
772
  return /* @__PURE__ */ W(J, {
773
- title: o(t.owner === "user" ? "groupEditor.images" : "groupEditor.cover"),
773
+ title: o(l ? "groupEditor.images" : "groupEditor.cover"),
774
774
  ckui: "group-cover-editor",
775
775
  children: [
776
776
  /* @__PURE__ */ U("p", {
@@ -785,7 +785,7 @@ function ie({ group: e, spec: t, onError: r, client: i, management: a }) {
785
785
  client: i,
786
786
  onError: r
787
787
  }),
788
- t.owner === "user" && /* @__PURE__ */ U(I, {
788
+ l && /* @__PURE__ */ U(I, {
789
789
  management: a,
790
790
  group: e,
791
791
  slot: "avatar",