@oneplatformdev/ui 0.1.99-beta.279 → 0.1.99-beta.281

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DropzoneSinglePickPreview.d.ts","sourceRoot":"","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,OAAO,wCAAwC,CAAC;AAChD,OAAO,iDAAiD,CAAC;AACzD,OAAO,yDAAyD,CAAC;AACjE,OAAO,iCAAiC,CAAC;AAGzC,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,GAAG,IAAI,GAAG,IAAI,KAAG,MAYpE,CAAC;AAqCF,UAAU,sBAAsB;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC1D,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,yBAAyB,GAAI,kEAMvC,sBAAsB,4CAqLxB,CAAC"}
1
+ {"version":3,"file":"DropzoneSinglePickPreview.d.ts","sourceRoot":"","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,OAAO,wCAAwC,CAAC;AAChD,OAAO,iDAAiD,CAAC;AACzD,OAAO,yDAAyD,CAAC;AACjE,OAAO,iCAAiC,CAAC;AAgBzC,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,GAAG,IAAI,GAAG,IAAI,KAAG,MAYpE,CAAC;AAqCF,UAAU,sBAAsB;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC1D,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,yBAAyB,GAAI,kEAMvC,sBAAsB,4CAsLxB,CAAC"}
@@ -1,16 +1,27 @@
1
- import { jsxs as a, jsx as o } from "react/jsx-runtime";
2
- import { useState as x, useMemo as i, useRef as F, useEffect as I } from "react";
3
- import { isVideoUrl as C, isFile as R } from "./DropzoneUtils.js";
4
- import { X as U, FileIcon as M, Video as V, PencilIcon as B, Trash2 as D } from "lucide-react";
5
- import { MediaPlayer as O, MediaProvider as T, Poster as W } from "@vidstack/react";
6
- import { DefaultVideoLayout as Y, defaultLayoutIcons as $ } from "@vidstack/react/player/layouts/default";
1
+ import { jsxs as i, jsx as o } from "react/jsx-runtime";
2
+ import { useState as v, useMemo as a, useRef as k, useEffect as E } from "react";
3
+ import { isVideoUrl as R, isFile as C } from "./DropzoneUtils.js";
4
+ import { X as U, FileIcon as M, Video as B, PencilIcon as V, Trash2 as Y } from "lucide-react";
5
+ import { MediaPlayer as T, MediaProvider as O, Poster as D } from "@vidstack/react";
6
+ import { DefaultVideoLayout as W, defaultLayoutIcons as $ } from "@vidstack/react/player/layouts/default";
7
7
  import { Button as q } from "../Button/Button.js";
8
8
  import "@vidstack/react/player/styles/base.css";
9
9
  import "@vidstack/react/player/styles/default/theme.css";
10
10
  import "@vidstack/react/player/styles/default/layouts/video.css";
11
11
  /* empty css */
12
12
  import { ButtonIcon as A } from "../ButtonIcon/ButtonIcon.js";
13
- const J = (e) => {
13
+ const _ = `
14
+ .dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,
15
+ .dropzone-youtube-player[data-fullscreen="false"] .vds-play-button,
16
+ .dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,
17
+ .dropzone-youtube-player[data-fullscreen="false"] .vds-buffering-indicator,
18
+ .dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,
19
+ .dropzone-youtube-player[data-fullscreen="false"] .vds-loading-indicator,
20
+ .dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,
21
+ .dropzone-youtube-player[data-fullscreen="false"] .vds-spinner {
22
+ display: none !important;
23
+ }
24
+ `, J = (e) => {
14
25
  if (!e) return "";
15
26
  switch (!0) {
16
27
  case (typeof e == "string" && !!e.trim() && e !== "null"):
@@ -25,8 +36,8 @@ const J = (e) => {
25
36
  }, X = (e) => {
26
37
  if (!e) return !1;
27
38
  try {
28
- const c = new URL(e).hostname.toLowerCase();
29
- return c.includes("youtube.com") || c.includes("youtu.be");
39
+ const u = new URL(e).hostname.toLowerCase();
40
+ return u.includes("youtube.com") || u.includes("youtu.be");
30
41
  } catch {
31
42
  return !1;
32
43
  }
@@ -35,118 +46,119 @@ const J = (e) => {
35
46
  const s = new URL(e);
36
47
  if (s.hostname.toLowerCase().includes("youtu.be"))
37
48
  return s.pathname.replace("/", "").trim();
38
- const h = s.searchParams.get("v");
39
- if (h) return h.trim();
40
- const f = s.pathname.split("/").filter(Boolean), l = f.findIndex((m) => m === "embed");
49
+ const p = s.searchParams.get("v");
50
+ if (p) return p.trim();
51
+ const f = s.pathname.split("/").filter(Boolean), l = f.findIndex((h) => h === "embed");
41
52
  return l >= 0 && f[l + 1] ? f[l + 1].trim() : "";
42
53
  } catch {
43
54
  return "";
44
55
  }
45
- }, ie = ({
56
+ }, ue = ({
46
57
  item: e,
47
58
  disabled: s,
48
- onRemoveClick: c,
49
- onReplaceClick: h,
59
+ onRemoveClick: u,
60
+ onReplaceClick: p,
50
61
  labelReplace: f = "Замінити"
51
62
  }) => {
52
- const [l, m] = x(""), n = R(e), g = n ? e.name : e, t = i(
63
+ const [l, h] = v(""), n = C(e), y = n ? e.name : e, t = a(
53
64
  () => typeof e == "string" && X(e),
54
65
  [e]
55
- ), p = i(
56
- () => typeof e == "string" && !t && C(e),
66
+ ), m = a(
67
+ () => typeof e == "string" && !t && R(e),
57
68
  [e, t]
58
- ), u = i(
69
+ ), c = a(
59
70
  () => t && typeof e == "string" ? G(e) : "",
60
71
  [t, e]
61
- ), w = i(() => !t || typeof e != "string" ? "" : u ? `youtube/${u}` : e, [t, e, u]), y = i(
62
- () => u ? `https://img.youtube.com/vi/${u}/hqdefault.jpg` : void 0,
63
- [u]
64
- ), [j, v] = x(!1), [z, N] = x(!0), P = F(null), k = F(null);
65
- I(() => {
66
- v(!1), N(!0);
67
- }, [w]);
68
- const S = i(() => n && e.type?.includes("image") || typeof e == "string" && !t && !p, [e, n, t, p]), d = i(() => n && e.type?.includes("video") || t || p, [e, n, t, p]), E = i(() => n ? `${(e.size / (1024 * 1024)).toFixed(0)} MB` : "", [e, n]);
69
- return I(() => {
72
+ ), x = a(() => !t || typeof e != "string" ? "" : c ? `youtube/${c}` : e, [t, e, c]), b = a(
73
+ () => c ? `https://img.youtube.com/vi/${c}/hqdefault.jpg` : void 0,
74
+ [c]
75
+ ), [F, w] = v(!1), [I, N] = v(!0), z = k(null), P = k(null);
76
+ E(() => {
77
+ w(!1), N(!0);
78
+ }, [x]);
79
+ const S = a(() => n && e.type?.includes("image") || typeof e == "string" && !t && !m, [e, n, t, m]), d = a(() => n && e.type?.includes("video") || t || m, [e, n, t, m]), j = a(() => n ? `${(e.size / (1024 * 1024)).toFixed(0)} MB` : "", [e, n]);
80
+ return E(() => {
70
81
  if (S || d) {
71
82
  const r = J(e);
72
- if (m(r), n && r)
83
+ if (h(r), n && r)
73
84
  return () => URL.revokeObjectURL(r);
74
85
  } else
75
- m("");
76
- }, [e, n, S, d]), /* @__PURE__ */ a("div", { className: "relative w-full overflow-hidden", children: [
77
- d && l ? /* @__PURE__ */ o("div", { className: "w-full rounded-lg overflow-hidden bg-black", onClick: (r) => r.stopPropagation(), children: /* @__PURE__ */ o("div", { className: "aspect-video", children: /* @__PURE__ */ a(
78
- O,
86
+ h("");
87
+ }, [e, n, S, d]), /* @__PURE__ */ i("div", { className: "relative w-full overflow-hidden", children: [
88
+ t && /* @__PURE__ */ o("style", { children: _ }),
89
+ d && l ? /* @__PURE__ */ o("div", { className: "w-full rounded-lg overflow-hidden bg-black", onClick: (r) => r.stopPropagation(), children: /* @__PURE__ */ o("div", { className: "aspect-video", children: /* @__PURE__ */ i(
90
+ T,
79
91
  {
80
- ref: P,
92
+ ref: z,
81
93
  title: n ? e.name : t ? void 0 : typeof e == "string" ? e : void 0,
82
- src: t ? w : { src: l, type: n ? e.type : void 0 },
83
- poster: t ? y : void 0,
84
- className: `h-full w-full bg-black text-white ${t && j ? "dropzone-youtube-player" : ""}`,
94
+ src: t ? x : { src: l, type: n ? e.type : void 0 },
95
+ poster: t ? b : void 0,
96
+ className: `h-full w-full bg-black text-white ${t && F ? "dropzone-youtube-player" : ""}`,
85
97
  playsInline: !0,
86
98
  onPlay: () => {
87
- N(!1), t && v(!0);
99
+ N(!1), t && w(!0);
88
100
  },
89
101
  onVolumeChange: (r) => {
90
102
  if (!t) return;
91
- const b = r.volume === 0 || r.muted;
92
- if (k.current === b) return;
93
- k.current = b;
94
- const L = P.current?.el?.querySelector("iframe");
103
+ const g = r.volume === 0 || r.muted;
104
+ if (P.current === g) return;
105
+ P.current = g;
106
+ const L = z.current?.el?.querySelector("iframe");
95
107
  L?.contentWindow && L.contentWindow.postMessage(
96
- JSON.stringify({ event: "command", func: b ? "mute" : "unMute", args: [] }),
108
+ JSON.stringify({ event: "command", func: g ? "mute" : "unMute", args: [] }),
97
109
  "*"
98
110
  );
99
111
  },
100
112
  children: [
101
- /* @__PURE__ */ o(T, {}),
102
- z && t && y && /* @__PURE__ */ o(
103
- W,
113
+ /* @__PURE__ */ o(O, {}),
114
+ I && t && b && /* @__PURE__ */ o(
115
+ D,
104
116
  {
105
117
  className: "absolute inset-0 h-full w-full object-cover",
106
- src: y,
118
+ src: b,
107
119
  alt: typeof e == "string" ? e : ""
108
120
  }
109
121
  ),
110
- /* @__PURE__ */ o(Y, { icons: $ })
122
+ /* @__PURE__ */ o(W, { icons: $ })
111
123
  ]
112
124
  }
113
- ) }) }) : !d && l ? /* @__PURE__ */ a("div", { className: "relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg", children: [
114
- !s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick: c, children: /* @__PURE__ */ o(U, { size: 16, strokeWidth: 2, color: "black" }) }),
125
+ ) }) }) : !d && l ? /* @__PURE__ */ i("div", { className: "relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg", children: [
126
+ !s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick: u, children: /* @__PURE__ */ o(U, { size: 16, strokeWidth: 2, color: "black" }) }),
115
127
  /* @__PURE__ */ o(
116
128
  "img",
117
129
  {
118
130
  src: l,
119
- alt: g?.toString(),
131
+ alt: y?.toString(),
120
132
  className: "w-full h-full object-cover rounded-lg"
121
133
  }
122
134
  )
123
- ] }) : d ? null : /* @__PURE__ */ a("div", { className: "relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg", children: [
124
- !s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick: c, children: /* @__PURE__ */ o(U, { size: 16, strokeWidth: 2, color: "black" }) }),
125
- /* @__PURE__ */ a("div", { className: "w-full h-full flex flex-col items-center justify-center text-gray-600", children: [
135
+ ] }) : d ? null : /* @__PURE__ */ i("div", { className: "relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg", children: [
136
+ !s && /* @__PURE__ */ o("div", { className: "absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm", onClick: u, children: /* @__PURE__ */ o(U, { size: 16, strokeWidth: 2, color: "black" }) }),
137
+ /* @__PURE__ */ i("div", { className: "w-full h-full flex flex-col items-center justify-center text-gray-600", children: [
126
138
  /* @__PURE__ */ o(M, { size: 28 }),
127
- /* @__PURE__ */ o("span", { className: "text-sm mt-2 break-all px-2 text-center", children: g?.toString() })
139
+ /* @__PURE__ */ o("span", { className: "text-sm mt-2 break-all px-2 text-center", children: y?.toString() })
128
140
  ] })
129
141
  ] }),
130
- d && !t && /* @__PURE__ */ a(
142
+ d && !t && /* @__PURE__ */ i(
131
143
  "div",
132
144
  {
133
145
  className: "mt-2 w-full h-auto min-h-14 rounded-[8px] border border-[#E8E9EB] bg-[#FCFCFC] p-2 flex items-center gap-4",
134
146
  onClick: (r) => r.stopPropagation(),
135
147
  children: [
136
- /* @__PURE__ */ o("div", { className: "size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0", children: /* @__PURE__ */ o(V, { className: "size-6 text-[#06080D]" }) }),
137
- /* @__PURE__ */ a("div", { className: "flex flex-col items-start text-left gap-1 min-w-0 flex-1 justify-start", children: [
138
- /* @__PURE__ */ o("span", { className: "w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left", children: g?.toString() }),
139
- /* @__PURE__ */ o("span", { className: "w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left", children: E })
148
+ /* @__PURE__ */ o("div", { className: "size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0", children: /* @__PURE__ */ o(B, { className: "size-6 text-[#06080D]" }) }),
149
+ /* @__PURE__ */ i("div", { className: "flex flex-col items-start text-left gap-1 min-w-0 flex-1 justify-start", children: [
150
+ /* @__PURE__ */ o("span", { className: "w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left", children: y?.toString() }),
151
+ /* @__PURE__ */ o("span", { className: "w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left", children: j })
140
152
  ] }),
141
153
  !s && /* @__PURE__ */ o(
142
154
  q,
143
155
  {
144
156
  type: "button",
145
157
  color: "secondary",
146
- startAdornment: B,
158
+ startAdornment: V,
147
159
  size: "md",
148
160
  onClick: (r) => {
149
- r.stopPropagation(), h?.(r);
161
+ r.stopPropagation(), p?.(r);
150
162
  },
151
163
  children: f
152
164
  }
@@ -154,11 +166,11 @@ const J = (e) => {
154
166
  !s && /* @__PURE__ */ o(
155
167
  A,
156
168
  {
157
- icon: D,
169
+ icon: Y,
158
170
  variant: "outlined",
159
171
  size: "md",
160
172
  color: "secondary",
161
- onClick: c
173
+ onClick: u
162
174
  }
163
175
  )
164
176
  ]
@@ -167,7 +179,7 @@ const J = (e) => {
167
179
  ] });
168
180
  };
169
181
  export {
170
- ie as DropzoneSinglePickPreview,
182
+ ue as DropzoneSinglePickPreview,
171
183
  J as transformImageToSrc
172
184
  };
173
185
  //# sourceMappingURL=DropzoneSinglePickPreview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropzoneSinglePickPreview.js","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DropzoneValueItem } from './Dropzone.types';\r\nimport { isFile, isVideoUrl } from './DropzoneUtils';\r\nimport { FileIcon, PencilIcon, Trash2, Video, X } from 'lucide-react';\r\nimport { MediaPlayer, type MediaPlayerInstance, MediaProvider, Poster } from '@vidstack/react';\r\nimport { defaultLayoutIcons, DefaultVideoLayout } from '@vidstack/react/player/layouts/default';\r\nimport { Button } from '../Button/Button';\r\n\r\nimport '@vidstack/react/player/styles/base.css';\r\nimport '@vidstack/react/player/styles/default/theme.css';\r\nimport '@vidstack/react/player/styles/default/layouts/video.css';\r\nimport './DropzoneSinglePickPreview.css';\r\nimport { ButtonIcon } from \"../ButtonIcon\";\r\n\r\nexport const transformImageToSrc = (preview?: string | File | null): string => {\r\n if (!preview) return '';\r\n switch (true) {\r\n case typeof preview === 'string' && !!preview.trim() && preview !== 'null':\r\n return preview;\r\n case preview instanceof File:\r\n return URL.createObjectURL(preview);\r\n case preview instanceof FileList:\r\n return preview[0] ? URL.createObjectURL(preview[0]) : '';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst isYoutubeUrl = (value?: string | null) => {\r\n if (!value) return false;\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n return hostname.includes('youtube.com') || hostname.includes('youtu.be');\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nconst extractYoutubeId = (value: string) => {\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n\r\n if (hostname.includes('youtu.be')) {\r\n return url.pathname.replace('/', '').trim();\r\n }\r\n\r\n const searchId = url.searchParams.get('v');\r\n if (searchId) return searchId.trim();\r\n\r\n const pathParts = url.pathname.split('/').filter(Boolean);\r\n const embedIndex = pathParts.findIndex((part) => part === 'embed');\r\n if (embedIndex >= 0 && pathParts[embedIndex + 1]) {\r\n return pathParts[embedIndex + 1].trim();\r\n }\r\n\r\n return '';\r\n } catch {\r\n return '';\r\n }\r\n};\r\n\r\ninterface SinglePickPreviewProps {\r\n item: DropzoneValueItem;\r\n disabled?: boolean;\r\n onRemoveClick: (e: React.MouseEvent<HTMLElement>) => void;\r\n onReplaceClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\r\n labelUploaded?: string;\r\n labelReplace?: string;\r\n}\r\n\r\nexport const DropzoneSinglePickPreview = ({\r\n item,\r\n disabled,\r\n onRemoveClick,\r\n onReplaceClick,\r\n labelReplace = 'Замінити',\r\n}: SinglePickPreviewProps) => {\r\n const [previewUrl, setPreviewUrl] = useState('');\r\n const isFileType = isFile(item);\r\n const fileName = isFileType ? item.name : item;\r\n\r\n const isYoutubeVideo = useMemo(\r\n () => typeof item === 'string' && isYoutubeUrl(item),\r\n [item]\r\n );\r\n const isRemoteVideo = useMemo(\r\n () => typeof item === 'string' && !isYoutubeVideo && isVideoUrl(item),\r\n [item, isYoutubeVideo]\r\n );\r\n const youtubeId = useMemo(\r\n () => (isYoutubeVideo && typeof item === 'string' ? extractYoutubeId(item) : ''),\r\n [isYoutubeVideo, item]\r\n );\r\n const youtubeSource = useMemo(() => {\r\n if (!isYoutubeVideo || typeof item !== 'string') return '';\r\n return youtubeId ? `youtube/${youtubeId}` : item;\r\n }, [isYoutubeVideo, item, youtubeId]);\r\n const youtubeThumbnail = useMemo(\r\n () => (youtubeId ? `https://img.youtube.com/vi/${youtubeId}/hqdefault.jpg` : undefined),\r\n [youtubeId]\r\n );\r\n const [youtubeStarted, setYoutubeStarted] = useState(false);\r\n const [showPoster, setShowPoster] = useState(true);\r\n const mediaPlayerRef = useRef<MediaPlayerInstance>(null);\r\n const lastMuteStateRef = useRef<boolean | null>(null);\r\n\r\n useEffect(() => {\r\n setYoutubeStarted(false);\r\n setShowPoster(true);\r\n }, [youtubeSource]);\r\n\r\n const showImage = useMemo(() => {\r\n return (isFileType && item.type?.includes('image')) || (typeof item === 'string' && !isYoutubeVideo && !isRemoteVideo);\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const showVideo = useMemo(() => {\r\n return (isFileType && item.type?.includes('video')) || isYoutubeVideo || isRemoteVideo;\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const fileSize = useMemo(() => {\r\n if (!isFileType) return '';\r\n return `${(item.size / (1024 * 1024)).toFixed(0)} MB`;\r\n }, [item, isFileType]);\r\n\r\n useEffect(() => {\r\n if (showImage || showVideo) {\r\n const nextPreview = transformImageToSrc(item);\r\n setPreviewUrl(nextPreview);\r\n\r\n if (isFileType && nextPreview) {\r\n return () => URL.revokeObjectURL(nextPreview);\r\n }\r\n } else {\r\n setPreviewUrl('');\r\n }\r\n\r\n return undefined;\r\n }, [item, isFileType, showImage, showVideo]);\r\n\r\n return (\r\n <div className=\"relative w-full overflow-hidden\">\r\n {showVideo && previewUrl ? (\r\n <div className=\"w-full rounded-lg overflow-hidden bg-black\" onClick={(event) => event.stopPropagation()}>\r\n <div className=\"aspect-video\">\r\n <MediaPlayer\r\n ref={mediaPlayerRef}\r\n title={isFileType ? (item as File).name : isYoutubeVideo ? undefined : (typeof item === 'string' ? item : undefined)}\r\n src={isYoutubeVideo ? youtubeSource : { src: previewUrl, type: isFileType ? (item as File).type : undefined }}\r\n poster={isYoutubeVideo ? youtubeThumbnail : undefined}\r\n className={`h-full w-full bg-black text-white ${\r\n isYoutubeVideo && youtubeStarted ? 'dropzone-youtube-player' : ''\r\n }`}\r\n playsInline\r\n onPlay={() => {\r\n setShowPoster(false);\r\n if (isYoutubeVideo) setYoutubeStarted(true);\r\n }}\r\n onVolumeChange={(detail) => {\r\n if (!isYoutubeVideo) return;\r\n const shouldMute = detail.volume === 0 || detail.muted;\r\n if (lastMuteStateRef.current === shouldMute) return;\r\n lastMuteStateRef.current = shouldMute;\r\n const iframe = mediaPlayerRef.current?.el?.querySelector('iframe') as HTMLIFrameElement | null;\r\n if (!iframe?.contentWindow) return;\r\n iframe.contentWindow.postMessage(\r\n JSON.stringify({ event: 'command', func: shouldMute ? 'mute' : 'unMute', args: [] }),\r\n '*'\r\n );\r\n }}\r\n >\r\n <MediaProvider />\r\n {showPoster && isYoutubeVideo && youtubeThumbnail && (\r\n <Poster\r\n className=\"absolute inset-0 h-full w-full object-cover\"\r\n src={youtubeThumbnail}\r\n alt={typeof item === 'string' ? item : ''}\r\n />\r\n )}\r\n <DefaultVideoLayout icons={defaultLayoutIcons} />\r\n </MediaPlayer>\r\n </div>\r\n </div>\r\n ) : !showVideo && previewUrl ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <img\r\n src={previewUrl}\r\n alt={fileName?.toString()}\r\n className=\"w-full h-full object-cover rounded-lg\"\r\n />\r\n </div>\r\n ) : !showVideo ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <div className=\"w-full h-full flex flex-col items-center justify-center text-gray-600\">\r\n <FileIcon size={28} />\r\n <span className=\"text-sm mt-2 break-all px-2 text-center\">\r\n {fileName?.toString()}\r\n </span>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {showVideo && !isYoutubeVideo && (\r\n <div\r\n className=\"mt-2 w-full h-auto min-h-14 rounded-[8px] border border-[#E8E9EB] bg-[#FCFCFC] p-2 flex items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0\">\r\n <Video className=\"size-6 text-[#06080D]\" />\r\n </div>\r\n\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1 justify-start\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left\">\r\n {fileName?.toString()}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left\">\r\n {fileSize}\r\n </span>\r\n </div>\r\n\r\n {!disabled && (\r\n <Button\r\n type=\"button\"\r\n color=\"secondary\"\r\n startAdornment={PencilIcon}\r\n size=\"md\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n onReplaceClick?.(event);\r\n }}\r\n >\r\n {labelReplace}\r\n </Button>\r\n )}\r\n\r\n {!disabled && (\r\n <ButtonIcon\r\n icon={Trash2}\r\n variant=\"outlined\"\r\n size=\"md\"\r\n color=\"secondary\"\r\n onClick={onRemoveClick}\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["transformImageToSrc","preview","isYoutubeUrl","value","hostname","extractYoutubeId","url","searchId","pathParts","embedIndex","part","DropzoneSinglePickPreview","item","disabled","onRemoveClick","onReplaceClick","labelReplace","previewUrl","setPreviewUrl","useState","isFileType","isFile","fileName","isYoutubeVideo","useMemo","isRemoteVideo","isVideoUrl","youtubeId","youtubeSource","youtubeThumbnail","youtubeStarted","setYoutubeStarted","showPoster","setShowPoster","mediaPlayerRef","useRef","lastMuteStateRef","useEffect","showImage","showVideo","fileSize","nextPreview","jsxs","jsx","event","MediaPlayer","detail","shouldMute","iframe","MediaProvider","Poster","DefaultVideoLayout","defaultLayoutIcons","X","FileIcon","Video","Button","PencilIcon","ButtonIcon","Trash2"],"mappings":"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"}
1
+ {"version":3,"file":"DropzoneSinglePickPreview.js","sources":["../../src/Dropzone/DropzoneSinglePickPreview.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DropzoneValueItem } from './Dropzone.types';\r\nimport { isFile, isVideoUrl } from './DropzoneUtils';\r\nimport { FileIcon, PencilIcon, Trash2, Video, X } from 'lucide-react';\r\nimport { MediaPlayer, type MediaPlayerInstance, MediaProvider, Poster } from '@vidstack/react';\r\nimport { defaultLayoutIcons, DefaultVideoLayout } from '@vidstack/react/player/layouts/default';\r\nimport { Button } from '../Button/Button';\r\n\r\nimport '@vidstack/react/player/styles/base.css';\r\nimport '@vidstack/react/player/styles/default/theme.css';\r\nimport '@vidstack/react/player/styles/default/layouts/video.css';\r\nimport './DropzoneSinglePickPreview.css';\r\nimport { ButtonIcon } from \"../ButtonIcon\";\r\n\r\nconst YOUTUBE_PLAYER_STYLES = `\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-play-button,\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-buffering-indicator,\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-loading-indicator,\r\n.dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,\r\n.dropzone-youtube-player[data-fullscreen=\"false\"] .vds-spinner {\r\n display: none !important;\r\n}\r\n`;\r\n\r\nexport const transformImageToSrc = (preview?: string | File | null): string => {\r\n if (!preview) return '';\r\n switch (true) {\r\n case typeof preview === 'string' && !!preview.trim() && preview !== 'null':\r\n return preview;\r\n case preview instanceof File:\r\n return URL.createObjectURL(preview);\r\n case preview instanceof FileList:\r\n return preview[0] ? URL.createObjectURL(preview[0]) : '';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst isYoutubeUrl = (value?: string | null) => {\r\n if (!value) return false;\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n return hostname.includes('youtube.com') || hostname.includes('youtu.be');\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nconst extractYoutubeId = (value: string) => {\r\n try {\r\n const url = new URL(value);\r\n const hostname = url.hostname.toLowerCase();\r\n\r\n if (hostname.includes('youtu.be')) {\r\n return url.pathname.replace('/', '').trim();\r\n }\r\n\r\n const searchId = url.searchParams.get('v');\r\n if (searchId) return searchId.trim();\r\n\r\n const pathParts = url.pathname.split('/').filter(Boolean);\r\n const embedIndex = pathParts.findIndex((part) => part === 'embed');\r\n if (embedIndex >= 0 && pathParts[embedIndex + 1]) {\r\n return pathParts[embedIndex + 1].trim();\r\n }\r\n\r\n return '';\r\n } catch {\r\n return '';\r\n }\r\n};\r\n\r\ninterface SinglePickPreviewProps {\r\n item: DropzoneValueItem;\r\n disabled?: boolean;\r\n onRemoveClick: (e: React.MouseEvent<HTMLElement>) => void;\r\n onReplaceClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\r\n labelUploaded?: string;\r\n labelReplace?: string;\r\n}\r\n\r\nexport const DropzoneSinglePickPreview = ({\r\n item,\r\n disabled,\r\n onRemoveClick,\r\n onReplaceClick,\r\n labelReplace = 'Замінити',\r\n}: SinglePickPreviewProps) => {\r\n const [previewUrl, setPreviewUrl] = useState('');\r\n const isFileType = isFile(item);\r\n const fileName = isFileType ? item.name : item;\r\n\r\n const isYoutubeVideo = useMemo(\r\n () => typeof item === 'string' && isYoutubeUrl(item),\r\n [item]\r\n );\r\n const isRemoteVideo = useMemo(\r\n () => typeof item === 'string' && !isYoutubeVideo && isVideoUrl(item),\r\n [item, isYoutubeVideo]\r\n );\r\n const youtubeId = useMemo(\r\n () => (isYoutubeVideo && typeof item === 'string' ? extractYoutubeId(item) : ''),\r\n [isYoutubeVideo, item]\r\n );\r\n const youtubeSource = useMemo(() => {\r\n if (!isYoutubeVideo || typeof item !== 'string') return '';\r\n return youtubeId ? `youtube/${youtubeId}` : item;\r\n }, [isYoutubeVideo, item, youtubeId]);\r\n const youtubeThumbnail = useMemo(\r\n () => (youtubeId ? `https://img.youtube.com/vi/${youtubeId}/hqdefault.jpg` : undefined),\r\n [youtubeId]\r\n );\r\n const [youtubeStarted, setYoutubeStarted] = useState(false);\r\n const [showPoster, setShowPoster] = useState(true);\r\n const mediaPlayerRef = useRef<MediaPlayerInstance>(null);\r\n const lastMuteStateRef = useRef<boolean | null>(null);\r\n\r\n useEffect(() => {\r\n setYoutubeStarted(false);\r\n setShowPoster(true);\r\n }, [youtubeSource]);\r\n\r\n const showImage = useMemo(() => {\r\n return (isFileType && item.type?.includes('image')) || (typeof item === 'string' && !isYoutubeVideo && !isRemoteVideo);\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const showVideo = useMemo(() => {\r\n return (isFileType && item.type?.includes('video')) || isYoutubeVideo || isRemoteVideo;\r\n }, [item, isFileType, isYoutubeVideo, isRemoteVideo]);\r\n\r\n const fileSize = useMemo(() => {\r\n if (!isFileType) return '';\r\n return `${(item.size / (1024 * 1024)).toFixed(0)} MB`;\r\n }, [item, isFileType]);\r\n\r\n useEffect(() => {\r\n if (showImage || showVideo) {\r\n const nextPreview = transformImageToSrc(item);\r\n setPreviewUrl(nextPreview);\r\n\r\n if (isFileType && nextPreview) {\r\n return () => URL.revokeObjectURL(nextPreview);\r\n }\r\n } else {\r\n setPreviewUrl('');\r\n }\r\n\r\n return undefined;\r\n }, [item, isFileType, showImage, showVideo]);\r\n\r\n return (\r\n <div className=\"relative w-full overflow-hidden\">\r\n {isYoutubeVideo && <style>{YOUTUBE_PLAYER_STYLES}</style>}\r\n {showVideo && previewUrl ? (\r\n <div className=\"w-full rounded-lg overflow-hidden bg-black\" onClick={(event) => event.stopPropagation()}>\r\n <div className=\"aspect-video\">\r\n <MediaPlayer\r\n ref={mediaPlayerRef}\r\n title={isFileType ? (item as File).name : isYoutubeVideo ? undefined : (typeof item === 'string' ? item : undefined)}\r\n src={isYoutubeVideo ? youtubeSource : { src: previewUrl, type: isFileType ? (item as File).type : undefined }}\r\n poster={isYoutubeVideo ? youtubeThumbnail : undefined}\r\n className={`h-full w-full bg-black text-white ${\r\n isYoutubeVideo && youtubeStarted ? 'dropzone-youtube-player' : ''\r\n }`}\r\n playsInline\r\n onPlay={() => {\r\n setShowPoster(false);\r\n if (isYoutubeVideo) setYoutubeStarted(true);\r\n }}\r\n onVolumeChange={(detail) => {\r\n if (!isYoutubeVideo) return;\r\n const shouldMute = detail.volume === 0 || detail.muted;\r\n if (lastMuteStateRef.current === shouldMute) return;\r\n lastMuteStateRef.current = shouldMute;\r\n const iframe = mediaPlayerRef.current?.el?.querySelector('iframe') as HTMLIFrameElement | null;\r\n if (!iframe?.contentWindow) return;\r\n iframe.contentWindow.postMessage(\r\n JSON.stringify({ event: 'command', func: shouldMute ? 'mute' : 'unMute', args: [] }),\r\n '*'\r\n );\r\n }}\r\n >\r\n <MediaProvider />\r\n {showPoster && isYoutubeVideo && youtubeThumbnail && (\r\n <Poster\r\n className=\"absolute inset-0 h-full w-full object-cover\"\r\n src={youtubeThumbnail}\r\n alt={typeof item === 'string' ? item : ''}\r\n />\r\n )}\r\n <DefaultVideoLayout icons={defaultLayoutIcons} />\r\n </MediaPlayer>\r\n </div>\r\n </div>\r\n ) : !showVideo && previewUrl ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <img\r\n src={previewUrl}\r\n alt={fileName?.toString()}\r\n className=\"w-full h-full object-cover rounded-lg\"\r\n />\r\n </div>\r\n ) : !showVideo ? (\r\n <div className=\"relative w-full h-64 sm:h-80 md:h-96 overflow-hidden outline-[#E4E4E7] outline-2 outline-dashed -outline-offset-1 rounded-lg\">\r\n {!disabled && (\r\n <div className=\"absolute top-2 right-2 cursor-pointer bg-white/70 rounded-[4px] p-1 shadow-sm\" onClick={onRemoveClick} >\r\n <X size={16} strokeWidth={2} color=\"black\" />\r\n </div>\r\n )}\r\n <div className=\"w-full h-full flex flex-col items-center justify-center text-gray-600\">\r\n <FileIcon size={28} />\r\n <span className=\"text-sm mt-2 break-all px-2 text-center\">\r\n {fileName?.toString()}\r\n </span>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {showVideo && !isYoutubeVideo && (\r\n <div\r\n className=\"mt-2 w-full h-auto min-h-14 rounded-[8px] border border-[#E8E9EB] bg-[#FCFCFC] p-2 flex items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"size-10 rounded-[8px] bg-[#9368FF1F] flex items-center justify-center shrink-0\">\r\n <Video className=\"size-6 text-[#06080D]\" />\r\n </div>\r\n\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1 justify-start\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate text-left\">\r\n {fileName?.toString()}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#363B4E] text-left\">\r\n {fileSize}\r\n </span>\r\n </div>\r\n\r\n {!disabled && (\r\n <Button\r\n type=\"button\"\r\n color=\"secondary\"\r\n startAdornment={PencilIcon}\r\n size=\"md\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n onReplaceClick?.(event);\r\n }}\r\n >\r\n {labelReplace}\r\n </Button>\r\n )}\r\n\r\n {!disabled && (\r\n <ButtonIcon\r\n icon={Trash2}\r\n variant=\"outlined\"\r\n size=\"md\"\r\n color=\"secondary\"\r\n onClick={onRemoveClick}\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["YOUTUBE_PLAYER_STYLES","transformImageToSrc","preview","isYoutubeUrl","value","hostname","extractYoutubeId","url","searchId","pathParts","embedIndex","part","DropzoneSinglePickPreview","item","disabled","onRemoveClick","onReplaceClick","labelReplace","previewUrl","setPreviewUrl","useState","isFileType","isFile","fileName","isYoutubeVideo","useMemo","isRemoteVideo","isVideoUrl","youtubeId","youtubeSource","youtubeThumbnail","youtubeStarted","setYoutubeStarted","showPoster","setShowPoster","mediaPlayerRef","useRef","lastMuteStateRef","useEffect","showImage","showVideo","fileSize","nextPreview","jsxs","jsx","event","MediaPlayer","detail","shouldMute","iframe","MediaProvider","Poster","DefaultVideoLayout","defaultLayoutIcons","X","FileIcon","Video","Button","PencilIcon","ButtonIcon","Trash2"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneplatformdev/ui",
3
- "version": "0.1.99-beta.279",
3
+ "version": "0.1.99-beta.281",
4
4
  "description": "UI component library for OnePlatform",
5
5
  "author": "One Platform Development Team",
6
6
  "keywords": [
@@ -109,9 +109,9 @@
109
109
  "recharts": "^3.2.0",
110
110
  "sonner": "^2.0.7",
111
111
  "vaul": "^1.1.2",
112
- "@oneplatformdev/hooks": "^0.1.99-beta.279",
113
- "@oneplatformdev/tokens": "^0.1.99-beta.279",
114
- "@oneplatformdev/utils": "^0.1.99-beta.279"
112
+ "@oneplatformdev/tokens": "^0.1.99-beta.281",
113
+ "@oneplatformdev/utils": "^0.1.99-beta.281",
114
+ "@oneplatformdev/hooks": "^0.1.99-beta.281"
115
115
  },
116
116
  "scripts": {
117
117
  "chromatic": "chromatic"
package/styles.css CHANGED
@@ -1 +1 @@
1
- .dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,.dropzone-youtube-player[data-fullscreen=false] .vds-play-button{display:none}.dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-buffering-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-loading-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,.dropzone-youtube-player[data-fullscreen=false] .vds-spinner{display:none}
1
+ .dropzone-youtube-player:not([data-fullscreen]) .vds-play-button,.dropzone-youtube-player[data-fullscreen=false] .vds-play-button{display:none!important}.dropzone-youtube-player:not([data-fullscreen]) .vds-buffering-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-buffering-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-loading-indicator,.dropzone-youtube-player[data-fullscreen=false] .vds-loading-indicator,.dropzone-youtube-player:not([data-fullscreen]) .vds-spinner,.dropzone-youtube-player[data-fullscreen=false] .vds-spinner{display:none!important}