Skip to content

Commit 0467f87

Browse files
authored
feat(player/react): add default layout slots for settings submenus (#1246)
1 parent 0423267 commit 0467f87

6 files changed

Lines changed: 59 additions & 10 deletions

File tree

packages/react/src/components/layouts/default/slots.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,21 @@ export type DefaultLayoutSlotName =
4747
export type DefaultLayoutMenuSlotName =
4848
| 'chaptersMenu'
4949
| 'settingsMenu'
50+
/** @deprecated - use `settingsMenuItemsStart` */
5051
| 'settingsMenuStartItems'
51-
| 'settingsMenuEndItems';
52+
/** @deprecated - use `settingsMenuItemsEnd` */
53+
| 'settingsMenuEndItems'
54+
| 'settingsMenuItemsStart'
55+
| 'settingsMenuItemsEnd'
56+
| 'playbackMenuItemsStart'
57+
| 'playbackMenuItemsEnd'
58+
| 'playbackMenuLoop'
59+
| 'accessibilityMenuItemsStart'
60+
| 'accessibilityMenuItemsEnd'
61+
| 'audioMenuItemsStart'
62+
| 'audioMenuItemsEnd'
63+
| 'captionsMenuItemsStart'
64+
| 'captionsMenuItemsEnd';
5265

5366
export interface DefaultLayoutSlots extends Slots<DefaultLayoutSlotName> {}
5467

packages/react/src/components/layouts/default/ui/menus/accessibility-menu.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as React from 'react';
33
import { useMediaState } from '../../../../../hooks/use-media-state';
44
import * as Menu from '../../../../ui/menu';
55
import { useDefaultLayoutContext, useDefaultLayoutWord } from '../../context';
6+
import { slot, type DefaultLayoutMenuSlotName, type Slots } from '../../slots';
67
import { DefaultFontMenu } from './font-menu';
78
import { DefaultMenuCheckbox } from './items/menu-checkbox';
89
import { DefaultMenuButton, DefaultMenuItem, DefaultMenuSection } from './items/menu-items';
@@ -11,14 +12,20 @@ import { DefaultMenuButton, DefaultMenuItem, DefaultMenuSection } from './items/
1112
* DefaultAccessibilityMenu
1213
* -----------------------------------------------------------------------------------------------*/
1314

14-
function DefaultAccessibilityMenu() {
15+
interface DefaultAccessibilityMenuProps {
16+
slots?: Slots<DefaultLayoutMenuSlotName>;
17+
}
18+
19+
function DefaultAccessibilityMenu({ slots }: DefaultAccessibilityMenuProps) {
1520
const label = useDefaultLayoutWord('Accessibility'),
1621
{ icons: Icons } = useDefaultLayoutContext();
1722

1823
return (
1924
<Menu.Root className="vds-accessibility-menu vds-menu">
2025
<DefaultMenuButton label={label} Icon={Icons.Menu.Accessibility} />
2126
<Menu.Content className="vds-menu-items">
27+
{slot(slots, 'accessibilityMenuItemsStart', null)}
28+
2229
<DefaultMenuSection>
2330
<DefaultAnnouncementsMenuCheckbox />
2431
<DefaultKeyboardAnimationsMenuCheckbox />
@@ -27,6 +34,8 @@ function DefaultAccessibilityMenu() {
2734
<DefaultMenuSection>
2835
<DefaultFontMenu />
2936
</DefaultMenuSection>
37+
38+
{slot(slots, 'accessibilityMenuItemsEnd', null)}
3039
</Menu.Content>
3140
</Menu.Root>
3241
);

packages/react/src/components/layouts/default/ui/menus/audio-menu.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@ import { useMediaState } from '../../../../../hooks/use-media-state';
77
import * as Menu from '../../../../ui/menu';
88
import * as AudioGainSlider from '../../../../ui/sliders/audio-gain-slider';
99
import { useDefaultLayoutContext, useDefaultLayoutWord } from '../../context';
10+
import { slot, type DefaultLayoutMenuSlotName, type Slots } from '../../slots';
1011
import { DefaultMenuButton, DefaultMenuSection } from './items/menu-items';
1112
import { DefaultMenuSliderItem, DefaultSliderParts, DefaultSliderSteps } from './items/menu-slider';
1213

1314
/* -------------------------------------------------------------------------------------------------
1415
* DefaultAudioMenu
1516
* -----------------------------------------------------------------------------------------------*/
1617

17-
function DefaultAudioMenu() {
18+
interface DefaultAudioMenuProps {
19+
slots?: Slots<DefaultLayoutMenuSlotName>;
20+
}
21+
22+
function DefaultAudioMenu({ slots }: DefaultAudioMenuProps) {
1823
const label = useDefaultLayoutWord('Audio'),
1924
$canSetAudioGain = useMediaState('canSetAudioGain'),
2025
$audioTracks = useMediaState('audioTracks'),
@@ -28,8 +33,10 @@ function DefaultAudioMenu() {
2833
<Menu.Root className="vds-audio-menu vds-menu">
2934
<DefaultMenuButton label={label} Icon={Icons.Menu.Audio} />
3035
<Menu.Content className="vds-menu-items">
36+
{slot(slots, 'audioMenuItemsStart', null)}
3137
<DefaultAudioTracksMenu />
3238
{hasGainSlider ? <DefaultAudioBoostMenuSection /> : null}
39+
{slot(slots, 'audioMenuItemsEnd', null)}
3340
</Menu.Content>
3441
</Menu.Root>
3542
);

packages/react/src/components/layouts/default/ui/menus/captions-menu.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@ import * as React from 'react';
33
import { useCaptionOptions } from '../../../../../hooks/options/use-caption-options';
44
import * as Menu from '../../../../ui/menu';
55
import { useDefaultLayoutContext, useDefaultLayoutWord } from '../../context';
6+
import { slot, type DefaultLayoutMenuSlotName, type Slots } from '../../slots';
67
import { DefaultMenuButton } from './items/menu-items';
78

89
/* -------------------------------------------------------------------------------------------------
910
* DefaultCaptionMenu
1011
* -----------------------------------------------------------------------------------------------*/
1112

12-
function DefaultCaptionMenu() {
13+
interface DefaultCaptionMenuProps {
14+
slots?: Slots<DefaultLayoutMenuSlotName>;
15+
}
16+
17+
function DefaultCaptionMenu({ slots }: DefaultCaptionMenuProps) {
1318
const { icons: Icons } = useDefaultLayoutContext(),
1419
label = useDefaultLayoutWord('Captions'),
1520
offText = useDefaultLayoutWord('Off'),
@@ -27,6 +32,8 @@ function DefaultCaptionMenu() {
2732
Icon={Icons.Menu.Captions}
2833
/>
2934
<Menu.Content className="vds-menu-items">
35+
{slot(slots, 'captionsMenuItemsStart', null)}
36+
3037
<Menu.RadioGroup
3138
className="vds-captions-radio-group vds-radio-group"
3239
value={options.selectedValue}
@@ -43,6 +50,8 @@ function DefaultCaptionMenu() {
4350
</Menu.Radio>
4451
))}
4552
</Menu.RadioGroup>
53+
54+
{slot(slots, 'captionsMenuItemsEnd', null)}
4655
</Menu.Content>
4756
</Menu.Root>
4857
);

packages/react/src/components/layouts/default/ui/menus/playback-menu.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import * as Menu from '../../../../ui/menu';
99
import * as QualitySlider from '../../../../ui/sliders/quality-slider';
1010
import * as SpeedSlider from '../../../../ui/sliders/speed-slider';
1111
import { useDefaultLayoutContext, useDefaultLayoutWord } from '../../context';
12+
import { slot, type DefaultLayoutMenuSlotName, type Slots } from '../../slots';
1213
import { DefaultMenuCheckbox } from './items/menu-checkbox';
1314
import { DefaultMenuButton, DefaultMenuItem, DefaultMenuSection } from './items/menu-items';
1415
import { DefaultMenuSliderItem, DefaultSliderParts, DefaultSliderSteps } from './items/menu-slider';
@@ -17,21 +18,29 @@ import { DefaultMenuSliderItem, DefaultSliderParts, DefaultSliderSteps } from '.
1718
* DefaultPlaybackMenu
1819
* -----------------------------------------------------------------------------------------------*/
1920

20-
function DefaultPlaybackMenu() {
21+
interface DefaultPlaybackMenuProps {
22+
slots?: Slots<DefaultLayoutMenuSlotName>;
23+
}
24+
25+
function DefaultPlaybackMenu({ slots }: DefaultPlaybackMenuProps) {
2126
const label = useDefaultLayoutWord('Playback'),
2227
{ icons: Icons } = useDefaultLayoutContext();
2328

2429
return (
2530
<Menu.Root className="vds-accessibility-menu vds-menu">
2631
<DefaultMenuButton label={label} Icon={Icons.Menu.Playback} />
2732
<Menu.Content className="vds-menu-items">
33+
{slot(slots, 'playbackMenuItemsStart', null)}
34+
2835
<DefaultMenuSection>
29-
<DefaultLoopMenuCheckbox />
36+
{slot(slots, 'playbackMenuLoop', <DefaultLoopMenuCheckbox />)}
3037
</DefaultMenuSection>
3138

3239
<DefaultSpeedMenuSection />
3340

3441
<DefaultQualityMenuSection />
42+
43+
{slot(slots, 'playbackMenuItemsEnd', null)}
3544
</Menu.Content>
3645
</Menu.Root>
3746
);

packages/react/src/components/layouts/default/ui/menus/settings-menu.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,14 @@ function DefaultSettingsMenu({
5959
>
6060
{isOpen ? (
6161
<>
62+
{slot(slots, 'settingsMenuItemsStart', null)}
6263
{slot(slots, 'settingsMenuStartItems', null)}
63-
<DefaultPlaybackMenu />
64-
<DefaultAccessibilityMenu />
65-
<DefaultAudioMenu />
66-
<DefaultCaptionMenu />
64+
<DefaultPlaybackMenu slots={slots} />
65+
<DefaultAccessibilityMenu slots={slots} />
66+
<DefaultAudioMenu slots={slots} />
67+
<DefaultCaptionMenu slots={slots} />
6768
{slot(slots, 'settingsMenuEndItems', null)}
69+
{slot(slots, 'settingsMenuItemsEnd', null)}
6870
</>
6971
) : null}
7072
</Menu.Content>

0 commit comments

Comments
 (0)