@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.
- package/README.md +425 -2
- package/dist/appearance.d.ts +38 -0
- package/dist/appearance.js +15 -0
- package/dist/appearance.js.map +1 -0
- package/dist/assets/hash.worker-BYfo-7MQ.js.map +1 -0
- package/dist/client/aspect.d.ts +6 -0
- package/dist/client/aspect.js +17 -0
- package/dist/client/aspect.js.map +1 -0
- package/dist/client/client.d.ts +51 -0
- package/dist/client/client.js +35 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/codes.d.ts +12 -0
- package/dist/client/codes.js +19 -0
- package/dist/client/codes.js.map +1 -0
- package/dist/client/content/bans.d.ts +15 -0
- package/dist/client/content/bans.js +40 -0
- package/dist/client/content/bans.js.map +1 -0
- package/dist/client/content/comments.d.ts +36 -0
- package/dist/client/content/comments.js +93 -0
- package/dist/client/content/comments.js.map +1 -0
- package/dist/client/content/favorites.d.ts +14 -0
- package/dist/client/content/favorites.js +42 -0
- package/dist/client/content/favorites.js.map +1 -0
- package/dist/client/content/moderation.d.ts +18 -0
- package/dist/client/content/moderation.js +37 -0
- package/dist/client/content/moderation.js.map +1 -0
- package/dist/client/content/polls.d.ts +47 -0
- package/dist/client/content/polls.js +148 -0
- package/dist/client/content/polls.js.map +1 -0
- package/dist/client/content/posts.d.ts +44 -0
- package/dist/client/content/posts.js +91 -0
- package/dist/client/content/posts.js.map +1 -0
- package/dist/client/content/reactions.d.ts +12 -0
- package/dist/client/content/reactions.js +36 -0
- package/dist/client/content/reactions.js.map +1 -0
- package/dist/client/content/types.d.ts +91 -0
- package/dist/client/content/types.js +8 -0
- package/dist/client/content/types.js.map +1 -0
- package/dist/client/crop.d.ts +32 -0
- package/dist/client/crop.js +103 -0
- package/dist/client/crop.js.map +1 -0
- package/dist/client/errors.d.ts +54 -0
- package/dist/client/errors.js +80 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/gallery.d.ts +43 -0
- package/dist/client/gallery.js +86 -0
- package/dist/client/gallery.js.map +1 -0
- package/dist/client/generated/error-codes.d.ts +5 -0
- package/dist/client/generated/error-codes.js +131 -0
- package/dist/client/generated/error-codes.js.map +1 -0
- package/dist/client/generated/routes.d.ts +1086 -0
- package/dist/client/generated/routes.js +1400 -0
- package/dist/client/generated/routes.js.map +1 -0
- package/dist/client/generated/wire.d.ts +630 -0
- package/dist/client/generated/wire.js +6 -0
- package/dist/client/generated/wire.js.map +1 -0
- package/dist/client/http.d.ts +79 -0
- package/dist/client/http.js +74 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/image.d.ts +24 -0
- package/dist/client/image.js +65 -0
- package/dist/client/image.js.map +1 -0
- package/dist/client/index.d.ts +33 -0
- package/dist/client/media/api.d.ts +36 -0
- package/dist/client/media/api.js +61 -0
- package/dist/client/media/api.js.map +1 -0
- package/dist/client/media/client.d.ts +247 -0
- package/dist/client/media/client.js +407 -0
- package/dist/client/media/client.js.map +1 -0
- package/dist/client/media/encode.d.ts +3 -0
- package/dist/client/media/encode.js +8 -0
- package/dist/client/media/encode.js.map +1 -0
- package/dist/client/media/hash-stream.d.ts +6 -0
- package/dist/client/media/hash-stream.js +16 -0
- package/dist/client/media/hash-stream.js.map +1 -0
- package/dist/client/media/hash.d.ts +12 -0
- package/dist/client/media/hash.js +48 -0
- package/dist/client/media/hash.js.map +1 -0
- package/dist/client/media/hash.worker-inline.js +18 -0
- package/dist/client/media/hash.worker-inline.js.map +1 -0
- package/dist/client/media/pacer.d.ts +21 -0
- package/dist/client/media/pacer.js +25 -0
- package/dist/client/media/pacer.js.map +1 -0
- package/dist/client/media/queue.d.ts +112 -0
- package/dist/client/media/queue.js +274 -0
- package/dist/client/media/queue.js.map +1 -0
- package/dist/client/media/ref.d.ts +6 -0
- package/dist/client/media/ref.js +10 -0
- package/dist/client/media/ref.js.map +1 -0
- package/dist/client/media/rules.d.ts +52 -0
- package/dist/client/media/rules.js +139 -0
- package/dist/client/media/rules.js.map +1 -0
- package/dist/client/media/transport.d.ts +13 -0
- package/dist/client/media/transport.js +33 -0
- package/dist/client/media/transport.js.map +1 -0
- package/dist/client/media/windows.d.ts +15 -0
- package/dist/client/media/windows.js +39 -0
- package/dist/client/media/windows.js.map +1 -0
- package/dist/client/playback.d.ts +200 -0
- package/dist/client/playback.js +142 -0
- package/dist/client/playback.js.map +1 -0
- package/dist/client/player.d.ts +102 -0
- package/dist/client/player.js +155 -0
- package/dist/client/player.js.map +1 -0
- package/dist/client/public.d.ts +25 -0
- package/dist/client/public.js +18 -0
- package/dist/client/public.js.map +1 -0
- package/dist/client/rendition.d.ts +19 -0
- package/dist/client/rendition.js +16 -0
- package/dist/client/rendition.js.map +1 -0
- package/dist/client/route.d.ts +39 -0
- package/dist/client/route.js +31 -0
- package/dist/client/route.js.map +1 -0
- package/dist/client/taxonomy.d.ts +30 -0
- package/dist/client/taxonomy.js +77 -0
- package/dist/client/taxonomy.js.map +1 -0
- package/dist/client.js +33 -0
- package/dist/components/encode-progress.d.ts +15 -0
- package/dist/components/encode-progress.js +49 -0
- package/dist/components/encode-progress.js.map +1 -0
- package/dist/components/hover-preview.d.ts +29 -0
- package/dist/components/hover-preview.js +49 -0
- package/dist/components/hover-preview.js.map +1 -0
- package/dist/components/image-crop-dialog.d.ts +48 -0
- package/dist/components/image-crop-dialog.js +359 -0
- package/dist/components/image-crop-dialog.js.map +1 -0
- package/dist/components/lazy-mount.d.ts +10 -0
- package/dist/components/lazy-mount.js +22 -0
- package/dist/components/lazy-mount.js.map +1 -0
- package/dist/components/media-folder-editor.d.ts +45 -0
- package/dist/components/media-folder-editor.js +564 -0
- package/dist/components/media-folder-editor.js.map +1 -0
- package/dist/components/media-gallery.d.ts +54 -0
- package/dist/components/media-gallery.js +597 -0
- package/dist/components/media-gallery.js.map +1 -0
- package/dist/components/media-readiness-notice.d.ts +24 -0
- package/dist/components/media-readiness-notice.js +61 -0
- package/dist/components/media-readiness-notice.js.map +1 -0
- package/dist/components/player-controls.d.ts +71 -0
- package/dist/components/player-controls.js +264 -0
- package/dist/components/player-controls.js.map +1 -0
- package/dist/components/progress.d.ts +5 -0
- package/dist/components/progress.js +14 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/rendition-img.d.ts +34 -0
- package/dist/components/rendition-img.js +78 -0
- package/dist/components/rendition-img.js.map +1 -0
- package/dist/components/slot-editor.d.ts +95 -0
- package/dist/components/slot-editor.js +182 -0
- package/dist/components/slot-editor.js.map +1 -0
- package/dist/components/slot-image.d.ts +23 -0
- package/dist/components/slot-image.js +48 -0
- package/dist/components/slot-image.js.map +1 -0
- package/dist/components/slot-upload.d.ts +41 -0
- package/dist/components/slot-upload.js +213 -0
- package/dist/components/slot-upload.js.map +1 -0
- package/dist/components/social/bans.d.ts +42 -0
- package/dist/components/social/bans.js +300 -0
- package/dist/components/social/bans.js.map +1 -0
- package/dist/components/social/comments.d.ts +42 -0
- package/dist/components/social/comments.js +517 -0
- package/dist/components/social/comments.js.map +1 -0
- package/dist/components/social/engagement.d.ts +45 -0
- package/dist/components/social/engagement.js +129 -0
- package/dist/components/social/engagement.js.map +1 -0
- package/dist/components/social/index.d.ts +6 -0
- package/dist/components/social/moderation.d.ts +32 -0
- package/dist/components/social/moderation.js +383 -0
- package/dist/components/social/moderation.js.map +1 -0
- package/dist/components/social/parts.d.ts +50 -0
- package/dist/components/social/parts.js +106 -0
- package/dist/components/social/parts.js.map +1 -0
- package/dist/components/social/poll-editor.d.ts +34 -0
- package/dist/components/social/poll-editor.js +567 -0
- package/dist/components/social/poll-editor.js.map +1 -0
- package/dist/components/social/poll.d.ts +30 -0
- package/dist/components/social/poll.js +252 -0
- package/dist/components/social/poll.js.map +1 -0
- package/dist/components/sortable-list.d.ts +29 -0
- package/dist/components/sortable-list.js +121 -0
- package/dist/components/sortable-list.js.map +1 -0
- package/dist/components/video-mini-player.d.ts +35 -0
- package/dist/components/video-mini-player.js +236 -0
- package/dist/components/video-mini-player.js.map +1 -0
- package/dist/components/video-player.d.ts +146 -0
- package/dist/components/video-player.js +630 -0
- package/dist/components/video-player.js.map +1 -0
- package/dist/components/video-poster-picker.d.ts +59 -0
- package/dist/components/video-poster-picker.js +335 -0
- package/dist/components/video-poster-picker.js.map +1 -0
- package/dist/components/video-poster.d.ts +24 -0
- package/dist/components/video-poster.js +46 -0
- package/dist/components/video-poster.js.map +1 -0
- package/dist/i18n/context.d.ts +4 -0
- package/dist/i18n/context.js +11 -0
- package/dist/i18n/context.js.map +1 -0
- package/dist/i18n/messages.d.ts +40 -0
- package/dist/i18n/messages.js +94 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +41 -0
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/de.js +271 -0
- package/dist/locales/de.js.map +1 -0
- package/dist/locales/en.d.ts +457 -0
- package/dist/locales/en.js +271 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/es.d.ts +2 -0
- package/dist/locales/es.js +271 -0
- package/dist/locales/es.js.map +1 -0
- package/dist/locales/ja.d.ts +2 -0
- package/dist/locales/ja.js +271 -0
- package/dist/locales/ja.js.map +1 -0
- package/dist/locales/ko.d.ts +2 -0
- package/dist/locales/ko.js +271 -0
- package/dist/locales/ko.js.map +1 -0
- package/dist/locales/social/de.d.ts +2 -0
- package/dist/locales/social/de.js +198 -0
- package/dist/locales/social/de.js.map +1 -0
- package/dist/locales/social/en.d.ts +195 -0
- package/dist/locales/social/en.js +198 -0
- package/dist/locales/social/en.js.map +1 -0
- package/dist/locales/social/es.d.ts +2 -0
- package/dist/locales/social/es.js +198 -0
- package/dist/locales/social/es.js.map +1 -0
- package/dist/locales/social/ja.d.ts +2 -0
- package/dist/locales/social/ja.js +198 -0
- package/dist/locales/social/ja.js.map +1 -0
- package/dist/locales/social/ko.d.ts +2 -0
- package/dist/locales/social/ko.js +198 -0
- package/dist/locales/social/ko.js.map +1 -0
- package/dist/locales/social/zh.d.ts +2 -0
- package/dist/locales/social/zh.js +198 -0
- package/dist/locales/social/zh.js.map +1 -0
- package/dist/locales/zh.d.ts +2 -0
- package/dist/locales/zh.js +271 -0
- package/dist/locales/zh.js.map +1 -0
- package/dist/provider.d.ts +22 -0
- package/dist/provider.js +59 -0
- package/dist/provider.js.map +1 -0
- package/dist/react/canonical.d.ts +33 -0
- package/dist/react/canonical.js +88 -0
- package/dist/react/canonical.js.map +1 -0
- package/dist/react/comments.d.ts +82 -0
- package/dist/react/comments.js +147 -0
- package/dist/react/comments.js.map +1 -0
- package/dist/react/config.d.ts +13 -0
- package/dist/react/config.js +14 -0
- package/dist/react/config.js.map +1 -0
- package/dist/react/context.d.ts +48 -0
- package/dist/react/context.js +37 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/crop.d.ts +49 -0
- package/dist/react/crop.js +107 -0
- package/dist/react/crop.js.map +1 -0
- package/dist/react/engagement.d.ts +38 -0
- package/dist/react/engagement.js +88 -0
- package/dist/react/engagement.js.map +1 -0
- package/dist/react/folder.d.ts +83 -0
- package/dist/react/folder.js +183 -0
- package/dist/react/folder.js.map +1 -0
- package/dist/react/gallery.d.ts +140 -0
- package/dist/react/gallery.js +477 -0
- package/dist/react/gallery.js.map +1 -0
- package/dist/react/index.d.ts +21 -0
- package/dist/react/inline-preview.d.ts +24 -0
- package/dist/react/inline-preview.js +76 -0
- package/dist/react/inline-preview.js.map +1 -0
- package/dist/react/player.d.ts +70 -0
- package/dist/react/player.js +214 -0
- package/dist/react/player.js.map +1 -0
- package/dist/react/polls.d.ts +74 -0
- package/dist/react/polls.js +176 -0
- package/dist/react/polls.js.map +1 -0
- package/dist/react/posts.d.ts +59 -0
- package/dist/react/posts.js +149 -0
- package/dist/react/posts.js.map +1 -0
- package/dist/react/provider.d.ts +23 -0
- package/dist/react/provider.js +35 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/public.d.ts +39 -0
- package/dist/react/public.js +70 -0
- package/dist/react/public.js.map +1 -0
- package/dist/react/read.d.ts +52 -0
- package/dist/react/read.js +143 -0
- package/dist/react/read.js.map +1 -0
- package/dist/react/resources.d.ts +70 -0
- package/dist/react/resources.js +247 -0
- package/dist/react/resources.js.map +1 -0
- package/dist/react/slot.d.ts +102 -0
- package/dist/react/slot.js +181 -0
- package/dist/react/slot.js.map +1 -0
- package/dist/react/store.d.ts +51 -0
- package/dist/react/store.js +164 -0
- package/dist/react/store.js.map +1 -0
- package/dist/react/upload.d.ts +85 -0
- package/dist/react/upload.js +150 -0
- package/dist/react/upload.js.map +1 -0
- package/dist/react/use-resource.d.ts +43 -0
- package/dist/react/use-resource.js +66 -0
- package/dist/react/use-resource.js.map +1 -0
- package/dist/react/video.d.ts +118 -0
- package/dist/react/video.js +184 -0
- package/dist/react/video.js.map +1 -0
- package/dist/react/viewport.d.ts +19 -0
- package/dist/react/viewport.js +30 -0
- package/dist/react/viewport.js.map +1 -0
- package/dist/react.js +21 -0
- package/dist/scope.d.ts +14 -0
- package/dist/scope.js +30 -0
- package/dist/scope.js.map +1 -0
- package/dist/styles.css +3 -0
- package/dist/ui/alert-dialog.d.ts +18 -0
- package/dist/ui/alert-dialog.js +86 -0
- package/dist/ui/alert-dialog.js.map +1 -0
- package/dist/ui/alert.d.ts +10 -0
- package/dist/ui/alert.js +38 -0
- package/dist/ui/alert.js.map +1 -0
- package/dist/ui/avatar.d.ts +11 -0
- package/dist/ui/avatar.js +31 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/badge.d.ts +7 -0
- package/dist/ui/badge.js +31 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/button.d.ts +8 -0
- package/dist/ui/button.js +46 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/dialog.d.ts +17 -0
- package/dist/ui/dialog.js +91 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/dropdown-menu.d.ts +15 -0
- package/dist/ui/dropdown-menu.js +105 -0
- package/dist/ui/dropdown-menu.js.map +1 -0
- package/dist/ui/input.d.ts +3 -0
- package/dist/ui/input.js +17 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/label.d.ts +3 -0
- package/dist/ui/label.js +15 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/progress.d.ts +7 -0
- package/dist/ui/progress.js +31 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/select.d.ts +15 -0
- package/dist/ui/select.js +98 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/skeleton.d.ts +2 -0
- package/dist/ui/skeleton.js +14 -0
- package/dist/ui/skeleton.js.map +1 -0
- package/dist/ui/slider.d.ts +3 -0
- package/dist/ui/slider.js +35 -0
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/switch.d.ts +5 -0
- package/dist/ui/switch.js +20 -0
- package/dist/ui/switch.js.map +1 -0
- package/dist/ui/tabs.d.ts +10 -0
- package/dist/ui/tabs.js +47 -0
- package/dist/ui/tabs.js.map +1 -0
- package/dist/ui/textarea.d.ts +3 -0
- package/dist/ui/textarea.js +15 -0
- package/dist/ui/textarea.js.map +1 -0
- package/dist/ui/toggle-group.d.ts +5 -0
- package/dist/ui/toggle-group.js +23 -0
- package/dist/ui/toggle-group.js.map +1 -0
- package/dist/urls/index.d.ts +100 -0
- package/dist/urls.js +118 -0
- package/dist/urls.js.map +1 -0
- 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":";;;;;;;;;;;;;;;;;;;;;AAiDA,IAAM,KAAS,MAAmB,IAAQ,IAAI,KAAK,CAAK,CAAC,CAAC,YAAY,IAAI,KAAA,GACtE,IAAM,GACJ,WAAsB;CAAE,KAAK,IAAI,EAAE;CAAO,OAAO;CAAI,OAAO;AAAK;AASvE,SAAgB,EAAW,GAAoB;CAC7C,IAAM,IAAI,EAAY,GAChB,EAAE,SAAM,GACR,IAAK,EAAc,EAAE,QAAQ,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,GACvD,IAAS,EAAiB,EAAE,OAAO,GACnC,CAAC,GAAO,KAAY,EAA0C,IAAI,GAClE,CAAC,GAAQ,KAAa,EAAwB,IAAI,GAClD,CAAC,GAAU,KAAe,EAAS,EAAK,GACxC,KAAQ,MAAe;EAC3B,IAAM,IAAM,EAAkB,CAAC;EAE/B,AADA,EAAS,CAAG,GACZ,EAAO,GAAK,WAAW;CACzB,GACM,KAAQ,MACZ,kBAAC,GAAD;EAAkB,YAAY,EAAE;EAAY,WAAW,EAAG,sBAAsB,EAAE,SAAS;EAAG,aAAU;EACrG;CACe,CAAA;CAWpB,OATI,EAAG,WAAW,CAAC,EAAG,OACb,EACL,kBAAC,OAAD;EAAK,WAAU;EAAa,aAAA;EAA5B,UAAA,CACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,GAClC,kBAAC,GAAD,EAAU,WAAU,cAAe,CAAA,CAChC;CACP,CAAA,CAAA,IAEE,EAAG,SAAS,CAAC,EAAG,OAAa,EAAK,kBAAC,GAAD,EAAW,OAAO,EAAG,MAAQ,CAAA,CAAC,IAC7D,EACL,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,MAAD;GAAI,WAAU;GAA2B,UAAA,EAAE,EAAG,OAAO,yBAAyB,qBAAqB;EAAM,CAAA;EACxG,EAAG,OACF,kBAAC,GAAD;GAEE,MAAM,EAAG;GACT,QAAQ,EAAG;GACX,YAAY,EAAE,cAAc;GAC5B,QAAQ;GACR,SAAS;GACT,YAAY,MAAQ,EAAS,CAAG;GAChC,UAAU,MAAS;IAGjB,AAFA,EAAS,IAAI,GACb,EAAU,EAAE,kBAAkB,CAAC,GAC/B,EAAE,UAAU,CAAI;GAClB;EACD,GAZM,EAAG,KAAK,EAYd,IAED,kBAAC,GAAD;GACE,QAAQ,EAAG;GACX,WAAW,EAAE;GACb,iBAAiB,EAAE;GACnB,UAAU,CAAC,CAAC,EAAE;GACd,YAAY,EAAE,cAAc;GAC5B,YAAY,MAAQ,EAAS,CAAG;GAChC,UAAU,OAAO,GAAO,MAAW;IACjC,EAAS,IAAI;IACb,IAAI;KACF,IAAM,EAAE,SAAM,mBAAgB,MAAM,EAAG,OAAO,GAAO,CAAM;KAC3D,EAAU,EAAY,SAAS,EAAE,wBAAwB,IAAI,EAAE,oBAAoB,CAAC;KACpF,KAAK,IAAM,KAAK,GAAa,EAAO,GAAG,WAAW;KAClD,EAAE,YAAY,CAAI;IACpB,SAAS,GAAG;KACV,EAAK,CAAC;IACR;GACF;EACD,CAAA;EAEF,KAAS,kBAAC,GAAD,EAAA,UAAY,OAAO,KAAU,WAAW,IAAQ,EAAa,GAAG,CAAK,EAAa,CAAA;EAC3F,KAAU,CAAC,KACV,kBAAC,KAAD;GAAG,MAAK;GAAS,WAAU;GACxB,UAAA;EACA,CAAA;EAEJ,EAAG,QACF,kBAAC,OAAD;GAAK,WAAU;GACb,UAAA,kBAAC,GAAD;IAAQ,SAAQ;IAAc,eAAe,EAAY,EAAI;IAAG,UAAU,EAAG;IAC1E,UAAA,EAAE,mBAAmB;GAChB,CAAA;EACL,CAAA;EAEP,kBAAC,GAAD;GACE,MAAM;GACN,cAAc;GACd,OAAO,EAAE,wBAAwB;GACjC,aAAa,EAAE,uBAAuB;GACtC,SAAS,EAAE,mBAAmB;GAC9B,iBACE,KAAK,EAAG,OAAO,CAAC,CAAC,WACT,EAAE,YAAY,IACnB,MAAM,EAAK,CAAC,CACf;EAEH,CAAA;CACD,EAAA,CAAA,CACJ;AACF;AAEA,SAAS,EAAa,GAQnB;CACD,IAAM,EAAE,SAAM,EAAY,GACpB,IAAM,EAAM,GACZ,IAAQ,SAAe,EAAE,aAAa,CAAC,EAAA,CAAG,KAAK,MAAO,OAAO,KAAM,WAAW;EAAE,OAAO;EAAG,OAAO;CAAE,IAAI,CAAE,GAAG,CAAC,EAAE,SAAS,CAAC,GACzH,CAAC,GAAU,KAAe,EAAS,EAAE,GACrC,CAAC,GAAU,KAAe,EAAS,EAAE,mBAAmB,EAAM,EAAE,EAAE,SAAS,IAAI,GAC/E,CAAC,GAAM,KAAW,EAAmB,iBAAiB,GACtD,CAAC,GAAQ,KAAa,QAAe,kBAAW,IAAI,KAAK,CAAC,CAAC,GAC3D,CAAC,GAAU,KAAe,EAAS,EAAE,GACrC,CAAC,GAAO,KAAY,EAAsB,IAAI,GAC9C,CAAC,GAAS,KAAc,QAAwB,CAAC,EAAM,GAAG,EAAM,CAAC,CAAC,GAClE,KAAO,GAAa,MAA0B,GAAY,MAAO,EAAG,KAAK,MAAO,EAAE,QAAQ,IAAM;EAAE,GAAG;EAAG,GAAG;CAAM,IAAI,CAAE,CAAC,GACxH,KAAQ,GAAc,MAC1B,GAAY,MAAO;EACjB,IAAM,IAAO,CAAC,GAAG,CAAE;EAEnB,OADA,EAAK,OAAO,GAAI,GAAG,GAAG,EAAK,OAAO,GAAM,CAAC,CAAC,GACnC;CACT,CAAC,GACG,UAAe;EACnB,IAAI,CAAC,EAAS,KAAK,GAAG,OAAO,EAAE,UAAU,EAAE,6BAA6B,CAAC;EACzE,IAAM,IAAO,EAAQ,QAAQ,MAAM,EAAE,MAAM,KAAK,KAAK,EAAE,KAAK;EAC5D,IAAI,MAAS,mBAAmB;GAC9B,IAAI,EAAK,MAAM,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,2BAA2B,CAAC;GACxF,IAAI,EAAK,SAAS,GAAG,OAAO,EAAE,UAAU,EAAE,uBAAuB,CAAC;EACpE;EACA,IAAM,IAAS,MAAS;EACxB,EAAO,SACL;GACE;GACA,UAAU,EAAS,KAAK;GACxB;GACA,SAAS,EAAM,CAAM;GACrB,WAAW,EAAM,CAAQ;GACzB,SAAS,IAAS,EAAK,KAAK,GAAG,OAAc;IAAE,OAAO,EAAE,MAAM,KAAK;IAAG;GAAS,EAAE,IAAI,KAAA;EACvF,GACA;GAAE,UAAU;GAAO,SAAS,IAAS,EAAK,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC;EAAE,CACrE;CACF;CACA,OACE,kBAAC,QAAD;EACE,WAAU;EACV,WAAW,MAAM;GAEf,AADA,EAAE,eAAe,GACjB,EAAO;EACT;EALF,UAAA;GAOE,kBAAC,GAAD;IAAO,IAAI,GAAG,EAAI;IAAK,OAAO,EAAE,qBAAqB;IACnD,UAAA,kBAAC,GAAD;KAAU,IAAI,GAAG,EAAI;KAAK,MAAM;KAAG,OAAO;KAAU,aAAa,EAAE,gCAAgC;KAAG,WAAW,MAAM,EAAY,EAAE,OAAO,KAAK;IAAI,CAAA;GAChJ,CAAA;GACP,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,kBAAC,GAAD;MAAO,IAAI,GAAG,EAAI;MAAQ,OAAO,EAAE,qBAAqB;MACrD,UAAA,EAAM,SACL,kBAAC,GAAD;OAAQ,OAAO;OAAU,gBAAgB,MAAM,EAAY,OAAO,CAAC,CAAC;OAApE,UAAA,CACE,kBAAC,GAAD;QAAe,IAAI,GAAG,EAAI;QAAQ,WAAU;QAC1C,UAAA,kBAAC,GAAD,EAAA,WAAe,MAAc,EAAM,MAAM,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,EAAe,CAAA;OAC1E,CAAA,GACf,kBAAC,GAAD,EAAA,UACG,EAAM,KAAK,MACV,kBAAC,GAAD;QAA0B,OAAO,EAAE;QAChC,UAAA,EAAE;OACO,GAFK,EAAE,KAEP,CACb,EACY,CAAA,CACT;MAER,CAAA,IAAA,kBAAC,GAAD;OAAO,IAAI,GAAG,EAAI;OAAQ,OAAO;OAAU,WAAW,MAAM,EAAY,EAAE,OAAO,KAAK;MAAI,CAAA;KAEvF,CAAA;KACN,EAAE,YACD,kBAAC,YAAD;MAAU,WAAU;MAApB,UAAA,CACE,kBAAC,UAAD;OAAQ,WAAU;OAA8B,UAAA,EAAE,iBAAiB;MAAU,CAAA,GAC7E,kBAAC,OAAD;OAAK,WAAU;OACX,UAAA,CAAC,mBAAmB,WAAW,CAAC,CAAW,KAAK,MAChD,kBAAC,GAAD;QAAgB,MAAK;QAAS,MAAK;QAAK,SAAS,MAAS,IAAI,YAAY;QAAW,gBAAc,MAAS;QAAG,eAAe,EAAQ,CAAC;QACpI,UAAA,EAAE,MAAM,cAAc,wBAAwB,2BAA2B;OACpE,GAFK,CAEL,CACT;MACE,CAAA,CACG;;KAEZ,kBAAC,GAAD;MAAO,IAAI,GAAG,EAAI;MAAQ,OAAO,EAAE,mBAAmB;MACpD,UAAA,kBAAC,GAAD;OAAO,IAAI,GAAG,EAAI;OAAQ,MAAK;OAAiB,OAAO;OAAQ,WAAW,MAAM,EAAU,EAAE,OAAO,KAAK;MAAI,CAAA;KACvG,CAAA;KACP,kBAAC,GAAD;MAAO,IAAI,GAAG,EAAI;MAAU,OAAO,EAAE,qBAAqB;MACxD,UAAA,kBAAC,GAAD;OAAO,IAAI,GAAG,EAAI;OAAU,MAAK;OAAiB,OAAO;OAAU,KAAK;OAAQ,WAAW,MAAM,EAAY,EAAE,OAAO,KAAK;MAAI,CAAA;KAC1H,CAAA;IACJ;;GACL,kBAAC,GAAD;IAAY,OAAO,EAAE,kBAAkB;IAAG,KAAK,EAAa,CAAK;IAAG,QAAQ;IAAU,gBAAgB,EAAS,IAAI;GAAI,CAAA;GACtH,MAAS,cACR,kBAAC,KAAD;IAAG,WAAU;IAAyB,UAAA,EAAE,yBAAyB;GAAK,CAAA,IAEtE,kBAAC,YAAD;IAAU,WAAU;IAApB,UAAA;KACE,kBAAC,UAAD;MAAQ,WAAU;MAA8B,UAAA,EAAE,oBAAoB;KAAU,CAAA;KAChF,kBAAC,GAAD;MACE,OAAO;MACP,KAAK,MAAM,EAAE;MACb,OAAO,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;MAChF,QAAQ;MACR,OAAO,EAAE,oBAAoB;MAC7B,WAAU;MACV,YAAY;OAAE,WAAW;OAAY,aAAa;MAAc;MAE9D,WAAA,GAAG,GAAQ,MACX,kBAAC,GAAD;OACU;OACR,OAAO;OACP,OAAO,EAAE;OACT,OAAO,EAAE;OACT,UAAU,MAAU,EAAI,EAAE,KAAK,EAAE,SAAM,CAAC;OACxC,UAAU,MAAU,EAAI,EAAE,KAAK,EAAE,SAAM,CAAC;OACxC,UAAU,EAAQ,SAAS,UAAU,GAAY,MAAO,EAAG,QAAQ,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAA;MAC9F,CAAA;KAES,CAAA;KACb,EAAQ,SAAS,EAAE,aAClB,kBAAC,GAAD;MAAQ,MAAK;MAAS,SAAQ;MAAU,MAAK;MAAK,WAAU;MAAqB,eAAe,GAAY,MAAO,CAAC,GAAG,GAAI,EAAM,CAAC,CAAC;MAChI,UAAA,EAAE,sBAAsB;KACnB,CAAA,IAER,kBAAC,KAAD;MAAG,WAAU;MAAiC,UAAA,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,CAAC;KAAK,CAAA;IAE7F;;GAEZ,kBAAC,GAAD;IAAQ,MAAK;IAAS,WAAU;IAAqB,UAAU,EAAE;IAC9D,UAAA,EAAE,SAAS,EAAE,qBAAqB,IAAI,EAAE,mBAAmB;GACtD,CAAA;EACJ;;AAEV;AAEA,SAAS,EAAW,GAQjB;CACD,IAAM,IAAI,EAAY,GAChB,EAAE,SAAM,GACR,IAAM,EAAM,GACZ,EAAE,SAAM,cAAW,GACnB,CAAC,GAAU,KAAe,EAAS,EAAK,QAAQ,GAChD,CAAC,GAAQ,KAAa,EAAS,EAAW,IAAI,KAAK,EAAK,OAAO,CAAC,CAAC,GACjE,CAAC,GAAU,KAAe,EAAS,EAAK,YAAY,EAAW,IAAI,KAAK,EAAK,SAAS,CAAC,IAAI,EAAE,GAC7F,CAAC,GAAQ,KAAa,EAAS,EAAK,SAAS,GAC7C,CAAC,GAAO,KAAY,EAAS,EAAE,GAC/B,CAAC,GAAU,KAAe,EAA4B,IAAI,GAC1D,IAAU,CAAC,GAAG,EAAK,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,GAClE,IAAoB,CAAC;CAK3B,AAJI,EAAS,KAAK,MAAM,EAAK,aAAU,EAAM,WAAW,EAAS,KAAK,IAClE,EAAM,CAAM,MAAM,IAAI,KAAK,EAAW,IAAI,KAAK,EAAK,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,MAAG,EAAM,UAAU,EAAM,CAAM,IAC1G,KAAY,EAAM,CAAQ,OAAO,EAAK,aAAa,IAAI,KAAK,EAAW,IAAI,KAAK,EAAK,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,KAAI,EAAM,YAAY,EAAM,CAAQ,IAC7I,CAAC,KAAY,EAAK,cAAW,EAAM,YAAY,OACpD,MAAW,EAAK,cAAW,EAAM,YAAY;CACjD,IAAM,IAAQ,OAAO,KAAK,CAAK,CAAC,CAAC,SAAS,GACpC,KAAO,MAA+B,KAAK,EAAG,CAAC,CAAC,MAAM,EAAE,OAAO;CACrE,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAAC,QAAD;IACE,WAAU;IACV,WAAW,MAAM;KAEf,IADA,EAAE,eAAe,GACb,CAAC,EAAS,KAAK,GAAG,OAAO,EAAE,UAAU,EAAE,6BAA6B,CAAC;KACzE,AAAI,KAAO,EAAI,YAAY,EAAE,QAAQ,MAAM,EAAO,OAAO,CAAK,CAAC,CAAC;IAClE;IANF,UAAA;KAQE,kBAAC,GAAD;MAAO,IAAI,GAAG,EAAI;MAAK,OAAO,EAAE,qBAAqB;MACnD,UAAA,kBAAC,GAAD;OAAU,IAAI,GAAG,EAAI;OAAK,MAAM;OAAG,OAAO;OAAU,WAAW,MAAM,EAAY,EAAE,OAAO,KAAK;MAAI,CAAA;KAC9F,CAAA;KACP,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAAC,GAAD;OAAO,IAAI,GAAG,EAAI;OAAQ,OAAO,EAAE,mBAAmB;OACpD,UAAA,kBAAC,GAAD;QAAO,IAAI,GAAG,EAAI;QAAQ,MAAK;QAAiB,OAAO;QAAQ,WAAW,MAAM,EAAU,EAAE,OAAO,KAAK;OAAI,CAAA;MACvG,CAAA,GACP,kBAAC,GAAD;OAAO,IAAI,GAAG,EAAI;OAAU,OAAO,EAAE,qBAAqB;OACxD,UAAA,kBAAC,GAAD;QAAO,IAAI,GAAG,EAAI;QAAU,MAAK;QAAiB,OAAO;QAAU,KAAK;QAAQ,WAAW,MAAM,EAAY,EAAE,OAAO,KAAK;OAAI,CAAA;MAC1H,CAAA,CACJ;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAAC,GAAD;OAAQ,IAAI,GAAG,EAAI;OAAU,SAAS;OAAQ,iBAAiB;MAAY,CAAA,GAC3E,kBAAC,GAAD;OAAO,SAAS,GAAG,EAAI;OAAW,UAAA,EAAE,IAAS,sBAAsB,qBAAqB;MAAS,CAAA,CAC9F;;KACL,kBAAC,GAAD;MAAQ,MAAK;MAAS,WAAU;MAAqB,UAAU,CAAC,KAAS,EAAE;MACxE,UAAA,EAAE,SAAS,EAAE,eAAe,IAAI,EAAE,aAAa;KAC1C,CAAA;IACJ;;GACN,kBAAC,GAAD;IAAY,OAAO,EAAE,kBAAkB;IAAG,KAAK,EAAK;IAAW,UAAU,EAAE;IAAQ,SAAS,MAAM,QAAU,EAAO,SAAS,CAAC,CAAC;IAAG,gBAAgB,QAAU,EAAO,SAAS,IAAI,CAAC;GAAI,CAAA;GACnL,EAAK,SAAS,cACb,kBAAC,KAAD;IAAG,WAAU;IAAb,UAAA;KACG,EAAE,yBAAyB;KAAE;KAAE,EAAE,OAAO,gBAAgB,EAAK,gBAAgB,CAAC;IAC9E;GAEH,CAAA,IAAA,kBAAC,YAAD;IAAU,WAAU;IAApB,UAAA;KACE,kBAAC,UAAD;MAAQ,WAAU;MAA8B,UAAA,EAAE,oBAAoB;KAAU,CAAA;KAChF,kBAAC,GAAD;MACE,OAAO;MACP,KAAK,MAAM,EAAE;MACb,OAAO,MAAM,EAAE;MACf,UAAU,EAAE;MACZ,SAAS,GAAM,MAAO,QAAU,EAAO,WAAW,EAAQ,EAAK,CAAE,IAAI,CAAE,CAAC;MACxE,OAAO,EAAE,oBAAoB;MAC7B,WAAU;MACV,YAAY;OAAE,WAAW;OAAY,aAAa;MAAc;MAE9D,WAAA,GAAG,GAAQ,MACX,kBAAC,GAAD;OACU;OACR,OAAO;OACP,OAAO,EAAE;OACT,KAAK,EAAE;OACP,OAAO,EAAE;OACT,UAAU,EAAE;OACZ,WAAW,MAAU,EAAM,KAAK,KAAK,EAAM,KAAK,MAAM,EAAE,SAAS,QAAU,EAAO,aAAa,EAAE,IAAI,EAAM,KAAK,CAAC,CAAC;OAClH,UAAU,MAAM,QAAU,EAAO,eAAe,EAAE,IAAI,CAAC,CAAC;OACxD,UAAU,EAAQ,SAAS,UAAU,EAAY,CAAC,IAAI,KAAA;MACvD,CAAA;KAES,CAAA;KACb,EAAQ,SAAS,EAAE,aAClB,kBAAC,QAAD;MACE,WAAU;MACV,WAAW,MAAM;OACf,EAAE,eAAe,GACZ,EAAM,KAAK,KAChB,EAAI,YAAY;QAEd,AADA,MAAM,EAAO,UAAU,EAAM,KAAK,CAAC,GACnC,EAAS,EAAE;OACb,CAAC;MACH;MATF,UAAA,CAWE,kBAAC,GAAD;OAAO,OAAO;OAAO,aAAa,EAAE,sBAAsB;OAAG,cAAY,EAAE,sBAAsB;OAAG,WAAW,MAAM,EAAS,EAAE,OAAO,KAAK;MAAI,CAAA,GAChJ,kBAAC,GAAD;OAAQ,MAAK;OAAS,SAAQ;OAAU,UAAU,CAAC,EAAM,KAAK,KAAK,EAAE;OAClE,UAAA,EAAE,sBAAsB;MACnB,CAAA,CACJ;KAEN,CAAA,IAAA,kBAAC,KAAD;MAAG,WAAU;MAAiC,UAAA,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,CAAC;KAAK,CAAA;IAE7F;;GAEZ,kBAAC,GAAD;IACE,MAAM,CAAC,CAAC;IACR,eAAe,MAAM,CAAC,KAAK,EAAY,IAAI;IAC3C,OAAO,EAAE,8BAA8B;IACvC,aAAa,EAAE,6BAA6B;IAC5C,SAAS,EAAE,yBAAyB;IACpC,iBAAiB,KAAY,QAAU,EAAO,aAAa,EAAS,EAAE,CAAC;GACxE,CAAA;EACE;;AAET;AAEA,IAAM,IAAa;AAGnB,SAAS,EAAU,GAgBhB;CACD,IAAM,IAAI,EAAY,GAChB,EAAE,SAAM,GACR,CAAC,GAAO,KAAY,EAAS,EAAE,KAAK;CAC1C,QAAgB,EAAS,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC;CAC5C,IAAM,IAAS,EAAa,EAAE,SAAS,IAAI,GACrC,IAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;CAC1D,OACE,kBAAA,GAAA,EAAA,UAAA;EACG,EAAE;EACH,kBAAC,GAAD;GACE,WAAU;GACV,OAAO;GACP,cAAY;GACZ,aAAa;GACb,UAAU,EAAE,YAAY,CAAC,EAAE;GAC3B,WAAW,MAAM;IAEf,AADA,EAAS,EAAE,OAAO,KAAK,GACvB,EAAE,UAAU,EAAE,OAAO,KAAK;GAC5B;GACA,cAAc,EAAE,WAAW,CAAK;GAChC,YAAY,MAAM;IAChB,AAAI,EAAE,QAAQ,WAAW,EAAE,aACzB,EAAE,eAAe,GACjB,EAAE,SAAS,CAAK;GAEpB;EACD,CAAA;EACD,kBAAC,GAAD;GAAY,SAAA;GAAQ,OAAO,EAAE,0BAA0B,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;GAAG,KAAK,EAAE,OAAO;GAAQ,UAAU,EAAE;GAAU,QAAQ,EAAE;GAAS,gBAAgB,EAAE,QAAQ,IAAI;EAAI,CAAA;EAChL,EAAE,UAAU,KAAA,KAAa,kBAAC,QAAD;GAAM,WAAU;GAA8C,UAAA,EAAE,OAAO,cAAc,EAAE,KAAK;EAAQ,CAAA;EAC7H,EAAE,YACD,kBAAC,GAAD;GAAQ,MAAK;GAAS,SAAQ;GAAQ,MAAK;GAAU,cAAY,GAAG,EAAE,yBAAyB,EAAE,IAAI;GAAQ,UAAU,EAAE;GAAU,SAAS,EAAE;GAC5I,UAAA,kBAAC,GAAD;IAAe,MAAM;IAAc,aAAa;GAAI,CAAA;EAC9C,CAAA;CAEV,EAAA,CAAA;AAEN;AAEA,SAAS,EAAW,GAAsI;CACxJ,IAAM,EAAE,SAAM,EAAY,GACpB,IAAQ,EAAyB,IAAI,GACrC,IACJ,kBAAC,SAAD;EACE,KAAK;EACL,MAAK;EACL,QAAO;EACP,QAAA;EACA,cAAY,EAAE;EACd,WAAW,MAAM;GACf,IAAM,IAAI,EAAE,OAAO,QAAQ;GAE3B,AADA,EAAE,OAAO,QAAQ,IACb,KAAG,EAAE,OAAO,CAAC;EACnB;CACD,CAAA;CAyBH,OAvBI,EAAE,UAEF,kBAAC,OAAD;EAAK,WAAU;EAA0B,aAAU;EAAnD,UAAA;GACG;GACD,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,WAAU;IACV,cAAY,GAAG,EAAE,MAAM,EAAE,yBAAyB,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE;IACxF,UAAU,EAAE;IACZ,eAAe,EAAM,SAAS,MAAM;IAEnC,UAAA,EAAE,MAAM,kBAAC,OAAD;KAAK,KAAK,EAAE;KAAK,KAAI;KAAG,WAAU;IAA0B,CAAA,IAAI,kBAAC,GAAD;KAAe,MAAM;KAAgB,aAAa;IAAI,CAAA;GACzH,CAAA;GACP,EAAE,OACD,kBAAC,GAAD;IAAQ,MAAK;IAAS,SAAQ;IAAQ,MAAK;IAAK,UAAU,EAAE;IAAU,SAAS,EAAE;IAC9E,UAAA,EAAE,wBAAwB;GACrB,CAAA;EAEP;MAIP,kBAAC,OAAD;EAAK,WAAU;EAAe,aAAU;EAAxC,UAAA;GACE,kBAAC,QAAD;IAAM,WAAU;IAAuB,UAAA,EAAE;GAAY,CAAA;GACpD;GACA,EAAE,OAAO,kBAAC,OAAD;IAAK,KAAK,EAAE;IAAK,KAAI;IAAG,WAAU;GAA6E,CAAA;GACzH,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAU,MAAK;KAAK,UAAU,EAAE;KAAU,eAAe,EAAM,SAAS,MAAM;KAA5G,UAAA,CACE,kBAAC,GAAD;MAAe,MAAM;MAAgB,aAAa;MAAG,aAAU;KAAgB,CAAA,GAC9E,EAAE,MAAM,EAAE,yBAAyB,IAAI,EAAE,wBAAwB,CAC5D;IACP,CAAA,GAAA,EAAE,OACD,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,UAAU,EAAE;KAAU,SAAS,EAAE;KAC9E,UAAA,EAAE,wBAAwB;IACrB,CAAA,CAEP;;EACF;;AAET;AAEA,SAAS,EAAM,EAAE,OAAI,UAAO,eAAgE;CAC1F,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,kBAAC,GAAD;GAAO,SAAS;GAAK,UAAA;EAAa,CAAA,GACjC,CACE;;AAET;AAGA,SAAS,EAAa,GAAuC;CAC3D,IAAM,CAAC,GAAK,KAAU,EAAiB;CAOvC,OANA,QAAgB;EACd,IAAI,CAAC,GAAM,OAAO,EAAO,KAAA,CAAS;EAClC,IAAM,IAAI,IAAI,gBAAgB,CAAI;EAElC,OADA,EAAO,CAAC,SACK,IAAI,gBAAgB,CAAC;CACpC,GAAG,CAAC,CAAI,CAAC,GACF;AACT"}
|