box-content-preview 3.98.0 → 3.100.0

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  [![Mergify Status](https://img.shields.io/endpoint.svg?url=https://gh.mergify.io/badges/box/box-content-preview&style=flat)](https://mergify.io)
3
3
  [![Styled With Prettier](https://img.shields.io/badge/styled_with-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
4
4
  [![build status](https://img.shields.io/travis/box/box-content-preview/master.svg?style=flat-square)](https://travis-ci.org/box/box-content-preview)
5
- [![version](https://img.shields.io/badge/version-v3.98.0-blue.svg?style=flat-square)](https://github.com/box/box-content-preview)
5
+ [![version](https://img.shields.io/badge/version-v3.100.0-blue.svg?style=flat-square)](https://github.com/box/box-content-preview)
6
6
  [![npm version](https://img.shields.io/npm/v/box-ui-elements.svg?style=flat-square)](https://www.npmjs.com/package/box-ui-elements)
7
7
 
8
8
  # [Box Content Preview](https://developer.box.com/docs/box-content-preview)
@@ -22,11 +22,11 @@ We encourage all users to update their applications to utilize modern browsers f
22
22
 
23
23
  ## Current Version
24
24
 
25
- - Version: v3.98.0
25
+ - Version: v3.100.0
26
26
  - Locale: en-US
27
27
 
28
- https://cdn01.boxcdn.net/platform/preview/3.98.0/en-US/preview.js
29
- https://cdn01.boxcdn.net/platform/preview/3.98.0/en-US/preview.css
28
+ https://cdn01.boxcdn.net/platform/preview/3.100.0/en-US/preview.js
29
+ https://cdn01.boxcdn.net/platform/preview/3.100.0/en-US/preview.css
30
30
 
31
31
  ## Supported Locales
32
32
 
@@ -52,10 +52,10 @@ You can self-host the Box Content Preview library or reference the versions avai
52
52
  <title>Box Content Preview Demo</title>
53
53
 
54
54
  <!-- Latest version of Preview SDK for your locale -->
55
- <script src="https://cdn01.boxcdn.net/platform/preview/3.98.0/en-US/preview.js"></script>
55
+ <script src="https://cdn01.boxcdn.net/platform/preview/3.100.0/en-US/preview.js"></script>
56
56
  <link
57
57
  rel="stylesheet"
58
- href="https://cdn01.boxcdn.net/platform/preview/3.98.0/en-US/preview.css"
58
+ href="https://cdn01.boxcdn.net/platform/preview/3.100.0/en-US/preview.css"
59
59
  />
60
60
  </head>
61
61
  <body>
@@ -76,7 +76,7 @@ To self-host the Box Content Preview library, follow these steps:
76
76
 
77
77
  1. Either fork the repo and check out the version you want to host or download the specific version as a zip:
78
78
 
79
- - Check out a specific version with `git checkout v3.98.0`
79
+ - Check out a specific version with `git checkout v3.100.0`
80
80
  - Download a specific version as a zip from https://github.com/box/box-content-preview/releases
81
81
 
82
82
  2. Install dependencies and build the library with `yarn install && yarn build:i18n && yarn build:prod`
@@ -62,8 +62,8 @@
62
62
  .bp-WaveformCommentMarkers{position:absolute;top:-2px;right:0;left:0;z-index:4;box-sizing:border-box;height:24px;padding:0 60px;overflow:visible;pointer-events:auto}.bp-WaveformCommentMarkers--zoomed,.bp-WaveformCommentMarkers--tape{padding:0;overflow:clip visible}.bp-WaveformCommentMarkers--tape{top:auto;bottom:100%;margin-bottom:12px}.bp-WaveformCommentMarkers-track{position:relative;width:100%;height:100%;overflow:visible}.bp-WaveformCommentMarkers--zoomed .bp-WaveformCommentMarkers-track,.bp-WaveformCommentMarkers--tape .bp-WaveformCommentMarkers-track{overflow:clip visible}.bp-WaveformCommentMarkers-marker{position:absolute;top:50%;z-index:1;display:flex;align-items:center;justify-content:center;width:auto;height:auto;padding:0;background:none;border:0;border-radius:50%;transform:translate(-50%, -50%);cursor:pointer;appearance:none;pointer-events:auto;overflow:visible;outline:none;transition:box-shadow 150ms}.bp-WaveformCommentMarkers-marker:focus,.bp-WaveformCommentMarkers-marker:focus-visible{outline:none}.bp-WaveformCommentMarkers-marker .bp-MarkerAvatar{overflow:visible;isolation:isolate;cursor:pointer}.bp-WaveformCommentMarkers-marker .bp-MarkerAvatar img{cursor:pointer}.bp-WaveformCommentMarkers-marker .bp-MarkerAvatar::after{position:absolute;z-index:1;inset:0;background:#000;border-radius:50%;opacity:.4;pointer-events:none;content:"";transition:opacity 150ms}.bp-WaveformCommentMarkers-marker>.bp-MarkerAvatar{position:relative;bottom:auto;left:auto;transform:none;transform-origin:center center}.bp-WaveformCommentMarkers-marker .bp-MarkerAvatar:not(.bp-MarkerAvatarStack-overflowBadge),.bp-WaveformCommentMarkers-marker .bp-MarkerAvatarStack .bp-MarkerAvatar:not(.bp-MarkerAvatarStack-overflowBadge){background-color:#000}.bp-WaveformCommentMarkers-marker .bp-MarkerAvatarStack{position:relative;bottom:auto;left:auto;transform:none}.bp-WaveformCommentMarkers-marker--group{width:auto}.bp-WaveformView:hover~.bp-WaveformCommentMarkers .bp-MarkerAvatar::after,.bp-WaveformCommentMarkers:hover .bp-MarkerAvatar::after,.bp-WaveformCommentMarkers:has(:focus-visible) .bp-MarkerAvatar::after,.bp-WaveformCommentMarkers-marker:not(.bp-WaveformCommentMarkers-marker--group).bp-WaveformCommentMarkers-marker--selected .bp-MarkerAvatar::after,.bp-WaveformCommentMarkers .bp-MarkerAvatarStack-item--selected .bp-MarkerAvatar::after{opacity:0}.bp-WaveformCommentMarkers-marker--selected{z-index:3}.bp-WaveformCommentMarkers-marker:hover,.bp-WaveformCommentMarkers-marker:focus-within{z-index:4}.bp-WaveformCommentMarkers .bp-MarkerAvatarStack-item{cursor:pointer;transition:margin 150ms}.bp-WaveformCommentMarkers .bp-MarkerAvatarStack-item:hover,.bp-WaveformCommentMarkers .bp-MarkerAvatarStack-item:focus-visible{z-index:3}@media(prefers-reduced-motion: reduce){.bp-WaveformCommentMarkers-marker,.bp-WaveformCommentMarkers .bp-MarkerAvatarStack-item,.bp-WaveformCommentMarkers-marker .bp-MarkerAvatar::after{transition:none}}
63
63
  .bp-WaveformGeneratingIndicator{display:flex;gap:4px;align-items:center;height:48px;padding:8px 16px 8px 12px;pointer-events:none}.bp-WaveformGeneratingIndicator-bars{display:flex;flex:0 0 24px;align-items:center;justify-content:center;width:24px;height:24px}.bp-WaveformGeneratingIndicator-bar{width:2px;height:10px;background:rgba(255,255,255,.3);border-radius:6px;animation:bp-WaveformGeneratingIndicator-pulse .66s ease-in-out infinite}.bp-WaveformGeneratingIndicator-bar:nth-child(2){margin-left:2px;animation-delay:.1s}.bp-WaveformGeneratingIndicator-bar:last-child{margin-left:2px;animation-delay:.2s}.bp-WaveformGeneratingIndicator-label{color:#fff;font-weight:normal;font-size:14px;line-height:22px;white-space:nowrap}@keyframes bp-WaveformGeneratingIndicator-pulse{0%,80%,100%{background:rgba(255,255,255,.3);transform:scaleY(1.2)}40%{background:#fff;transform:scaleY(1.6)}}@media(prefers-reduced-motion: reduce){.bp-WaveformGeneratingIndicator-bar{animation:none;background:#fff;transform:none}}
64
64
  .bp-WaveformShuttle{position:absolute;top:48px;left:50%;z-index:6;display:flex;gap:4px;align-items:center;height:48px;padding:8px 16px;color:#fff;background:rgba(255,255,255,.1);border-radius:24px;box-shadow:0 2px 12px rgba(0,0,0,.08);transform:translateX(-50%);backdrop-filter:blur(60px);pointer-events:none;-webkit-user-select:none;user-select:none}.bp-WaveformShuttle-glyph{display:block;flex:0 0 auto;width:19px;height:11px}.bp-WaveformShuttle.bp-is-reverse .bp-WaveformShuttle-glyph{transform:scaleX(-1)}.bp-WaveformShuttle-rate{font-weight:500;font-size:14px;line-height:22px;white-space:nowrap}
65
- .bp-WaveformRange{position:absolute;inset:0;z-index:2;pointer-events:none}.bp-WaveformRange-region{position:absolute;top:50%;box-sizing:border-box;height:150px;pointer-events:none;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.4);border-radius:10px;box-shadow:0 0 0 1px #222;transform:translateY(-50%);transition:border-width 100ms ease,border-color 100ms ease}.bp-WaveformRange--swiping .bp-WaveformRange-region{visibility:hidden}.bp-WaveformRange--highlight .bp-WaveformRange-region,.bp-WaveformRange:has(.bp-WaveformRange-handle:hover) .bp-WaveformRange-region,.bp-WaveformRange:has(.bp-WaveformRange-handle--dragging) .bp-WaveformRange-region{border-width:2px;border-color:#fff}.bp-WaveformRange-handle{position:absolute;top:50%;z-index:1;width:24px;height:150px;pointer-events:auto;cursor:ew-resize;touch-action:none;transform:translate(-50%, -50%)}.bp-WaveformRange-handle--end{z-index:2}.bp-WaveformRange-handleGrip{position:absolute;top:50%;left:50%;width:8px;height:20px;background:#fff;border:1px solid #222;border-radius:4px;box-shadow:0 1px 4px rgba(0,0,0,.4);opacity:0;pointer-events:none;transform:translate(-50%, -50%) scale(0.5);transition:opacity 100ms ease-in,transform 100ms ease-in}.bp-WaveformRange-handle:hover .bp-WaveformRange-handleGrip,.bp-WaveformRange-handle:focus-visible .bp-WaveformRange-handleGrip,.bp-WaveformRange-handle--dragging .bp-WaveformRange-handleGrip{opacity:1;transform:translate(-50%, -50%) scale(1);transition:opacity 150ms ease-out,transform 150ms ease-out}.bp-WaveformRange-comment{position:absolute;top:calc(50% - 75px);z-index:5;display:inline-flex;gap:8px;align-items:center;justify-content:center;box-sizing:border-box;height:48px;padding:8px 14px;color:rgba(255,255,255,.8);font-weight:normal;font-size:14px;font-family:Lato,Arial,sans-serif;line-height:22px;letter-spacing:.1px;white-space:nowrap;background:rgba(0,0,0,.8);border:0;backdrop-filter:blur(12px);border-radius:46px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);transform:translate(-50%, calc(-100% - 36px));cursor:pointer;appearance:none;pointer-events:auto}.bp-WaveformRange-commentIcon{display:block;flex:0 0 auto;width:20px;height:20px}.bp-WaveformView--tape .bp-WaveformRange-comment{top:calc(50% - (100% + 10px) / 2)}.bp-WaveformRange-tooltip{position:absolute;top:100%;z-index:3;margin-top:4px;pointer-events:none;transform:translateX(-50%)}.bp-WaveformRange-tooltipTime{padding:4px 10px;color:#fff;font-weight:normal;font-size:14px;font-family:Lato,Arial,sans-serif;line-height:20px;letter-spacing:.3px;white-space:nowrap;background:rgba(34,34,34,.92);border:1px solid rgba(255,255,255,.18);border-radius:8px}@media(prefers-reduced-motion: reduce){.bp-WaveformRange-region,.bp-WaveformRange-handleGrip{transition:none}}
66
- .bp-WaveformView{box-sizing:border-box;width:100%;height:206px;min-height:206px;padding:0 60px;overflow:visible;background:none;-webkit-tap-highlight-color:transparent}.bp-WaveformView.bp-WaveformView--zoomed,.bp-WaveformView.bp-WaveformView--tape{padding:0;touch-action:none}.bp-WaveformView.bp-WaveformView--zoomed .bp-WaveformView-canvas,.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas{overflow:hidden;mask-image:linear-gradient(to right, transparent, #000 92px, #000 calc(100% - 92px), transparent)}.bp-WaveformView.bp-WaveformView--zoomed .bp-WaveformView-canvas>*::part(scroll),.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas>*::part(scroll){overscroll-behavior-x:none}.bp-WaveformView.bp-WaveformView--tape{flex:1 1 auto;height:100%;min-height:0}.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas{height:100%}.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas>*::part(scroll){scrollbar-width:none}.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-playhead,.bp-WaveformView.bp-WaveformView--tape .bp-WaveformRange-region,.bp-WaveformView.bp-WaveformView--tape .bp-WaveformRange-handle{height:calc(100% + 10px)}.bp-WaveformView-track{position:relative;display:flex;align-items:center;width:100%;height:100%;cursor:pointer}.bp-WaveformView-canvas{z-index:0;width:100%;height:140px}.bp-WaveformView-playhead{position:absolute;top:50%;left:0;z-index:1;width:2px;height:150px;pointer-events:none;background:linear-gradient(#2487ff, #006bed);border-radius:1px;box-shadow:0 0 0 1px #222,0 0 10px 0 rgba(36,135,255,.3);transform:translate(-50%, -50%)}.bp-WaveformView-hover{position:absolute;top:100%;z-index:2;margin-top:4px;pointer-events:none;transform:translateX(-50%)}.bp-WaveformView-hover--tape{top:-24px;left:50%;z-index:5;margin-top:0;transform:translate(-50%, -50%)}.bp-WaveformView-hoverTime{padding:4px 10px;color:#fff;font-weight:normal;font-size:14px;font-family:Lato,Arial,sans-serif;line-height:20px;letter-spacing:.3px;white-space:nowrap;background:rgba(34,34,34,.92);border:1px solid rgba(255,255,255,.18);border-radius:8px}.bp-WaveformView--inert{pointer-events:none}.bp-WaveformView--inert .bp-WaveformView-track{cursor:default}.bp-WaveformView--inert .bp-WaveformRange-handle,.bp-WaveformView--inert .bp-WaveformRange-comment{pointer-events:none;cursor:default}.bp-WaveformView:not(:hover) .bp-WaveformRange:not(.bp-WaveformRange--persist){opacity:.4}
65
+ .bp-WaveformRange{position:absolute;inset:0;z-index:2;pointer-events:none}.bp-WaveformRange-region{position:absolute;top:50%;box-sizing:border-box;height:150px;pointer-events:none;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.4);border-radius:10px;box-shadow:0 0 0 1px #222;transform:translateY(-50%);transition:border-width 100ms ease,border-color 100ms ease}.bp-WaveformRange--swiping .bp-WaveformRange-region{visibility:hidden}.bp-WaveformRange--highlight .bp-WaveformRange-region,.bp-WaveformRange:has(.bp-WaveformRange-handle:hover) .bp-WaveformRange-region,.bp-WaveformRange:has(.bp-WaveformRange-handle--dragging) .bp-WaveformRange-region{border-width:2px;border-color:#fff}.bp-WaveformRange-handle{position:absolute;top:50%;z-index:1;width:24px;height:150px;pointer-events:auto;cursor:ew-resize;touch-action:none;transform:translate(-50%, -50%)}.bp-WaveformRange-handle--end{z-index:2}.bp-WaveformRange-handleGrip{position:absolute;top:50%;left:50%;width:8px;height:20px;background:#fff;border:1px solid #222;border-radius:4px;box-shadow:0 1px 4px rgba(0,0,0,.4);opacity:0;pointer-events:none;transform:translate(-50%, -50%) scale(0.5);transition:opacity 100ms ease-in,transform 100ms ease-in}.bp-WaveformRange-handle:hover .bp-WaveformRange-handleGrip,.bp-WaveformRange-handle:focus-visible .bp-WaveformRange-handleGrip,.bp-WaveformRange-handle--dragging .bp-WaveformRange-handleGrip{opacity:1;transform:translate(-50%, -50%) scale(1);transition:opacity 150ms ease-out,transform 150ms ease-out}.bp-WaveformRange-comment{position:absolute;top:calc(50% - 75px);z-index:5;display:inline-flex;gap:8px;align-items:center;justify-content:center;box-sizing:border-box;height:48px;padding:8px 14px;color:rgba(255,255,255,.8);font-weight:normal;font-size:14px;font-family:Lato,Arial,sans-serif;line-height:22px;letter-spacing:.1px;white-space:nowrap;background:rgba(0,0,0,.8);border:0;backdrop-filter:blur(12px);border-radius:46px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);transform:translate(-50%, calc(-100% - 36px));cursor:pointer;appearance:none;pointer-events:auto}.bp-WaveformRange-comment--withClear{gap:4px;padding:8px 8px 8px 12px;cursor:default}.bp-WaveformRange-comment--clearOnly{width:48px;height:48px;padding:0;border-radius:50%}.bp-WaveformRange-commentLabel,.bp-WaveformRange-commentClear{display:inline-flex;align-items:center;justify-content:center;padding:0;color:inherit;font:inherit;letter-spacing:inherit;background:transparent;border:0;cursor:pointer;appearance:none}.bp-WaveformRange-commentLabel{gap:8px;height:32px;padding:0 6px}.bp-WaveformRange-commentDivider{flex:0 0 auto;width:1px;height:16px;background:rgba(255,255,255,.4)}.bp-WaveformRange-commentClear{width:32px;height:32px;border-radius:50%}.bp-WaveformRange-commentIcon{display:block;flex:0 0 auto;width:20px;height:20px;fill:currentcolor}.bp-WaveformView--tape .bp-WaveformRange-comment{top:calc(50% - (100% + 10px) / 2)}.bp-WaveformRange-tooltip{position:absolute;top:100%;z-index:3;margin-top:4px;pointer-events:none;transform:translateX(-50%)}.bp-WaveformRange-tooltipTime{padding:4px 10px;color:#fff;font-weight:normal;font-size:14px;font-family:Lato,Arial,sans-serif;line-height:20px;letter-spacing:.3px;white-space:nowrap;background:rgba(34,34,34,.92);border:1px solid rgba(255,255,255,.18);border-radius:8px}@media(prefers-reduced-motion: reduce){.bp-WaveformRange-region,.bp-WaveformRange-handleGrip{transition:none}}
66
+ .bp-WaveformView{box-sizing:border-box;width:100%;height:206px;min-height:206px;padding:0 60px;overflow:visible;background:none;-webkit-tap-highlight-color:transparent}.bp-WaveformView.bp-WaveformView--zoomed,.bp-WaveformView.bp-WaveformView--tape{padding:0;touch-action:none}.bp-WaveformView.bp-WaveformView--zoomed .bp-WaveformView-canvas,.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas{overflow:hidden;mask-image:linear-gradient(to right, transparent, #000 92px, #000 calc(100% - 92px), transparent)}.bp-WaveformView.bp-WaveformView--zoomed .bp-WaveformView-canvas>*::part(scroll),.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas>*::part(scroll){overscroll-behavior-x:none}.bp-WaveformView.bp-WaveformView--tape{flex:1 1 auto;height:100%;min-height:0;-webkit-touch-callout:none}.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas{height:100%}.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-canvas>*::part(scroll){scrollbar-width:none}.bp-WaveformView.bp-WaveformView--tape .bp-WaveformView-playhead,.bp-WaveformView.bp-WaveformView--tape .bp-WaveformRange-region,.bp-WaveformView.bp-WaveformView--tape .bp-WaveformRange-handle{height:calc(100% + 10px)}.bp-WaveformView-track{position:relative;display:flex;align-items:center;width:100%;height:100%;cursor:pointer}.bp-WaveformView-canvas{z-index:0;width:100%;height:140px}.bp-WaveformView-playhead{position:absolute;top:50%;left:0;z-index:1;width:2px;height:150px;pointer-events:none;background:linear-gradient(#2487ff, #006bed);border-radius:1px;box-shadow:0 0 0 1px #222,0 0 10px 0 rgba(36,135,255,.3);transform:translate(-50%, -50%)}.bp-WaveformView-hover{position:absolute;top:100%;z-index:2;margin-top:4px;pointer-events:none;transform:translateX(-50%)}.bp-WaveformView-hover--tape{top:-24px;left:50%;z-index:5;margin-top:0;transform:translate(-50%, -50%)}.bp-WaveformView-hoverTime{padding:4px 10px;color:#fff;font-weight:normal;font-size:14px;font-family:Lato,Arial,sans-serif;line-height:20px;letter-spacing:.3px;white-space:nowrap;background:rgba(34,34,34,.92);border:1px solid rgba(255,255,255,.18);border-radius:8px}.bp-WaveformView--inert{pointer-events:none}.bp-WaveformView--inert .bp-WaveformView-track{cursor:default}.bp-WaveformView--inert .bp-WaveformRange-handle,.bp-WaveformView--inert .bp-WaveformRange-comment,.bp-WaveformView--inert .bp-WaveformRange-commentLabel,.bp-WaveformView--inert .bp-WaveformRange-commentClear{pointer-events:none;cursor:default}.bp-WaveformView:not(:hover) .bp-WaveformRange:not(.bp-WaveformRange--persist){opacity:.4}
67
67
  .bp-SliderControl{outline:0;position:relative;cursor:pointer}.bp-SliderControl:focus:not(:disabled){box-shadow:inset 0 0 0 1px rgba(211,211,211,.5),0 1px 2px rgba(0,0,0,.1)}.bp-SliderControl:focus-visible:not(:disabled){box-shadow:inset 0 0 0 1px rgba(211,211,211,.5),0 1px 2px rgba(0,0,0,.1)}.bp-SliderControl:focus:not(:focus-visible){box-shadow:none}.bp-SliderControl-thumb{position:absolute;top:calc(50% - 6px);width:12px;height:12px;margin-left:-6px;background:#0061d5;border:0;border-radius:12px;cursor:pointer}.bp-SliderControl-track{position:absolute;inset:0;height:3px;margin:auto 3px;background:transparent linear-gradient(#fff, #fff) no-repeat center border-box}
68
68
  .bp-WaveformZoomControl{display:flex;flex-direction:row;gap:0;align-items:center;justify-content:flex-end;width:48px;height:48px;padding:4px;overflow:hidden;background:rgba(255,255,255,.1);border-radius:32px;box-shadow:0 2px 12px rgba(0,0,0,.08);backdrop-filter:blur(60px);transition:width 150ms ease-out,gap 150ms ease-out}.bp-WaveformZoomControl.bp-has-multiplier{padding:4px 4px 4px 12px}.bp-WaveformZoomControl.bp-has-multiplier:not(.bp-is-open){width:88px}.bp-WaveformZoomControl.bp-is-open{gap:8px;width:207px}.bp-WaveformZoomControl.bp-is-open.bp-has-multiplier{width:264px}.bp-WaveformZoomControl-multiplier{display:flex;flex:0 0 32px;order:-3;align-items:center;justify-content:center;width:32px;height:32px;color:#fff;font-weight:500;font-size:14px;line-height:22px;pointer-events:none;-webkit-user-select:none;user-select:none;white-space:nowrap}.bp-WaveformZoomControl-divider{display:none;flex:0 0 1px;order:-2;width:1px;height:28px;background:rgba(255,255,255,.3)}.bp-WaveformZoomControl.bp-is-open.bp-has-multiplier .bp-WaveformZoomControl-divider{display:block}.bp-WaveformZoomControl-flyout{display:flex;flex:0 0 auto;order:-1;gap:8px;align-items:center;width:0;height:40px;overflow:hidden;transition:width 150ms ease-out}.bp-WaveformZoomControl-flyout.bp-is-open{width:151px}.bp-WaveformZoomControl-slider{width:103px;height:8px}.bp-WaveformZoomControl-slider .bp-SliderControl-track{height:8px;margin:0;background:rgba(255,255,255,.3);background-image:none;border-radius:20px}.bp-WaveformZoomControl-slider .bp-SliderControl-track::after{position:absolute;top:0;left:0;width:calc(8px + 95px * var(--bp-zoom-t, 0));height:8px;background:rgba(255,255,255,.9);border-radius:20px;content:""}.bp-WaveformZoomControl-slider .bp-SliderControl-thumb{display:none}.bp-WaveformZoomControl-button{position:relative;z-index:1;display:flex;flex:0 0 40px;align-items:center;justify-content:center;width:40px;height:40px;padding:0;color:#fff;background:transparent;border:0;border-radius:50%;cursor:pointer}.bp-WaveformZoomControl-button[aria-disabled=true]{cursor:default;opacity:.3}.bp-WaveformZoomControl-button svg{width:20px;height:20px;padding:0}@media(prefers-reduced-motion: reduce){.bp-WaveformZoomControl,.bp-WaveformZoomControl-flyout{transition:none}}
69
69
  .bp-MP3ControlsRoot:has(.bp-MP3ControlsV2){position:absolute;inset:0;width:100%;height:100%;transform:none;pointer-events:none}.bp-MP3ControlsV2{--bp-waveform-bar-min: 140px;position:relative;width:100%;max-width:none;height:100%;background:transparent;pointer-events:none}.bp-MP3ControlsV2-stage{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;min-height:0;pointer-events:none}.bp-MP3ControlsV2-stage .bp-WaveformView,.bp-MP3ControlsV2-stage .bp-MP3ControlsV2-waveform,.bp-MP3ControlsV2-stage .bp-WaveformCommentMarkers{pointer-events:auto}.bp-MP3ControlsV2-waveform{position:relative;width:100%;overflow:visible}.bp-MP3ControlsV2-stage:has(.bp-WaveformView--tape) .bp-MP3ControlsV2-waveform{display:flex;flex-direction:column;height:max(var(--bp-waveform-bar-min, 140px), 25%);min-height:0}.bp-MP3ControlsV2-waveformZoom{position:absolute;top:48px;right:48px;z-index:4;pointer-events:none}.bp-MP3ControlsV2-waveformZoom .bp-WaveformZoomControl{pointer-events:auto}.bp-MP3ControlsV2-playOverlay{position:absolute;top:50%;left:50%;z-index:2;display:flex;align-items:center;justify-content:center;width:80px;height:80px;padding:0;background:rgba(0,0,0,.5);border:0;border-radius:50%;transform:translate(-50%, -50%);cursor:pointer;pointer-events:auto}.bp-MP3ControlsV2-playOverlay svg{width:48px;height:48px;fill:#fff}.bp-MP3ControlsV2-stage .bp-media-buffering-spinner{z-index:2;pointer-events:none}.bp-MP3ControlsV2-bar{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;align-items:center;justify-content:space-between;min-height:32px;padding:30px 58px 25px;background:linear-gradient(to top, black, rgba(0, 0, 0, 0));pointer-events:auto}.bp-MP3ControlsV2-group{display:flex;gap:12px;align-items:center}.bp-MP3ControlsV2-divider{width:1px;height:24px;background-color:rgba(255,255,255,.1);border-radius:1px}.bp-MP3ControlsV2 .bp-MP3Controls-settings{position:relative}.bp-MP3ControlsV2 .bp-MP3Controls-settings .bp-SettingsFlyout{right:15px}.bp-MP3ControlsV2 .bp-MP3Controls-settings .bp-SettingsToggle-button{width:36px;height:40px}
package/dist/lib/index.js CHANGED
@@ -1029,7 +1029,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
1029
1029
  const CLIENT_NAME = "box-content-preview"; // eslint-disable-line no-undef
1030
1030
  const CLIENT_NAME_KEY = 'box_client_name';
1031
1031
  const CLIENT_VERSION_KEY = 'box_client_version';
1032
- const CLIENT_VERSION = "3.98.0"; // eslint-disable-line no-undef
1032
+ const CLIENT_VERSION = "3.100.0"; // eslint-disable-line no-undef
1033
1033
  const HEADER_CLIENT_NAME = 'X-Box-Client-Name';
1034
1034
  const HEADER_CLIENT_VERSION = 'X-Box-Client-Version';
1035
1035
  const PROMISE_MAP = {};
@@ -2027,6 +2027,29 @@ function IconChevronUpMedium24(props) {
2027
2027
 
2028
2028
  /***/ },
2029
2029
 
2030
+ /***/ 8950
2031
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2032
+
2033
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2034
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2035
+ /* harmony export */ });
2036
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1649);
2037
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2038
+
2039
+ function IconExit24(props) {
2040
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({
2041
+ focusable: "false",
2042
+ height: 24,
2043
+ viewBox: "0 0 19 19",
2044
+ width: 24
2045
+ }, props), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
2046
+ d: "m10 8.232 5.227-5.227a.625.625 0 0 1 .884 0l.884.884a.625.625 0 0 1 0 .884L11.767 10l5.228 5.227a.625.625 0 0 1 0 .884l-.884.884a.625.625 0 0 1-.884 0L10 11.767l-5.227 5.228a.625.625 0 0 1-.884 0l-.884-.884a.625.625 0 0 1 0-.884L8.233 10 3.005 4.772a.625.625 0 0 1 0-.883l.884-.884a.625.625 0 0 1 .884 0L10 8.233z"
2047
+ }));
2048
+ }
2049
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (IconExit24);
2050
+
2051
+ /***/ },
2052
+
2030
2053
  /***/ 7502
2031
2054
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2032
2055
 
@@ -5648,6 +5671,8 @@ function IconComment24(props) {
5648
5671
  }));
5649
5672
  }
5650
5673
  /* harmony default export */ const icons_IconComment24 = (IconComment24);
5674
+ // EXTERNAL MODULE: ./src/lib/viewers/controls/icons/IconExit24.tsx
5675
+ var IconExit24 = __webpack_require__(8950);
5651
5676
  ;// ./src/lib/viewers/media/waveform/WaveformRangeSelection.scss
5652
5677
  // extracted by mini-css-extract-plugin
5653
5678
 
@@ -5660,6 +5685,10 @@ function IconComment24(props) {
5660
5685
 
5661
5686
 
5662
5687
 
5688
+
5689
+ function stopRangeEvent(event) {
5690
+ event.stopPropagation();
5691
+ }
5663
5692
  function offsetLeftCss(base, offsetPx) {
5664
5693
  if (!offsetPx) {
5665
5694
  return base;
@@ -5690,6 +5719,7 @@ function applyRegion(el, startSec, endSec, durationSec, viewport, collapsed) {
5690
5719
  el.style.width = `calc(${end} - ${start} + ${constants/* WAVEFORM_RANGE_HANDLE_LINE_PX */.h1}px)`;
5691
5720
  }
5692
5721
  const WaveformRangeSelection = /*#__PURE__*/(0,external_react_.forwardRef)(function WaveformRangeSelection({
5722
+ cameraMode = 'desktop',
5693
5723
  currentTimeSec = 0,
5694
5724
  durationSec,
5695
5725
  getPlayheadSec,
@@ -5697,11 +5727,12 @@ const WaveformRangeSelection = /*#__PURE__*/(0,external_react_.forwardRef)(funct
5697
5727
  interactive = true,
5698
5728
  isHighlighted = false,
5699
5729
  keepHighlight = true,
5700
- onDragCreate,
5701
5730
  onDragChange,
5731
+ onDragCreate,
5702
5732
  onDragPointerX,
5703
5733
  onPreviewChange,
5704
5734
  onRangeChange,
5735
+ onRangeClear,
5705
5736
  range,
5706
5737
  readOnly = false,
5707
5738
  viewport
@@ -5712,6 +5743,8 @@ const WaveformRangeSelection = /*#__PURE__*/(0,external_react_.forwardRef)(funct
5712
5743
  const endHandleRef = (0,external_react_.useRef)(null);
5713
5744
  const tooltipRef = (0,external_react_.useRef)(null);
5714
5745
  const commentRef = (0,external_react_.useRef)(null);
5746
+ const commentButtonRef = commentRef;
5747
+ const commentPillRef = commentRef;
5715
5748
  const dragRef = (0,external_react_.useRef)(null);
5716
5749
  const replayDragRef = (0,external_react_.useRef)(() => undefined);
5717
5750
  const rangeRef = (0,external_react_.useRef)(range);
@@ -5737,7 +5770,9 @@ const WaveformRangeSelection = /*#__PURE__*/(0,external_react_.forwardRef)(funct
5737
5770
  const durationMs = (0,waveform_range/* durationMsFromSec */.uH)(durationSec);
5738
5771
  const displayed = dragRange ?? (0,waveform_range/* resolveRange */.Ss)(range, durationMs);
5739
5772
  displayedRef.current = displayed;
5740
- const showCommentButton = !readOnly && Boolean(onDragCreate) && displayed.startMs !== displayed.endMs && activeHandle == null;
5773
+ const isRangeOpen = displayed.startMs !== displayed.endMs && activeHandle == null;
5774
+ const showCommentButton = !readOnly && Boolean(onDragCreate) && isRangeOpen;
5775
+ const showClearOnly = cameraMode === 'tape' && readOnly && onRangeClear != null && isRangeOpen;
5741
5776
  const syncPositions = (0,external_react_.useCallback)((next, nextViewport, nextDurationSec) => {
5742
5777
  displayedRef.current = next;
5743
5778
  const collapsed = next.startMs === next.endMs;
@@ -5771,7 +5806,7 @@ const WaveformRangeSelection = /*#__PURE__*/(0,external_react_.forwardRef)(funct
5771
5806
  }), [refreshRangePositions]);
5772
5807
  (0,external_react_.useLayoutEffect)(() => {
5773
5808
  syncPositions(displayedRef.current, viewportRef.current, durationSec);
5774
- }, [activeHandle, displayed.endMs, displayed.startMs, durationSec, showCommentButton, syncPositions]);
5809
+ }, [activeHandle, displayed.endMs, displayed.startMs, durationSec, showClearOnly, showCommentButton, syncPositions]);
5775
5810
  (0,external_react_.useLayoutEffect)(() => {
5776
5811
  const next = (0,waveform_viewport/* createWaveformViewport */.eq)({
5777
5812
  durationSec: viewport.durationSec,
@@ -5954,22 +5989,67 @@ const WaveformRangeSelection = /*#__PURE__*/(0,external_react_.forwardRef)(funct
5954
5989
  const tooltipMs = tooltipHandle === 'start' ? displayed.startMs : displayed.endMs;
5955
5990
  const collapsed = displayed.startMs === displayed.endMs;
5956
5991
  const highlight = isHighlighted || collapsed;
5957
- const commentButton = showCommentButton && onDragCreate ? /*#__PURE__*/external_react_["default"].createElement("button", {
5958
- ref: commentRef,
5959
- className: "bp-WaveformRange-comment",
5960
- "data-testid": "bp-waveform-range-comment",
5961
- onClick: event => {
5962
- event.stopPropagation();
5963
- onDragCreate();
5964
- },
5965
- onPointerDown: event => {
5966
- event.stopPropagation();
5967
- },
5968
- type: "button"
5969
- }, /*#__PURE__*/external_react_["default"].createElement(icons_IconComment24, {
5992
+ const commentLabel = /*#__PURE__*/external_react_["default"].createElement(external_react_["default"].Fragment, null, /*#__PURE__*/external_react_["default"].createElement(icons_IconComment24, {
5970
5993
  "aria-hidden": "true",
5971
5994
  className: "bp-WaveformRange-commentIcon"
5972
- }), "Comment") : null;
5995
+ }), "Comment");
5996
+ const isTapeClearAvailable = cameraMode === 'tape' && onRangeClear != null;
5997
+ let commentButton = null;
5998
+ if (showClearOnly && onRangeClear) {
5999
+ commentButton = /*#__PURE__*/external_react_["default"].createElement("button", {
6000
+ ref: commentButtonRef,
6001
+ "aria-label": "Clear",
6002
+ className: "bp-WaveformRange-comment bp-WaveformRange-comment--clearOnly",
6003
+ "data-testid": "bp-waveform-range-clear",
6004
+ onClick: event => {
6005
+ stopRangeEvent(event);
6006
+ onRangeClear();
6007
+ },
6008
+ onPointerDown: stopRangeEvent,
6009
+ onPointerUp: stopRangeEvent,
6010
+ type: "button"
6011
+ }, /*#__PURE__*/external_react_["default"].createElement(IconExit24/* default */.A, {
6012
+ "aria-hidden": "true",
6013
+ className: "bp-WaveformRange-commentIcon"
6014
+ }));
6015
+ } else if (showCommentButton && onDragCreate) {
6016
+ const commentAction = /*#__PURE__*/external_react_["default"].createElement("button", {
6017
+ ref: isTapeClearAvailable ? undefined : commentButtonRef,
6018
+ className: isTapeClearAvailable ? 'bp-WaveformRange-commentLabel' : 'bp-WaveformRange-comment',
6019
+ "data-testid": "bp-waveform-range-comment",
6020
+ onClick: event => {
6021
+ stopRangeEvent(event);
6022
+ onDragCreate();
6023
+ },
6024
+ onPointerDown: stopRangeEvent,
6025
+ onPointerUp: stopRangeEvent,
6026
+ type: "button"
6027
+ }, commentLabel);
6028
+ commentButton = isTapeClearAvailable ? /*#__PURE__*/external_react_["default"].createElement("div", {
6029
+ ref: commentPillRef,
6030
+ className: "bp-WaveformRange-comment bp-WaveformRange-comment--withClear",
6031
+ "data-testid": "bp-waveform-range-comment-pill",
6032
+ onPointerDown: stopRangeEvent,
6033
+ onPointerUp: stopRangeEvent
6034
+ }, commentAction, /*#__PURE__*/external_react_["default"].createElement("span", {
6035
+ "aria-hidden": "true",
6036
+ className: "bp-WaveformRange-commentDivider"
6037
+ }), /*#__PURE__*/external_react_["default"].createElement("button", {
6038
+ "aria-label": "Clear",
6039
+ className: "bp-WaveformRange-commentClear",
6040
+ "data-testid": "bp-waveform-range-clear",
6041
+ onClick: event => {
6042
+ stopRangeEvent(event);
6043
+ onRangeClear();
6044
+ },
6045
+ onPointerDown: stopRangeEvent,
6046
+ onPointerUp: stopRangeEvent,
6047
+ type: "button"
6048
+ }, /*#__PURE__*/external_react_["default"].createElement(IconExit24/* default */.A, {
6049
+ "aria-hidden": "true",
6050
+ className: "bp-WaveformRange-commentIcon"
6051
+ }))) : commentAction;
6052
+ }
5973
6053
  return /*#__PURE__*/external_react_["default"].createElement("div", {
5974
6054
  ref: rootRef,
5975
6055
  className: classnames_default()('bp-WaveformRange', {
@@ -6267,8 +6347,10 @@ function WaveformView({
6267
6347
  const isRangeDraggingRef = (0,external_react_.useRef)(false);
6268
6348
  const rangeRef = (0,external_react_.useRef)(range); // latest committed draft; drag-create must not start on top of an open span
6269
6349
  const createDragRef = (0,external_react_.useRef)(null);
6350
+ const tapeRangeHoldRef = (0,external_react_.useRef)(false); // a tape long-press is waiting to draw; touch must not scroll
6270
6351
  const rangeDragPointerXRef = (0,external_react_.useRef)(null); // clientX while a handle or create-drag is down
6271
6352
  const removeCreateDragListenersRef = (0,external_react_.useRef)(null);
6353
+ const removeTapeContextMenuRef = (0,external_react_.useRef)(null);
6272
6354
  const skipNextSeekRef = (0,external_react_.useRef)(false); // ignore the click fired when a handle is released
6273
6355
  const lastSetTimeSecRef = (0,external_react_.useRef)(null);
6274
6356
  const [isRangeHovered, setIsRangeHovered] = (0,external_react_.useState)(false);
@@ -6293,6 +6375,8 @@ function WaveformView({
6293
6375
  const activeRange = (isRangeDragging ? previewRange ?? createRange : createRange) ?? range;
6294
6376
  const activeRangeRef = (0,external_react_.useRef)(activeRange);
6295
6377
  activeRangeRef.current = activeRange;
6378
+ const viewedRangeRef = (0,external_react_.useRef)(false);
6379
+ viewedRangeRef.current = rangeReadOnly && createRange == null;
6296
6380
  const durationMs = (0,waveform_range/* durationMsFromSec */.uH)(durationSec);
6297
6381
  const rangeStartMs = activeRange?.startMs;
6298
6382
  const rangeEndMs = activeRange?.endMs;
@@ -6378,6 +6462,20 @@ function WaveformView({
6378
6462
  widthPx: viewport.widthPx,
6379
6463
  zoomLevel: viewport.zoomLevel
6380
6464
  });
6465
+ const drag = createDragRef.current;
6466
+ const clientX = rangeDragPointerXRef.current;
6467
+ const track = trackRef.current;
6468
+ if (!drag?.active || clientX == null || !track) {
6469
+ return;
6470
+ }
6471
+ const playheadSec = mediaElRef.current ? mediaElRef.current.currentTime : currentTimeRef.current;
6472
+ const drawn = drawnRangeFromMove(drag, clientX, track, viewportRef.current, playheadSec, durationSecRef.current);
6473
+ if (drawn.startMs === drag.range?.startMs && drawn.endMs === drag.range?.endMs) {
6474
+ return;
6475
+ }
6476
+ drag.range = drawn;
6477
+ setCreateRange(drawn);
6478
+ setPreviewRange(drawn);
6381
6479
  }, [viewport]);
6382
6480
  const setZoomLevel = (0,external_react_.useCallback)(nextZoom => {
6383
6481
  const zoom = (0,waveform_viewport/* clampWaveformZoom */.ii)(nextZoom, maxZoom);
@@ -6555,7 +6653,8 @@ function WaveformView({
6555
6653
  }
6556
6654
  const rangeDraft = activeRangeRef.current;
6557
6655
  const timeSec = relativeX * durationSecRef.current;
6558
- if (rangeDraft && !(0,waveform_range/* isRangeCollapsed */.BT)(rangeDraft)) {
6656
+ // A tape draft dismisses from the pill. A viewed range, and desktop, still clear on click-outside.
6657
+ if ((cameraModeRef.current !== 'tape' || viewedRangeRef.current) && rangeDraft && !(0,waveform_range/* isRangeCollapsed */.BT)(rangeDraft)) {
6559
6658
  const pointerX = (0,waveform_viewport/* positionPxFromTime */.TO)(timeSec, viewportRef.current);
6560
6659
  if (!(0,waveform_range/* isPointerOverRange */.H5)({
6561
6660
  pointerX,
@@ -6840,6 +6939,10 @@ function WaveformView({
6840
6939
  markPointerZoom();
6841
6940
  };
6842
6941
  const onTouchMove = event => {
6942
+ // A tape hold or range drag owns the touch. A desktop press can still scroll.
6943
+ if (cameraModeRef.current === 'tape' && (tapeRangeHoldRef.current || createDragRef.current)) {
6944
+ event.preventDefault();
6945
+ }
6843
6946
  const pinch = pinchStartRef.current;
6844
6947
  if (!interactiveRef.current || !hasZoomHandlersRef.current || !pinch || event.touches.length !== 2 || !(pinch.distance > 0)) {
6845
6948
  return;
@@ -6982,6 +7085,7 @@ function WaveformView({
6982
7085
  (0,external_react_.useEffect)(() => {
6983
7086
  return () => {
6984
7087
  removeCreateDragListenersRef.current?.();
7088
+ removeTapeContextMenuRef.current?.();
6985
7089
  if (createDragRef.current?.active) {
6986
7090
  createDragRef.current = null;
6987
7091
  onRangeDragChangeRef.current?.(false);
@@ -6994,26 +7098,20 @@ function WaveformView({
6994
7098
  }
6995
7099
  setCreateRange(current => current == null ? current : null);
6996
7100
  }, [range]);
6997
- const onTrackPointerDown = (0,external_react_.useCallback)(event => {
6998
- if (cameraModeRef.current === 'tape' || !interactiveRef.current || event.button > 0 || event.ctrlKey || event.metaKey || isRangeDraggingRef.current || createDragRef.current) {
6999
- return;
7000
- }
7001
- const {
7002
- target
7003
- } = event;
7004
- if (target instanceof Element && target.closest('[data-testid="bp-waveform-range-handle-start"], [data-testid="bp-waveform-range-handle-end"], [data-testid="bp-waveform-range-comment"]')) {
7005
- return;
7006
- }
7007
- const drag = rangeCreateDragFromEvent(event, {
7008
- durationSec: durationSecRef.current,
7009
- range: rangeRef.current,
7010
- track: trackRef.current,
7011
- viewport: viewportRef.current
7012
- });
7013
- if (!drag) {
7014
- return;
7015
- }
7101
+ const startRangeCreateDrag = (0,external_react_.useCallback)((drag, capture) => {
7016
7102
  createDragRef.current = drag;
7103
+ rangeDragPointerXRef.current = drag.originX;
7104
+ const track = trackRef.current;
7105
+ if (capture && track && typeof track.setPointerCapture === 'function') {
7106
+ try {
7107
+ track.setPointerCapture(drag.pointerId);
7108
+ } catch (error) {
7109
+ const lostPointer = error instanceof DOMException && (error.name === 'NotFoundError' || error.name === 'InvalidStateError');
7110
+ if (!lostPointer) {
7111
+ console.warn('Pointer capture failed', error); // eslint-disable-line no-console
7112
+ }
7113
+ }
7114
+ }
7017
7115
  const onMove = moveEvent => {
7018
7116
  if (createDragRef.current !== drag || moveEvent.pointerId !== drag.pointerId) {
7019
7117
  return;
@@ -7021,16 +7119,24 @@ function WaveformView({
7021
7119
  if (!Number.isFinite(moveEvent.clientX)) {
7022
7120
  return;
7023
7121
  }
7122
+ // Capture runs before WaveSurfer's document drag, which stops the event after a few pixels.
7123
+ if (capture) {
7124
+ moveEvent.preventDefault();
7125
+ moveEvent.stopPropagation();
7126
+ }
7127
+ rangeDragPointerXRef.current = moveEvent.clientX;
7024
7128
  if (!drag.active && Math.abs(moveEvent.clientX - drag.originX) < constants/* WAVEFORM_RANGE_CREATE_DRAG_PX */.B4) {
7025
7129
  return;
7026
7130
  }
7027
- const track = trackRef.current;
7028
- if (!track) {
7131
+ const moveTrack = trackRef.current;
7132
+ if (!moveTrack) {
7029
7133
  return;
7030
7134
  }
7031
- moveEvent.preventDefault();
7135
+ if (!capture) {
7136
+ moveEvent.preventDefault();
7137
+ }
7032
7138
  const playheadSec = mediaElRef.current ? mediaElRef.current.currentTime : currentTimeRef.current;
7033
- drag.range = drawnRangeFromMove(drag, moveEvent.clientX, track, viewportRef.current, playheadSec, durationSecRef.current);
7139
+ drag.range = drawnRangeFromMove(drag, moveEvent.clientX, moveTrack, viewportRef.current, playheadSec, durationSecRef.current);
7034
7140
  if (!drag.active) {
7035
7141
  drag.active = true;
7036
7142
  handleRangeDragChange(true);
@@ -7040,9 +7146,13 @@ function WaveformView({
7040
7146
  };
7041
7147
  let onUp = () => undefined;
7042
7148
  const removeListeners = () => {
7043
- window.removeEventListener('pointermove', onMove);
7044
- window.removeEventListener('pointerup', onUp);
7045
- window.removeEventListener('pointercancel', onUp);
7149
+ window.removeEventListener('pointermove', onMove, capture);
7150
+ window.removeEventListener('pointerup', onUp, capture);
7151
+ window.removeEventListener('pointercancel', onUp, capture);
7152
+ const captured = trackRef.current;
7153
+ if (capture && captured && typeof captured.hasPointerCapture === 'function' && captured.hasPointerCapture(drag.pointerId)) {
7154
+ captured.releasePointerCapture(drag.pointerId);
7155
+ }
7046
7156
  if (removeCreateDragListenersRef.current === removeListeners) {
7047
7157
  removeCreateDragListenersRef.current = null;
7048
7158
  }
@@ -7056,6 +7166,8 @@ function WaveformView({
7056
7166
  createDragRef.current = null;
7057
7167
  removeListeners();
7058
7168
  if (!wasActive || !drawn) {
7169
+ // This pointerup still reaches the tape track. Swallow it so a still hold does not play.
7170
+ suppressTapToPlayPause();
7059
7171
  return;
7060
7172
  }
7061
7173
  const committed = (0,waveform_range/* commitRangeChange */.dG)(drawn);
@@ -7066,10 +7178,107 @@ function WaveformView({
7066
7178
  handleRangeDragChange(false);
7067
7179
  };
7068
7180
  removeCreateDragListenersRef.current = removeListeners;
7069
- window.addEventListener('pointermove', onMove);
7070
- window.addEventListener('pointerup', onUp);
7071
- window.addEventListener('pointercancel', onUp);
7072
- }, [handleRangeDragChange]);
7181
+ window.addEventListener('pointermove', onMove, capture);
7182
+ window.addEventListener('pointerup', onUp, capture);
7183
+ window.addEventListener('pointercancel', onUp, capture);
7184
+ }, [handleRangeDragChange, suppressTapToPlayPause]);
7185
+ const onTrackPointerDown = (0,external_react_.useCallback)(event => {
7186
+ if (!interactiveRef.current || event.button > 0 || event.ctrlKey || event.metaKey || isRangeDraggingRef.current || createDragRef.current) {
7187
+ return;
7188
+ }
7189
+ const {
7190
+ target
7191
+ } = event;
7192
+ if (target instanceof Element && target.closest('.bp-WaveformRange-handle, .bp-WaveformRange-comment')) {
7193
+ return;
7194
+ }
7195
+ const drag = rangeCreateDragFromEvent(event, {
7196
+ durationSec: durationSecRef.current,
7197
+ range: rangeRef.current,
7198
+ track: trackRef.current,
7199
+ viewport: viewportRef.current
7200
+ });
7201
+ if (!drag) {
7202
+ return;
7203
+ }
7204
+ if (cameraModeRef.current !== 'tape') {
7205
+ startRangeCreateDrag(drag, false);
7206
+ return;
7207
+ }
7208
+ const suppressContextMenu = menuEvent => {
7209
+ menuEvent.preventDefault();
7210
+ };
7211
+ let endPointer = () => undefined;
7212
+ const removeContextMenu = () => {
7213
+ window.removeEventListener('contextmenu', suppressContextMenu, true);
7214
+ window.removeEventListener('pointerup', endPointer, true);
7215
+ window.removeEventListener('pointercancel', endPointer, true);
7216
+ if (removeTapeContextMenuRef.current === removeContextMenu) {
7217
+ removeTapeContextMenuRef.current = null;
7218
+ }
7219
+ };
7220
+ endPointer = endEvent => {
7221
+ if (endEvent.pointerId !== drag.pointerId) {
7222
+ return;
7223
+ }
7224
+ removeContextMenu();
7225
+ };
7226
+ removeTapeContextMenuRef.current = removeContextMenu;
7227
+ window.addEventListener('contextmenu', suppressContextMenu, true);
7228
+ window.addEventListener('pointerup', endPointer, true);
7229
+ window.addEventListener('pointercancel', endPointer, true);
7230
+ const originY = event.clientY;
7231
+ let holdPending = true;
7232
+ let longPressTimer = 0;
7233
+ let onHoldMove = () => undefined;
7234
+ let onHoldEnd = () => undefined;
7235
+ const cancelHold = () => {
7236
+ if (!holdPending) {
7237
+ return;
7238
+ }
7239
+ holdPending = false;
7240
+ tapeRangeHoldRef.current = false;
7241
+ window.clearTimeout(longPressTimer);
7242
+ window.removeEventListener('pointermove', onHoldMove, true);
7243
+ window.removeEventListener('pointerup', onHoldEnd, true);
7244
+ window.removeEventListener('pointercancel', onHoldEnd, true);
7245
+ if (removeCreateDragListenersRef.current === cancelHold) {
7246
+ removeCreateDragListenersRef.current = null;
7247
+ }
7248
+ };
7249
+ onHoldMove = moveEvent => {
7250
+ if (!holdPending || moveEvent.pointerId !== drag.pointerId) {
7251
+ return;
7252
+ }
7253
+ const moved = Math.hypot(moveEvent.clientX - drag.originX, moveEvent.clientY - originY);
7254
+ if (moved >= constants/* WAVEFORM_TAPE_RANGE_LONG_PRESS_CANCEL_PX */.Oe) {
7255
+ cancelHold();
7256
+ return;
7257
+ }
7258
+ // A smaller drift must not scroll the tape. The move that cancels the hold stays a swipe.
7259
+ moveEvent.preventDefault();
7260
+ moveEvent.stopPropagation();
7261
+ };
7262
+ onHoldEnd = upEvent => {
7263
+ if (upEvent.pointerId !== drag.pointerId) {
7264
+ return;
7265
+ }
7266
+ cancelHold();
7267
+ };
7268
+ tapeRangeHoldRef.current = true;
7269
+ longPressTimer = window.setTimeout(() => {
7270
+ if (!holdPending) {
7271
+ return;
7272
+ }
7273
+ cancelHold();
7274
+ suppressTapToPlayPause();
7275
+ startRangeCreateDrag(drag, true);
7276
+ }, constants/* WAVEFORM_TAPE_RANGE_LONG_PRESS_MS */.RQ);
7277
+ removeCreateDragListenersRef.current = cancelHold;
7278
+ window.addEventListener('pointermove', onHoldMove, true);
7279
+ window.addEventListener('pointerup', onHoldEnd, true);
7280
+ window.addEventListener('pointercancel', onHoldEnd, true);
7281
+ }, [suppressTapToPlayPause, startRangeCreateDrag]);
7073
7282
  const bindOverlayPortalHost = (0,external_react_.useCallback)(node => {
7074
7283
  const host = node?.parentElement ?? null;
7075
7284
  setOverlayPortalHost(prev => prev === host ? prev : host);
@@ -7122,6 +7331,7 @@ function WaveformView({
7122
7331
  "data-testid": "bp-waveform-playhead"
7123
7332
  }), showRangeOverlay && overlayRange && /*#__PURE__*/external_react_["default"].createElement(waveform_WaveformRangeSelection, {
7124
7333
  ref: rangeLayerRef,
7334
+ cameraMode: cameraMode,
7125
7335
  currentTimeSec: currentTime,
7126
7336
  durationSec: durationSec,
7127
7337
  getPlayheadSec: getPlayheadSec,
@@ -7136,6 +7346,7 @@ function WaveformView({
7136
7346
  },
7137
7347
  onPreviewChange: setPreviewRange,
7138
7348
  onRangeChange: interactive && !isOverlayReadOnly ? onRangeChange : undefined,
7349
+ onRangeClear: onRangeClear,
7139
7350
  range: overlayRange,
7140
7351
  readOnly: isOverlayReadOnly,
7141
7352
  viewport: viewport
@@ -7705,7 +7916,9 @@ function isFpsAvailable(player) {
7705
7916
  /* harmony export */ Lu: () => (/* binding */ WAVEFORM_BAR_GAP),
7706
7917
  /* harmony export */ MR: () => (/* binding */ WAVEFORM_RANGE_EDGE_ZONE_PX),
7707
7918
  /* harmony export */ NM: () => (/* binding */ WAVEFORM_FOLLOW_INSET_PX),
7919
+ /* harmony export */ Oe: () => (/* binding */ WAVEFORM_TAPE_RANGE_LONG_PRESS_CANCEL_PX),
7708
7920
  /* harmony export */ QD: () => (/* binding */ WAVEFORM_ZOOM_BUTTON_STEP),
7921
+ /* harmony export */ RQ: () => (/* binding */ WAVEFORM_TAPE_RANGE_LONG_PRESS_MS),
7709
7922
  /* harmony export */ VS: () => (/* binding */ WAVEFORM_RANGE_EDGE_SCROLL_AUDIO_SEC_PER_SEC),
7710
7923
  /* harmony export */ XS: () => (/* binding */ WAVEFORM_BAR_MIN_HEIGHT),
7711
7924
  /* harmony export */ Zs: () => (/* binding */ WAVEFORM_FOLLOW_SCROLL_SETTLE_MS),
@@ -7793,6 +8006,10 @@ const WAVEFORM_RANGE_SNAP_PX = 8;
7793
8006
  const WAVEFORM_RANGE_MIN_DURATION_MS = 250;
7794
8007
  /** Pointer travel before a waveform press becomes a new draft range. Shorter presses stay click-to-seek. */
7795
8008
  const WAVEFORM_RANGE_CREATE_DRAG_PX = 4;
8009
+ /** Hold on the tape waveform before a press can draw a new range. A move sooner stays a swipe. */
8010
+ const WAVEFORM_TAPE_RANGE_LONG_PRESS_MS = 500;
8011
+ /** Pointer travel during that hold that cancels it. */
8012
+ const WAVEFORM_TAPE_RANGE_LONG_PRESS_CANCEL_PX = 10;
7796
8013
  /** Drag a handle inside this many CSS pixels of either view edge and the tape scrolls. */
7797
8014
  const WAVEFORM_RANGE_EDGE_ZONE_PX = 100;
7798
8015
  /** Audio seconds moved per wall-clock second when the pointer is on the view edge. */
@@ -24883,7 +25100,7 @@ class Browser {
24883
25100
  ;// ./src/lib/Logger.js
24884
25101
  /* eslint-disable no-undef */
24885
25102
  const CLIENT_NAME = "box-content-preview";
24886
- const CLIENT_VERSION = "3.98.0";
25103
+ const CLIENT_VERSION = "3.100.0";
24887
25104
  /* eslint-enable no-undef */
24888
25105
 
24889
25106
  class Logger {
@@ -28395,20 +28612,8 @@ function IconPencilScribbleMedium24(_ref) {
28395
28612
  }));
28396
28613
  }
28397
28614
  /* harmony default export */ const icons_IconPencilScribbleMedium24 = (IconPencilScribbleMedium24);
28398
- ;// ./src/lib/viewers/controls/icons/IconExit24.tsx
28399
- function IconExit24_extends() { return IconExit24_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, IconExit24_extends.apply(null, arguments); }
28400
-
28401
- function IconExit24(props) {
28402
- return /*#__PURE__*/external_react_.createElement("svg", IconExit24_extends({
28403
- focusable: "false",
28404
- height: 24,
28405
- viewBox: "0 0 19 19",
28406
- width: 24
28407
- }, props), /*#__PURE__*/external_react_.createElement("path", {
28408
- d: "m10 8.232 5.227-5.227a.625.625 0 0 1 .884 0l.884.884a.625.625 0 0 1 0 .884L11.767 10l5.228 5.227a.625.625 0 0 1 0 .884l-.884.884a.625.625 0 0 1-.884 0L10 11.767l-5.227 5.228a.625.625 0 0 1-.884 0l-.884-.884a.625.625 0 0 1 0-.884L8.233 10 3.005 4.772a.625.625 0 0 1 0-.883l.884-.884a.625.625 0 0 1 .884 0L10 8.233z"
28409
- }));
28410
- }
28411
- /* harmony default export */ const icons_IconExit24 = (IconExit24);
28615
+ // EXTERNAL MODULE: ./src/lib/viewers/controls/icons/IconExit24.tsx
28616
+ var IconExit24 = __webpack_require__(8950);
28412
28617
  ;// ./src/lib/viewers/controls/icons/IconTextHighlightMedium24.tsx
28413
28618
  function IconTextHighlightMedium24_extends() { return IconTextHighlightMedium24_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, IconTextHighlightMedium24_extends.apply(null, arguments); }
28414
28619
 
@@ -28553,7 +28758,7 @@ function AnnotationsControls({
28553
28758
  mode: AnnotationMode.NONE,
28554
28759
  onClick: handleExitClick,
28555
28760
  title: "Exit Annotations"
28556
- }, /*#__PURE__*/external_react_["default"].createElement(icons_IconExit24, null)), /*#__PURE__*/external_react_["default"].createElement(annotations_AnnotationsButton, {
28761
+ }, /*#__PURE__*/external_react_["default"].createElement(IconExit24/* default */.A, null)), /*#__PURE__*/external_react_["default"].createElement(annotations_AnnotationsButton, {
28557
28762
  ref: annotationBtnRefs[AnnotationMode.DRAWING],
28558
28763
  "data-resin-target": "draw",
28559
28764
  "data-testid": "bp-AnnotationsControls-drawBtn",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "box-content-preview",
3
- "version": "3.98.0",
3
+ "version": "3.100.0",
4
4
  "description": "Box Content Preview UI Element",
5
5
  "author": "Box (https://www.box.com/)",
6
6
  "license": "SEE LICENSE IN LICENSE",