diff --git a/about/feature-single-topic-showcase.page.tsx b/about/feature-single-topic-showcase.page.tsx
index 7f93383526..32df06a786 100644
--- a/about/feature-single-topic-showcase.page.tsx
+++ b/about/feature-single-topic-showcase.page.tsx
@@ -110,8 +110,9 @@ export default function FeatureSingleTopicShowcase() {
📱 Responsive Behavior:
- orientation="left": Image left, content right on desktop; image above content on mobile
- orientation="right": Image right, content left on desktop; content above image on mobile
+ orientation="left": Image left, content right on desktop
+ orientation="right": Image right, content left on desktop
+ Mobile/Tablet: Content always appears above image regardless of orientation
@@ -127,7 +128,7 @@ export default function FeatureSingleTopicShowcase() {
Orientation Left (Default) - orientation="left"
- Desktop: Image left, content right | Mobile: Image above content
+ Desktop: Image left, content right | Mobile/Tablet: Content above image
@@ -155,7 +156,7 @@ export default function FeatureSingleTopicShowcase() {
Orientation Right - orientation="right"
- Desktop: Image right, content left | Mobile: Content above image
+ Desktop: Image right, content left | Mobile/Tablet: Content above image
@@ -180,24 +181,24 @@ export default function FeatureSingleTopicShowcase() {
Button Behavior
- The component uses the ButtonGroup pattern which automatically adjusts button rendering based on the number of links provided:
+ The component automatically adjusts button rendering based on the number of links provided:
- 1 link: Primary button
- 2 links: Primary + Tertiary buttons (responsive layout)
- 3+ links: All Tertiary buttons in block layout
+ 1 link: Primary or Secondary button (configurable via singleButtonVariant prop)
+ 2 links: Primary + Tertiary buttons side by side
+ 3+ links: All Tertiary buttons stacked
- {/* 1 Link */}
+ {/* 1 Link - Primary */}
- 1 Link - Primary Button
+ ex: 1 button - Primary Button (default)
Single action rendered as a primary (filled) button.
@@ -207,11 +208,37 @@ export default function FeatureSingleTopicShowcase() {
+
+
+ {/* 1 Link - Secondary */}
+
+
+
+
+
+ ex: 1 button - Secondary Button
+
+ Single action rendered as a secondary (outlined) button using singleButtonVariant="secondary".
+
+
+
+
+
@@ -222,9 +249,9 @@ export default function FeatureSingleTopicShowcase() {
- 2 Links - Primary + Tertiary Side by Side
+ ex: 2 button - Primary + Tertiary Side by Side
- Primary and tertiary buttons displayed side by side on desktop.
+ Primary and tertiary buttons displayed side by side on all breakpoints.
@@ -232,8 +259,8 @@ export default function FeatureSingleTopicShowcase() {
- {/* 3 Links */}
-
-
-
-
-
- 3 Links - Primary + Tertiary + Secondary
-
- Primary + tertiary side by side on first row, secondary button below.
-
-
-
-
-
-
-
{/* 5 Links */}
- 5 Links - Primary + Tertiary + Stacked Tertiary
+ ex: 5 button - All Tertiary Stacked
- Primary + tertiary side by side on first row, remaining tertiary buttons stacked below.
+ 3+ links render as all tertiary buttons stacked vertically.
@@ -285,12 +285,12 @@ export default function FeatureSingleTopicShowcase() {
+ {/* 3 Links */}
+
+
+
+
+
+ ex: 3 button - All Tertiary Stacked
+
+ 3+ links render as all tertiary buttons stacked vertically.
+
+
+
+
+
+
+
{/* Alternating Pattern Example */}
diff --git a/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.scss b/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.scss
index ee4bf5218d..88fba9cc1a 100644
--- a/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.scss
+++ b/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.scss
@@ -1,4 +1,3 @@
-// FeatureSingleTopic Pattern Styles
// =============================================================================
// A feature section pattern with single topic layout for title and media.
// Supports variants (default, accentSurface) and orientation (left, right).
@@ -29,11 +28,13 @@ $bds-single-topic-desktop-height: 565px; // Fixed height from Figma design
$bds-single-topic-tablet-py: 32px;
$bds-single-topic-tablet-content-gap: 32px; // Gap between image and content on tablet
$bds-single-topic-tablet-content-min-height: 320px; // Min height for content on tablet
+$bds-single-topic-tablet-title-description-gap: 80px; // Gap between accent/title and description on tablet
// Spacing - Mobile (<576px)
$bds-single-topic-mobile-py: 24px;
$bds-single-topic-mobile-content-gap: 24px; // Gap between image and content on mobile
$bds-single-topic-mobile-content-min-height: 280px; // Min height for content on mobile
+$bds-single-topic-mobile-title-description-gap: 40px; // Gap between accent/title and description on mobile
// =============================================================================
// Base Styles
@@ -127,13 +128,14 @@ $bds-single-topic-mobile-content-min-height: 280px; // Min height for content on
display: flex;
flex-direction: column;
height: 100%;
- gap: $bds-single-topic-mobile-content-gap;
+ // Gap between accent/title section and description section
+ gap: $bds-single-topic-mobile-title-description-gap; // 40px on mobile
// Min height on mobile to prevent squished content
min-height: $bds-single-topic-mobile-content-min-height;
justify-content: space-between;
@include media-breakpoint-up(md) {
- gap: $bds-single-topic-tablet-content-gap;
+ gap: $bds-single-topic-tablet-title-description-gap; // 80px on tablet
min-height: $bds-single-topic-tablet-content-min-height;
}
@@ -183,17 +185,15 @@ $bds-single-topic-mobile-content-min-height: 280px; // Min height for content on
gap: $bds-single-topic-desktop-cta-gap;
}
- // CTA row - primary + tertiary side by side
+ // CTA row - primary + tertiary side by side on all breakpoints
&__cta-row {
display: flex;
- flex-direction: column;
- align-items: flex-start;
- gap: 8px;
+ flex-direction: row;
+ align-items: center;
+ gap: 16px; // Gap between primary and tertiary on mobile
@include media-breakpoint-up(md) {
- flex-direction: row;
- align-items: center;
- gap: 24px; // 24px gap between primary and tertiary per Figma
+ gap: 24px; // 24px gap between primary and tertiary on tablet/desktop per Figma
}
}
}
@@ -215,9 +215,17 @@ $bds-single-topic-mobile-content-min-height: 280px; // Min height for content on
.bds-feature-single-topic__title-section {
background-color: $bds-single-topic-title-bg;
padding: $bds-single-topic-desktop-title-padding;
+ // Mobile min-height
+ min-height: 160px;
+
+ @include media-breakpoint-up(md) {
+ // Tablet min-height
+ min-height: 200px;
+ }
@include media-breakpoint-up(lg) {
- height: 200px;
+ // Desktop min-height
+ min-height: 200px;
}
}
}
@@ -249,8 +257,14 @@ $bds-single-topic-mobile-content-min-height: 280px; // Min height for content on
}
// Right orientation - image on right, content on left on desktop
-// On mobile/tablet: image appears ABOVE content (default column order)
+// On mobile/tablet: content appears ABOVE image (column-reverse) - same as left
.bds-feature-single-topic--right {
+ .bds-feature-single-topic__row {
+ @include media-breakpoint-down(lg) {
+ flex-direction: column-reverse;
+ }
+ }
+
.bds-feature-single-topic__media-col {
@include media-breakpoint-up(lg) {
order: 2;
diff --git a/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.tsx b/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.tsx
index 49be880e2c..e7101bc9d6 100644
--- a/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.tsx
+++ b/shared/patterns/FeatureSingleTopic/FeatureSingleTopic.tsx
@@ -27,12 +27,16 @@ export interface FeatureSingleTopicProps {
/** Feature description text (label-l typography) */
description?: string;
/** Array of links (1-5 links supported)
- * - 1 link: renders as primary button
+ * - 1 link: renders as primary or secondary button (based on singleButtonVariant)
* - 2 links: renders as primary + tertiary buttons side by side
- * - 3 links: primary + tertiary side by side, secondary button below
- * - 4-5 links: primary + tertiary side by side, remaining as tertiary stacked
+ * - 3+ links: all tertiary buttons stacked
*/
links?: FeatureSingleTopicLink[];
+ /** Button variant for single button configuration
+ * - 'primary': Primary button (default)
+ * - 'secondary': Secondary button
+ */
+ singleButtonVariant?: 'primary' | 'secondary';
/** Feature media (image) configuration */
media: {
src: string;
@@ -59,6 +63,7 @@ export const FeatureSingleTopic: React.FC = ({
title,
description,
links = [],
+ singleButtonVariant = 'primary',
media,
className,
}) => {
@@ -97,19 +102,18 @@ export const FeatureSingleTopic: React.FC = ({
);
// Render CTA buttons based on count
- // - 1 link: primary button
+ // - 1 link: primary or secondary button (based on singleButtonVariant prop)
// - 2 links: primary + tertiary side by side
- // - 3 links: primary + tertiary side by side, secondary button below
- // - 4-5 links: primary + tertiary side by side, remaining as tertiary stacked
+ // - 3+ links: all tertiary buttons stacked
const renderCTA = () => {
const buttons = buttonValidation.buttons;
if (!buttonValidation.isValid || buttons.length === 0) return null;
- // 1 button: just primary
+ // 1 button: primary or secondary based on singleButtonVariant prop
if (buttons.length === 1) {
return (
-
+
{buttons[0].label}
@@ -132,38 +136,10 @@ export const FeatureSingleTopic: React.FC = ({
);
}
- // 3 buttons: primary + tertiary side by side, secondary button below
- if (buttons.length === 3) {
- return (
-
-
-
- {buttons[0].label}
-
-
- {buttons[1].label}
-
-
-
- {buttons[2].label}
-
-
- );
- }
-
- // 4-5 buttons: primary + tertiary side by side, remaining as tertiary stacked
- const remainingButtons = buttons.slice(2);
+ // 3+ buttons: all tertiary buttons stacked
return (
-
-
- {buttons[0].label}
-
-
- {buttons[1].label}
-
-
- {remainingButtons.map((button, index) => (
+ {buttons.map((button, index) => (
path {
fill: black;
}
-html.light a:not(.bds-link):not(.bds-card-offgrid),
-html.light nav a:not(.bds-link):not(.bds-card-offgrid),
-html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid) {
+html.light a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn),
+html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn),
+html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn) {
color: #141414;
}
-html.light a:not(.bds-link):not(.bds-card-offgrid).btn-primary,
-html.light nav a:not(.bds-link):not(.bds-card-offgrid).btn-primary,
-html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid).btn-primary {
+html.light a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).btn-primary,
+html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).btn-primary,
+html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).btn-primary {
color: #FFFFFF;
}
-html.light a:not(.bds-link):not(.bds-card-offgrid).btn-primary:hover,
-html.light nav a:not(.bds-link):not(.bds-card-offgrid).btn-primary:hover,
-html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid).btn-primary:hover {
+html.light a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).btn-primary:hover,
+html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).btn-primary:hover,
+html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).btn-primary:hover {
color: #FFFFFF;
}
-html.light a:not(.bds-link):not(.bds-card-offgrid):hover, html.light a:not(.bds-link):not(.bds-card-offgrid):active, html.light a:not(.bds-link):not(.bds-card-offgrid).active,
-html.light nav a:not(.bds-link):not(.bds-card-offgrid):hover,
-html.light nav a:not(.bds-link):not(.bds-card-offgrid):active,
-html.light nav a:not(.bds-link):not(.bds-card-offgrid).active,
-html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):hover,
-html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):active,
-html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid).active {
+html.light a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):hover, html.light a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):active, html.light a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).active,
+html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):hover,
+html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):active,
+html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).active,
+html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):hover,
+html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):active,
+html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn).active {
color: #5429A1;
}
-html.light a:not(.bds-link):not(.bds-card-offgrid):not(.btn):not(.bds-text-card):focus,
-html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.btn):not(.bds-text-card):focus,
-html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.btn):not(.bds-text-card):focus {
+html.light a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):not(.btn):not(.bds-text-card):focus,
+html.light nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):not(.btn):not(.bds-text-card):focus,
+html.light a:not([role=button]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn):not(.btn):not(.bds-text-card):focus {
background-color: transparent;
}
html.light a.card:hover, html.light:active, html.light.active {
diff --git a/styles/light/_light-theme.scss b/styles/light/_light-theme.scss
index 600df059b5..ff3890f6f8 100644
--- a/styles/light/_light-theme.scss
+++ b/styles/light/_light-theme.scss
@@ -123,9 +123,9 @@ h6,
// Navigation ------------------------------------------------------------------
-a:not(.bds-link):not(.bds-card-offgrid),
-nav a:not(.bds-link):not(.bds-card-offgrid),
-a:not([role="button"]):not(.bds-link):not(.bds-card-offgrid) {
+a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn),
+nav a:not(.bds-link):not(.bds-card-offgrid):not(.bds-btn),
+a:not([role="button"]):not(.bds-link):not(.bds-card-offgrid):not(.bds-btn) {
color: $light-fg;
&.btn-primary {