@desynova-digital/components 9.2.52 → 9.3.1

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.
@@ -0,0 +1,598 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _reactDom = require("react-dom");
13
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+ var _tokens = require("@desynova-digital/tokens");
16
+ var _icon = _interopRequireDefault(require("../../atoms/icon"));
17
+ var _tokens2 = require("../../../tokens");
18
+ var _statusV = _interopRequireDefault(require("../../../tokens/statusV2"));
19
+ var _cardV = require("./cardV2");
20
+ var _utils = require("../../_helpers/utils");
21
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19, _templateObject20, _templateObject21, _templateObject22, _templateObject23, _templateObject24, _templateObject25; // atoms
22
+ // tokens
23
+ // styles
24
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
25
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
26
+ var OverlayBackgroundStyles = (0, _styledComponents.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n background: rgba(0, 0, 0, 0.5);\n"])));
27
+ var assetStyles = {
28
+ folder: {
29
+ backgroundColor: "#121D29",
30
+ backgroundSize: "inherit"
31
+ },
32
+ asset: {
33
+ backgroundColor: "inherit",
34
+ backgroundSize: "cover"
35
+ }
36
+ };
37
+ var HoverActionButton = _styledComponents["default"].button(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n border: none;\n cursor: pointer;\n width: 26px;\n height: 26px;\n border-radius: 15px;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 200ms ease;\n\n /* Add rotation only when the 'rotate-icon' class is present */\n &.rotate-icon svg,\n &.rotate-icon i {\n transform: rotate(90deg);\n }\n"])), OverlayBackgroundStyles);
38
+ var AssetTypeChip = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n height: 16.75px;\n padding: 2px 6px;\n align-items: center;\n border-radius: 4px;\n position: absolute;\n top: 10px;\n left: 10px;\n font-size: 8.5px;\n font-weight: 700;\n line-height: 12px;\n letter-spacing: 0.2px;\n font-family: \"SFUIText-Medium\";\n color: #233952;\n text-transform: uppercase;\n background: ", ";\n z-index: 10;\n"])), function (_ref) {
39
+ var theme = _ref.theme;
40
+ return _tokens.colors[theme].card.themeColor;
41
+ });
42
+ var ThumbnailStatusPill = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n top: 82px;\n left: 10px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n min-width: 68px;\n height: 22px;\n padding: 0 10px 0 8px;\n border-radius: 11px;\n background: rgba(0, 0, 0, 0.6);\n color: #fff;\n font-family: \"SFUIText-Medium\";\n font-size: 10px;\n font-weight: 500;\n line-height: 10px;\n z-index: 10;\n\n .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: ", ";\n flex-shrink: 0;\n }\n"])), function (_ref2) {
43
+ var bgColor = _ref2.bgColor;
44
+ return bgColor || "#18B96E";
45
+ });
46
+ var DurationBadge = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n padding: 4px 5px;\n flex-direction: column;\n align-items: flex-start;\n position: absolute;\n right: 10px;\n bottom: 8px;\n color: #fff;\n font-family: 'SFUIText-Regular';\n font-size: 9px;\n font-style: normal;\n font-weight: 700;\n line-height: 13.5px;\n letter-spacing: 0.2px;\n background: rgba(0, 0, 0, 0.7);\n border-radius: 4px;\n z-index: 10;\n"])));
47
+ var ThumbnailStyles = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n overflow: visible;\n background: ", ";\n background-color: ", ";\n background-size: ", ";\n width: ", ";\n height: ", ";\n border-radius: 10px 10px 0 0;\n\n .iframe-image-block {\n cursor: ", ";\n background: #000;\n opacity: 0;\n &:hover {\n opacity: 1;\n }\n .hover-pointer {\n position: absolute;\n width: 1px;\n height: 100%;\n top: 0;\n background: #fff;\n pointer-events: none;\n z-index: 1;\n }\n }\n .background-block {\n position: absolute;\n z-index: 1;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n overflow: hidden;\n .circle {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n background-color: #15212f;\n svg path {\n fill: #afb2ba;\n }\n }\n i {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: auto;\n }\n }\n .thumbnail-image-block {\n cursor: pointer;\n background: linear-gradient(\n 359deg,\n #182738 19.98%,\n #182738 48.97%,\n rgba(24, 39, 56, 0.42) 99.47%\n );\n }\n\n &:hover ", " {\n opacity: 1;\n }\n"])), function (_ref3) {
48
+ var thumbnail = _ref3.thumbnail;
49
+ return "url(".concat(thumbnail, ") no-repeat 50%");
50
+ }, function (_ref4) {
51
+ var data_type = _ref4.data_type;
52
+ return assetStyles[data_type] && assetStyles[data_type].backgroundColor ? assetStyles[data_type].backgroundColor : "inherit";
53
+ }, function (_ref5) {
54
+ var data_type = _ref5.data_type;
55
+ return assetStyles[data_type] && assetStyles[data_type].backgroundSize ? assetStyles[data_type].backgroundSize : "cover";
56
+ }, function (_ref6) {
57
+ var width = _ref6.width;
58
+ return width === "sm" ? "90px" : width === "md" ? "125px" : "222px";
59
+ }, function (_ref7) {
60
+ var width = _ref7.width;
61
+ return width === "sm" ? "50px" : width === "md" ? "70px" : "110px";
62
+ }, function (_ref8) {
63
+ var isClickPrevented = _ref8.isClickPrevented;
64
+ return !isClickPrevented ? "pointer" : "default";
65
+ }, HoverActionButton);
66
+ var UploadTypeContainer = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n z-index: 2;\n cursor: pointer;\n .uploadWrapper {\n border-radius: 50%;\n background: ", ";\n\n color: ", ";\n width: 25px;\n height: 25px;\n display: flex;\n justify-content: center;\n align-items: center;\n .wrapper {\n font-size: 10px;\n font-family: \"SFUIText-Regular\";\n line-height: 1.1;\n text-transform: uppercase;\n }\n }\n"])), function (props) {
67
+ return props.upload_type === "rc" ? "#FF6327" : _tokens.colors[props.theme].card.themeColor;
68
+ }, function (props) {
69
+ return props.upload_type === "rc" ? "#FFFFFF" : "#15212F";
70
+ });
71
+ var HoverActionContainer = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n margin-left: 6px;\n"])));
72
+ var StatusBoxStyles = _styledComponents["default"].div(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n padding: 5px 8px;\n width: fit-content;\n border-radius: 15px;\n margin-right: 5px;\n display: flex;\n align-items: center;\n ", ";\n\n .status-color {\n height: 6px;\n width: 6px;\n border-radius: 100%;\n background-color: ", ";\n margin-right: 5px;\n }\n\n .status-text {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 1;\n height: 10px;\n }\n"])), OverlayBackgroundStyles, function (_ref9) {
73
+ var hex = _ref9.hex;
74
+ return hex.background;
75
+ });
76
+
77
+ // ---------- New styled components for nested dropdown ----------
78
+ var TopRightMenuContainer = _styledComponents["default"].div(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n position: fixed;\n z-index: 99999;\n"])));
79
+ var DropdownContainer = _styledComponents["default"].div(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n display: inline-block;\n"])));
80
+ var Menu = _styledComponents["default"].ul(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n list-style: none;\n margin: 0;\n padding: 4px 0;\n width: max-content;\n background: #182738;\n border-radius: 4px;\n min-width: 100px;\n box-shadow: 0px 6px 16px rgba(0, 0, 0, 0.25);\n"])));
81
+ var MenuItemWrapper = _styledComponents["default"].li(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n font-family: \"SFUIText-Regular\";\n display: flex;\n flex-direction: column;\n\n &:last-child hr {\n display: none;\n }\n"])));
82
+ var MenuItem = _styledComponents["default"].div(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteral2["default"])(["\n color: #ffffff;\n padding: 8px 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n white-space: nowrap;\n font-size: 14px;\n transition: background 0.2s ease;\n\n &:hover {\n background: #1c2d44;\n }\n\n & svg {\n width: 14px;\n height: 14px;\n color: #fff;\n margin-left: 8px;\n }\n"])));
83
+ var Divider = _styledComponents["default"].hr(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["\n border: none;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n margin: 0;\n"])));
84
+ var SubMenu = _styledComponents["default"].div(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n top: 0;\n left: calc(100% - 2px);\n margin-left: 0;\n z-index: 100;\n"])));
85
+ var RightArrow = _styledComponents["default"].span(_templateObject17 || (_templateObject17 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-block;\n width: 0;\n height: 0;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n border-left: 5px solid #fff;\n margin-left: 8px;\n opacity: 0.8;\n"])));
86
+ // ----------------------------------------------------------------
87
+
88
+ // NestedDropdown and DropdownItem components
89
+ var NestedDropdown = function NestedDropdown(_ref10) {
90
+ var data = _ref10.data,
91
+ onSelect = _ref10.onSelect;
92
+ return /*#__PURE__*/_react["default"].createElement(DropdownContainer, null, /*#__PURE__*/_react["default"].createElement(Menu, null, (data || []).map(function (item, index) {
93
+ return /*#__PURE__*/_react["default"].createElement(_DropdownItem, {
94
+ key: "".concat(item.label || item.value || index, "-").concat(index),
95
+ item: item,
96
+ onSelect: onSelect
97
+ });
98
+ })));
99
+ };
100
+ var _DropdownItem = function DropdownItem(_ref11) {
101
+ var item = _ref11.item,
102
+ onSelect = _ref11.onSelect;
103
+ var _useState = (0, _react.useState)(false),
104
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
105
+ open = _useState2[0],
106
+ setOpen = _useState2[1];
107
+ var handleClick = function handleClick(e) {
108
+ e.stopPropagation();
109
+ if (item.children && item.children.length) {
110
+ setOpen(function (prev) {
111
+ return !prev;
112
+ });
113
+ return;
114
+ }
115
+ if (onSelect) {
116
+ onSelect(item);
117
+ }
118
+ };
119
+ return /*#__PURE__*/_react["default"].createElement(MenuItemWrapper, {
120
+ onClick: handleClick,
121
+ onMouseEnter: function onMouseEnter() {
122
+ return setOpen(true);
123
+ },
124
+ onMouseLeave: function onMouseLeave() {
125
+ return setOpen(false);
126
+ }
127
+ }, /*#__PURE__*/_react["default"].createElement(MenuItem, null, /*#__PURE__*/_react["default"].createElement("span", null, item.label), item.children && item.children.length ? /*#__PURE__*/_react["default"].createElement(RightArrow, null) : null), item.children && open ? /*#__PURE__*/_react["default"].createElement(SubMenu, null, /*#__PURE__*/_react["default"].createElement(Menu, null, item.children.map(function (child, i) {
128
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, {
129
+ key: "".concat(child.label || child.value || i, "-").concat(i)
130
+ }, /*#__PURE__*/_react["default"].createElement(_DropdownItem, {
131
+ item: child,
132
+ onSelect: onSelect
133
+ }), /*#__PURE__*/_react["default"].createElement(Divider, null));
134
+ }))) : null, /*#__PURE__*/_react["default"].createElement(Divider, null));
135
+ };
136
+ var DropdownPortal = function DropdownPortal(_ref12) {
137
+ var open = _ref12.open,
138
+ anchorRef = _ref12.anchorRef,
139
+ children = _ref12.children,
140
+ onMouseEnter = _ref12.onMouseEnter,
141
+ onMouseLeave = _ref12.onMouseLeave;
142
+ var _useState3 = (0, _react.useState)({}),
143
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
144
+ style = _useState4[0],
145
+ setStyle = _useState4[1];
146
+ (0, _react.useLayoutEffect)(function () {
147
+ if (!open || !anchorRef.current) return;
148
+ var updatePosition = function updatePosition() {
149
+ var rect = anchorRef.current.getBoundingClientRect();
150
+ setStyle({
151
+ top: rect.bottom + 2,
152
+ left: rect.right - 140
153
+ });
154
+ };
155
+ updatePosition();
156
+ window.addEventListener("scroll", updatePosition, true);
157
+ window.addEventListener("resize", updatePosition);
158
+ return function () {
159
+ window.removeEventListener("scroll", updatePosition, true);
160
+ window.removeEventListener("resize", updatePosition);
161
+ };
162
+ }, [open, anchorRef]);
163
+ if (!open) return null;
164
+ return /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react["default"].createElement(TopRightMenuContainer, {
165
+ style: style,
166
+ onMouseEnter: onMouseEnter /* Fixed: use passed prop instead of undefined openMenu */,
167
+ onMouseLeave: onMouseLeave /* Fixed: use passed prop instead of undefined closeMenu */,
168
+ onClick: function onClick(e) {
169
+ return e.stopPropagation();
170
+ }
171
+ }, children), document.body);
172
+ };
173
+ var IconButtonStyles = (0, _styledComponents["default"])(function (props) {
174
+ return /*#__PURE__*/_react["default"].createElement(_cardV.BaseButtonStyles, props);
175
+ })(_templateObject18 || (_templateObject18 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n\n .tooltip {\n position: absolute;\n bottom: 130%;\n right: 0;\n transform: translateX(0);\n padding: 5px 9px;\n box-sizing: border-box;\n background: #000000;\n color: #fff;\n border-radius: 10px;\n width: max-content;\n max-width: 200px;\n white-space: normal;\n overflow-wrap: break-word;\n text-align: center;\n visibility: hidden;\n opacity: 0;\n z-index: 10;\n transition: all 350ms ease-in-out 0s;\n &:after {\n content: \"\";\n position: absolute;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 5px solid #000;\n bottom: -5px;\n left: 50%;\n }\n .details-header {\n color: #666666;\n font-family: \"SFUIText-Regular\";\n text-transform: none;\n margin-bottom: 8px;\n }\n .details-value {\n color: #999999;\n font-family: \"SFUIText-Light\";\n text-transform: none;\n font-size: 10px;\n }\n }\n\n &:hover {\n background-color: ", ";\n .tooltip {\n opacity: 1;\n visibility: visible;\n }\n }\n &:active,\n &:focus {\n outline: none;\n }\n"])), OverlayBackgroundStyles, function (props) {
176
+ return _tokens.colors[props.theme].card.themeColor;
177
+ });
178
+ var CardHeader = _styledComponents["default"].div(_templateObject19 || (_templateObject19 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n padding: 10px;\n"])));
179
+ var BottomActionContainer = _styledComponents["default"].div(_templateObject20 || (_templateObject20 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n align-items: center;\n gap: 6px;\n z-index: 3;\n opacity: 1;\n"])));
180
+ var SegmentTimeline = _styledComponents["default"].div(_templateObject21 || (_templateObject21 = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n height: 5px;\n position: absolute;\n top: 105px;\n left: 0;\n background: rgba(12, 20, 29, 0.6);\n border-radius: 2px;\n"])));
181
+ var SegmentTimelinePopup = _styledComponents["default"].div(_templateObject22 || (_templateObject22 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n width: max-content;\n max-width: calc(100% - 8px);\n min-height: 28px;\n padding: 6px 8px;\n box-sizing: border-box;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n background: var(--Color-Text-color-Pure-White, #fff);\n position: absolute;\n bottom: calc(100% + 6px);\n left: ", ";\n right: ", ";\n transform: ", ";\n box-shadow: 0 10px 30px rgba(13, 24, 41, 0.12);\n opacity: 0;\n visibility: hidden;\n transition:\n opacity 120ms ease,\n visibility 120ms ease;\n z-index: 20;\n\n span {\n color: #0b0f15;\n font-family: SFUIText-Regular;\n font-size: 10px;\n line-height: 12px;\n text-align: center;\n white-space: normal;\n overflow-wrap: anywhere;\n }\n"])), function (_ref13) {
182
+ var alignment = _ref13.alignment,
183
+ left = _ref13.left;
184
+ return alignment === "end" ? "auto" : alignment === "start" ? "4px" : left;
185
+ }, function (_ref14) {
186
+ var alignment = _ref14.alignment;
187
+ return alignment === "end" ? "4px" : "auto";
188
+ }, function (_ref15) {
189
+ var alignment = _ref15.alignment;
190
+ return alignment === "center" ? "translateX(-50%)" : "none";
191
+ });
192
+ var SegmentTimelinePointer = _styledComponents["default"].span(_templateObject23 || (_templateObject23 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n left: ", ";\n bottom: calc(100% + 1px);\n transform: translateX(-50%);\n width: 0;\n height: 0;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-top: 8px solid ", ";\n opacity: 0;\n visibility: hidden;\n transition:\n opacity 120ms ease,\n visibility 120ms ease;\n z-index: 19;\n pointer-events: none;\n"])), function (_ref16) {
193
+ var left = _ref16.left;
194
+ return left;
195
+ }, function (_ref17) {
196
+ var theme = _ref17.theme;
197
+ return _tokens.colors[theme].card.themeColor;
198
+ });
199
+ var SegmentRangeMarker = _styledComponents["default"].div(_templateObject24 || (_templateObject24 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n top: -6px;\n left: ", ";\n width: ", ";\n height: calc(100% + 12px);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 15;\n\n &:hover + ", " {\n opacity: 1;\n visibility: visible;\n }\n\n &:hover + ", " + ", " {\n opacity: 1;\n visibility: visible;\n }\n"])), function (_ref18) {
200
+ var left = _ref18.left;
201
+ return left;
202
+ }, function (_ref19) {
203
+ var width = _ref19.width;
204
+ return width;
205
+ }, SegmentTimelinePopup, SegmentTimelinePopup, SegmentTimelinePointer);
206
+ var SegmentRangeBar = _styledComponents["default"].div(_templateObject25 || (_templateObject25 = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n height: 5px;\n border-radius: 2px;\n background: ", ";\n"])), function (_ref20) {
207
+ var theme = _ref20.theme;
208
+ return _tokens.colors[theme].card.themeColor;
209
+ });
210
+ var hasTimecodeFormat = function hasTimecodeFormat(value) {
211
+ return typeof value === "string" && value.includes(":");
212
+ };
213
+ var getTimeInSeconds = function getTimeInSeconds(value, frameRate) {
214
+ if (hasTimecodeFormat(value)) {
215
+ return (0, _utils.timeToSeconds)(value, frameRate);
216
+ }
217
+ var numericValue = Number(value);
218
+ return Number.isNaN(numericValue) ? 0 : numericValue;
219
+ };
220
+ var getRelativeTimeInSeconds = function getRelativeTimeInSeconds(relativeTime, timecode, frameRate) {
221
+ if (relativeTime !== undefined && relativeTime !== null && relativeTime !== "") {
222
+ var numericValue = Number(relativeTime);
223
+ if (!Number.isNaN(numericValue)) return numericValue;
224
+ }
225
+ return getTimeInSeconds(timecode, frameRate);
226
+ };
227
+ var getDisplayTimecode = function getDisplayTimecode(value, frameRate) {
228
+ if (hasTimecodeFormat(value)) {
229
+ return value;
230
+ }
231
+ var numericValue = Number(value);
232
+ return Number.isNaN(numericValue) ? "00:00:00:00" : (0, _utils.secondsToTime)(numericValue, frameRate);
233
+ };
234
+ var normalizeStatusCode = function normalizeStatusCode(status) {
235
+ return String(status !== null && status !== void 0 ? status : "").trim().toLowerCase().split(" ").join("_");
236
+ };
237
+ var getStatusHexColor = function getStatusHexColor(status) {
238
+ var _matched$hex;
239
+ var normalized = normalizeStatusCode(status);
240
+ var matched = _statusV["default"].find(function (group) {
241
+ return group.code.includes(normalized);
242
+ });
243
+ return (matched === null || matched === void 0 ? void 0 : (_matched$hex = matched.hex) === null || _matched$hex === void 0 ? void 0 : _matched$hex.background) || "#18B96E";
244
+ };
245
+ var ARCHIVED_STATUS_CONFIG = {
246
+ 0: {
247
+ label: "Pending",
248
+ color: "#AFB2BA"
249
+ },
250
+ pending: {
251
+ label: "Pending",
252
+ color: "#AFB2BA"
253
+ },
254
+ 1: {
255
+ label: "Archived",
256
+ color: "#18B96E"
257
+ },
258
+ archive: {
259
+ label: "Archived",
260
+ color: "#18B96E"
261
+ },
262
+ archived: {
263
+ label: "Archived",
264
+ color: "#18B96E"
265
+ },
266
+ 2: {
267
+ label: "Error",
268
+ color: "#FF6C56"
269
+ },
270
+ error: {
271
+ label: "Error",
272
+ color: "#FF6C56"
273
+ },
274
+ 3: {
275
+ label: "In Progress",
276
+ color: "#FF8D29"
277
+ },
278
+ inprogress: {
279
+ label: "In Progress",
280
+ color: "#FF8D29"
281
+ },
282
+ in_progress: {
283
+ label: "In Progress",
284
+ color: "#FF8D29"
285
+ }
286
+ };
287
+ var getArchivedStatusHexColor = function getArchivedStatusHexColor(status) {
288
+ var _ARCHIVED_STATUS_CONF;
289
+ return (_ARCHIVED_STATUS_CONF = ARCHIVED_STATUS_CONFIG[normalizeStatusCode(status)]) === null || _ARCHIVED_STATUS_CONF === void 0 ? void 0 : _ARCHIVED_STATUS_CONF.color;
290
+ };
291
+ var getStatusLabel = function getStatusLabel(status) {
292
+ var _ARCHIVED_STATUS_CONF2;
293
+ return ((_ARCHIVED_STATUS_CONF2 = ARCHIVED_STATUS_CONFIG[normalizeStatusCode(status)]) === null || _ARCHIVED_STATUS_CONF2 === void 0 ? void 0 : _ARCHIVED_STATUS_CONF2.label) || null;
294
+ };
295
+ var ThumbnailV2 = function ThumbnailV2(props) {
296
+ var theme = props.theme,
297
+ width = props.width,
298
+ thumbnail = props.thumbnail,
299
+ iframeurl = props.iframeurl,
300
+ card_status = props.card_status,
301
+ actions = props.actions,
302
+ ingest_db_id = props.ingest_db_id,
303
+ actionClick = props.actionClick,
304
+ upload_status = props.upload_status,
305
+ upload_type = props.upload_type,
306
+ file_type = props.file_type,
307
+ data_type = props.data_type,
308
+ asset_type = props.asset_type,
309
+ duration = props.duration,
310
+ onUploadTypeClick = props.onUploadTypeClick,
311
+ showPointer = props.showPointer,
312
+ value = props.value,
313
+ nestedDropdownData = props.nestedDropdownData,
314
+ onNestedDropdownSelect = props.onNestedDropdownSelect,
315
+ _props$isAdobe = props.isAdobe,
316
+ isAdobe = _props$isAdobe === void 0 ? false : _props$isAdobe,
317
+ in_time = props.in_time,
318
+ in_timecode = props.in_timecode,
319
+ out_time = props.out_time,
320
+ out_timecode = props.out_timecode,
321
+ full_duration = props.full_duration,
322
+ isSegment = props.isSegment,
323
+ is_segment = props.is_segment,
324
+ frame_rate = props.frame_rate,
325
+ archived_status = props.archived_status,
326
+ isSearchPageCard = props.isSearchPageCard;
327
+ var effectiveFrameRate = Number(frame_rate) || 25;
328
+ var fullDurationValue = full_duration === undefined || full_duration === null ? "" : String(full_duration).trim();
329
+ var hasFullDuration = Boolean(fullDurationValue) && (hasTimecodeFormat(fullDurationValue) || Number.isFinite(Number(fullDurationValue)));
330
+ var resolvedDuration = hasFullDuration ? full_duration : duration;
331
+ var durationValue = resolvedDuration === undefined || resolvedDuration === null ? "" : String(resolvedDuration).trim();
332
+ var hasDuration = Boolean(durationValue) && (hasTimecodeFormat(durationValue) || Number.isFinite(Number(durationValue)));
333
+ var displayDuration = hasDuration ? getDisplayTimecode(durationValue, effectiveFrameRate) : "";
334
+ var supportsDuration = ["audio", "video"].includes(String(file_type || "").trim().toLowerCase());
335
+ var displayAssetType = asset_type === undefined || asset_type === null ? "" : String(asset_type).trim();
336
+ var actionItems = Array.isArray(actions) ? actions : [];
337
+ var isSegmentCard = Boolean(isSegment || is_segment);
338
+ var totalSeconds = getTimeInSeconds(resolvedDuration, effectiveFrameRate);
339
+ var segmentStartSeconds = Math.max(0, Math.min(totalSeconds, getRelativeTimeInSeconds(in_time, in_timecode, effectiveFrameRate)));
340
+ var segmentEndSeconds = Math.max(0, Math.min(totalSeconds, getRelativeTimeInSeconds(out_time, out_timecode, effectiveFrameRate)));
341
+ var displayInTimecode = getDisplayTimecode(in_timecode, effectiveFrameRate);
342
+ var displayOutTimecode = getDisplayTimecode(out_timecode, effectiveFrameRate);
343
+ var hasSegmentTimeline = isSegmentCard && totalSeconds > 0 && segmentEndSeconds > segmentStartSeconds && segmentStartSeconds >= 0;
344
+ var segmentLeftPercent = hasSegmentTimeline ? Math.max(0, Math.min(100, segmentStartSeconds / totalSeconds * 100)) : 0;
345
+ var segmentWidthPercent = hasSegmentTimeline ? Math.min(100 - segmentLeftPercent, Math.max(1, (segmentEndSeconds - segmentStartSeconds) / totalSeconds * 100)) : 0;
346
+ var segmentCenterPercent = segmentLeftPercent + segmentWidthPercent / 2;
347
+ var segmentPopupAlignment = segmentCenterPercent < 40 ? "start" : segmentCenterPercent > 60 ? "end" : "center";
348
+ var _useState5 = (0, _react.useState)(null),
349
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
350
+ statusIndex = _useState6[0],
351
+ setStatusIndex = _useState6[1];
352
+ var _useState7 = (0, _react.useState)(false),
353
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
354
+ isClickPrevented = _useState8[0],
355
+ setClickPreventation = _useState8[1];
356
+ var _useState9 = (0, _react.useState)(false),
357
+ _useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
358
+ showTopRightAction = _useState10[0],
359
+ setShowTopRightAction = _useState10[1];
360
+ var iframeImageBlockRef = (0, _react.useRef)(null);
361
+ var iframeImageRef = (0, _react.useRef)(null);
362
+ var hoverPointerRef = (0, _react.useRef)(null);
363
+ var menuAnchorRef = (0, _react.useRef)(null);
364
+ var closeTimer = (0, _react.useRef)(null);
365
+ var openMenu = function openMenu() {
366
+ clearTimeout(closeTimer.current);
367
+ setShowTopRightAction(true);
368
+ };
369
+ var closeMenu = function closeMenu() {
370
+ closeTimer.current = setTimeout(function () {
371
+ setShowTopRightAction(false);
372
+ }, 150);
373
+ };
374
+ (0, _react.useEffect)(function () {
375
+ if (actionItems.length > 0 && actionItems.some(function (item) {
376
+ return item.field === "upload" || item.field === "phupload_ingest";
377
+ })) {
378
+ setClickPreventation(true);
379
+ }
380
+ }, [actionItems]);
381
+ (0, _react.useEffect)(function () {
382
+ var index = _tokens2.CARD_ASSET_STATUS.findIndex(function (label) {
383
+ return label.code.includes(card_status || upload_status ? (card_status || upload_status).toLowerCase().split(" ").join("_") : []);
384
+ });
385
+ setStatusIndex(index);
386
+ }, [upload_status, card_status]);
387
+ (0, _react.useEffect)(function () {
388
+ if (!showTopRightAction) return;
389
+ var handleClick = function handleClick(e) {
390
+ if (menuAnchorRef.current && !menuAnchorRef.current.contains(e.target)) {
391
+ setShowTopRightAction(false);
392
+ }
393
+ };
394
+ document.addEventListener("mousedown", handleClick);
395
+ return function () {
396
+ return document.removeEventListener("mousedown", handleClick);
397
+ };
398
+ }, [showTopRightAction]);
399
+ var handleMouseMove = (0, _react.useCallback)(function (event) {
400
+ if (iframeImageBlockRef.current && hoverPointerRef.current && iframeImageRef.current) {
401
+ var iframeBlock = iframeImageBlockRef.current;
402
+ var iframeImage = iframeImageRef.current;
403
+ var iframeBlockHeight = iframeBlock.offsetHeight;
404
+ var iframeOgHeight = 120;
405
+ var ogHeight = iframeImage.naturalHeight;
406
+ var offsetHeight = iframeImage.offsetHeight;
407
+ var rect = iframeBlock.getBoundingClientRect();
408
+ var offsetWidth = rect.width;
409
+ var iframeCount = Math.max(1, Math.floor(ogHeight / iframeOgHeight));
410
+ if (!ogHeight || !offsetHeight || !offsetWidth) return;
411
+ var iframeOffsetHeight = offsetHeight / iframeCount;
412
+ var imageChangePoint = offsetWidth / iframeCount;
413
+ var offsetTop = Math.abs(iframeBlockHeight - iframeOffsetHeight) / 2;
414
+ var pointerX = Math.max(0, Math.min(offsetWidth - 1, event.clientX - rect.left));
415
+ var imageNum = Math.min(iframeCount - 1, Math.floor(pointerX / imageChangePoint));
416
+ hoverPointerRef.current.style.left = "".concat(pointerX, "px");
417
+ iframeImage.style.top = "".concat(offsetTop - iframeOffsetHeight * imageNum - 11, "px");
418
+ }
419
+ }, []);
420
+ var handleThumbnailClick = (0, _react.useCallback)(function (e) {
421
+ if (!isClickPrevented) {
422
+ actionClick(e, "play", ingest_db_id);
423
+ } else {
424
+ e.preventDefault();
425
+ }
426
+ }, [isClickPrevented, actionClick, ingest_db_id]);
427
+ var handleActionIconClick = (0, _react.useCallback)(function (e, item) {
428
+ e.stopPropagation();
429
+ actionClick(e, item.field);
430
+ }, [actionClick]);
431
+ var handleUploadTypeClick = (0, _react.useCallback)(function (e) {
432
+ e.stopPropagation();
433
+ if (nestedDropdownData && nestedDropdownData.length) {
434
+ setShowTopRightAction(function (prev) {
435
+ return !prev;
436
+ });
437
+ return;
438
+ }
439
+ if (onUploadTypeClick) {
440
+ onUploadTypeClick();
441
+ }
442
+ }, [onUploadTypeClick, nestedDropdownData]);
443
+ var handleNestedSelect = (0, _react.useCallback)(function (item) {
444
+ setShowTopRightAction(false);
445
+ if (onNestedDropdownSelect) {
446
+ onNestedDropdownSelect(item);
447
+ }
448
+ }, [onNestedDropdownSelect]);
449
+ return /*#__PURE__*/_react["default"].createElement(ThumbnailStyles, {
450
+ width: width,
451
+ thumbnail: thumbnail,
452
+ isClickPrevented: isClickPrevented,
453
+ onClick: handleThumbnailClick,
454
+ theme: props.theme,
455
+ data_type: data_type
456
+ }, getStatusLabel(archived_status) ? /*#__PURE__*/_react["default"].createElement(ThumbnailStatusPill, {
457
+ bgColor: getArchivedStatusHexColor(archived_status)
458
+ }, /*#__PURE__*/_react["default"].createElement("span", {
459
+ className: "status-dot"
460
+ }), getStatusLabel(archived_status)) : null, hasSegmentTimeline && /*#__PURE__*/_react["default"].createElement(SegmentTimeline, null, /*#__PURE__*/_react["default"].createElement(SegmentRangeMarker, {
461
+ left: "".concat(segmentLeftPercent, "%"),
462
+ width: "".concat(segmentWidthPercent, "%"),
463
+ theme: theme
464
+ }, /*#__PURE__*/_react["default"].createElement(SegmentRangeBar, {
465
+ theme: theme
466
+ })), /*#__PURE__*/_react["default"].createElement(SegmentTimelinePopup, {
467
+ alignment: segmentPopupAlignment,
468
+ left: "".concat(segmentCenterPercent, "%")
469
+ }, /*#__PURE__*/_react["default"].createElement("span", null, "".concat(displayInTimecode, " to ").concat(displayOutTimecode))), /*#__PURE__*/_react["default"].createElement(SegmentTimelinePointer, {
470
+ theme: theme,
471
+ left: "".concat(segmentCenterPercent, "%")
472
+ })), isSearchPageCard && displayAssetType ? /*#__PURE__*/_react["default"].createElement(AssetTypeChip, {
473
+ theme: theme
474
+ }, displayAssetType) : null, /*#__PURE__*/_react["default"].createElement(CardHeader, null, /*#__PURE__*/_react["default"].createElement(_cardV.DivStyles, {
475
+ theme: props.theme,
476
+ className: "asset-card-thumbnail-head",
477
+ display: "flex",
478
+ justify: "flex-end",
479
+ align: "center",
480
+ position: "relative",
481
+ zIndex: "2",
482
+ marginLeft: "auto"
483
+ }, ingest_db_id && /*#__PURE__*/_react["default"].createElement(HoverActionContainer, null, nestedDropdownData && nestedDropdownData.length && isAdobe ? /*#__PURE__*/_react["default"].createElement("div", {
484
+ ref: menuAnchorRef,
485
+ style: {
486
+ position: "relative"
487
+ },
488
+ onMouseEnter: openMenu,
489
+ onMouseLeave: closeMenu
490
+ }, /*#__PURE__*/_react["default"].createElement(HoverActionButton, {
491
+ className: "rotate-icon",
492
+ type: "button",
493
+ title: "More"
494
+ }, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
495
+ name: "dots",
496
+ width: 14,
497
+ height: 14,
498
+ theme: props.theme
499
+ })), /*#__PURE__*/_react["default"].createElement(DropdownPortal, {
500
+ open: showTopRightAction,
501
+ anchorRef: menuAnchorRef,
502
+ onMouseEnter: openMenu,
503
+ onMouseLeave: closeMenu
504
+ }, /*#__PURE__*/_react["default"].createElement(NestedDropdown, {
505
+ data: nestedDropdownData,
506
+ onSelect: handleNestedSelect
507
+ }))) : !isAdobe && /*#__PURE__*/_react["default"].createElement(HoverActionButton, {
508
+ type: "button",
509
+ onClick: handleUploadTypeClick,
510
+ title: "Info"
511
+ }, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
512
+ name: "info",
513
+ width: 14,
514
+ height: 14,
515
+ theme: props.theme
516
+ }))))), actionItems.length && /*#__PURE__*/_react["default"].createElement(BottomActionContainer, null, actionItems.map(function (item, i) {
517
+ return item.icon && /*#__PURE__*/_react["default"].createElement(IconButtonStyles, {
518
+ theme: props.theme,
519
+ className: "asset-card-thumbnail-icon-button",
520
+ type: "button",
521
+ key: i,
522
+ position: "relative",
523
+ border: "none",
524
+ cursor: "pointer",
525
+ borderRadius: "15px",
526
+ height: "26px",
527
+ padding: "0px",
528
+ width: "26px",
529
+ margin: "0",
530
+ onClick: function onClick(e) {
531
+ return handleActionIconClick(e, item);
532
+ }
533
+ }, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
534
+ name: item.icon,
535
+ width: 22,
536
+ height: 24,
537
+ theme: props.theme
538
+ }), /*#__PURE__*/_react["default"].createElement("div", {
539
+ className: "tooltip"
540
+ }, item.title));
541
+ })) || null, file_type && !thumbnail ? /*#__PURE__*/_react["default"].createElement("div", {
542
+ className: "thumbnail-image-block background-block"
543
+ }, /*#__PURE__*/_react["default"].createElement("div", {
544
+ className: "circle"
545
+ }, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
546
+ name: file_type == "video" && value == "collateral" ? "video-icon" : "".concat(file_type, "-icon"),
547
+ width: 15,
548
+ height: 15
549
+ }))) : null, iframeurl && /*#__PURE__*/_react["default"].createElement("div", {
550
+ onMouseMove: handleMouseMove,
551
+ className: "iframe-image-block background-block",
552
+ ref: iframeImageBlockRef
553
+ }, /*#__PURE__*/_react["default"].createElement("div", {
554
+ className: "hover-pointer",
555
+ ref: hoverPointerRef
556
+ }), /*#__PURE__*/_react["default"].createElement("img", {
557
+ ref: iframeImageRef,
558
+ className: "iframe-image",
559
+ src: iframeurl,
560
+ alt: "preview"
561
+ })) || null, isSearchPageCard && supportsDuration && displayDuration ? /*#__PURE__*/_react["default"].createElement(DurationBadge, null, displayDuration) : null);
562
+ };
563
+ ThumbnailV2.propTypes = {
564
+ theme: _propTypes["default"].oneOf(["light", "dark", "nexc"]),
565
+ width: _propTypes["default"].string,
566
+ thumbnail: _propTypes["default"].string,
567
+ file_type: _propTypes["default"].string,
568
+ iframeurl: _propTypes["default"].string,
569
+ upload_status: _propTypes["default"].string,
570
+ card_status: _propTypes["default"].string,
571
+ ingest_db_id: _propTypes["default"].string,
572
+ archived_status: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
573
+ actions: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].object), _propTypes["default"].object]),
574
+ actionClick: _propTypes["default"].func,
575
+ onUploadTypeClick: _propTypes["default"].func,
576
+ nestedDropdownData: _propTypes["default"].arrayOf(_propTypes["default"].object),
577
+ onNestedDropdownSelect: _propTypes["default"].func,
578
+ isAdobe: _propTypes["default"].bool,
579
+ in_time: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
580
+ in_timecode: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
581
+ out_time: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
582
+ out_timecode: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
583
+ full_duration: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
584
+ duration: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
585
+ isSegment: _propTypes["default"].bool,
586
+ is_segment: _propTypes["default"].bool,
587
+ frame_rate: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
588
+ isSearchPageCard: _propTypes["default"].bool
589
+ };
590
+ ThumbnailV2.defaultProps = {
591
+ theme: "dark",
592
+ width: "lg",
593
+ thumbnail: "https://thumbnail.desynova.com/default_placeholder/Contido_Placeholder_Image.png",
594
+ iframeurl: "",
595
+ isAdobe: false,
596
+ isSearchPageCard: false
597
+ };
598
+ var _default = exports["default"] = ThumbnailV2;
@@ -22,11 +22,12 @@ var _Icon = function Icon(props) {
22
22
  viewBox: viewBox,
23
23
  color: props.color
24
24
  }, icon.paths.map(function (path, index) {
25
+ var _props$color$index;
25
26
  return /*#__PURE__*/_react["default"].createElement("path", {
26
27
  key: index,
27
28
  d: path,
28
29
  transform: icon.transform,
29
- fill: props.color,
30
+ fill: (_props$color$index = props.color[index]) !== null && _props$color$index !== void 0 ? _props$color$index : props.color,
30
31
  stroke: props.stroke,
31
32
  strokeWidth: icon.strokeWidth,
32
33
  fillRule: icon.fillRule,