@appquality/unguess-design-system 3.1.91-multi-layers → 3.1.91-pip-test

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/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: () => {
@@ -4060,6 +4072,7 @@ const Rect = styled.styled.div `
4060
4072
  }
4061
4073
 
4062
4074
  ${({ isActive }) => isActive && activeBookMark}
4075
+ ${({ isFocused }) => isFocused && activeBookMark}
4063
4076
  `;
4064
4077
  const StyledTooltip$1 = styled.styled(Tooltip) `
4065
4078
  margin-bottom: ${({ theme }) => theme.space.sm};
@@ -4091,7 +4104,7 @@ const Bookmark = (props) => {
4091
4104
  }
4092
4105
  if (start > videoEnd || start < videoStart)
4093
4106
  return null;
4094
- return (jsxRuntime.jsx(StyledTooltip$1, Object.assign({ content: tooltipContent, type: "light", size: "large", isTransparent: true }, { children: jsxRuntime.jsxs(Rect, Object.assign({ isActive: activeBookmark && activeBookmark.id === props.id, hue: hue, style: {
4107
+ return (jsxRuntime.jsx(StyledTooltip$1, Object.assign({ content: tooltipContent, type: "light", size: "large", isTransparent: true }, { children: jsxRuntime.jsxs(Rect, Object.assign({ isActive: activeBookmark && activeBookmark.id === props.id, hue: hue, isFocused: props.isFocused, style: {
4095
4108
  left: `${((start - videoStart) / duration) * 100}%`,
4096
4109
  width: `${((end - start) / duration) * 100}%`,
4097
4110
  }, onClick: props.onClick }, { children: [jsxRuntime.jsx(Grabber, { observation: props }), jsxRuntime.jsx(Grabber, { isEnd: true, observation: props })] })) })));
@@ -4299,18 +4312,22 @@ const SvgPlus$1 = props => /*#__PURE__*/React__namespace.createElement("svg", _e
4299
4312
  fill: "currentColor"
4300
4313
  })));
4301
4314
 
4315
+ // Prevent button from breaking on smaller screens
4316
+ const StyledButton$2 = styled.styled(Button) `
4317
+ overflow: visible;
4318
+ `;
4302
4319
  const Cutter = ({ onCutHandler, isCutting, i18n, }) => {
4303
4320
  var _a;
4304
4321
  const { context } = Video.useVideoContext();
4305
4322
  const videoRef = (_a = context.player) === null || _a === void 0 ? void 0 : _a.ref.current;
4306
4323
  if (!onCutHandler)
4307
4324
  return null;
4308
- return (jsxRuntime.jsx(Button, Object.assign({ isPrimary: true, isAccent: !isCutting, size: "small", onClick: (e) => {
4325
+ return (jsxRuntime.jsx(StyledButton$2, Object.assign({ isPrimary: true, isAccent: !isCutting, size: "small", onClick: (e) => {
4309
4326
  if (videoRef) {
4310
4327
  onCutHandler(videoRef.currentTime);
4311
4328
  }
4312
4329
  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"] })) })));
4330
+ } }, { 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
4331
  };
4315
4332
 
4316
4333
  var _path$e;
@@ -4477,13 +4494,40 @@ function useDebounce(value, delay) {
4477
4494
  return debouncedValue;
4478
4495
  }
4479
4496
 
4480
- const ControlsWrapper = styled__default["default"].div `
4497
+ const Pin = styled.styled.div `
4498
+ width: 2px;
4499
+ bottom: 0;
4500
+ left: ${({ left }) => `${left}%`};
4481
4501
  position: absolute;
4502
+ height: 250%;
4503
+ z-index: 2;
4504
+ background-color: ${({ theme }) => theme.palette.grey[600]};
4505
+ margin-left: -2px; // To not override the current time marker
4506
+
4507
+ &:after {
4508
+ content: "";
4509
+ position: absolute;
4510
+ bottom: 100%;
4511
+ left: 50%;
4512
+ width: 10px;
4513
+ height: 10px;
4514
+ border-radius: 50%;
4515
+ transform: translate(-50%, 0);
4516
+ background-color: ${({ theme }) => theme.palette.grey[600]};
4517
+ }
4518
+ `;
4519
+ const CutStart = ({ left }) => {
4520
+ return jsxRuntime.jsx(Pin, { id: "obs-start-pin", left: left });
4521
+ };
4522
+
4523
+ const ControlsWrapper = styled__default["default"].div `
4524
+ ${({ showControls }) => showControls ? "position: relative;" : "position: absolute;"}
4482
4525
  bottom: 0;
4483
4526
  left: 0;
4484
4527
  right: 0;
4485
4528
  padding: ${({ theme }) => theme.space.xxs} 0;
4486
4529
  background-color: ${({ theme }) => theme.palette.grey[100]};
4530
+ height: 80px;
4487
4531
  ${({ isPlaying }) => isPlaying && "display: none;"}
4488
4532
  z-index: 2;
4489
4533
  `;
@@ -4514,7 +4558,7 @@ const CurrentTimeMarker = styled__default["default"].div `
4514
4558
  z-index: 1;
4515
4559
  background-color: white;
4516
4560
  `;
4517
- const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, }) => {
4561
+ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, showControls = false, }) => {
4518
4562
  var _a, _b, _c;
4519
4563
  const [progress, setProgress] = React.useState(0);
4520
4564
  const [tooltipMargin, setTooltipMargin] = React.useState(0);
@@ -4524,6 +4568,7 @@ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpd
4524
4568
  const progressRef = React.useRef(null);
4525
4569
  const { context, setCurrentTime } = Video.useVideoContext();
4526
4570
  const debouncedMark = useDebounce(updatedMark, 500);
4571
+ const [cutStart, setCutStart] = React.useState(0);
4527
4572
  const { reset, isGrabbing, activeBookmark, fromEnd } = useProgressContext();
4528
4573
  React.useEffect(() => {
4529
4574
  setMarks(bookmarks);
@@ -4599,8 +4644,14 @@ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpd
4599
4644
  onBookMarkUpdated === null || onBookMarkUpdated === void 0 ? void 0 : onBookMarkUpdated(debouncedMark);
4600
4645
  }
4601
4646
  }, [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 &&
4603
- (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 })] }))] })] })));
4647
+ React.useEffect(() => {
4648
+ if (isCutting) {
4649
+ setCutStart(progress);
4650
+ }
4651
+ // eslint-disable-next-line react-hooks/exhaustive-deps
4652
+ }, [isCutting]);
4653
+ 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 &&
4654
+ (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 }), isCutting && jsxRuntime.jsx(CutStart, { left: cutStart }), 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
4655
  };
4605
4656
 
4606
4657
  var _path$c;
@@ -4622,8 +4673,9 @@ const FloatingContainer = styled__default["default"].div `
4622
4673
  top: 0;
4623
4674
  left: 0;
4624
4675
  right: 0;
4625
- ${({ isPlaying }) => isPlaying && "display: none;"}
4626
4676
  z-index: 1;
4677
+ ${({ isPlaying }) => isPlaying && "display: none;"}
4678
+ ${({ showControls }) => showControls ? "height: 100%" : "height: calc(100% - 80px)"};
4627
4679
  `;
4628
4680
  const PlayIcon = styled__default["default"](SvgPlayIcon) ``;
4629
4681
  const BigButton = styled__default["default"](IconButton) `
@@ -4648,8 +4700,8 @@ const ButtonsContainer = styled__default["default"].div `
4648
4700
  height: 100%;
4649
4701
  `;
4650
4702
  const FloatingControls = (props) => {
4651
- const { isPlaying, onClick } = props;
4652
- return (jsxRuntime.jsx(FloatingContainer, Object.assign({ isPlaying: isPlaying, onClick: onClick }, { children: jsxRuntime.jsx(ButtonsContainer, { children: !isPlaying && (jsxRuntime.jsx(BigButton, Object.assign({ isPrimary: true, size: "large" }, { children: jsxRuntime.jsx(PlayIcon, { color: "red" }) }))) }) })));
4703
+ const { isPlaying, showControls, onClick } = props;
4704
+ return (jsxRuntime.jsx(FloatingContainer, Object.assign({ isPlaying: isPlaying, showControls: showControls, onClick: onClick }, { children: jsxRuntime.jsx(ButtonsContainer, { children: !isPlaying && (jsxRuntime.jsx(BigButton, Object.assign({ isPrimary: true, size: "large" }, { children: jsxRuntime.jsx(PlayIcon, { color: "red" }) }))) }) })));
4653
4705
  };
4654
4706
 
4655
4707
  const VideoStyle = styled.css `
@@ -4675,9 +4727,13 @@ const VideoStyle = styled.css `
4675
4727
 
4676
4728
  const Container$1 = styled__default["default"].div `
4677
4729
  position: relative;
4678
- display: flex;
4679
- flex-direction: column;
4680
- justify-content: center;
4730
+ ${({ showControls }) => !showControls ? `
4731
+ display: flex;
4732
+ flex-direction: column;
4733
+ justify-content: center;
4734
+ ` : `
4735
+ margin-bottom: 80px;
4736
+ `}
4681
4737
  height: 100%;
4682
4738
  width: 100%;
4683
4739
  video {
@@ -4724,6 +4780,79 @@ const StyledDiv = styled__default["default"].div `
4724
4780
  `;
4725
4781
  const VideoSpinner = () => (jsxRuntime.jsx(StyledDiv, { children: jsxRuntime.jsx(Spinner, { size: "50", color: "white" }) }));
4726
4782
 
4783
+ const usePictureInPicture = (videoRef, pipMode, onPipChange) => {
4784
+ const getObserver = (videoRef, isVideoPlaying) => {
4785
+ return new IntersectionObserver((entries) => {
4786
+ entries.forEach((entry) => {
4787
+ if (!entry.isIntersecting && isVideoPlaying()) {
4788
+ videoRef.requestPictureInPicture();
4789
+ }
4790
+ if (document.pictureInPictureElement &&
4791
+ entry.isIntersecting &&
4792
+ !isVideoPlaying()) {
4793
+ document.exitPictureInPicture();
4794
+ }
4795
+ });
4796
+ }, { threshold: 0.5 });
4797
+ };
4798
+ const handleManualPipMode = (videoRef, pipMode) => {
4799
+ if (pipMode) {
4800
+ videoRef.requestPictureInPicture();
4801
+ }
4802
+ if (!pipMode && document.pictureInPictureElement) {
4803
+ document.exitPictureInPicture();
4804
+ }
4805
+ };
4806
+ React.useEffect(() => {
4807
+ // bail out if pipMode is not defined or videoRef is not defined or pip is not supported
4808
+ if (typeof pipMode === "undefined")
4809
+ return;
4810
+ if (!document.pictureInPictureEnabled) {
4811
+ console.warn("Picture-in-Picture is not supported in this browser");
4812
+ return;
4813
+ }
4814
+ if (!videoRef)
4815
+ return;
4816
+ // if pipMode is auto, we will enter picture in picture mode when the video is not in view
4817
+ if (pipMode === "auto") {
4818
+ const isVideoPlaying = () => videoRef.currentTime > 0 &&
4819
+ !videoRef.paused &&
4820
+ !videoRef.ended &&
4821
+ videoRef.readyState > 2;
4822
+ const observer = getObserver(videoRef, isVideoPlaying);
4823
+ observer.observe(videoRef);
4824
+ return () => {
4825
+ observer.disconnect();
4826
+ };
4827
+ }
4828
+ else if (typeof pipMode === "boolean") {
4829
+ handleManualPipMode(videoRef, pipMode);
4830
+ }
4831
+ else {
4832
+ handleManualPipMode(videoRef, pipMode());
4833
+ }
4834
+ }, [pipMode, videoRef]);
4835
+ React.useEffect(() => {
4836
+ if (!document.pictureInPictureEnabled) {
4837
+ return;
4838
+ }
4839
+ document.addEventListener("enterpictureinpicture", () => {
4840
+ onPipChange === null || onPipChange === void 0 ? void 0 : onPipChange(true);
4841
+ });
4842
+ document.addEventListener("leavepictureinpicture", () => {
4843
+ onPipChange === null || onPipChange === void 0 ? void 0 : onPipChange(false);
4844
+ });
4845
+ return () => {
4846
+ document.removeEventListener("enterpictureinpicture", () => {
4847
+ onPipChange === null || onPipChange === void 0 ? void 0 : onPipChange(true);
4848
+ });
4849
+ document.removeEventListener("leavepictureinpicture", () => {
4850
+ onPipChange === null || onPipChange === void 0 ? void 0 : onPipChange(false);
4851
+ });
4852
+ };
4853
+ }, [onPipChange]);
4854
+ };
4855
+
4727
4856
  /**
4728
4857
  * The Player is a styled media tag with custom controls
4729
4858
  * <hr>
@@ -4734,11 +4863,14 @@ const Player = React.forwardRef((props, forwardRef) => (jsxRuntime.jsx(Video__de
4734
4863
  const PlayerCore = React.forwardRef((props, forwardRef) => {
4735
4864
  var _a;
4736
4865
  const { context, togglePlay, setIsPlaying } = Video.useVideoContext();
4737
- const { onCutHandler, bookmarks, isCutting } = props;
4866
+ const { onCutHandler, bookmarks, isCutting, pipMode, onPipChange } = props;
4738
4867
  const videoRef = (_a = context.player) === null || _a === void 0 ? void 0 : _a.ref.current;
4739
4868
  const isLoaded = !!videoRef;
4740
4869
  const containerRef = React.useRef(null);
4741
- React.useImperativeHandle(forwardRef, () => videoRef, [videoRef]);
4870
+ React.useImperativeHandle(forwardRef, () => videoRef, [
4871
+ videoRef,
4872
+ ]);
4873
+ usePictureInPicture(videoRef, pipMode, onPipChange);
4742
4874
  React.useEffect(() => {
4743
4875
  if (videoRef) {
4744
4876
  videoRef.addEventListener("pause", () => {
@@ -4754,7 +4886,9 @@ const PlayerCore = React.forwardRef((props, forwardRef) => {
4754
4886
  };
4755
4887
  }, [setIsPlaying, videoRef]);
4756
4888
  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 }) })] })));
4757
- });
4889
+ });
4890
+ const PlayerProvider = (props) => (jsxRuntime.jsx(Video__default["default"], Object.assign({ src: props.url }, props, { children: props.children })));
4891
+ PlayerProvider.Core = PlayerCore;
4758
4892
 
4759
4893
  const MediaLightBox = ({ header, onClose, slideChange, selectedImageIndex, thumbnails, videoRefs, isOpen, details }) => {
4760
4894
  if (!isOpen) {
@@ -5610,11 +5744,25 @@ const Searchable = ({ text, }) => {
5610
5744
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
5611
5745
  };
5612
5746
 
5747
+ const CreateObservationButton = styled.styled(Button) `
5748
+ user-select: none;
5749
+ position: absolute;
5750
+ left: ${({ position: { x } }) => x}px;
5751
+ top: ${({ position: { y } }) => y}px;
5752
+ transform: translate(-50%, 0);
5753
+ z-index: ${({ theme }) => theme.levels.front};
5754
+ `;
5755
+
5756
+ const getFocusedObs = (observations) => {
5757
+ return observations.find((obs) => obs.isFocused);
5758
+ };
5613
5759
  const StyledWord = styled__default["default"].div `
5614
- display: inline;
5760
+ display: inline-block;
5615
5761
  font-size: ${({ theme, size }) => theme.fontSizes[size !== null && size !== void 0 ? size : "md"]};
5616
5762
  padding: ${({ theme }) => theme.space.xxs} 0;
5617
5763
  position: relative;
5764
+ color: ${({ theme }) => theme.palette.grey[700]};
5765
+ white-space: pre;
5618
5766
 
5619
5767
  ${({ observations, theme }) => {
5620
5768
  var _a;
@@ -5622,8 +5770,9 @@ const StyledWord = styled__default["default"].div `
5622
5770
  `
5623
5771
  color: ${(_a = observations[observations.length - 1].color) !== null && _a !== void 0 ? _a : theme.palette.grey[600]};
5624
5772
  box-sizing: border-box;
5625
- font-weight: ${theme.fontWeights.semibold};
5626
-
5773
+ font-weight: ${getFocusedObs(observations) ? theme.fontWeights.extrabold : theme.fontWeights.semibold};
5774
+ font-style: ${getFocusedObs(observations) ? 'italic' : 'normal'};
5775
+ z-index: 1;
5627
5776
  &:focus {
5628
5777
  outline: none;
5629
5778
  }
@@ -5631,14 +5780,15 @@ const StyledWord = styled__default["default"].div `
5631
5780
  }}
5632
5781
  `;
5633
5782
  const ActiveWord = styled__default["default"].span `
5783
+ position: relative;
5784
+ z-index: 2;
5634
5785
  background-color: ${({ theme }) => getColor(theme.palette.fuschia, 400, undefined, 0.4)};
5635
- padding: 0 2px;
5636
5786
  `;
5637
5787
  const WordsContainer = styled__default["default"].div `
5638
5788
  box-sizing: border-box;
5639
5789
  ${StyledWord}, span {
5640
5790
  &::selection {
5641
- background-color: ${({ theme }) => getColor(theme.palette.kale, 700, undefined, 0.5)};
5791
+ background-color: ${({ theme }) => getColor(theme.palette.grey, 400, undefined, 0.5)};
5642
5792
  }
5643
5793
  }
5644
5794
  `;
@@ -5649,13 +5799,19 @@ const Layer = styled__default["default"].div `
5649
5799
  width: 100%;
5650
5800
  height: 100%;
5651
5801
  z-index: 0;
5652
- background-color: ${({ color }) => getColor(color, 700, undefined, 0.5)};
5802
+ background-color: ${({ color }) => getColor(color, undefined, undefined, 0.2)};
5653
5803
  `;
5654
5804
  /**
5655
5805
  * Use Highlight to use highlight interation on any text element
5656
5806
  */
5657
5807
  const Highlight = (props) => {
5808
+ var _a;
5809
+ const { onSelectionButtonClick, search, i18n, children } = props;
5658
5810
  const ref = React.useRef(null);
5811
+ const [isSelecting, setIsSelecting] = React.useState(false);
5812
+ const [position, setPosition] = React.useState();
5813
+ const [selection, setSelection] = React.useState();
5814
+ const activeSelection = document.getSelection();
5659
5815
  const extractText = (selection) => {
5660
5816
  if (selection.anchorNode === null || selection.focusNode === null)
5661
5817
  return "";
@@ -5672,29 +5828,55 @@ const Highlight = (props) => {
5672
5828
  return filteredText.length ? filteredText.trim() : selection.toString();
5673
5829
  };
5674
5830
  const handleSelectionChange = React.useCallback(() => {
5675
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
5676
- const activeSelection = document.getSelection();
5677
- if (!activeSelection) {
5678
- return;
5831
+ var _a, _b, _c, _d, _e, _f, _g, _h;
5832
+ if (activeSelection && activeSelection.toString().length > 0) {
5833
+ // Extract the text from the selection cleaning unselectable items
5834
+ const text = extractText(activeSelection);
5835
+ if (!text)
5836
+ return;
5837
+ const anchorNode = (_a = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.anchorNode) === null || _a === void 0 ? void 0 : _a.parentElement;
5838
+ const focusNode = (_b = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.focusNode) === null || _b === void 0 ? void 0 : _b.parentElement;
5839
+ if (anchorNode &&
5840
+ focusNode &&
5841
+ ((_c = ref.current) === null || _c === void 0 ? void 0 : _c.contains(anchorNode)) && // Selection starts inside the ref
5842
+ ((_d = ref.current) === null || _d === void 0 ? void 0 : _d.contains(focusNode)) // Selection ends inside the ref
5843
+ ) {
5844
+ if (onSelectionButtonClick) {
5845
+ setIsSelecting(true);
5846
+ const range = activeSelection.getRangeAt(0);
5847
+ const rects = range.getClientRects();
5848
+ const lastRect = rects[rects.length - 1];
5849
+ const containerRect = ref && ref.current
5850
+ ? ref.current.getBoundingClientRect()
5851
+ : null;
5852
+ if (!lastRect || !containerRect)
5853
+ return;
5854
+ const relativeY = lastRect.bottom - containerRect.top + ref.current.scrollTop;
5855
+ const relativeX = lastRect.right - containerRect.left + ref.current.scrollLeft;
5856
+ if (relativeY > 0 || relativeX > 0)
5857
+ // Fix to avoid the button to be placed sometimes at the top left corner of the screen (X: 0, Y: 0)
5858
+ setPosition({
5859
+ x: relativeX,
5860
+ y: relativeY + 15,
5861
+ });
5862
+ }
5863
+ else {
5864
+ setIsSelecting(false);
5865
+ }
5866
+ const selectionPart = {
5867
+ 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")),
5868
+ 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")),
5869
+ };
5870
+ setSelection(Object.assign(Object.assign({}, selectionPart), { text }));
5871
+ }
5872
+ else {
5873
+ setIsSelecting(false);
5874
+ }
5679
5875
  }
5680
- // Extract the text from the selection cleaning unselectable items
5681
- const text = extractText(activeSelection);
5682
- if (!text)
5683
- return;
5684
- const anchorNode = (_a = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.anchorNode) === null || _a === void 0 ? void 0 : _a.parentElement;
5685
- const focusNode = (_b = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.focusNode) === null || _b === void 0 ? void 0 : _b.parentElement;
5686
- if (anchorNode &&
5687
- focusNode &&
5688
- ((_c = ref.current) === null || _c === void 0 ? void 0 : _c.contains(anchorNode)) && // Selection starts inside the ref
5689
- ((_d = ref.current) === null || _d === void 0 ? void 0 : _d.contains(focusNode)) // Selection ends inside the ref
5690
- ) {
5691
- const selectionPart = {
5692
- 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")),
5693
- 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")),
5694
- };
5695
- (_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 }));
5876
+ else {
5877
+ setIsSelecting(false);
5696
5878
  }
5697
- }, [props]);
5879
+ }, [onSelectionButtonClick, activeSelection]);
5698
5880
  React.useEffect(() => {
5699
5881
  if (ref.current === null)
5700
5882
  return;
@@ -5703,7 +5885,10 @@ const Highlight = (props) => {
5703
5885
  document.removeEventListener("selectionchange", handleSelectionChange);
5704
5886
  };
5705
5887
  }, [ref, props, handleSelectionChange]);
5706
- return (jsxRuntime.jsx(HighlightContextProvider, Object.assign({ term: props.search }, { children: jsxRuntime.jsx(WordsContainer, Object.assign({ ref: ref }, { children: props.children })) })));
5888
+ return (jsxRuntime.jsxs(HighlightContextProvider, Object.assign({ term: search }, { children: [jsxRuntime.jsx(WordsContainer, Object.assign({ ref: ref }, { children: children })), onSelectionButtonClick && isSelecting && selection && (jsxRuntime.jsxs(CreateObservationButton, Object.assign({ isAccent: true, isPrimary: true, position: position !== null && position !== void 0 ? position : {
5889
+ x: 0,
5890
+ y: 0,
5891
+ }, 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"] })))] })));
5707
5892
  };
5708
5893
  const Word = (props) => {
5709
5894
  const isActive = props.currentTime &&
@@ -5717,7 +5902,7 @@ const Word = (props) => {
5717
5902
  const ObsWord = React.useMemo(() => (jsxRuntime.jsxs(StyledWord, Object.assign({}, props, { "data-start": props.start, "data-end": props.end, className: foundObservations.length > 0 ? "highlighted" : "" }, (foundObservations && { observations: foundObservations }), { children: [foundObservations.length > 0 && foundObservations.map((obs) => {
5718
5903
  var _a;
5719
5904
  return (jsxRuntime.jsx(Layer, { color: (_a = obs.hue) !== null && _a !== void 0 ? _a : theme.palette.grey[600] }, obs.id));
5720
- }), isActive ? (jsxRuntime.jsx(ActiveWord, { children: jsxRuntime.jsx(Searchable, { text: props.text }) })) : (jsxRuntime.jsx(Searchable, { text: props.text })), " "] }))), [props, foundObservations, isActive]);
5905
+ }), isActive ? (jsxRuntime.jsx(ActiveWord, Object.assign({ "data-start": props.start, "data-end": props.end }, { children: jsxRuntime.jsx(Searchable, { text: props.text }) }))) : (jsxRuntime.jsx(Searchable, { text: props.text })), " "] }))), [props, foundObservations, isActive]);
5721
5906
  if (props.tooltipContent !== undefined && foundObservations.length > 0) {
5722
5907
  return (jsxRuntime.jsx(Tooltip, Object.assign({ content: props.tooltipContent(foundObservations), isTransparent: true }, { children: ObsWord })));
5723
5908
  }
@@ -7147,6 +7332,10 @@ Object.defineProperty(exports, 'ModalClose', {
7147
7332
  enumerable: true,
7148
7333
  get: function () { return reactModals.Close; }
7149
7334
  });
7335
+ Object.defineProperty(exports, 'useVideoContext', {
7336
+ enumerable: true,
7337
+ get: function () { return Video.useVideoContext; }
7338
+ });
7150
7339
  exports.Accordion = Accordion;
7151
7340
  exports.Alert = Alert;
7152
7341
  exports.Anchor = Anchor;
@@ -7244,6 +7433,7 @@ exports.Pagination = Pagination;
7244
7433
  exports.Paragraph = Paragraph;
7245
7434
  exports.PieChart = PieChart;
7246
7435
  exports.Player = Player;
7436
+ exports.PlayerProvider = PlayerProvider;
7247
7437
  exports.PreviousItem = PreviousItem;
7248
7438
  exports.ProductCard = ProductCard;
7249
7439
  exports.ProfileModal = ProfileModal;
@@ -0,0 +1,2 @@
1
+ declare const InternalAvatar: () => import("react/jsx-runtime").JSX.Element;
2
+ export default InternalAvatar;
@@ -73,7 +73,7 @@ export declare const Row: import("styled-components").IStyledComponent<"web", {
73
73
  results?: number | undefined;
74
74
  security?: string | undefined;
75
75
  unselectable?: "on" | "off" | undefined;
76
- inputMode?: "text" | "search" | "none" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
76
+ inputMode?: "none" | "search" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
77
77
  is?: string | undefined;
78
78
  "aria-activedescendant"?: string | undefined;
79
79
  "aria-atomic"?: (boolean | "true" | "false") | undefined;
@@ -84,7 +84,7 @@ export declare const Row: import("styled-components").IStyledComponent<"web", {
84
84
  "aria-colindex"?: number | undefined;
85
85
  "aria-colspan"?: number | undefined;
86
86
  "aria-controls"?: string | undefined;
87
- "aria-current"?: boolean | "time" | "true" | "false" | "page" | "step" | "location" | "date" | undefined;
87
+ "aria-current"?: boolean | "true" | "false" | "page" | "step" | "location" | "date" | "time" | undefined;
88
88
  "aria-describedby"?: string | undefined;
89
89
  "aria-details"?: string | undefined;
90
90
  "aria-disabled"?: (boolean | "true" | "false") | undefined;
@@ -93,7 +93,7 @@ export declare const Row: import("styled-components").IStyledComponent<"web", {
93
93
  "aria-expanded"?: (boolean | "true" | "false") | undefined;
94
94
  "aria-flowto"?: string | undefined;
95
95
  "aria-grabbed"?: (boolean | "true" | "false") | undefined;
96
- "aria-haspopup"?: boolean | "dialog" | "menu" | "true" | "false" | "grid" | "listbox" | "tree" | undefined;
96
+ "aria-haspopup"?: boolean | "true" | "false" | "dialog" | "grid" | "listbox" | "menu" | "tree" | undefined;
97
97
  "aria-hidden"?: (boolean | "true" | "false") | undefined;
98
98
  "aria-invalid"?: boolean | "true" | "false" | "grammar" | "spelling" | undefined;
99
99
  "aria-keyshortcuts"?: string | undefined;
@@ -299,12 +299,12 @@ export declare const Col: import("styled-components").IStyledComponent<"web", {
299
299
  md?: string | number | boolean | undefined;
300
300
  lg?: string | number | boolean | undefined;
301
301
  xl?: string | number | boolean | undefined;
302
- alignSelf?: "center" | "auto" | "start" | "end" | "baseline" | "stretch" | undefined;
303
- alignSelfXs?: "center" | "auto" | "start" | "end" | "baseline" | "stretch" | undefined;
304
- alignSelfSm?: "center" | "auto" | "start" | "end" | "baseline" | "stretch" | undefined;
305
- alignSelfMd?: "center" | "auto" | "start" | "end" | "baseline" | "stretch" | undefined;
306
- alignSelfLg?: "center" | "auto" | "start" | "end" | "baseline" | "stretch" | undefined;
307
- alignSelfXl?: "center" | "auto" | "start" | "end" | "baseline" | "stretch" | undefined;
302
+ alignSelf?: "center" | "start" | "end" | "baseline" | "stretch" | "auto" | undefined;
303
+ alignSelfXs?: "center" | "start" | "end" | "baseline" | "stretch" | "auto" | undefined;
304
+ alignSelfSm?: "center" | "start" | "end" | "baseline" | "stretch" | "auto" | undefined;
305
+ alignSelfMd?: "center" | "start" | "end" | "baseline" | "stretch" | "auto" | undefined;
306
+ alignSelfLg?: "center" | "start" | "end" | "baseline" | "stretch" | "auto" | undefined;
307
+ alignSelfXl?: "center" | "start" | "end" | "baseline" | "stretch" | "auto" | undefined;
308
308
  textAlign?: "center" | "start" | "end" | "justify" | undefined;
309
309
  textAlignXs?: "center" | "start" | "end" | "justify" | undefined;
310
310
  textAlignSm?: "center" | "start" | "end" | "justify" | undefined;
@@ -370,7 +370,7 @@ export declare const Col: import("styled-components").IStyledComponent<"web", {
370
370
  results?: number | undefined;
371
371
  security?: string | undefined;
372
372
  unselectable?: "on" | "off" | undefined;
373
- inputMode?: "text" | "search" | "none" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
373
+ inputMode?: "none" | "search" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
374
374
  is?: string | undefined;
375
375
  "aria-activedescendant"?: string | undefined;
376
376
  "aria-atomic"?: (boolean | "true" | "false") | undefined;
@@ -381,7 +381,7 @@ export declare const Col: import("styled-components").IStyledComponent<"web", {
381
381
  "aria-colindex"?: number | undefined;
382
382
  "aria-colspan"?: number | undefined;
383
383
  "aria-controls"?: string | undefined;
384
- "aria-current"?: boolean | "time" | "true" | "false" | "page" | "step" | "location" | "date" | undefined;
384
+ "aria-current"?: boolean | "true" | "false" | "page" | "step" | "location" | "date" | "time" | undefined;
385
385
  "aria-describedby"?: string | undefined;
386
386
  "aria-details"?: string | undefined;
387
387
  "aria-disabled"?: (boolean | "true" | "false") | undefined;
@@ -390,7 +390,7 @@ export declare const Col: import("styled-components").IStyledComponent<"web", {
390
390
  "aria-expanded"?: (boolean | "true" | "false") | undefined;
391
391
  "aria-flowto"?: string | undefined;
392
392
  "aria-grabbed"?: (boolean | "true" | "false") | undefined;
393
- "aria-haspopup"?: boolean | "dialog" | "menu" | "true" | "false" | "grid" | "listbox" | "tree" | undefined;
393
+ "aria-haspopup"?: boolean | "true" | "false" | "dialog" | "grid" | "listbox" | "menu" | "tree" | undefined;
394
394
  "aria-hidden"?: (boolean | "true" | "false") | undefined;
395
395
  "aria-invalid"?: boolean | "true" | "false" | "grammar" | "spelling" | undefined;
396
396
  "aria-keyshortcuts"?: string | undefined;
@@ -640,7 +640,7 @@ export declare const MD: import("styled-components").IStyledComponent<"web", {
640
640
  results?: number | undefined;
641
641
  security?: string | undefined;
642
642
  unselectable?: "on" | "off" | undefined;
643
- inputMode?: "text" | "search" | "none" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
643
+ inputMode?: "none" | "search" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
644
644
  is?: string | undefined;
645
645
  "aria-activedescendant"?: string | undefined;
646
646
  "aria-atomic"?: (boolean | "true" | "false") | undefined;
@@ -651,7 +651,7 @@ export declare const MD: import("styled-components").IStyledComponent<"web", {
651
651
  "aria-colindex"?: number | undefined;
652
652
  "aria-colspan"?: number | undefined;
653
653
  "aria-controls"?: string | undefined;
654
- "aria-current"?: boolean | "time" | "true" | "false" | "page" | "step" | "location" | "date" | undefined;
654
+ "aria-current"?: boolean | "true" | "false" | "page" | "step" | "location" | "date" | "time" | undefined;
655
655
  "aria-describedby"?: string | undefined;
656
656
  "aria-details"?: string | undefined;
657
657
  "aria-disabled"?: (boolean | "true" | "false") | undefined;
@@ -660,7 +660,7 @@ export declare const MD: import("styled-components").IStyledComponent<"web", {
660
660
  "aria-expanded"?: (boolean | "true" | "false") | undefined;
661
661
  "aria-flowto"?: string | undefined;
662
662
  "aria-grabbed"?: (boolean | "true" | "false") | undefined;
663
- "aria-haspopup"?: boolean | "dialog" | "menu" | "true" | "false" | "grid" | "listbox" | "tree" | undefined;
663
+ "aria-haspopup"?: boolean | "true" | "false" | "dialog" | "grid" | "listbox" | "menu" | "tree" | undefined;
664
664
  "aria-hidden"?: (boolean | "true" | "false") | undefined;
665
665
  "aria-invalid"?: boolean | "true" | "false" | "grammar" | "spelling" | undefined;
666
666
  "aria-keyshortcuts"?: string | undefined;
@@ -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 };
@@ -15,12 +15,15 @@ export interface HighlightArgs {
15
15
  isMonospace?: boolean;
16
16
  /** Adjusts the font size. By default font size is medium */
17
17
  size?: "xs" | "sm" | "md" | "lg" | "xl" | "xxl" | "xxxl";
18
- handleSelection?: (part: {
18
+ search?: string;
19
+ onSelectionButtonClick?: (part: {
19
20
  from: number;
20
21
  to: number;
21
22
  text: string;
22
23
  }) => void;
23
- search?: string;
24
+ i18n?: {
25
+ selectionButtonLabel: string;
26
+ };
24
27
  }
25
28
  export interface Observation extends Omit<IBookmark, "onClick"> {
26
29
  color?: string;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { HighlightArgs, WordProps } from "./_types";
2
3
  export interface StoryArgs extends HighlightArgs {
3
4
  words: Array<WordProps & {
@@ -7,9 +8,10 @@ export interface StoryArgs extends HighlightArgs {
7
8
  includeSearch?: boolean;
8
9
  }
9
10
  export declare const Default: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
10
- export declare const VideoSync: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
11
- export declare const WithSearch: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
11
+ export declare const WithSelectionButton: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
12
12
  export declare const WithTooltip: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
13
+ export declare const WithSearch: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
14
+ export declare const VideoSync: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
13
15
  export declare const Demo: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, StoryArgs>;
14
16
  declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, HighlightArgs & {
15
17
  children?: import("react").ReactNode;
@@ -3,12 +3,14 @@ export interface PlayerArgs extends HTMLAttributes<HTMLVideoElement> {
3
3
  url: string;
4
4
  start?: number;
5
5
  end?: number;
6
- enablePipOnScroll?: boolean;
6
+ pipMode?: "auto" | (() => boolean) | boolean;
7
+ onPipChange?: (isPip: boolean) => void;
7
8
  onCutHandler?: (time: number) => void;
8
9
  isCutting?: boolean;
9
10
  bookmarks?: IBookmark[];
10
11
  handleBookmarkUpdate?: (bookmark: IBookmark) => void;
11
12
  i18n?: PlayerI18n;
13
+ showControls?: boolean;
12
14
  }
13
15
  export interface PlayerI18n {
14
16
  beforeHighlight?: string;
@@ -21,12 +23,14 @@ export interface IBookmark {
21
23
  hue?: string;
22
24
  label?: string;
23
25
  tooltipContent?: ReactNode;
26
+ isFocused?: boolean;
24
27
  onClick?: () => void;
25
28
  tags?: VideoTag[];
26
29
  }
27
30
  export interface WrapperProps {
28
31
  isPlaying?: boolean;
29
32
  isLoaded?: boolean;
33
+ showControls?: boolean;
30
34
  }
31
35
  type VideoTag = {
32
36
  group: {
@@ -0,0 +1,4 @@
1
+ import { PlayerArgs } from "../_types";
2
+ type PictureInPictureHook = (videoRef?: HTMLVideoElement | null, pipMode?: PlayerArgs["pipMode"], onPipChange?: PlayerArgs["onPipChange"]) => void;
3
+ export declare const usePictureInPicture: PictureInPictureHook;
4
+ export {};
@@ -1,4 +1,5 @@
1
- /// <reference types="react" />
1
+ import { useVideoContext } from "@appquality/stream-player";
2
+ import { PropsWithChildren } from "react";
2
3
  import { PlayerArgs } from "./_types";
3
4
  /**
4
5
  * The Player is a styled media tag with custom controls
@@ -7,4 +8,8 @@ import { PlayerArgs } from "./_types";
7
8
  - To display a video
8
9
  */
9
10
  declare const Player: import("react").ForwardRefExoticComponent<PlayerArgs & import("react").RefAttributes<HTMLVideoElement>>;
10
- export { Player };
11
+ declare const PlayerProvider: {
12
+ (props: PropsWithChildren<PlayerArgs>): import("react/jsx-runtime").JSX.Element;
13
+ Core: import("react").ForwardRefExoticComponent<PlayerArgs & import("react").RefAttributes<HTMLVideoElement>>;
14
+ };
15
+ export { Player, PlayerProvider, useVideoContext };
@@ -1,8 +1,12 @@
1
+ /// <reference types="react" />
1
2
  import { PlayerArgs } from "./_types";
2
3
  interface PlayerStoryArgs extends PlayerArgs {
3
4
  }
4
5
  export declare const Basic: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
6
+ export declare const AutoPip: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
7
+ export declare const ButtonPip: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
5
8
  export declare const Streaming: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
6
9
  export declare const WithBookmarks: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
10
+ export declare const WithContext: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
7
11
  declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, PlayerArgs & import("react").RefAttributes<HTMLVideoElement>>;
8
12
  export default _default;
@@ -0,0 +1,4 @@
1
+ declare const CutStart: ({ left }: {
2
+ left: number;
3
+ }) => import("react/jsx-runtime").JSX.Element;
4
+ export { CutStart };
@@ -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;
@@ -3,5 +3,6 @@ import { WrapperProps } from "../_types";
3
3
  export declare const FloatingContainer: import("styled-components").IStyledComponent<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, WrapperProps>>;
4
4
  export declare const FloatingControls: (props: {
5
5
  isPlaying?: boolean;
6
+ showControls?: boolean;
6
7
  onClick?: () => void;
7
8
  }) => 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.91-multi-layers",
3
+ "version": "3.1.91-pip-test",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",