@appquality/unguess-design-system 3.1.91-alpha-marks → 3.1.91-highlight-obs

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: () => {
@@ -4037,6 +4049,9 @@ const StyledGrabber = styled.styled.div `
4037
4049
  const activeBookMark = styled.css `
4038
4050
  height: 250%;
4039
4051
  transform: translateY(-30%);
4052
+ cursor: pointer;
4053
+ z-index: 2;
4054
+ border-radius: 4px;
4040
4055
 
4041
4056
  ${StyledGrabber} {
4042
4057
  display: block;
@@ -4045,17 +4060,19 @@ const activeBookMark = styled.css `
4045
4060
  const Rect = styled.styled.div `
4046
4061
  position: absolute;
4047
4062
  height: 110%;
4048
- background-color: ${({ hue, theme }) => hue || theme.palette.grey[800]};
4063
+ background-color: ${({ hue, theme }) => getColor(hue || theme.palette.grey[800], undefined, undefined, 0.8)};
4049
4064
  z-index: 1;
4050
4065
  border-radius: 2px;
4066
+ color: white;
4067
+ transition: width 0.1s ease;
4068
+
4051
4069
  &:hover {
4070
+ background-color: ${({ hue, theme }) => hue || theme.palette.grey[800]};
4052
4071
  ${activeBookMark}
4053
- border-radius: 4px;
4054
4072
  }
4055
- color: white;
4056
- ${({ isActive }) => isActive && activeBookMark}
4057
4073
 
4058
- transition: width 0.1s ease;
4074
+ ${({ isActive }) => isActive && activeBookMark}
4075
+ ${({ isFocused }) => isFocused && activeBookMark}
4059
4076
  `;
4060
4077
  const StyledTooltip$1 = styled.styled(Tooltip) `
4061
4078
  margin-bottom: ${({ theme }) => theme.space.sm};
@@ -4087,7 +4104,7 @@ const Bookmark = (props) => {
4087
4104
  }
4088
4105
  if (start > videoEnd || start < videoStart)
4089
4106
  return null;
4090
- 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: {
4091
4108
  left: `${((start - videoStart) / duration) * 100}%`,
4092
4109
  width: `${((end - start) / duration) * 100}%`,
4093
4110
  }, onClick: props.onClick }, { children: [jsxRuntime.jsx(Grabber, { observation: props }), jsxRuntime.jsx(Grabber, { isEnd: true, observation: props })] })) })));
@@ -4295,18 +4312,22 @@ const SvgPlus$1 = props => /*#__PURE__*/React__namespace.createElement("svg", _e
4295
4312
  fill: "currentColor"
4296
4313
  })));
4297
4314
 
4315
+ // Prevent button from breaking on smaller screens
4316
+ const StyledButton$2 = styled.styled(Button) `
4317
+ overflow: visible;
4318
+ `;
4298
4319
  const Cutter = ({ onCutHandler, isCutting, i18n, }) => {
4299
4320
  var _a;
4300
4321
  const { context } = Video.useVideoContext();
4301
4322
  const videoRef = (_a = context.player) === null || _a === void 0 ? void 0 : _a.ref.current;
4302
4323
  if (!onCutHandler)
4303
4324
  return null;
4304
- 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) => {
4305
4326
  if (videoRef) {
4306
4327
  onCutHandler(videoRef.currentTime);
4307
4328
  }
4308
4329
  e.stopPropagation();
4309
- } }, { 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" })] })) })));
4310
4331
  };
4311
4332
 
4312
4333
  var _path$e;
@@ -4473,13 +4494,40 @@ function useDebounce(value, delay) {
4473
4494
  return debouncedValue;
4474
4495
  }
4475
4496
 
4476
- const ControlsWrapper = styled__default["default"].div `
4497
+ const Pin = styled.styled.div `
4498
+ width: 2px;
4499
+ bottom: 0;
4500
+ left: ${({ left }) => `${left}%`};
4477
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;"}
4478
4525
  bottom: 0;
4479
4526
  left: 0;
4480
4527
  right: 0;
4481
4528
  padding: ${({ theme }) => theme.space.xxs} 0;
4482
4529
  background-color: ${({ theme }) => theme.palette.grey[100]};
4530
+ height: 80px;
4483
4531
  ${({ isPlaying }) => isPlaying && "display: none;"}
4484
4532
  z-index: 2;
4485
4533
  `;
@@ -4501,7 +4549,16 @@ const StyledDiv$1 = styled__default["default"].div `
4501
4549
  display: flex;
4502
4550
  align-items: center;
4503
4551
  `;
4504
- const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, }) => {
4552
+ const CurrentTimeMarker = styled__default["default"].div `
4553
+ width: 2px;
4554
+ top: 0;
4555
+ left: ${({ left }) => `${left}%`};
4556
+ position: absolute;
4557
+ height: 110%;
4558
+ z-index: 1;
4559
+ background-color: white;
4560
+ `;
4561
+ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpdated, i18n, showControls = false, }) => {
4505
4562
  var _a, _b, _c;
4506
4563
  const [progress, setProgress] = React.useState(0);
4507
4564
  const [tooltipMargin, setTooltipMargin] = React.useState(0);
@@ -4511,7 +4568,11 @@ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpd
4511
4568
  const progressRef = React.useRef(null);
4512
4569
  const { context, setCurrentTime } = Video.useVideoContext();
4513
4570
  const debouncedMark = useDebounce(updatedMark, 500);
4571
+ const [cutStart, setCutStart] = React.useState(0);
4514
4572
  const { reset, isGrabbing, activeBookmark, fromEnd } = useProgressContext();
4573
+ React.useEffect(() => {
4574
+ setMarks(bookmarks);
4575
+ }, [bookmarks]);
4515
4576
  const relCurrentTime = ((_a = context.player) === null || _a === void 0 ? void 0 : _a.currentTime)
4516
4577
  ? ((_b = context.player) === null || _b === void 0 ? void 0 : _b.currentTime) - context.part.start
4517
4578
  : 0;
@@ -4583,8 +4644,14 @@ const Controls = ({ container, onCutHandler, bookmarks, isCutting, onBookMarkUpd
4583
4644
  onBookMarkUpdated === null || onBookMarkUpdated === void 0 ? void 0 : onBookMarkUpdated(debouncedMark);
4584
4645
  }
4585
4646
  }, [debouncedMark, onBookMarkUpdated]);
4586
- 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 &&
4587
- (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.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 })] }))] })] })));
4588
4655
  };
4589
4656
 
4590
4657
  var _path$c;
@@ -4606,8 +4673,9 @@ const FloatingContainer = styled__default["default"].div `
4606
4673
  top: 0;
4607
4674
  left: 0;
4608
4675
  right: 0;
4609
- ${({ isPlaying }) => isPlaying && "display: none;"}
4610
4676
  z-index: 1;
4677
+ ${({ isPlaying }) => isPlaying && "display: none;"}
4678
+ ${({ showControls }) => showControls ? "height: 100%" : "height: calc(100% - 80px)"};
4611
4679
  `;
4612
4680
  const PlayIcon = styled__default["default"](SvgPlayIcon) ``;
4613
4681
  const BigButton = styled__default["default"](IconButton) `
@@ -4632,8 +4700,8 @@ const ButtonsContainer = styled__default["default"].div `
4632
4700
  height: 100%;
4633
4701
  `;
4634
4702
  const FloatingControls = (props) => {
4635
- const { isPlaying, onClick } = props;
4636
- 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" }) }))) }) })));
4637
4705
  };
4638
4706
 
4639
4707
  const VideoStyle = styled.css `
@@ -4659,9 +4727,13 @@ const VideoStyle = styled.css `
4659
4727
 
4660
4728
  const Container$1 = styled__default["default"].div `
4661
4729
  position: relative;
4662
- display: flex;
4663
- flex-direction: column;
4664
- justify-content: center;
4730
+ ${({ showControls }) => !showControls ? `
4731
+ display: flex;
4732
+ flex-direction: column;
4733
+ justify-content: center;
4734
+ ` : `
4735
+ margin-bottom: 80px;
4736
+ `}
4665
4737
  height: 100%;
4666
4738
  width: 100%;
4667
4739
  video {
@@ -4737,7 +4809,7 @@ const PlayerCore = React.forwardRef((props, forwardRef) => {
4737
4809
  }
4738
4810
  };
4739
4811
  }, [setIsPlaying, videoRef]);
4740
- 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 }) })] })));
4812
+ 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, showControls: props.showControls, 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 }) })] })));
4741
4813
  });
4742
4814
 
4743
4815
  const MediaLightBox = ({ header, onClose, slideChange, selectedImageIndex, thumbnails, videoRefs, isOpen, details }) => {
@@ -5594,65 +5666,139 @@ const Searchable = ({ text, }) => {
5594
5666
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
5595
5667
  };
5596
5668
 
5597
- const StyledWord = styled__default["default"](reactTypography.Span) `
5669
+ const CreateObservationButton = styled.styled(Button) `
5670
+ user-select: none;
5671
+ position: absolute;
5672
+ left: ${({ position: { x } }) => x}px;
5673
+ top: ${({ position: { y } }) => y}px;
5674
+ transform: translate(-50%, 0);
5675
+ z-index: ${({ theme }) => theme.levels.front};
5676
+ `;
5677
+
5678
+ const getFocusedObs = (observations) => {
5679
+ return observations.find((obs) => obs.isFocused);
5680
+ };
5681
+ const StyledWord = styled__default["default"].div `
5682
+ display: inline-block;
5598
5683
  font-size: ${({ theme, size }) => theme.fontSizes[size !== null && size !== void 0 ? size : "md"]};
5599
5684
  padding: ${({ theme }) => theme.space.xxs} 0;
5685
+ position: relative;
5686
+ color: ${({ theme }) => theme.palette.grey[700]};
5687
+ white-space: pre;
5600
5688
 
5601
- ${({ observation, theme }) => {
5602
- var _a, _b;
5603
- return observation &&
5604
- ` user-select: none;
5605
- background-color: ${(_a = observation.hue) !== null && _a !== void 0 ? _a : getColor(theme.palette.azure, 700, undefined, 0.5)};
5606
- color: ${(_b = observation.color) !== null && _b !== void 0 ? _b : "white"};
5689
+ ${({ observations, theme }) => {
5690
+ var _a;
5691
+ return observations && observations.length > 0 &&
5692
+ `
5693
+ color: ${(_a = observations[observations.length - 1].color) !== null && _a !== void 0 ? _a : theme.palette.grey[600]};
5607
5694
  box-sizing: border-box;
5695
+ font-weight: ${getFocusedObs(observations) ? theme.fontWeights.extrabold : theme.fontWeights.semibold};
5696
+ font-style: ${getFocusedObs(observations) ? 'italic' : 'normal'};
5697
+ z-index: 1;
5608
5698
  &:focus {
5609
5699
  outline: none;
5610
5700
  }
5611
-
5612
- + span:not([observation]) {
5613
- margin-left: 2px;
5614
- }
5615
5701
  `;
5616
5702
  }}
5617
5703
  `;
5618
5704
  const ActiveWord = styled__default["default"].span `
5705
+ position: relative;
5706
+ z-index: 2;
5619
5707
  background-color: ${({ theme }) => getColor(theme.palette.fuschia, 400, undefined, 0.4)};
5620
- padding: 0 2px;
5621
5708
  `;
5622
5709
  const WordsContainer = styled__default["default"].div `
5623
5710
  box-sizing: border-box;
5624
5711
  ${StyledWord}, span {
5625
5712
  &::selection {
5626
- background-color: ${({ theme }) => getColor(theme.palette.kale, 700, undefined, 0.5)};
5713
+ background-color: ${({ theme }) => getColor(theme.palette.grey, 400, undefined, 0.5)};
5627
5714
  }
5628
5715
  }
5629
5716
  `;
5717
+ const Layer = styled__default["default"].div `
5718
+ position: absolute;
5719
+ top: 0;
5720
+ left: 0;
5721
+ width: 100%;
5722
+ height: 100%;
5723
+ z-index: 0;
5724
+ background-color: ${({ color }) => getColor(color, undefined, undefined, 0.2)};
5725
+ `;
5630
5726
  /**
5631
5727
  * Use Highlight to use highlight interation on any text element
5632
5728
  */
5633
5729
  const Highlight = (props) => {
5730
+ var _a;
5731
+ const { onSelectionButtonClick, search, i18n, children } = props;
5634
5732
  const ref = React.useRef(null);
5733
+ const [isSelecting, setIsSelecting] = React.useState(false);
5734
+ const [position, setPosition] = React.useState();
5735
+ const [selection, setSelection] = React.useState();
5736
+ const activeSelection = document.getSelection();
5737
+ const extractText = (selection) => {
5738
+ if (selection.anchorNode === null || selection.focusNode === null)
5739
+ return "";
5740
+ var range = selection.getRangeAt(0);
5741
+ var tempDiv = document.createElement("div");
5742
+ tempDiv.appendChild(range.cloneContents());
5743
+ var items = tempDiv.querySelectorAll("div");
5744
+ items.forEach(function (item) {
5745
+ if (item.getAttribute("data-unselectable")) {
5746
+ item.remove();
5747
+ }
5748
+ });
5749
+ var filteredText = tempDiv.textContent || tempDiv.innerText;
5750
+ return filteredText.length ? filteredText.trim() : selection.toString();
5751
+ };
5635
5752
  const handleSelectionChange = React.useCallback(() => {
5636
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
5637
- const activeSelection = document.getSelection();
5638
- const text = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.toString();
5639
- if (!activeSelection || !text) {
5640
- return;
5753
+ var _a, _b, _c, _d, _e, _f, _g, _h;
5754
+ if (activeSelection && activeSelection.toString().length > 0) {
5755
+ // Extract the text from the selection cleaning unselectable items
5756
+ const text = extractText(activeSelection);
5757
+ if (!text)
5758
+ return;
5759
+ const anchorNode = (_a = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.anchorNode) === null || _a === void 0 ? void 0 : _a.parentElement;
5760
+ const focusNode = (_b = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.focusNode) === null || _b === void 0 ? void 0 : _b.parentElement;
5761
+ if (anchorNode &&
5762
+ focusNode &&
5763
+ ((_c = ref.current) === null || _c === void 0 ? void 0 : _c.contains(anchorNode)) && // Selection starts inside the ref
5764
+ ((_d = ref.current) === null || _d === void 0 ? void 0 : _d.contains(focusNode)) // Selection ends inside the ref
5765
+ ) {
5766
+ if (onSelectionButtonClick) {
5767
+ setIsSelecting(true);
5768
+ const range = activeSelection.getRangeAt(0);
5769
+ const rects = range.getClientRects();
5770
+ const lastRect = rects[rects.length - 1];
5771
+ const containerRect = ref && ref.current
5772
+ ? ref.current.getBoundingClientRect()
5773
+ : null;
5774
+ if (!lastRect || !containerRect)
5775
+ return;
5776
+ const relativeY = lastRect.bottom - containerRect.top + ref.current.scrollTop;
5777
+ const relativeX = lastRect.right - containerRect.left + ref.current.scrollLeft;
5778
+ if (relativeY > 0 || relativeX > 0)
5779
+ // Fix to avoid the button to be placed sometimes at the top left corner of the screen (X: 0, Y: 0)
5780
+ setPosition({
5781
+ x: relativeX,
5782
+ y: relativeY + 15,
5783
+ });
5784
+ }
5785
+ else {
5786
+ setIsSelecting(false);
5787
+ }
5788
+ const selectionPart = {
5789
+ 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")),
5790
+ 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")),
5791
+ };
5792
+ setSelection(Object.assign(Object.assign({}, selectionPart), { text }));
5793
+ }
5794
+ else {
5795
+ setIsSelecting(false);
5796
+ }
5641
5797
  }
5642
- const anchorNode = (_a = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.anchorNode) === null || _a === void 0 ? void 0 : _a.parentElement;
5643
- const focusNode = (_b = activeSelection === null || activeSelection === void 0 ? void 0 : activeSelection.focusNode) === null || _b === void 0 ? void 0 : _b.parentElement;
5644
- if (anchorNode &&
5645
- focusNode &&
5646
- ((_c = ref.current) === null || _c === void 0 ? void 0 : _c.contains(anchorNode)) && // Selection starts inside the ref
5647
- ((_d = ref.current) === null || _d === void 0 ? void 0 : _d.contains(focusNode)) // Selection ends inside the ref
5648
- ) {
5649
- const selectionPart = {
5650
- 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")),
5651
- 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")),
5652
- };
5653
- (_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 }));
5798
+ else {
5799
+ setIsSelecting(false);
5654
5800
  }
5655
- }, [props]);
5801
+ }, [onSelectionButtonClick, activeSelection]);
5656
5802
  React.useEffect(() => {
5657
5803
  if (ref.current === null)
5658
5804
  return;
@@ -5661,19 +5807,28 @@ const Highlight = (props) => {
5661
5807
  document.removeEventListener("selectionchange", handleSelectionChange);
5662
5808
  };
5663
5809
  }, [ref, props, handleSelectionChange]);
5664
- return (jsxRuntime.jsx(HighlightContextProvider, Object.assign({ term: props.search }, { children: jsxRuntime.jsx(WordsContainer, Object.assign({ ref: ref }, { children: props.children })) })));
5810
+ 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 : {
5811
+ x: 0,
5812
+ y: 0,
5813
+ }, 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"] })))] })));
5665
5814
  };
5666
5815
  const Word = (props) => {
5667
- var _a;
5668
5816
  const isActive = props.currentTime &&
5669
5817
  props.currentTime >= props.start &&
5670
5818
  props.currentTime < props.end;
5671
- // Is there an observation that contains this word?
5672
- const observation = (_a = props.observations) === null || _a === void 0 ? void 0 : _a.find((obs) => props.start >= obs.start && props.end <= obs.end);
5673
- if (props.tooltipContent !== undefined && !!observation) {
5674
- return (jsxRuntime.jsx(Tooltip, Object.assign({ content: props.tooltipContent(observation), isTransparent: true }, { children: jsxRuntime.jsxs(StyledWord, Object.assign({}, props, { observation: observation, "data-start": props.start, "data-end": props.end, className: !!observation ? "highlighted" : "" }, (!!observation ? { tag: "observation" } : {}), { children: [isActive ? (jsxRuntime.jsx(ActiveWord, { children: jsxRuntime.jsx(Searchable, { text: props.text }) })) : (jsxRuntime.jsx(Searchable, { text: props.text })), " "] })) })));
5819
+ // Are there any observations containing this word?
5820
+ const foundObservations = React.useMemo(() => {
5821
+ var _a, _b;
5822
+ return (_b = (_a = props.observations) === null || _a === void 0 ? void 0 : _a.filter((obs) => props.start >= obs.start && props.end <= obs.end)) !== null && _b !== void 0 ? _b : [];
5823
+ }, [props.observations, props.start, props.end]);
5824
+ 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) => {
5825
+ var _a;
5826
+ return (jsxRuntime.jsx(Layer, { color: (_a = obs.hue) !== null && _a !== void 0 ? _a : theme.palette.grey[600] }, obs.id));
5827
+ }), 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]);
5828
+ if (props.tooltipContent !== undefined && foundObservations.length > 0) {
5829
+ return (jsxRuntime.jsx(Tooltip, Object.assign({ content: props.tooltipContent(foundObservations), isTransparent: true }, { children: ObsWord })));
5675
5830
  }
5676
- return (jsxRuntime.jsxs(StyledWord, Object.assign({}, props, { observation: observation, "data-start": props.start, "data-end": props.end, className: !!observation ? "highlighted" : "" }, (!!observation ? { tag: "observation" } : {}), { children: [isActive ? (jsxRuntime.jsx(ActiveWord, { children: jsxRuntime.jsx(Searchable, { text: props.text }) })) : (jsxRuntime.jsx(Searchable, { text: props.text })), " "] })));
5831
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: ObsWord });
5677
5832
  };
5678
5833
  Highlight.Word = Word;
5679
5834
 
@@ -0,0 +1,2 @@
1
+ declare const InternalAvatar: () => import("react/jsx-runtime").JSX.Element;
2
+ export default InternalAvatar;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { ButtonArgs } from "./_types";
2
3
  export declare const Default: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, ButtonArgs>;
3
4
  export declare const Basic: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, ButtonArgs>;
@@ -8,18 +8,18 @@ export declare const variants: readonly [{}, {
8
8
  readonly disabled: true;
9
9
  }];
10
10
  export declare const Row: import("styled-components").IStyledComponent<"web", {
11
- alignItems?: "start" | "center" | "end" | "baseline" | "stretch" | undefined;
12
- alignItemsXs?: "start" | "center" | "end" | "baseline" | "stretch" | undefined;
13
- alignItemsSm?: "start" | "center" | "end" | "baseline" | "stretch" | undefined;
14
- alignItemsMd?: "start" | "center" | "end" | "baseline" | "stretch" | undefined;
15
- alignItemsLg?: "start" | "center" | "end" | "baseline" | "stretch" | undefined;
16
- alignItemsXl?: "start" | "center" | "end" | "baseline" | "stretch" | undefined;
17
- justifyContent?: "start" | "center" | "end" | "between" | "around" | undefined;
18
- justifyContentXs?: "start" | "center" | "end" | "between" | "around" | undefined;
19
- justifyContentSm?: "start" | "center" | "end" | "between" | "around" | undefined;
20
- justifyContentMd?: "start" | "center" | "end" | "between" | "around" | undefined;
21
- justifyContentLg?: "start" | "center" | "end" | "between" | "around" | undefined;
22
- justifyContentXl?: "start" | "center" | "end" | "between" | "around" | undefined;
11
+ alignItems?: "center" | "start" | "end" | "baseline" | "stretch" | undefined;
12
+ alignItemsXs?: "center" | "start" | "end" | "baseline" | "stretch" | undefined;
13
+ alignItemsSm?: "center" | "start" | "end" | "baseline" | "stretch" | undefined;
14
+ alignItemsMd?: "center" | "start" | "end" | "baseline" | "stretch" | undefined;
15
+ alignItemsLg?: "center" | "start" | "end" | "baseline" | "stretch" | undefined;
16
+ alignItemsXl?: "center" | "start" | "end" | "baseline" | "stretch" | undefined;
17
+ justifyContent?: "center" | "start" | "end" | "between" | "around" | undefined;
18
+ justifyContentXs?: "center" | "start" | "end" | "between" | "around" | undefined;
19
+ justifyContentSm?: "center" | "start" | "end" | "between" | "around" | undefined;
20
+ justifyContentMd?: "center" | "start" | "end" | "between" | "around" | undefined;
21
+ justifyContentLg?: "center" | "start" | "end" | "between" | "around" | undefined;
22
+ justifyContentXl?: "center" | "start" | "end" | "between" | "around" | undefined;
23
23
  wrap?: "wrap" | "nowrap" | "wrap-reverse" | undefined;
24
24
  wrapXs?: "wrap" | "nowrap" | "wrap-reverse" | undefined;
25
25
  wrapSm?: "wrap" | "nowrap" | "wrap-reverse" | undefined;
@@ -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?: "decimal" | "none" | "search" | "text" | "tel" | "url" | "email" | "numeric" | 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;
@@ -299,18 +299,18 @@ 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?: "start" | "center" | "end" | "baseline" | "stretch" | "auto" | undefined;
303
- alignSelfXs?: "start" | "center" | "end" | "baseline" | "stretch" | "auto" | undefined;
304
- alignSelfSm?: "start" | "center" | "end" | "baseline" | "stretch" | "auto" | undefined;
305
- alignSelfMd?: "start" | "center" | "end" | "baseline" | "stretch" | "auto" | undefined;
306
- alignSelfLg?: "start" | "center" | "end" | "baseline" | "stretch" | "auto" | undefined;
307
- alignSelfXl?: "start" | "center" | "end" | "baseline" | "stretch" | "auto" | undefined;
308
- textAlign?: "start" | "center" | "end" | "justify" | undefined;
309
- textAlignXs?: "start" | "center" | "end" | "justify" | undefined;
310
- textAlignSm?: "start" | "center" | "end" | "justify" | undefined;
311
- textAlignMd?: "start" | "center" | "end" | "justify" | undefined;
312
- textAlignLg?: "start" | "center" | "end" | "justify" | undefined;
313
- textAlignXl?: "start" | "center" | "end" | "justify" | 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
+ textAlign?: "center" | "start" | "end" | "justify" | undefined;
309
+ textAlignXs?: "center" | "start" | "end" | "justify" | undefined;
310
+ textAlignSm?: "center" | "start" | "end" | "justify" | undefined;
311
+ textAlignMd?: "center" | "start" | "end" | "justify" | undefined;
312
+ textAlignLg?: "center" | "start" | "end" | "justify" | undefined;
313
+ textAlignXl?: "center" | "start" | "end" | "justify" | undefined;
314
314
  offset?: string | number | undefined;
315
315
  offsetXs?: string | number | undefined;
316
316
  offsetSm?: string | number | 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?: "decimal" | "none" | "search" | "text" | "tel" | "url" | "email" | "numeric" | 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;
@@ -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?: "decimal" | "none" | "search" | "text" | "tel" | "url" | "email" | "numeric" | 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;
@@ -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> {
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { PlaceholderOptions } from "@tiptap/extension-placeholder";
2
3
  import { Editor as TipTapEditor } from "@tiptap/react";
3
4
  import { ChatEditorArgs, CommentMedia, SuggestedUser } from "./_types";
@@ -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
  }
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { DropdownArgs, SelectArgs } from "./_types";
2
3
  import { MenuArgs } from "../menu/_types";
3
4
  interface IItem {
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { EditorArgs } from "./_types";
2
3
  interface EditorStoryArgs extends EditorArgs {
3
4
  children?: any;
@@ -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;
@@ -31,7 +34,6 @@ export interface WordProps extends ISpanProps {
31
34
  currentTime?: number;
32
35
  observations?: Observation[];
33
36
  text: string;
34
- /** Adjusts the font size. By default font size is medium */
35
37
  size?: "xs" | "sm" | "md" | "lg" | "xl" | "xxl" | "xxxl";
36
- tooltipContent?: (observation: Observation) => ReactNode;
38
+ tooltipContent?: (observations: Observation[]) => ReactNode;
37
39
  }
@@ -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;
@@ -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;
@@ -21,12 +22,14 @@ export interface IBookmark {
21
22
  hue?: string;
22
23
  label?: string;
23
24
  tooltipContent?: ReactNode;
25
+ isFocused?: boolean;
24
26
  onClick?: () => void;
25
27
  tags?: VideoTag[];
26
28
  }
27
29
  export interface WrapperProps {
28
30
  isPlaying?: boolean;
29
31
  isLoaded?: boolean;
32
+ showControls?: boolean;
30
33
  }
31
34
  type VideoTag = {
32
35
  group: {
@@ -1,7 +1,9 @@
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 ShowControls: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
5
7
  export declare const Streaming: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
6
8
  export declare const WithBookmarks: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, PlayerStoryArgs>;
7
9
  declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, PlayerArgs & import("react").RefAttributes<HTMLVideoElement>>;
@@ -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-alpha-marks",
3
+ "version": "3.1.91-highlight-obs",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",