diff --git a/.changeset/friendly-parrots-relax.md b/.changeset/friendly-parrots-relax.md
new file mode 100644
index 000000000..b7af3cb2d
--- /dev/null
+++ b/.changeset/friendly-parrots-relax.md
@@ -0,0 +1,6 @@
+---
+'@guardian/source': major
+---
+
+- Applies consistent spacing around checkboxes and radio buttons by removing conditional styles and using padding to ensure minimum height of 44px. The external padding is now consistent regardless of the presence of a label and / or supporting text, and removes any inconsistency when these elements are stacked vertically.
+- Checkboxes and radio buttons are now aligned with the first line of text when labels wrap on to multiple lines.
diff --git a/libs/@guardian/source/src/react-components/checkbox/Checkbox.stories.tsx b/libs/@guardian/source/src/react-components/checkbox/Checkbox.stories.tsx
index 9dd4aff26..bfe153a60 100644
--- a/libs/@guardian/source/src/react-components/checkbox/Checkbox.stories.tsx
+++ b/libs/@guardian/source/src/react-components/checkbox/Checkbox.stories.tsx
@@ -1,6 +1,6 @@
import type { Meta, StoryObj } from '@storybook/react';
import { useState } from 'react';
-import { palette } from '../../foundations';
+import { breakpoints, palette } from '../../foundations';
import { Checkbox } from './Checkbox';
import { themeCheckboxBrand } from './theme';
@@ -115,6 +115,21 @@ export const UnlabelledDefaultTheme: Story = {
},
};
+export const LongLabelMobileDefaultTheme: Story = {
+ ...Template,
+ args: {
+ ...DefaultDefaultTheme.args,
+ label:
+ 'Circulation / Visitors / Audience (for News media, Magazine and Exhibition requests)',
+ },
+ parameters: {
+ viewport: { defaultViewport: 'mobile' },
+ chromatic: {
+ viewports: [breakpoints.mobile],
+ },
+ },
+};
+
export const DefaultCustomTheme: Story = {
...Template,
args: {
diff --git a/libs/@guardian/source/src/react-components/checkbox/Checkbox.tsx b/libs/@guardian/source/src/react-components/checkbox/Checkbox.tsx
index 2741a7e43..bc36e39d9 100644
--- a/libs/@guardian/source/src/react-components/checkbox/Checkbox.tsx
+++ b/libs/@guardian/source/src/react-components/checkbox/Checkbox.tsx
@@ -6,15 +6,11 @@ import { mergeThemes } from '../utils/themes';
import {
checkbox,
checkboxContainer,
- checkboxContainerWithSupportingText,
errorCheckbox,
label,
labelText,
- labelTextWithSupportingText,
supportingText,
tick,
- tickWithLabelText,
- tickWithSupportingText,
} from './styles';
import { themeCheckbox as defaultTheme, transformProviderTheme } from './theme';
import type { ThemeCheckbox } from './theme';
@@ -132,19 +128,12 @@ export const Checkbox = ({
);
};
- const LabelText = ({
- hasSupportingText,
- children,
- }: {
- hasSupportingText?: boolean;
- children: ReactNode;
- }) => {
+ const LabelText = ({ children }: { children: ReactNode }) => {
return (
[
- labelText(mergedTheme(providerTheme.checkbox)),
- hasSupportingText ? labelTextWithSupportingText : '',
- ]}
+ css={(providerTheme: Theme) =>
+ labelText(mergedTheme(providerTheme.checkbox))
+ }
>
{children}
@@ -153,10 +142,9 @@ export const Checkbox = ({
return (
[
- checkboxContainer(mergedTheme(providerTheme.checkbox), error),
- supporting ? checkboxContainerWithSupportingText : '',
- ]}
+ css={(providerTheme: Theme) =>
+ checkboxContainer(mergedTheme(providerTheme.checkbox), error)
+ }
>
[
- tick(mergedTheme(providerTheme.checkbox)),
- (labelContent ?? supporting) ? tickWithLabelText : '',
- supporting ? tickWithSupportingText : '',
- ]}
+ css={(providerTheme: Theme) =>
+ tick(mergedTheme(providerTheme.checkbox))
+ }
/>