@openrails/contentkit-ui 0.85.1 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +7 -4
  2. package/dist/client/beacons.d.ts +13 -4
  3. package/dist/client/beacons.js +14 -7
  4. package/dist/client/beacons.js.map +1 -1
  5. package/dist/client/client.d.ts +3 -0
  6. package/dist/client/client.js +29 -27
  7. package/dist/client/client.js.map +1 -1
  8. package/dist/client/codes.d.ts +6 -1
  9. package/dist/client/codes.js +4 -1
  10. package/dist/client/codes.js.map +1 -1
  11. package/dist/client/generated/error-codes.js +1 -1
  12. package/dist/client/generated/error-codes.js.map +1 -1
  13. package/dist/client/generated/routes.d.ts +14 -1
  14. package/dist/client/generated/routes.js +17 -1
  15. package/dist/client/generated/routes.js.map +1 -1
  16. package/dist/client/generated/wire.d.ts +29 -0
  17. package/dist/client/generated/wire.js.map +1 -1
  18. package/dist/client/index.d.ts +2 -1
  19. package/dist/client/media/queue.d.ts +4 -2
  20. package/dist/client/media/queue.js +18 -12
  21. package/dist/client/media/queue.js.map +1 -1
  22. package/dist/client/media/rules.d.ts +7 -1
  23. package/dist/client/media/rules.js +27 -21
  24. package/dist/client/media/rules.js.map +1 -1
  25. package/dist/client/stats.d.ts +32 -0
  26. package/dist/client/stats.js +35 -0
  27. package/dist/client/stats.js.map +1 -0
  28. package/dist/client.js +30 -29
  29. package/dist/components/admin/content-manager.js +206 -206
  30. package/dist/components/admin/content-manager.js.map +1 -1
  31. package/dist/components/admin/group-manager.js +71 -70
  32. package/dist/components/admin/group-manager.js.map +1 -1
  33. package/dist/components/admin/media-item-panel.d.ts +24 -7
  34. package/dist/components/admin/media-item-panel.js +209 -197
  35. package/dist/components/admin/media-item-panel.js.map +1 -1
  36. package/dist/components/admin/poll-manager.js +25 -25
  37. package/dist/components/admin/stats-dashboard.d.ts +22 -0
  38. package/dist/components/admin/stats-dashboard.js +257 -0
  39. package/dist/components/admin/stats-dashboard.js.map +1 -0
  40. package/dist/components/content/card.js +42 -42
  41. package/dist/components/content/card.js.map +1 -1
  42. package/dist/components/content/editors.js +455 -427
  43. package/dist/components/content/editors.js.map +1 -1
  44. package/dist/components/content/grid.js +47 -47
  45. package/dist/components/content/index.d.ts +2 -1
  46. package/dist/components/content/listing.js +34 -34
  47. package/dist/components/content/listing.js.map +1 -1
  48. package/dist/components/content/paywall.d.ts +17 -5
  49. package/dist/components/content/paywall.js +115 -100
  50. package/dist/components/content/paywall.js.map +1 -1
  51. package/dist/components/content/reader-stats.d.ts +12 -0
  52. package/dist/components/content/reader-stats.js +47 -0
  53. package/dist/components/content/reader-stats.js.map +1 -0
  54. package/dist/components/groups/banner.js +33 -33
  55. package/dist/components/groups/directory.js +11 -11
  56. package/dist/components/groups/editor.js +293 -293
  57. package/dist/components/groups/editor.js.map +1 -1
  58. package/dist/components/groups/header.js +27 -27
  59. package/dist/components/groups/header.js.map +1 -1
  60. package/dist/components/groups/memberships.js +180 -180
  61. package/dist/components/groups/parts.d.ts +0 -2
  62. package/dist/components/groups/parts.js +9 -27
  63. package/dist/components/groups/parts.js.map +1 -1
  64. package/dist/components/media-folder-editor.js +239 -189
  65. package/dist/components/media-folder-editor.js.map +1 -1
  66. package/dist/components/notifications.js +17 -17
  67. package/dist/components/slot-upload.d.ts +2 -2
  68. package/dist/components/slot-upload.js +84 -79
  69. package/dist/components/slot-upload.js.map +1 -1
  70. package/dist/components/social/bans.js +34 -34
  71. package/dist/components/social/moderation.js +52 -48
  72. package/dist/components/social/moderation.js.map +1 -1
  73. package/dist/components/video-player.d.ts +2 -0
  74. package/dist/components/video-player.js +318 -314
  75. package/dist/components/video-player.js.map +1 -1
  76. package/dist/i18n/context.d.ts +2 -0
  77. package/dist/i18n/context.js +23 -5
  78. package/dist/i18n/context.js.map +1 -1
  79. package/dist/index.d.ts +2 -1
  80. package/dist/index.js +12 -10
  81. package/dist/locales/admin/de.js +27 -0
  82. package/dist/locales/admin/de.js.map +1 -1
  83. package/dist/locales/admin/en.d.ts +27 -0
  84. package/dist/locales/admin/en.js +27 -0
  85. package/dist/locales/admin/en.js.map +1 -1
  86. package/dist/locales/admin/es.js +27 -0
  87. package/dist/locales/admin/es.js.map +1 -1
  88. package/dist/locales/admin/ja.js +27 -0
  89. package/dist/locales/admin/ja.js.map +1 -1
  90. package/dist/locales/admin/ko.js +27 -0
  91. package/dist/locales/admin/ko.js.map +1 -1
  92. package/dist/locales/admin/zh.js +27 -0
  93. package/dist/locales/admin/zh.js.map +1 -1
  94. package/dist/locales/content/de.js +6 -0
  95. package/dist/locales/content/de.js.map +1 -1
  96. package/dist/locales/content/en.d.ts +6 -0
  97. package/dist/locales/content/en.js +6 -0
  98. package/dist/locales/content/en.js.map +1 -1
  99. package/dist/locales/content/es.js +6 -0
  100. package/dist/locales/content/es.js.map +1 -1
  101. package/dist/locales/content/ja.js +6 -0
  102. package/dist/locales/content/ja.js.map +1 -1
  103. package/dist/locales/content/ko.js +6 -0
  104. package/dist/locales/content/ko.js.map +1 -1
  105. package/dist/locales/content/zh.js +6 -0
  106. package/dist/locales/content/zh.js.map +1 -1
  107. package/dist/locales/de.js +1 -0
  108. package/dist/locales/de.js.map +1 -1
  109. package/dist/locales/en.d.ts +34 -0
  110. package/dist/locales/en.js +1 -0
  111. package/dist/locales/en.js.map +1 -1
  112. package/dist/locales/es.js +1 -0
  113. package/dist/locales/es.js.map +1 -1
  114. package/dist/locales/ja.js +1 -0
  115. package/dist/locales/ja.js.map +1 -1
  116. package/dist/locales/ko.js +1 -0
  117. package/dist/locales/ko.js.map +1 -1
  118. package/dist/locales/zh.js +1 -0
  119. package/dist/locales/zh.js.map +1 -1
  120. package/dist/react/admin.js +22 -23
  121. package/dist/react/admin.js.map +1 -1
  122. package/dist/react/canonical.d.ts +4 -3
  123. package/dist/react/canonical.js +34 -33
  124. package/dist/react/canonical.js.map +1 -1
  125. package/dist/react/contents.js +144 -144
  126. package/dist/react/contents.js.map +1 -1
  127. package/dist/react/detail.d.ts +12 -6
  128. package/dist/react/detail.js +31 -24
  129. package/dist/react/detail.js.map +1 -1
  130. package/dist/react/folder.d.ts +7 -2
  131. package/dist/react/folder.js +165 -147
  132. package/dist/react/folder.js.map +1 -1
  133. package/dist/react/groups.d.ts +0 -1
  134. package/dist/react/groups.js +13 -12
  135. package/dist/react/groups.js.map +1 -1
  136. package/dist/react/index.d.ts +4 -2
  137. package/dist/react/location.d.ts +11 -0
  138. package/dist/react/location.js +18 -0
  139. package/dist/react/location.js.map +1 -0
  140. package/dist/react/public.d.ts +8 -0
  141. package/dist/react/public.js +32 -27
  142. package/dist/react/public.js.map +1 -1
  143. package/dist/react/stats.d.ts +24 -0
  144. package/dist/react/stats.js +28 -0
  145. package/dist/react/stats.js.map +1 -0
  146. package/dist/react/use-resource.js +8 -7
  147. package/dist/react/use-resource.js.map +1 -1
  148. package/dist/react/versions.js +20 -20
  149. package/dist/react.js +26 -24
  150. package/dist/styles.css +1 -1
  151. package/dist/urls/index.d.ts +35 -10
  152. package/dist/urls.js +100 -70
  153. package/dist/urls.js.map +1 -1
  154. package/package.json +1 -1
@@ -2,22 +2,22 @@ import { useMessages as e } from "../../i18n/context.js";
2
2
  import { ContentKitUiRoot as t } from "../../scope.js";
3
3
  import { ContentKitContext as n, useContentKitClient as r } from "../../react/context.js";
4
4
  import { decodeImage as i } from "../../client/image.js";
5
- import { Button as a } from "../../ui/button.js";
6
- import { ImageCropDialog as o } from "../image-crop-dialog.js";
7
- import { Badge as s } from "../../ui/badge.js";
8
- import { Skeleton as c } from "../../ui/skeleton.js";
9
- import { ErrorLine as l, contentError as u, useAction as d } from "../social/parts.js";
10
- import { useGroup as f } from "../../react/groups.js";
5
+ import { useGroup as a } from "../../react/groups.js";
6
+ import { Button as o } from "../../ui/button.js";
7
+ import { ImageCropDialog as s } from "../image-crop-dialog.js";
8
+ import { Badge as c } from "../../ui/badge.js";
9
+ import { Skeleton as l } from "../../ui/skeleton.js";
10
+ import { ErrorLine as u, contentError as d, useAction as f } from "../social/parts.js";
11
11
  import { GroupAvatar as p, GroupCover as m } from "./parts.js";
12
12
  import { priceLabel as h } from "../content/paywall.js";
13
13
  import { useContext as g, useRef as _, useState as v } from "react";
14
14
  import { jsx as y, jsxs as b } from "react/jsx-runtime";
15
15
  import { cn as x } from "cn";
16
16
  //#region src/components/groups/banner.tsx
17
- function S({ group: i, onCheckout: o, onSignIn: c, client: f, onError: p, className: m, appearance: _ }) {
18
- let v = e(), { t: S } = v, C = r(f), w = g(n), T = d("membership.join", p), E = i.access;
17
+ function S({ group: i, onCheckout: a, onSignIn: s, client: l, onError: p, className: m, appearance: _ }) {
18
+ let v = e(), { t: S } = v, C = r(l), w = g(n), T = f("membership.join", p), E = i.access;
19
19
  if (!E || E.editor || !E.offer && !E.member && !E.unknown) return null;
20
- let D = w?.viewer === null, O = c ?? w?.onSignIn, k = E.offer && Number(E.offer.terms.amount) > 0 ? E.offer : void 0;
20
+ let D = w?.viewer === null, O = s ?? w?.onSignIn, k = E.offer && Number(E.offer.terms.amount) > 0 ? E.offer : void 0;
21
21
  return /* @__PURE__ */ b(t, {
22
22
  appearance: _,
23
23
  className: x("grid gap-2 rounded-lg border border-border p-3 text-sm", m),
@@ -28,7 +28,7 @@ function S({ group: i, onCheckout: o, onSignIn: c, client: f, onError: p, classN
28
28
  children: S("membership.unknown")
29
29
  }) : E.member ? /* @__PURE__ */ b("div", {
30
30
  className: "flex flex-wrap items-center gap-2",
31
- children: [/* @__PURE__ */ y(s, { children: S("membership.member") }), !k && /* @__PURE__ */ y(a, {
31
+ children: [/* @__PURE__ */ y(c, { children: S("membership.member") }), !k && /* @__PURE__ */ y(o, {
32
32
  size: "sm",
33
33
  variant: "ghost",
34
34
  disabled: T.pending,
@@ -40,13 +40,13 @@ function S({ group: i, onCheckout: o, onSignIn: c, client: f, onError: p, classN
40
40
  children: [/* @__PURE__ */ y("p", {
41
41
  className: "text-muted-foreground",
42
42
  children: S(k ? "membership.paidPitch" : "membership.freePitch")
43
- }), /* @__PURE__ */ y(a, {
43
+ }), /* @__PURE__ */ y(o, {
44
44
  size: "sm",
45
45
  className: "justify-self-start",
46
- disabled: T.pending || !!k && !o,
46
+ disabled: T.pending || !!k && !a,
47
47
  onClick: () => {
48
48
  if (D && O) return O();
49
- if (k) return o?.({
49
+ if (k) return a?.({
50
50
  key: E.key,
51
51
  offer: k
52
52
  });
@@ -54,69 +54,69 @@ function S({ group: i, onCheckout: o, onSignIn: c, client: f, onError: p, classN
54
54
  },
55
55
  children: k ? S("membership.joinFor", { price: h(v, k.terms) }) : S("membership.join")
56
56
  })]
57
- }), T.error && /* @__PURE__ */ y(l, { children: u(v, T.error) })]
57
+ }), T.error && /* @__PURE__ */ y(u, { children: d(v, T.error) })]
58
58
  });
59
59
  }
60
60
  function C(n) {
61
- let r = e(), i = f(n.group ? null : n.id, {
61
+ let r = e(), i = a(n.group ? null : n.id, {
62
62
  language: n.language,
63
63
  client: n.client
64
- }), a = n.group ?? i.group;
65
- if (!a) return i.error ? /* @__PURE__ */ y(l, { children: u(r, i.error) }) : /* @__PURE__ */ y(c, { className: "h-48 w-full" });
66
- let o = a.text.find((e) => e.language === (n.language ?? a.name_language)) ?? a.text.find((e) => e.description), s = a.counts.filter((e) => e.language === (n.language ?? "")).reduce((e, t) => e + t.count, 0);
64
+ }), o = n.group ?? i.group;
65
+ if (!o) return i.error ? /* @__PURE__ */ y(u, { children: d(r, i.error) }) : /* @__PURE__ */ y(l, { className: "h-48 w-full" });
66
+ let s = o.text.find((e) => e.language === (n.language ?? o.name_language)) ?? o.text.find((e) => e.description), c = o.counts.filter((e) => e.language === (n.language ?? "")).reduce((e, t) => e + t.count, 0);
67
67
  return /* @__PURE__ */ b(t, {
68
68
  appearance: n.appearance,
69
69
  className: x("grid gap-3 text-sm", n.className),
70
70
  "data-ckui": "group-banner",
71
- "data-kind": a.kind,
71
+ "data-kind": o.kind,
72
72
  children: [
73
73
  /* @__PURE__ */ y(m, {
74
- group: a,
74
+ group: o,
75
75
  className: "aspect-[3/1] w-full"
76
76
  }),
77
77
  /* @__PURE__ */ b("div", {
78
78
  className: "flex flex-wrap items-end gap-4 px-2 sm:px-4",
79
79
  children: [
80
80
  /* @__PURE__ */ y(p, {
81
- group: a,
81
+ group: o,
82
82
  className: "-mt-12 size-20 border-4 border-background sm:-mt-16 sm:size-28"
83
83
  }),
84
84
  /* @__PURE__ */ b("div", {
85
85
  className: "grid min-w-0 flex-1 gap-1",
86
86
  children: [/* @__PURE__ */ y("h1", {
87
87
  className: "text-xl font-semibold break-words",
88
- children: a.name || a.slug
88
+ children: o.name || o.slug
89
89
  }), /* @__PURE__ */ y("p", {
90
90
  className: "text-xs text-muted-foreground tabular-nums",
91
- children: r.plural("groups.items", s)
91
+ children: r.plural("groups.items", c)
92
92
  })]
93
93
  }),
94
94
  /* @__PURE__ */ b("div", {
95
95
  className: "flex flex-wrap items-start gap-2",
96
96
  children: [/* @__PURE__ */ y(S, {
97
- group: a,
97
+ group: o,
98
98
  onCheckout: n.onCheckout,
99
99
  client: n.client
100
100
  }), n.children]
101
101
  })
102
102
  ]
103
103
  }),
104
- o?.description && /* @__PURE__ */ y("p", {
104
+ s?.description && /* @__PURE__ */ y("p", {
105
105
  className: "px-2 break-words whitespace-pre-line sm:px-4",
106
- children: o.description
106
+ children: s.description
107
107
  })
108
108
  ]
109
109
  });
110
110
  }
111
- function w({ group: t, slot: n, crop: r = !0, client: s, onError: c, className: u }) {
112
- let { t: h } = e(), g = f(t.id, { client: s }), S = _(null), C = d("group.save", c), [w, T] = v(null), [E, D] = v(null), O = g.group ?? t, k = n === "cover" ? !!O.cover?.image || !!O.cover?.content_id && !O.cover.auto : !!O.avatar?.image, A = (e, t) => C.run(() => g.uploadImage(n, e, {
111
+ function w({ group: t, slot: n, crop: r = !0, client: c, onError: l, className: d }) {
112
+ let { t: h } = e(), g = a(t.id, { client: c }), S = _(null), C = f("group.save", l), [w, T] = v(null), [E, D] = v(null), O = g.group ?? t, k = n === "cover" ? !!O.cover?.image || !!O.cover?.content_id && !O.cover.auto : !!O.avatar?.image, A = (e, t) => C.run(() => g.uploadImage(n, e, {
113
113
  wait: !1,
114
114
  edit: t
115
115
  })), j = () => {
116
116
  w?.revoke?.(), T(null), D(null);
117
117
  };
118
118
  return /* @__PURE__ */ b("div", {
119
- className: x("flex flex-wrap items-center gap-3", u),
119
+ className: x("flex flex-wrap items-center gap-3", d),
120
120
  "data-ckui": "group-image-editor",
121
121
  "data-slot": n,
122
122
  children: [
@@ -134,14 +134,14 @@ function w({ group: t, slot: n, crop: r = !0, client: s, onError: c, className:
134
134
  children: [
135
135
  /* @__PURE__ */ b("div", {
136
136
  className: "flex flex-wrap gap-2",
137
- children: [/* @__PURE__ */ y(a, {
137
+ children: [/* @__PURE__ */ y(o, {
138
138
  type: "button",
139
139
  size: "sm",
140
140
  variant: "outline",
141
141
  disabled: C.pending,
142
142
  onClick: () => S.current?.click(),
143
143
  children: C.pending ? h("groupEditor.uploading") : h(n === "avatar" ? "groupEditor.uploadAvatar" : "groupEditor.uploadCover")
144
- }), k && /* @__PURE__ */ y(a, {
144
+ }), k && /* @__PURE__ */ y(o, {
145
145
  type: "button",
146
146
  size: "sm",
147
147
  variant: "ghost",
@@ -166,10 +166,10 @@ function w({ group: t, slot: n, crop: r = !0, client: s, onError: c, className:
166
166
  }
167
167
  }
168
168
  }),
169
- /* @__PURE__ */ y(l, { error: C.error })
169
+ /* @__PURE__ */ y(u, { error: C.error })
170
170
  ]
171
171
  }),
172
- /* @__PURE__ */ y(o, {
172
+ /* @__PURE__ */ y(s, {
173
173
  open: !!w,
174
174
  onOpenChange: (e) => !e && j(),
175
175
  source: w,
@@ -1,17 +1,17 @@
1
1
  import { useMessages as e } from "../../i18n/context.js";
2
2
  import { ContentKitUiRoot as t } from "../../scope.js";
3
- import { Button as n } from "../../ui/button.js";
4
- import { Skeleton as r } from "../../ui/skeleton.js";
5
- import { contentError as i } from "../social/parts.js";
6
- import { LETTERS as a } from "../../client/group-fields.js";
7
- import { useGroups as o } from "../../react/groups.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
8
  import { GroupCover as s, GroupLink as c } from "./parts.js";
9
9
  import { useState as l } from "react";
10
10
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
11
11
  import { cn as f } from "cn";
12
12
  //#region src/components/groups/directory.tsx
13
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 = o({
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
15
  kind: p.kind,
16
16
  language: p.language,
17
17
  contentKind: p.contentKind,
@@ -31,7 +31,7 @@ function p(p) {
31
31
  "aria-label": h("groups.byLetter"),
32
32
  className: "flex flex-wrap gap-1",
33
33
  "data-ckui": "letters",
34
- children: [null, ...a].map((e) => /* @__PURE__ */ u(n, {
34
+ children: [null, ...o].map((e) => /* @__PURE__ */ u(r, {
35
35
  size: "xs",
36
36
  variant: v === e ? "default" : "ghost",
37
37
  "aria-pressed": v === e,
@@ -44,14 +44,14 @@ function p(p) {
44
44
  b.loading && !b.items.length ? /* @__PURE__ */ u("div", {
45
45
  className: x ? "grid grid-cols-[repeat(auto-fill,minmax(9rem,1fr))] gap-3" : "grid gap-2",
46
46
  "aria-busy": !0,
47
- children: Array.from({ length: 6 }, (e, t) => /* @__PURE__ */ u(r, { className: x ? "aspect-[3/4] w-full" : "h-6 w-48" }, t))
47
+ children: Array.from({ length: 6 }, (e, t) => /* @__PURE__ */ u(i, { className: x ? "aspect-[3/4] w-full" : "h-6 w-48" }, t))
48
48
  }) : b.error && !b.items.length ? /* @__PURE__ */ d("div", {
49
49
  role: "alert",
50
50
  className: "grid justify-items-start gap-2",
51
51
  children: [/* @__PURE__ */ u("p", {
52
52
  className: "text-destructive",
53
- children: i(m, b.error)
54
- }), /* @__PURE__ */ u(n, {
53
+ children: a(m, b.error)
54
+ }), /* @__PURE__ */ u(r, {
55
55
  size: "sm",
56
56
  variant: "outline",
57
57
  onClick: b.reload,
@@ -100,7 +100,7 @@ function p(p) {
100
100
  role: "status",
101
101
  children: h("groups.empty")
102
102
  }),
103
- b.hasMore && /* @__PURE__ */ u(n, {
103
+ b.hasMore && /* @__PURE__ */ u(r, {
104
104
  variant: "outline",
105
105
  size: "sm",
106
106
  className: "justify-self-center",