@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,76 +1,76 @@
1
1
  import { failureError as e } from "../client/errors.js";
2
2
  import { itemKey as t } from "../client/media/ref.js";
3
3
  import { stem as n } from "../client/media/client.js";
4
- import { acceptOf as r, ratioLabel as i } from "../client/media/rules.js";
5
- import { megabytes as a } from "../i18n/messages.js";
6
- import { useMessages as o } from "../i18n/context.js";
7
- import { ContentKitUiRoot as s } from "../scope.js";
8
- import { Progress as c } from "../ui/progress.js";
9
- import { EncodeProgress as l } from "./encode-progress.js";
10
- import { isProcessing as u } from "../client/media/windows.js";
11
- import { Alert as d, AlertDescription as f, AlertTitle as p } from "../ui/alert.js";
12
- import { Button as m } from "../ui/button.js";
13
- import { progressLabel as h, progressValue as g } from "./progress.js";
14
- import { ImageCropDialog as ee } from "./image-crop-dialog.js";
15
- import { isAudioType as _, isImageType as v, isSubtitleType as y, isVideoType as b } from "../client/gallery.js";
16
- import { useEditorCrop as x } from "../react/crop.js";
17
- import { nameIn as S, thumbnailOf as C, useMediaFolder as w } from "../react/folder.js";
18
- import { SortableList as T } from "./sortable-list.js";
19
- import { useEffect as E, useImperativeHandle as D, useMemo as O, useRef as te, useState as k } from "react";
4
+ import { acceptOf as r, ratioLabel as i, ruleFor as a } from "../client/media/rules.js";
5
+ import { megabytes as o } from "../i18n/messages.js";
6
+ import { useMessages as s } from "../i18n/context.js";
7
+ import { ContentKitUiRoot as c } from "../scope.js";
8
+ import { Progress as l } from "../ui/progress.js";
9
+ import { EncodeProgress as u } from "./encode-progress.js";
10
+ import { isProcessing as d, pageRemoved as f } from "../client/media/windows.js";
11
+ import { Alert as p, AlertDescription as m, AlertTitle as h } from "../ui/alert.js";
12
+ import { Button as g } from "../ui/button.js";
13
+ import { progressLabel as _, progressValue as v } from "./progress.js";
14
+ import { ImageCropDialog as y } from "./image-crop-dialog.js";
15
+ import { isAudioType as b, isImageType as x, isSubtitleType as S, isVideoType as C } from "../client/gallery.js";
16
+ import { useEditorCrop as w } from "../react/crop.js";
17
+ import { nameIn as ee, thumbnailOf as T, useMediaFolder as E } from "../react/folder.js";
18
+ import { SortableList as D } from "./sortable-list.js";
19
+ import { useEffect as te, useImperativeHandle as ne, useMemo as O, useRef as re, useState as k } from "react";
20
20
  import { Fragment as A, jsx as j, jsxs as M } from "react/jsx-runtime";
21
21
  import { cn as N } from "cn";
22
- import { Alert02Icon as P, CropIcon as F, Delete02Icon as I, Edit02Icon as L, File01Icon as R, Image01Icon as z, ImageAdd01Icon as ne, Loading03Icon as re, MusicNote01Icon as B, Refresh01Icon as V, RepeatIcon as H, Video01Icon as U } from "@hugeicons/core-free-icons";
23
- import { HugeiconsIcon as W } from "@hugeicons/react";
22
+ import { Alert02Icon as ie, Cancel01Icon as P, CropIcon as F, Delete02Icon as I, Edit02Icon as L, File01Icon as R, Image01Icon as z, ImageAdd01Icon as ae, Loading03Icon as oe, MusicNote01Icon as se, Refresh01Icon as ce, RepeatIcon as B, Video01Icon as V } from "@hugeicons/core-free-icons";
23
+ import { HugeiconsIcon as H } from "@hugeicons/react";
24
24
  //#region src/components/media-folder-editor.tsx
25
- var ie = [
25
+ var le = [
26
26
  "",
27
27
  "1:1",
28
28
  "4:5",
29
29
  "16:9"
30
30
  ];
31
- function G(e) {
32
- return v(e) ? "image" : b(e) ? "video" : _(e) ? "audio" : y(e) ? "subtitle" : "file";
31
+ function U(e) {
32
+ return x(e) ? "image" : C(e) ? "video" : b(e) ? "audio" : S(e) ? "subtitle" : "file";
33
33
  }
34
- var K = {
34
+ var W = {
35
35
  image: z,
36
- video: U,
37
- audio: B,
36
+ video: V,
37
+ audio: se,
38
38
  subtitle: R,
39
39
  file: R
40
40
  };
41
- function q(e) {
42
- let t = new Set((e?.types ?? []).map(G));
41
+ function G(e) {
42
+ let t = new Set((e?.types ?? []).map(U));
43
43
  return t.size === 1 ? [...t][0] : "file";
44
44
  }
45
- function ae(e, t) {
45
+ function ue(e, t) {
46
46
  let n = [];
47
47
  for (let r of t) {
48
48
  if (!r.types.length) continue;
49
- let t = e(`folder.kinds.${q(r)}`), o = r.max_bytes > 0 ? e("folder.limitSize", {
49
+ let t = e(`folder.kinds.${G(r)}`), a = r.max_bytes > 0 ? e("folder.limitSize", {
50
50
  what: t,
51
- size: a(r.max_bytes)
51
+ size: o(r.max_bytes)
52
52
  }) : t;
53
- n.push(r.max ? `${o}, ${e("folder.limitMax", { max: r.max })}` : o), r.min_aspect && r.max_aspect && n.push(e("folder.limitAspect", {
53
+ n.push(r.max ? `${a}, ${e("folder.limitMax", { max: r.max })}` : a), r.min_aspect && r.max_aspect && n.push(e("folder.limitAspect", {
54
54
  min: i(r.min_aspect),
55
55
  max: i(r.max_aspect)
56
56
  }));
57
57
  }
58
58
  return n.join(" · ");
59
59
  }
60
- function J(e) {
60
+ function de(e) {
61
61
  if (e.folder) {
62
62
  let { folder: n, ...r } = e;
63
- return /* @__PURE__ */ j(X, {
63
+ return /* @__PURE__ */ j(q, {
64
64
  folder: n,
65
65
  ...r
66
66
  }, n.ref ? t(n.ref) : "");
67
67
  }
68
- return /* @__PURE__ */ j(Y, { ...e }, t(e.item));
68
+ return /* @__PURE__ */ j(K, { ...e }, t(e.item));
69
69
  }
70
- function Y(e) {
71
- let { item: t, ref: n, label: r, layout: i, inputLabel: a, toolbar: o, rowActions: s, footer: c, aspects: l, confirmRemove: u, disabled: d, className: f, appearance: p, ...m } = e, h = w(t, m);
72
- return /* @__PURE__ */ j(X, {
73
- folder: h,
70
+ function K(e) {
71
+ let { item: t, ref: n, label: r, layout: i, inputLabel: a, toolbar: o, rowActions: s, footer: c, aspects: l, confirmRemove: u, disabled: d, className: f, appearance: p, selectedPage: m, onSelectPage: h, ...g } = e, _ = E(t, g);
72
+ return /* @__PURE__ */ j(q, {
73
+ folder: _,
74
74
  ref: n,
75
75
  label: r,
76
76
  layout: i,
@@ -82,109 +82,111 @@ function Y(e) {
82
82
  confirmRemove: u,
83
83
  disabled: d,
84
84
  className: f,
85
- appearance: p
85
+ appearance: p,
86
+ selectedPage: m,
87
+ onSelectPage: h
86
88
  });
87
89
  }
88
- var oe = {
90
+ var fe = {
89
91
  kind: "",
90
92
  id: ""
91
93
  };
92
- function X(e) {
93
- let { folder: t, ref: n, label: i, layout: a, inputLabel: c, toolbar: l, rowActions: u, footer: h, aspects: g = ie, confirmRemove: _, disabled: v, className: y, appearance: b } = e, { t: S, error: C } = o(), { groups: w, queue: O, read: A, options: F } = t;
94
- D(n, () => ({
94
+ function q(e) {
95
+ let { folder: t, ref: n, label: i, layout: o, inputLabel: l, toolbar: u, rowActions: d, footer: f, aspects: _ = le, confirmRemove: v, disabled: b, className: S, appearance: C, selectedPage: ee, onSelectPage: T } = e, { t: E, error: O } = s(), { groups: A, queue: P, read: F, options: L } = t;
96
+ ne(n, () => ({
95
97
  discard: t.discard,
96
98
  commit: t.commit,
97
99
  folder: t
98
100
  }), [t]);
99
- let L = F.commit === "auto", R = w.flatMap((e) => e.rule ? [e.rule] : []), z = r(R), B = t.uploads.length + O.items.length + t.waiting.length + t.pending.length === 0, V = !!v, [H, U] = k(/* @__PURE__ */ new Set());
100
- E(() => {
101
+ let R = L.commit === "auto", z = A.flatMap((e) => e.rule ? [e.rule] : []), se = r(z), ce = t.uploads.length + P.items.length + t.waiting.length + t.pending.length === 0, B = !!b, [V, W] = k(/* @__PURE__ */ new Set());
102
+ te(() => {
101
103
  let e = new Set(t.uploads.map((e) => e.path));
102
- U((t) => [...t].every((t) => e.has(t)) ? t : new Set([...t].filter((t) => e.has(t))));
104
+ W((t) => [...t].every((t) => e.has(t)) ? t : new Set([...t].filter((t) => e.has(t))));
103
105
  }, [t.uploads]);
104
- let [K, q] = k(null), J = x(t.ref ?? oe, K, {
105
- client: F.client,
106
- onError: F.onError,
107
- onSaved: () => q(null)
108
- }), Y = K ? w.find((e) => e.files.some((e) => e.path === K))?.rule : void 0, [X, ce] = k(null), Q = te(null), [$, de] = k(null), [fe, pe] = k(!1), me = {
106
+ let [G, de] = k(null), K = w(t.ref ?? fe, G, {
107
+ client: L.client,
108
+ onError: L.onError,
109
+ onSaved: () => de(null)
110
+ }), q = G ? A.find((e) => e.files.some((e) => e.path === G))?.rule : void 0, [J, Y] = k(null), X = re(null), [Z, ge] = k(null), [_e, Q] = k(!1), be = {
109
111
  onDragOver: (e) => {
110
- !V && e.dataTransfer.types.includes("Files") && (e.preventDefault(), pe(!0));
112
+ !B && e.dataTransfer.types.includes("Files") && (e.preventDefault(), Q(!0));
111
113
  },
112
114
  onDragLeave: (e) => {
113
- e.currentTarget.contains(e.relatedTarget) || pe(!1);
115
+ e.currentTarget.contains(e.relatedTarget) || Q(!1);
114
116
  },
115
117
  onDrop: (e) => {
116
- !V && e.dataTransfer.files.length && (e.preventDefault(), pe(!1), t.add(e.dataTransfer.files));
118
+ !B && e.dataTransfer.files.length && (e.preventDefault(), Q(!1), t.add(e.dataTransfer.files));
117
119
  }
118
- }, he = async () => {
119
- let e = [...H];
120
- (_ === !1 || (_ ? await _(e.length) : globalThis.confirm?.(S("folder.confirmRemove", { count: e.length })) ?? !0)) && await t.remove(e).then(() => U(/* @__PURE__ */ new Set()), () => {});
121
- }, ge = O.items.filter((e) => e.status === "uploaded").length + t.pending.length, _e = (e) => /* @__PURE__ */ M("label", {
122
- className: N(e ? "flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border px-4 py-8 text-center text-sm text-muted-foreground transition-colors hover:border-primary hover:bg-primary/5" : "inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-sm font-medium transition-colors hover:bg-muted focus-within:ring-3 focus-within:ring-ring/50", e && fe && "border-primary bg-primary/5", V && "pointer-events-none opacity-50"),
120
+ }, xe = async () => {
121
+ let e = [...V];
122
+ (v === !1 || (v ? await v(e.length) : globalThis.confirm?.(E("folder.confirmRemove", { count: e.length })) ?? !0)) && await t.remove(e).then(() => W(/* @__PURE__ */ new Set()), () => {});
123
+ }, Se = P.items.filter((e) => e.status === "uploaded").length + t.pending.length, $ = o === "grid" ? A.find((e) => e.rule?.page) : void 0, Ce = (e) => !!$ && a(z, e)?.path === $.rule.path, we = P.items.filter((e) => Ce(e.path)), Te = P.items.filter((e) => !Ce(e.path)), Ee = t.pending.filter((e) => Ce(e.path)), De = t.pending.filter((e) => !Ce(e.path)), Oe = $ ? t.waiting.filter((e) => x(e.type)) : [], ke = $ ? t.waiting.filter((e) => !x(e.type)) : t.waiting, Ae = (e) => /* @__PURE__ */ M("label", {
124
+ className: N(e ? "flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border px-4 py-8 text-center text-sm text-muted-foreground transition-colors hover:border-primary hover:bg-primary/5" : "inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-sm font-medium transition-colors hover:bg-muted focus-within:ring-3 focus-within:ring-ring/50", e && _e && "border-primary bg-primary/5", B && "pointer-events-none opacity-50"),
123
125
  "data-ckui": e ? "folder-drop" : "folder-add",
124
126
  children: [
125
- /* @__PURE__ */ j(W, {
126
- icon: ne,
127
+ /* @__PURE__ */ j(H, {
128
+ icon: ae,
127
129
  strokeWidth: 1.75,
128
130
  className: e ? "size-7" : "size-4"
129
131
  }),
130
132
  e ? /* @__PURE__ */ j("strong", {
131
133
  className: "font-medium text-foreground",
132
- children: S("folder.drop")
133
- }) : S("folder.add"),
134
- e && R.length > 0 && /* @__PURE__ */ j("span", {
134
+ children: E("folder.drop")
135
+ }) : E("folder.add"),
136
+ e && z.length > 0 && /* @__PURE__ */ j("span", {
135
137
  className: "text-xs",
136
- children: ae(S, R)
138
+ children: ue(E, z)
137
139
  }),
138
140
  /* @__PURE__ */ j("input", {
139
141
  type: "file",
140
142
  multiple: !0,
141
- accept: z,
143
+ accept: se,
142
144
  className: "sr-only",
143
- disabled: V,
145
+ disabled: B,
144
146
  "data-ckui": "file",
145
- "aria-label": c,
147
+ "aria-label": l,
146
148
  onChange: (e) => {
147
149
  t.add([...e.target.files ?? []]), e.target.value = "";
148
150
  }
149
151
  })
150
152
  ]
151
153
  });
152
- return /* @__PURE__ */ M(s, {
153
- appearance: b,
154
- className: N("grid gap-3", y),
154
+ return /* @__PURE__ */ M(c, {
155
+ appearance: C,
156
+ className: N("grid gap-3", S),
155
157
  "data-ckui": "media-folder",
156
- "data-over": fe ? "" : void 0,
157
- ...me,
158
+ "data-over": _e ? "" : void 0,
159
+ ...be,
158
160
  children: [
159
161
  /* @__PURE__ */ M("div", {
160
162
  className: "flex flex-wrap items-center justify-between gap-2",
161
163
  "data-ckui": "folder-header",
162
164
  children: [i !== !1 && /* @__PURE__ */ j("h3", {
163
165
  className: "text-sm font-semibold",
164
- children: i ?? S("folder.label")
166
+ children: i ?? E("folder.label")
165
167
  }), /* @__PURE__ */ M("div", {
166
168
  className: "flex flex-wrap items-center gap-2",
167
- children: [l, !B && _e(!1)]
169
+ children: [u, !ce && Ae(!1)]
168
170
  })]
169
171
  }),
170
- B && (A.read || !t.ref) && _e(!0),
171
- B && !A.read && A.loading && /* @__PURE__ */ j("div", {
172
+ ce && (F.read || !t.ref) && Ae(!0),
173
+ ce && !F.read && F.loading && /* @__PURE__ */ j("div", {
172
174
  className: "flex justify-center py-6 text-muted-foreground",
173
175
  "data-ckui": "folder-loading",
174
- children: /* @__PURE__ */ j(W, {
175
- icon: re,
176
+ children: /* @__PURE__ */ j(H, {
177
+ icon: oe,
176
178
  strokeWidth: 2,
177
179
  className: "size-5 motion-safe:animate-spin"
178
180
  })
179
181
  }),
180
- t.refused.length > 0 && /* @__PURE__ */ M(d, {
182
+ t.refused.length > 0 && /* @__PURE__ */ M(p, {
181
183
  variant: "destructive",
182
184
  role: "alert",
183
185
  "data-ckui": "folder-refused",
184
- children: [/* @__PURE__ */ j(W, {
185
- icon: P,
186
+ children: [/* @__PURE__ */ j(H, {
187
+ icon: ie,
186
188
  strokeWidth: 2
187
- }), /* @__PURE__ */ M(f, { children: [/* @__PURE__ */ j("ul", {
189
+ }), /* @__PURE__ */ M(m, { children: [/* @__PURE__ */ j("ul", {
188
190
  className: "grid gap-0.5",
189
191
  children: t.refused.map((e, t) => /* @__PURE__ */ M("li", { children: [
190
192
  /* @__PURE__ */ j("span", {
@@ -192,94 +194,104 @@ function X(e) {
192
194
  children: e.file.name
193
195
  }),
194
196
  ": ",
195
- C(e.error)
197
+ O(e.error)
196
198
  ] }, t))
197
- }), /* @__PURE__ */ j(m, {
199
+ }), /* @__PURE__ */ j(g, {
198
200
  variant: "outline",
199
201
  size: "xs",
200
202
  className: "mt-1 w-fit",
201
203
  onClick: t.dismiss,
202
- children: S("folder.dismiss")
204
+ children: E("folder.dismiss")
203
205
  })] })]
204
206
  }),
205
- O.blocked && /* @__PURE__ */ M(d, {
207
+ P.blocked && /* @__PURE__ */ M(p, {
206
208
  variant: "destructive",
207
209
  role: "alert",
208
210
  "data-ckui": "folder-paused",
209
211
  children: [
210
- /* @__PURE__ */ j(W, {
211
- icon: P,
212
+ /* @__PURE__ */ j(H, {
213
+ icon: ie,
212
214
  strokeWidth: 2
213
215
  }),
214
- /* @__PURE__ */ j(p, { children: S("folder.paused") }),
215
- /* @__PURE__ */ M(f, { children: [C(O.blocked), /* @__PURE__ */ j(m, {
216
+ /* @__PURE__ */ j(h, { children: E("folder.paused") }),
217
+ /* @__PURE__ */ M(m, { children: [O(P.blocked), /* @__PURE__ */ j(g, {
216
218
  variant: "outline",
217
219
  size: "xs",
218
220
  className: "mt-1 w-fit",
219
- onClick: () => O.start(),
220
- children: S("folder.resume")
221
+ onClick: () => P.start(),
222
+ children: E("folder.resume")
221
223
  })] })
222
224
  ]
223
225
  }),
224
- t.error && /* @__PURE__ */ M(d, {
226
+ t.error && /* @__PURE__ */ M(p, {
225
227
  variant: "destructive",
226
228
  role: "alert",
227
229
  "data-ckui": "folder-error",
228
- children: [/* @__PURE__ */ j(W, {
229
- icon: P,
230
+ children: [/* @__PURE__ */ j(H, {
231
+ icon: ie,
230
232
  strokeWidth: 2
231
- }), /* @__PURE__ */ j(f, { children: C(t.error) })]
233
+ }), /* @__PURE__ */ j(m, { children: O(t.error) })]
232
234
  }),
233
- H.size > 0 && /* @__PURE__ */ M("div", {
235
+ V.size > 0 && /* @__PURE__ */ M("div", {
234
236
  className: "flex flex-wrap items-center gap-2 rounded-md bg-muted px-3 py-1.5 text-sm",
235
237
  "data-ckui": "folder-selection",
236
238
  children: [
237
239
  /* @__PURE__ */ j("span", {
238
240
  className: "tabular-nums",
239
- children: S("folder.selected", { count: H.size })
241
+ children: E("folder.selected", { count: V.size })
240
242
  }),
241
- /* @__PURE__ */ M(m, {
243
+ /* @__PURE__ */ M(g, {
242
244
  variant: "destructive",
243
245
  size: "xs",
244
- disabled: V || t.updating,
245
- onClick: () => void he(),
246
- children: [/* @__PURE__ */ j(W, {
246
+ disabled: B || t.updating,
247
+ onClick: () => void xe(),
248
+ children: [/* @__PURE__ */ j(H, {
247
249
  icon: I,
248
250
  strokeWidth: 2
249
- }), S("folder.removeSelected")]
251
+ }), E("folder.removeSelected")]
250
252
  }),
251
- /* @__PURE__ */ j(m, {
253
+ /* @__PURE__ */ j(g, {
252
254
  variant: "ghost",
253
255
  size: "xs",
254
- onClick: () => U(/* @__PURE__ */ new Set()),
255
- children: S("folder.clearSelection")
256
+ onClick: () => W(/* @__PURE__ */ new Set()),
257
+ children: E("folder.clearSelection")
256
258
  })
257
259
  ]
258
260
  }),
259
- w.map((e) => e.files.length ? /* @__PURE__ */ j(se, {
261
+ A.map((e) => e === $ ? e.files.length + we.length + Ee.length + Oe.length > 0 && /* @__PURE__ */ j(me, {
262
+ group: e,
263
+ folder: t,
264
+ disabled: B,
265
+ auto: R,
266
+ selected: ee ?? null,
267
+ onSelect: (e) => T?.(e),
268
+ queued: we,
269
+ pending: Ee,
270
+ waiting: Oe
271
+ }, e.path) : e.files.length ? /* @__PURE__ */ j(pe, {
260
272
  group: e,
261
- layout: a === "grid" && e.rule?.page ? "grid" : "list",
262
- titled: w.length > 1,
273
+ layout: o === "grid" && e.rule?.page ? "grid" : "list",
274
+ titled: A.length > 1,
263
275
  folder: t,
264
- disabled: V,
265
- selected: H,
266
- onSelect: (e, t) => U((n) => t ? /* @__PURE__ */ new Set([...n, e]) : new Set([...n].filter((t) => t !== e))),
267
- renaming: X,
268
- onRename: ce,
269
- onCrop: q,
276
+ disabled: B,
277
+ selected: V,
278
+ onSelect: (e, t) => W((n) => t ? /* @__PURE__ */ new Set([...n, e]) : new Set([...n].filter((t) => t !== e))),
279
+ renaming: J,
280
+ onRename: Y,
281
+ onCrop: de,
270
282
  onReplace: (e) => {
271
- de(e), Q.current?.click();
283
+ ge(e), X.current?.click();
272
284
  },
273
- rowActions: u
285
+ rowActions: d
274
286
  }, e.path) : null),
275
- t.waiting.length > 0 && /* @__PURE__ */ j("ul", {
287
+ ke.length > 0 && /* @__PURE__ */ j("ul", {
276
288
  className: "grid",
277
- "aria-label": S("folder.label"),
278
- children: t.waiting.map((e, t) => /* @__PURE__ */ M("li", {
289
+ "aria-label": E("folder.label"),
290
+ children: ke.map((e, t) => /* @__PURE__ */ M("li", {
279
291
  className: "flex min-h-11 items-center gap-2 px-1",
280
292
  "data-ckui": "queue-row",
281
293
  "data-status": "waiting",
282
- children: [/* @__PURE__ */ j(Z, { kind: G(e.type) }), /* @__PURE__ */ M("div", {
294
+ children: [/* @__PURE__ */ j(he, { kind: U(e.type) }), /* @__PURE__ */ M("div", {
283
295
  className: "grid min-w-0 flex-1 gap-1",
284
296
  children: [/* @__PURE__ */ j("span", {
285
297
  className: "truncate text-sm",
@@ -287,83 +299,83 @@ function X(e) {
287
299
  }), /* @__PURE__ */ j("span", {
288
300
  className: "text-xs text-muted-foreground",
289
301
  "data-ckui": "queue-status",
290
- children: S("folder.queued")
302
+ children: E("folder.queued")
291
303
  })]
292
304
  })]
293
305
  }, t))
294
306
  }),
295
- t.pending.length > 0 && /* @__PURE__ */ j("ul", {
307
+ De.length > 0 && /* @__PURE__ */ j("ul", {
296
308
  className: "grid",
297
- "aria-label": S("folder.label"),
309
+ "aria-label": E("folder.label"),
298
310
  "data-ckui": "folder-pending",
299
- children: t.pending.map((e) => /* @__PURE__ */ j(le, {
311
+ children: De.map((e) => /* @__PURE__ */ j(ve, {
300
312
  file: e,
301
313
  folder: t,
302
- auto: L,
303
- disabled: V
314
+ auto: R,
315
+ disabled: B
304
316
  }, e.path))
305
317
  }),
306
- O.items.length > 0 && /* @__PURE__ */ j(T, {
307
- items: O.items,
318
+ Te.length > 0 && /* @__PURE__ */ j(D, {
319
+ items: Te,
308
320
  id: (e) => e.id,
309
321
  name: (e) => e.file.name,
310
- disabled: L || V,
311
- label: S("folder.label"),
312
- onMove: (e, t) => O.move(O.items[e].id, t),
322
+ disabled: R || B,
323
+ label: E("folder.label"),
324
+ onMove: (e, t) => P.move(Te[e].id, P.items.indexOf(Te[t])),
313
325
  row: (e) => ({
314
326
  className: "flex min-h-11 items-center gap-2 px-1",
315
327
  "data-ckui": "queue-row",
316
328
  "data-status": e.status
317
329
  }),
318
- children: (e, n) => /* @__PURE__ */ j(ue, {
330
+ children: (e, n) => /* @__PURE__ */ j(ye, {
319
331
  item: e,
320
- handle: L ? null : n,
321
- auto: L,
332
+ handle: R ? null : n,
333
+ auto: R,
322
334
  folder: t
323
335
  })
324
336
  }),
325
- (!L && ge > 0 || L && t.error && ge > 0) && /* @__PURE__ */ M(m, {
337
+ (!R && Se > 0 || R && t.error && Se > 0) && /* @__PURE__ */ M(g, {
326
338
  className: "w-fit",
327
- disabled: V || O.items.length > 0 && !O.ready || t.committing,
339
+ disabled: B || P.items.length > 0 && !P.ready || t.committing,
328
340
  onClick: () => void t.commit().catch(() => {}),
329
341
  "data-ckui": "folder-commit",
330
- children: [t.committing && /* @__PURE__ */ j(W, {
331
- icon: re,
342
+ children: [t.committing && /* @__PURE__ */ j(H, {
343
+ icon: oe,
332
344
  strokeWidth: 2,
333
345
  className: "motion-safe:animate-spin"
334
- }), L ? S("folder.commitAgain") : S("folder.commit", { count: O.items.filter((e) => e.status !== "committed").length + t.pending.length })]
346
+ }), R ? E("folder.commitAgain") : E("folder.commit", { count: P.items.filter((e) => e.status !== "committed").length + t.pending.length })]
335
347
  }),
336
- h,
348
+ f,
337
349
  /* @__PURE__ */ j("input", {
338
- ref: Q,
350
+ ref: X,
339
351
  type: "file",
340
- accept: z,
352
+ accept: se,
341
353
  className: "sr-only",
342
354
  tabIndex: -1,
343
355
  "aria-hidden": !0,
344
356
  onChange: (e) => {
345
357
  let n = e.target.files?.[0];
346
- e.target.value = "", n && $ && t.replace($, n).catch(() => {}), de(null);
358
+ e.target.value = "", n && Z && t.replace(Z, n).catch(() => {}), ge(null);
347
359
  }
348
360
  }),
349
- /* @__PURE__ */ j(ee, {
350
- open: !!K,
351
- onOpenChange: (e) => !e && J.status !== "saving" && q(null),
352
- source: "source" in J ? J.source ?? null : null,
353
- aspect: Y?.aspect ?? "",
354
- aspects: Y?.aspect ? void 0 : g,
355
- initialEdit: "edit" in J ? J.edit : null,
356
- minWidth: Y?.min_width,
357
- title: S("folder.crop"),
358
- busy: J.status === "saving",
359
- error: J.status === "error" ? C(J.error) : void 0,
360
- onConfirm: (e) => void J.save(e)
361
+ /* @__PURE__ */ j(y, {
362
+ open: !!G,
363
+ onOpenChange: (e) => !e && K.status !== "saving" && de(null),
364
+ source: "source" in K ? K.source ?? null : null,
365
+ aspect: q?.aspect ?? "",
366
+ aspects: q?.aspect ? void 0 : _,
367
+ initialEdit: "edit" in K ? K.edit : null,
368
+ minWidth: q?.min_width,
369
+ title: E("folder.crop"),
370
+ busy: K.status === "saving",
371
+ error: K.status === "error" ? O(K.error) : void 0,
372
+ onConfirm: (e) => void K.save(e)
361
373
  })
362
374
  ]
363
375
  });
364
376
  }
365
- function se({ group: e, layout: t, titled: n, folder: r, disabled: i, selected: a, onSelect: s, renaming: c, onRename: l, onCrop: u, onReplace: d, rowActions: f }) {
366
- let { t: p } = o(), m = p(`folder.kinds.${q(e.rule)}`), h = e.rule?.max;
377
+ function pe({ group: e, layout: t, titled: n, folder: r, disabled: i, selected: a, onSelect: o, renaming: c, onRename: l, onCrop: u, onReplace: d, rowActions: f }) {
378
+ let { t: p } = s(), m = p(`folder.kinds.${G(e.rule)}`), h = e.rule?.max;
367
379
  return /* @__PURE__ */ M("section", {
368
380
  className: "grid gap-1",
369
381
  "data-ckui": "folder-group",
@@ -375,12 +387,12 @@ function se({ group: e, layout: t, titled: n, folder: r, disabled: i, selected:
375
387
  " · ",
376
388
  h ? `${e.files.length} / ${h}` : e.files.length
377
389
  ]
378
- }), /* @__PURE__ */ j(T, {
390
+ }), /* @__PURE__ */ j(D, {
379
391
  layout: t,
380
392
  className: t === "grid" ? "grid-cols-[repeat(auto-fill,minmax(12rem,1fr))]" : void 0,
381
393
  items: e.files,
382
394
  id: (e) => e.path,
383
- name: (t) => S(e, t.path),
395
+ name: (t) => ee(e, t.path),
384
396
  disabled: i || r.updating,
385
397
  label: m,
386
398
  onMove: (t, n) => void r.move(e.files[t].path, n).catch(() => {}),
@@ -389,15 +401,15 @@ function se({ group: e, layout: t, titled: n, folder: r, disabled: i, selected:
389
401
  "data-ckui": "upload-row",
390
402
  "data-path": e.path
391
403
  }),
392
- children: (n, o) => /* @__PURE__ */ j(ce, {
404
+ children: (n, s) => /* @__PURE__ */ j(ge, {
393
405
  file: n,
394
406
  grid: t === "grid",
395
407
  group: e,
396
- handle: o,
408
+ handle: s,
397
409
  folder: r,
398
410
  disabled: i,
399
411
  selected: a.has(n.path),
400
- onSelect: (e) => s(n.path, e),
412
+ onSelect: (e) => o(n.path, e),
401
413
  renaming: c === n.path,
402
414
  onRename: l,
403
415
  onCrop: u,
@@ -407,7 +419,183 @@ function se({ group: e, layout: t, titled: n, folder: r, disabled: i, selected:
407
419
  })]
408
420
  });
409
421
  }
410
- function Z({ kind: e, url: t, busy: n, grid: r, aspect: i }) {
422
+ function J(e, t, n) {
423
+ let r = n.lastIndexOf("."), i = r > n.lastIndexOf("/") ? n.slice(r).toLowerCase() : "";
424
+ return String(e).padStart(Math.max(2, String(t).length), "0") + i;
425
+ }
426
+ var Y = "group relative grid min-w-0 content-start gap-1 rounded-lg border bg-background p-1.5 outline-none focus-visible:ring-2 focus-visible:ring-ring";
427
+ function X({ label: e, disabled: t, onRemove: n }) {
428
+ return /* @__PURE__ */ j("button", {
429
+ type: "button",
430
+ "aria-label": e,
431
+ title: e,
432
+ disabled: t,
433
+ className: "absolute end-2 top-2 inline-flex size-6 items-center justify-center rounded-full bg-background/90 text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100 group-focus-within:opacity-100 disabled:hidden",
434
+ onPointerDown: (e) => e.stopPropagation(),
435
+ onKeyDown: (e) => e.stopPropagation(),
436
+ onClick: (e) => {
437
+ e.stopPropagation(), n();
438
+ },
439
+ "data-ckui": "tile-remove",
440
+ children: /* @__PURE__ */ j(H, {
441
+ icon: P,
442
+ strokeWidth: 2,
443
+ className: "size-3.5"
444
+ })
445
+ });
446
+ }
447
+ function Z({ url: e, aspect: t, busy: n }) {
448
+ return /* @__PURE__ */ M("span", {
449
+ className: "relative block w-full overflow-hidden rounded-md bg-muted",
450
+ style: { aspectRatio: t ?? .75 },
451
+ children: [e && /* @__PURE__ */ j("img", {
452
+ src: e,
453
+ alt: "",
454
+ loading: "lazy",
455
+ decoding: "async",
456
+ draggable: !1,
457
+ className: N("size-full object-cover", n && "opacity-70")
458
+ }), n && !e && /* @__PURE__ */ j("span", {
459
+ "aria-hidden": !0,
460
+ className: "absolute inset-[40%] rounded-full border-2 border-current/25 border-t-current text-muted-foreground motion-safe:animate-spin"
461
+ })]
462
+ });
463
+ }
464
+ function me({ group: t, folder: n, disabled: r, auto: i, selected: a, onSelect: o, queued: c, pending: u, waiting: p }) {
465
+ let { t: m, error: h } = s(), g = O(() => t.files.filter((e) => !f(e)), [t.files]), _ = g.length + u.length + c.length + p.length, y = re(/* @__PURE__ */ new Map());
466
+ for (let e of c) y.current.has(e.path) || y.current.set(e.path, URL.createObjectURL(e.file));
467
+ te(() => {
468
+ let e = y.current;
469
+ return () => e.forEach((e) => URL.revokeObjectURL(e));
470
+ }, []);
471
+ let b = r || n.updating, x = (e) => o(a === e.path ? null : e);
472
+ return /* @__PURE__ */ j("section", {
473
+ className: "grid gap-1",
474
+ "data-ckui": "folder-group",
475
+ "data-path": t.path,
476
+ children: /* @__PURE__ */ j(D, {
477
+ layout: "grid",
478
+ wholeItem: !0,
479
+ className: "grid-cols-[repeat(auto-fill,minmax(8.5rem,1fr))]",
480
+ items: g,
481
+ id: (e) => e.path,
482
+ name: (e) => J(g.indexOf(e) + 1, _, e.path),
483
+ disabled: b,
484
+ label: m(`folder.kinds.${G(t.rule)}`),
485
+ onMove: (e, r) => void n.move(g[e].path, t.files.findIndex((e) => e.path === g[r].path)).catch(() => {}),
486
+ row: (e) => ({
487
+ className: N(Y, "cursor-grab active:cursor-grabbing", a === e.path ? "border-primary ring-1 ring-primary/40" : "border-border"),
488
+ "data-ckui": "page-tile",
489
+ "data-path": e.path,
490
+ "data-selected": a === e.path || void 0,
491
+ "aria-pressed": a === e.path,
492
+ onClick: () => x(e),
493
+ onKeyDown: (t) => {
494
+ t.key === "Enter" && (t.preventDefault(), x(e));
495
+ }
496
+ }),
497
+ trailing: /* @__PURE__ */ M(A, { children: [
498
+ u.map((t, r) => {
499
+ let a = T(n.read.read, t);
500
+ return /* @__PURE__ */ M("li", {
501
+ className: N(Y, "border-dashed border-border"),
502
+ "data-ckui": "page-tile-pending",
503
+ children: [
504
+ /* @__PURE__ */ j(Z, {
505
+ url: a?.url ?? y.current.get(t.path),
506
+ busy: d(t)
507
+ }),
508
+ /* @__PURE__ */ M("span", {
509
+ className: "truncate px-0.5 text-xs text-muted-foreground tabular-nums",
510
+ children: [
511
+ J(g.length + r + 1, _, t.path),
512
+ " · ",
513
+ t.failed ? h(e(t.failed)) : m(i ? "folder.adding" : "folder.notAdded")
514
+ ]
515
+ }),
516
+ /* @__PURE__ */ j(X, {
517
+ label: m("common.remove"),
518
+ disabled: b,
519
+ onRemove: () => void n.remove([t.path]).catch(() => {})
520
+ })
521
+ ]
522
+ }, t.path);
523
+ }),
524
+ c.map((e, t) => {
525
+ let r = e.status === "uploading" ? v(e.progress) : null;
526
+ return /* @__PURE__ */ M("li", {
527
+ className: N(Y, "border-dashed border-border"),
528
+ "data-ckui": "page-tile-upload",
529
+ "data-status": e.status,
530
+ children: [
531
+ /* @__PURE__ */ j(Z, {
532
+ url: y.current.get(e.path),
533
+ busy: !0
534
+ }),
535
+ r !== null && /* @__PURE__ */ j(l, {
536
+ value: r,
537
+ "aria-label": Q(m, h, e, i),
538
+ className: "h-1"
539
+ }),
540
+ /* @__PURE__ */ M("span", {
541
+ className: N("truncate px-0.5 text-xs tabular-nums", e.status === "failed" ? "text-destructive" : "text-muted-foreground"),
542
+ title: e.file.name,
543
+ children: [
544
+ J(g.length + u.length + t + 1, _, e.path),
545
+ " · ",
546
+ Q(m, h, e, i)
547
+ ]
548
+ }),
549
+ /* @__PURE__ */ j(X, {
550
+ label: m("common.remove"),
551
+ onRemove: () => n.queue.remove(e.id)
552
+ })
553
+ ]
554
+ }, e.id);
555
+ }),
556
+ p.map((e, t) => /* @__PURE__ */ M("li", {
557
+ className: N(Y, "border-dashed border-border"),
558
+ "data-ckui": "page-tile-waiting",
559
+ children: [/* @__PURE__ */ j(Z, { busy: !0 }), /* @__PURE__ */ j("span", {
560
+ className: "truncate px-0.5 text-xs text-muted-foreground",
561
+ title: e.name,
562
+ children: m("folder.queued")
563
+ })]
564
+ }, `waiting-${t}`))
565
+ ] }),
566
+ children: (t, r, i) => {
567
+ let a = d(t), o = T(n.read.read, t), s = t.failed ? h(e(t.failed)) : void 0;
568
+ return /* @__PURE__ */ M(A, { children: [
569
+ /* @__PURE__ */ j(Z, {
570
+ url: o?.url ?? y.current.get(t.path),
571
+ aspect: o?.w && o.h ? o.w / o.h : void 0,
572
+ busy: a
573
+ }),
574
+ /* @__PURE__ */ M("span", {
575
+ className: "flex min-w-0 items-center justify-between gap-1 px-0.5 text-xs text-muted-foreground tabular-nums",
576
+ children: [/* @__PURE__ */ j("span", {
577
+ className: "truncate",
578
+ "data-ckui": "upload-name",
579
+ title: t.path,
580
+ children: J(i + 1, _, t.path)
581
+ }), s ? /* @__PURE__ */ j("span", {
582
+ className: "truncate text-destructive",
583
+ title: s,
584
+ "data-ckui": "failed",
585
+ children: m("folder.failed")
586
+ }) : a && /* @__PURE__ */ j("span", { children: m("folder.processing") })]
587
+ }),
588
+ /* @__PURE__ */ j(X, {
589
+ label: m("common.remove"),
590
+ disabled: b,
591
+ onRemove: () => void n.remove([t.path]).catch(() => {})
592
+ })
593
+ ] });
594
+ }
595
+ })
596
+ });
597
+ }
598
+ function he({ kind: e, url: t, busy: n, grid: r, aspect: i }) {
411
599
  return /* @__PURE__ */ M("span", {
412
600
  className: N("relative flex shrink-0 items-center justify-center overflow-hidden rounded-md bg-muted text-muted-foreground", r ? "col-span-2 w-full" : "size-10"),
413
601
  style: r ? { aspectRatio: i ?? .75 } : void 0,
@@ -418,8 +606,8 @@ function Z({ kind: e, url: t, busy: n, grid: r, aspect: i }) {
418
606
  loading: "lazy",
419
607
  decoding: "async",
420
608
  className: "size-full object-cover"
421
- }) : /* @__PURE__ */ j(W, {
422
- icon: K[e],
609
+ }) : /* @__PURE__ */ j(H, {
610
+ icon: W[e],
423
611
  strokeWidth: 1.75,
424
612
  className: "size-4.5"
425
613
  }), n && !t && /* @__PURE__ */ j("span", {
@@ -428,24 +616,24 @@ function Z({ kind: e, url: t, busy: n, grid: r, aspect: i }) {
428
616
  })]
429
617
  });
430
618
  }
431
- function ce({ file: t, grid: r, group: i, handle: a, folder: s, disabled: c, selected: d, onSelect: f, renaming: p, onRename: h, onCrop: g, onReplace: ee, actions: _ }) {
432
- let { t: v, error: y } = o(), b = G(t.type), x = S(i, t.path), w = u(t), T = O(() => C(s.read.read, t), [s.read.read, t]), E = c || s.updating, D = t.failed ? y(e(t.failed)) : void 0;
619
+ function ge({ file: t, grid: r, group: i, handle: a, folder: o, disabled: c, selected: l, onSelect: f, renaming: p, onRename: m, onCrop: h, onReplace: _, actions: v }) {
620
+ let { t: y, error: b } = s(), x = U(t.type), S = ee(i, t.path), C = d(t), w = O(() => T(o.read.read, t), [o.read.read, t]), E = c || o.updating, D = t.failed ? b(e(t.failed)) : void 0;
433
621
  return /* @__PURE__ */ M(A, { children: [
434
622
  a,
435
623
  /* @__PURE__ */ j("input", {
436
624
  type: "checkbox",
437
625
  className: "size-4 shrink-0 accent-primary",
438
- checked: d,
626
+ checked: l,
439
627
  disabled: c,
440
- "aria-label": v("folder.select", { name: x }),
628
+ "aria-label": y("folder.select", { name: S }),
441
629
  onChange: (e) => f(e.target.checked)
442
630
  }),
443
- /* @__PURE__ */ j(Z, {
444
- kind: b,
445
- url: T?.url,
446
- busy: w,
631
+ /* @__PURE__ */ j(he, {
632
+ kind: x,
633
+ url: w?.url,
634
+ busy: C,
447
635
  grid: r,
448
- aspect: T?.w && T.h ? T.w / T.h : void 0
636
+ aspect: w?.w && w.h ? w.w / w.h : void 0
449
637
  }),
450
638
  /* @__PURE__ */ M("div", {
451
639
  className: N("grid min-w-0 flex-1 gap-1", r && "col-span-2"),
@@ -453,26 +641,26 @@ function ce({ file: t, grid: r, group: i, handle: a, folder: s, disabled: c, sel
453
641
  /* @__PURE__ */ M("div", {
454
642
  className: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-0.5",
455
643
  children: [
456
- p ? /* @__PURE__ */ j(Q, {
457
- name: n(x),
458
- label: v("folder.renameLabel", { name: x }),
459
- onDone: (e) => e === null ? h(null) : s.rename(t.path, e).then(() => h(null))
644
+ p ? /* @__PURE__ */ j(_e, {
645
+ name: n(S),
646
+ label: y("folder.renameLabel", { name: S }),
647
+ onDone: (e) => e === null ? m(null) : o.rename(t.path, e).then(() => m(null))
460
648
  }) : /* @__PURE__ */ j("span", {
461
649
  className: "max-w-full truncate text-sm",
462
650
  title: t.path,
463
651
  "data-ckui": "upload-name",
464
- children: x
652
+ children: S
465
653
  }),
466
654
  t.edit && /* @__PURE__ */ j("span", {
467
655
  className: "shrink-0 rounded-sm border border-border px-1.5 text-[11px] text-muted-foreground",
468
656
  "data-ckui": "edited",
469
- children: v("folder.edited")
657
+ children: y("folder.edited")
470
658
  }),
471
659
  D && /* @__PURE__ */ j("span", {
472
660
  className: "shrink-0 rounded-sm bg-destructive/10 px-1.5 text-[11px] font-medium text-destructive",
473
661
  title: D,
474
662
  "data-ckui": "failed",
475
- children: v(b === "video" ? "folder.failedVideo" : "folder.failed")
663
+ children: y(x === "video" ? "folder.failedVideo" : "folder.failed")
476
664
  })
477
665
  ]
478
666
  }),
@@ -480,13 +668,13 @@ function ce({ file: t, grid: r, group: i, handle: a, folder: s, disabled: c, sel
480
668
  className: "text-xs text-destructive",
481
669
  children: D
482
670
  }),
483
- w && b === "video" && /* @__PURE__ */ j(l, {
671
+ C && x === "video" && /* @__PURE__ */ j(u, {
484
672
  progress: t.progress,
485
673
  className: "max-w-sm text-xs"
486
674
  }),
487
- w && b !== "video" && /* @__PURE__ */ j("span", {
675
+ C && x !== "video" && /* @__PURE__ */ j("span", {
488
676
  className: "text-xs text-muted-foreground",
489
- children: v("folder.processing")
677
+ children: y("folder.processing")
490
678
  })
491
679
  ]
492
680
  }),
@@ -494,51 +682,51 @@ function ce({ file: t, grid: r, group: i, handle: a, folder: s, disabled: c, sel
494
682
  className: N("flex shrink-0 flex-wrap items-center gap-0.5", r && "col-span-2 justify-end"),
495
683
  "data-ckui": "upload-actions",
496
684
  children: [
497
- _,
498
- b === "image" && /* @__PURE__ */ j(m, {
685
+ v,
686
+ x === "image" && /* @__PURE__ */ j(g, {
499
687
  variant: "ghost",
500
688
  size: "icon-sm",
501
- "aria-label": v("folder.crop"),
502
- title: v("folder.crop"),
689
+ "aria-label": y("folder.crop"),
690
+ title: y("folder.crop"),
503
691
  disabled: E || !!t.staged || !t.size,
504
- onClick: () => g(t.path),
505
- children: /* @__PURE__ */ j(W, {
692
+ onClick: () => h(t.path),
693
+ children: /* @__PURE__ */ j(H, {
506
694
  icon: F,
507
695
  strokeWidth: 2
508
696
  })
509
697
  }),
510
- !i.rule?.named && /* @__PURE__ */ j(m, {
698
+ !i.rule?.named && /* @__PURE__ */ j(g, {
511
699
  variant: "ghost",
512
700
  size: "icon-sm",
513
- "aria-label": v("common.rename"),
514
- title: v("common.rename"),
701
+ "aria-label": y("common.rename"),
702
+ title: y("common.rename"),
515
703
  disabled: E,
516
- onClick: () => h(t.path),
517
- children: /* @__PURE__ */ j(W, {
704
+ onClick: () => m(t.path),
705
+ children: /* @__PURE__ */ j(H, {
518
706
  icon: L,
519
707
  strokeWidth: 2
520
708
  })
521
709
  }),
522
- /* @__PURE__ */ j(m, {
710
+ /* @__PURE__ */ j(g, {
523
711
  variant: "ghost",
524
712
  size: "icon-sm",
525
- "aria-label": v("common.replace"),
526
- title: v("common.replace"),
713
+ "aria-label": y("common.replace"),
714
+ title: y("common.replace"),
527
715
  disabled: E,
528
- onClick: () => ee(t.path),
529
- children: /* @__PURE__ */ j(W, {
530
- icon: H,
716
+ onClick: () => _(t.path),
717
+ children: /* @__PURE__ */ j(H, {
718
+ icon: B,
531
719
  strokeWidth: 2
532
720
  })
533
721
  }),
534
- /* @__PURE__ */ j(m, {
722
+ /* @__PURE__ */ j(g, {
535
723
  variant: "ghost",
536
724
  size: "icon-sm",
537
- "aria-label": v("common.remove"),
538
- title: v("common.remove"),
725
+ "aria-label": y("common.remove"),
726
+ title: y("common.remove"),
539
727
  disabled: E,
540
- onClick: () => void s.remove([t.path]).catch(() => {}),
541
- children: /* @__PURE__ */ j(W, {
728
+ onClick: () => void o.remove([t.path]).catch(() => {}),
729
+ children: /* @__PURE__ */ j(H, {
542
730
  icon: I,
543
731
  strokeWidth: 2
544
732
  })
@@ -547,8 +735,8 @@ function ce({ file: t, grid: r, group: i, handle: a, folder: s, disabled: c, sel
547
735
  })
548
736
  ] });
549
737
  }
550
- function Q({ name: e, label: t, onDone: n }) {
551
- let [r, i] = k(e), a = te(!1), o = (t) => {
738
+ function _e({ name: e, label: t, onDone: n }) {
739
+ let [r, i] = k(e), a = re(!1), o = (t) => {
552
740
  a.current || (a.current = !0, Promise.resolve(n(t && t.trim() && t.trim() !== e ? t.trim() : null)).catch(() => a.current = !1));
553
741
  };
554
742
  return /* @__PURE__ */ j("input", {
@@ -564,16 +752,16 @@ function Q({ name: e, label: t, onDone: n }) {
564
752
  "data-ckui": "rename"
565
753
  });
566
754
  }
567
- function le({ file: t, folder: n, auto: r, disabled: i }) {
568
- let { t: a, error: s } = o(), c = G(t.type), l = u(t), d = O(() => C(n.read.read, t), [n.read.read, t]), f = t.failed ? s(e(t.failed)) : l ? t.progress && t.progress.phase !== "queued" ? a("folder.processingPercent", { percent: Math.round(t.progress.percent) }) : a("folder.processing") : a(r ? "folder.adding" : "folder.notAdded");
755
+ function ve({ file: t, folder: n, auto: r, disabled: i }) {
756
+ let { t: a, error: o } = s(), c = U(t.type), l = d(t), u = O(() => T(n.read.read, t), [n.read.read, t]), f = t.failed ? o(e(t.failed)) : l ? t.progress && t.progress.phase !== "queued" ? a("folder.processingPercent", { percent: Math.round(t.progress.percent) }) : a("folder.processing") : a(r ? "folder.adding" : "folder.notAdded");
569
757
  return /* @__PURE__ */ M("li", {
570
758
  className: "flex min-h-11 items-center gap-2 px-1",
571
759
  "data-ckui": "pending-row",
572
760
  "data-path": t.path,
573
761
  children: [
574
- /* @__PURE__ */ j(Z, {
762
+ /* @__PURE__ */ j(he, {
575
763
  kind: c,
576
- url: d?.url,
764
+ url: u?.url,
577
765
  busy: l
578
766
  }),
579
767
  /* @__PURE__ */ M("div", {
@@ -588,14 +776,14 @@ function le({ file: t, folder: n, auto: r, disabled: i }) {
588
776
  children: f
589
777
  })]
590
778
  }),
591
- /* @__PURE__ */ j(m, {
779
+ /* @__PURE__ */ j(g, {
592
780
  variant: "ghost",
593
781
  size: "icon-sm",
594
782
  "aria-label": a("common.remove"),
595
783
  title: a("common.remove"),
596
784
  disabled: i || n.updating,
597
785
  onClick: () => void n.remove([t.path]).catch(() => {}),
598
- children: /* @__PURE__ */ j(W, {
786
+ children: /* @__PURE__ */ j(H, {
599
787
  icon: I,
600
788
  strokeWidth: 2
601
789
  })
@@ -603,21 +791,21 @@ function le({ file: t, folder: n, auto: r, disabled: i }) {
603
791
  ]
604
792
  });
605
793
  }
606
- function $(t, n, r, i) {
794
+ function Q(t, n, r, i) {
607
795
  if (r.status === "failed") return n(r.error);
608
- if (r.status === "uploading") return h(t, r.progress);
796
+ if (r.status === "uploading") return _(t, r.progress);
609
797
  if (r.status === "uploaded") {
610
798
  let a = r.processing;
611
799
  return a?.failed ? n(e(a.failed)) : r.unattached && !r.processed ? a?.progress && a.progress.phase !== "queued" ? t("folder.processingPercent", { percent: Math.round(a.progress.percent) }) : t("folder.processing") : t(i ? "folder.adding" : "folder.uploaded");
612
800
  }
613
801
  return r.status === "committed" ? t("folder.adding") : t("folder.queued");
614
802
  }
615
- function ue({ item: e, handle: t, auto: n, folder: r }) {
616
- let { t: i, error: a } = o(), { queue: s } = r, l = G(e.file.type), u = $(i, a, e, n), d = e.status === "uploading" ? g(e.progress) : e.unattached && !e.processed && e.processing?.progress ? e.processing.progress.percent : null;
803
+ function ye({ item: e, handle: t, auto: n, folder: r }) {
804
+ let { t: i, error: a } = s(), { queue: o } = r, c = U(e.file.type), u = Q(i, a, e, n), d = e.status === "uploading" ? v(e.progress) : e.unattached && !e.processed && e.processing?.progress ? e.processing.progress.percent : null;
617
805
  return /* @__PURE__ */ M(A, { children: [
618
806
  t,
619
- /* @__PURE__ */ j(Z, {
620
- kind: l,
807
+ /* @__PURE__ */ j(he, {
808
+ kind: c,
621
809
  busy: e.status === "uploading" || !!e.unattached && !e.processed
622
810
  }),
623
811
  /* @__PURE__ */ M("div", {
@@ -628,7 +816,7 @@ function ue({ item: e, handle: t, auto: n, folder: r }) {
628
816
  title: e.path,
629
817
  children: e.file.name
630
818
  }),
631
- d !== null && /* @__PURE__ */ j(c, {
819
+ d !== null && /* @__PURE__ */ j(l, {
632
820
  value: d,
633
821
  "aria-label": u,
634
822
  className: "max-w-sm"
@@ -642,23 +830,23 @@ function ue({ item: e, handle: t, auto: n, folder: r }) {
642
830
  }),
643
831
  /* @__PURE__ */ M("span", {
644
832
  className: "flex shrink-0 items-center gap-0.5",
645
- children: [e.status === "failed" && /* @__PURE__ */ j(m, {
833
+ children: [e.status === "failed" && /* @__PURE__ */ j(g, {
646
834
  variant: "ghost",
647
835
  size: "icon-sm",
648
836
  "aria-label": i("common.retry"),
649
837
  title: i("common.retry"),
650
- onClick: () => s.retry(e.id),
651
- children: /* @__PURE__ */ j(W, {
652
- icon: V,
838
+ onClick: () => o.retry(e.id),
839
+ children: /* @__PURE__ */ j(H, {
840
+ icon: ce,
653
841
  strokeWidth: 2
654
842
  })
655
- }), /* @__PURE__ */ j(m, {
843
+ }), /* @__PURE__ */ j(g, {
656
844
  variant: "ghost",
657
845
  size: "icon-sm",
658
846
  "aria-label": i("common.remove"),
659
847
  title: i("common.remove"),
660
- onClick: () => s.remove(e.id),
661
- children: /* @__PURE__ */ j(W, {
848
+ onClick: () => o.remove(e.id),
849
+ children: /* @__PURE__ */ j(H, {
662
850
  icon: I,
663
851
  strokeWidth: 2
664
852
  })
@@ -667,6 +855,6 @@ function ue({ item: e, handle: t, auto: n, folder: r }) {
667
855
  ] });
668
856
  }
669
857
  //#endregion
670
- export { J as MediaFolderEditor, ae as describeRules };
858
+ export { de as MediaFolderEditor, ue as describeRules, J as positionalName };
671
859
 
672
860
  //# sourceMappingURL=media-folder-editor.js.map