@appquality/unguess-design-system 3.1.98 → 3.1.99

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/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ # v3.1.99 (Mon Jun 10 2024)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - New version [#385](https://github.com/AppQuality/unguess-design-system/pull/385) ([@iacopolea](https://github.com/iacopolea) [@cannarocks](https://github.com/cannarocks) [@marcbon](https://github.com/marcbon) [@Kariamos](https://github.com/Kariamos))
6
+ - 🚀 feat(player): add showControls prop to PlayerArgs and WrapperProps [#381](https://github.com/AppQuality/unguess-design-system/pull/381) ([@marcbon](https://github.com/marcbon))
7
+ - 🚀 feat(highlight): add CreateObservationButton component [#387](https://github.com/AppQuality/unguess-design-system/pull/387) ([@marcbon](https://github.com/marcbon))
8
+ - feat: centered tooltip attachment text [#386](https://github.com/AppQuality/unguess-design-system/pull/386) ([@Kariamos](https://github.com/Kariamos))
9
+ - feat: added new component for internal avatar [#384](https://github.com/AppQuality/unguess-design-system/pull/384) ([@Kariamos](https://github.com/Kariamos))
10
+ - Attachment error managment [#383](https://github.com/AppQuality/unguess-design-system/pull/383) ([@iacopolea](https://github.com/iacopolea) [@Kariamos](https://github.com/Kariamos))
11
+ - 🚀 feat(cutterButton.tsx): add styled component for Cutter button to prevent [#382](https://github.com/AppQuality/unguess-design-system/pull/382) ([@marcbon](https://github.com/marcbon))
12
+
13
+ #### Authors: 4
14
+
15
+ - Iacopo Leardini ([@iacopolea](https://github.com/iacopolea))
16
+ - Luca Cannarozzo ([@cannarocks](https://github.com/cannarocks))
17
+ - Marco ([@Kariamos](https://github.com/Kariamos))
18
+ - Marco Bonomo ([@marcbon](https://github.com/marcbon))
19
+
20
+ ---
21
+
1
22
  # v3.1.98 (Tue May 28 2024)
2
23
 
3
24
  #### 🐛 Bug Fix
package/build/index.js CHANGED
@@ -642,6 +642,15 @@ Alert.Close = reactNotifications.Close;
642
642
 
643
643
  var img$2 = "data:image/svg+xml,%3csvg width='26' height='26' viewBox='0 0 26 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M17.2597 12.9199V14.767H17.2367C17.075 17.4452 15.5974 18.969 13.127 18.969C10.4949 18.969 8.92496 17.4452 8.76335 14.767H8.74026V12.9199H5V14.767V14.7901C5.20779 19.4538 8.34777 22.4322 13.1039 22.4322C17.8139 22.4322 20.7922 19.5231 21 14.7901V12.9199H17.2597Z' fill='%23003A57'/%3e%3cpath d='M8.78629 3.5H5.02295V7.26335H8.78629V3.5Z' fill='%2370C38A'/%3e%3cpath d='M20.9768 3.5H17.1672V7.30952H20.9768V3.5Z' fill='%23003A57'/%3e%3c/svg%3e";
644
644
 
645
+ const StyledInternalAvatar = styled__default["default"].div `
646
+ display: flex;
647
+ align-items: center;
648
+ justify-content: center;
649
+ `;
650
+ const InternalAvatar = () => {
651
+ return (jsxRuntime.jsx(StyledInternalAvatar, { children: jsxRuntime.jsx("img", { alt: "avatar", src: img$2 }) }));
652
+ };
653
+
645
654
  const UgAvatar = styled__default["default"](reactAvatars.Avatar) `
646
655
  text-transform: uppercase;
647
656
 
@@ -673,7 +682,7 @@ const Avatar = (_a) => {
673
682
  if (type === "text")
674
683
  return jsxRuntime.jsx(Avatar.Text, { children: props.children });
675
684
  if (type === "system")
676
- return jsxRuntime.jsx("img", { alt: "avatar", src: img$2 });
685
+ return jsxRuntime.jsx(InternalAvatar, {});
677
686
  };
678
687
  return (jsxRuntime.jsx(UgAvatar, Object.assign({}, props, { badge: fixedBadge, isSystem: props.avatarType === "system" || isSystem, children: wrapChildren(props.avatarType || "text"), size: props.size || "small" })));
679
688
  };
@@ -2337,40 +2346,26 @@ const ChatContextProvider = ({ onSave, onFileUpload, onDeleteThumbnail, setMenti
2337
2346
  setEditor,
2338
2347
  thumbnails,
2339
2348
  setThumbnails,
2340
- afterUploadCallback: (failed) => {
2341
- setThumbnails(thumbnails.map((file) => {
2342
- if (failed.includes(file.id)) {
2343
- file.isLoadingMedia = false;
2344
- //file.isError = true;
2345
- }
2346
- else {
2347
- file.isLoadingMedia = false;
2348
- //file.isError = false
2349
- }
2350
- return file;
2351
- }));
2352
- },
2353
- addThumbnails: ({ files }) => {
2349
+ afterUploadCallback: (failed) => { },
2350
+ addThumbnails: ({ files }) => __awaiter(void 0, void 0, void 0, function* () {
2354
2351
  setThumbnails((prev) => [...prev, ...files]);
2355
- if (onFileUpload) {
2356
- onFileUpload(files).then((data) => {
2357
- var _a;
2358
- const failed = (_a = data.failed) === null || _a === void 0 ? void 0 : _a.map((f) => f.name);
2359
- setThumbnails((prev) => {
2360
- return prev.map((file) => {
2361
- file.isLoadingMedia = false;
2362
- if ((failed === null || failed === void 0 ? void 0 : failed.length) && failed.includes(file.id)) {
2363
- file.isError = true;
2364
- }
2365
- else {
2366
- file.isError = false;
2367
- }
2368
- return file;
2369
- });
2352
+ if (!onFileUpload)
2353
+ return;
2354
+ try {
2355
+ const data = yield onFileUpload(files);
2356
+ setThumbnails((prev) => {
2357
+ return prev.map(file => {
2358
+ var _a, _b;
2359
+ file.isLoadingMedia = false;
2360
+ file.error = (_b = (_a = data.failed) === null || _a === void 0 ? void 0 : _a.find(f => f.name === file.name)) === null || _b === void 0 ? void 0 : _b.errorCode;
2361
+ return file;
2370
2362
  });
2371
2363
  });
2372
2364
  }
2373
- },
2365
+ catch (e) {
2366
+ console.log("Error uploading files", e);
2367
+ }
2368
+ }),
2374
2369
  clearInput: () => {
2375
2370
  if (editor && !editor.isEmpty) {
2376
2371
  editor.commands.clearContent();
@@ -3115,7 +3110,7 @@ const CommentBar = ({ editor, i18n, }) => {
3115
3110
  }
3116
3111
  };
3117
3112
  };
3118
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(MenuContainer, Object.assign({ id: "menu-container" }, { children: [jsxRuntime.jsx(Tooltip, Object.assign({ content: `${(_b = (_a = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _a === void 0 ? void 0 : _a.bold) !== null && _b !== void 0 ? _b : "Bold text"} ${isMac() ? "Cmd" : "Ctrl"} + B`, placement: "top", type: "light", size: "small", hasArrow: false }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("bold"), isPrimary: editor.isActive("bold"), isPill: false, onClick: handleBoldClick }, { children: jsxRuntime.jsx(SvgBoldStroke, {}) })) })), jsxRuntime.jsx(Tooltip, Object.assign({ content: `${(_d = (_c = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _c === void 0 ? void 0 : _c.italic) !== null && _d !== void 0 ? _d : "Italic text"} ${isMac() ? "Cmd" : "Ctrl"} + I`, placement: "top", type: "light", size: "small", hasArrow: false }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("italic"), isPrimary: editor.isActive("italic"), isPill: false, onClick: handleItalicClick }, { children: jsxRuntime.jsx(SvgItalicStroke, {}) })) })), jsxRuntime.jsx(VerticalDivider, {}), jsxRuntime.jsx(Tooltip, Object.assign({ content: (_f = (_e = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _e === void 0 ? void 0 : _e.mention) !== null && _f !== void 0 ? _f : "Add a mention", placement: "top", type: "light", size: "small", hasArrow: false }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("mention"), isPrimary: editor.isActive("mention"), isPill: false, onClick: handleMentionClick }, { children: jsxRuntime.jsx(SvgAtStroke, {}) })) })), jsxRuntime.jsx(Tooltip, Object.assign({ content: (_h = (_g = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _g === void 0 ? void 0 : _g.attachment) !== null && _h !== void 0 ? _h : (jsxRuntime.jsxs("span", { children: ["Upload images and video.", " ", jsxRuntime.jsxs("span", Object.assign({ style: { color: theme.palette.grey[600] } }, { children: [" ", jsxRuntime.jsx("br", {}), " Max size: 5GB", " "] }))] })), placement: "top", type: "light", size: "small", hasArrow: true }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("attachment"), isPrimary: editor.isActive("attachment"), isPill: false, onClick: handleAttachmentClick }, { children: jsxRuntime.jsx(SvgClipboard, {}) })) }))] })) }));
3113
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(MenuContainer, Object.assign({ id: "menu-container" }, { children: [jsxRuntime.jsx(Tooltip, Object.assign({ content: `${(_b = (_a = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _a === void 0 ? void 0 : _a.bold) !== null && _b !== void 0 ? _b : "Bold text"} ${isMac() ? "Cmd" : "Ctrl"} + B`, placement: "top", type: "light", size: "small", hasArrow: false }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("bold"), isPrimary: editor.isActive("bold"), isPill: false, onClick: handleBoldClick }, { children: jsxRuntime.jsx(SvgBoldStroke, {}) })) })), jsxRuntime.jsx(Tooltip, Object.assign({ content: `${(_d = (_c = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _c === void 0 ? void 0 : _c.italic) !== null && _d !== void 0 ? _d : "Italic text"} ${isMac() ? "Cmd" : "Ctrl"} + I`, placement: "top", type: "light", size: "small", hasArrow: false }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("italic"), isPrimary: editor.isActive("italic"), isPill: false, onClick: handleItalicClick }, { children: jsxRuntime.jsx(SvgItalicStroke, {}) })) })), jsxRuntime.jsx(VerticalDivider, {}), jsxRuntime.jsx(Tooltip, Object.assign({ content: (_f = (_e = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _e === void 0 ? void 0 : _e.mention) !== null && _f !== void 0 ? _f : "Add a mention", placement: "top", type: "light", size: "small", hasArrow: false }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("mention"), isPrimary: editor.isActive("mention"), isPill: false, onClick: handleMentionClick }, { children: jsxRuntime.jsx(SvgAtStroke, {}) })) })), jsxRuntime.jsx(Tooltip, Object.assign({ style: { textAlign: "center" }, content: (_h = (_g = i18n === null || i18n === void 0 ? void 0 : i18n.menu) === null || _g === void 0 ? void 0 : _g.attachment) !== null && _h !== void 0 ? _h : (jsxRuntime.jsxs("span", { children: ["Upload images and video.", " ", jsxRuntime.jsxs("span", Object.assign({ style: { color: theme.palette.grey[600] } }, { children: [" ", jsxRuntime.jsx("br", {}), " Max size: 5GB", " "] }))] })), placement: "top", type: "light", size: "small", hasArrow: true }, { children: jsxRuntime.jsx(IconButton, Object.assign({ size: "small", isBasic: !editor.isActive("attachment"), isPrimary: editor.isActive("attachment"), isPill: false, onClick: handleAttachmentClick }, { children: jsxRuntime.jsx(SvgClipboard, {}) })) }))] })) }));
3119
3114
  };
3120
3115
 
3121
3116
  const CustomMention = Mention__default["default"].extend({
@@ -3398,6 +3393,7 @@ const StyledDeleteThumbnailX = styled__default["default"].div `
3398
3393
  opacity: 0;
3399
3394
  transition: opacity 0.2s;
3400
3395
  z-index: 2;
3396
+ color: ${({ theme }) => theme.palette.grey[800]};
3401
3397
  `;
3402
3398
  const DeleteThumbnailX = ({ deleteThumbnail }) => {
3403
3399
  return (jsxRuntime.jsx(StyledDeleteThumbnailX, Object.assign({ className: "deleteThumbnail" }, { children: jsxRuntime.jsx(SvgRemoveMediaIcon, { onClick: (e) => deleteThumbnail(e) }) })));
@@ -3425,19 +3421,19 @@ const ImageCard = styled__default["default"](SpecialCard) `
3425
3421
  padding: 0;
3426
3422
  position: relative;
3427
3423
  overflow: hidden;
3428
- min-width: 90px;
3424
+ width: 90px;
3429
3425
 
3430
3426
  &:before {
3431
3427
  content: "";
3428
+ font-size: ${({ theme }) => theme.fontSizes.xs};
3432
3429
  position: absolute;
3430
+ padding: ${({ theme }) => theme.space.xs};
3433
3431
  top: 0;
3434
3432
  left: 0;
3435
3433
  width: 100%;
3436
3434
  height: 100%;
3437
- background-color: ${({ theme }) => theme.palette.grey[800]};
3438
- opacity: 0;
3435
+ background-color: ${({ theme }) => theme.palette.grey[800]}00; // 0% opacity
3439
3436
  transition: opacity 0.2s;
3440
- z-index: 1;
3441
3437
  }
3442
3438
 
3443
3439
  &:hover {
@@ -3445,12 +3441,26 @@ const ImageCard = styled__default["default"](SpecialCard) `
3445
3441
  opacity: 1;
3446
3442
  }
3447
3443
  &:before {
3448
- opacity: 0.3;
3444
+ background-color: ${({ theme }) => theme.palette.grey[800]}4d; // 30% opacity
3449
3445
  }
3450
3446
  }
3451
-
3447
+ ${(p) => p.error &&
3448
+ `
3449
+ &:before{
3450
+ content: "Error: ${p.error}";
3451
+ color: ${p.theme.palette.white};
3452
+ background-color: ${p.theme.palette.grey[800]}b3; // 0.7 opacity
3453
+ }
3454
+ `}
3455
+ ${(p) => p.isLoading &&
3456
+ `
3457
+ &:before{
3458
+ background-color: ${p.theme.palette.grey[800]}b3; // 0.7 opacity
3459
+ }
3460
+ `}
3452
3461
  &.video {
3453
3462
  svg {
3463
+ color: ${({ theme }) => theme.palette.grey[800]};
3454
3464
  position: absolute;
3455
3465
  top: 50%;
3456
3466
  left: 50%;
@@ -3467,8 +3477,9 @@ const Preview = styled__default["default"].div `
3467
3477
  align-items: center;
3468
3478
  height: 100px;
3469
3479
  width: 100%;
3470
-
3471
- ${(p) => p.url &&
3480
+ color: ${({ theme }) => theme.palette.white};
3481
+
3482
+ ${p => p.url &&
3472
3483
  `
3473
3484
  background-image: url(${p.url});
3474
3485
  background-color: ${p.theme.palette.grey[100]};
@@ -3482,19 +3493,19 @@ const Preview = styled__default["default"].div `
3482
3493
  height: 100%;
3483
3494
  }
3484
3495
  `;
3485
- const Thumbnail = ({ src, type, removeThumbnail, clickThumbnail, showX, isLoadingMedia = true, isError = false, }) => {
3496
+ const Thumbnail = ({ src, type, removeThumbnail, clickThumbnail, showX, isLoadingMedia, error = "", }) => {
3486
3497
  const handleCancel = (e) => {
3487
3498
  e.stopPropagation();
3488
3499
  if (removeThumbnail)
3489
3500
  removeThumbnail();
3490
3501
  };
3491
- return (jsxRuntime.jsxs(ImageCard, Object.assign({ onClick: clickThumbnail, className: type.includes("video") ? "video" : "image" }, { children: [isError && (
3492
- // todo: add error icon
3493
- jsxRuntime.jsx("span", { children: "error uploading media" })), isLoadingMedia ? (jsxRuntime.jsx(Preview, { children: jsxRuntime.jsx(reactLoaders.Spinner, { style: {
3494
- display: "flex",
3495
- alignItems: "center",
3496
- justifyContent: "center",
3497
- }, size: "large" }) })) : (jsxRuntime.jsxs(Preview, Object.assign({ url: src }, { children: [showX && (jsxRuntime.jsx(DeleteThumbnailX, { deleteThumbnail: (e) => handleCancel(e) })), type.includes("video") && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("video", Object.assign({ src: src }, { children: jsxRuntime.jsx("track", { kind: "captions" }) })), jsxRuntime.jsx(SvgVideoPlayIcon, {})] }))] })))] })));
3502
+ return (jsxRuntime.jsx(ImageCard, Object.assign({ onClick: clickThumbnail, className: type.includes("video") ? "video" : "image", error: error, isLoading: isLoadingMedia }, { children: isLoadingMedia ? (jsxRuntime.jsx(Preview, Object.assign({ url: src }, { children: jsxRuntime.jsx(reactLoaders.Spinner, { style: {
3503
+ display: "flex",
3504
+ position: "absolute",
3505
+ color: "white",
3506
+ alignItems: "center",
3507
+ justifyContent: "center",
3508
+ }, size: "large" }) }))) : (jsxRuntime.jsxs(Preview, Object.assign({ url: src }, { children: [showX && (jsxRuntime.jsx(DeleteThumbnailX, { deleteThumbnail: (e) => handleCancel(e) })), type.includes("video") && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("video", Object.assign({ src: src }, { children: jsxRuntime.jsx("track", { kind: "captions" }) })), jsxRuntime.jsx(SvgVideoPlayIcon, { opacity: error ? "0.3" : "1" })] }))] }))) })));
3498
3509
  };
3499
3510
 
3500
3511
  const FlexContainer = styled.styled.div `
@@ -3511,12 +3522,13 @@ const ThumbnailContainer = ({ openLightbox }) => {
3511
3522
  previewUrl: file.url,
3512
3523
  id: file.id,
3513
3524
  isLoadingMedia: file.isLoadingMedia,
3525
+ error: file.error,
3514
3526
  }));
3515
3527
  }, [thumbnails]);
3516
3528
  if (!mediaFiles || mediaFiles.length === 0) {
3517
3529
  return null;
3518
3530
  }
3519
- return (jsxRuntime.jsx(FlexContainer, { children: mediaFiles.map((file, index) => (jsxRuntime.jsx(Thumbnail, { src: file.previewUrl, showX: true, type: file.fileType, isLoadingMedia: file.isLoadingMedia, removeThumbnail: () => {
3531
+ return (jsxRuntime.jsx(FlexContainer, { children: mediaFiles.map((file, index) => (jsxRuntime.jsx(Thumbnail, { src: file.previewUrl, showX: true, type: file.fileType, isLoadingMedia: file.isLoadingMedia, error: file.error, removeThumbnail: () => {
3520
3532
  removeThumbnail(index);
3521
3533
  onDeleteThumbnail(file.id);
3522
3534
  }, clickThumbnail: () => {
@@ -4299,18 +4311,22 @@ const SvgPlus$1 = props => /*#__PURE__*/React__namespace.createElement("svg", _e
4299
4311
  fill: "currentColor"
4300
4312
  })));
4301
4313
 
4314
+ // Prevent button from breaking on smaller screens
4315
+ const StyledButton$2 = styled.styled(Button) `
4316
+ overflow: visible;
4317
+ `;
4302
4318
  const Cutter = ({ onCutHandler, isCutting, i18n, }) => {
4303
4319
  var _a;
4304
4320
  const { context } = Video.useVideoContext();
4305
4321
  const videoRef = (_a = context.player) === null || _a === void 0 ? void 0 : _a.ref.current;
4306
4322
  if (!onCutHandler)
4307
4323
  return null;
4308
- return (jsxRuntime.jsx(Button, Object.assign({ isPrimary: true, isAccent: !isCutting, size: "small", onClick: (e) => {
4324
+ return (jsxRuntime.jsx(StyledButton$2, Object.assign({ isPrimary: true, isAccent: !isCutting, size: "small", onClick: (e) => {
4309
4325
  if (videoRef) {
4310
4326
  onCutHandler(videoRef.currentTime);
4311
4327
  }
4312
4328
  e.stopPropagation();
4313
- } }, { children: isCutting ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Button.StartIcon, { children: jsxRuntime.jsx(SvgTagStroke, {}) }), (i18n === null || i18n === void 0 ? void 0 : i18n.onHighlight) || "End observation"] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Button.StartIcon, { children: jsxRuntime.jsx(SvgPlus$1, {}) }), (i18n === null || i18n === void 0 ? void 0 : i18n.beforeHighlight) || "Start observation"] })) })));
4329
+ } }, { children: isCutting ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Button.StartIcon, { children: jsxRuntime.jsx(SvgTagStroke, {}) }), jsxRuntime.jsx(Span, { children: (i18n === null || i18n === void 0 ? void 0 : i18n.onHighlight) || "End observation" })] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Button.StartIcon, { children: jsxRuntime.jsx(SvgPlus$1, {}) }), jsxRuntime.jsx(Span, { children: (i18n === null || i18n === void 0 ? void 0 : i18n.beforeHighlight) || "Start observation" })] })) })));
4314
4330
  };
4315
4331
 
4316
4332
  var _path$e;
@@ -4478,7 +4494,7 @@ function useDebounce(value, delay) {
4478
4494
  }
4479
4495
 
4480
4496
  const ControlsWrapper = styled__default["default"].div `
4481
- position: absolute;
4497
+ ${({ showControls }) => showControls ? "position: relative;" : "position: absolute;"}
4482
4498
  bottom: 0;
4483
4499
  left: 0;
4484
4500
  right: 0;
@@ -4514,7 +4530,7 @@ const CurrentTimeMarker = styled__default["default"].div `
4514
4530
  z-index: 1;
4515
4531
  background-color: white;
4516
4532
  `;
4517
- const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, }) => {
4533
+ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, showControls = false, }) => {
4518
4534
  var _a, _b, _c;
4519
4535
  const [progress, setProgress] = React.useState(0);
4520
4536
  const [tooltipMargin, setTooltipMargin] = React.useState(0);
@@ -4599,7 +4615,7 @@ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpd
4599
4615
  onBookMarkUpdated === null || onBookMarkUpdated === void 0 ? void 0 : onBookMarkUpdated(debouncedMark);
4600
4616
  }
4601
4617
  }, [debouncedMark, onBookMarkUpdated]);
4602
- return (jsxRuntime.jsxs(ControlsWrapper, Object.assign({ isPlaying: context.isPlaying }, { children: [jsxRuntime.jsxs(ProgressContainer, Object.assign({ onMouseEnter: onMouseEvent, onMouseMove: onMouseEvent, onMouseLeave: onMouseEvent }, { children: [jsxRuntime.jsx(StyledTooltip, Object.assign({ style: { marginLeft: `${tooltipMargin}px` } }, { children: tooltipLabel })), !!duration &&
4618
+ return (jsxRuntime.jsxs(ControlsWrapper, Object.assign({ showControls: showControls }, (!showControls && { isPlaying: context.isPlaying }), { children: [jsxRuntime.jsxs(ProgressContainer, Object.assign({ onMouseEnter: onMouseEvent, onMouseMove: onMouseEvent, onMouseLeave: onMouseEvent }, { children: [jsxRuntime.jsx(StyledTooltip, Object.assign({ style: { marginLeft: `${tooltipMargin}px` } }, { children: tooltipLabel })), !!duration &&
4603
4619
  (marks === null || marks === void 0 ? void 0 : marks.map((bookmark, index) => (jsxRuntime.jsx(Bookmark, Object.assign({}, bookmark), `${index}${bookmark.start}`)))), jsxRuntime.jsx(ProgressBar, { ref: progressRef, progress: progress, handleSkipAhead: handleSkipAhead, duration: duration }), jsxRuntime.jsx(CurrentTimeMarker, { left: progress })] })), jsxRuntime.jsxs(ControlsBar, { children: [jsxRuntime.jsxs(StyledDiv$1, Object.assign({ style: { width: "20%", justifyContent: "start" } }, { children: [jsxRuntime.jsx(AudioButton, {}), jsxRuntime.jsx(TimeLabel, { current: relCurrentTime, duration: duration })] })), jsxRuntime.jsx(ControlsGroupCenter, { style: { width: "60%" } }), jsxRuntime.jsxs(StyledDiv$1, Object.assign({ style: { width: "20%", justifyContent: "end" } }, { children: [jsxRuntime.jsx(Cutter, { onCutHandler: onCutHandler, isCutting: isCutting, i18n: i18n }), jsxRuntime.jsx(FullScreenButton, { container: container })] }))] })] })));
4604
4620
  };
4605
4621
 
@@ -4675,9 +4691,11 @@ const VideoStyle = styled.css `
4675
4691
 
4676
4692
  const Container$1 = styled__default["default"].div `
4677
4693
  position: relative;
4678
- display: flex;
4679
- flex-direction: column;
4680
- justify-content: center;
4694
+ ${({ showControls }) => !showControls && `
4695
+ display: flex;
4696
+ flex-direction: column;
4697
+ justify-content: center;
4698
+ `}
4681
4699
  height: 100%;
4682
4700
  width: 100%;
4683
4701
  video {
@@ -4753,7 +4771,7 @@ const PlayerCore = React.forwardRef((props, forwardRef) => {
4753
4771
  }
4754
4772
  };
4755
4773
  }, [setIsPlaying, videoRef]);
4756
- return (jsxRuntime.jsxs(Container$1, Object.assign({ isLoaded: isLoaded, isPlaying: context.isPlaying, ref: containerRef }, { children: [!isLoaded ? (jsxRuntime.jsx(VideoSpinner, {})) : (jsxRuntime.jsx(FloatingControls, { isPlaying: context.isPlaying, onClick: togglePlay })), jsxRuntime.jsx(Video__default["default"].Player, { className: "player-container" }), jsxRuntime.jsx(ProgressContextProvider, { children: jsxRuntime.jsx(Controls, { container: containerRef.current, onCutHandler: onCutHandler, bookmarks: bookmarks, isCutting: isCutting, onBookMarkUpdated: props.handleBookmarkUpdate, i18n: props.i18n }) })] })));
4774
+ return (jsxRuntime.jsxs(Container$1, Object.assign({ isLoaded: isLoaded, isPlaying: context.isPlaying, ref: containerRef, showControls: props.showControls }, { children: [!isLoaded ? (jsxRuntime.jsx(VideoSpinner, {})) : (jsxRuntime.jsx(FloatingControls, { isPlaying: context.isPlaying, onClick: togglePlay })), jsxRuntime.jsx(Video__default["default"].Player, { className: "player-container" }), jsxRuntime.jsx(ProgressContextProvider, { children: jsxRuntime.jsx(Controls, { container: containerRef.current, onCutHandler: onCutHandler, bookmarks: bookmarks, isCutting: isCutting, onBookMarkUpdated: props.handleBookmarkUpdate, i18n: props.i18n, showControls: props.showControls }) })] })));
4757
4775
  });
4758
4776
 
4759
4777
  const MediaLightBox = ({ header, onClose, slideChange, selectedImageIndex, thumbnails, videoRefs, isOpen, details }) => {
@@ -5610,6 +5628,15 @@ const Searchable = ({ text, }) => {
5610
5628
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
5611
5629
  };
5612
5630
 
5631
+ const CreateObservationButton = styled.styled(Button) `
5632
+ user-select: none;
5633
+ position: absolute;
5634
+ left: ${({ position: { x } }) => x}px;
5635
+ top: ${({ position: { y } }) => y}px;
5636
+ transform: translate(-50%, 0);
5637
+ z-index: ${({ theme }) => theme.levels.front};
5638
+ `;
5639
+
5613
5640
  const StyledWord = styled__default["default"].div `
5614
5641
  display: inline;
5615
5642
  font-size: ${({ theme, size }) => theme.fontSizes[size !== null && size !== void 0 ? size : "md"]};
@@ -5654,7 +5681,13 @@ const Layer = styled__default["default"].div `
5654
5681
  * Use Highlight to use highlight interation on any text element
5655
5682
  */
5656
5683
  const Highlight = (props) => {
5684
+ var _a;
5685
+ const { onSelectionButtonClick, search, i18n } = props;
5657
5686
  const ref = React.useRef(null);
5687
+ const [isSelecting, setIsSelecting] = React.useState(false);
5688
+ const [position, setPosition] = React.useState();
5689
+ const [selection, setSelection] = React.useState();
5690
+ const activeSelection = document.getSelection();
5658
5691
  const extractText = (selection) => {
5659
5692
  if (selection.anchorNode === null || selection.focusNode === null)
5660
5693
  return "";
@@ -5672,28 +5705,55 @@ const Highlight = (props) => {
5672
5705
  };
5673
5706
  const handleSelectionChange = React.useCallback(() => {
5674
5707
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
5675
- const activeSelection = document.getSelection();
5676
- if (!activeSelection) {
5677
- return;
5708
+ if (activeSelection && activeSelection.toString().length > 0) {
5709
+ // Extract the text from the selection cleaning unselectable items
5710
+ const text = extractText(activeSelection);
5711
+ if (!text)
5712
+ return;
5713
+ const anchorNode = (_a = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.anchorNode) === null || _a === void 0 ? void 0 : _a.parentElement;
5714
+ const focusNode = (_b = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.focusNode) === null || _b === void 0 ? void 0 : _b.parentElement;
5715
+ if (anchorNode &&
5716
+ focusNode &&
5717
+ ((_c = ref.current) === null || _c === void 0 ? void 0 : _c.contains(anchorNode)) && // Selection starts inside the ref
5718
+ ((_d = ref.current) === null || _d === void 0 ? void 0 : _d.contains(focusNode)) // Selection ends inside the ref
5719
+ ) {
5720
+ if (props === null || props === void 0 ? void 0 : props.onSelectionButtonClick) {
5721
+ setIsSelecting(true);
5722
+ const range = activeSelection.getRangeAt(0);
5723
+ const rects = range.getClientRects();
5724
+ const lastRect = rects[rects.length - 1];
5725
+ const containerRect = ref && ref.current
5726
+ ? ref.current.getBoundingClientRect()
5727
+ : null;
5728
+ if (!lastRect || !containerRect)
5729
+ return;
5730
+ const relativeY = lastRect.bottom - containerRect.top + ref.current.scrollTop;
5731
+ const relativeX = lastRect.right - containerRect.left + ref.current.scrollLeft;
5732
+ if (relativeY > 0 || relativeX > 0)
5733
+ // Fix to avoid the button to be placed sometimes at the top left corner of the screen (X: 0, Y: 0)
5734
+ setPosition({
5735
+ x: relativeX,
5736
+ y: relativeY + 15,
5737
+ });
5738
+ }
5739
+ else {
5740
+ setIsSelecting(false);
5741
+ }
5742
+ const selectionPart = {
5743
+ from: Math.min(Number.parseFloat((_e = anchorNode.getAttribute("data-start")) !== null && _e !== void 0 ? _e : "0"), Number.parseFloat((_f = focusNode.getAttribute("data-start")) !== null && _f !== void 0 ? _f : "0")),
5744
+ to: Math.max(Number.parseFloat((_g = anchorNode.getAttribute("data-end")) !== null && _g !== void 0 ? _g : "0"), Number.parseFloat((_h = focusNode.getAttribute("data-end")) !== null && _h !== void 0 ? _h : "0")),
5745
+ };
5746
+ (_j = props === null || props === void 0 ? void 0 : props.handleSelection) === null || _j === void 0 ? void 0 : _j.call(props, Object.assign(Object.assign({}, selectionPart), { text }));
5747
+ setSelection(Object.assign(Object.assign({}, selectionPart), { text }));
5748
+ }
5749
+ else {
5750
+ setIsSelecting(false);
5751
+ }
5678
5752
  }
5679
- // Extract the text from the selection cleaning unselectable items
5680
- const text = extractText(activeSelection);
5681
- if (!text)
5682
- return;
5683
- const anchorNode = (_a = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.anchorNode) === null || _a === void 0 ? void 0 : _a.parentElement;
5684
- const focusNode = (_b = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.focusNode) === null || _b === void 0 ? void 0 : _b.parentElement;
5685
- if (anchorNode &&
5686
- focusNode &&
5687
- ((_c = ref.current) === null || _c === void 0 ? void 0 : _c.contains(anchorNode)) && // Selection starts inside the ref
5688
- ((_d = ref.current) === null || _d === void 0 ? void 0 : _d.contains(focusNode)) // Selection ends inside the ref
5689
- ) {
5690
- const selectionPart = {
5691
- from: Math.min(Number.parseFloat((_e = anchorNode.getAttribute("data-start")) !== null && _e !== void 0 ? _e : "0"), Number.parseFloat((_f = focusNode.getAttribute("data-start")) !== null && _f !== void 0 ? _f : "0")),
5692
- to: Math.max(Number.parseFloat((_g = anchorNode.getAttribute("data-end")) !== null && _g !== void 0 ? _g : "0"), Number.parseFloat((_h = focusNode.getAttribute("data-end")) !== null && _h !== void 0 ? _h : "0")),
5693
- };
5694
- (_j = props === null || props === void 0 ? void 0 : props.handleSelection) === null || _j === void 0 ? void 0 : _j.call(props, Object.assign(Object.assign({}, selectionPart), { text }));
5753
+ else {
5754
+ setIsSelecting(false);
5695
5755
  }
5696
- }, [props]);
5756
+ }, [props, activeSelection]);
5697
5757
  React.useEffect(() => {
5698
5758
  if (ref.current === null)
5699
5759
  return;
@@ -5702,7 +5762,10 @@ const Highlight = (props) => {
5702
5762
  document.removeEventListener("selectionchange", handleSelectionChange);
5703
5763
  };
5704
5764
  }, [ref, props, handleSelectionChange]);
5705
- return (jsxRuntime.jsx(HighlightContextProvider, Object.assign({ term: props.search }, { children: jsxRuntime.jsx(WordsContainer, Object.assign({ ref: ref }, { children: props.children })) })));
5765
+ return (jsxRuntime.jsxs(HighlightContextProvider, Object.assign({ term: search }, { children: [jsxRuntime.jsx(WordsContainer, Object.assign({ ref: ref }, { children: props.children })), isSelecting && (jsxRuntime.jsxs(CreateObservationButton, Object.assign({ isAccent: true, isPrimary: true, position: position !== null && position !== void 0 ? position : {
5766
+ x: 0,
5767
+ y: 0,
5768
+ } }, (onSelectionButtonClick && selection && { onClick: () => onSelectionButtonClick(selection) }), { children: [jsxRuntime.jsx(CreateObservationButton.StartIcon, { children: jsxRuntime.jsx(SvgTagStroke, {}) }), (_a = i18n === null || i18n === void 0 ? void 0 : i18n.selectionButtonLabel) !== null && _a !== void 0 ? _a : "Create observation"] })))] })));
5706
5769
  };
5707
5770
  const Word = (props) => {
5708
5771
  const isActive = props.currentTime &&
@@ -0,0 +1,2 @@
1
+ declare const InternalAvatar: () => import("react/jsx-runtime").JSX.Element;
2
+ export default InternalAvatar;
@@ -42,7 +42,7 @@ export interface CommentMedia {
42
42
  type: string;
43
43
  name?: string;
44
44
  isLoadingMedia?: boolean;
45
- isError?: boolean;
45
+ error?: string;
46
46
  url?: string;
47
47
  }
48
48
  export interface FloatingMenuArgs extends Partial<BubbleMenuProps> {
@@ -5,7 +5,7 @@ interface Props {
5
5
  isLoadingMedia?: boolean;
6
6
  removeThumbnail?: () => void;
7
7
  showX?: boolean;
8
- isError?: boolean;
8
+ error?: string;
9
9
  }
10
- declare const Thumbnail: ({ src, type, removeThumbnail, clickThumbnail, showX, isLoadingMedia, isError, }: Props) => import("react/jsx-runtime").JSX.Element;
10
+ declare const Thumbnail: ({ src, type, removeThumbnail, clickThumbnail, showX, isLoadingMedia, error, }: Props) => import("react/jsx-runtime").JSX.Element;
11
11
  export default Thumbnail;
@@ -1,11 +1,3 @@
1
- export interface FileElement {
2
- fileName: string;
3
- fileType: string;
4
- errorCode?: "FILE_TOO_BIG" | "INVALID_FILE_EXTENSION" | "GENERIC_ERROR";
5
- previewUrl: string;
6
- internal_id: string;
7
- isLoadingMedia: boolean;
8
- }
9
1
  interface Props {
10
2
  openLightbox: (index: number) => void;
11
3
  }
@@ -0,0 +1,17 @@
1
+ /// <reference types="react" />
2
+ declare const CreateObservationButton: import("styled-components").IStyledComponent<"web", import("styled-components/dist/types").Substitute<import("../buttons/button/_types").ButtonArgs & import("react").RefAttributes<HTMLButtonElement>, {
3
+ position: {
4
+ x: number;
5
+ y: number;
6
+ };
7
+ }>> & import("react").ForwardRefExoticComponent<import("../buttons/button/_types").ButtonArgs & import("react").RefAttributes<HTMLButtonElement>> & {
8
+ EndIcon: {
9
+ (props: import("@zendeskgarden/react-buttons").IButtonEndIconProps): JSX.Element;
10
+ displayName: string;
11
+ };
12
+ StartIcon: {
13
+ (props: import("@zendeskgarden/react-buttons").IButtonEndIconProps): JSX.Element;
14
+ displayName: string;
15
+ };
16
+ };
17
+ export { CreateObservationButton };
@@ -21,6 +21,14 @@ export interface HighlightArgs {
21
21
  text: string;
22
22
  }) => void;
23
23
  search?: string;
24
+ onSelectionButtonClick?: (part: {
25
+ from: number;
26
+ to: number;
27
+ text: string;
28
+ }) => void;
29
+ i18n?: {
30
+ selectionButtonLabel: string;
31
+ };
24
32
  }
25
33
  export interface Observation extends Omit<IBookmark, "onClick"> {
26
34
  color?: string;
@@ -7,6 +7,7 @@ export interface StoryArgs extends HighlightArgs {
7
7
  includeSearch?: boolean;
8
8
  }
9
9
  export declare const Default: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
10
+ export declare const WithSelectionButton: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
10
11
  export declare const VideoSync: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
11
12
  export declare const WithSearch: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
12
13
  export declare const WithTooltip: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
@@ -9,6 +9,7 @@ export interface PlayerArgs extends HTMLAttributes<HTMLVideoElement> {
9
9
  bookmarks?: IBookmark[];
10
10
  handleBookmarkUpdate?: (bookmark: IBookmark) => void;
11
11
  i18n?: PlayerI18n;
12
+ showControls?: boolean;
12
13
  }
13
14
  export interface PlayerI18n {
14
15
  beforeHighlight?: string;
@@ -27,6 +28,7 @@ export interface IBookmark {
27
28
  export interface WrapperProps {
28
29
  isPlaying?: boolean;
29
30
  isLoaded?: boolean;
31
+ showControls?: boolean;
30
32
  }
31
33
  type VideoTag = {
32
34
  group: {
@@ -2,6 +2,7 @@ import { PlayerArgs } from "./_types";
2
2
  interface PlayerStoryArgs extends PlayerArgs {
3
3
  }
4
4
  export declare const Basic: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
5
+ export declare const ShowControls: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
5
6
  export declare const Streaming: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
6
7
  export declare const WithBookmarks: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
7
8
  declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, PlayerArgs & import("react").RefAttributes<HTMLVideoElement>>;
@@ -268,11 +268,12 @@ export declare const ControlsBar: import("styled-components").IStyledComponent<"
268
268
  onTransitionEnd?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
269
269
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
270
270
  }>;
271
- export declare const Controls: ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, }: {
271
+ export declare const Controls: ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, showControls, }: {
272
272
  container: HTMLDivElement | null;
273
273
  onCutHandler?: ((time: number) => void) | undefined;
274
274
  bookmarks?: IBookmark[] | undefined;
275
275
  isCutting?: boolean | undefined;
276
276
  onBookMarkUpdated?: ((bookmark: IBookmark) => void) | undefined;
277
277
  i18n?: PlayerI18n | undefined;
278
+ showControls?: boolean | undefined;
278
279
  }) => import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appquality/unguess-design-system",
3
- "version": "3.1.98",
3
+ "version": "3.1.99",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",