react-modern-audio-player 2.2.0 → 2.3.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 (24) hide show
  1. package/README.md +75 -57
  2. package/dist/index.css +1 -1
  3. package/dist/index.es.js +993 -835
  4. package/dist/types/api/useAudioPlayer.d.ts +2 -0
  5. package/dist/types/api/useAudioPlayerPlayback.d.ts +2 -0
  6. package/dist/types/components/AudioPlayer/Context/PlaybackContext.d.ts +1 -0
  7. package/dist/types/components/AudioPlayer/Context/StateContext/audio.d.ts +2 -0
  8. package/dist/types/components/AudioPlayer/Context/StateContext/element.d.ts +1 -0
  9. package/dist/types/components/AudioPlayer/Context/StateContext/index.d.ts +2 -1
  10. package/dist/types/components/AudioPlayer/Context/StateContext/placement.d.ts +7 -5
  11. package/dist/types/components/AudioPlayer/Context/UIContext.d.ts +2 -1
  12. package/dist/types/components/AudioPlayer/Context/dispatchContext.d.ts +5 -2
  13. package/dist/types/components/AudioPlayer/Context/providerProps.d.ts +2 -1
  14. package/dist/types/components/AudioPlayer/Interface/Controller/SpeedSelector/SpeedSelector.d.ts +10 -0
  15. package/dist/types/components/AudioPlayer/Interface/Controller/SpeedSelector/index.d.ts +2 -0
  16. package/dist/types/components/AudioPlayer/Interface/Controller/Tooltip/Volume/index.d.ts +5 -1
  17. package/dist/types/components/AudioPlayer/Interface/hooks/index.d.ts +2 -0
  18. package/dist/types/components/AudioPlayer/Interface/hooks/useDropdownAutoPlacement.d.ts +5 -0
  19. package/dist/types/components/AudioPlayer/Interface/hooks/useResolvedDropdownProps.d.ts +18 -0
  20. package/dist/types/components/AudioPlayer/Player/index.d.ts +2 -2
  21. package/dist/types/components/AudioPlayer/Provider/AudioPlayerStateProvider.d.ts +2 -2
  22. package/dist/types/components/AudioPlayer/index.d.ts +5 -3
  23. package/package.json +1 -1
  24. package/dist/types/components/AudioPlayer/Interface/Controller/Tooltip/Volume/useVolume.d.ts +0 -5
@@ -6,6 +6,7 @@ export interface AudioPlayerControls {
6
6
  duration: number;
7
7
  repeatType: RepeatType;
8
8
  muted: boolean;
9
+ playbackRate: number;
9
10
  currentTrack: AudioData | null;
10
11
  currentIndex: number;
11
12
  playList: ReadonlyArray<AudioData>;
@@ -18,6 +19,7 @@ export interface AudioPlayerControls {
18
19
  setVolume: (volume: number) => void;
19
20
  toggleMute: () => void;
20
21
  setTrack: (index: number) => void;
22
+ setPlaybackRate: (rate: number) => void;
21
23
  }
22
24
  /**
23
25
  * Convenience facade that composes all domain sub-hooks into a single flat
@@ -2,8 +2,10 @@ import { RepeatType } from '../components/AudioPlayer/Context/StateContext';
2
2
  export interface AudioPlayerPlaybackControls {
3
3
  isPlaying: boolean;
4
4
  repeatType: RepeatType;
5
+ playbackRate: number;
5
6
  play: () => void;
6
7
  pause: () => void;
7
8
  togglePlay: () => void;
9
+ setPlaybackRate: (rate: number) => void;
8
10
  }
9
11
  export declare const useAudioPlayerPlayback: () => AudioPlayerPlaybackControls;
@@ -6,5 +6,6 @@ export interface PlaybackContext {
6
6
  repeatType: RepeatType;
7
7
  isLoadedMetaData: boolean | undefined;
8
8
  audioResetKey: number;
9
+ playbackRate: number;
9
10
  }
10
11
  export declare const playbackContext: import('react').Context<PlaybackContext | null>;
@@ -8,6 +8,7 @@ export type AudioCustomProps = {
8
8
  volume?: number;
9
9
  currentTime?: number;
10
10
  duration?: number;
11
+ playbackRate?: number;
11
12
  };
12
13
  export declare const DEFAULT_AUDIO_STATE: {
13
14
  readonly isPlaying: false;
@@ -16,6 +17,7 @@ export declare const DEFAULT_AUDIO_STATE: {
16
17
  readonly repeatType: RepeatType;
17
18
  readonly currentTime: 0;
18
19
  readonly duration: 0;
20
+ readonly playbackRate: 1;
19
21
  };
20
22
  export type AudioData = {
21
23
  src: string;
@@ -15,6 +15,7 @@ export type ActiveUI = Partial<{
15
15
  trackInfo: boolean;
16
16
  artwork: boolean;
17
17
  progress: ProgressUI;
18
+ playbackRate: boolean;
18
19
  }>;
19
20
  export type CustomIcons = Partial<{
20
21
  play: ReactNode;
@@ -1,6 +1,6 @@
1
1
  import { AudioState } from './audio';
2
2
  import { ActiveUI, CoverImgsCss, ElementRefs, CustomIcons, PlayList } from './element';
3
- import { PlayListPlacement, InterfacePlacement, PlayerPlacement, VolumeSliderPlacement } from './placement';
3
+ import { PlayListPlacement, InterfacePlacement, PlayerPlacement, SpeedSelectorPlacement, VolumeSliderPlacement } from './placement';
4
4
  export interface AudioPlayerStateContext {
5
5
  playList: PlayList;
6
6
  curPlayId: number;
@@ -11,6 +11,7 @@ export interface AudioPlayerStateContext {
11
11
  playerPlacement?: PlayerPlacement;
12
12
  interfacePlacement?: InterfacePlacement;
13
13
  volumeSliderPlacement?: VolumeSliderPlacement;
14
+ speedSelectorPlacement?: SpeedSelectorPlacement;
14
15
  elementRefs?: ElementRefs;
15
16
  customIcons?: CustomIcons;
16
17
  coverImgsCss?: CoverImgsCss;
@@ -2,24 +2,26 @@ import { DropdownContentPlacement } from '../../../Dropdown';
2
2
  import { NumbersToUnionNum } from '../../../../utils/generateUnionNumType';
3
3
  import { ActiveUI } from './element';
4
4
  export type VolumeSliderPlacement = DropdownContentPlacement;
5
+ export type SpeedSelectorPlacement = DropdownContentPlacement;
5
6
  export type PlayListPlacement = "bottom" | "top";
6
7
  export type PlayerPlacement = "bottom" | "top" | "bottom-left" | "bottom-right" | "top-left" | "top-right" | "static";
7
- export declare const defaultInterfacePlacementMaxLength = 10;
8
+ export declare const DEFAULT_INTERFACE_GRID_BOUND = 11;
8
9
  export type InterfacePlacementKey = Exclude<keyof ActiveUI, "all" | "prevNnext" | "trackTime" | "volumeSlider"> | "trackTimeCurrent" | "trackTimeDuration";
9
- export type InterfaceGridTemplateArea<TMaxLength extends number = typeof defaultInterfacePlacementMaxLength> = Partial<Record<InterfacePlacementKey, `row${NumbersToUnionNum<TMaxLength>}-${NumbersToUnionNum<TMaxLength>}`>>;
10
+ export type InterfaceGridTemplateArea<TMaxLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND> = Partial<Record<InterfacePlacementKey, `row${NumbersToUnionNum<TMaxLength>}-${NumbersToUnionNum<TMaxLength>}`>>;
10
11
  export type InterfaceGridCustomComponentsArea<TMaxLength extends number> = Partial<Record<string, `row${NumbersToUnionNum<TMaxLength>}-${NumbersToUnionNum<TMaxLength>}`>>;
11
12
  export type InterfaceGridItemArea = Partial<Record<InterfacePlacementKey, string>>;
12
- export type InterfacePlacement<TMaxLength extends number = typeof defaultInterfacePlacementMaxLength> = {
13
+ export type InterfacePlacement<TMaxLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND> = {
13
14
  templateArea?: InterfaceGridTemplateArea<TMaxLength>;
14
15
  customComponentsArea?: InterfaceGridCustomComponentsArea<TMaxLength>;
15
16
  itemCustomArea?: InterfaceGridItemArea;
16
17
  };
17
18
  export declare const defaultInterfacePlacement: {
18
- templateArea: Required<InterfaceGridTemplateArea<typeof defaultInterfacePlacementMaxLength>>;
19
+ templateArea: Required<InterfaceGridTemplateArea<typeof DEFAULT_INTERFACE_GRID_BOUND>>;
19
20
  };
20
- export interface Placements<TInterfacePlacementLength extends number = typeof defaultInterfacePlacementMaxLength> {
21
+ export interface Placements<TInterfacePlacementLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND> {
21
22
  playListPlacement: PlayListPlacement;
22
23
  interfacePlacement: InterfacePlacement<TInterfacePlacementLength>;
23
24
  volumeSliderPlacement: VolumeSliderPlacement | undefined;
25
+ speedSelectorPlacement: SpeedSelectorPlacement | undefined;
24
26
  playerPlacement: PlayerPlacement | undefined;
25
27
  }
@@ -1,4 +1,4 @@
1
- import { ActiveUI, InterfacePlacement, PlayListPlacement, PlayerPlacement, VolumeSliderPlacement } from './StateContext';
1
+ import { ActiveUI, InterfacePlacement, PlayListPlacement, PlayerPlacement, SpeedSelectorPlacement, VolumeSliderPlacement } from './StateContext';
2
2
  export type ColorScheme = "light" | "dark";
3
3
  export interface UIContext {
4
4
  activeUI: ActiveUI;
@@ -6,6 +6,7 @@ export interface UIContext {
6
6
  playerPlacement?: PlayerPlacement;
7
7
  interfacePlacement?: InterfacePlacement;
8
8
  volumeSliderPlacement?: VolumeSliderPlacement;
9
+ speedSelectorPlacement?: SpeedSelectorPlacement;
9
10
  colorScheme?: ColorScheme;
10
11
  playListExpanded?: boolean;
11
12
  }
@@ -1,6 +1,6 @@
1
1
  import { Dispatch } from 'react';
2
- import { RepeatType, PlayList, PlayListPlacement, PlayerPlacement, ActiveUI, ElementRefs, CustomIcons, InterfacePlacement, CoverImgsCss, VolumeSliderPlacement, defaultInterfacePlacementMaxLength, AudioState } from './StateContext';
3
- export type AudioContextAction<TInterfacePlacementLength extends number = typeof defaultInterfacePlacementMaxLength> = {
2
+ import { RepeatType, PlayList, PlayListPlacement, PlayerPlacement, ActiveUI, ElementRefs, CustomIcons, InterfacePlacement, CoverImgsCss, VolumeSliderPlacement, DEFAULT_INTERFACE_GRID_BOUND, AudioState } from './StateContext';
3
+ export type AudioContextAction<TInterfacePlacementLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND> = {
4
4
  type: "NEXT_AUDIO";
5
5
  } | {
6
6
  type: "PREV_AUDIO";
@@ -34,6 +34,9 @@ export type AudioContextAction<TInterfacePlacementLength extends number = typeof
34
34
  } | {
35
35
  type: "SET_MUTED";
36
36
  muted: boolean;
37
+ } | {
38
+ type: "SET_PLAYBACK_RATE";
39
+ playbackRate: number;
37
40
  } | {
38
41
  type: "SET_ACTIVE_UI";
39
42
  activeUI: ActiveUI;
@@ -1,4 +1,4 @@
1
- import { ActiveUI, CoverImgsCss, CustomIcons, InitialStates, InterfacePlacement, PlayList, PlayListPlacement, PlayerPlacement, VolumeSliderPlacement } from './StateContext';
1
+ import { ActiveUI, CoverImgsCss, CustomIcons, InitialStates, InterfacePlacement, PlayList, PlayListPlacement, PlayerPlacement, SpeedSelectorPlacement, VolumeSliderPlacement } from './StateContext';
2
2
  export interface AudioPlayerStateProviderProps<TInterfacePlacementLength extends number> {
3
3
  playList: PlayList;
4
4
  audioInitialState?: InitialStates;
@@ -10,5 +10,6 @@ export interface AudioPlayerStateProviderProps<TInterfacePlacementLength extends
10
10
  playList?: PlayListPlacement;
11
11
  interface?: InterfacePlacement<TInterfacePlacementLength>;
12
12
  volumeSlider?: VolumeSliderPlacement;
13
+ speedSelector?: SpeedSelectorPlacement;
13
14
  };
14
15
  }
@@ -0,0 +1,10 @@
1
+ import { FC } from 'react';
2
+ import { GridItemLayoutProps } from '../../../../Grid';
3
+ import { SpeedSelectorPlacement } from '../../../Context/StateContext';
4
+ export interface SpeedSelectorProps extends GridItemLayoutProps {
5
+ options?: number[];
6
+ formatRate?: (rate: number) => string;
7
+ triggerType?: "click" | "hover";
8
+ placement?: SpeedSelectorPlacement;
9
+ }
10
+ export declare const SpeedSelector: FC<SpeedSelectorProps>;
@@ -0,0 +1,2 @@
1
+ export { SpeedSelector } from './SpeedSelector';
2
+ export type { SpeedSelectorProps } from './SpeedSelector';
@@ -1,4 +1,8 @@
1
1
  import { FC } from 'react';
2
2
  import { GridItemLayoutProps } from '../../../../../Grid';
3
- export type VolumeProps = GridItemLayoutProps;
3
+ import { VolumeSliderPlacement } from '../../../../Context/StateContext';
4
+ export interface VolumeProps extends GridItemLayoutProps {
5
+ triggerType?: "click" | "hover";
6
+ placement?: VolumeSliderPlacement;
7
+ }
4
8
  export declare const Volume: FC<VolumeProps>;
@@ -1,2 +1,4 @@
1
1
  export * from './useResolvedGridArea';
2
2
  export * from './useGridTemplate';
3
+ export * from './useDropdownAutoPlacement';
4
+ export * from './useResolvedDropdownProps';
@@ -0,0 +1,5 @@
1
+ import { DropdownContentPlacement } from '../../../Dropdown';
2
+ export declare const useDropdownAutoPlacement: ({ triggerRef, initialState, }: {
3
+ triggerRef: React.RefObject<HTMLElement>;
4
+ initialState: DropdownContentPlacement;
5
+ }) => DropdownContentPlacement;
@@ -0,0 +1,18 @@
1
+ import { DropdownContentPlacement } from '../../../Dropdown';
2
+ type TriggerType = "click" | "hover";
3
+ interface UseResolvedDropdownPropsParams {
4
+ triggerType: TriggerType | undefined;
5
+ placement: DropdownContentPlacement | undefined;
6
+ contextPlacement: DropdownContentPlacement | undefined;
7
+ triggerRef: React.RefObject<HTMLElement>;
8
+ defaults: {
9
+ triggerType: TriggerType;
10
+ placement: DropdownContentPlacement;
11
+ };
12
+ }
13
+ export declare const useResolvedDropdownProps: ({ triggerType, placement, contextPlacement, triggerRef, defaults, }: UseResolvedDropdownPropsParams) => {
14
+ triggerType: TriggerType;
15
+ placement: DropdownContentPlacement;
16
+ contentRole: "dialog" | "tooltip";
17
+ };
18
+ export {};
@@ -1,4 +1,4 @@
1
- import { AudioPlayerStateProviderProps, defaultInterfacePlacementMaxLength } from '../Context';
1
+ import { AudioPlayerStateProviderProps, DEFAULT_INTERFACE_GRID_BOUND } from '../Context';
2
2
  export interface AudioPlayerProps<TInterfacePlacementLength extends number> extends AudioPlayerStateProviderProps<TInterfacePlacementLength> {
3
3
  children?: React.ReactNode;
4
4
  audioRef?: React.MutableRefObject<HTMLAudioElement>;
@@ -9,4 +9,4 @@ export interface AudioPlayerProps<TInterfacePlacementLength extends number> exte
9
9
  */
10
10
  colorScheme?: "light" | "dark";
11
11
  }
12
- export declare const AudioPlayer: <TInterfacePlacementLength extends number = typeof defaultInterfacePlacementMaxLength>({ audioRef, children, ...restProps }: AudioPlayerProps<TInterfacePlacementLength>) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const AudioPlayer: <TInterfacePlacementLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND>({ audioRef, children, ...restProps }: AudioPlayerProps<TInterfacePlacementLength>) => import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,7 @@
1
- import { defaultInterfacePlacementMaxLength, AudioPlayerStateProviderProps } from '../Context';
1
+ import { DEFAULT_INTERFACE_GRID_BOUND, AudioPlayerStateProviderProps } from '../Context';
2
2
  import { PropsWithChildren } from 'react';
3
3
  interface AudioPlayerStateProviderOwnProps<T extends number = number> extends AudioPlayerStateProviderProps<T> {
4
4
  colorScheme?: "light" | "dark";
5
5
  }
6
- export declare const AudioPlayerStateProvider: <TInterfacePlacementLength extends number = typeof defaultInterfacePlacementMaxLength>({ children, colorScheme, ...initProps }: PropsWithChildren<AudioPlayerStateProviderOwnProps<TInterfacePlacementLength>>) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const AudioPlayerStateProvider: <TInterfacePlacementLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND>({ children, colorScheme, ...initProps }: PropsWithChildren<AudioPlayerStateProviderOwnProps<TInterfacePlacementLength>>) => import("react/jsx-runtime").JSX.Element;
7
7
  export {};
@@ -1,17 +1,18 @@
1
1
  import { AudioPlayerContainerProps } from './Container';
2
- import { defaultInterfacePlacementMaxLength } from './Context';
2
+ import { DEFAULT_INTERFACE_GRID_BOUND } from './Context';
3
3
  import { CustomComponent } from './Interface/CustomComponent';
4
4
  import { PlayListEmpty } from './Interface/PlayListEmpty';
5
5
  import { AudioPlayerProps } from './Player';
6
6
  import { Progress } from './Interface/Controller/Input';
7
7
  import { Volume } from './Interface/Controller/Tooltip';
8
8
  import { SortablePlayList } from './Interface/Controller/Drawer';
9
+ import { SpeedSelector } from './Interface/Controller/SpeedSelector';
9
10
  import { TransportControls, RepeatTypeBtn } from './Interface/Controller/Button';
10
11
  import { Artwork } from './Interface/Information/Artwork';
11
12
  import { TrackInfo } from './Interface/Information/TrackInfo';
12
13
  import { TrackTime } from './Interface/Information/TrackTime';
13
- export type RMAudioPlayerProps<TInterfacePlacementLength extends number = typeof defaultInterfacePlacementMaxLength> = AudioPlayerProps<TInterfacePlacementLength> & AudioPlayerContainerProps;
14
- declare function AudioPlayerWithProviders<TInterfacePlacementLength extends number = typeof defaultInterfacePlacementMaxLength>({ rootContainerProps, ...audioPlayProps }: RMAudioPlayerProps<TInterfacePlacementLength>): import("react/jsx-runtime").JSX.Element;
14
+ export type RMAudioPlayerProps<TInterfacePlacementLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND> = AudioPlayerProps<TInterfacePlacementLength> & AudioPlayerContainerProps;
15
+ declare function AudioPlayerWithProviders<TInterfacePlacementLength extends number = typeof DEFAULT_INTERFACE_GRID_BOUND>({ rootContainerProps, ...audioPlayProps }: RMAudioPlayerProps<TInterfacePlacementLength>): import("react/jsx-runtime").JSX.Element;
15
16
  declare namespace AudioPlayerWithProviders {
16
17
  var displayName: string;
17
18
  }
@@ -22,6 +23,7 @@ type AudioPlayerComponent = typeof AudioPlayerWithProviders & {
22
23
  PlayListEmpty: typeof PlayListEmpty;
23
24
  PlayButton: typeof TransportControls;
24
25
  RepeatButton: typeof RepeatTypeBtn;
26
+ SpeedSelector: typeof SpeedSelector;
25
27
  Artwork: typeof Artwork;
26
28
  TrackInfo: typeof TrackInfo;
27
29
  TrackTime: typeof TrackTime;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-modern-audio-player",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Modern, customizable React audio player with waveform visualization, drag-and-drop playlist, WAI-ARIA accessibility, TypeScript-first API, and Next.js App Router (Server Components) support.",
5
5
  "author": {
6
6
  "name": "MAXX",
@@ -1,5 +0,0 @@
1
- import { VolumeSliderPlacement } from '../../../../Context';
2
- export declare const useVolumeSliderPlacement: ({ triggerRef, initialState, }: {
3
- triggerRef: React.RefObject<HTMLElement>;
4
- initialState: VolumeSliderPlacement;
5
- }) => import('../../../../../Dropdown').DropdownContentPlacement;