diff --git a/packages/components/src/menu-group/stories/index.tsx b/packages/components/src/menu-group/stories/index.tsx
new file mode 100644
index 00000000000000..13706422587431
--- /dev/null
+++ b/packages/components/src/menu-group/stories/index.tsx
@@ -0,0 +1,83 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import MenuGroup from '..';
+import MenuItem from '../../menu-item';
+import MenuItemsChoice from '../../menu-items-choice';
+
+/**
+ * External dependencies
+ */
+import type { ComponentMeta, ComponentStory } from '@storybook/react';
+
+const meta: ComponentMeta< typeof MenuGroup > = {
+ title: 'Components/MenuGroup',
+ component: MenuGroup,
+ argTypes: {
+ children: { control: { type: null } },
+ },
+ parameters: {
+ controls: { expanded: true },
+ docs: { source: { state: 'open' } },
+ },
+};
+export default meta;
+
+const Template: ComponentStory< typeof MenuGroup > = ( args ) => {
+ return (
+
+
+
+
+ );
+};
+
+export const Default: ComponentStory< typeof MenuGroup > = Template.bind( {} );
+
+const MultiGroupsTemplate: ComponentStory< typeof MenuGroup > = ( args ) => {
+ const [ mode, setMode ] = useState( 'visual' );
+ const choices = [
+ {
+ value: 'visual',
+ label: 'Visual editor',
+ },
+ {
+ value: 'text',
+ label: 'Code editor',
+ },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+
+ setMode( newMode ) }
+ onHover={ () => {} }
+ />
+
+ >
+ );
+};
+
+/**
+ * When other menu items exist above or below a MenuGroup, the group
+ * should have a divider line between it and the adjacent item.
+ */
+export const WithSeperator = MultiGroupsTemplate.bind( {} );
+WithSeperator.args = {
+ ...Default.args,
+ hideSeparator: false,
+ label: 'Editor',
+};