Merge pull request #4974 from ericrosenbaum/feature/sound-editor-selection4
Sound editor update: selection-based editing
No files matched your search
@@ -24,7 +24,7 @@
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
flex-shrink: 1;
|
||||
overflow-y: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
[dir="ltr"] .detail-area {
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import classNames from 'classnames';
|
||||
import Box from '../box/box.jsx';
|
||||
import styles from './audio-trimmer.css';
|
||||
import SelectionHandle from './selection-handle.jsx';
|
||||
import Playhead from './playhead.jsx';
|
||||
|
||||
const AudioSelector = props => (
|
||||
<div
|
||||
className={classNames(styles.absolute, styles.selector)}
|
||||
ref={props.containerRef}
|
||||
onMouseDown={props.onNewSelectionMouseDown}
|
||||
onTouchStart={props.onNewSelectionMouseDown}
|
||||
>
|
||||
{props.trimStart === null ? null : (
|
||||
<Box
|
||||
className={classNames(styles.absolute)}
|
||||
style={{
|
||||
left: `${props.trimStart * 100}%`,
|
||||
width: `${100 * (props.trimEnd - props.trimStart)}%`
|
||||
}}
|
||||
>
|
||||
<Box className={classNames(styles.absolute, styles.selectionBackground)} />
|
||||
<SelectionHandle
|
||||
handleStyle={styles.leftHandle}
|
||||
onMouseDown={props.onTrimStartMouseDown}
|
||||
/>
|
||||
<SelectionHandle
|
||||
handleStyle={styles.rightHandle}
|
||||
onMouseDown={props.onTrimEndMouseDown}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
{props.playhead ? (
|
||||
<Playhead
|
||||
playbackPosition={props.playhead}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
);
|
||||
|
||||
AudioSelector.propTypes = {
|
||||
containerRef: PropTypes.func,
|
||||
onNewSelectionMouseDown: PropTypes.func.isRequired,
|
||||
onTrimEndMouseDown: PropTypes.func.isRequired,
|
||||
onTrimStartMouseDown: PropTypes.func.isRequired,
|
||||
playhead: PropTypes.number,
|
||||
trimEnd: PropTypes.number,
|
||||
trimStart: PropTypes.number
|
||||
};
|
||||
|
||||
export default AudioSelector;
|
||||
@@ -1,10 +1,11 @@
|
||||
@import "../../css/colors.css";
|
||||
|
||||
$border-radius: 4px;
|
||||
$trim-handle-width: 12px;
|
||||
$trim-handle-height: 14px;
|
||||
$trim-handle-width: 30px;
|
||||
$trim-handle-height: 30px;
|
||||
$trim-handle-border: 3px;
|
||||
$stripe-size: 10px;
|
||||
$hover-scale: 2;
|
||||
$hover-scale: 1.25;
|
||||
|
||||
.absolute {
|
||||
position: absolute;
|
||||
@@ -17,6 +18,10 @@ $hover-scale: 2;
|
||||
transform: translateZ(0);
|
||||
}
|
||||
|
||||
.selector {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.trim-background {
|
||||
cursor: pointer;
|
||||
touch-action: none;
|
||||
@@ -35,6 +40,11 @@ $hover-scale: 2;
|
||||
);
|
||||
}
|
||||
|
||||
.selection-background {
|
||||
background: $motion-primary;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.start-trim-background .trim-background-mask {
|
||||
border-top-left-radius: $border-radius;
|
||||
border-bottom-left-radius: $border-radius;
|
||||
@@ -53,6 +63,10 @@ $hover-scale: 2;
|
||||
border: 1px solid $red-tertiary;
|
||||
}
|
||||
|
||||
.selector .trim-line {
|
||||
border: 1px solid $motion-tertiary;
|
||||
}
|
||||
|
||||
.playhead-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
@@ -68,31 +82,50 @@ $hover-scale: 2;
|
||||
so that we can use transform: translateX() using percentages.
|
||||
*/
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-left: 1px solid $motion-primary;
|
||||
border-top: none;
|
||||
border-bottom: none;
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.start-trim-line {
|
||||
right: 0;
|
||||
.right-handle {
|
||||
transform: scaleX(-1);
|
||||
}
|
||||
|
||||
.end-trim-line {
|
||||
left: 0;
|
||||
.selector .left-handle {
|
||||
left: -1px
|
||||
}
|
||||
|
||||
.selector .right-handle {
|
||||
right: -1px
|
||||
}
|
||||
|
||||
.trimmer .left-handle {
|
||||
right: -1px
|
||||
}
|
||||
|
||||
.trimmer .right-handle {
|
||||
left: -1px
|
||||
}
|
||||
|
||||
.trim-handle {
|
||||
position: absolute;
|
||||
left: calc(-$trim-handle-width / 2);
|
||||
width: $trim-handle-width;
|
||||
height: $trim-handle-height;
|
||||
right: 0;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.trimmer .trim-handle {
|
||||
filter: hue-rotate(150deg);
|
||||
}
|
||||
|
||||
.trim-handle img {
|
||||
position: absolute;
|
||||
width: $trim-handle-width;
|
||||
height: $trim-handle-height;
|
||||
left: calc($trim-handle-border * 1.5);
|
||||
|
||||
/* Make sure image dragging isn't triggered */
|
||||
user-select: none;
|
||||
@@ -103,22 +136,13 @@ $hover-scale: 2;
|
||||
}
|
||||
|
||||
.top-trim-handle {
|
||||
top: -$trim-handle-height;
|
||||
top: calc(-$trim-handle-height + $trim-handle-border);
|
||||
}
|
||||
|
||||
.bottom-trim-handle {
|
||||
bottom: -$trim-handle-height;
|
||||
bottom: calc(-$trim-handle-height + $trim-handle-border);
|
||||
}
|
||||
|
||||
.top-trim-handle img {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
/* Increase handle size when anywhere on draggable area is hovered */
|
||||
.trim-background:hover img {
|
||||
transform: scale($hover-scale);
|
||||
}
|
||||
|
||||
.trim-background:hover .top-trim-handle img {
|
||||
transform: rotate(180deg) scale($hover-scale);
|
||||
transform: scaleY(-1);
|
||||
}
|
||||
@@ -3,11 +3,12 @@ import React from 'react';
|
||||
import classNames from 'classnames';
|
||||
import Box from '../box/box.jsx';
|
||||
import styles from './audio-trimmer.css';
|
||||
import handleIcon from './icon--handle.svg';
|
||||
import SelectionHandle from './selection-handle.jsx';
|
||||
import Playhead from './playhead.jsx';
|
||||
|
||||
const AudioTrimmer = props => (
|
||||
<div
|
||||
className={styles.absolute}
|
||||
className={classNames(styles.absolute, styles.trimmer)}
|
||||
ref={props.containerRef}
|
||||
>
|
||||
{props.trimStart === null ? null : (
|
||||
@@ -20,28 +21,16 @@ const AudioTrimmer = props => (
|
||||
onTouchStart={props.onTrimStartMouseDown}
|
||||
>
|
||||
<Box className={classNames(styles.absolute, styles.trimBackgroundMask)} />
|
||||
<Box className={classNames(styles.trimLine, styles.startTrimLine)}>
|
||||
<Box className={classNames(styles.trimHandle, styles.topTrimHandle, styles.startTrimHandle)}>
|
||||
<img src={handleIcon} />
|
||||
</Box>
|
||||
<Box className={classNames(styles.trimHandle, styles.bottomTrimHandle, styles.startTrimHandle)}>
|
||||
<img src={handleIcon} />
|
||||
</Box>
|
||||
</Box>
|
||||
<SelectionHandle
|
||||
handleStyle={styles.leftHandle}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
{props.playhead ? (
|
||||
<div className={styles.playheadContainer}>
|
||||
<div
|
||||
className={classNames(styles.trimLine, styles.playhead)}
|
||||
style={{
|
||||
transform: `translateX(${100 * props.playhead}%)`
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<Playhead
|
||||
playbackPosition={props.playhead}
|
||||
/>
|
||||
) : null}
|
||||
|
||||
{props.trimEnd === null ? null : (
|
||||
<Box
|
||||
className={classNames(styles.absolute, styles.trimBackground, styles.endTrimBackground)}
|
||||
@@ -53,14 +42,9 @@ const AudioTrimmer = props => (
|
||||
onTouchStart={props.onTrimEndMouseDown}
|
||||
>
|
||||
<Box className={classNames(styles.absolute, styles.trimBackgroundMask)} />
|
||||
<Box className={classNames(styles.trimLine, styles.endTrimLine)}>
|
||||
<Box className={classNames(styles.trimHandle, styles.topTrimHandle, styles.endTrimHandle)}>
|
||||
<img src={handleIcon} />
|
||||
</Box>
|
||||
<Box className={classNames(styles.trimHandle, styles.bottomTrimHandle, styles.endTrimHandle)}>
|
||||
<img src={handleIcon} />
|
||||
</Box>
|
||||
</Box>
|
||||
<SelectionHandle
|
||||
handleStyle={styles.rightHandle}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="10px" viewBox="0 0 8 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>handle</title>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="34px" height="34px" viewBox="1 1 33 33" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 55.2 (78181) - https://sketchapp.com -->
|
||||
<title>Bottom Left Handle</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
|
||||
<g id="Desktop---1280x720" transform="translate(-461.000000, -329.000000)" stroke="#E64D00" fill="#FF661A">
|
||||
<g id="Step-5---Confirming-Trim" transform="translate(0.000000, 42.000000)">
|
||||
<g id="Sound-Sketches" transform="translate(427.000000, 167.000000)">
|
||||
<g id="start-playhead" transform="translate(35.000000, 0.000000)">
|
||||
<path d="M0,122.213854 C0,121.658366 0.45097518,121.208054 0.990777969,121.208054 L5.00922203,121.208054 C5.55641359,121.208054 6,121.659838 6,122.213854 L6,126.298963 L3,129.208054 L0,126.298963 L0,122.213854 Z" id="handle" transform="translate(3.000000, 125.208054) scale(1, -1) translate(-3.000000, -125.208054) "></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<path d="M17,5 C23.627417,5 29,10.372583 29,17 L29,29 L17,29 C10.372583,29 5,23.627417 5,17 C5,10.372583 10.372583,5 17,5 Z" id="path-1"></path>
|
||||
</defs>
|
||||
<g id="Bottom-Left-Handle" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Bottom-Left" transform="translate(17.000000, 17.000000) scale(1, -1) translate(-17.000000, -17.000000) ">
|
||||
<use stroke="#4D97FF33" stroke-width="8" xlink:href="#path-1"></use>
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
||||
<use stroke="#3D73CC" stroke-width="1" fill="#4D97FF" fill-rule="evenodd" xlink:href="#path-1"></use>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,21 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import classNames from 'classnames';
|
||||
import styles from './audio-trimmer.css';
|
||||
|
||||
const Playhead = props => (
|
||||
<div className={styles.playheadContainer}>
|
||||
<div
|
||||
className={classNames(styles.playhead)}
|
||||
style={{
|
||||
transform: `translateX(${100 * props.playbackPosition}%)`
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
Playhead.propTypes = {
|
||||
playbackPosition: PropTypes.number
|
||||
};
|
||||
|
||||
export default Playhead;
|
||||
@@ -0,0 +1,28 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import classNames from 'classnames';
|
||||
import Box from '../box/box.jsx';
|
||||
import styles from './audio-trimmer.css';
|
||||
import handleIcon from './icon--handle.svg';
|
||||
|
||||
const SelectionHandle = props => (
|
||||
<Box
|
||||
className={classNames(styles.trimLine, props.handleStyle)}
|
||||
onMouseDown={props.onMouseDown}
|
||||
onTouchStart={props.onMouseDown}
|
||||
>
|
||||
<Box className={classNames(styles.trimHandle, styles.topTrimHandle)}>
|
||||
<img src={handleIcon} />
|
||||
</Box>
|
||||
<Box className={classNames(styles.trimHandle, styles.bottomTrimHandle)}>
|
||||
<img src={handleIcon} />
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
|
||||
SelectionHandle.propTypes = {
|
||||
handleStyle: PropTypes.string,
|
||||
onMouseDown: PropTypes.func
|
||||
};
|
||||
|
||||
export default SelectionHandle;
|
||||
@@ -8,6 +8,7 @@
|
||||
font-size: 0.75rem;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
color: $motion-primary;
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
|
||||
.container + .container {
|
||||
@@ -16,4 +17,14 @@
|
||||
|
||||
.title {
|
||||
margin-top: 0.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.container:active {
|
||||
background-color: $motion-light-transparent;
|
||||
}
|
||||
@@ -5,14 +5,19 @@ import styles from './icon-button.css';
|
||||
|
||||
const IconButton = ({
|
||||
img,
|
||||
disabled,
|
||||
className,
|
||||
title,
|
||||
onClick
|
||||
}) => (
|
||||
<div
|
||||
className={classNames(styles.container, className)}
|
||||
className={classNames(
|
||||
styles.container,
|
||||
className,
|
||||
disabled ? styles.disabled : null
|
||||
)}
|
||||
role="button"
|
||||
onClick={onClick}
|
||||
onClick={disabled ? null : onClick}
|
||||
>
|
||||
<img
|
||||
className={styles.icon}
|
||||
@@ -27,6 +32,7 @@ const IconButton = ({
|
||||
|
||||
IconButton.propTypes = {
|
||||
className: PropTypes.string,
|
||||
disabled: PropTypes.bool,
|
||||
img: PropTypes.string,
|
||||
onClick: PropTypes.func.isRequired,
|
||||
title: PropTypes.node.isRequired
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 56.1 (81669) - https://sketch.com -->
|
||||
<title>Sound/General/Copy to New</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Sound/General/Copy-to-New" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M15,11.0967026 L15,4 C15,3.44771525 14.5522847,3 14,3 L4,3 C3.44771525,3 3,3.44771525 3,4 L3,12 L12.6616037,12 L11.5236347,13.0430331 C11.1882084,13.3580017 11,13.7827132 11,14.2302292 C11,14.6767472 11.187801,15.1005394 11.5128606,15.4074032 L12.1595777,16 L4,16 C2.8954305,16 2,15.1045695 2,14 L2,4 C2,2.8954305 2.8954305,2 4,2 L14,2 C15.1045695,2 16,2.8954305 16,4 L16,12.0333493 C15.8307357,11.617882 15.4895036,11.283542 15.0505738,11.115203 C15.0337809,11.1087625 15.0169209,11.1025961 15,11.0967026 Z M10.3153901,9.43844107 C10.240142,9.43844107 10.1627842,9.41684419 10.0924589,9.37133647 C9.88359282,9.23558464 9.81397079,8.94017013 9.93774329,8.71108891 C10.173333,8.27298072 10.173333,7.72997337 9.93774329,7.2926365 C9.81397079,7.06278396 9.88359282,6.76736945 10.0924589,6.63161762 C10.3034348,6.49740842 10.5720773,6.57299751 10.6944433,6.80130741 C11.0931877,7.54177197 11.0931877,8.46118212 10.6944433,9.20164668 C10.612866,9.35436749 10.4658862,9.43844107 10.3153901,9.43844107 Z M11.6283181,10.2119951 C11.5530701,10.2119951 11.475009,10.1903983 11.405387,10.1448905 C11.1965209,10.0091387 11.1268989,9.7137242 11.2506714,9.48464298 C11.7436516,8.56986072 11.7436516,7.4329391 11.2506714,6.51892817 C11.1268989,6.28984695 11.1965209,5.99366112 11.405387,5.85790929 C11.6149563,5.7244714 11.8835989,5.79928918 12.0073714,6.02759908 C12.6642095,7.2447377 12.6642095,8.75806213 12.0073714,9.97520074 C11.9250908,10.1279216 11.7788142,10.2119951 11.6283181,10.2119951 Z M9.1892643,5.64286604 L9.1892643,10.3563857 C9.1892643,10.9148194 8.58587338,11.2071486 8.20963312,10.8307458 L7.39737611,10.0170061 C7.10974571,9.72930481 6.73491195,9.56964214 6.34530989,9.56964214 L6.20325282,9.56964214 C5.81505726,9.56964214 5.5,9.22486333 5.5,8.79832489 L5.5,7.20941137 C5.5,6.78364425 5.81505726,6.43809412 6.20325282,6.43809412 L6.33757411,6.43809412 C6.72717617,6.43809412 7.10200993,6.27843145 7.38964033,5.99073012 L8.20963312,5.16927725 C8.58587338,4.79287444 9.1892643,5.08520367 9.1892643,5.64286604 Z M13.937674,12.1868928 C14.1369962,12.0038895 14.4343459,11.9498886 14.6924846,12.0488903 C14.9506233,12.1478921 15.1172698,12.3758962 15.1172698,12.6339008 L15.1172698,13.2759122 C15.2675784,13.3119129 15.44076,13.3599137 15.6237444,13.428915 C15.9439671,13.545917 16.2968655,13.7259203 16.6236234,13.9686246 C16.7053128,14.0319257 16.7837347,14.0949268 16.8621566,14.1639281 C16.9307757,14.2239291 17.0418734,14.325931 17.0908871,14.385932 C17.2215902,14.5209344 17.3555609,14.6949375 17.4699262,14.8569404 C17.6921215,15.1989465 17.8456977,15.5679531 17.9273871,15.9186594 C18.005809,16.2699656 18.0123442,16.6029716 17.9862036,16.8789765 C17.9567954,17.1579815 17.8979789,17.3709853 17.8424301,17.5389883 C17.8162895,17.6229898 17.7934164,17.6589904 17.7803461,17.6979911 L17.7574731,17.7519921 C17.6921215,17.9109949 17.5156723,18.0159968 17.3196176,17.9979965 C17.0876195,17.9769961 16.9177054,17.7849927 16.9405785,17.5719889 L16.9471136,17.5149878 C16.9503812,17.4819873 16.9634515,17.4159861 16.960184,17.3649852 C16.960184,17.2629833 16.9569164,17.0889802 16.920973,16.8999769 C16.8817621,16.7079734 16.8098753,16.4919696 16.6922425,16.2849659 C16.5746097,16.0809623 16.4144984,15.8889588 16.2282464,15.730256 C16.1269515,15.6519546 16.0387269,15.5859534 15.921094,15.5139521 C15.8492073,15.4686513 15.8328694,15.4719514 15.774053,15.4389508 C15.7217718,15.4149504 15.6694905,15.39365 15.6172092,15.3729496 C15.4374924,15.3069485 15.2675784,15.2679478 15.1172698,15.2529475 L15.1172698,15.8259577 C15.1172698,16.0839623 14.9506233,16.3119664 14.6924846,16.4109681 C14.4343459,16.5099699 14.1369962,16.4559689 13.937674,16.2729657 L12.1993223,14.6802373 C12.0718867,14.5599351 12,14.3979322 12,14.2302292 C12,14.0619262 12.0718867,13.8999234 12.1993223,13.7802212 L13.937674,12.1868928 Z" id="Copy-to-New" fill="#4D97FF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 56.1 (81669) - https://sketch.com -->
|
||||
<title>Sound/General/Copy</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Sound/General/Copy" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Secondary-Color" opacity="0.25" transform="translate(2.000000, 4.000000)" fill="#4D97FF">
|
||||
<rect id="selection" x="0" y="0" width="16" height="12"></rect>
|
||||
</g>
|
||||
<g id="Primary-Color" transform="translate(0.000000, 2.000000)" fill="#4D97FF" fill-rule="nonzero">
|
||||
<path d="M1.5,3.93699126 C0.637386394,3.71496986 0,2.93191971 0,2 C0,0.8954305 0.8954305,0 2,0 C3.1045695,0 4,0.8954305 4,2 C4,2.93191971 3.36261361,3.71496986 2.5,3.93699126 L2.5,12.0630087 C3.36261361,12.2850301 4,13.0680803 4,14 C4,15.1045695 3.1045695,16 2,16 C0.8954305,16 0,15.1045695 0,14 C0,13.0680803 0.637386394,12.2850301 1.5,12.0630087 L1.5,3.93699126 Z M17.5,12.0630087 L17.5,3.93699126 C16.6373864,3.71496986 16,2.93191971 16,2 C16,0.8954305 16.8954305,0 18,0 C19.1045695,0 20,0.8954305 20,2 C20,2.93191971 19.3626136,3.71496986 18.5,3.93699126 L18.5,12.0630087 C19.3626136,12.2850301 20,13.0680803 20,14 C20,15.1045695 19.1045695,16 18,16 C16.8954305,16 16,15.1045695 16,14 C16,13.0680803 16.6373864,12.2850301 17.5,12.0630087 Z M11,7 L12,7 C12.5522847,7 13,7.44771525 13,8 C13,8.55228475 12.5522847,9 12,9 L11,9 L11,10 C11,10.5522847 10.5522847,11 10,11 C9.44771525,11 9,10.5522847 9,10 L9,9 L8,9 C7.44771525,9 7,8.55228475 7,8 C7,7.44771525 7.44771525,7 8,7 L9,7 L9,6 C9,5.44771525 9.44771525,5 10,5 C10.5522847,5 11,5.44771525 11,6 L11,7 Z" id="handles-and-plus"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 55.2 (78181) - https://sketchapp.com -->
|
||||
<title>Sound/General/Trim</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<path d="M6.54210671,14.8773591 C6.54210671,15.6756813 5.89668548,16.3230878 5.11194905,16.3230878 C4.31632862,16.3230878 3.6709074,15.6756813 3.6709074,14.8773591 C3.6709074,14.086692 4.31632862,13.440379 5.11194905,13.440379 C5.89668548,13.440379 6.54210671,14.086692 6.54210671,14.8773591 L6.54210671,14.8773591 Z M8.63401159,13.5836396 C8.82992359,13.3878866 8.82992359,13.0685577 8.63401159,12.8706175 L7.10916313,11.338495 C6.91216272,11.1405548 6.59434991,11.1405548 6.3984379,11.338495 L5.87709428,11.861232 C5.63546947,11.7912421 5.37425346,11.7595279 5.11194905,11.7595279 C3.39010019,11.7595279 2.00021333,13.1571387 2.00021333,14.8872014 C2.00021333,16.8414505 3.794985,18.3779474 5.83246988,17.9230131 C7.36929074,17.5796252 8.34776238,16.1568618 8.19973997,14.5820892 C8.18450237,14.4213311 8.15620397,14.2638539 8.11266797,14.1074702 L8.63401159,13.5836396 Z M6.54210671,5.11617453 C6.54210671,5.91559037 5.89668548,6.5629969 5.11194905,6.5629969 C4.31632862,6.5629969 3.6709074,5.91559037 3.6709074,5.11617453 C3.6709074,4.32660102 4.31632862,3.68028808 5.11194905,3.68028808 C5.89668548,3.68028808 6.54210671,4.32660102 6.54210671,5.11617453 M18.0021973,16.1706411 L17.9368933,16.235163 C16.926858,17.2500165 15.2877276,17.2500165 14.2766039,16.235163 L7.87898848,9.80702856 C7.70919807,9.6353346 7.70919807,9.3586558 7.87898848,9.18805543 L9.15785853,7.90199109 C9.32764893,7.73139072 9.60301414,7.73139072 9.77280455,7.90199109 L18.0021973,16.1706411 Z M18.0021973,3.82934469 L12.4045559,9.45368895 L10.5107398,7.54865148 L14.2766039,3.76482275 C15.2877276,2.74996927 16.926858,2.74996927 17.9368933,3.76482275 L18.0021973,3.82934469 Z M8.63401159,6.41864274 C8.82992359,6.61548933 8.82992359,6.93591182 8.63401159,7.1327584 L7.10916313,8.66488096 C6.91216272,8.86282113 6.59434991,8.86282113 6.3984379,8.66488096 L5.87709428,8.14214392 C5.63546947,8.21213382 5.37425346,8.2427544 5.11194905,8.2427544 C3.39010019,8.2427544 2.00021333,6.84623726 2.00021333,5.11617453 C2.00021333,3.16192542 3.794985,1.62542849 5.83246988,2.0814564 C7.36929074,2.42375074 8.34776238,3.84651408 8.19973997,5.42128673 C8.18450237,5.58313837 8.15620397,5.73842845 8.11266797,5.89590571 L8.63401159,6.41864274 Z M10.3929749,10.0447755 C10.3929749,10.2744298 10.2079469,10.4614341 9.97829448,10.4614341 C9.74973047,10.4614341 9.56361406,10.2744298 9.56361406,10.0447755 C9.56361406,9.81402755 9.74973047,9.62811689 9.97829448,9.62811689 C10.2079469,9.62811689 10.3929749,9.81402755 10.3929749,10.0447755 Z" id="path-1"></path>
|
||||
</defs>
|
||||
<g id="Sound/General/Trim" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<use id="Mask" fill="#575E75" xlink:href="#path-1"></use>
|
||||
<g id="Blue/1_Blue" mask="url(#mask-2)" fill="#4D97FF">
|
||||
<rect id="Primary-Blue" x="0" y="0" width="20" height="20"></rect>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 56.1 (81669) - https://sketch.com -->
|
||||
<title>Sound/Effects/Fade-in</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Sound/Effects/Fade-in" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Secondary" opacity="0.25" transform="translate(1.250000, 0.250000)" fill="#CF63CF" fill-rule="nonzero">
|
||||
<path d="M17,0.750486449 L17,18.7504864 C17,18.9652762 16.7470196,19.0800706 16.5853738,18.9386306 C11.2946517,14.3092487 6.01748075,12.0004864 0.75,12.0004864 C0.611928813,12.0004864 0.5,11.8885576 0.5,11.7504864 L0.5,7.75048645 C0.5,7.61241526 0.611928813,7.50048645 0.75,7.50048645 C6.01748075,7.50048645 11.2946517,5.19172416 16.5853738,0.562342275 C16.7470196,0.420902266 17,0.535696746 17,0.750486449 Z" id="Fade"></path>
|
||||
</g>
|
||||
<g id="Primary" transform="translate(1.000000, 1.000000)" fill="#CF63CF" fill-rule="nonzero">
|
||||
<path d="M6.00000018,9.25 L1,9.25 C0.861928813,9.25 0.75,9.13807119 0.75,9 C0.75,8.86192881 0.861928813,8.75 1,8.75 L6,8.75 C6.35324851,8.75 6.58270077,8.50876428 6.90437981,7.88536107 L7.04612021,7.6082292 C7.35582235,7.01071273 7.58718112,6.75 8,6.75 C8.3879427,6.75 8.64783618,6.89521764 9.05675678,7.24762061 L9.1299543,7.31093199 C9.51052276,7.64016497 9.70585257,7.75 10,7.75 C10.1999644,7.75 10.402585,7.39321162 10.7655628,6.41317141 C11.2359183,5.14321162 11.4592237,4.75 12,4.75 C12.4020616,4.75 12.6314717,4.8897049 12.9133418,5.21140451 C12.9679067,5.27426342 12.9973758,5.30824799 13.0201857,5.33390904 C13.2852046,5.63205537 13.5123572,5.75 14,5.75 C14.3765436,5.75 14.6926018,5.13162529 15.2628292,3.42094306 C15.9426018,1.38162529 16.2654325,0.75 17,0.75 C17.1380712,0.75 17.25,0.861928813 17.25,1 L17.25,17 C17.25,17.1380712 17.1380712,17.25 17,17.25 C16.2654325,17.25 15.9426018,16.6183747 15.2628292,14.5790569 C14.6926018,12.8683747 14.3765436,12.25 14,12.25 C13.5123572,12.25 13.2852046,12.3679446 13.0201857,12.666091 C12.9973758,12.691752 12.9679067,12.7257366 12.9133418,12.7885955 C12.6314717,13.1102951 12.4020616,13.25 12,13.25 C11.4592237,13.25 11.2359183,12.8567884 10.7655628,11.5868286 C10.402585,10.6067884 10.1999644,10.25 10,10.25 C9.70585257,10.25 9.51052276,10.359835 9.1299543,10.689068 L9.05675678,10.7523794 C8.64783618,11.1047824 8.3879427,11.25 8,11.25 C7.58718112,11.25 7.35582235,10.9892873 7.04612021,10.3917708 L6.90437981,10.1146389 C6.58270078,9.49123572 6.35324851,9.25 6.00000001,9.25 L6.00000018,9.25 Z" id="Path"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 56.1 (81669) - https://sketch.com -->
|
||||
<title>Sound/Effects/Fade-out</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Sound/Effects/Fade-out" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Secondary" opacity="0.25" transform="translate(1.000000, 0.000000)" fill="#CF63CF" fill-rule="nonzero">
|
||||
<path d="M0.75,1.00048645 C0.75,0.785696746 1.00298043,0.670902266 1.16462615,0.812342275 C6.45534831,5.44172416 11.7325193,7.75048645 17,7.75048645 C17.1380712,7.75048645 17.25,7.86241526 17.25,8.00048645 L17.25,12.0004864 C17.25,12.1385576 17.1380712,12.2504864 17,12.2504864 C11.7325193,12.2504864 6.45534831,14.5592487 1.16462615,19.1886306 C1.00298043,19.3300706 0.75,19.2152762 0.75,19.0004864 L0.75,1.00048645 Z" id="Fade"></path>
|
||||
</g>
|
||||
<g id="Primary" transform="translate(1.750000, 1.750000)" fill="#CF63CF" fill-rule="nonzero">
|
||||
<path d="M11.25,8.5 C10.8967515,8.5 10.6672992,8.74123572 10.3456202,9.36463893 L10.2038798,9.6417708 C9.89417765,10.2392873 9.66281888,10.5 9.25,10.5 C8.8620573,10.5 8.60216382,10.3547824 8.19324322,10.0023794 L8.1200457,9.93906801 C7.73947724,9.60983503 7.54414743,9.5 7.25,9.5 C7.05003561,9.5 6.84741505,9.85678838 6.48443719,10.8368286 C6.01408171,12.1067884 5.79077635,12.5 5.25,12.5 C4.84793845,12.5 4.6185283,12.3602951 4.33665816,12.0385955 C4.28209329,11.9757366 4.25262416,11.941752 4.22981434,11.916091 C3.96479538,11.6179446 3.73764275,11.5 3.25,11.5 C2.87345642,11.5 2.55739824,12.1183747 1.98717082,13.8290569 C1.30739824,15.8683747 0.984567531,16.5 0.25,16.5 C0.111928813,16.5 0,16.3880712 0,16.25 L0,0.25 C0,0.111928813 0.111928813,0 0.25,0 C0.984567531,0 1.30739824,0.631625291 1.98717082,2.67094306 C2.55739824,4.38162529 2.87345642,5 3.25,5 C3.73764275,5 3.96479538,4.88205537 4.22981434,4.58390904 C4.25262416,4.55824799 4.28209329,4.52426342 4.33665816,4.46140451 C4.6185283,4.1397049 4.84793845,4 5.25,4 C5.79077635,4 6.01408171,4.39321162 6.48443719,5.66317141 C6.84741505,6.64321162 7.05003561,7 7.25,7 C7.54414743,7 7.73947724,6.89016497 8.1200457,6.56093199 L8.19324322,6.49762061 C8.60216382,6.14521764 8.8620573,6 9.25,6 C9.66281888,6 9.89417765,6.26071273 10.2038798,6.8582292 L10.3456202,7.13536107 C10.6672992,7.75876428 10.8967515,8 11.25,8 L16.25,8 C16.3880712,8 16.5,8.11192881 16.5,8.25 C16.5,8.38807119 16.3880712,8.5 16.25,8.5 L11.2499998,8.5 Z" id="Wave-Form"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon--lounder</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="lounder">
|
||||
<g id="louder" transform="translate(2.000000, 3.000000)">
|
||||
<path d="M7.54011246,2.3873625 L7.54011246,11.8531125 C7.54011246,12.2457375 7.22294659,12.5629875 6.83155041,12.5629875 L5.50777655,12.5629875 C5.2018577,12.5629875 4.9296799,12.3661125 4.83408026,12.0736125 C4.29422346,10.4266125 2.75788098,9.3128625 1.02471572,9.3128625 L0.709799251,9.3128625 C0.319527773,9.3128625 0.0001125,8.9933625 0.0001125,8.6029875 L0.0001125,5.6374875 C0.0001125,5.2471125 0.319527773,4.9276125 0.709799251,4.9276125 L1.02471572,4.9276125 C2.75788098,4.9276125 4.29422346,3.8138625 4.83408026,2.1668625 C4.9296799,1.8743625 5.2018577,1.6774875 5.50777655,1.6774875 L6.83155041,1.6774875 C7.22294659,1.6774875 7.54011246,1.9947375 7.54011246,2.3873625" id="Fill-1" fill="#CF63CF"></path>
|
||||
<path d="M9.25,5.8645125 C9.9385,6.5541375 9.9385,7.6858875 9.25,8.3755125" id="Stroke-3" stroke="#CF63CF" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
<path d="M10.75,3.3541875 C12.829,5.4331875 12.829,8.8081875 10.75,10.8860625" id="Stroke-5" stroke="#CF63CF" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
<path d="M12.5,0.8438625 C15.968375,4.3111125 15.968375,9.9293625 12.5,13.3966125" id="Stroke-7" stroke="#CF63CF" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 55.2 (78181) - https://sketchapp.com -->
|
||||
<title>Sound/Effects/Mute</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Sound/Effects/Mute" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path fill="#CF63CF" d="M13.4541749,5.04815243 L15.6281168,2.87421054 C15.92101,2.58131732 16.3958837,2.58131732 16.688777,2.87421054 C16.9816702,3.16710376 16.9816702,3.64197749 16.688777,3.93487071 L4.53033009,16.0933176 C4.23743687,16.3862108 3.76256313,16.3862108 3.46966991,16.0933176 C3.1767767,15.8004244 3.1767767,15.3255506 3.46966991,15.0326574 L6.31214932,12.190178 C6.1241191,12.0621379 6,11.8463331 6,11.6029875 L6,8.6374875 C6,8.2471125 6.31941527,7.9276125 6.70968675,7.9276125 L7.02460322,7.9276125 C8.75776848,7.9276125 10.294111,6.8138625 10.8339678,5.1668625 C10.9295674,4.8743625 11.2017452,4.6774875 11.5076641,4.6774875 L12.8314379,4.6774875 C13.1002844,4.6774875 13.3341075,4.82717208 13.4541749,5.04815243 Z M13.54,9.08364771 L13.54,14.8531125 C13.54,15.2457375 13.2228341,15.5629875 12.8314379,15.5629875 L11.5076641,15.5629875 C11.2017452,15.5629875 10.9295674,15.3661125 10.8339678,15.0736125 C10.5773785,14.2908077 10.0956813,13.628465 9.47473531,13.1489124 L13.54,9.08364771 Z" id="path-1"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 56.1 (81669) - https://sketch.com -->
|
||||
<title>Sound/General/Paste</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Sound/General/Paste" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M2.39776184,8.69699508 C2.82037272,8.57348907 3.12697047,8.23068036 3.44607843,7.63235294 C3.50283588,7.52593273 3.70653958,7.12084014 3.75472041,7.03050109 C4.03665487,6.50187397 4.27845388,6.25 4.66666667,6.25 C5.08719776,6.25 5.31070056,6.3254322 5.67812087,6.53210612 C5.97736723,6.7004322 6.1242348,6.75 6.44444444,6.75 C6.611898,6.75 6.70455317,6.61444047 6.85968251,6.13575567 C6.89349476,6.03068757 6.91177802,5.97409653 6.92949584,5.92094306 C7.19192893,5.1336438 7.51873661,4.75 8.22222222,4.75 C8.89163675,4.75 9.21925695,5.04485818 9.76356813,5.86132495 C10.2192569,6.54485818 10.4471923,6.75 10.8888889,6.75 C11.3661624,6.75 11.5487705,6.64281697 11.7364319,6.36132495 C11.7692531,6.31129826 11.7692531,6.31129826 11.8038172,6.25761214 C12.0332099,5.90369189 12.2433073,5.75 12.6666667,5.75 C13.1851992,5.75 13.4061497,6.04828312 13.7840084,6.89846538 C14.0728163,7.54828312 14.2222362,7.75 14.4444444,7.75 C14.7687569,7.75 14.9402848,7.69488783 15.2489243,7.52961059 L15.2905031,7.50732887 C15.6361057,7.32238348 15.857036,7.25 16.2222222,7.25 C16.6365912,7.25 16.8489777,7.46586974 17.1158999,7.96477614 C17.1606386,8.04903257 17.1606386,8.04903257 17.2045543,8.13123692 C17.3511621,8.40280419 17.4762139,8.57093888 17.631381,8.6621791 C17.7227849,8.5624959 17.8540941,8.5 18,8.5 C18.2761424,8.5 18.5,8.72385763 18.5,9 C18.5,9.27614237 18.2761424,9.5 18,9.5 C17.8540941,9.5 17.7227849,9.4375041 17.631381,9.3378209 C17.4762139,9.42906112 17.3511621,9.59719581 17.2045543,9.86876308 C17.1606386,9.95096743 17.1606386,9.95096743 17.1158999,10.0352239 C16.8489777,10.5341303 16.6365912,10.75 16.2222222,10.75 C15.857036,10.75 15.6361057,10.6776165 15.2905031,10.4926711 L15.2489243,10.4703894 C14.9402848,10.3051122 14.7687569,10.25 14.4444444,10.25 C14.2222362,10.25 14.0728163,10.4517169 13.7840084,11.1015346 C13.4061497,11.9517169 13.1851992,12.25 12.6666667,12.25 C12.2433073,12.25 12.0332099,12.0963081 11.8038172,11.7423879 C11.7692531,11.6887017 11.7692531,11.6887017 11.7364319,11.638675 C11.5487705,11.357183 11.3661624,11.25 10.8888889,11.25 C10.4471923,11.25 10.2192569,11.4551418 9.76356813,12.138675 C9.21925695,12.9551418 8.89163675,13.25 8.22222222,13.25 C7.51873661,13.25 7.19192893,12.8663562 6.92949584,12.0790569 C6.91177802,12.0259035 6.89349476,11.9693124 6.85968251,11.8642443 C6.70455317,11.3855595 6.611898,11.25 6.44444444,11.25 C6.1242348,11.25 5.97736723,11.2995678 5.67812087,11.4678939 C5.31070056,11.6745678 5.08719776,11.75 4.66666667,11.75 C4.2576716,11.75 4.07414298,11.4976192 3.8822771,10.9321841 L3.78515608,10.639352 C3.74630783,10.5239258 3.71290663,10.4315854 3.67737933,10.3436452 C3.42795496,9.72624902 3.07265238,9.37546644 2.4155666,9.27813036 C2.32583908,9.41193093 2.17320436,9.5 2,9.5 C1.72385763,9.5 1.5,9.27614237 1.5,9 C1.5,8.72385763 1.72385763,8.5 2,8.5 C2.16222865,8.5 2.306412,8.5772611 2.39776184,8.69699508 Z M9,15 L9.7763932,13.4472136 C9.80058413,13.3988317 9.83981475,13.3596011 9.8881966,13.3354102 C10.0116912,13.2736629 10.1618595,13.323719 10.2236068,13.4472136 L11,15 L12,15 C12.2761424,15 12.5,15.2238576 12.5,15.5 C12.5,15.6081851 12.4649111,15.7134519 12.4,15.8 L10.4,18.4666667 C10.2343146,18.6875806 9.9209139,18.7323521 9.7,18.5666667 C9.66209717,18.5382395 9.62842712,18.5045695 9.6,18.4666667 L7.6,15.8 C7.43431458,15.5790861 7.4790861,15.2656854 7.7,15.1 C7.78654809,15.0350889 7.89181489,15 8,15 L9,15 L9,15 Z M2,3.5 C1.72385763,3.5 1.5,3.27614237 1.5,3 C1.5,2.72385763 1.72385763,2.5 2,2.5 C2.27614237,2.5 2.5,2.72385763 2.5,3 C2.5,3.27614237 2.27614237,3.5 2,3.5 Z M4,3.5 C3.72385763,3.5 3.5,3.27614237 3.5,3 C3.5,2.72385763 3.72385763,2.5 4,2.5 C4.27614237,2.5 4.5,2.72385763 4.5,3 C4.5,3.27614237 4.27614237,3.5 4,3.5 Z M6,3.5 C5.72385763,3.5 5.5,3.27614237 5.5,3 C5.5,2.72385763 5.72385763,2.5 6,2.5 C6.27614237,2.5 6.5,2.72385763 6.5,3 C6.5,3.27614237 6.27614237,3.5 6,3.5 Z M8,3.5 C7.72385763,3.5 7.5,3.27614237 7.5,3 C7.5,2.72385763 7.72385763,2.5 8,2.5 C8.27614237,2.5 8.5,2.72385763 8.5,3 C8.5,3.27614237 8.27614237,3.5 8,3.5 Z M10,3.5 C9.72385763,3.5 9.5,3.27614237 9.5,3 C9.5,2.72385763 9.72385763,2.5 10,2.5 C10.2761424,2.5 10.5,2.72385763 10.5,3 C10.5,3.27614237 10.2761424,3.5 10,3.5 Z M12,3.5 C11.7238576,3.5 11.5,3.27614237 11.5,3 C11.5,2.72385763 11.7238576,2.5 12,2.5 C12.2761424,2.5 12.5,2.72385763 12.5,3 C12.5,3.27614237 12.2761424,3.5 12,3.5 Z M14,3.5 C13.7238576,3.5 13.5,3.27614237 13.5,3 C13.5,2.72385763 13.7238576,2.5 14,2.5 C14.2761424,2.5 14.5,2.72385763 14.5,3 C14.5,3.27614237 14.2761424,3.5 14,3.5 Z M16,3.5 C15.7238576,3.5 15.5,3.27614237 15.5,3 C15.5,2.72385763 15.7238576,2.5 16,2.5 C16.2761424,2.5 16.5,2.72385763 16.5,3 C16.5,3.27614237 16.2761424,3.5 16,3.5 Z M18,3.5 C17.7238576,3.5 17.5,3.27614237 17.5,3 C17.5,2.72385763 17.7238576,2.5 18,2.5 C18.2761424,2.5 18.5,2.72385763 18.5,3 C18.5,3.27614237 18.2761424,3.5 18,3.5 Z M18,5.5 C17.7238576,5.5 17.5,5.27614237 17.5,5 C17.5,4.72385763 17.7238576,4.5 18,4.5 C18.2761424,4.5 18.5,4.72385763 18.5,5 C18.5,Line truncated
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.5 KiB |
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="49px" height="52px" viewBox="-5 0 49 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>play</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<path d="M17.2214651,8.34499443 C19.7766419,4.08636653 23.9234057,4.09303946 26.4745787,8.34499443 L40.1520974,31.140859 C42.7072741,35.3994869 40.7489672,38.8517869 35.7726637,38.8517869 L7.92338006,38.8517869 C2.9495089,38.8517869 0.992773429,35.392814 3.54394641,31.140859 L17.2214651,8.34499443 Z" id="path-1"></path>
|
||||
</defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Desktop---1280x720" transform="translate(-623.000000, -347.000000)">
|
||||
<g id="Step-3---Altering-Suggested-Trim" transform="translate(0.000000, 42.000000)">
|
||||
<g id="Play-/-Record-/-Stop" transform="translate(623.000000, 307.000000)">
|
||||
<g id="play" transform="translate(21.849131, 22.002656) rotate(90.000000) translate(-21.849131, -22.002656) ">
|
||||
<use stroke="#FFFFFF" stroke-width="1" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="52px" height="52px" viewBox="0 0 52 52" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>stop-playback</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<rect id="path-1" x="0" y="0" width="44" height="44" rx="4"></rect>
|
||||
</defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Desktop---1280x720" transform="translate(-619.000000, -345.000000)">
|
||||
<g id="Step-4---Playing-Trim" transform="translate(0.000000, 42.000000)">
|
||||
<g id="Play-/-Record-/-Stop" transform="translate(623.000000, 307.000000)">
|
||||
<g id="stop-playback">
|
||||
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
|
||||
<rect stroke="#FFFFFF" stroke-width="1" x="0.5" y="0.5" width="43" height="43" rx="4"></rect>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -63,7 +63,9 @@
|
||||
background: hsla(300, 53%, 60%, 0.15);
|
||||
border: 1px solid $ui-black-transparent;
|
||||
border-radius: 5px;
|
||||
padding: 3px;
|
||||
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
$border-radius: 0.25rem;
|
||||
@@ -93,9 +95,9 @@ $border-radius: 0.25rem;
|
||||
height: 3rem;
|
||||
width: 3rem;
|
||||
outline: none;
|
||||
background: white;
|
||||
background: $motion-primary;
|
||||
border-radius: 100%;
|
||||
border: 1px solid $ui-black-transparent;
|
||||
border: 4px solid $ui-white-dim;
|
||||
cursor: pointer;
|
||||
padding: 0.75rem;
|
||||
user-select: none;
|
||||
@@ -118,6 +120,7 @@ $border-radius: 0.25rem;
|
||||
color: $text-primary;
|
||||
font-size: 0.625rem;
|
||||
user-select: none;
|
||||
|
||||
}
|
||||
|
||||
[dir="ltr"] .trim-button {
|
||||
@@ -130,7 +133,6 @@ $border-radius: 0.25rem;
|
||||
|
||||
.trim-button > img {
|
||||
width: 1.25rem;
|
||||
margin-bottom: -0.375rem;
|
||||
}
|
||||
|
||||
.effect-button {
|
||||
@@ -138,6 +140,7 @@ $border-radius: 0.25rem;
|
||||
color: $text-primary;
|
||||
font-size: 0.625rem;
|
||||
user-select: none;
|
||||
padding: 0.25rem 0;
|
||||
}
|
||||
|
||||
.effect-button + .effect-button {
|
||||
@@ -150,12 +153,25 @@ $border-radius: 0.25rem;
|
||||
margin-bottom: -0.375rem;
|
||||
}
|
||||
|
||||
/* mirror the louder/softer speaker icons when rtl */
|
||||
[dir="rtl"] .effect-button:nth-of-type(6) img {
|
||||
transform: scaleX(-1);
|
||||
.tool-button {
|
||||
flex-basis: 60px;
|
||||
color: $text-primary;
|
||||
font-size: 0.625rem;
|
||||
user-select: none;
|
||||
padding: 0.25rem 0;
|
||||
}
|
||||
|
||||
[dir="rtl"] .effect-button:nth-of-type(7) img {
|
||||
.tool-button + .tool-button {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.tool-button img {
|
||||
width: 4rem;
|
||||
height: 1.5rem;
|
||||
margin-bottom: -0.375rem;
|
||||
}
|
||||
|
||||
[dir="rtl"] .flip-in-rtl img {
|
||||
transform: scaleX(-1);
|
||||
}
|
||||
|
||||
@@ -167,6 +183,10 @@ $border-radius: 0.25rem;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
.button-group {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.button-group .button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
@@ -8,24 +8,29 @@ import Label from '../forms/label.jsx';
|
||||
import Input from '../forms/input.jsx';
|
||||
|
||||
import BufferedInputHOC from '../forms/buffered-input-hoc.jsx';
|
||||
import AudioTrimmer from '../../containers/audio-trimmer.jsx';
|
||||
import AudioSelector from '../../containers/audio-selector.jsx';
|
||||
import IconButton from '../icon-button/icon-button.jsx';
|
||||
|
||||
import styles from './sound-editor.css';
|
||||
|
||||
import playIcon from '../record-modal/icon--play.svg';
|
||||
import stopIcon from '../record-modal/icon--stop-playback.svg';
|
||||
import trimIcon from './icon--trim.svg';
|
||||
import trimConfirmIcon from './icon--trim-confirm.svg';
|
||||
import playIcon from './icon--play.svg';
|
||||
import stopIcon from './icon--stop.svg';
|
||||
import redoIcon from './icon--redo.svg';
|
||||
import undoIcon from './icon--undo.svg';
|
||||
import echoIcon from './icon--echo.svg';
|
||||
import fasterIcon from './icon--faster.svg';
|
||||
import slowerIcon from './icon--slower.svg';
|
||||
import louderIcon from './icon--louder.svg';
|
||||
import softerIcon from './icon--softer.svg';
|
||||
import robotIcon from './icon--robot.svg';
|
||||
import reverseIcon from './icon--reverse.svg';
|
||||
import fadeOutIcon from './icon--fade-out.svg';
|
||||
import fadeInIcon from './icon--fade-in.svg';
|
||||
import muteIcon from './icon--mute.svg';
|
||||
|
||||
import deleteIcon from './icon--delete.svg';
|
||||
import copyIcon from './icon--copy.svg';
|
||||
import pasteIcon from './icon--paste.svg';
|
||||
import copyToNewIcon from './icon--copy-to-new.svg';
|
||||
|
||||
const BufferedInput = BufferedInputHOC(Input);
|
||||
|
||||
@@ -45,10 +50,25 @@ const messages = defineMessages({
|
||||
description: 'Title of the button to stop the sound',
|
||||
defaultMessage: 'Stop'
|
||||
},
|
||||
trim: {
|
||||
id: 'gui.soundEditor.trim',
|
||||
description: 'Title of the button to start trimminging the sound',
|
||||
defaultMessage: 'Trim'
|
||||
copy: {
|
||||
id: 'gui.soundEditor.copy',
|
||||
description: 'Title of the button to copy the sound',
|
||||
defaultMessage: 'Copy'
|
||||
},
|
||||
paste: {
|
||||
id: 'gui.soundEditor.paste',
|
||||
description: 'Title of the button to paste the sound',
|
||||
defaultMessage: 'Paste'
|
||||
},
|
||||
copyToNew: {
|
||||
id: 'gui.soundEditor.copyToNew',
|
||||
description: 'Title of the button to copy the selection into a new sound',
|
||||
defaultMessage: 'Copy to New'
|
||||
},
|
||||
delete: {
|
||||
id: 'gui.soundEditor.delete',
|
||||
description: 'Title of the button to delete the sound',
|
||||
defaultMessage: 'Delete'
|
||||
},
|
||||
save: {
|
||||
id: 'gui.soundEditor.save',
|
||||
@@ -99,11 +119,30 @@ const messages = defineMessages({
|
||||
id: 'gui.soundEditor.reverse',
|
||||
description: 'Title of the button to apply the reverse effect',
|
||||
defaultMessage: 'Reverse'
|
||||
},
|
||||
fadeOut: {
|
||||
id: 'gui.soundEditor.fadeOut',
|
||||
description: 'Title of the button to apply the fade out effect',
|
||||
defaultMessage: 'Fade out'
|
||||
},
|
||||
fadeIn: {
|
||||
id: 'gui.soundEditor.fadeIn',
|
||||
description: 'Title of the button to apply the fade in effect',
|
||||
defaultMessage: 'Fade in'
|
||||
},
|
||||
mute: {
|
||||
id: 'gui.soundEditor.mute',
|
||||
description: 'Title of the button to apply the mute effect',
|
||||
defaultMessage: 'Mute'
|
||||
}
|
||||
});
|
||||
|
||||
const SoundEditor = props => (
|
||||
<div className={styles.editorContainer}>
|
||||
<div
|
||||
className={styles.editorContainer}
|
||||
ref={props.setRef}
|
||||
onMouseDown={props.onContainerClick}
|
||||
>
|
||||
<div className={styles.row}>
|
||||
<div className={styles.inputGroup}>
|
||||
<Label text={props.intl.formatMessage(messages.sound)}>
|
||||
@@ -141,17 +180,33 @@ const SoundEditor = props => (
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.inputGroup}>
|
||||
<IconButton
|
||||
className={styles.toolButton}
|
||||
img={copyIcon}
|
||||
title={props.intl.formatMessage(messages.copy)}
|
||||
onClick={props.onCopy}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.toolButton}
|
||||
disabled={props.canPaste === false}
|
||||
img={pasteIcon}
|
||||
title={props.intl.formatMessage(messages.paste)}
|
||||
onClick={props.onPaste}
|
||||
/>
|
||||
<IconButton
|
||||
className={classNames(styles.toolButton, styles.flipInRtl)}
|
||||
img={copyToNewIcon}
|
||||
title={props.intl.formatMessage(messages.copyToNew)}
|
||||
onClick={props.onCopyToNew}
|
||||
/>
|
||||
</div>
|
||||
<IconButton
|
||||
className={classNames(styles.trimButton, {
|
||||
[styles.trimButtonActive]: props.trimStart !== null
|
||||
})}
|
||||
img={props.trimStart === null ? trimIcon : trimConfirmIcon}
|
||||
title={props.trimStart === null ? (
|
||||
<FormattedMessage {...messages.trim} />
|
||||
) : (
|
||||
<FormattedMessage {...messages.save} />
|
||||
)}
|
||||
onClick={props.onActivateTrim}
|
||||
className={styles.toolButton}
|
||||
disabled={props.trimStart === null}
|
||||
img={deleteIcon}
|
||||
title={props.intl.formatMessage(messages.delete)}
|
||||
onClick={props.onDelete}
|
||||
/>
|
||||
</div>
|
||||
<div className={styles.row}>
|
||||
@@ -161,12 +216,13 @@ const SoundEditor = props => (
|
||||
height={160}
|
||||
width={600}
|
||||
/>
|
||||
<AudioTrimmer
|
||||
<AudioSelector
|
||||
playhead={props.playhead}
|
||||
trimEnd={props.trimEnd}
|
||||
trimStart={props.trimStart}
|
||||
onSetTrimEnd={props.onSetTrimEnd}
|
||||
onSetTrimStart={props.onSetTrimStart}
|
||||
onPlay={props.onPlay}
|
||||
onSetTrim={props.onSetTrim}
|
||||
onStop={props.onStop}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -209,61 +265,81 @@ const SoundEditor = props => (
|
||||
onClick={props.onSlower}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
img={echoIcon}
|
||||
title={<FormattedMessage {...messages.echo} />}
|
||||
onClick={props.onEcho}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
img={robotIcon}
|
||||
title={<FormattedMessage {...messages.robot} />}
|
||||
onClick={props.onRobot}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
className={classNames(styles.effectButton, styles.flipInRtl)}
|
||||
img={louderIcon}
|
||||
title={<FormattedMessage {...messages.louder} />}
|
||||
onClick={props.onLouder}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
className={classNames(styles.effectButton, styles.flipInRtl)}
|
||||
img={softerIcon}
|
||||
title={<FormattedMessage {...messages.softer} />}
|
||||
onClick={props.onSofter}
|
||||
/>
|
||||
<IconButton
|
||||
className={classNames(styles.effectButton, styles.flipInRtl)}
|
||||
img={muteIcon}
|
||||
title={<FormattedMessage {...messages.mute} />}
|
||||
onClick={props.onMute}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
img={fadeInIcon}
|
||||
title={<FormattedMessage {...messages.fadeIn} />}
|
||||
onClick={props.onFadeIn}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
img={fadeOutIcon}
|
||||
title={<FormattedMessage {...messages.fadeOut} />}
|
||||
onClick={props.onFadeOut}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
img={reverseIcon}
|
||||
title={<FormattedMessage {...messages.reverse} />}
|
||||
onClick={props.onReverse}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.effectButton}
|
||||
img={robotIcon}
|
||||
title={<FormattedMessage {...messages.robot} />}
|
||||
onClick={props.onRobot}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
SoundEditor.propTypes = {
|
||||
canPaste: PropTypes.bool.isRequired,
|
||||
canRedo: PropTypes.bool.isRequired,
|
||||
canUndo: PropTypes.bool.isRequired,
|
||||
chunkLevels: PropTypes.arrayOf(PropTypes.number).isRequired,
|
||||
intl: intlShape,
|
||||
name: PropTypes.string.isRequired,
|
||||
onActivateTrim: PropTypes.func,
|
||||
onChangeName: PropTypes.func.isRequired,
|
||||
onContainerClick: PropTypes.func.isRequired,
|
||||
onCopy: PropTypes.func.isRequired,
|
||||
onCopyToNew: PropTypes.func.isRequired,
|
||||
onDelete: PropTypes.func,
|
||||
onEcho: PropTypes.func.isRequired,
|
||||
onFadeIn: PropTypes.func.isRequired,
|
||||
onFadeOut: PropTypes.func.isRequired,
|
||||
onFaster: PropTypes.func.isRequired,
|
||||
onLouder: PropTypes.func.isRequired,
|
||||
onMute: PropTypes.func.isRequired,
|
||||
onPaste: PropTypes.func.isRequired,
|
||||
onPlay: PropTypes.func.isRequired,
|
||||
onRedo: PropTypes.func.isRequired,
|
||||
onReverse: PropTypes.func.isRequired,
|
||||
onRobot: PropTypes.func.isRequired,
|
||||
onSetTrimEnd: PropTypes.func,
|
||||
onSetTrimStart: PropTypes.func,
|
||||
onSetTrim: PropTypes.func,
|
||||
onSlower: PropTypes.func.isRequired,
|
||||
onSofter: PropTypes.func.isRequired,
|
||||
onStop: PropTypes.func.isRequired,
|
||||
onUndo: PropTypes.func.isRequired,
|
||||
playhead: PropTypes.number,
|
||||
setRef: PropTypes.func,
|
||||
trimEnd: PropTypes.number,
|
||||
trimStart: PropTypes.number
|
||||
};
|
||||
|
||||
@@ -19,17 +19,21 @@ class Waveform extends React.PureComponent {
|
||||
// composite time when animating the playhead
|
||||
const takeEveryN = Math.ceil(data.length / width);
|
||||
|
||||
const filteredData = takeEveryN === 1 ? data :
|
||||
const filteredData = takeEveryN === 1 ? data.slice(0) :
|
||||
data.filter((_, i) => i % takeEveryN === 0);
|
||||
|
||||
const cappedData = [0, ...filteredData, 0];
|
||||
// Need at least two points to render waveform.
|
||||
if (filteredData.length === 1) {
|
||||
filteredData.push(filteredData[0]);
|
||||
}
|
||||
|
||||
const maxIndex = filteredData.length - 1;
|
||||
const points = [
|
||||
...cappedData.map((v, i) =>
|
||||
[width * i / cappedData.length, height * v / 2]
|
||||
...filteredData.map((v, i) =>
|
||||
[width * (i / maxIndex), height * v / 2]
|
||||
),
|
||||
...cappedData.reverse().map((v, i) =>
|
||||
[width * (cappedData.length - i - 1) / cappedData.length, -height * v / 2]
|
||||
...filteredData.reverse().map((v, i) =>
|
||||
[width * (1 - (i / maxIndex)), -height * v / 2]
|
||||
)
|
||||
];
|
||||
const pathComponents = points.map(([x, y], i) => {
|
||||
@@ -40,15 +44,8 @@ class Waveform extends React.PureComponent {
|
||||
return (
|
||||
<svg
|
||||
className={styles.container}
|
||||
viewBox={`-1 0 ${width} ${height}`}
|
||||
viewBox={`0 0 ${width} ${height}`}
|
||||
>
|
||||
<line
|
||||
className={styles.baseline}
|
||||
x1={-1}
|
||||
x2={width}
|
||||
y1={height / 2}
|
||||
y2={height / 2}
|
||||
/>
|
||||
<g transform={`scale(1, -1) translate(0, -${height / 2})`}>
|
||||
<path
|
||||
className={styles.waveformPath}
|
||||
|
||||