@moises.ai/design-system 3.11.1 → 3.11.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moises.ai/design-system",
3
- "version": "3.11.1",
3
+ "version": "3.11.2",
4
4
  "description": "Design System package based on @radix-ui/themes with custom defaults",
5
5
  "private": false,
6
6
  "type": "module",
@@ -0,0 +1,83 @@
1
+ import { Flex, Text } from '@radix-ui/themes'
2
+ import { Popover } from 'radix-ui'
3
+ import { useCallback, useState } from 'react'
4
+ import { Select } from '../Select/Select'
5
+ import { Slider } from '../Slider/Slider'
6
+ import styles from './RecordSettingsPopover.module.css'
7
+
8
+ export function RecordSettingsPopover({
9
+ isRecord,
10
+ device,
11
+ deviceOptions,
12
+ onDeviceChange,
13
+ channel,
14
+ channelOptions,
15
+ onChannelChange,
16
+ inputLevel,
17
+ children,
18
+ }) {
19
+ const [opened, setOpened] = useState(false)
20
+
21
+ const handleOpenChange = useCallback((open) => {
22
+ if (!open || !isRecord) {
23
+ setOpened(open)
24
+ }
25
+ }, [])
26
+
27
+ const handleContextMenu = useCallback(() => {
28
+ e.preventDefault()
29
+ setOpened(true)
30
+ }, [])
31
+
32
+ return (
33
+ <Popover.Root open={opened} onOpenChange={handleOpenChange}>
34
+ <Popover.Trigger asChild onContextMenu={handleContextMenu}>
35
+ {children}
36
+ </Popover.Trigger>
37
+
38
+ <Popover.Content width="360px">
39
+ <Flex className={styles.root} direction="column" gap="4">
40
+ <Flex direction="column" gap="1">
41
+ <Text size="1" weight="medium">
42
+ Source
43
+ </Text>
44
+
45
+ {deviceOptions?.length ? (
46
+ <Select
47
+ items={deviceOptions}
48
+ defaultValue={device}
49
+ onChange={onDeviceChange}
50
+ size="1"
51
+ />
52
+ ) : (
53
+ <Text size="1">No device options.</Text>
54
+ )}
55
+
56
+ {channelOptions?.length && (
57
+ <Select
58
+ items={channelOptions}
59
+ defaultValue={channel}
60
+ onChange={onChannelChange}
61
+ size="1"
62
+ />
63
+ )}
64
+ </Flex>
65
+
66
+ <Flex direction="column" gap="1">
67
+ <Text size="1" weight="medium">
68
+ Input Level
69
+ </Text>
70
+
71
+ {opened && (
72
+ <Slider
73
+ value={inputLevel}
74
+ max={30}
75
+ style={{ paddingTop: '8px', paddingBottom: '8px' }}
76
+ />
77
+ )}
78
+ </Flex>
79
+ </Flex>
80
+ </Popover.Content>
81
+ </Popover.Root>
82
+ )
83
+ }
@@ -0,0 +1,13 @@
1
+ .root {
2
+ width: 200px;
3
+ padding: var(--space-3);
4
+ border-radius: var(--radius-4, 8px);
5
+ border: 1px solid
6
+ var(--colors-neutral-neutral-alpha-3, rgba(221, 234, 248, 0.08));
7
+ background: var(--panel-solid, #18191b);
8
+
9
+ /* Shadows/shadow-5 */
10
+ box-shadow:
11
+ 0 12px 32px -16px var(--overlays-black-alpha-5, rgba(0, 0, 0, 0.3)),
12
+ 0 12px 60px 0 var(--overlays-black-alpha-3, rgba(0, 0, 0, 0.15));
13
+ }
@@ -16,22 +16,30 @@ import {
16
16
  Tooltip,
17
17
  TrackControlsToggle,
18
18
  } from '../../index'
19
+ import { RecordSettingsPopover } from './RecordSettingsPopover'
19
20
  import styles from './TrackHeader.module.css'
20
21
 
22
+ const DND_PROTECTION = {
23
+ onPointerDown: (e) => e.stopPropagation(),
24
+ onMouseDown: (e) => e.stopPropagation(),
25
+ onTouchStart: (e) => e.stopPropagation(),
26
+ }
27
+
21
28
  export const TrackHeader = memo(
22
29
  ({
23
30
  // Config
24
31
  title,
25
32
  menuOptions,
26
- instrumentOptions,
27
- onInstrumentChange,
28
- instrumentSelected,
29
33
  showPan = true,
30
34
  showVolumeControls = true,
31
35
  isGrouped = false,
32
36
  height = 81,
33
37
  compact = false,
34
38
  isActive = false,
39
+ instrumentOptions,
40
+ deviceOptions,
41
+ channelOptions,
42
+ inputLevel,
35
43
 
36
44
  // State
37
45
  volume,
@@ -41,6 +49,9 @@ export const TrackHeader = memo(
41
49
  isAutoMuted,
42
50
  isSolo,
43
51
  isOpen,
52
+ instrumentSelected,
53
+ device,
54
+ channel,
44
55
 
45
56
  // State change listeners
46
57
  onVolumeChange,
@@ -49,6 +60,9 @@ export const TrackHeader = memo(
49
60
  onRecordChange,
50
61
  onSoloChange,
51
62
  onOpenChange,
63
+ onInstrumentChange,
64
+ onDeviceChange,
65
+ onChannelChange,
52
66
 
53
67
  // Children (having content means group/takelanes)
54
68
  children,
@@ -94,9 +108,7 @@ export const TrackHeader = memo(
94
108
  style={{ minWidth: 0, overflow: 'hidden' }}
95
109
  >
96
110
  <IconButton
97
- onPointerDown={(e) => e.stopPropagation()}
98
- onMouseDown={(e) => e.stopPropagation()}
99
- onTouchStart={(e) => e.stopPropagation()}
111
+ {...DND_PROTECTION}
100
112
  variant="ghost"
101
113
  size="1"
102
114
  onClick={handleToggleOpen}
@@ -142,39 +154,41 @@ export const TrackHeader = memo(
142
154
  </Flex>
143
155
 
144
156
  <Flex
157
+ {...DND_PROTECTION}
145
158
  direction="row"
146
- gap="3"
159
+ gap="2px"
147
160
  align="center"
148
- onPointerDown={(e) => e.stopPropagation()}
149
- onMouseDown={(e) => e.stopPropagation()}
150
- onTouchStart={(e) => e.stopPropagation()}
151
161
  >
152
- <Flex gap="2px">
162
+ <RecordSettingsPopover
163
+ isRecord={isRecord}
164
+ deviceOptions={deviceOptions}
165
+ device={device}
166
+ onDeviceChange={onDeviceChange}
167
+ channelOptions={channelOptions}
168
+ channel={channel}
169
+ onChannelChange={onChannelChange}
170
+ inputLevel={inputLevel}
171
+ >
153
172
  <TrackControlsToggle
154
173
  type="record"
155
174
  selected={isRecord}
156
- onClick={onRecordChange}
175
+ onClick={() => onRecordChange?.()}
157
176
  />
158
- <TrackControlsToggle
159
- type={
160
- isMuted ? 'mute' : isAutoMuted ? 'autoMute' : 'mute'
161
- }
162
- selected={isMuted || (!isSolo && isAutoMuted)}
163
- onClick={onMutedChange}
164
- />
165
- <TrackControlsToggle
166
- type="solo"
167
- selected={isSolo}
168
- onClick={onSoloChange}
169
- />
170
- </Flex>
177
+ </RecordSettingsPopover>
178
+ <TrackControlsToggle
179
+ type={isMuted ? 'mute' : isAutoMuted ? 'autoMute' : 'mute'}
180
+ selected={isMuted || (!isSolo && isAutoMuted)}
181
+ onClick={onMutedChange}
182
+ />
183
+ <TrackControlsToggle
184
+ type="solo"
185
+ selected={isSolo}
186
+ onClick={onSoloChange}
187
+ />
171
188
  </Flex>
172
189
 
173
190
  {menuOptions && (
174
- <Box
175
- onPointerDown={(e) => e.stopPropagation()}
176
- onMouseDown={(e) => e.stopPropagation()}
177
- onTouchStart={(e) => e.stopPropagation()}>
191
+ <Box {...DND_PROTECTION}>
178
192
  <DropdownMenu
179
193
  trigger={
180
194
  <IconButton
@@ -193,16 +207,10 @@ export const TrackHeader = memo(
193
207
  />
194
208
  </Box>
195
209
  )}
196
-
197
210
  </Flex>
198
211
  </div>
199
212
 
200
- <div
201
- className={styles.trackControls}
202
- onPointerDown={(e) => e.stopPropagation()}
203
- onMouseDown={(e) => e.stopPropagation()}
204
- onTouchStart={(e) => e.stopPropagation()}
205
- >
213
+ <div {...DND_PROTECTION} className={styles.trackControls}>
206
214
  {!compact && showVolumeControls && (
207
215
  <>
208
216
  <HorizontalVolume