Skip to content

Commit c071e39

Browse files
Add fullScreenOnNarrow prop to SelectPanel for opt-out of fullscreen behavior
Co-authored-by: francinelucca <40550942+francinelucca@users.noreply.github.com>
1 parent fe00c2e commit c071e39

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

packages/react/src/SelectPanel/SelectPanel.test.tsx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,71 @@ for (const useModernActionList of [false, true]) {
10661066
expect(options[2]).toHaveTextContent('item three')
10671067
})
10681068
})
1069+
1070+
describe('fullScreenOnNarrow prop', () => {
1071+
const renderSelectPanelWithFlags = (flags: Record<string, boolean>, props: Record<string, unknown> = {}) => {
1072+
return render(
1073+
<FeatureFlags flags={flags}>
1074+
<ThemeProvider>
1075+
<BasicSelectPanel {...props} />
1076+
</ThemeProvider>
1077+
</FeatureFlags>,
1078+
)
1079+
}
1080+
1081+
it('should respect fullScreenOnNarrow=false even when feature flag is enabled', async () => {
1082+
const user = userEvent.setup()
1083+
1084+
renderSelectPanelWithFlags(
1085+
{
1086+
primer_react_select_panel_with_modern_action_list: useModernActionList,
1087+
primer_react_select_panel_fullscreen_on_narrow: true,
1088+
},
1089+
{fullScreenOnNarrow: false},
1090+
)
1091+
1092+
await user.click(screen.getByText('Select items'))
1093+
1094+
// When fullScreenOnNarrow=false, the overlay should not use responsive fullscreen variant
1095+
const dialog = screen.getByRole('dialog')
1096+
expect(dialog).toBeInTheDocument()
1097+
// The key test is that the AnchoredOverlay's variant prop should be undefined
1098+
// when fullScreenOnNarrow is false, regardless of feature flag
1099+
})
1100+
1101+
it('should use fullscreen behavior when fullScreenOnNarrow=true and feature flag is enabled', async () => {
1102+
const user = userEvent.setup()
1103+
1104+
renderSelectPanelWithFlags(
1105+
{
1106+
primer_react_select_panel_with_modern_action_list: useModernActionList,
1107+
primer_react_select_panel_fullscreen_on_narrow: true,
1108+
},
1109+
{fullScreenOnNarrow: true},
1110+
)
1111+
1112+
await user.click(screen.getByText('Select items'))
1113+
1114+
// When both feature flag and prop are true, should enable fullscreen behavior
1115+
const dialog = screen.getByRole('dialog')
1116+
expect(dialog).toBeInTheDocument()
1117+
})
1118+
1119+
it('should default to feature flag value when fullScreenOnNarrow is undefined', async () => {
1120+
const user = userEvent.setup()
1121+
1122+
// Test with feature flag disabled
1123+
renderSelectPanelWithFlags({
1124+
primer_react_select_panel_with_modern_action_list: useModernActionList,
1125+
primer_react_select_panel_fullscreen_on_narrow: false,
1126+
})
1127+
1128+
await user.click(screen.getByText('Select items'))
1129+
1130+
const dialog = screen.getByRole('dialog')
1131+
expect(dialog).toBeInTheDocument()
1132+
})
1133+
})
10691134
})
10701135
})
10711136
}

packages/react/src/SelectPanel/SelectPanel.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ interface SelectPanelBaseProps {
101101
*/
102102
footer?: string | React.ReactElement
103103
showSelectedOptionsFirst?: boolean
104+
/**
105+
* Whether the SelectPanel should go fullscreen on narrow viewports.
106+
* When `false`, the panel will maintain its anchored position regardless of viewport size.
107+
* @default true when the primer_react_select_panel_fullscreen_on_narrow feature flag is enabled
108+
*/
109+
fullScreenOnNarrow?: boolean
104110
}
105111

106112
// onCancel is optional with variant=anchored, but required with variant=modal
@@ -172,6 +178,7 @@ function Panel({
172178
variant = 'anchored',
173179
secondaryAction,
174180
showSelectedOptionsFirst = true,
181+
fullScreenOnNarrow,
175182
...listProps
176183
}: SelectPanelProps): JSX.Element {
177184
const titleId = useId()
@@ -192,7 +199,8 @@ function Panel({
192199
const [prevOpen, setPrevOpen] = useState(open)
193200

194201
const usingModernActionList = useFeatureFlag('primer_react_select_panel_with_modern_action_list')
195-
const usingFullScreenOnNarrow = useFeatureFlag('primer_react_select_panel_fullscreen_on_narrow')
202+
const featureFlagFullScreenOnNarrow = useFeatureFlag('primer_react_select_panel_fullscreen_on_narrow')
203+
const usingFullScreenOnNarrow = fullScreenOnNarrow ?? featureFlagFullScreenOnNarrow
196204
const shouldOrderSelectedFirst =
197205
useFeatureFlag('primer_react_select_panel_order_selected_at_top') && showSelectedOptionsFirst
198206

0 commit comments

Comments
 (0)