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:
@@ -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 */} + {/* 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 (
-
@@ -132,38 +136,10 @@ export const FeatureSingleTopic: React.FC = ({ ); } - // 3 buttons: primary + tertiary side by side, secondary button below - if (buttons.length === 3) { - return ( -
-
- - -
- -
- ); - } - - // 4-5 buttons: primary + tertiary side by side, remaining as tertiary stacked - const remainingButtons = buttons.slice(2); + // 3+ buttons: all tertiary buttons stacked return (
-
- - -
- {remainingButtons.map((button, index) => ( + {buttons.map((button, index) => (