@moises.ai/design-system 3.4.5 → 3.5.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.
Files changed (600) hide show
  1. package/dist/index.js +2490 -2339
  2. package/package.json +3 -2
  3. package/src/Introduction.mdx +56 -0
  4. package/src/colors/custom-styles.css +293 -0
  5. package/src/components/AdditionalItems/AdditionalItems.jsx +43 -0
  6. package/src/components/AdditionalItems/AdditionalItems.module.css +76 -0
  7. package/src/components/AdditionalItems/AdditionalItems.stories.jsx +32 -0
  8. package/src/components/BannerAnnouncement/BannerAnnouncement.jsx +77 -0
  9. package/src/components/BannerAnnouncement/BannerAnnouncement.module.css +58 -0
  10. package/src/components/BannerAnnouncement/BannerAnnouncement.stories.jsx +120 -0
  11. package/src/components/Button/Button.jsx +45 -0
  12. package/src/components/Button/Button.module.css +288 -0
  13. package/src/components/Button/Button.stories.jsx +269 -0
  14. package/src/components/Callout/Callout.jsx +47 -0
  15. package/src/components/Callout/Callout.module.css +56 -0
  16. package/src/components/Callout/Callout.stories.jsx +296 -0
  17. package/src/components/Card/Card.jsx +46 -0
  18. package/src/components/Card/Card.module.css +89 -0
  19. package/src/components/Card/Card.stories.jsx +116 -0
  20. package/src/components/Checkbox/Checkbox.jsx +36 -0
  21. package/src/components/Checkbox/Checkbox.module.css +136 -0
  22. package/src/components/Checkbox/Checkbox.stories.jsx +64 -0
  23. package/src/components/CigarBar/CigarBar.jsx +73 -0
  24. package/src/components/CigarBar/CigarBar.module.css +57 -0
  25. package/src/components/CigarBar/CigarBar.stories.jsx +66 -0
  26. package/src/components/ContextMenu/ContextMenu.jsx +56 -0
  27. package/src/components/ContextMenu/ContextMenu.stories.jsx +657 -0
  28. package/src/components/Countdown/Countdown.jsx +97 -0
  29. package/src/components/Countdown/Countdown.module.css +206 -0
  30. package/src/components/Countdown/Countdown.stories.jsx +108 -0
  31. package/src/components/DataTable/DataTable.jsx +300 -0
  32. package/src/components/DataTable/DataTable.module.css +372 -0
  33. package/src/components/DataTable/DataTable.stories.jsx +365 -0
  34. package/src/components/DropdownButton/DropdownButton.jsx +124 -0
  35. package/src/components/DropdownButton/DropdownButton.module.css +102 -0
  36. package/src/components/DropdownButton/DropdownButton.stories.jsx +267 -0
  37. package/src/components/DropdownMenu/DropdownMenu.jsx +102 -0
  38. package/src/components/DropdownMenu/DropdownMenu.stories.jsx +645 -0
  39. package/src/components/FloatingBanner/FloatingBanner.jsx +87 -0
  40. package/src/components/FloatingBanner/FloatingBanner.module.css +92 -0
  41. package/src/components/FloatingBanner/FloatingBanner.stories.jsx +115 -0
  42. package/src/components/FooterPanel/FooterPanel.jsx +56 -0
  43. package/src/components/FooterPanel/FooterPanel.stories.jsx +289 -0
  44. package/src/components/GenerationSourceCallout/GenerationSourceCallout.jsx +53 -0
  45. package/src/components/GenerationSourceCallout/GenerationSourceCallout.module.css +98 -0
  46. package/src/components/GroupButtons/GroupButtons.jsx +97 -0
  47. package/src/components/GroupButtons/GroupButtons.module.css +8 -0
  48. package/src/components/GroupButtons/GroupButtons.stories.jsx +301 -0
  49. package/src/components/HeaderPanel/HeaderPanel.jsx +115 -0
  50. package/src/components/HeaderPanel/HeaderPanel.stories.jsx +389 -0
  51. package/src/components/HorizontalVolume/HorizontalVolume.jsx +157 -0
  52. package/src/components/HorizontalVolume/HorizontalVolume.module.css +123 -0
  53. package/src/components/HorizontalVolume/HorizontalVolume.stories.jsx +109 -0
  54. package/src/components/IconButton/IconButton.jsx +47 -0
  55. package/src/components/IconButton/IconButton.module.css +302 -0
  56. package/src/components/IconButton/IconButton.stories.jsx +532 -0
  57. package/src/components/InstrumentSelector/InstrumentSelector.jsx +61 -0
  58. package/src/components/InstrumentSelector/InstrumentSelector.module.css +80 -0
  59. package/src/components/InstrumentSelector/InstrumentSelector.stories.jsx +33 -0
  60. package/src/components/Knob/Knob.jsx +173 -0
  61. package/src/components/Knob/Knob.module.css +70 -0
  62. package/src/components/Knob/Knob.stories.jsx +289 -0
  63. package/src/components/Knob/constants.js +38 -0
  64. package/src/components/Knob/useKnob.js +117 -0
  65. package/src/components/Knob/utils.js +117 -0
  66. package/src/components/ListCards/CardDetails.stories.jsx +484 -0
  67. package/src/components/ListCards/ListCards.jsx +297 -0
  68. package/src/components/ListCards/ListCards.module.css +234 -0
  69. package/src/components/ListCards/ListCards.stories.jsx +386 -0
  70. package/src/components/LokalisePoc/LokalisePoc.jsx +7 -0
  71. package/src/components/LokalisePoc/LokalisePoc.stories.jsx +63 -0
  72. package/src/components/MessageWithAction/MessageWithAction.jsx +54 -0
  73. package/src/components/MessageWithAction/MessageWithAction.module.css +16 -0
  74. package/src/components/MessageWithAction/MessageWithAction.stories.jsx +280 -0
  75. package/src/components/MetronomeForm/MetronomeForm.jsx +74 -0
  76. package/src/components/MetronomeForm/MetronomeForm.stories.jsx +137 -0
  77. package/src/components/MultiSelect/MultiSelect.jsx +129 -0
  78. package/src/components/MultiSelect/MultiSelect.module.css +105 -0
  79. package/src/components/MultiSelect/MultiSelect.stories.jsx +296 -0
  80. package/src/components/MultiSelectCards/MultiSelectCards.jsx +96 -0
  81. package/src/components/MultiSelectCards/MultiSelectCards.module.css +60 -0
  82. package/src/components/MultiSelectCards/MultiSelectCards.stories.jsx +439 -0
  83. package/src/components/PanControl/PanControl.jsx +227 -0
  84. package/src/components/PanControl/PanControl.module.css +71 -0
  85. package/src/components/PanControl/PanControl.stories.jsx +100 -0
  86. package/src/components/ProductsBrandPattern/Patterns/aiStudio.png +0 -0
  87. package/src/components/ProductsBrandPattern/Patterns/mastering.png +0 -0
  88. package/src/components/ProductsBrandPattern/Patterns/product.png +0 -0
  89. package/src/components/ProductsBrandPattern/Patterns/stemSeparation.png +0 -0
  90. package/src/components/ProductsBrandPattern/Patterns/voiceStudio.png +0 -0
  91. package/src/components/ProductsBrandPattern/ProductsBrandPattern.jsx +36 -0
  92. package/src/components/ProductsBrandPattern/ProductsBrandPattern.stories.jsx +47 -0
  93. package/src/components/ProductsList/ProductsList.jsx +54 -0
  94. package/src/components/ProductsList/ProductsList.module.css +81 -0
  95. package/src/components/ProductsList/ProductsList.stories.jsx +69 -0
  96. package/src/components/ProfileMenu/MenuTrigger.jsx +45 -0
  97. package/src/components/ProfileMenu/ProfileMenu.jsx +66 -0
  98. package/src/components/ProfileMenu/ProfileMenu.module.css +101 -0
  99. package/src/components/ProfileMenu/ProfileMenu.stories.jsx +44 -0
  100. package/src/components/ProjectsList/ProjectsList.jsx +132 -0
  101. package/src/components/ProjectsList/ProjectsList.module.css +71 -0
  102. package/src/components/ProjectsList/ProjectsList.stories.jsx +25 -0
  103. package/src/components/ProjectsList/utils-stories.js +186 -0
  104. package/src/components/ProjectsList/utils.jsx +70 -0
  105. package/src/components/RadioCardsGroup/RadioCardsGroup.jsx +35 -0
  106. package/src/components/RadioCardsGroup/RadioCardsGroup.module.css +66 -0
  107. package/src/components/RadioCardsGroup/RadioCardsGroup.stories.jsx +89 -0
  108. package/src/components/Rating/Rating.jsx +154 -0
  109. package/src/components/Rating/Rating.module.css +70 -0
  110. package/src/components/Rating/Rating.stories.jsx +215 -0
  111. package/src/components/RecordingForm/RecordingForm.jsx +142 -0
  112. package/src/components/RecordingForm/RecordingForm.module.css +49 -0
  113. package/src/components/RecordingForm/RecordingForm.stories.jsx +319 -0
  114. package/src/components/SectionExpander/SectionExpander.jsx +53 -0
  115. package/src/components/SectionExpander/SectionExpander.module.css +46 -0
  116. package/src/components/SectionExpander/SectionExpander.stories.jsx +48 -0
  117. package/src/components/SegmentedControl/SegmentedControl.jsx +48 -0
  118. package/src/components/SegmentedControl/SegmentedControl.stories.jsx +133 -0
  119. package/src/components/SegmentedControl/SegmentedControl.styles.css +55 -0
  120. package/src/components/Select/Select.jsx +132 -0
  121. package/src/components/Select/Select.module.css +76 -0
  122. package/src/components/Select/Select.stories.jsx +294 -0
  123. package/src/components/SetlistList/SetlistList.jsx +338 -0
  124. package/src/components/SetlistList/SetlistList.module.css +246 -0
  125. package/src/components/SetlistList/SetlistList.stories.jsx +121 -0
  126. package/src/components/Shell/Shell.jsx +75 -0
  127. package/src/components/Shell/Shell.module.css +3 -0
  128. package/src/components/Shell/Shell.stories.jsx +354 -0
  129. package/src/components/Sidebar/Sidebar.jsx +173 -0
  130. package/src/components/Sidebar/Sidebar.module.css +267 -0
  131. package/src/components/Sidebar/Sidebar.stories.jsx +247 -0
  132. package/src/components/Sidebar/SidebarSection/SidebarSection.jsx +20 -0
  133. package/src/components/Sidebar/SidebarSection/SidebarSection.module.css +20 -0
  134. package/src/components/Slider/Slider.jsx +114 -0
  135. package/src/components/Slider/Slider.module.css +159 -0
  136. package/src/components/Slider/Slider.stories.jsx +199 -0
  137. package/src/components/StemGenerationForm/BesideFooter/BesideFooter.jsx +107 -0
  138. package/src/components/StemGenerationForm/BesideFooter/BesideFooter.module.css +4 -0
  139. package/src/components/StemGenerationForm/Concurrency/Concurrency.jsx +54 -0
  140. package/src/components/StemGenerationForm/Concurrency/Concurrency.module.css +26 -0
  141. package/src/components/StemGenerationForm/CreateFromPreset/CreateFromPreset.jsx +44 -0
  142. package/src/components/StemGenerationForm/CreateNew/CreateNew.jsx +107 -0
  143. package/src/components/StemGenerationForm/CreativeFreedomSection/CreativeFreedomSection.jsx +185 -0
  144. package/src/components/StemGenerationForm/CreativeFreedomSection/CreativeFreedomSection.module.css +8 -0
  145. package/src/components/StemGenerationForm/GenerationStatus/GenerationStatus.jsx +91 -0
  146. package/src/components/StemGenerationForm/StemGenerationForm.jsx +342 -0
  147. package/src/components/StemGenerationForm/StemGenerationForm.stories.jsx +703 -0
  148. package/src/components/StemGenerationForm/utils/constants.js +26 -0
  149. package/src/components/StemGenerationForm/utils/formatFileInfo.js +20 -0
  150. package/src/components/StemGenerationForm/utils/getInstrumentDescription.js +27 -0
  151. package/src/components/StemGenerationForm/utils/getLocalizedGenerationInstruments.js +31 -0
  152. package/src/components/StemGenerationForm/utils/index.js +13 -0
  153. package/src/components/StemGenerationForm/utils/secondsToTime.js +15 -0
  154. package/src/components/StemSeparationForm/GenerationStatus/GenerationStatus.jsx +70 -0
  155. package/src/components/StemSeparationForm/StemSeparationForm.jsx +354 -0
  156. package/src/components/StemSeparationForm/StemSeparationForm.module.css +0 -0
  157. package/src/components/StemSeparationForm/StemSeparationForm.stories.jsx +221 -0
  158. package/src/components/TempoControlsForm/AutoDetect/AutoDetect.jsx +114 -0
  159. package/src/components/TempoControlsForm/TempoControlsForm.jsx +59 -0
  160. package/src/components/TempoControlsForm/TempoControlsForm.stories.jsx +228 -0
  161. package/src/components/TempoControlsForm/TempoForm/TempoForm.jsx +94 -0
  162. package/src/components/TempoControlsForm/TempoFormInput/TempoFormInput.jsx +136 -0
  163. package/src/components/TempoControlsForm/TempoFormInput/TempoFormInput.module.css +19 -0
  164. package/src/components/TempoControlsForm/constants.js +77 -0
  165. package/src/components/TempoControlsForm/utils/formatDateTime.js +50 -0
  166. package/src/components/TempoControlsForm/utils/getTempoMarking.js +6 -0
  167. package/src/components/Text/Text.jsx +19 -0
  168. package/src/components/Text/Text.module.css +5 -0
  169. package/src/components/Text/Text.stories.jsx +117 -0
  170. package/src/components/TextArea/TextArea.jsx +53 -0
  171. package/src/components/TextArea/TextArea.module.css +35 -0
  172. package/src/components/TextArea/TextArea.stories.jsx +140 -0
  173. package/src/components/TextField/TextField.jsx +61 -0
  174. package/src/components/TextField/TextField.module.css +41 -0
  175. package/src/components/TextField/TextField.stories.jsx +243 -0
  176. package/src/components/ThumbnailPicker/ThumbColors/ThumbColors.js +101 -0
  177. package/src/components/ThumbnailPicker/ThumbGraphics/ThumbGraphics.js +90 -0
  178. package/src/components/ThumbnailPicker/ThumbGraphics/circles01.png +0 -0
  179. package/src/components/ThumbnailPicker/ThumbGraphics/circles02.png +0 -0
  180. package/src/components/ThumbnailPicker/ThumbGraphics/circles03.png +0 -0
  181. package/src/components/ThumbnailPicker/ThumbGraphics/circles04.png +0 -0
  182. package/src/components/ThumbnailPicker/ThumbGraphics/circles05.png +0 -0
  183. package/src/components/ThumbnailPicker/ThumbGraphics/circles06.png +0 -0
  184. package/src/components/ThumbnailPicker/ThumbGraphics/lines01.png +0 -0
  185. package/src/components/ThumbnailPicker/ThumbGraphics/lines02.png +0 -0
  186. package/src/components/ThumbnailPicker/ThumbGraphics/lines03.png +0 -0
  187. package/src/components/ThumbnailPicker/ThumbGraphics/lines04.png +0 -0
  188. package/src/components/ThumbnailPicker/ThumbGraphics/lines05.png +0 -0
  189. package/src/components/ThumbnailPicker/ThumbGraphics/lines06.png +0 -0
  190. package/src/components/ThumbnailPicker/ThumbGraphics/patterns01.png +0 -0
  191. package/src/components/ThumbnailPicker/ThumbGraphics/patterns02.png +0 -0
  192. package/src/components/ThumbnailPicker/ThumbGraphics/patterns03.png +0 -0
  193. package/src/components/ThumbnailPicker/ThumbGraphics/patterns04.png +0 -0
  194. package/src/components/ThumbnailPicker/ThumbGraphics/shapes01.png +0 -0
  195. package/src/components/ThumbnailPicker/ThumbGraphics/shapes02.png +0 -0
  196. package/src/components/ThumbnailPicker/ThumbGraphics/shapes03.png +0 -0
  197. package/src/components/ThumbnailPicker/ThumbGraphics/shapes04.png +0 -0
  198. package/src/components/ThumbnailPicker/ThumbGraphics/shapes05.png +0 -0
  199. package/src/components/ThumbnailPicker/ThumbGraphics/shapes06.png +0 -0
  200. package/src/components/ThumbnailPicker/ThumbGraphics/shapes07.png +0 -0
  201. package/src/components/ThumbnailPicker/ThumbGraphics/shapes08.png +0 -0
  202. package/src/components/ThumbnailPicker/ThumbGraphics/shapes09.png +0 -0
  203. package/src/components/ThumbnailPicker/ThumbGraphics/synth01.png +0 -0
  204. package/src/components/ThumbnailPicker/ThumbGraphics/synth02.png +0 -0
  205. package/src/components/ThumbnailPicker/ThumbGraphics/synth03.png +0 -0
  206. package/src/components/ThumbnailPicker/ThumbGraphics/synth04.png +0 -0
  207. package/src/components/ThumbnailPicker/ThumbGraphics/synth05.png +0 -0
  208. package/src/components/ThumbnailPicker/ThumbGraphics/waves01.png +0 -0
  209. package/src/components/ThumbnailPicker/ThumbGraphics/waves02.png +0 -0
  210. package/src/components/ThumbnailPicker/ThumbGraphics/waves03.png +0 -0
  211. package/src/components/ThumbnailPicker/ThumbGraphics/waves04.png +0 -0
  212. package/src/components/ThumbnailPicker/ThumbnailPicker.jsx +67 -0
  213. package/src/components/ThumbnailPicker/ThumbnailPicker.module.css +0 -0
  214. package/src/components/ThumbnailPicker/ThumbnailPicker.stories.jsx +406 -0
  215. package/src/components/ThumbnailPicker/getStyleFromID.js +31 -0
  216. package/src/components/TooltipWithInfoIcon/TooltipWithInfoIcon.jsx +18 -0
  217. package/src/components/TooltipWithInfoIcon/TooltipWithInfoIcon.module.css +6 -0
  218. package/src/components/TooltipWithInfoIcon/TooltipWithInfoIcon.stories.jsx +28 -0
  219. package/src/components/TrackControlButton/TrackControlButton.jsx +28 -0
  220. package/src/components/TrackControlButton/TrackControlButton.module.css +32 -0
  221. package/src/components/TrackControlButton/TrackControlButton.stories.jsx +47 -0
  222. package/src/components/TrackControlButton/index.js +1 -0
  223. package/src/components/TrackHeader/TrackHeader.jsx +143 -0
  224. package/src/components/TrackHeader/TrackHeader.module.css +194 -0
  225. package/src/components/TrackHeader/TrackHeader.stories.jsx +212 -0
  226. package/src/components/TrackHeader/TrackHeaderOptions/TrackHeaderOptions.jsx +18 -0
  227. package/src/components/TrackHeader/TrackHeaderOptions/TrackHeaderOptions.module.css +8 -0
  228. package/src/components/TrackHeader/TrackHeaderOptions/index.js +1 -0
  229. package/src/components/VoiceConversionForm/BesideFooter/BesideFooter.jsx +74 -0
  230. package/src/components/VoiceConversionForm/ClickableAvatar/ClickableAvatar.jsx +40 -0
  231. package/src/components/VoiceConversionForm/ClickableAvatar/ClickableAvatar.module.css +21 -0
  232. package/src/components/VoiceConversionForm/Concurrency/Concurrency.jsx +53 -0
  233. package/src/components/VoiceConversionForm/Concurrency/Concurrency.module.css +26 -0
  234. package/src/components/VoiceConversionForm/GenerationStatus/GenerationStatus.jsx +49 -0
  235. package/src/components/VoiceConversionForm/VoiceConversionForm.jsx +231 -0
  236. package/src/components/VoiceConversionForm/VoiceConversionForm.module.css +9 -0
  237. package/src/components/VoiceConversionForm/VoiceConversionForm.stories.jsx +582 -0
  238. package/src/components/VoiceConversionForm/VoiceDetails/VoiceDetails.jsx +93 -0
  239. package/src/components/VoiceConversionForm/VoiceDetails/VoiceDetails.module.css +44 -0
  240. package/src/components/VoiceConversionForm/VoiceList/VoiceList.jsx +84 -0
  241. package/src/components/VoiceConversionForm/VoiceList/VoiceList.module.css +11 -0
  242. package/src/components/VoiceConversionForm/Waveform/Waveform.jsx +262 -0
  243. package/src/components/VoiceConversionForm/Waveform/Waveform.module.css +36 -0
  244. package/src/components/theme/Theme.jsx +16 -0
  245. package/src/components/theme/Theme.stories.jsx +59 -0
  246. package/src/icons/AbbeyRoadIcon.jsx +117 -0
  247. package/src/icons/AccessibilityIcon.jsx +33 -0
  248. package/src/icons/AcousticGuitarIcon.jsx +16 -0
  249. package/src/icons/AddIcon.jsx +18 -0
  250. package/src/icons/AddLyricsIcon.jsx +25 -0
  251. package/src/icons/AddRoundIcon.jsx +26 -0
  252. package/src/icons/AirplayIcon.jsx +26 -0
  253. package/src/icons/AlertIcon.jsx +28 -0
  254. package/src/icons/AppIcon.jsx +18 -0
  255. package/src/icons/ArVrIcon.jsx +21 -0
  256. package/src/icons/ArrowDownIcon.jsx +26 -0
  257. package/src/icons/ArrowDownloadIcon.jsx +26 -0
  258. package/src/icons/ArrowLeftIcon.jsx +26 -0
  259. package/src/icons/ArrowRightIcon.jsx +26 -0
  260. package/src/icons/ArrowUpIcon.jsx +26 -0
  261. package/src/icons/ArrowsHorizontalIcon.jsx +26 -0
  262. package/src/icons/ArrowsVerticalIcon.jsx +26 -0
  263. package/src/icons/AtomIcon.jsx +32 -0
  264. package/src/icons/AttachmentIcon.jsx +26 -0
  265. package/src/icons/AudioAdjustmentsIcon.jsx +26 -0
  266. package/src/icons/AudioFileIcon.jsx +26 -0
  267. package/src/icons/AudioFilesIcon.jsx +26 -0
  268. package/src/icons/AutoplayIcon.jsx +26 -0
  269. package/src/icons/BackwardIcon.jsx +18 -0
  270. package/src/icons/BarsIcon.jsx +27 -0
  271. package/src/icons/BassIcon.jsx +39 -0
  272. package/src/icons/BoldIcon.jsx +21 -0
  273. package/src/icons/BookIcon.jsx +21 -0
  274. package/src/icons/BookmarkIcon.jsx +24 -0
  275. package/src/icons/BoxIcon.jsx +20 -0
  276. package/src/icons/BriefcaseIcon.jsx +26 -0
  277. package/src/icons/CalendarIcon.jsx +26 -0
  278. package/src/icons/CameraFlip2Icon.jsx +26 -0
  279. package/src/icons/CameraFlip3Icon.jsx +26 -0
  280. package/src/icons/CameraFlipIcon.jsx +26 -0
  281. package/src/icons/CameraIcon.jsx +33 -0
  282. package/src/icons/CameraRollIcon.jsx +31 -0
  283. package/src/icons/CarIcon.jsx +18 -0
  284. package/src/icons/CartIcon.jsx +28 -0
  285. package/src/icons/CassetteIcon.jsx +26 -0
  286. package/src/icons/CastIcon.jsx +20 -0
  287. package/src/icons/CdIcon.jsx +19 -0
  288. package/src/icons/CheckboxCicleIcon.jsx +26 -0
  289. package/src/icons/CheckboxFillIcon.jsx +25 -0
  290. package/src/icons/CheckboxOffIcon.jsx +25 -0
  291. package/src/icons/CheckboxOnIcon.jsx +25 -0
  292. package/src/icons/ChevronDownIcon.jsx +26 -0
  293. package/src/icons/ChevronLeftIcon.jsx +26 -0
  294. package/src/icons/ChevronRightIcon.jsx +26 -0
  295. package/src/icons/ChevronUpIcon.jsx +26 -0
  296. package/src/icons/ChordGrid2Icon.jsx +26 -0
  297. package/src/icons/ChordGridIcon.jsx +26 -0
  298. package/src/icons/ChordSequenceIcon.jsx +26 -0
  299. package/src/icons/Chords2Icon.jsx +25 -0
  300. package/src/icons/Chords3Icon.jsx +24 -0
  301. package/src/icons/ChordsDetection2Icon.jsx +31 -0
  302. package/src/icons/ChordsDetectionIcon.jsx +31 -0
  303. package/src/icons/ChordsIcon.jsx +25 -0
  304. package/src/icons/ClipIcon.jsx +27 -0
  305. package/src/icons/ClipboardIcon.jsx +23 -0
  306. package/src/icons/CloseIcon.jsx +27 -0
  307. package/src/icons/Cloud2Icon.jsx +24 -0
  308. package/src/icons/Cloud3Icon.jsx +24 -0
  309. package/src/icons/CloudDownload2Icon.jsx +26 -0
  310. package/src/icons/CloudDownloadErrorIcon.jsx +26 -0
  311. package/src/icons/CloudDownloadGradientIcon.jsx +44 -0
  312. package/src/icons/CloudDownloadIcon.jsx +26 -0
  313. package/src/icons/CloudIcon.jsx +20 -0
  314. package/src/icons/CloudUploadIcon.jsx +26 -0
  315. package/src/icons/CodeIcon.jsx +28 -0
  316. package/src/icons/CollectionsIcon.jsx +26 -0
  317. package/src/icons/CompressorIcon.jsx +25 -0
  318. package/src/icons/ComputerIcon.jsx +26 -0
  319. package/src/icons/CopilotIcon.jsx +26 -0
  320. package/src/icons/CountInIcon.jsx +23 -0
  321. package/src/icons/CountdownIcon.jsx +33 -0
  322. package/src/icons/CowbellIcon.jsx +25 -0
  323. package/src/icons/CropIcon.jsx +27 -0
  324. package/src/icons/CrownIcon.jsx +21 -0
  325. package/src/icons/CueBackIcon.jsx +25 -0
  326. package/src/icons/CueIcon.jsx +20 -0
  327. package/src/icons/CymbalsIcon.jsx +26 -0
  328. package/src/icons/DatabaseIcon.jsx +26 -0
  329. package/src/icons/DelayIcon.jsx +20 -0
  330. package/src/icons/DenoiserIcon.jsx +23 -0
  331. package/src/icons/DevicesIcon.jsx +26 -0
  332. package/src/icons/DialogueIcon.jsx +33 -0
  333. package/src/icons/DojoIcon.jsx +21 -0
  334. package/src/icons/DotsVertical2Icon.jsx +43 -0
  335. package/src/icons/DotsVerticalIcon.jsx +47 -0
  336. package/src/icons/DownloadApp2Icon.jsx +26 -0
  337. package/src/icons/DownloadAppIcon.jsx +23 -0
  338. package/src/icons/Drums2Icon.jsx +25 -0
  339. package/src/icons/DrumsIcon.jsx +18 -0
  340. package/src/icons/EditIcon.jsx +20 -0
  341. package/src/icons/EffectsIcon.jsx +25 -0
  342. package/src/icons/ElectricGuitarIcon.jsx +54 -0
  343. package/src/icons/EqIcon.jsx +20 -0
  344. package/src/icons/FeaturesIcon.jsx +24 -0
  345. package/src/icons/FileIcon.jsx +21 -0
  346. package/src/icons/FileNewIcon.jsx +26 -0
  347. package/src/icons/Filter2Icon.jsx +26 -0
  348. package/src/icons/FilterIcon.jsx +26 -0
  349. package/src/icons/FireIcon.jsx +21 -0
  350. package/src/icons/FlagIcon.jsx +21 -0
  351. package/src/icons/FlashGradientIcon.jsx +39 -0
  352. package/src/icons/FlashIcon.jsx +21 -0
  353. package/src/icons/FlatAndSharpIcon.jsx +25 -0
  354. package/src/icons/FlatIcon.jsx +20 -0
  355. package/src/icons/FolderIcon.jsx +32 -0
  356. package/src/icons/FolderPlusIcon.jsx +26 -0
  357. package/src/icons/ForwardIcon.jsx +18 -0
  358. package/src/icons/GiftIcon.jsx +21 -0
  359. package/src/icons/GlobeIcon.jsx +22 -0
  360. package/src/icons/GoalsIcon.jsx +25 -0
  361. package/src/icons/GraphIcon.jsx +21 -0
  362. package/src/icons/GuitarAmpIcon.jsx +41 -0
  363. package/src/icons/HamburgerMenu2Icon.jsx +26 -0
  364. package/src/icons/HamburgerMenu3Icon.jsx +26 -0
  365. package/src/icons/HandbagIcon.jsx +26 -0
  366. package/src/icons/HeadphonesIcon.jsx +26 -0
  367. package/src/icons/HeadphonesLeftIcon.jsx +30 -0
  368. package/src/icons/HeadphonesRightIcon.jsx +30 -0
  369. package/src/icons/HiFiGradientIcon.jsx +36 -0
  370. package/src/icons/HiFiIcon.jsx +112 -0
  371. package/src/icons/HiHatIcon.jsx +21 -0
  372. package/src/icons/HomeIcon.jsx +18 -0
  373. package/src/icons/Icons.stories.jsx +154 -0
  374. package/src/icons/ImageGalleryIcon.jsx +25 -0
  375. package/src/icons/ImageIcon.jsx +21 -0
  376. package/src/icons/Info2Icon.jsx +18 -0
  377. package/src/icons/InfoIcon.jsx +20 -0
  378. package/src/icons/InternetSignalIcon.jsx +26 -0
  379. package/src/icons/IpadIcon.jsx +20 -0
  380. package/src/icons/IsolateDrumsGradientIcon.jsx +41 -0
  381. package/src/icons/IsolateDrumsIcon.jsx +23 -0
  382. package/src/icons/KaraokeIcon.jsx +23 -0
  383. package/src/icons/KaraokeMicIcon.jsx +23 -0
  384. package/src/icons/KeyDetectionIcon.jsx +25 -0
  385. package/src/icons/KeyboardIcon.jsx +25 -0
  386. package/src/icons/KeysIcon.jsx +21 -0
  387. package/src/icons/KickdrumIcon.jsx +30 -0
  388. package/src/icons/Knob2Icon.jsx +27 -0
  389. package/src/icons/Knob3Icon.jsx +27 -0
  390. package/src/icons/KnobIcon.jsx +28 -0
  391. package/src/icons/LabIcon.jsx +21 -0
  392. package/src/icons/LaptopIcon.jsx +25 -0
  393. package/src/icons/LibraryIcon.jsx +31 -0
  394. package/src/icons/LinkIcon.jsx +21 -0
  395. package/src/icons/ListCheckIcon.jsx +26 -0
  396. package/src/icons/ListIcon.jsx +21 -0
  397. package/src/icons/LivePerformanceIcon.jsx +23 -0
  398. package/src/icons/LockIcon.jsx +28 -0
  399. package/src/icons/LogInIcon.jsx +21 -0
  400. package/src/icons/LogOutIcon.jsx +26 -0
  401. package/src/icons/LoopIcon.jsx +29 -0
  402. package/src/icons/LoopSection2Icon.jsx +26 -0
  403. package/src/icons/LoopSection3Icon.jsx +26 -0
  404. package/src/icons/LoopSectionIcon.jsx +26 -0
  405. package/src/icons/LyricsIcon.jsx +33 -0
  406. package/src/icons/MaracasIcon.jsx +24 -0
  407. package/src/icons/MasteringIcon.jsx +37 -0
  408. package/src/icons/Maximize2Icon.jsx +26 -0
  409. package/src/icons/MaximizeIcon.jsx +26 -0
  410. package/src/icons/MetronomeIcon.jsx +23 -0
  411. package/src/icons/Minimize2Icon.jsx +26 -0
  412. package/src/icons/MinimizeIcon.jsx +26 -0
  413. package/src/icons/Mixer2Icon.jsx +25 -0
  414. package/src/icons/MixerIcon.jsx +20 -0
  415. package/src/icons/MoisesIcon.jsx +47 -0
  416. package/src/icons/MoisesLogoIcon.jsx +43 -0
  417. package/src/icons/MoneyIcon.jsx +20 -0
  418. package/src/icons/MonoIcon.jsx +18 -0
  419. package/src/icons/MoonIcon.jsx +21 -0
  420. package/src/icons/More2Icon.jsx +44 -0
  421. package/src/icons/MoreIcon.jsx +51 -0
  422. package/src/icons/MultipleUsersIcon.jsx +26 -0
  423. package/src/icons/MusicAddIcon.jsx +26 -0
  424. package/src/icons/MusicControlIcon.jsx +23 -0
  425. package/src/icons/MusicDevice2Icon.jsx +23 -0
  426. package/src/icons/MusicDeviceIcon.jsx +25 -0
  427. package/src/icons/MusicIcon.jsx +26 -0
  428. package/src/icons/MusicListIcon.jsx +26 -0
  429. package/src/icons/MusicLoverIcon.jsx +23 -0
  430. package/src/icons/MusicNoteIcon.jsx +21 -0
  431. package/src/icons/MusicNotesIcon.jsx +26 -0
  432. package/src/icons/MusicRemoveIcon.jsx +26 -0
  433. package/src/icons/NewCollectionsIcon.jsx +25 -0
  434. package/src/icons/NextIcon.jsx +20 -0
  435. package/src/icons/NoAcousticGuitarIcon.jsx +23 -0
  436. package/src/icons/NoBassIcon.jsx +23 -0
  437. package/src/icons/NoChords2Icon.jsx +25 -0
  438. package/src/icons/NoChordsDetectionIcon.jsx +31 -0
  439. package/src/icons/NoCloud3Icon.jsx +23 -0
  440. package/src/icons/NoComputerIcon.jsx +26 -0
  441. package/src/icons/NoCymbalsIcon.jsx +26 -0
  442. package/src/icons/NoDialogueIcon.jsx +26 -0
  443. package/src/icons/NoDrums2Icon.jsx +23 -0
  444. package/src/icons/NoDrumsIcon.jsx +23 -0
  445. package/src/icons/NoElectricGuitarIcon.jsx +23 -0
  446. package/src/icons/NoFileIcon.jsx +26 -0
  447. package/src/icons/NoHeadphonesIcon.jsx +26 -0
  448. package/src/icons/NoHiHatIcon.jsx +26 -0
  449. package/src/icons/NoInternetSignalIcon.jsx +33 -0
  450. package/src/icons/NoKeysIcon.jsx +38 -0
  451. package/src/icons/NoKickdrumIcon.jsx +23 -0
  452. package/src/icons/NoLoopSection2Icon.jsx +23 -0
  453. package/src/icons/NoLoopSectionIcon.jsx +26 -0
  454. package/src/icons/NoLyricsIcon.jsx +25 -0
  455. package/src/icons/NoMaracasIcon.jsx +23 -0
  456. package/src/icons/NoMetronomeIcon.jsx +23 -0
  457. package/src/icons/NoMoneyIcon.jsx +26 -0
  458. package/src/icons/NoMusicIcon.jsx +32 -0
  459. package/src/icons/NoMusicNoteIcon.jsx +25 -0
  460. package/src/icons/NoPianoIcon.jsx +33 -0
  461. package/src/icons/NoSearchIcon.jsx +26 -0
  462. package/src/icons/NoSectionsIcon.jsx +25 -0
  463. package/src/icons/NoSnareIcon.jsx +26 -0
  464. package/src/icons/NoSoundEffectsIcon.jsx +23 -0
  465. package/src/icons/NoSoundIcon.jsx +23 -0
  466. package/src/icons/NoSoundtrackIcon.jsx +30 -0
  467. package/src/icons/NoSpliterIcon.jsx +23 -0
  468. package/src/icons/NoStringsIcon.jsx +23 -0
  469. package/src/icons/NoTomsIcon.jsx +23 -0
  470. package/src/icons/NoUkuleleIcon.jsx +26 -0
  471. package/src/icons/NoVideoIcon.jsx +26 -0
  472. package/src/icons/NoVocalsIcon.jsx +23 -0
  473. package/src/icons/NoVolume2Icon.jsx +26 -0
  474. package/src/icons/NoVolumeIcon.jsx +26 -0
  475. package/src/icons/NoWoodwindBrassIcon.jsx +23 -0
  476. package/src/icons/NotificationsIcon.jsx +26 -0
  477. package/src/icons/OffloadDeviceIcon.jsx +23 -0
  478. package/src/icons/PauseFilledIcon.jsx +27 -0
  479. package/src/icons/PauseIcon.jsx +22 -0
  480. package/src/icons/PianoIcon.jsx +25 -0
  481. package/src/icons/PinIcon.jsx +20 -0
  482. package/src/icons/Pip2Icon.jsx +18 -0
  483. package/src/icons/PipIcon.jsx +21 -0
  484. package/src/icons/PitchCorrectionIcon.jsx +25 -0
  485. package/src/icons/PitchIcon.jsx +21 -0
  486. package/src/icons/PlayAllIcon.jsx +25 -0
  487. package/src/icons/PlayBackSpeedIcon.jsx +37 -0
  488. package/src/icons/PlayCircleIcon.jsx +44 -0
  489. package/src/icons/PlayIcon.jsx +20 -0
  490. package/src/icons/PlayOnRepeatIcon.jsx +26 -0
  491. package/src/icons/PlusIcon.jsx +21 -0
  492. package/src/icons/PreferencesIcon.jsx +25 -0
  493. package/src/icons/PreviousIcon.jsx +25 -0
  494. package/src/icons/PriceTagIcon.jsx +26 -0
  495. package/src/icons/ProducerIcon.jsx +69 -0
  496. package/src/icons/PuzzlePiece2Icon.jsx +26 -0
  497. package/src/icons/PuzzlePieceIcon.jsx +26 -0
  498. package/src/icons/QuantizationIcon.jsx +25 -0
  499. package/src/icons/RadioIcon.jsx +36 -0
  500. package/src/icons/RadioOffIcon.jsx +26 -0
  501. package/src/icons/RecordIcon.jsx +15 -0
  502. package/src/icons/RecordingIcon.jsx +22 -0
  503. package/src/icons/RedoIcon.jsx +26 -0
  504. package/src/icons/RefreshBackIcon.jsx +32 -0
  505. package/src/icons/RefreshIcon.jsx +26 -0
  506. package/src/icons/RemoveFromDeviceIcon.jsx +23 -0
  507. package/src/icons/RemoveIcon.jsx +25 -0
  508. package/src/icons/ReorderIcon.jsx +26 -0
  509. package/src/icons/RepostIcon.jsx +26 -0
  510. package/src/icons/ReverbIcon.jsx +25 -0
  511. package/src/icons/RocketIcon.jsx +30 -0
  512. package/src/icons/SaveTimeIcon.jsx +26 -0
  513. package/src/icons/SearchIcon.jsx +32 -0
  514. package/src/icons/SectionsIcon.jsx +25 -0
  515. package/src/icons/Setlist2Icon.jsx +26 -0
  516. package/src/icons/SetlistIcon.jsx +26 -0
  517. package/src/icons/SettingsIcon.jsx +27 -0
  518. package/src/icons/SharpIcon.jsx +20 -0
  519. package/src/icons/ShiftIcon.jsx +20 -0
  520. package/src/icons/ShuffleIcon.jsx +26 -0
  521. package/src/icons/SidebarIslandIcon.jsx +26 -0
  522. package/src/icons/SidebarLeftIcon.jsx +25 -0
  523. package/src/icons/SidebarRightIcon.jsx +26 -0
  524. package/src/icons/SlidersIcon.jsx +26 -0
  525. package/src/icons/SnareIcon.jsx +18 -0
  526. package/src/icons/SongBarIcon.jsx +26 -0
  527. package/src/icons/SongDetailIcon.jsx +26 -0
  528. package/src/icons/Songkey2Icon.jsx +25 -0
  529. package/src/icons/SongwritingIcon.jsx +26 -0
  530. package/src/icons/SoundEffectsGradientIcon.jsx +39 -0
  531. package/src/icons/SoundEffectsIcon.jsx +26 -0
  532. package/src/icons/SoundbarIcon.jsx +26 -0
  533. package/src/icons/SoundtrackGradientIcon.jsx +44 -0
  534. package/src/icons/SoundtrackIcon.jsx +26 -0
  535. package/src/icons/SparkBarsIcon.jsx +25 -0
  536. package/src/icons/SparkleIcon.jsx +35 -0
  537. package/src/icons/SparklesGradientIcon.jsx +62 -0
  538. package/src/icons/SpatialAudioIcon.jsx +55 -0
  539. package/src/icons/SpeakerIcon.jsx +23 -0
  540. package/src/icons/SpeakerLoudIcon.jsx +34 -0
  541. package/src/icons/SpeedChangerIcon.jsx +30 -0
  542. package/src/icons/SpeedIcon.jsx +18 -0
  543. package/src/icons/SplitIcon.jsx +21 -0
  544. package/src/icons/SpliterGradientIcon.jsx +44 -0
  545. package/src/icons/SpliterIcon.jsx +26 -0
  546. package/src/icons/StarFilledIcon.jsx +23 -0
  547. package/src/icons/StarIcon.jsx +20 -0
  548. package/src/icons/Stop2Icon.jsx +15 -0
  549. package/src/icons/StringsIcon.jsx +36 -0
  550. package/src/icons/TargetIcon.jsx +33 -0
  551. package/src/icons/ThumbDownIcon.jsx +26 -0
  552. package/src/icons/ThumbUpIcon.jsx +26 -0
  553. package/src/icons/ThumbsIcon.jsx +26 -0
  554. package/src/icons/TomsIcon.jsx +21 -0
  555. package/src/icons/TransposeIcon.jsx +26 -0
  556. package/src/icons/TrashIcon.jsx +21 -0
  557. package/src/icons/TrimIcon.jsx +27 -0
  558. package/src/icons/Tuner2Icon.jsx +23 -0
  559. package/src/icons/TunerIcon.jsx +18 -0
  560. package/src/icons/TvIcon.jsx +20 -0
  561. package/src/icons/UkuleleIcon.jsx +49 -0
  562. package/src/icons/UndoIcon.jsx +26 -0
  563. package/src/icons/UploadIcon.jsx +29 -0
  564. package/src/icons/UserGroup3Icon.jsx +26 -0
  565. package/src/icons/UserGroupIcon.jsx +26 -0
  566. package/src/icons/UserIcon.jsx +27 -0
  567. package/src/icons/Video2Icon.jsx +31 -0
  568. package/src/icons/Video3Icon.jsx +24 -0
  569. package/src/icons/VideoFileIcon.jsx +30 -0
  570. package/src/icons/VideoFilesIcon.jsx +30 -0
  571. package/src/icons/VideoIcon.jsx +21 -0
  572. package/src/icons/VocalIcon.jsx +18 -0
  573. package/src/icons/VocalIsolationIcon.jsx +29 -0
  574. package/src/icons/VocalsBackgroundIcon.jsx +32 -0
  575. package/src/icons/VocalsIcon.jsx +26 -0
  576. package/src/icons/Volume0Icon.jsx +26 -0
  577. package/src/icons/Volume1Icon.jsx +26 -0
  578. package/src/icons/Volume2Icon.jsx +26 -0
  579. package/src/icons/VolumeBarIcon.jsx +25 -0
  580. package/src/icons/WaveIcon.jsx +21 -0
  581. package/src/icons/WaveformIcon.jsx +25 -0
  582. package/src/icons/WidgetIcon.jsx +35 -0
  583. package/src/icons/WindIcon.jsx +18 -0
  584. package/src/icons/WoodwindBrassIcon.jsx +23 -0
  585. package/src/icons/ZoomCloseIcon.jsx +38 -0
  586. package/src/icons/ZoomInIcon.jsx +32 -0
  587. package/src/icons.jsx +343 -0
  588. package/src/index.jsx +152 -0
  589. package/src/lib/menu/Menu.module.css +356 -0
  590. package/src/lib/menu/index.js +2 -0
  591. package/src/lib/menu/renderItem.jsx +190 -0
  592. package/src/primitives.jsx +71 -0
  593. package/src/styles.css +10 -0
  594. package/src/utils/avatarUtils.js +18 -0
  595. package/src/utils/constants.js +16 -0
  596. package/src/utils/use-isomorphic-layout-effect.js +6 -0
  597. package/src/utils/useEventListener.js +34 -0
  598. package/src/utils/useIsMobileViewport.js +32 -0
  599. package/src/utils/useMobileDrawer.js +41 -0
  600. package/src/utils/useSubmitWithFeedback.js +32 -0
@@ -0,0 +1,582 @@
1
+ import { VoiceConversionForm } from './VoiceConversionForm'
2
+
3
+ export default {
4
+ title: 'Extensions/VoiceConversionForm',
5
+ component: VoiceConversionForm,
6
+ decorators: [
7
+ (Story) => (
8
+ <div style={{ width: '400px', height: '600px' }}>
9
+ <Story />
10
+ </div>
11
+ ),
12
+ ],
13
+ parameters: {
14
+ layout: 'centered',
15
+ docs: {
16
+ description: {
17
+ component: `
18
+
19
+ A comprehensive form component for AI voice conversion with support for multiple voice models and audio processing options.
20
+
21
+ ---
22
+
23
+ ## Basic Usage
24
+
25
+ \`\`\`jsx
26
+ import { VoiceConversionForm } from '@moises.ai/design-system'
27
+
28
+ <VoiceConversionForm
29
+ voices={voices}
30
+ formState={formState}
31
+ onFormStateChange={setFormState}
32
+ i18n={i18n}
33
+ onSubmit={handleSubmit}
34
+ onSelectTrack={handleSelectTrack}
35
+ />
36
+ \`\`\`
37
+
38
+
39
+ ---
40
+
41
+ ## Component API
42
+
43
+ ### Props
44
+
45
+ | Prop | Description |
46
+ |------|-------------|
47
+ | \`voices\` | Array of available voice models for conversion. |
48
+ | \`formState\` | Current form state containing selected voice, track, and settings. |
49
+ | \`onFormStateChange\` | Callback to update form state. Can accept a new state object or updater function. |
50
+ | \`onVoiceDetailsClick\` | Callback when user clicks to see voice details. |
51
+ | \`onBackToList\` | Callback to return to voice list from details view. |
52
+ | \`voiceDetailsId\` | ID of the voice to show in details view. |
53
+ | \`i18n\` | Internationalization object with _ method for translations. |
54
+ | \`isLoading\` | Loading state during voice conversion. |
55
+ | \`limitReached\` | Whether conversion concurrency limit has been reached. |
56
+ | \`submitted\` | Whether the conversion has been successfully submitted. |
57
+ | \`error\` | Error message to display. |
58
+ | \`onSubmit\` | Callback fired when the conversion button is clicked. |
59
+ | \`onSelectTrack\` | Callback to open track selector. |
60
+ | \`onMountConcurrency\` | Callback fired when concurrency component mounts. |
61
+ | \`showUpgradeConcurrency\` | Shows upgrade button when limit is reached. |
62
+ | \`onClickUpgradeConcurrency\` | Callback for upgrade button click on concurrency component. |
63
+ | \`onRemoveTrack\` | Callback to remove selected track. |
64
+
65
+ ### Definitions
66
+
67
+ \`\`\`jsx
68
+
69
+ voice = {
70
+ name: string;
71
+ description: string;
72
+ identifier: string;
73
+ lowestNote: string;
74
+ highestNote: string;
75
+ metadata: {
76
+ cover: string;
77
+ image: string;
78
+ avatar: string;
79
+ previewUrl: string;
80
+ vocalRange: string;
81
+ microphones: string;
82
+ recordingStudio?: string;
83
+ pitchProfile:{1: number, 2: number, 3: number, 4: number, ... n: number}
84
+ }
85
+ };
86
+ tags: string;
87
+ }
88
+
89
+ formState = {
90
+ selectedVoice: voice | null;
91
+ trackId: string | null;
92
+ trackName: string | null;
93
+ customAudio: ArrayBuffer | null;
94
+ pitchShift: number;
95
+ isolateVocals: boolean;
96
+ }
97
+ \`\`\`
98
+
99
+ ---
100
+
101
+ ## Notes
102
+
103
+ - The form automatically switches between voice list and voice details views
104
+ - Convert button is disabled when: limit reached, no track selected, or no voice selected
105
+ - Users can preview voice samples by clicking the avatar play button
106
+ - Advanced settings (pitch shift, isolate vocals) are available in the preferences popover
107
+ - Error and Success messages provide feedback on conversion status
108
+ `,
109
+ },
110
+ },
111
+ },
112
+ tags: ['autodocs'],
113
+ argTypes: {
114
+ voices: {
115
+ description: 'Array of available voice models for conversion',
116
+ control: false,
117
+ },
118
+ formState: {
119
+ description: 'Current form state containing all conversion parameters',
120
+ control: false,
121
+ },
122
+ onFormStateChange: {
123
+ description: 'Callback fired when form state changes',
124
+ control: false,
125
+ },
126
+ onVoiceDetailsClick: {
127
+ description: 'Callback when user clicks to see voice details',
128
+ control: false,
129
+ },
130
+ onBackToList: {
131
+ description: 'Callback to return to voice list from details view',
132
+ control: false,
133
+ },
134
+ voiceDetailsId: {
135
+ description: 'ID of the voice to show in details view',
136
+ control: false,
137
+ },
138
+ i18n: {
139
+ description: 'Internationalization object with _ method for translations',
140
+ control: false,
141
+ },
142
+ isLoading: {
143
+ description: 'Loading state during voice conversion',
144
+ control: false,
145
+ },
146
+ limitReached: {
147
+ description: 'Whether conversion concurrency limit has been reached',
148
+ control: false,
149
+ },
150
+ submitted: {
151
+ description: 'Whether the conversion has been successfully submitted',
152
+ control: false,
153
+ },
154
+ error: {
155
+ description: 'Error message to display',
156
+ control: false,
157
+ },
158
+ onSubmit: {
159
+ description: 'Callback fired when conversion button is clicked',
160
+ control: false,
161
+ },
162
+ onSelectTrack: {
163
+ description: 'Callback to open track selector',
164
+ control: false,
165
+ },
166
+ onMountConcurrency: {
167
+ description: 'Callback fired when concurrency component mounts',
168
+ control: false,
169
+ },
170
+ showUpgradeConcurrency: {
171
+ description: 'Whether to show upgrade button when limit is reached',
172
+ control: false,
173
+ },
174
+ onClickUpgradeConcurrency: {
175
+ description: 'Callback for upgrade button click',
176
+ control: false,
177
+ },
178
+ onRemoveTrack: {
179
+ description: 'Callback to remove selected track',
180
+ control: false,
181
+ },
182
+ },
183
+ }
184
+
185
+ // Mock voices data - matching the provided voice models
186
+ const mockVoices = [
187
+ {
188
+ name: 'Zuri',
189
+ description:
190
+ 'Uma voz mezzo-soprano envolvente e sedutora. Com um tom firme, uma respiração suave e um vibrato cheio de vida, perfeita para brilhar em projetos de R&B ou pop/rock comoventes.',
191
+ identifier: 'zuri',
192
+ lowestNote: 'D#3',
193
+ highestNote: 'C5',
194
+ metadata: {
195
+ cover:
196
+ 'https://storage.googleapis.com/moises-api-assets/voice/zuri-cover.jpg',
197
+ image: 'https://storage.googleapis.com/moises-api-assets/voice/zuri.jpg',
198
+ avatar:
199
+ 'https://storage.googleapis.com/moises-api-assets/voice/zuri-avatar.jpg',
200
+ previewUrl:
201
+ 'https://storage.googleapis.com/moises-api-assets/voice/demo_zuri.m4a',
202
+ vocalRange: 'Mezzo-soprano',
203
+ microphones:
204
+ 'Beyerdynamic M160, Neumann U87, Shure Sm57, Telefunken ELA M 251',
205
+ pitchProfile: {},
206
+ },
207
+ tags: 'Beyerdynamic M160, Neumann U87, Shure Sm57, Telefunken ELA M 251',
208
+ },
209
+ {
210
+ name: 'Amy',
211
+ description:
212
+ 'Uma voz mezzo-soprano muio expressiva, com uma profundidade de tom evocativa. Uma voz de peito robusta e uma voz de cabeça delicada, mas estável em todo o espectro. Um vibrato espesso e aveludado faz desta a escolha perfeita para canções de Neo-soul, pop ou gospel.',
213
+ identifier: 'amy',
214
+ lowestNote: 'F3',
215
+ highestNote: 'B4',
216
+ metadata: {
217
+ cover:
218
+ 'https://storage.googleapis.com/moises-api-assets/voice/amy-cover.jpg',
219
+ image: 'https://storage.googleapis.com/moises-api-assets/voice/amy.jpg',
220
+ avatar:
221
+ 'https://storage.googleapis.com/moises-api-assets/voice/amy-avatar.jpg',
222
+ previewUrl:
223
+ 'https://storage.googleapis.com/moises-api-assets/voice/demo_amy.m4a',
224
+ vocalRange: 'Mezzo-soprano',
225
+ microphones: 'AKG C414 XLII, Shure Sm57',
226
+ pitchProfile: {
227
+ 1: 0,
228
+ 2: 0,
229
+ 3: 0,
230
+ 4: 0,
231
+ 5: 0,
232
+ 6: 0,
233
+ 7: 0,
234
+ 8: 0,
235
+ 9: 0,
236
+ 10: 0,
237
+ },
238
+ },
239
+ tags: 'AKG C414 XLII, Shure Sm57',
240
+ },
241
+ {
242
+ name: 'Rosa',
243
+ description:
244
+ 'Uma voz mezzo-soprano delicada e quase melancólicae carregada de leveza. A paixão e tranquilidade são evocadas pela combinação fascinante entre a contenção tonal e um vibrato denso, embora frágil, fazendo dessa voz uma escolha perfeita para baladas pop emocionantes ou um jazz delicado.',
245
+ identifier: 'rosa',
246
+ lowestNote: 'D3',
247
+ highestNote: 'F#5',
248
+ metadata: {
249
+ cover:
250
+ 'https://storage.googleapis.com/moises-api-assets/voice/rosa-cover.jpg',
251
+ image: 'https://storage.googleapis.com/moises-api-assets/voice/rosa.jpg',
252
+ avatar:
253
+ 'https://storage.googleapis.com/moises-api-assets/voice/rosa-avatar.jpg',
254
+ previewUrl:
255
+ 'https://storage.googleapis.com/moises-api-assets/voice/demo_rosa.m4a',
256
+ vocalRange: 'Mezzo-soprano',
257
+ pitchProfile: {
258
+ 1: 0,
259
+ 2: 0,
260
+ 3: 0,
261
+ 4: 0,
262
+ 5: 0,
263
+ 6: 0,
264
+ 7: 0,
265
+ 8: 0,
266
+ 9: 0,
267
+ 10: 0,
268
+ },
269
+ },
270
+ tags: 'Neumann U87, Shure Sm7B',
271
+ },
272
+ {
273
+ name: 'Aisha',
274
+ description:
275
+ 'Um voz contralto tanto sensual quanto delicada, com um vibrato dinâmico e uma leve aspereza. Uma ótima escolha para rock suave ou canções pop mais tranquilas.',
276
+ identifier: 'aisha',
277
+ lowestNote: 'B1',
278
+ highestNote: 'F#5',
279
+ metadata: {
280
+ cover:
281
+ 'https://storage.googleapis.com/moises-api-assets/voice/aisha-cover.jpg',
282
+ image: 'https://storage.googleapis.com/moises-api-assets/voice/aisha.jpg',
283
+ avatar:
284
+ 'https://storage.googleapis.com/moises-api-assets/voice/aisha-avatar.jpg',
285
+ previewUrl:
286
+ 'https://storage.googleapis.com/moises-api-assets/voice/demo_aisha.m4a',
287
+ vocalRange: 'Contralto',
288
+ microphones: 'AEA R44C, Electro-voice RE20, Manley Referece Cardioid',
289
+ pitchProfile: {
290
+ 1: 0,
291
+ 2: 0,
292
+ 3: 0,
293
+ 4: 0,
294
+ 5: 0,
295
+ 6: 0,
296
+ 7: 0,
297
+ 8: 0,
298
+ 9: 0,
299
+ 10: 0,
300
+ },
301
+ },
302
+ tags: 'AEA R44C, Electro-voice RE20, Manley Referece Cardioid',
303
+ },
304
+ ]
305
+
306
+ // Mock i18n object (English)
307
+ const mockI18n = {
308
+ _: (text) => text,
309
+ }
310
+
311
+ // Mock i18n object (Portuguese)
312
+ const mockI18nPt = {
313
+ _: (text) => {
314
+ const translations = {
315
+ 'Convert Voice': 'Converter Voz',
316
+ 'Use this model': 'Usar este modelo',
317
+ Details: 'Detalhes',
318
+ 'Select audio file to convert ':
319
+ 'Selecionar arquivo de áudio para converter ',
320
+ Select: 'Selecionar',
321
+ Remove: 'Remover',
322
+ 'Voice conversion initialized!': 'Conversão de voz iniciada!',
323
+ 'The selected track to convert': 'A faixa selecionada para conversão',
324
+ 'Isolate Vocals': 'Isolar Vocais',
325
+ 'Pitch Shift': 'Mudança de Tom',
326
+ Semitones: 'Semitons',
327
+ 'Microphones used': 'Microfones utilizados',
328
+ 'Recorded at': 'Gravado em',
329
+ "You've reached the simultaneous voice conversion limit. Wait to finish before continuing.":
330
+ 'Você atingiu o limite de conversões simultâneas. Aguarde terminar antes de continuar.',
331
+ 'Unlock up to 10 simultaneous conversions,':
332
+ 'Desbloqueie até 10 conversões simultâneas,',
333
+ 'upgrade to PRO.': 'faça upgrade para PRO.',
334
+ }
335
+ return translations[text] || text
336
+ },
337
+ }
338
+
339
+ // Default form state
340
+ const FORM_DEFAULTS = {
341
+ selectedVoice: null,
342
+ trackId: null,
343
+ trackName: null,
344
+ customAudio: null,
345
+ pitchShift: 0,
346
+ isolateVocals: false,
347
+ }
348
+
349
+ // Mock callbacks
350
+ const mockCallbacks = {
351
+ onFormStateChange: (updater) => {
352
+ console.log(
353
+ 'Form state changed:',
354
+ typeof updater === 'function' ? 'updater function' : updater,
355
+ )
356
+ },
357
+ onVoiceDetailsClick: (id) => {
358
+ console.log('Voice details clicked:', id)
359
+ },
360
+ onBackToList: () => {
361
+ console.log('Back to list clicked')
362
+ },
363
+ onSubmit: (data) => {
364
+ console.log('Submit clicked:', data)
365
+ },
366
+ onSelectTrack: () => {
367
+ console.log('Select track clicked')
368
+ },
369
+ onMountConcurrency: () => {
370
+ console.log('Concurrency component mounted')
371
+ },
372
+ onClickUpgradeConcurrency: () => {
373
+ console.log('Upgrade concurrency clicked')
374
+ },
375
+ onRemoveTrack: () => {
376
+ console.log('Remove track clicked')
377
+ },
378
+ }
379
+
380
+ /**
381
+ * ## Default State
382
+ *
383
+ * The form in its initial state with voice list visible.
384
+ * User can browse available voices and select one for conversion.
385
+ */
386
+ export const Default = {
387
+ args: {
388
+ voices: mockVoices,
389
+ formState: FORM_DEFAULTS,
390
+ i18n: mockI18n,
391
+ isLoading: false,
392
+ limitReached: false,
393
+ submitted: false,
394
+ error: null,
395
+ showUpgradeConcurrency: false,
396
+ ...mockCallbacks,
397
+ },
398
+ }
399
+
400
+ /**
401
+ * ## Voice Details View
402
+ *
403
+ * Shows the detailed view of a specific voice model.
404
+ * Displays full description, vocal range, microphones used, and preview audio.
405
+ */
406
+ export const VoiceDetails = {
407
+ args: {
408
+ voices: mockVoices,
409
+ formState: FORM_DEFAULTS,
410
+ voiceDetailsId: 'rosa',
411
+ i18n: mockI18n,
412
+ isLoading: false,
413
+ limitReached: false,
414
+ submitted: false,
415
+ error: null,
416
+ showUpgradeConcurrency: false,
417
+ ...mockCallbacks,
418
+ },
419
+ }
420
+
421
+ /**
422
+ * ## With Track Selected
423
+ *
424
+ * Form with an audio track selected for conversion.
425
+ * Shows the track name and allows user to remove it.
426
+ */
427
+ export const WithTrackSelected = {
428
+ args: {
429
+ voices: mockVoices,
430
+ formState: {
431
+ ...FORM_DEFAULTS,
432
+ selectedVoice: mockVoices[1],
433
+ trackName: 'My Vocal Track.mp3',
434
+ },
435
+ i18n: mockI18n,
436
+ isLoading: false,
437
+ limitReached: false,
438
+ submitted: false,
439
+ error: null,
440
+ showUpgradeConcurrency: false,
441
+ ...mockCallbacks,
442
+ },
443
+ }
444
+
445
+ /**
446
+ * ## With Track ID from Project
447
+ *
448
+ * Form with a track selected from the project (via trackId).
449
+ * Displays the track name with option to remove.
450
+ */
451
+ export const WithTrackFromProject = {
452
+ args: {
453
+ voices: mockVoices,
454
+ formState: {
455
+ ...FORM_DEFAULTS,
456
+ selectedVoice: mockVoices[2],
457
+ trackId: 'track-123',
458
+ trackName: 'Lead Vocals',
459
+ },
460
+ i18n: mockI18n,
461
+ isLoading: false,
462
+ limitReached: false,
463
+ submitted: false,
464
+ error: null,
465
+ showUpgradeConcurrency: false,
466
+ ...mockCallbacks,
467
+ },
468
+ }
469
+
470
+ /**
471
+ * ## Loading State
472
+ *
473
+ * Shows the form while a voice conversion is being processed.
474
+ * The convert button displays a loading spinner and is disabled.
475
+ */
476
+ export const Loading = {
477
+ args: {
478
+ voices: mockVoices,
479
+ formState: {
480
+ ...FORM_DEFAULTS,
481
+ selectedVoice: mockVoices[0],
482
+ trackName: 'My Vocal Track.mp3',
483
+ },
484
+ i18n: mockI18n,
485
+ isLoading: true,
486
+ limitReached: false,
487
+ submitted: false,
488
+ error: null,
489
+ showUpgradeConcurrency: false,
490
+ ...mockCallbacks,
491
+ },
492
+ }
493
+
494
+ /**
495
+ * ## Error State
496
+ *
497
+ * Displays an error message when conversion fails.
498
+ * User can see what went wrong and try again.
499
+ */
500
+ export const WithError = {
501
+ args: {
502
+ voices: mockVoices,
503
+ formState: {
504
+ ...FORM_DEFAULTS,
505
+ selectedVoice: mockVoices[0],
506
+ trackName: 'My Vocal Track.mp3',
507
+ },
508
+ i18n: mockI18n,
509
+ isLoading: false,
510
+ limitReached: false,
511
+ submitted: false,
512
+ error: 'Voice conversion failed. Please try again.',
513
+ showUpgradeConcurrency: false,
514
+ ...mockCallbacks,
515
+ },
516
+ }
517
+
518
+ /**
519
+ * ## Limit Reached
520
+ *
521
+ * Shows the concurrency limit warning when user has reached
522
+ * their maximum concurrent conversions. Free users see an upgrade prompt.
523
+ */
524
+ export const LimitReached = {
525
+ args: {
526
+ voices: mockVoices,
527
+ formState: FORM_DEFAULTS,
528
+ i18n: mockI18n,
529
+ isLoading: false,
530
+ limitReached: true,
531
+ submitted: false,
532
+ error: null,
533
+ showUpgradeConcurrency: true,
534
+ ...mockCallbacks,
535
+ },
536
+ }
537
+
538
+ /**
539
+ * ## Limit Reached (Pro User)
540
+ *
541
+ * Shows the concurrency limit for Pro users without upgrade button.
542
+ * Pro users just need to wait for current conversions to finish.
543
+ */
544
+ export const LimitReachedPro = {
545
+ args: {
546
+ voices: mockVoices,
547
+ formState: FORM_DEFAULTS,
548
+ i18n: mockI18n,
549
+ isLoading: false,
550
+ limitReached: true,
551
+ submitted: false,
552
+ error: null,
553
+ showUpgradeConcurrency: false,
554
+ ...mockCallbacks,
555
+ },
556
+ }
557
+
558
+ /**
559
+ * ## Ready to Convert
560
+ *
561
+ * Complete setup ready for conversion with voice and track selected.
562
+ * This is the typical state before user clicks the convert button.
563
+ */
564
+ export const ReadyToConvert = {
565
+ args: {
566
+ voices: mockVoices,
567
+ formState: {
568
+ ...FORM_DEFAULTS,
569
+ selectedVoice: mockVoices[2],
570
+ trackName: 'Vocal Performance.wav',
571
+ pitchShift: 0,
572
+ isolateVocals: false,
573
+ },
574
+ i18n: mockI18n,
575
+ isLoading: false,
576
+ limitReached: false,
577
+ submitted: false,
578
+ error: null,
579
+ showUpgradeConcurrency: false,
580
+ ...mockCallbacks,
581
+ },
582
+ }
@@ -0,0 +1,93 @@
1
+ import { Flex, Text, Box, Avatar, ScrollArea } from '@radix-ui/themes'
2
+ import { AbbeyRoadIcon } from '../../../icons'
3
+ import { getProxiedAvatarUrl } from '../../../utils/avatarUtils'
4
+ import { Waveform } from '../Waveform/Waveform'
5
+ import styles from './VoiceDetails.module.css'
6
+
7
+ export const VoiceDetails = ({
8
+ item,
9
+ wavegroup,
10
+ i18n = { _: (text) => text },
11
+ }) => {
12
+ return (
13
+ <ScrollArea height="100%" width="100%" scrollbars="vertical">
14
+ <Flex
15
+ direction="column"
16
+ gap="4"
17
+ overflow="auto"
18
+ pb="4"
19
+ pr="3"
20
+ height="100%"
21
+ >
22
+ <Box position="relative">
23
+ <Avatar
24
+ src={getProxiedAvatarUrl(item?.metadata?.image)}
25
+ fallback={item?.name || 'Voice'}
26
+ className={styles.responsiveAvatar}
27
+ />
28
+
29
+ <Flex position="absolute" bottom="8px" left="12px" direction="column">
30
+ <Text size="5" weight="regular" className={styles.neutralAlpha12}>
31
+ {item?.name}
32
+ </Text>
33
+ <Text
34
+ size="1"
35
+ weight="regular"
36
+ className={styles.descriptionVoiceList}
37
+ >
38
+ {item?.metadata?.vocalRange} <span>|</span> {item?.lowestNote} -{' '}
39
+ {item?.highestNote}
40
+ </Text>
41
+ </Flex>
42
+ </Box>
43
+
44
+ <Flex minHeight="36px">
45
+ <Waveform
46
+ audio={item?.metadata?.previewUrl}
47
+ wavegroup={wavegroup}
48
+ size="md"
49
+ />
50
+ </Flex>
51
+ <Text size="2" weight="regular" className={styles.neutralAlpha11}>
52
+ {item?.description}
53
+ </Text>
54
+
55
+ <Flex justify="between" align="center" gap="2">
56
+ <Flex direction="column">
57
+ {(item?.metadata?.microphones || item?.tags) && (
58
+ <>
59
+ <Text size="1" className={styles.neutralAlpha10}>
60
+ {i18n._('Microphones used')}
61
+ </Text>
62
+ <Text size="1" className={styles.neutralAlpha11}>
63
+ {item?.metadata?.microphones || item?.tags}
64
+ </Text>
65
+ </>
66
+ )}
67
+ </Flex>
68
+ {item?.metadata?.recordingStudio && (
69
+ <Flex direction="row" align="center" gap="2">
70
+ <AbbeyRoadIcon
71
+ width={35}
72
+ height={26}
73
+ style={{
74
+ flexShrink: 0,
75
+ minWidth: '35px',
76
+ minHeight: '26px',
77
+ }}
78
+ />
79
+ <Flex direction="column">
80
+ <Text size="1" style={{ color: 'var(--neutral-alpha-10)' }}>
81
+ {i18n._('Recorded at')}
82
+ </Text>
83
+ <Text size="1" style={{ color: 'var(--neutral-alpha-11)' }}>
84
+ Abbey Road Studios
85
+ </Text>
86
+ </Flex>
87
+ </Flex>
88
+ )}
89
+ </Flex>
90
+ </Flex>
91
+ </ScrollArea>
92
+ )
93
+ }
@@ -0,0 +1,44 @@
1
+ .responsiveAvatar {
2
+ width: 100%;
3
+ height: 328px;
4
+ object-fit: cover;
5
+ position: relative;
6
+
7
+ @media (min-width: 400px) {
8
+ height: 404px;
9
+ }
10
+ }
11
+
12
+ .responsiveAvatar::after {
13
+ content: '';
14
+ position: absolute;
15
+ top: 0;
16
+ left: 0;
17
+ right: 0;
18
+ bottom: 0;
19
+ background: linear-gradient(180deg, rgba(17, 17, 17, 0.00) 0%, rgba(17, 17, 17, 0.80) 100%);
20
+ pointer-events: none;
21
+ border-radius: inherit;
22
+ }
23
+
24
+ .descriptionVoiceList {
25
+ color: var(--neutral-alpha-11);
26
+
27
+ span {
28
+ color: var(--neutral-alpha-6);
29
+ }
30
+ }
31
+
32
+ .neutralAlpha11 {
33
+ color: var(--neutral-alpha-11);
34
+ }
35
+
36
+ .neutralAlpha12 {
37
+ color: var(--neutral-alpha-12);
38
+ }
39
+
40
+ .neutralAlpha10 {
41
+ color: var(--neutral-alpha-10);
42
+ }
43
+
44
+