`.
+
+
+### States
+#### Default state
+Here's a `FormGroup` without an error or validation:
+
+
+#### `error`
+When including an error message, the `FormGroup` should have an `error` prop with a string that describes the error. The inner element wrapped by the `FormGroup` should also have an `error` prop with a boolean to either display or hide the error message. The `error` prop will add a red border to the form element and display the error message below the form element.
+
+
+
+#### `valid`
+Adding `valid` to a `FormGroup`'s inner element will add a green checkmark to the form element.
+
+
+### Including InfoTip
+A field can include
our existing `InfoTip`
+
+#### Low emphasis
+
+
+#### High emphasis
+
+
+## Playground
+
+
+
+
diff --git a/packages/styleguide/src/lib/Atoms/FormElements/FormGroup/FormGroup.stories.tsx b/packages/styleguide/src/lib/Atoms/FormElements/FormGroup/FormGroup.stories.tsx
new file mode 100644
index 0000000000..74860fab10
--- /dev/null
+++ b/packages/styleguide/src/lib/Atoms/FormElements/FormGroup/FormGroup.stories.tsx
@@ -0,0 +1,94 @@
+import { FormGroup , Input } from '@codecademy/gamut';
+import type { Meta, StoryObj } from '@storybook/react';
+
+const meta: Meta
= {
+ component: FormGroup,
+ args: {},
+};
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ label: "Don't you label me!",
+ description: 'This is a form group, it is pretty darn cool',
+ },
+};
+
+const FormGroupHtmlForExample = () => {
+ return (
+
+
+
+ )
+}
+
+export const FormGroupHtmlFor: Story = {
+ render: () =>
+}
+
+const FormGroupDivExample = () => {
+ return (
+
+
+
+ )
+}
+
+export const FormGroupDiv: Story = {
+ render: () =>
+}
+
+export const DefaultState: Story = {
+ args: {
+ label: 'I am required!!',
+ required: true,
+ description: "You can tell by the asterisk.",
+ htmlFor: "required1",
+ children:
+ },
+}
+
+export const Error: Story = {
+ args: {
+ required: true,
+ label: "I am also required!!",
+ description: "You can tell by the asterisk.",
+ error: "You messed up dude.",
+ htmlFor: "required-error",
+ children:
+ },
+};
+
+export const Valid: Story = {
+ args: {
+ required: true,
+ label: "I am also required!!",
+ htmlFor: "required-valid",
+ children:
+ },
+}
+
+export const LowEmphasisInfoTip: Story = {
+ args: {
+ label:"Low emphasis",
+ infotip:{
+ info:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
+ },
+ children:
+ }
+}
+
+export const HighEmphasisInfoTip: Story = {
+ args: {
+ label:"High emphasis",
+ infotip:{
+ emphasis: 'high',
+ info:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
+ },
+ children:
+ }
+}
diff --git a/packages/styleguide/src/lib/Atoms/FormElements/FormGroupDescription/FormGroupDescription.mdx b/packages/styleguide/src/lib/Atoms/FormElements/FormGroupDescription/FormGroupDescription.mdx
new file mode 100644
index 0000000000..e7453a28e5
--- /dev/null
+++ b/packages/styleguide/src/lib/Atoms/FormElements/FormGroupDescription/FormGroupDescription.mdx
@@ -0,0 +1,28 @@
+import { Canvas, Controls, Meta } from '@storybook/blocks';
+
+import { ComponentHeader } from '~styleguide/blocks';
+
+import * as FormGroupDescriptionStories from './FormGroupDescription.stories';
+
+export const parameters = {
+ subtitle: `A description wrapper to format a longer description of a group of inputs.`,
+ status: 'current',
+ source: {
+ repo: 'gamut',
+ githubLink:
+ 'https://github.com/Codecademy/gamut/blob/main/packages/gamut/src/Form/elements/FormGroupDescription.tsx',
+ },
+};
+
+
+
+
+
+## Usage
+
+To provide a description for a group of inputs.
+
+## Playground
+
+
+
diff --git a/packages/styleguide/src/lib/Atoms/FormElements/FormGroupDescription/FormGroupDescription.stories.tsx b/packages/styleguide/src/lib/Atoms/FormElements/FormGroupDescription/FormGroupDescription.stories.tsx
new file mode 100644
index 0000000000..a4faccc444
--- /dev/null
+++ b/packages/styleguide/src/lib/Atoms/FormElements/FormGroupDescription/FormGroupDescription.stories.tsx
@@ -0,0 +1,15 @@
+import { FormGroupDescription } from '@codecademy/gamut';
+import type { Meta, StoryObj } from '@storybook/react';
+
+const meta: Meta = {
+ component: FormGroupDescription,
+ args: {},
+};
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: { children: 'I am a description' },
+};
+
diff --git a/packages/styleguide/src/lib/Atoms/FormElements/FormGroupLabel/FormGroupLabel.mdx b/packages/styleguide/src/lib/Atoms/FormElements/FormGroupLabel/FormGroupLabel.mdx
new file mode 100644
index 0000000000..f001ff0f32
--- /dev/null
+++ b/packages/styleguide/src/lib/Atoms/FormElements/FormGroupLabel/FormGroupLabel.mdx
@@ -0,0 +1,60 @@
+import { Canvas, Controls, Meta } from '@storybook/blocks';
+
+import { ComponentHeader } from '~styleguide/blocks';
+
+import * as FormGroupLabelStories from './FormGroupLabel.stories';
+
+export const parameters = {
+ subtitle: `A label element to be tied to a group of elements.`,
+ design: {
+ type: 'figma',
+ url:
+ 'https://www.figma.com/file/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1189%3A0',
+ },
+ status: 'current',
+ source: {
+ repo: 'gamut',
+ githubLink:
+ 'https://github.com/Codecademy/gamut/blob/main/packages/gamut/src/Form/elements/FormGroupLabel.tsx',
+ },
+};
+
+
+
+
+
+## Usage
+
+Provide a label to a group of form elements.
+
+## Variants
+A `FormGroupLabel` can come in different variants:
+* default, which without any additional styling
+* `size='large'` to include a label with larger text
+* `disabled` to render the label in a disabled state
+
+### Default
+
+
+### Large size
+Setting the `size` prop to `'large'` will render the label with larger text.
+
+
+
+### Disabled
+
+
+## Including `htmlFor`
+
+It is best to provide `htmlFor` to both the FormGroup + inner form element to make it super accessible. If this is not provided, the FormLabel will default to ``. If an `htmlFor` is provided, it will be a `