@openrails/contentkit-ui 0.0.0-stage → 0.68.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 (367) hide show
  1. package/README.md +425 -2
  2. package/dist/appearance.d.ts +38 -0
  3. package/dist/appearance.js +15 -0
  4. package/dist/appearance.js.map +1 -0
  5. package/dist/assets/hash.worker-BYfo-7MQ.js.map +1 -0
  6. package/dist/client/aspect.d.ts +6 -0
  7. package/dist/client/aspect.js +17 -0
  8. package/dist/client/aspect.js.map +1 -0
  9. package/dist/client/client.d.ts +51 -0
  10. package/dist/client/client.js +35 -0
  11. package/dist/client/client.js.map +1 -0
  12. package/dist/client/codes.d.ts +12 -0
  13. package/dist/client/codes.js +19 -0
  14. package/dist/client/codes.js.map +1 -0
  15. package/dist/client/content/bans.d.ts +15 -0
  16. package/dist/client/content/bans.js +40 -0
  17. package/dist/client/content/bans.js.map +1 -0
  18. package/dist/client/content/comments.d.ts +36 -0
  19. package/dist/client/content/comments.js +93 -0
  20. package/dist/client/content/comments.js.map +1 -0
  21. package/dist/client/content/favorites.d.ts +14 -0
  22. package/dist/client/content/favorites.js +42 -0
  23. package/dist/client/content/favorites.js.map +1 -0
  24. package/dist/client/content/moderation.d.ts +18 -0
  25. package/dist/client/content/moderation.js +37 -0
  26. package/dist/client/content/moderation.js.map +1 -0
  27. package/dist/client/content/polls.d.ts +47 -0
  28. package/dist/client/content/polls.js +148 -0
  29. package/dist/client/content/polls.js.map +1 -0
  30. package/dist/client/content/posts.d.ts +44 -0
  31. package/dist/client/content/posts.js +91 -0
  32. package/dist/client/content/posts.js.map +1 -0
  33. package/dist/client/content/reactions.d.ts +12 -0
  34. package/dist/client/content/reactions.js +36 -0
  35. package/dist/client/content/reactions.js.map +1 -0
  36. package/dist/client/content/types.d.ts +91 -0
  37. package/dist/client/content/types.js +8 -0
  38. package/dist/client/content/types.js.map +1 -0
  39. package/dist/client/crop.d.ts +32 -0
  40. package/dist/client/crop.js +103 -0
  41. package/dist/client/crop.js.map +1 -0
  42. package/dist/client/errors.d.ts +54 -0
  43. package/dist/client/errors.js +80 -0
  44. package/dist/client/errors.js.map +1 -0
  45. package/dist/client/gallery.d.ts +43 -0
  46. package/dist/client/gallery.js +86 -0
  47. package/dist/client/gallery.js.map +1 -0
  48. package/dist/client/generated/error-codes.d.ts +5 -0
  49. package/dist/client/generated/error-codes.js +131 -0
  50. package/dist/client/generated/error-codes.js.map +1 -0
  51. package/dist/client/generated/routes.d.ts +1086 -0
  52. package/dist/client/generated/routes.js +1400 -0
  53. package/dist/client/generated/routes.js.map +1 -0
  54. package/dist/client/generated/wire.d.ts +630 -0
  55. package/dist/client/generated/wire.js +6 -0
  56. package/dist/client/generated/wire.js.map +1 -0
  57. package/dist/client/http.d.ts +79 -0
  58. package/dist/client/http.js +74 -0
  59. package/dist/client/http.js.map +1 -0
  60. package/dist/client/image.d.ts +24 -0
  61. package/dist/client/image.js +65 -0
  62. package/dist/client/image.js.map +1 -0
  63. package/dist/client/index.d.ts +33 -0
  64. package/dist/client/media/api.d.ts +36 -0
  65. package/dist/client/media/api.js +61 -0
  66. package/dist/client/media/api.js.map +1 -0
  67. package/dist/client/media/client.d.ts +247 -0
  68. package/dist/client/media/client.js +407 -0
  69. package/dist/client/media/client.js.map +1 -0
  70. package/dist/client/media/encode.d.ts +3 -0
  71. package/dist/client/media/encode.js +8 -0
  72. package/dist/client/media/encode.js.map +1 -0
  73. package/dist/client/media/hash-stream.d.ts +6 -0
  74. package/dist/client/media/hash-stream.js +16 -0
  75. package/dist/client/media/hash-stream.js.map +1 -0
  76. package/dist/client/media/hash.d.ts +12 -0
  77. package/dist/client/media/hash.js +48 -0
  78. package/dist/client/media/hash.js.map +1 -0
  79. package/dist/client/media/hash.worker-inline.js +18 -0
  80. package/dist/client/media/hash.worker-inline.js.map +1 -0
  81. package/dist/client/media/pacer.d.ts +21 -0
  82. package/dist/client/media/pacer.js +25 -0
  83. package/dist/client/media/pacer.js.map +1 -0
  84. package/dist/client/media/queue.d.ts +112 -0
  85. package/dist/client/media/queue.js +274 -0
  86. package/dist/client/media/queue.js.map +1 -0
  87. package/dist/client/media/ref.d.ts +6 -0
  88. package/dist/client/media/ref.js +10 -0
  89. package/dist/client/media/ref.js.map +1 -0
  90. package/dist/client/media/rules.d.ts +52 -0
  91. package/dist/client/media/rules.js +139 -0
  92. package/dist/client/media/rules.js.map +1 -0
  93. package/dist/client/media/transport.d.ts +13 -0
  94. package/dist/client/media/transport.js +33 -0
  95. package/dist/client/media/transport.js.map +1 -0
  96. package/dist/client/media/windows.d.ts +15 -0
  97. package/dist/client/media/windows.js +39 -0
  98. package/dist/client/media/windows.js.map +1 -0
  99. package/dist/client/playback.d.ts +200 -0
  100. package/dist/client/playback.js +142 -0
  101. package/dist/client/playback.js.map +1 -0
  102. package/dist/client/player.d.ts +102 -0
  103. package/dist/client/player.js +155 -0
  104. package/dist/client/player.js.map +1 -0
  105. package/dist/client/public.d.ts +25 -0
  106. package/dist/client/public.js +18 -0
  107. package/dist/client/public.js.map +1 -0
  108. package/dist/client/rendition.d.ts +19 -0
  109. package/dist/client/rendition.js +16 -0
  110. package/dist/client/rendition.js.map +1 -0
  111. package/dist/client/route.d.ts +39 -0
  112. package/dist/client/route.js +31 -0
  113. package/dist/client/route.js.map +1 -0
  114. package/dist/client/taxonomy.d.ts +30 -0
  115. package/dist/client/taxonomy.js +77 -0
  116. package/dist/client/taxonomy.js.map +1 -0
  117. package/dist/client.js +33 -0
  118. package/dist/components/encode-progress.d.ts +15 -0
  119. package/dist/components/encode-progress.js +49 -0
  120. package/dist/components/encode-progress.js.map +1 -0
  121. package/dist/components/hover-preview.d.ts +29 -0
  122. package/dist/components/hover-preview.js +49 -0
  123. package/dist/components/hover-preview.js.map +1 -0
  124. package/dist/components/image-crop-dialog.d.ts +48 -0
  125. package/dist/components/image-crop-dialog.js +359 -0
  126. package/dist/components/image-crop-dialog.js.map +1 -0
  127. package/dist/components/lazy-mount.d.ts +10 -0
  128. package/dist/components/lazy-mount.js +22 -0
  129. package/dist/components/lazy-mount.js.map +1 -0
  130. package/dist/components/media-folder-editor.d.ts +45 -0
  131. package/dist/components/media-folder-editor.js +564 -0
  132. package/dist/components/media-folder-editor.js.map +1 -0
  133. package/dist/components/media-gallery.d.ts +54 -0
  134. package/dist/components/media-gallery.js +597 -0
  135. package/dist/components/media-gallery.js.map +1 -0
  136. package/dist/components/media-readiness-notice.d.ts +24 -0
  137. package/dist/components/media-readiness-notice.js +61 -0
  138. package/dist/components/media-readiness-notice.js.map +1 -0
  139. package/dist/components/player-controls.d.ts +71 -0
  140. package/dist/components/player-controls.js +264 -0
  141. package/dist/components/player-controls.js.map +1 -0
  142. package/dist/components/progress.d.ts +5 -0
  143. package/dist/components/progress.js +14 -0
  144. package/dist/components/progress.js.map +1 -0
  145. package/dist/components/rendition-img.d.ts +34 -0
  146. package/dist/components/rendition-img.js +78 -0
  147. package/dist/components/rendition-img.js.map +1 -0
  148. package/dist/components/slot-editor.d.ts +95 -0
  149. package/dist/components/slot-editor.js +182 -0
  150. package/dist/components/slot-editor.js.map +1 -0
  151. package/dist/components/slot-image.d.ts +23 -0
  152. package/dist/components/slot-image.js +48 -0
  153. package/dist/components/slot-image.js.map +1 -0
  154. package/dist/components/slot-upload.d.ts +41 -0
  155. package/dist/components/slot-upload.js +213 -0
  156. package/dist/components/slot-upload.js.map +1 -0
  157. package/dist/components/social/bans.d.ts +42 -0
  158. package/dist/components/social/bans.js +300 -0
  159. package/dist/components/social/bans.js.map +1 -0
  160. package/dist/components/social/comments.d.ts +42 -0
  161. package/dist/components/social/comments.js +517 -0
  162. package/dist/components/social/comments.js.map +1 -0
  163. package/dist/components/social/engagement.d.ts +45 -0
  164. package/dist/components/social/engagement.js +129 -0
  165. package/dist/components/social/engagement.js.map +1 -0
  166. package/dist/components/social/index.d.ts +6 -0
  167. package/dist/components/social/moderation.d.ts +32 -0
  168. package/dist/components/social/moderation.js +383 -0
  169. package/dist/components/social/moderation.js.map +1 -0
  170. package/dist/components/social/parts.d.ts +50 -0
  171. package/dist/components/social/parts.js +106 -0
  172. package/dist/components/social/parts.js.map +1 -0
  173. package/dist/components/social/poll-editor.d.ts +34 -0
  174. package/dist/components/social/poll-editor.js +567 -0
  175. package/dist/components/social/poll-editor.js.map +1 -0
  176. package/dist/components/social/poll.d.ts +30 -0
  177. package/dist/components/social/poll.js +252 -0
  178. package/dist/components/social/poll.js.map +1 -0
  179. package/dist/components/sortable-list.d.ts +29 -0
  180. package/dist/components/sortable-list.js +121 -0
  181. package/dist/components/sortable-list.js.map +1 -0
  182. package/dist/components/video-mini-player.d.ts +35 -0
  183. package/dist/components/video-mini-player.js +236 -0
  184. package/dist/components/video-mini-player.js.map +1 -0
  185. package/dist/components/video-player.d.ts +146 -0
  186. package/dist/components/video-player.js +630 -0
  187. package/dist/components/video-player.js.map +1 -0
  188. package/dist/components/video-poster-picker.d.ts +59 -0
  189. package/dist/components/video-poster-picker.js +335 -0
  190. package/dist/components/video-poster-picker.js.map +1 -0
  191. package/dist/components/video-poster.d.ts +24 -0
  192. package/dist/components/video-poster.js +46 -0
  193. package/dist/components/video-poster.js.map +1 -0
  194. package/dist/i18n/context.d.ts +4 -0
  195. package/dist/i18n/context.js +11 -0
  196. package/dist/i18n/context.js.map +1 -0
  197. package/dist/i18n/messages.d.ts +40 -0
  198. package/dist/i18n/messages.js +94 -0
  199. package/dist/i18n/messages.js.map +1 -0
  200. package/dist/index.d.ts +23 -0
  201. package/dist/index.js +41 -0
  202. package/dist/locales/de.d.ts +2 -0
  203. package/dist/locales/de.js +271 -0
  204. package/dist/locales/de.js.map +1 -0
  205. package/dist/locales/en.d.ts +457 -0
  206. package/dist/locales/en.js +271 -0
  207. package/dist/locales/en.js.map +1 -0
  208. package/dist/locales/es.d.ts +2 -0
  209. package/dist/locales/es.js +271 -0
  210. package/dist/locales/es.js.map +1 -0
  211. package/dist/locales/ja.d.ts +2 -0
  212. package/dist/locales/ja.js +271 -0
  213. package/dist/locales/ja.js.map +1 -0
  214. package/dist/locales/ko.d.ts +2 -0
  215. package/dist/locales/ko.js +271 -0
  216. package/dist/locales/ko.js.map +1 -0
  217. package/dist/locales/social/de.d.ts +2 -0
  218. package/dist/locales/social/de.js +198 -0
  219. package/dist/locales/social/de.js.map +1 -0
  220. package/dist/locales/social/en.d.ts +195 -0
  221. package/dist/locales/social/en.js +198 -0
  222. package/dist/locales/social/en.js.map +1 -0
  223. package/dist/locales/social/es.d.ts +2 -0
  224. package/dist/locales/social/es.js +198 -0
  225. package/dist/locales/social/es.js.map +1 -0
  226. package/dist/locales/social/ja.d.ts +2 -0
  227. package/dist/locales/social/ja.js +198 -0
  228. package/dist/locales/social/ja.js.map +1 -0
  229. package/dist/locales/social/ko.d.ts +2 -0
  230. package/dist/locales/social/ko.js +198 -0
  231. package/dist/locales/social/ko.js.map +1 -0
  232. package/dist/locales/social/zh.d.ts +2 -0
  233. package/dist/locales/social/zh.js +198 -0
  234. package/dist/locales/social/zh.js.map +1 -0
  235. package/dist/locales/zh.d.ts +2 -0
  236. package/dist/locales/zh.js +271 -0
  237. package/dist/locales/zh.js.map +1 -0
  238. package/dist/provider.d.ts +22 -0
  239. package/dist/provider.js +59 -0
  240. package/dist/provider.js.map +1 -0
  241. package/dist/react/canonical.d.ts +33 -0
  242. package/dist/react/canonical.js +88 -0
  243. package/dist/react/canonical.js.map +1 -0
  244. package/dist/react/comments.d.ts +82 -0
  245. package/dist/react/comments.js +147 -0
  246. package/dist/react/comments.js.map +1 -0
  247. package/dist/react/config.d.ts +13 -0
  248. package/dist/react/config.js +14 -0
  249. package/dist/react/config.js.map +1 -0
  250. package/dist/react/context.d.ts +48 -0
  251. package/dist/react/context.js +37 -0
  252. package/dist/react/context.js.map +1 -0
  253. package/dist/react/crop.d.ts +49 -0
  254. package/dist/react/crop.js +107 -0
  255. package/dist/react/crop.js.map +1 -0
  256. package/dist/react/engagement.d.ts +38 -0
  257. package/dist/react/engagement.js +88 -0
  258. package/dist/react/engagement.js.map +1 -0
  259. package/dist/react/folder.d.ts +83 -0
  260. package/dist/react/folder.js +183 -0
  261. package/dist/react/folder.js.map +1 -0
  262. package/dist/react/gallery.d.ts +140 -0
  263. package/dist/react/gallery.js +477 -0
  264. package/dist/react/gallery.js.map +1 -0
  265. package/dist/react/index.d.ts +21 -0
  266. package/dist/react/inline-preview.d.ts +24 -0
  267. package/dist/react/inline-preview.js +76 -0
  268. package/dist/react/inline-preview.js.map +1 -0
  269. package/dist/react/player.d.ts +70 -0
  270. package/dist/react/player.js +214 -0
  271. package/dist/react/player.js.map +1 -0
  272. package/dist/react/polls.d.ts +74 -0
  273. package/dist/react/polls.js +176 -0
  274. package/dist/react/polls.js.map +1 -0
  275. package/dist/react/posts.d.ts +59 -0
  276. package/dist/react/posts.js +149 -0
  277. package/dist/react/posts.js.map +1 -0
  278. package/dist/react/provider.d.ts +23 -0
  279. package/dist/react/provider.js +35 -0
  280. package/dist/react/provider.js.map +1 -0
  281. package/dist/react/public.d.ts +39 -0
  282. package/dist/react/public.js +70 -0
  283. package/dist/react/public.js.map +1 -0
  284. package/dist/react/read.d.ts +52 -0
  285. package/dist/react/read.js +143 -0
  286. package/dist/react/read.js.map +1 -0
  287. package/dist/react/resources.d.ts +70 -0
  288. package/dist/react/resources.js +247 -0
  289. package/dist/react/resources.js.map +1 -0
  290. package/dist/react/slot.d.ts +102 -0
  291. package/dist/react/slot.js +181 -0
  292. package/dist/react/slot.js.map +1 -0
  293. package/dist/react/store.d.ts +51 -0
  294. package/dist/react/store.js +164 -0
  295. package/dist/react/store.js.map +1 -0
  296. package/dist/react/upload.d.ts +85 -0
  297. package/dist/react/upload.js +150 -0
  298. package/dist/react/upload.js.map +1 -0
  299. package/dist/react/use-resource.d.ts +43 -0
  300. package/dist/react/use-resource.js +66 -0
  301. package/dist/react/use-resource.js.map +1 -0
  302. package/dist/react/video.d.ts +118 -0
  303. package/dist/react/video.js +184 -0
  304. package/dist/react/video.js.map +1 -0
  305. package/dist/react/viewport.d.ts +19 -0
  306. package/dist/react/viewport.js +30 -0
  307. package/dist/react/viewport.js.map +1 -0
  308. package/dist/react.js +21 -0
  309. package/dist/scope.d.ts +14 -0
  310. package/dist/scope.js +30 -0
  311. package/dist/scope.js.map +1 -0
  312. package/dist/styles.css +3 -0
  313. package/dist/ui/alert-dialog.d.ts +18 -0
  314. package/dist/ui/alert-dialog.js +86 -0
  315. package/dist/ui/alert-dialog.js.map +1 -0
  316. package/dist/ui/alert.d.ts +10 -0
  317. package/dist/ui/alert.js +38 -0
  318. package/dist/ui/alert.js.map +1 -0
  319. package/dist/ui/avatar.d.ts +11 -0
  320. package/dist/ui/avatar.js +31 -0
  321. package/dist/ui/avatar.js.map +1 -0
  322. package/dist/ui/badge.d.ts +7 -0
  323. package/dist/ui/badge.js +31 -0
  324. package/dist/ui/badge.js.map +1 -0
  325. package/dist/ui/button.d.ts +8 -0
  326. package/dist/ui/button.js +46 -0
  327. package/dist/ui/button.js.map +1 -0
  328. package/dist/ui/dialog.d.ts +17 -0
  329. package/dist/ui/dialog.js +91 -0
  330. package/dist/ui/dialog.js.map +1 -0
  331. package/dist/ui/dropdown-menu.d.ts +15 -0
  332. package/dist/ui/dropdown-menu.js +105 -0
  333. package/dist/ui/dropdown-menu.js.map +1 -0
  334. package/dist/ui/input.d.ts +3 -0
  335. package/dist/ui/input.js +17 -0
  336. package/dist/ui/input.js.map +1 -0
  337. package/dist/ui/label.d.ts +3 -0
  338. package/dist/ui/label.js +15 -0
  339. package/dist/ui/label.js.map +1 -0
  340. package/dist/ui/progress.d.ts +7 -0
  341. package/dist/ui/progress.js +31 -0
  342. package/dist/ui/progress.js.map +1 -0
  343. package/dist/ui/select.d.ts +15 -0
  344. package/dist/ui/select.js +98 -0
  345. package/dist/ui/select.js.map +1 -0
  346. package/dist/ui/skeleton.d.ts +2 -0
  347. package/dist/ui/skeleton.js +14 -0
  348. package/dist/ui/skeleton.js.map +1 -0
  349. package/dist/ui/slider.d.ts +3 -0
  350. package/dist/ui/slider.js +35 -0
  351. package/dist/ui/slider.js.map +1 -0
  352. package/dist/ui/switch.d.ts +5 -0
  353. package/dist/ui/switch.js +20 -0
  354. package/dist/ui/switch.js.map +1 -0
  355. package/dist/ui/tabs.d.ts +10 -0
  356. package/dist/ui/tabs.js +47 -0
  357. package/dist/ui/tabs.js.map +1 -0
  358. package/dist/ui/textarea.d.ts +3 -0
  359. package/dist/ui/textarea.js +15 -0
  360. package/dist/ui/textarea.js.map +1 -0
  361. package/dist/ui/toggle-group.d.ts +5 -0
  362. package/dist/ui/toggle-group.js +23 -0
  363. package/dist/ui/toggle-group.js.map +1 -0
  364. package/dist/urls/index.d.ts +100 -0
  365. package/dist/urls.js +118 -0
  366. package/dist/urls.js.map +1 -0
  367. package/package.json +118 -3
@@ -0,0 +1,567 @@
1
+ import { toContentKitError as e } from "../../client/errors.js";
2
+ import { useMessages as t } from "../../i18n/context.js";
3
+ import { ContentKitUiRoot as n } from "../../scope.js";
4
+ import { useErrorReporter as r } from "../../react/context.js";
5
+ import { Button as i } from "../../ui/button.js";
6
+ import { SortableList as a } from "../sortable-list.js";
7
+ import { Input as o } from "../../ui/input.js";
8
+ import { Label as s } from "../../ui/label.js";
9
+ import { Select as c, SelectContent as l, SelectItem as u, SelectTrigger as d, SelectValue as f } from "../../ui/select.js";
10
+ import { Skeleton as p } from "../../ui/skeleton.js";
11
+ import { Textarea as m } from "../../ui/textarea.js";
12
+ import { ConfirmDialog as h, ErrorLine as g, contentError as _ } from "./parts.js";
13
+ import { localInput as v } from "./bans.js";
14
+ import { usePollEditor as y } from "../../react/polls.js";
15
+ import { Switch as b } from "../../ui/switch.js";
16
+ import { useEffect as x, useId as S, useMemo as C, useRef as w, useState as T } from "react";
17
+ import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
18
+ import { cn as k } from "cn";
19
+ import { Delete02Icon as A, ImageAdd01Icon as j } from "@hugeicons/core-free-icons";
20
+ import { HugeiconsIcon as M } from "@hugeicons/react";
21
+ //#region src/components/social/poll-editor.tsx
22
+ var N = (e) => e ? new Date(e).toISOString() : void 0, P = 0, F = () => ({
23
+ key: `o${++P}`,
24
+ label: "",
25
+ image: null
26
+ });
27
+ function I(a) {
28
+ let o = t(), { t: s } = o, c = y(a.poll ?? null, { client: a.client }), l = r(a.onError), [u, d] = T(null), [f, m] = T(null), [v, b] = T(!1), x = (t) => {
29
+ let n = e(t);
30
+ d(n), l(n, "poll.save");
31
+ }, S = (e) => /* @__PURE__ */ D(n, {
32
+ appearance: a.appearance,
33
+ className: k("grid gap-5 text-sm", a.className),
34
+ "data-ckui": "poll-editor",
35
+ children: e
36
+ });
37
+ return c.loading && !c.poll ? S(/* @__PURE__ */ O("div", {
38
+ className: "grid gap-3",
39
+ "aria-busy": !0,
40
+ children: [/* @__PURE__ */ D(p, { className: "h-9 w-full" }), /* @__PURE__ */ D(p, { className: "h-24 w-full" })]
41
+ })) : c.error && !c.poll ? S(/* @__PURE__ */ D(g, { error: c.error })) : S(/* @__PURE__ */ O(E, { children: [
42
+ /* @__PURE__ */ D("h2", {
43
+ className: "text-base font-semibold",
44
+ children: s(c.poll ? "pollEditor.editTitle" : "pollEditor.newTitle")
45
+ }),
46
+ c.poll ? /* @__PURE__ */ D(R, {
47
+ poll: c.poll,
48
+ saving: c.saving,
49
+ maxOptions: a.maxOptions ?? 10,
50
+ editor: c,
51
+ onError: x,
52
+ onInvalid: (e) => d(e),
53
+ onSaved: (e) => {
54
+ d(null), m(s("pollEditor.saved")), a.onSaved?.(e);
55
+ }
56
+ }, c.poll.id) : /* @__PURE__ */ D(L, {
57
+ saving: c.saving,
58
+ languages: a.languages,
59
+ defaultLanguage: a.defaultLanguage,
60
+ freeText: !!a.freeText,
61
+ maxOptions: a.maxOptions ?? 10,
62
+ onInvalid: (e) => d(e),
63
+ onCreate: async (e, t) => {
64
+ d(null);
65
+ try {
66
+ let { poll: n, imageErrors: r } = await c.create(e, t);
67
+ m(r.length ? s("pollEditor.imageFailed") : s("pollEditor.created"));
68
+ for (let e of r) l(e, "poll.save");
69
+ a.onCreated?.(n);
70
+ } catch (e) {
71
+ x(e);
72
+ }
73
+ }
74
+ }),
75
+ u && /* @__PURE__ */ D(g, { children: typeof u == "string" ? u : _(o, u) }),
76
+ f && !u && /* @__PURE__ */ D("p", {
77
+ role: "status",
78
+ className: "text-sm text-muted-foreground",
79
+ children: f
80
+ }),
81
+ c.poll && /* @__PURE__ */ D("div", {
82
+ className: "border-t border-border pt-4",
83
+ children: /* @__PURE__ */ D(i, {
84
+ variant: "destructive",
85
+ onClick: () => b(!0),
86
+ disabled: c.saving,
87
+ children: s("pollEditor.delete")
88
+ })
89
+ }),
90
+ /* @__PURE__ */ D(h, {
91
+ open: v,
92
+ onOpenChange: b,
93
+ title: s("pollEditor.deleteTitle"),
94
+ description: s("pollEditor.deleteBody"),
95
+ confirm: s("pollEditor.delete"),
96
+ onConfirm: () => void c.remove().then(() => a.onDeleted?.(), (e) => x(e))
97
+ })
98
+ ] }));
99
+ }
100
+ function L(e) {
101
+ let { t: n } = t(), r = S(), s = C(() => (e.languages ?? []).map((e) => typeof e == "string" ? {
102
+ value: e,
103
+ label: e
104
+ } : e), [e.languages]), [p, h] = T(""), [g, _] = T(e.defaultLanguage ?? s[0]?.value ?? "en"), [y, b] = T("multiple_choice"), [x, w] = T(() => v(/* @__PURE__ */ new Date())), [E, k] = T(""), [A, j] = T(null), [M, P] = T(() => [F(), F()]), I = (e, t) => P((n) => n.map((n) => n.key === e ? {
105
+ ...n,
106
+ ...t
107
+ } : n)), L = (e, t) => P((n) => {
108
+ let r = [...n];
109
+ return r.splice(t, 0, ...r.splice(e, 1)), r;
110
+ }), R = () => {
111
+ if (!p.trim()) return e.onInvalid(n("pollEditor.questionRequired"));
112
+ let t = M.filter((e) => e.label.trim() || e.image);
113
+ if (y === "multiple_choice") {
114
+ if (t.some((e) => !e.label.trim())) return e.onInvalid(n("pollEditor.optionRequired"));
115
+ if (t.length < 2) return e.onInvalid(n("pollEditor.minOptions"));
116
+ }
117
+ let r = y === "multiple_choice";
118
+ e.onCreate({
119
+ kind: y,
120
+ question: p.trim(),
121
+ language: g,
122
+ live_at: N(x),
123
+ closes_at: N(E),
124
+ options: r ? t.map((e, t) => ({
125
+ label: e.label.trim(),
126
+ position: t
127
+ })) : void 0
128
+ }, {
129
+ question: A,
130
+ options: r ? t.map((e) => e.image) : []
131
+ });
132
+ };
133
+ return /* @__PURE__ */ O("form", {
134
+ className: "grid gap-4",
135
+ onSubmit: (e) => {
136
+ e.preventDefault(), R();
137
+ },
138
+ children: [
139
+ /* @__PURE__ */ D(H, {
140
+ id: `${r}-q`,
141
+ label: n("pollEditor.question"),
142
+ children: /* @__PURE__ */ D(m, {
143
+ id: `${r}-q`,
144
+ rows: 2,
145
+ value: p,
146
+ placeholder: n("pollEditor.questionPlaceholder"),
147
+ onChange: (e) => h(e.target.value)
148
+ })
149
+ }),
150
+ /* @__PURE__ */ O("div", {
151
+ className: "grid gap-4 sm:grid-cols-2",
152
+ children: [
153
+ /* @__PURE__ */ D(H, {
154
+ id: `${r}-lang`,
155
+ label: n("pollEditor.language"),
156
+ children: s.length ? /* @__PURE__ */ O(c, {
157
+ value: g,
158
+ onValueChange: (e) => _(String(e)),
159
+ children: [/* @__PURE__ */ D(d, {
160
+ id: `${r}-lang`,
161
+ className: "w-full",
162
+ children: /* @__PURE__ */ D(f, { children: (e) => s.find((t) => t.value === e)?.label ?? e })
163
+ }), /* @__PURE__ */ D(l, { children: s.map((e) => /* @__PURE__ */ D(u, {
164
+ value: e.value,
165
+ children: e.label
166
+ }, e.value)) })]
167
+ }) : /* @__PURE__ */ D(o, {
168
+ id: `${r}-lang`,
169
+ value: g,
170
+ onChange: (e) => _(e.target.value)
171
+ })
172
+ }),
173
+ e.freeText && /* @__PURE__ */ O("fieldset", {
174
+ className: "grid gap-1.5",
175
+ children: [/* @__PURE__ */ D("legend", {
176
+ className: "mb-1.5 text-sm font-medium",
177
+ children: n("pollEditor.kind")
178
+ }), /* @__PURE__ */ D("div", {
179
+ className: "flex flex-wrap gap-2",
180
+ children: ["multiple_choice", "free_text"].map((e) => /* @__PURE__ */ D(i, {
181
+ type: "button",
182
+ size: "sm",
183
+ variant: y === e ? "default" : "outline",
184
+ "aria-pressed": y === e,
185
+ onClick: () => b(e),
186
+ children: n(e === "free_text" ? "pollEditor.freeText" : "pollEditor.multipleChoice")
187
+ }, e))
188
+ })]
189
+ }),
190
+ /* @__PURE__ */ D(H, {
191
+ id: `${r}-live`,
192
+ label: n("pollEditor.liveAt"),
193
+ children: /* @__PURE__ */ D(o, {
194
+ id: `${r}-live`,
195
+ type: "datetime-local",
196
+ value: x,
197
+ onChange: (e) => w(e.target.value)
198
+ })
199
+ }),
200
+ /* @__PURE__ */ D(H, {
201
+ id: `${r}-closes`,
202
+ label: n("pollEditor.closesAt"),
203
+ children: /* @__PURE__ */ D(o, {
204
+ id: `${r}-closes`,
205
+ type: "datetime-local",
206
+ value: E,
207
+ min: x,
208
+ onChange: (e) => k(e.target.value)
209
+ })
210
+ })
211
+ ]
212
+ }),
213
+ /* @__PURE__ */ D(V, {
214
+ label: n("pollEditor.image"),
215
+ url: U(A),
216
+ onPick: j,
217
+ onRemove: () => j(null)
218
+ }),
219
+ y === "free_text" ? /* @__PURE__ */ D("p", {
220
+ className: "text-muted-foreground",
221
+ children: n("pollEditor.freeTextHelp")
222
+ }) : /* @__PURE__ */ O("fieldset", {
223
+ className: "grid gap-2",
224
+ children: [
225
+ /* @__PURE__ */ D("legend", {
226
+ className: "mb-1.5 text-sm font-medium",
227
+ children: n("pollEditor.options")
228
+ }),
229
+ /* @__PURE__ */ D(a, {
230
+ items: M,
231
+ id: (e) => e.key,
232
+ name: (e) => e.label || n("pollEditor.option", { index: M.indexOf(e) + 1 }),
233
+ onMove: L,
234
+ label: n("pollEditor.options"),
235
+ className: "gap-2",
236
+ row: () => ({
237
+ className: z,
238
+ "data-ckui": "poll-option"
239
+ }),
240
+ children: (e, t, n) => /* @__PURE__ */ D(B, {
241
+ handle: t,
242
+ index: n,
243
+ label: e.label,
244
+ image: e.image,
245
+ onLabel: (t) => I(e.key, { label: t }),
246
+ onImage: (t) => I(e.key, { image: t }),
247
+ onRemove: M.length > 2 ? () => P((t) => t.filter((t) => t.key !== e.key)) : void 0
248
+ })
249
+ }),
250
+ M.length < e.maxOptions ? /* @__PURE__ */ D(i, {
251
+ type: "button",
252
+ variant: "outline",
253
+ size: "sm",
254
+ className: "justify-self-start",
255
+ onClick: () => P((e) => [...e, F()]),
256
+ children: n("pollEditor.addOption")
257
+ }) : /* @__PURE__ */ D("p", {
258
+ className: "text-xs text-muted-foreground",
259
+ children: n("pollEditor.maxOptions", { max: e.maxOptions })
260
+ })
261
+ ]
262
+ }),
263
+ /* @__PURE__ */ D(i, {
264
+ type: "submit",
265
+ className: "justify-self-start",
266
+ disabled: e.saving,
267
+ children: e.saving ? n("pollEditor.creating") : n("pollEditor.create")
268
+ })
269
+ ]
270
+ });
271
+ }
272
+ function R(e) {
273
+ let n = t(), { t: r } = n, c = S(), { poll: l, editor: u } = e, [d, f] = T(l.question), [p, g] = T(v(new Date(l.live_at))), [_, y] = T(l.closes_at ? v(new Date(l.closes_at)) : ""), [x, C] = T(l.is_active), [w, E] = T(""), [k, A] = T(null), j = [...l.options].sort((e, t) => e.position - t.position), M = {};
274
+ d.trim() !== l.question && (M.question = d.trim()), N(p) !== new Date(v(new Date(l.live_at))).toISOString() && (M.live_at = N(p)), _ && N(_) !== (l.closes_at && new Date(v(new Date(l.closes_at))).toISOString()) ? M.closes_at = N(_) : !_ && l.closes_at && (M.closes_at = null), x !== l.is_active && (M.is_active = x);
275
+ let P = Object.keys(M).length > 0, F = (t) => void t().catch(e.onError);
276
+ return /* @__PURE__ */ O("div", {
277
+ className: "grid gap-4",
278
+ children: [
279
+ /* @__PURE__ */ O("form", {
280
+ className: "grid gap-4",
281
+ onSubmit: (t) => {
282
+ if (t.preventDefault(), !d.trim()) return e.onInvalid(r("pollEditor.questionRequired"));
283
+ P && F(async () => e.onSaved(await u.update(M)));
284
+ },
285
+ children: [
286
+ /* @__PURE__ */ D(H, {
287
+ id: `${c}-q`,
288
+ label: r("pollEditor.question"),
289
+ children: /* @__PURE__ */ D(m, {
290
+ id: `${c}-q`,
291
+ rows: 2,
292
+ value: d,
293
+ onChange: (e) => f(e.target.value)
294
+ })
295
+ }),
296
+ /* @__PURE__ */ O("div", {
297
+ className: "grid gap-4 sm:grid-cols-2",
298
+ children: [/* @__PURE__ */ D(H, {
299
+ id: `${c}-live`,
300
+ label: r("pollEditor.liveAt"),
301
+ children: /* @__PURE__ */ D(o, {
302
+ id: `${c}-live`,
303
+ type: "datetime-local",
304
+ value: p,
305
+ onChange: (e) => g(e.target.value)
306
+ })
307
+ }), /* @__PURE__ */ D(H, {
308
+ id: `${c}-closes`,
309
+ label: r("pollEditor.closesAt"),
310
+ children: /* @__PURE__ */ D(o, {
311
+ id: `${c}-closes`,
312
+ type: "datetime-local",
313
+ value: _,
314
+ min: p,
315
+ onChange: (e) => y(e.target.value)
316
+ })
317
+ })]
318
+ }),
319
+ /* @__PURE__ */ O("div", {
320
+ className: "flex items-center gap-3",
321
+ children: [/* @__PURE__ */ D(b, {
322
+ id: `${c}-active`,
323
+ checked: x,
324
+ onCheckedChange: C
325
+ }), /* @__PURE__ */ D(s, {
326
+ htmlFor: `${c}-active`,
327
+ children: r(x ? "pollEditor.active" : "pollEditor.inactive")
328
+ })]
329
+ }),
330
+ /* @__PURE__ */ D(i, {
331
+ type: "submit",
332
+ className: "justify-self-start",
333
+ disabled: !P || e.saving,
334
+ children: e.saving ? r("common.saving") : r("common.save")
335
+ })
336
+ ]
337
+ }),
338
+ /* @__PURE__ */ D(V, {
339
+ label: r("pollEditor.image"),
340
+ url: l.image_url,
341
+ disabled: e.saving,
342
+ onPick: (e) => F(() => u.setImage(e)),
343
+ onRemove: () => F(() => u.setImage(null))
344
+ }),
345
+ l.kind === "free_text" ? /* @__PURE__ */ O("p", {
346
+ className: "text-muted-foreground",
347
+ children: [
348
+ r("pollEditor.freeTextHelp"),
349
+ " ",
350
+ n.plural("poll.answers", l.answer_count ?? 0)
351
+ ]
352
+ }) : /* @__PURE__ */ O("fieldset", {
353
+ className: "grid gap-2",
354
+ children: [
355
+ /* @__PURE__ */ D("legend", {
356
+ className: "mb-1.5 text-sm font-medium",
357
+ children: r("pollEditor.options")
358
+ }),
359
+ /* @__PURE__ */ D(a, {
360
+ items: j,
361
+ id: (e) => e.id,
362
+ name: (e) => e.label,
363
+ disabled: e.saving,
364
+ onMove: (e, t) => F(() => u.moveOption(j[e].id, t)),
365
+ label: r("pollEditor.options"),
366
+ className: "gap-2",
367
+ row: () => ({
368
+ className: z,
369
+ "data-ckui": "poll-option"
370
+ }),
371
+ children: (t, n, r) => /* @__PURE__ */ D(B, {
372
+ handle: n,
373
+ index: r,
374
+ label: t.label,
375
+ url: t.image_url,
376
+ votes: t.vote_count,
377
+ disabled: e.saving,
378
+ onCommit: (e) => e.trim() && e.trim() !== t.label && F(() => u.renameOption(t.id, e.trim())),
379
+ onImage: (e) => F(() => u.setOptionImage(t.id, e)),
380
+ onRemove: j.length > 2 ? () => A(t) : void 0
381
+ })
382
+ }),
383
+ j.length < e.maxOptions ? /* @__PURE__ */ O("form", {
384
+ className: "flex gap-2",
385
+ onSubmit: (e) => {
386
+ e.preventDefault(), w.trim() && F(async () => {
387
+ await u.addOption(w.trim()), E("");
388
+ });
389
+ },
390
+ children: [/* @__PURE__ */ D(o, {
391
+ value: w,
392
+ placeholder: r("pollEditor.newOption"),
393
+ "aria-label": r("pollEditor.newOption"),
394
+ onChange: (e) => E(e.target.value)
395
+ }), /* @__PURE__ */ D(i, {
396
+ type: "submit",
397
+ variant: "outline",
398
+ disabled: !w.trim() || e.saving,
399
+ children: r("pollEditor.addOption")
400
+ })]
401
+ }) : /* @__PURE__ */ D("p", {
402
+ className: "text-xs text-muted-foreground",
403
+ children: r("pollEditor.maxOptions", { max: e.maxOptions })
404
+ })
405
+ ]
406
+ }),
407
+ /* @__PURE__ */ D(h, {
408
+ open: !!k,
409
+ onOpenChange: (e) => !e && A(null),
410
+ title: r("pollEditor.removeOptionTitle"),
411
+ description: r("pollEditor.removeOptionBody"),
412
+ confirm: r("pollEditor.removeOption"),
413
+ onConfirm: () => k && F(() => u.removeOption(k.id))
414
+ })
415
+ ]
416
+ });
417
+ }
418
+ var z = "flex flex-wrap items-center gap-2 rounded-lg border border-border p-2";
419
+ function B(e) {
420
+ let n = t(), { t: r } = n, [a, s] = T(e.label);
421
+ x(() => s(e.label), [e.label]);
422
+ let c = U(e.image ?? null), l = r("pollEditor.option", { index: e.index + 1 });
423
+ return /* @__PURE__ */ O(E, { children: [
424
+ e.handle,
425
+ /* @__PURE__ */ D(o, {
426
+ className: "min-w-40 flex-1",
427
+ value: a,
428
+ "aria-label": l,
429
+ placeholder: l,
430
+ disabled: e.disabled && !e.onLabel,
431
+ onChange: (t) => {
432
+ s(t.target.value), e.onLabel?.(t.target.value);
433
+ },
434
+ onBlur: () => e.onCommit?.(a),
435
+ onKeyDown: (t) => {
436
+ t.key === "Enter" && e.onCommit && (t.preventDefault(), e.onCommit(a));
437
+ }
438
+ }),
439
+ /* @__PURE__ */ D(V, {
440
+ compact: !0,
441
+ label: r("pollEditor.optionImage", { index: e.index + 1 }),
442
+ url: e.url ?? c,
443
+ disabled: e.disabled,
444
+ onPick: e.onImage,
445
+ onRemove: () => e.onImage(null)
446
+ }),
447
+ e.votes !== void 0 && /* @__PURE__ */ D("span", {
448
+ className: "text-xs tabular-nums text-muted-foreground",
449
+ children: n.plural("poll.votes", e.votes)
450
+ }),
451
+ e.onRemove && /* @__PURE__ */ D(i, {
452
+ type: "button",
453
+ variant: "ghost",
454
+ size: "icon-sm",
455
+ "aria-label": `${r("pollEditor.removeOption")}: ${l}`,
456
+ disabled: e.disabled,
457
+ onClick: e.onRemove,
458
+ children: /* @__PURE__ */ D(M, {
459
+ icon: A,
460
+ strokeWidth: 2
461
+ })
462
+ })
463
+ ] });
464
+ }
465
+ function V(e) {
466
+ let { t: n } = t(), r = w(null), a = /* @__PURE__ */ D("input", {
467
+ ref: r,
468
+ type: "file",
469
+ accept: "image/*",
470
+ hidden: !0,
471
+ "aria-label": e.label,
472
+ onChange: (t) => {
473
+ let n = t.target.files?.[0];
474
+ t.target.value = "", n && e.onPick(n);
475
+ }
476
+ });
477
+ return e.compact ? /* @__PURE__ */ O("div", {
478
+ className: "flex items-center gap-1",
479
+ "data-ckui": "poll-image",
480
+ children: [
481
+ a,
482
+ /* @__PURE__ */ D(i, {
483
+ type: "button",
484
+ variant: "outline",
485
+ size: "icon",
486
+ className: "overflow-hidden p-0",
487
+ "aria-label": `${e.url ? n("pollEditor.replaceImage") : n("pollEditor.uploadImage")}: ${e.label}`,
488
+ disabled: e.disabled,
489
+ onClick: () => r.current?.click(),
490
+ children: e.url ? /* @__PURE__ */ D("img", {
491
+ src: e.url,
492
+ alt: "",
493
+ className: "size-full object-cover"
494
+ }) : /* @__PURE__ */ D(M, {
495
+ icon: j,
496
+ strokeWidth: 2
497
+ })
498
+ }),
499
+ e.url && /* @__PURE__ */ D(i, {
500
+ type: "button",
501
+ variant: "ghost",
502
+ size: "xs",
503
+ disabled: e.disabled,
504
+ onClick: e.onRemove,
505
+ children: n("pollEditor.removeImage")
506
+ })
507
+ ]
508
+ }) : /* @__PURE__ */ O("div", {
509
+ className: "grid gap-1.5",
510
+ "data-ckui": "poll-image",
511
+ children: [
512
+ /* @__PURE__ */ D("span", {
513
+ className: "text-sm font-medium",
514
+ children: e.label
515
+ }),
516
+ a,
517
+ e.url && /* @__PURE__ */ D("img", {
518
+ src: e.url,
519
+ alt: "",
520
+ className: "aspect-video w-full max-w-sm rounded-lg border border-border object-cover"
521
+ }),
522
+ /* @__PURE__ */ O("div", {
523
+ className: "flex gap-2",
524
+ children: [/* @__PURE__ */ O(i, {
525
+ type: "button",
526
+ variant: "outline",
527
+ size: "sm",
528
+ disabled: e.disabled,
529
+ onClick: () => r.current?.click(),
530
+ children: [/* @__PURE__ */ D(M, {
531
+ icon: j,
532
+ strokeWidth: 2,
533
+ "data-icon": "inline-start"
534
+ }), e.url ? n("pollEditor.replaceImage") : n("pollEditor.uploadImage")]
535
+ }), e.url && /* @__PURE__ */ D(i, {
536
+ type: "button",
537
+ variant: "ghost",
538
+ size: "sm",
539
+ disabled: e.disabled,
540
+ onClick: e.onRemove,
541
+ children: n("pollEditor.removeImage")
542
+ })]
543
+ })
544
+ ]
545
+ });
546
+ }
547
+ function H({ id: e, label: t, children: n }) {
548
+ return /* @__PURE__ */ O("div", {
549
+ className: "grid gap-1.5",
550
+ children: [/* @__PURE__ */ D(s, {
551
+ htmlFor: e,
552
+ children: t
553
+ }), n]
554
+ });
555
+ }
556
+ function U(e) {
557
+ let [t, n] = T();
558
+ return x(() => {
559
+ if (!e) return n(void 0);
560
+ let t = URL.createObjectURL(e);
561
+ return n(t), () => URL.revokeObjectURL(t);
562
+ }, [e]), t;
563
+ }
564
+ //#endregion
565
+ export { I as PollEditor };
566
+
567
+ //# sourceMappingURL=poll-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll-editor.js","names":[],"sources":["../../../src/components/social/poll-editor.tsx"],"sourcesContent":["import { Delete02Icon, ImageAdd01Icon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../../client/errors.js\";\nimport type { Poll, PollKind, PollOption, PollUpdate } from \"../../client/generated/wire.js\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useErrorReporter, type ContentKitErrorHandler } from \"../../react/context.js\";\nimport { usePollEditor } from \"../../react/polls.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Input } from \"#ckui/ui/input\";\nimport { Label } from \"#ckui/ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"#ckui/ui/select\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { Switch } from \"#ckui/ui/switch\";\nimport { Textarea } from \"#ckui/ui/textarea\";\nimport { localInput } from \"./bans.js\";\nimport { SortableList } from \"../sortable-list.js\";\nimport { ConfirmDialog, contentError, ErrorLine } from \"./parts.js\";\n\nexport interface PollEditorProps {\n /** The poll to edit; none creates one. */\n poll?: string | null;\n /** Languages offered for a new poll: codes, or codes with labels. Without them the language is typed. */\n languages?: readonly (string | { value: string; label: string })[];\n /** A new poll's language. Default the first offered, else \"en\". */\n defaultLanguage?: string;\n /** Offer free-text polls (the host registered an answer classifier). Default false. */\n freeText?: boolean;\n /** Most options. Default 10. */\n maxOptions?: number;\n onCreated?: (poll: Poll) => void;\n onSaved?: (poll: Poll) => void;\n onDeleted?: () => void;\n client?: ContentKitClient;\n onError?: ContentKitErrorHandler;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\ninterface Draft {\n key: string;\n label: string;\n image: File | null;\n}\n\nconst toISO = (local: string) => (local ? new Date(local).toISOString() : undefined);\nlet seq = 0;\nconst draft = (): Draft => ({ key: `o${++seq}`, label: \"\", image: null });\n\n/**\n * Staff: creates or edits a poll (PollWrite): question, language, type, when\n * it goes live and closes, visibility, a question image, and options with\n * images, reordered with the move buttons. A new poll is written at once with\n * its images; an existing one saves its fields with Save and each option\n * change as it is made.\n */\nexport function PollEditor(p: PollEditorProps) {\n const m = useMessages();\n const { t } = m;\n const ed = usePollEditor(p.poll ?? null, { client: p.client });\n const report = useErrorReporter(p.onError);\n const [error, setError] = useState<ContentKitError | string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [deleting, setDeleting] = useState(false);\n const fail = (e: unknown) => {\n const err = toContentKitError(e);\n setError(err);\n report(err, \"poll.save\");\n };\n const root = (children: ReactNode) => (\n <ContentKitUiRoot appearance={p.appearance} className={cn(\"grid gap-5 text-sm\", p.className)} data-ckui=\"poll-editor\">\n {children}\n </ContentKitUiRoot>\n );\n if (ed.loading && !ed.poll) {\n return root(\n <div className=\"grid gap-3\" aria-busy>\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-24 w-full\" />\n </div>,\n );\n }\n if (ed.error && !ed.poll) return root(<ErrorLine error={ed.error} />);\n return root(\n <>\n <h2 className=\"text-base font-semibold\">{t(ed.poll ? \"pollEditor.editTitle\" : \"pollEditor.newTitle\")}</h2>\n {ed.poll ? (\n <EditFields\n key={ed.poll.id}\n poll={ed.poll}\n saving={ed.saving}\n maxOptions={p.maxOptions ?? 10}\n editor={ed}\n onError={fail}\n onInvalid={(msg) => setError(msg)}\n onSaved={(poll) => {\n setError(null);\n setNotice(t(\"pollEditor.saved\"));\n p.onSaved?.(poll);\n }}\n />\n ) : (\n <CreateFields\n saving={ed.saving}\n languages={p.languages}\n defaultLanguage={p.defaultLanguage}\n freeText={!!p.freeText}\n maxOptions={p.maxOptions ?? 10}\n onInvalid={(msg) => setError(msg)}\n onCreate={async (input, images) => {\n setError(null);\n try {\n const { poll, imageErrors } = await ed.create(input, images);\n setNotice(imageErrors.length ? t(\"pollEditor.imageFailed\") : t(\"pollEditor.created\"));\n for (const e of imageErrors) report(e, \"poll.save\");\n p.onCreated?.(poll);\n } catch (e) {\n fail(e);\n }\n }}\n />\n )}\n {error && <ErrorLine>{typeof error === \"string\" ? error : contentError(m, error)}</ErrorLine>}\n {notice && !error && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {notice}\n </p>\n )}\n {ed.poll && (\n <div className=\"border-t border-border pt-4\">\n <Button variant=\"destructive\" onClick={() => setDeleting(true)} disabled={ed.saving}>\n {t(\"pollEditor.delete\")}\n </Button>\n </div>\n )}\n <ConfirmDialog\n open={deleting}\n onOpenChange={setDeleting}\n title={t(\"pollEditor.deleteTitle\")}\n description={t(\"pollEditor.deleteBody\")}\n confirm={t(\"pollEditor.delete\")}\n onConfirm={() =>\n void ed.remove().then(\n () => p.onDeleted?.(),\n (e) => fail(e),\n )\n }\n />\n </>,\n );\n}\n\nfunction CreateFields(p: {\n saving: boolean;\n languages?: PollEditorProps[\"languages\"];\n defaultLanguage?: string;\n freeText: boolean;\n maxOptions: number;\n onInvalid: (message: string) => void;\n onCreate: (input: Parameters<ReturnType<typeof usePollEditor>[\"create\"]>[0], images: { question: File | null; options: (File | null)[] }) => Promise<void>;\n}) {\n const { t } = useMessages();\n const ids = useId();\n const langs = useMemo(() => (p.languages ?? []).map((l) => (typeof l === \"string\" ? { value: l, label: l } : l)), [p.languages]);\n const [question, setQuestion] = useState(\"\");\n const [language, setLanguage] = useState(p.defaultLanguage ?? langs[0]?.value ?? \"en\");\n const [kind, setKind] = useState<PollKind>(\"multiple_choice\");\n const [liveAt, setLiveAt] = useState(() => localInput(new Date()));\n const [closesAt, setClosesAt] = useState(\"\");\n const [image, setImage] = useState<File | null>(null);\n const [options, setOptions] = useState<Draft[]>(() => [draft(), draft()]);\n const set = (key: string, patch: Partial<Draft>) => setOptions((os) => os.map((o) => (o.key === key ? { ...o, ...patch } : o)));\n const move = (from: number, to: number) =>\n setOptions((os) => {\n const next = [...os];\n next.splice(to, 0, ...next.splice(from, 1));\n return next;\n });\n const submit = () => {\n if (!question.trim()) return p.onInvalid(t(\"pollEditor.questionRequired\"));\n const kept = options.filter((o) => o.label.trim() || o.image);\n if (kind === \"multiple_choice\") {\n if (kept.some((o) => !o.label.trim())) return p.onInvalid(t(\"pollEditor.optionRequired\"));\n if (kept.length < 2) return p.onInvalid(t(\"pollEditor.minOptions\"));\n }\n const choice = kind === \"multiple_choice\";\n void p.onCreate(\n {\n kind,\n question: question.trim(),\n language,\n live_at: toISO(liveAt),\n closes_at: toISO(closesAt),\n options: choice ? kept.map((o, position) => ({ label: o.label.trim(), position })) : undefined,\n },\n { question: image, options: choice ? kept.map((o) => o.image) : [] },\n );\n };\n return (\n <form\n className=\"grid gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n submit();\n }}\n >\n <Field id={`${ids}-q`} label={t(\"pollEditor.question\")}>\n <Textarea id={`${ids}-q`} rows={2} value={question} placeholder={t(\"pollEditor.questionPlaceholder\")} onChange={(e) => setQuestion(e.target.value)} />\n </Field>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field id={`${ids}-lang`} label={t(\"pollEditor.language\")}>\n {langs.length ? (\n <Select value={language} onValueChange={(v) => setLanguage(String(v))}>\n <SelectTrigger id={`${ids}-lang`} className=\"w-full\">\n <SelectValue>{(v: string) => langs.find((l) => l.value === v)?.label ?? v}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {langs.map((l) => (\n <SelectItem key={l.value} value={l.value}>\n {l.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Input id={`${ids}-lang`} value={language} onChange={(e) => setLanguage(e.target.value)} />\n )}\n </Field>\n {p.freeText && (\n <fieldset className=\"grid gap-1.5\">\n <legend className=\"mb-1.5 text-sm font-medium\">{t(\"pollEditor.kind\")}</legend>\n <div className=\"flex flex-wrap gap-2\">\n {([\"multiple_choice\", \"free_text\"] as const).map((k) => (\n <Button key={k} type=\"button\" size=\"sm\" variant={kind === k ? \"default\" : \"outline\"} aria-pressed={kind === k} onClick={() => setKind(k)}>\n {t(k === \"free_text\" ? \"pollEditor.freeText\" : \"pollEditor.multipleChoice\")}\n </Button>\n ))}\n </div>\n </fieldset>\n )}\n <Field id={`${ids}-live`} label={t(\"pollEditor.liveAt\")}>\n <Input id={`${ids}-live`} type=\"datetime-local\" value={liveAt} onChange={(e) => setLiveAt(e.target.value)} />\n </Field>\n <Field id={`${ids}-closes`} label={t(\"pollEditor.closesAt\")}>\n <Input id={`${ids}-closes`} type=\"datetime-local\" value={closesAt} min={liveAt} onChange={(e) => setClosesAt(e.target.value)} />\n </Field>\n </div>\n <ImageField label={t(\"pollEditor.image\")} url={useObjectURL(image)} onPick={setImage} onRemove={() => setImage(null)} />\n {kind === \"free_text\" ? (\n <p className=\"text-muted-foreground\">{t(\"pollEditor.freeTextHelp\")}</p>\n ) : (\n <fieldset className=\"grid gap-2\">\n <legend className=\"mb-1.5 text-sm font-medium\">{t(\"pollEditor.options\")}</legend>\n <SortableList\n items={options}\n id={(o) => o.key}\n name={(o) => o.label || t(\"pollEditor.option\", { index: options.indexOf(o) + 1 })}\n onMove={move}\n label={t(\"pollEditor.options\")}\n className=\"gap-2\"\n row={() => ({ className: OPTION_ROW, \"data-ckui\": \"poll-option\" })}\n >\n {(o, handle, i) => (\n <OptionRow\n handle={handle}\n index={i}\n label={o.label}\n image={o.image}\n onLabel={(label) => set(o.key, { label })}\n onImage={(image) => set(o.key, { image })}\n onRemove={options.length > 2 ? () => setOptions((os) => os.filter((x) => x.key !== o.key)) : undefined}\n />\n )}\n </SortableList>\n {options.length < p.maxOptions ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"justify-self-start\" onClick={() => setOptions((os) => [...os, draft()])}>\n {t(\"pollEditor.addOption\")}\n </Button>\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t(\"pollEditor.maxOptions\", { max: p.maxOptions })}</p>\n )}\n </fieldset>\n )}\n <Button type=\"submit\" className=\"justify-self-start\" disabled={p.saving}>\n {p.saving ? t(\"pollEditor.creating\") : t(\"pollEditor.create\")}\n </Button>\n </form>\n );\n}\n\nfunction EditFields(p: {\n poll: Poll;\n saving: boolean;\n maxOptions: number;\n editor: ReturnType<typeof usePollEditor>;\n onError: (e: unknown) => void;\n onInvalid: (message: string) => void;\n onSaved: (poll: Poll) => void;\n}) {\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const { poll, editor } = p;\n const [question, setQuestion] = useState(poll.question);\n const [liveAt, setLiveAt] = useState(localInput(new Date(poll.live_at)));\n const [closesAt, setClosesAt] = useState(poll.closes_at ? localInput(new Date(poll.closes_at)) : \"\");\n const [active, setActive] = useState(poll.is_active);\n const [added, setAdded] = useState(\"\");\n const [removing, setRemoving] = useState<PollOption | null>(null);\n const options = [...poll.options].sort((a, b) => a.position - b.position);\n const patch: PollUpdate = {};\n if (question.trim() !== poll.question) patch.question = question.trim();\n if (toISO(liveAt) !== new Date(localInput(new Date(poll.live_at))).toISOString()) patch.live_at = toISO(liveAt);\n if (closesAt && toISO(closesAt) !== (poll.closes_at && new Date(localInput(new Date(poll.closes_at))).toISOString())) patch.closes_at = toISO(closesAt);\n else if (!closesAt && poll.closes_at) patch.closes_at = null;\n if (active !== poll.is_active) patch.is_active = active;\n const dirty = Object.keys(patch).length > 0;\n const act = (fn: () => Promise<unknown>) => void fn().catch(p.onError);\n return (\n <div className=\"grid gap-4\">\n <form\n className=\"grid gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!question.trim()) return p.onInvalid(t(\"pollEditor.questionRequired\"));\n if (dirty) act(async () => p.onSaved(await editor.update(patch)));\n }}\n >\n <Field id={`${ids}-q`} label={t(\"pollEditor.question\")}>\n <Textarea id={`${ids}-q`} rows={2} value={question} onChange={(e) => setQuestion(e.target.value)} />\n </Field>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field id={`${ids}-live`} label={t(\"pollEditor.liveAt\")}>\n <Input id={`${ids}-live`} type=\"datetime-local\" value={liveAt} onChange={(e) => setLiveAt(e.target.value)} />\n </Field>\n <Field id={`${ids}-closes`} label={t(\"pollEditor.closesAt\")}>\n <Input id={`${ids}-closes`} type=\"datetime-local\" value={closesAt} min={liveAt} onChange={(e) => setClosesAt(e.target.value)} />\n </Field>\n </div>\n <div className=\"flex items-center gap-3\">\n <Switch id={`${ids}-active`} checked={active} onCheckedChange={setActive} />\n <Label htmlFor={`${ids}-active`}>{t(active ? \"pollEditor.active\" : \"pollEditor.inactive\")}</Label>\n </div>\n <Button type=\"submit\" className=\"justify-self-start\" disabled={!dirty || p.saving}>\n {p.saving ? t(\"common.saving\") : t(\"common.save\")}\n </Button>\n </form>\n <ImageField label={t(\"pollEditor.image\")} url={poll.image_url} disabled={p.saving} onPick={(f) => act(() => editor.setImage(f))} onRemove={() => act(() => editor.setImage(null))} />\n {poll.kind === \"free_text\" ? (\n <p className=\"text-muted-foreground\">\n {t(\"pollEditor.freeTextHelp\")} {m.plural(\"poll.answers\", poll.answer_count ?? 0)}\n </p>\n ) : (\n <fieldset className=\"grid gap-2\">\n <legend className=\"mb-1.5 text-sm font-medium\">{t(\"pollEditor.options\")}</legend>\n <SortableList\n items={options}\n id={(o) => o.id}\n name={(o) => o.label}\n disabled={p.saving}\n onMove={(from, to) => act(() => editor.moveOption(options[from]!.id, to))}\n label={t(\"pollEditor.options\")}\n className=\"gap-2\"\n row={() => ({ className: OPTION_ROW, \"data-ckui\": \"poll-option\" })}\n >\n {(o, handle, i) => (\n <OptionRow\n handle={handle}\n index={i}\n label={o.label}\n url={o.image_url}\n votes={o.vote_count}\n disabled={p.saving}\n onCommit={(label) => label.trim() && label.trim() !== o.label && act(() => editor.renameOption(o.id, label.trim()))}\n onImage={(f) => act(() => editor.setOptionImage(o.id, f))}\n onRemove={options.length > 2 ? () => setRemoving(o) : undefined}\n />\n )}\n </SortableList>\n {options.length < p.maxOptions ? (\n <form\n className=\"flex gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!added.trim()) return;\n act(async () => {\n await editor.addOption(added.trim());\n setAdded(\"\");\n });\n }}\n >\n <Input value={added} placeholder={t(\"pollEditor.newOption\")} aria-label={t(\"pollEditor.newOption\")} onChange={(e) => setAdded(e.target.value)} />\n <Button type=\"submit\" variant=\"outline\" disabled={!added.trim() || p.saving}>\n {t(\"pollEditor.addOption\")}\n </Button>\n </form>\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t(\"pollEditor.maxOptions\", { max: p.maxOptions })}</p>\n )}\n </fieldset>\n )}\n <ConfirmDialog\n open={!!removing}\n onOpenChange={(o) => !o && setRemoving(null)}\n title={t(\"pollEditor.removeOptionTitle\")}\n description={t(\"pollEditor.removeOptionBody\")}\n confirm={t(\"pollEditor.removeOption\")}\n onConfirm={() => removing && act(() => editor.removeOption(removing.id))}\n />\n </div>\n );\n}\n\nconst OPTION_ROW = \"flex flex-wrap items-center gap-2 rounded-lg border border-border p-2\";\n\n/** One option's content: its drag handle, label, image, votes and remove. */\nfunction OptionRow(p: {\n handle: ReactNode;\n index: number;\n label: string;\n /** A new poll's staged image. */\n image?: File | null;\n /** An existing option's image. */\n url?: string;\n votes?: number;\n disabled?: boolean;\n /** A new poll's label as typed. */\n onLabel?: (label: string) => void;\n /** An existing option's label, on blur or Enter. */\n onCommit?: (label: string) => void;\n onImage: (file: File | null) => void;\n onRemove?: () => void;\n}) {\n const m = useMessages();\n const { t } = m;\n const [label, setLabel] = useState(p.label);\n useEffect(() => setLabel(p.label), [p.label]);\n const staged = useObjectURL(p.image ?? null);\n const name = t(\"pollEditor.option\", { index: p.index + 1 });\n return (\n <>\n {p.handle}\n <Input\n className=\"min-w-40 flex-1\"\n value={label}\n aria-label={name}\n placeholder={name}\n disabled={p.disabled && !p.onLabel}\n onChange={(e) => {\n setLabel(e.target.value);\n p.onLabel?.(e.target.value);\n }}\n onBlur={() => p.onCommit?.(label)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && p.onCommit) {\n e.preventDefault();\n p.onCommit(label);\n }\n }}\n />\n <ImageField compact label={t(\"pollEditor.optionImage\", { index: p.index + 1 })} url={p.url ?? staged} disabled={p.disabled} onPick={p.onImage} onRemove={() => p.onImage(null)} />\n {p.votes !== undefined && <span className=\"text-xs tabular-nums text-muted-foreground\">{m.plural(\"poll.votes\", p.votes)}</span>}\n {p.onRemove && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" aria-label={`${t(\"pollEditor.removeOption\")}: ${name}`} disabled={p.disabled} onClick={p.onRemove}>\n <HugeiconsIcon icon={Delete02Icon} strokeWidth={2} />\n </Button>\n )}\n </>\n );\n}\n\nfunction ImageField(p: { label: string; url?: string | null; compact?: boolean; disabled?: boolean; onPick: (file: File) => void; onRemove: () => void }) {\n const { t } = useMessages();\n const input = useRef<HTMLInputElement>(null);\n const pick = (\n <input\n ref={input}\n type=\"file\"\n accept=\"image/*\"\n hidden\n aria-label={p.label}\n onChange={(e) => {\n const f = e.target.files?.[0];\n e.target.value = \"\";\n if (f) p.onPick(f);\n }}\n />\n );\n if (p.compact) {\n return (\n <div className=\"flex items-center gap-1\" data-ckui=\"poll-image\">\n {pick}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"overflow-hidden p-0\"\n aria-label={`${p.url ? t(\"pollEditor.replaceImage\") : t(\"pollEditor.uploadImage\")}: ${p.label}`}\n disabled={p.disabled}\n onClick={() => input.current?.click()}\n >\n {p.url ? <img src={p.url} alt=\"\" className=\"size-full object-cover\" /> : <HugeiconsIcon icon={ImageAdd01Icon} strokeWidth={2} />}\n </Button>\n {p.url && (\n <Button type=\"button\" variant=\"ghost\" size=\"xs\" disabled={p.disabled} onClick={p.onRemove}>\n {t(\"pollEditor.removeImage\")}\n </Button>\n )}\n </div>\n );\n }\n return (\n <div className=\"grid gap-1.5\" data-ckui=\"poll-image\">\n <span className=\"text-sm font-medium\">{p.label}</span>\n {pick}\n {p.url && <img src={p.url} alt=\"\" className=\"aspect-video w-full max-w-sm rounded-lg border border-border object-cover\" />}\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={p.disabled} onClick={() => input.current?.click()}>\n <HugeiconsIcon icon={ImageAdd01Icon} strokeWidth={2} data-icon=\"inline-start\" />\n {p.url ? t(\"pollEditor.replaceImage\") : t(\"pollEditor.uploadImage\")}\n </Button>\n {p.url && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" disabled={p.disabled} onClick={p.onRemove}>\n {t(\"pollEditor.removeImage\")}\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nfunction Field({ id, label, children }: { id: string; label: string; children: ReactNode }) {\n return (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={id}>{label}</Label>\n {children}\n </div>\n );\n}\n\n/** An object URL for a staged file, revoked when it changes. */\nfunction useObjectURL(file: File | null): string | undefined {\n const [url, setUrl] = useState<string>();\n useEffect(() => {\n if (!file) return setUrl(undefined);\n const u = URL.createObjectURL(file);\n setUrl(u);\n return () => URL.revokeObjectURL(u);\n }, [file]);\n return url;\n}\n"],"mappings":"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"}