@moises.ai/design-system 4.16.10 → 4.17.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/dist/{ChordDiagramGridIcon-CxpGQmg4.js → DynamicMicrophone2Icon-BBVZw0ZO.js} +794 -782
- package/dist/icons.js +484 -483
- package/dist/index.js +5454 -5762
- package/package.json +1 -1
- package/src/components/DropdownButton/DropdownButton.jsx +7 -0
- package/src/components/DropdownButton/DropdownButton.stories.jsx +4 -1
- package/src/components/InstrumentSelector/InstrumentSelector.stories.jsx +9 -1
- package/src/components/MessageWithAction/MessageWithAction.jsx +7 -0
- package/src/components/MessageWithAction/MessageWithAction.stories.jsx +4 -1
- package/src/components/Tooltip/Tooltip.jsx +35 -9
- package/src/components/Tooltip/Tooltip.module.css +48 -0
- package/src/components/Tooltip/Tooltip.stories.jsx +42 -0
- package/src/components/TrackControlsToggle/TrackControlsToggle.stories.jsx +7 -3
- package/src/icons/DynamicMicrophone2Icon.jsx +13 -0
- package/src/icons.jsx +1 -0
- package/src/index.jsx +2 -2
- package/src/lib/menu/renderItem.jsx +1 -3
- package/src/components/PlayerBar/PlayerBar.jsx +0 -250
- package/src/components/PlayerBar/PlayerBar.module.css +0 -135
- package/src/components/PlayerBar/PlayerBar.stories.jsx +0 -519
- package/src/components/PlayerMasterVolume/PlayerMasterVolume.jsx +0 -54
- package/src/components/PlayerMasterVolume/PlayerMasterVolume.module.css +0 -31
- package/src/components/PlayerMasterVolume/PlayerMasterVolume.stories.jsx +0 -182
- package/src/components/PlayerSlider/PlayerSlider.jsx +0 -80
- package/src/components/PlayerSlider/PlayerSlider.module.css +0 -180
- package/src/components/PlayerSlider/PlayerSlider.stories.jsx +0 -97
- package/src/components/PlayerSlider/PlayerSliderWaveform.jsx +0 -70
- package/src/components/PlayerSmartMetronome/PlayerSmartMetronome.jsx +0 -79
- package/src/components/PlayerSmartMetronome/PlayerSmartMetronome.module.css +0 -23
- package/src/components/PlayerSmartMetronome/PlayerSmartMetronome.stories.jsx +0 -225
- package/src/components/PlayerSmartMetronome/SegmentedField.jsx +0 -19
- package/src/components/PlayerTempoPitch/PlayerTempoPitch.jsx +0 -123
- package/src/components/PlayerTempoPitch/PlayerTempoPitch.module.css +0 -25
- package/src/components/PlayerTempoPitch/PlayerTempoPitch.stories.jsx +0 -215
- package/src/components/PlayerTempoPitch/StepperField.jsx +0 -57
- package/src/components/PlayerTempoPitch/constants.js +0 -40
package/package.json
CHANGED
|
@@ -6,6 +6,13 @@ import { ChevronDownIcon } from '../../icons/ChevronDownIcon'
|
|
|
6
6
|
import { Button } from '../Button/Button'
|
|
7
7
|
import styles from './DropdownButton.module.css'
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated Use `ToolsDropdown` instead. `DropdownButton` will be removed in a
|
|
11
|
+
* future release. The new component is built on Radix DropdownMenu and supports the
|
|
12
|
+
* same trigger/chevron split, controlled open state, and custom panel content.
|
|
13
|
+
*
|
|
14
|
+
* @see ToolsDropdown
|
|
15
|
+
*/
|
|
9
16
|
export const DropdownButton = ({
|
|
10
17
|
children,
|
|
11
18
|
trigger,
|
|
@@ -7,13 +7,16 @@ import { Stop2Icon } from '../../icons/Stop2Icon'
|
|
|
7
7
|
import { RecordIcon } from '../../icons/RecordIcon'
|
|
8
8
|
|
|
9
9
|
export default {
|
|
10
|
-
title: '
|
|
10
|
+
title: 'Deprecated/DropdownButton',
|
|
11
11
|
component: DropdownButton,
|
|
12
12
|
parameters: {
|
|
13
13
|
layout: 'centered',
|
|
14
14
|
docs: {
|
|
15
15
|
description: {
|
|
16
16
|
component: `
|
|
17
|
+
> **Deprecated:** Use [\`ToolsDropdown\`](/docs/components-toolsdropdown--docs) instead.
|
|
18
|
+
> \`DropdownButton\` will be removed in a future release.
|
|
19
|
+
|
|
17
20
|
## Usage
|
|
18
21
|
|
|
19
22
|
The DropdownButton is a component that combines a trigger button with a dropdown chevron.
|
|
@@ -9,10 +9,18 @@ import {
|
|
|
9
9
|
} from '../../icons'
|
|
10
10
|
|
|
11
11
|
export default {
|
|
12
|
-
title: '
|
|
12
|
+
title: 'Deprecated/InstrumentSelector',
|
|
13
13
|
component: InstrumentSelector,
|
|
14
14
|
parameters: {
|
|
15
15
|
layout: 'centered',
|
|
16
|
+
docs: {
|
|
17
|
+
description: {
|
|
18
|
+
component: `
|
|
19
|
+
> **Deprecated:** Use [\`InstrumentSelect\`](/docs/components-instrumentselect--docs) instead.
|
|
20
|
+
> \`InstrumentSelector\` will be removed in a future release.
|
|
21
|
+
`,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
16
24
|
},
|
|
17
25
|
tags: ['autodocs'],
|
|
18
26
|
}
|
|
@@ -5,6 +5,13 @@ import React from 'react'
|
|
|
5
5
|
import styles from './MessageWithAction.module.css'
|
|
6
6
|
import classNames from 'classnames'
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated Use `Callout` instead. `MessageWithAction` will be removed in a
|
|
10
|
+
* future release. Map `message` to `text`, `type` to `color` (`error` → `error`,
|
|
11
|
+
* `warn` → `warning`), and `ctaLabel`/`onClick` to `buttonProps`.
|
|
12
|
+
*
|
|
13
|
+
* @see Callout
|
|
14
|
+
*/
|
|
8
15
|
export const MessageWithAction = ({
|
|
9
16
|
type,
|
|
10
17
|
message,
|
|
@@ -4,13 +4,16 @@ import { Flex, Text, Tooltip } from '@radix-ui/themes'
|
|
|
4
4
|
import { InfoIcon } from '../../icons'
|
|
5
5
|
|
|
6
6
|
export default {
|
|
7
|
-
title: '
|
|
7
|
+
title: 'Deprecated/MessageWithAction',
|
|
8
8
|
component: MessageWithAction,
|
|
9
9
|
parameters: {
|
|
10
10
|
layout: 'centered',
|
|
11
11
|
docs: {
|
|
12
12
|
description: {
|
|
13
13
|
component: `
|
|
14
|
+
> **Deprecated:** Use [\`Callout\`](/docs/components-callout--docs) instead.
|
|
15
|
+
> \`MessageWithAction\` will be removed in a future release.
|
|
16
|
+
|
|
14
17
|
## Basic Usage
|
|
15
18
|
|
|
16
19
|
### MessageWithAction
|
|
@@ -9,6 +9,9 @@ export const Tooltip = ({
|
|
|
9
9
|
content,
|
|
10
10
|
shortcut,
|
|
11
11
|
color = 'gray',
|
|
12
|
+
variant = 'default',
|
|
13
|
+
title,
|
|
14
|
+
headerActions,
|
|
12
15
|
delayDuration = 200,
|
|
13
16
|
skipDelayDuration,
|
|
14
17
|
disableHoverableContent,
|
|
@@ -22,6 +25,8 @@ export const Tooltip = ({
|
|
|
22
25
|
...restContentProps
|
|
23
26
|
} = props
|
|
24
27
|
|
|
28
|
+
const isDiagram = variant === 'diagram'
|
|
29
|
+
|
|
25
30
|
const providerProps = {
|
|
26
31
|
delayDuration,
|
|
27
32
|
skipDelayDuration,
|
|
@@ -45,19 +50,40 @@ export const Tooltip = ({
|
|
|
45
50
|
<TooltipPrimitive.Content
|
|
46
51
|
className={classNames(
|
|
47
52
|
styles.TooltipContent,
|
|
48
|
-
styles[`TooltipContent--${color}`]
|
|
53
|
+
!isDiagram && styles[`TooltipContent--${color}`],
|
|
54
|
+
isDiagram && styles.TooltipDiagram
|
|
49
55
|
)}
|
|
50
56
|
sideOffset={5}
|
|
51
57
|
{...restContentProps}
|
|
52
58
|
>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
{isDiagram ? (
|
|
60
|
+
<>
|
|
61
|
+
<div className={styles.TooltipDiagramHeader}>
|
|
62
|
+
{title && (
|
|
63
|
+
<Text size='2' className={styles.TooltipDiagramTitle}>
|
|
64
|
+
{title}
|
|
65
|
+
</Text>
|
|
66
|
+
)}
|
|
67
|
+
{headerActions && (
|
|
68
|
+
<div className={styles.TooltipDiagramActions}>
|
|
69
|
+
{headerActions}
|
|
70
|
+
</div>
|
|
71
|
+
)}
|
|
72
|
+
</div>
|
|
73
|
+
<div className={styles.TooltipDiagramBody}>{content}</div>
|
|
74
|
+
</>
|
|
75
|
+
) : (
|
|
76
|
+
<>
|
|
77
|
+
<Text size='1' className={styles.TooltipText}>{content}</Text>
|
|
78
|
+
{shortcut && (
|
|
79
|
+
<Text size='0' className={classNames(
|
|
80
|
+
styles.TooltipShortcut,
|
|
81
|
+
styles[`TooltipShortcut--${color}`]
|
|
82
|
+
)}>
|
|
83
|
+
{shortcut}
|
|
84
|
+
</Text>
|
|
85
|
+
)}
|
|
86
|
+
</>
|
|
61
87
|
)}
|
|
62
88
|
<TooltipPrimitive.Arrow className={styles.TooltipArrow} />
|
|
63
89
|
</TooltipPrimitive.Content>
|
|
@@ -85,6 +85,54 @@
|
|
|
85
85
|
color: rgba(252, 253, 255, 0.94);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
/* Diagram variant (matches the "tooltip diagram" surface from Figma) */
|
|
89
|
+
.TooltipDiagram {
|
|
90
|
+
flex-direction: column;
|
|
91
|
+
align-items: stretch;
|
|
92
|
+
gap: var(--spacing-1, 4px);
|
|
93
|
+
max-width: none;
|
|
94
|
+
padding: var(--spacing-1, 4px) var(--spacing-2, 8px) var(--spacing-2, 8px);
|
|
95
|
+
border-radius: var(--radius-4, 8px);
|
|
96
|
+
background: var(--panel-solid, #18191b);
|
|
97
|
+
color: var(--neutral-alpha-12, rgba(252, 253, 255, 0.94));
|
|
98
|
+
box-shadow:
|
|
99
|
+
0 12px 32px -16px rgba(0, 0, 0, 0.3),
|
|
100
|
+
0 12px 60px 0 rgba(0, 0, 0, 0.15);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.TooltipDiagram .TooltipArrow {
|
|
104
|
+
fill: var(--panel-solid, #18191b);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.TooltipDiagramHeader {
|
|
108
|
+
display: flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
justify-content: space-between;
|
|
111
|
+
gap: var(--spacing-2, 8px);
|
|
112
|
+
width: 100%;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.TooltipDiagramTitle {
|
|
116
|
+
color: var(--neutral-alpha-9, rgba(223, 235, 253, 0.43));
|
|
117
|
+
font-weight: 400;
|
|
118
|
+
font-size: 14px;
|
|
119
|
+
line-height: 20px;
|
|
120
|
+
white-space: nowrap;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.TooltipDiagramActions {
|
|
124
|
+
display: inline-flex;
|
|
125
|
+
align-items: center;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.TooltipDiagramBody {
|
|
129
|
+
display: flex;
|
|
130
|
+
flex-direction: column;
|
|
131
|
+
align-items: center;
|
|
132
|
+
gap: var(--spacing-1, 4px);
|
|
133
|
+
width: 100%;
|
|
134
|
+
}
|
|
135
|
+
|
|
88
136
|
.TooltipText {
|
|
89
137
|
white-space: normal;
|
|
90
138
|
overflow-wrap: anywhere;
|
|
@@ -13,6 +13,10 @@ export default {
|
|
|
13
13
|
control: 'select',
|
|
14
14
|
options: ['white', 'gray'],
|
|
15
15
|
},
|
|
16
|
+
variant: {
|
|
17
|
+
control: 'select',
|
|
18
|
+
options: ['default', 'diagram'],
|
|
19
|
+
},
|
|
16
20
|
},
|
|
17
21
|
}
|
|
18
22
|
|
|
@@ -58,4 +62,42 @@ export const WithShortcutWhite = {
|
|
|
58
62
|
color: 'white',
|
|
59
63
|
children: <Button>Hover me</Button>,
|
|
60
64
|
},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const Diagram = {
|
|
68
|
+
args: {
|
|
69
|
+
variant: 'diagram',
|
|
70
|
+
title: 'Diagram',
|
|
71
|
+
side: 'top',
|
|
72
|
+
open: true,
|
|
73
|
+
headerActions: (
|
|
74
|
+
<button
|
|
75
|
+
type="button"
|
|
76
|
+
aria-label="More"
|
|
77
|
+
style={{
|
|
78
|
+
width: 12,
|
|
79
|
+
height: 24,
|
|
80
|
+
padding: 0,
|
|
81
|
+
border: 'none',
|
|
82
|
+
background: 'transparent',
|
|
83
|
+
color: 'rgba(223, 235, 253, 0.43)',
|
|
84
|
+
cursor: 'pointer',
|
|
85
|
+
lineHeight: 0,
|
|
86
|
+
}}
|
|
87
|
+
>
|
|
88
|
+
⋮
|
|
89
|
+
</button>
|
|
90
|
+
),
|
|
91
|
+
content: (
|
|
92
|
+
<div
|
|
93
|
+
style={{
|
|
94
|
+
width: 100,
|
|
95
|
+
height: 155,
|
|
96
|
+
borderRadius: 8,
|
|
97
|
+
background: '#edeef0',
|
|
98
|
+
}}
|
|
99
|
+
/>
|
|
100
|
+
),
|
|
101
|
+
children: <Button>Hover me</Button>,
|
|
102
|
+
},
|
|
61
103
|
}
|
|
@@ -2,14 +2,18 @@ import { useState } from 'react'
|
|
|
2
2
|
import { TrackControlsToggle } from './TrackControlsToggle'
|
|
3
3
|
|
|
4
4
|
export default {
|
|
5
|
-
title: '
|
|
5
|
+
title: 'Deprecated/TrackControlsToggle',
|
|
6
6
|
component: TrackControlsToggle,
|
|
7
7
|
parameters: {
|
|
8
8
|
layout: 'centered',
|
|
9
9
|
docs: {
|
|
10
10
|
description: {
|
|
11
|
-
component:
|
|
12
|
-
|
|
11
|
+
component: `
|
|
12
|
+
> **Deprecated:** Use [\`TrackControlButton\`](/docs/components-trackcontrolbutton--docs) with \`variant={type}\` and \`isActive={selected}\` instead.
|
|
13
|
+
> \`TrackControlsToggle\` will be removed in a future release.
|
|
14
|
+
|
|
15
|
+
Toggle button for track controls (Record, Mute, Auto Mute, and Solo). For \`type="autoMute"\`, o Figma define um único visual (amarelo em fundo alpha-2); \`selected\` só afeta \`aria-pressed\`, não as cores.
|
|
16
|
+
`,
|
|
13
17
|
},
|
|
14
18
|
},
|
|
15
19
|
},
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const DynamicMicrophone2Icon = ({ width = 16, height = 16, className, ...props }) => (
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width={width} height={height} viewBox="0 0 16 16" fill="none" className={className} {...props}>
|
|
3
|
+
<path
|
|
4
|
+
d="M10.5846 8.14349L3.4361 14.6667L1.33331 12.5639L7.8565 5.41543M7.30522 8.69477L6.37888 9.62111M13.6616 7.19124C12.3215 8.53131 10.1488 8.53131 8.80876 7.19124C7.46868 5.85116 7.46868 3.67847 8.80876 2.3384C10.1488 0.998325 12.3215 0.998325 13.6616 2.3384C15.0017 3.67847 15.0017 5.85116 13.6616 7.19124Z"
|
|
5
|
+
stroke="currentColor"
|
|
6
|
+
strokeWidth="0.666667"
|
|
7
|
+
strokeLinecap="round"
|
|
8
|
+
strokeLinejoin="round"
|
|
9
|
+
/>
|
|
10
|
+
</svg>
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
DynamicMicrophone2Icon.displayName = 'DynamicMicrophone2Icon'
|
package/src/icons.jsx
CHANGED
|
@@ -437,3 +437,4 @@ export { RewindBarFillIcon } from './icons/RewindBarFillIcon'
|
|
|
437
437
|
export { ForwardBarFillIcon } from './icons/ForwardBarFillIcon'
|
|
438
438
|
export { ChordGrid3Icon } from './icons/ChordGrid3Icon'
|
|
439
439
|
export { ChordDiagramGridIcon } from './icons/ChordDiagramGridIcon'
|
|
440
|
+
export { DynamicMicrophone2Icon } from './icons/DynamicMicrophone2Icon'
|
package/src/index.jsx
CHANGED
|
@@ -51,6 +51,7 @@ export { CigarBar } from './components/CigarBar/CigarBar'
|
|
|
51
51
|
export { ContextMenu } from './components/ContextMenu/ContextMenu'
|
|
52
52
|
export { Countdown } from './components/Countdown/Countdown'
|
|
53
53
|
export { DataTable } from './components/DataTable/DataTable'
|
|
54
|
+
/** @deprecated Use `ToolsDropdown` instead. */
|
|
54
55
|
export { DropdownButton } from './components/DropdownButton/DropdownButton'
|
|
55
56
|
export { DropdownMenu } from './components/DropdownMenu/DropdownMenu'
|
|
56
57
|
export { ToolsDropdown } from './components/ToolsDropdown/ToolsDropdown'
|
|
@@ -75,6 +76,7 @@ export { InstrumentSelectCard } from './components/InstrumentSelect/InstrumentSe
|
|
|
75
76
|
export { InstrumentSelector } from './components/InstrumentSelector/InstrumentSelector'
|
|
76
77
|
export { Knob } from './components/Knob/Knob'
|
|
77
78
|
export { ListCards } from './components/ListCards/ListCards'
|
|
79
|
+
/** @deprecated Use `Callout` instead. */
|
|
78
80
|
export { MessageWithAction } from './components/MessageWithAction/MessageWithAction'
|
|
79
81
|
export { MetronomeForm } from './components/MetronomeForm/MetronomeForm'
|
|
80
82
|
export { MoreButton } from './components/MoreButton/MoreButton'
|
|
@@ -82,8 +84,6 @@ export { MultiSelect } from './components/MultiSelect/MultiSelect'
|
|
|
82
84
|
export { MultiSelectCards } from './components/MultiSelectCards/MultiSelectCards'
|
|
83
85
|
export { PanControl } from './components/PanControl/PanControl'
|
|
84
86
|
export { PeakLevel } from './components/PeakLevel/PeakLevel'
|
|
85
|
-
export { PlayerBar } from './components/PlayerBar/PlayerBar'
|
|
86
|
-
export { PlayerSlider } from './components/PlayerSlider/PlayerSlider'
|
|
87
87
|
export { PreviewCard } from './components/PreviewCard/PreviewCard'
|
|
88
88
|
export { ProductsBrandPattern } from './components/ProductsBrandPattern/ProductsBrandPattern'
|
|
89
89
|
export { ProductsList } from './components/ProductsList/ProductsList'
|
|
@@ -80,9 +80,7 @@ export const createRenderItem = (MenuPrimitives) => {
|
|
|
80
80
|
</div>
|
|
81
81
|
</MenuPrimitives.SubTrigger>
|
|
82
82
|
|
|
83
|
-
<MenuPrimitives.SubContent
|
|
84
|
-
className={classNames(styles.menuSubContent, opt.subContentClassName)}
|
|
85
|
-
>
|
|
83
|
+
<MenuPrimitives.SubContent className={styles.menuSubContent}>
|
|
86
84
|
{opt?.children?.map((child) =>
|
|
87
85
|
renderItem(
|
|
88
86
|
child,
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import classNames from 'classnames'
|
|
2
|
-
import {
|
|
3
|
-
MusicNoteIcon,
|
|
4
|
-
PlayIcon,
|
|
5
|
-
More2Icon,
|
|
6
|
-
Volume2Icon,
|
|
7
|
-
RewindBarFillIcon,
|
|
8
|
-
ForwardBarFillIcon,
|
|
9
|
-
PauseFilledIcon,
|
|
10
|
-
PlayOnRepeatIcon,
|
|
11
|
-
KaraokeMicIcon,
|
|
12
|
-
ChordsDetectionIcon,
|
|
13
|
-
MetronomeIcon,
|
|
14
|
-
ChevronDownIcon,
|
|
15
|
-
Share2Icon,
|
|
16
|
-
Video2Icon,
|
|
17
|
-
ChevronUpIcon,
|
|
18
|
-
} from '../../icons'
|
|
19
|
-
import { Text, Flex, IconButton, DropdownMenu, DropdownButton, Separator, Popover } from '../../index'
|
|
20
|
-
import styles from './PlayerBar.module.css'
|
|
21
|
-
import { PlayerSlider } from '../PlayerSlider/PlayerSlider'
|
|
22
|
-
|
|
23
|
-
const formatTime = (time) => {
|
|
24
|
-
const totalSeconds = Math.floor(time)
|
|
25
|
-
const minutes = Math.floor(totalSeconds / 60)
|
|
26
|
-
const seconds = totalSeconds % 60
|
|
27
|
-
return `${minutes}:${seconds.toString().padStart(2, '0')}`
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export const PlayerBar = ({
|
|
31
|
-
title = 'Untitled track',
|
|
32
|
-
subtitle,
|
|
33
|
-
cover,
|
|
34
|
-
menuOptions,
|
|
35
|
-
showSlider = true,
|
|
36
|
-
color = 'gray', // can be 'gray' or 'dark'
|
|
37
|
-
className,
|
|
38
|
-
// playback time
|
|
39
|
-
currentTime = 0,
|
|
40
|
-
duration = 0,
|
|
41
|
-
// transport
|
|
42
|
-
onSeekBackward,
|
|
43
|
-
onSeekForward,
|
|
44
|
-
onPlayPause,
|
|
45
|
-
isPlaying = false,
|
|
46
|
-
// timeline
|
|
47
|
-
audio,
|
|
48
|
-
onSeek,
|
|
49
|
-
// version dropdown
|
|
50
|
-
versionTrigger,
|
|
51
|
-
versionContent,
|
|
52
|
-
// tempo and pitch dropdown
|
|
53
|
-
tempoPitchContent,
|
|
54
|
-
tempo,
|
|
55
|
-
pitch,
|
|
56
|
-
// metronome dropdown
|
|
57
|
-
metronomeContent,
|
|
58
|
-
metronomeEnabled,
|
|
59
|
-
onMetronomeToggle,
|
|
60
|
-
// volume popover
|
|
61
|
-
volumeContent,
|
|
62
|
-
onVolumeClick,
|
|
63
|
-
// lyrics
|
|
64
|
-
lyricsEnabled,
|
|
65
|
-
onLyricsToggle,
|
|
66
|
-
// chords detection
|
|
67
|
-
chordsEnabled = false,
|
|
68
|
-
onChordsToggle,
|
|
69
|
-
// loop
|
|
70
|
-
loopEnabled,
|
|
71
|
-
onLoopToggle,
|
|
72
|
-
// video and share
|
|
73
|
-
onVideoClick,
|
|
74
|
-
onShareClick,
|
|
75
|
-
// expand
|
|
76
|
-
expanded,
|
|
77
|
-
onExpandToggle,
|
|
78
|
-
}) => {
|
|
79
|
-
return (
|
|
80
|
-
<section
|
|
81
|
-
aria-label="Player controls"
|
|
82
|
-
className={classNames(styles.playerBarContainer, className)}
|
|
83
|
-
>
|
|
84
|
-
{showSlider && (
|
|
85
|
-
<PlayerSlider
|
|
86
|
-
currentTime={currentTime}
|
|
87
|
-
duration={duration}
|
|
88
|
-
audio={audio}
|
|
89
|
-
onSeek={onSeek}
|
|
90
|
-
/>
|
|
91
|
-
)}
|
|
92
|
-
<Flex
|
|
93
|
-
gap="6"
|
|
94
|
-
className={classNames(styles.playerBar, {
|
|
95
|
-
[styles.gray]: color === 'gray',
|
|
96
|
-
[styles.dark]: color === 'dark',
|
|
97
|
-
})}
|
|
98
|
-
align="start"
|
|
99
|
-
>
|
|
100
|
-
<Flex align="center" gap="3" className={styles.flex2}>
|
|
101
|
-
<Flex align="center" gap="4">
|
|
102
|
-
{cover ? (
|
|
103
|
-
<img src={cover} alt="Cover" className={styles.cover} />
|
|
104
|
-
) : (
|
|
105
|
-
<div className={styles.cover}>
|
|
106
|
-
<MusicNoteIcon width={16} height={16} />
|
|
107
|
-
</div>
|
|
108
|
-
)}
|
|
109
|
-
</Flex>
|
|
110
|
-
<Flex gap="3" pt="5px" align="start">
|
|
111
|
-
<Flex direction="column" gap="0" className={styles.trackMeta}>
|
|
112
|
-
<Text size="2" weight="medium" className={classNames(styles.trackLabel, styles.neutral12)}>
|
|
113
|
-
{title}
|
|
114
|
-
</Text>
|
|
115
|
-
{subtitle ? (
|
|
116
|
-
<Text size="1" weight="regular" className={classNames(styles.trackLabel, styles.neutralAlpha10)}>
|
|
117
|
-
{subtitle}
|
|
118
|
-
</Text>
|
|
119
|
-
) : null}
|
|
120
|
-
</Flex>
|
|
121
|
-
<Flex align="center" gap="2">{menuOptions && (
|
|
122
|
-
<DropdownMenu
|
|
123
|
-
trigger={
|
|
124
|
-
<IconButton variant="ghost" size="2" className={styles.menuOptionsTrigger}>
|
|
125
|
-
<More2Icon width={16} height={16} />
|
|
126
|
-
</IconButton>}
|
|
127
|
-
options={menuOptions}
|
|
128
|
-
/>
|
|
129
|
-
)}
|
|
130
|
-
{versionContent && versionTrigger && (
|
|
131
|
-
<DropdownButton trigger={versionTrigger} showSeparator={false} className={styles.customDropdownButton}>
|
|
132
|
-
{versionContent}
|
|
133
|
-
</DropdownButton>
|
|
134
|
-
)}
|
|
135
|
-
</Flex>
|
|
136
|
-
</Flex>
|
|
137
|
-
|
|
138
|
-
</Flex>
|
|
139
|
-
|
|
140
|
-
<Flex className={styles.flex1} direction="column" gap="0" align="center">
|
|
141
|
-
<Flex align="center" gap="3">
|
|
142
|
-
{volumeContent && (
|
|
143
|
-
<Popover.Root>
|
|
144
|
-
<Popover.Trigger>
|
|
145
|
-
<IconButton variant="ghost" size="2" onClick={onVolumeClick}>
|
|
146
|
-
<Volume2Icon width={16} height={16} />
|
|
147
|
-
</IconButton>
|
|
148
|
-
</Popover.Trigger>
|
|
149
|
-
<Popover.Content>
|
|
150
|
-
{volumeContent}
|
|
151
|
-
</Popover.Content>
|
|
152
|
-
</Popover.Root>
|
|
153
|
-
)}
|
|
154
|
-
<Flex gap='0' >
|
|
155
|
-
<IconButton variant="ghost" size="4" onClick={onSeekBackward} className={styles.controlsIconButton}>
|
|
156
|
-
<RewindBarFillIcon width={30} height={30} />
|
|
157
|
-
</IconButton>
|
|
158
|
-
<IconButton variant="ghost" size="4" onClick={onPlayPause} className={styles.controlsIconButton}>
|
|
159
|
-
{isPlaying ? <PauseFilledIcon width={30} height={30} /> : <PlayIcon width={30} height={30} />}
|
|
160
|
-
</IconButton>
|
|
161
|
-
<IconButton variant="ghost" size="4" onClick={onSeekForward} className={styles.controlsIconButton}>
|
|
162
|
-
<ForwardBarFillIcon width={30} height={30} />
|
|
163
|
-
</IconButton>
|
|
164
|
-
</Flex>
|
|
165
|
-
<IconButton variant="ghost" size="2" onClick={onLoopToggle}>
|
|
166
|
-
<PlayOnRepeatIcon width={16} height={16}
|
|
167
|
-
className={classNames({
|
|
168
|
-
[styles.actionIconActive]: !loopEnabled,
|
|
169
|
-
[styles.actionIconDefault]: loopEnabled
|
|
170
|
-
})}
|
|
171
|
-
/>
|
|
172
|
-
</IconButton>
|
|
173
|
-
</Flex>
|
|
174
|
-
<Text size="1" weight="regular" className={styles.neutralAlpha10}>
|
|
175
|
-
{formatTime(currentTime)} / {formatTime(duration)}
|
|
176
|
-
</Text>
|
|
177
|
-
</Flex>
|
|
178
|
-
|
|
179
|
-
<Flex align="center" gap="3" className={classNames(styles.flex2, styles.actionsContainer)}>
|
|
180
|
-
{tempoPitchContent && (
|
|
181
|
-
<DropdownButton trigger={
|
|
182
|
-
<Text className={styles.neutralAlpha11}>
|
|
183
|
-
{tempo} bpm
|
|
184
|
-
<Text className={styles.neutralAlpha6}> / </Text>
|
|
185
|
-
{pitch}
|
|
186
|
-
</Text>
|
|
187
|
-
} showSeparator={false} className={styles.customDropdownButton}>
|
|
188
|
-
{tempoPitchContent}
|
|
189
|
-
</DropdownButton>
|
|
190
|
-
)}
|
|
191
|
-
{metronomeContent && (
|
|
192
|
-
<DropdownButton
|
|
193
|
-
trigger={
|
|
194
|
-
<MetronomeIcon width={16} height={16}
|
|
195
|
-
className={classNames({
|
|
196
|
-
[styles.actionIconActive]: !metronomeEnabled,
|
|
197
|
-
[styles.actionIconDefault]: metronomeEnabled
|
|
198
|
-
})}
|
|
199
|
-
/>
|
|
200
|
-
}
|
|
201
|
-
onTriggerClick={onMetronomeToggle}
|
|
202
|
-
>
|
|
203
|
-
{metronomeContent}
|
|
204
|
-
</DropdownButton>
|
|
205
|
-
)}
|
|
206
|
-
{onLyricsToggle && (
|
|
207
|
-
<IconButton variant="ghost" size="2" onClick={onLyricsToggle}>
|
|
208
|
-
<KaraokeMicIcon width={16} height={16}
|
|
209
|
-
className={classNames({
|
|
210
|
-
[styles.actionIconActive]: !lyricsEnabled,
|
|
211
|
-
[styles.actionIconDefault]: lyricsEnabled
|
|
212
|
-
})}
|
|
213
|
-
/>
|
|
214
|
-
</IconButton>
|
|
215
|
-
)}
|
|
216
|
-
{onChordsToggle && (
|
|
217
|
-
<IconButton variant="ghost" size="2" onClick={onChordsToggle}>
|
|
218
|
-
<ChordsDetectionIcon width={16} height={16}
|
|
219
|
-
className={classNames({
|
|
220
|
-
[styles.actionIconActive]: !chordsEnabled,
|
|
221
|
-
[styles.actionIconDefault]: chordsEnabled
|
|
222
|
-
})} />
|
|
223
|
-
</IconButton>
|
|
224
|
-
)}
|
|
225
|
-
{onVideoClick && (
|
|
226
|
-
<IconButton variant="ghost" size="2" onClick={onVideoClick}>
|
|
227
|
-
<Video2Icon width={16} height={16} />
|
|
228
|
-
</IconButton>
|
|
229
|
-
)}
|
|
230
|
-
|
|
231
|
-
<Separator orientation="vertical" />
|
|
232
|
-
|
|
233
|
-
{onShareClick && (
|
|
234
|
-
<IconButton variant="ghost" size="2" onClick={onShareClick}>
|
|
235
|
-
<Share2Icon width={16} height={16} />
|
|
236
|
-
</IconButton>
|
|
237
|
-
)}
|
|
238
|
-
|
|
239
|
-
{onExpandToggle && (
|
|
240
|
-
<IconButton variant="soft" color={expanded ? 'accent' : 'neutral'} size="2" onClick={onExpandToggle}>
|
|
241
|
-
{expanded ? <ChevronDownIcon width={16} height={16} /> : <ChevronUpIcon width={16} height={16} />}
|
|
242
|
-
</IconButton>
|
|
243
|
-
)}
|
|
244
|
-
</Flex>
|
|
245
|
-
</Flex>
|
|
246
|
-
</section >
|
|
247
|
-
)
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
PlayerBar.displayName = 'PlayerBar'
|