@@ -252,11 +307,16 @@ export default function ButtonShowcase() {
{`import { Button } from 'shared/components/Button';
-// Basic usage
+// Basic usage (green theme - default)
Get Started
+// Black color theme
+
+ Dark Button
+
+
// Disabled state
Submit
@@ -305,49 +365,90 @@ export default function ButtonShowcase() {
-
State Colors
-
-
-
- State
- Text Color
- Background Color
- Border
-
-
-
-
- Enabled
- #141414 (Neutral Black)
- #21E46B (Green 300)
- None
-
-
- Hover
- #141414 (Neutral Black)
- #70EE97 (Green 200)
- None
-
-
- Focus
- #141414 (Neutral Black)
- #70EE97 (Green 200)
- 2px solid #141414
-
-
- Active
- #141414 (Neutral Black)
- #21E46B (Green 300)
- None
-
-
- Disabled
- #838386 (Gray 500)
- #E0E0E1 (Gray 200)
- None
-
-
-
+
State Colors - Green Theme
+
+ {/* Header */}
+
+
State
+
Text Color
+
Background Color
+
Border
+
+ {/* Rows */}
+
+
Enabled
+
#141414 (Neutral Black)
+
#21E46B (Green 300)
+
None
+
+
+
Hover
+
#141414 (Neutral Black)
+
#70EE97 (Green 200)
+
None
+
+
+
Focus
+
#141414 (Neutral Black)
+
#70EE97 (Green 200)
+
2px solid #141414
+
+
+
Active
+
#141414 (Neutral Black)
+
#21E46B (Green 300)
+
None
+
+
+
Disabled
+
#838386 (Gray 500)
+
#E0E0E1 (Gray 200)
+
None
+
+
+
+
+
State Colors - Black Theme
+
+ {/* Header */}
+
+
State
+
Text Color
+
Background Color
+
Border
+
+ {/* Rows */}
+
+
Enabled
+
#FFFFFF (White)
+
#141414 (Neutral Black)
+
None
+
+
+
Hover
+
#FFFFFF (White)
+
rgba(20, 20, 20, 0.8) (80% Black)
+
None
+
+
+
Focus
+
#FFFFFF (White)
+
rgba(20, 20, 20, 0.8) (80% Black)
+
2px solid #141414
+
+
+
Active
+
#FFFFFF (White)
+
#141414 (Neutral Black)
+
None
+
+
+
Disabled
+
#838386 (Gray 500)
+
#E0E0E1 (Gray 200)
+
None
+
+
diff --git a/about/button-showcase-secondary.page.tsx b/about/button-showcase-secondary.page.tsx
new file mode 100644
index 0000000000..ce3ffc02df
--- /dev/null
+++ b/about/button-showcase-secondary.page.tsx
@@ -0,0 +1,528 @@
+import * as React from 'react';
+import { Button } from 'shared/components/Button';
+import { PageGrid, PageGridCol, PageGridRow } from 'shared/components/PageGrid/page-grid';
+
+export const frontmatter = {
+ seo: {
+ title: 'BDS Secondary Button Component Showcase',
+ description: 'Interactive showcase of the Brand Design System Secondary Button component with all states and variants.',
+ },
+};
+
+export default function ButtonShowcaseSecondary() {
+ const [clickCount, setClickCount] = React.useState(0);
+
+ const handleClick = () => {
+ setClickCount((prev) => prev + 1);
+ };
+
+ return (
+
+
+
+
BDS Secondary Button
+ Brand Design System
+
+
+ The Secondary button is an outline-style button used for secondary actions. It features a transparent
+ background with a green stroke/border, providing visual hierarchy below the Primary button while maintaining
+ brand consistency.
+
+
+
+ {/* Basic Usage */}
+
+
+
Basic Usage
+ Secondary Variant
+
+
+
+ Learn More
+
+
+ View Details
+
+
+ Explore
+
+
+ {clickCount > 0 && (
+
+ Button clicked {clickCount} time{clickCount !== 1 ? 's' : ''}
+
+ )}
+
+
+ {/* Primary vs Secondary Comparison */}
+
+
+
Primary vs Secondary
+ Visual Hierarchy
+
+
+ Use Primary for main actions and Secondary for supporting actions to create clear visual hierarchy.
+
+
+
+ Get Started
+
+
+ Learn More
+
+
+
+
+ {/* States */}
+
+
+
Button States
+ Interactive States
+
+
+
+
+
+
Enabled State
+
Default outline style with green border and text.
+
+ Enabled Button
+
+
+
+
+
+
Disabled State
+
Gray border and text indicate non-interactive state.
+
+ Disabled Button
+
+
+
+
+
+
+
Hover & Focus States
+
+ Hover over the buttons or use Tab to focus them. Notice the light green background fill and darker green
+ border on hover/focus.
+
+
+
+ Hover Me
+
+
+ Focus Me (Tab)
+
+
+
+
+
+ {/* Black Color Variant */}
+
+
+
Black Color Variant
+ Color Theme
+
+
+ Secondary buttons can use a black color theme with black text and border instead of green.
+
+
+
+ Black Secondary
+
+
+ Learn More
+
+
+ View Details
+
+
+
+
+ {/* Black Variant States */}
+
+
+
Black Variant States
+ Interactive States
+
+
+
+
+
+
Enabled State
+
Black border and text with transparent background.
+
+ Enabled Button
+
+
+
+
+
+
Disabled State
+
Same disabled styling as green variant.
+
+ Disabled Button
+
+
+
+
+
+
+
Hover & Focus States
+
+ Hover over the buttons or use Tab to focus them. Notice the subtle black background fill on hover.
+
+
+
+ Hover Me
+
+
+ Focus Me (Tab)
+
+
+
+
+
+ {/* Green vs Black Comparison */}
+
+
+
Green vs Black Comparison
+ Color Themes
+
+ Compare the green (default) and black color themes side by side.
+
+
+ Green Secondary
+
+
+ Black Secondary
+
+
+
+
+ {/* Without Icon */}
+
+
+
Without Icon
+ Icon Control
+
+ Secondary buttons can also be rendered without the arrow icon.
+
+
+ No Icon Button
+
+
+ With Icon Button
+
+
+
+
+ {/* Button Types */}
+
+
+
Button Types
+ Form Integration
+
+ Secondary buttons can be used for form actions like cancel or reset.
+
+
+
+ {/* Responsive Behavior */}
+
+
+
Responsive Behavior
+ Breakpoint Adjustments
+
+
+ Button padding adjusts automatically across breakpoints. Resize your browser window to see the changes:
+
+
+
+ Desktop (≥1024px): Padding: 6px 17px 6px 18px (compensates for 2px border)
+
+
+ Tablet/Mobile (≤1023px): Padding: 6px 13px 6px 14px
+
+
+ Hover/Focus: Gap increases (22px desktop, 21px mobile) with adjusted padding
+
+
+
+
+ Responsive Button
+
+
+ Long Button Label Example
+
+
+
+
+ {/* Accessibility */}
+
+
+
Accessibility Features
+ WCAG Compliance
+
+
+
+
+ Keyboard Navigation
+
+ Tab to focus buttons
+ Enter or Space to activate
+ Focus indicator: 2px black outline (additional to green border)
+ Disabled buttons are not focusable
+
+
+
+ Screen Reader Support
+
+ Button labels are announced
+ Disabled state communicated via aria-disabled
+ Icons are hidden from screen readers (aria-hidden)
+ Semantic button element used
+
+
+
+
+
+
Color Contrast
+
+
+ Enabled: Green 400 (#0DAA3E) on White = 4.52:1 (AA for large text)
+
+
+ Hover: Green 500 (#078139) on Green 100 (#EAFCF1) = 4.87:1 (AA)
+
+
+ Disabled: Gray 400 (#A2A2A4) on White = reduced contrast (acceptable for disabled state)
+
+
+
+
+
+ {/* Code Examples */}
+
+
+
Code Examples
+ Implementation
+
+
+
+ {`import { Button } from 'shared/components/Button';
+
+// Basic secondary button (green theme - default)
+
+ Learn More
+
+
+// Black color theme
+
+ Learn More
+
+
+// Disabled state
+
+ Unavailable
+
+
+// Without icon
+
+ Cancel
+
+
+// Primary + Secondary pairing
+
+ Submit
+
+
+ Cancel
+ `}
+
+
+
+
+ {/* Design Specifications */}
+
+
+
Design Specifications
+ Visual Details
+
+
+
+
+ Typography
+
+ Font: Booton, sans-serif
+ Size: 16px
+ Weight: 400
+ Line Height: 23.2px
+ Letter Spacing: 0px
+
+
+
+ Spacing & Layout
+
+ Border Radius: 100px (fully rounded)
+ Border Width: 2px solid
+ Icon Size: 15px × 14px
+ Icon Gap: 16px (default), 22px (hover/focus desktop), 21px (hover/focus mobile)
+ Max Height: 40px
+
+
+
+
+
+
State Colors - Green Theme
+
+ {/* Header */}
+
+
State
+
Text Color
+
Background
+
Border
+
+ {/* Rows */}
+
+
Enabled
+
#0DAA3E (Green 400)
+
Transparent
+
2px #0DAA3E (Green 400)
+
+
+
Hover
+
#078139 (Green 500)
+
#EAFCF1 (Green 100)
+
2px #078139 (Green 500)
+
+
+
Focus
+
#078139 (Green 500)
+
#EAFCF1 (Green 100)
+
2px #078139 + 2px #141414 outline
+
+
+
Active
+
#0DAA3E (Green 400)
+
Transparent
+
2px #0DAA3E (Green 400)
+
+
+
Disabled
+
#A2A2A4 (Gray 400)
+
Transparent
+
2px #A2A2A4 (Gray 400)
+
+
+
+
+
State Colors - Black Theme
+
+ {/* Header */}
+
+
State
+
Text Color
+
Background
+
Border
+
+ {/* Rows */}
+
+
Enabled
+
#141414 (Neutral Black)
+
Transparent
+
2px #141414 (Neutral Black)
+
+
+
Hover
+
#141414 (Neutral Black)
+
rgba(20, 20, 20, 0.15) (15% Black)
+
2px #141414 (Neutral Black)
+
+
+
Focus
+
#141414 (Neutral Black)
+
rgba(20, 20, 20, 0.15) (15% Black)
+
2px #141414 + 2px #141414 outline
+
+
+
Active
+
#141414 (Neutral Black)
+
Transparent
+
2px #141414 (Neutral Black)
+
+
+
Disabled
+
#A2A2A4 (Gray 400)
+
Transparent
+
2px #A2A2A4 (Gray 400)
+
+
+
+
+
+ {/* Key Differences from Primary */}
+
+
+
Key Differences from Primary
+ Comparison
+
+
+ {/* Header */}
+
+
Aspect
+
Primary
+
Secondary
+
+ {/* Rows */}
+
+
Background (Enabled)
+
Green 300 (#21E46B)
+
Transparent
+
+
+
Background (Hover)
+
Green 200 (#70EE97)
+
Green 100 (#EAFCF1)
+
+
+
Border (Enabled)
+
None
+
2px Green 400
+
+
+
Text Color (Enabled)
+
Black (#141414)
+
Green 400 (#0DAA3E)
+
+
+
Disabled Background
+
Gray 200 (#E0E0E1)
+
Transparent
+
+
+
Arrow Icon
+
✅ Shared
+
✅ Shared
+
+
+
+
+ );
+}
diff --git a/resources/button-showcase.page.tsx b/resources/button-showcase.page.tsx
index e242eb2267..d6511ced78 100644
--- a/resources/button-showcase.page.tsx
+++ b/resources/button-showcase.page.tsx
@@ -1,6 +1,6 @@
import * as React from 'react';
import { Button } from 'shared/components/Button';
-import { PageGrid, PageGridCol, PageGridRow } from 'shared/components/page-grid';
+import { PageGrid, PageGridCol, PageGridRow } from 'shared/components/PageGrid/page-grid';
export const frontmatter = {
seo: {
diff --git a/secondary-button-logic.md b/secondary-button-logic.md
new file mode 100644
index 0000000000..564c3c2c3e
--- /dev/null
+++ b/secondary-button-logic.md
@@ -0,0 +1,494 @@
+# Secondary Button Logic
+
+> **Design Source:** [Figma - Button Component](https://www.figma.com/design/MZOPJQOw9oWC6NDxLRH4ws/Button?node-id=5226-8948&m=dev) (Second Column - Secondary)
+> **Target Component:** `shared/components/Button/Button.tsx` & `Button.scss`
+
+---
+
+## Overview
+
+The **Secondary Button** is an outline-style button used for secondary actions. It features a transparent background with a colored stroke/border, providing visual hierarchy below the Primary button while maintaining brand consistency.
+
+**Key Characteristics:**
+- Outline/ghost style (transparent background in default states)
+- Green stroke/border in enabled state
+- Filled background appears on hover/focus states
+- **Shares arrow icon & animation with Primary button** (no duplicate code)
+
+---
+
+## Shared Code Architecture
+
+The Secondary button **inherits** all arrow icon logic from the base `.bds-btn` class. This ensures:
+- ✅ No duplicate arrow animation code
+- ✅ Consistent hover behavior across variants
+- ✅ Single source of truth for icon styling
+
+### Already Shared in Base `.bds-btn` Class
+
+```scss
+// These styles are already in the base class and apply to ALL variants:
+
+.bds-btn {
+ // Icon element (SVG container) - SHARED
+ &__icon {
+ width: 15px;
+ height: 14px;
+ flex-shrink: 0;
+ transition: opacity $bds-btn-transition-duration $bds-btn-transition-timing;
+ color: currentColor; // Inherits text color from parent
+ overflow: visible;
+ }
+
+ // Arrow horizontal line - SHARED
+ &__icon-line {
+ transform-box: fill-box;
+ transform-origin: right center;
+ transform: scaleX(1);
+ transition: transform $bds-btn-transition-duration $bds-btn-transition-timing;
+ }
+
+ // Arrow chevron - SHARED
+ &__icon-chevron {
+ transition: transform $bds-btn-transition-duration $bds-btn-transition-timing;
+ }
+
+ // Hover/Focus animation - SHARED (applies to ALL variants)
+ &:hover:not(:disabled):not(.bds-btn--disabled),
+ &:focus-visible:not(:disabled):not(.bds-btn--disabled) {
+ .bds-btn__icon-line {
+ transform: scaleX(0); // Line shrinks from left-to-right
+ }
+ }
+}
+```
+
+### What Secondary Button Needs to Define
+
+The `.bds-btn--secondary` class only needs to define:
+1. **Colors** (text, background, border) - different from Primary
+2. **Padding & Gap** values per state - adjusted for border width
+3. **Border** styling (Primary has no border, Secondary has 2px border)
+
+The icon color automatically updates via `currentColor` inheritance from the text color
+
+---
+
+## Visual Specifications
+
+### Button Structure
+
+```
+┌─────────────────────────────────────────────┐
+│ [Label Text] [gap] [Icon] │
+└─────────────────────────────────────────────┘
+ ↑ ↑
+ .bds-btn__label .bds-btn__icon
+```
+
+- **Border Radius:** `100px` (pill shape)
+- **Border Width:** `2px` solid
+- **Max Height:** `40px`
+- **Typography:** Label R token (Booton, 16px, 400 weight, 23.2px line-height)
+
+---
+
+## State Specifications
+
+### 1. Enabled State (Default)
+
+| Property | Value | SCSS Variable |
+|----------|-------|---------------|
+| **Text Color** | Green 400 `#0DAA3E` | `$green-400` |
+| **Background** | Transparent | `transparent` |
+| **Border Color** | Green 400 `#0DAA3E` | `$green-400` |
+| **Border Width** | `2px` | - |
+
+> **Icon Color:** Inherits text color via `currentColor` (no separate definition needed)
+
+**Desktop Padding & Gap:**
+| Property | With Icon | Without Icon |
+|----------|-----------|--------------|
+| Padding | `8px 19px 8px 20px` | `8px 20px` |
+| Gap | `16px` | N/A |
+
+**Tablet/Mobile Padding & Gap (≤1023px):**
+| Property | With Icon | Without Icon |
+|----------|-----------|--------------|
+| Padding | `8px 15px 8px 16px` | `8px 16px` |
+| Gap | `16px` | N/A |
+
+---
+
+### 2. Hover State
+
+| Property | Value | SCSS Variable |
+|----------|-------|---------------|
+| **Text Color** | Green 500 `#078139` | `$green-500` |
+| **Background** | Green 100 `#EAFCF1` | `$green-100` |
+| **Border Color** | Green 500 `#078139` | `$green-500` |
+| **Border Width** | `2px` | - |
+
+> **Icon Color:** Inherits text color via `currentColor` (automatically becomes Green 500)
+
+**Desktop Padding & Gap:**
+| Property | With Icon | Without Icon |
+|----------|-----------|--------------|
+| Padding | `8px 13px 8px 20px` | `8px 20px` |
+| Gap | `22px` | N/A |
+
+**Tablet/Mobile Padding & Gap (≤1023px):**
+| Property | With Icon | Without Icon |
+|----------|-----------|--------------|
+| Padding | `8px 10px 8px 16px` | `8px 16px` |
+| Gap | `21px` | N/A |
+
+> **Arrow Animation:** Handled by base `.bds-btn` class - line shrinks from left-to-right (shared behavior)
+
+---
+
+### 3. Focus State (Keyboard Navigation)
+
+| Property | Value | SCSS Variable |
+|----------|-------|---------------|
+| **Text Color** | Green 500 `#078139` | `$green-500` |
+| **Background** | Green 100 `#EAFCF1` | `$green-100` |
+| **Border Color** | Green 500 `#078139` | `$green-500` |
+| **Border Width** | `2px` | - |
+| **Focus Ring** | Black `#141414`, 2px | `$bds-btn-primary-focus-border` |
+
+> **Icon Color:** Inherits text color via `currentColor` (automatically becomes Green 500)
+
+The focus state shows a **double border** effect:
+1. Inner border: Green 500 (the button's stroke)
+2. Outer border: Black (focus indicator ring)
+
+**Desktop Padding & Gap:**
+| Property | With Icon | Without Icon |
+|----------|-----------|--------------|
+| Padding | `6px 11px 6px 18px` | `6px 17px 6px 18px` |
+| Gap | `22px` | N/A |
+
+> **Note:** Padding is reduced by 2px on all sides to compensate for the additional focus ring border.
+
+**Tablet/Mobile Padding & Gap (≤1023px):**
+| Property | With Icon | Without Icon |
+|----------|-----------|--------------|
+| Padding | `6px 8px 6px 14px` | `6px 13px 6px 14px` |
+| Gap | `21px` | N/A |
+
+---
+
+### 4. Active State (Being Pressed)
+
+| Property | Value | SCSS Variable |
+|----------|-------|---------------|
+| **Text Color** | Green 400 `#0DAA3E` | `$green-400` |
+| **Background** | Transparent | `transparent` |
+| **Border Color** | Green 400 `#0DAA3E` | `$green-400` |
+| **Border Width** | `2px` | - |
+| **Transform** | `scale(0.98)` | - |
+
+> **Icon Color:** Inherits text color via `currentColor` (returns to Green 400)
+
+**Padding & Gap:** Returns to enabled state values
+- Desktop: `8px 19px 8px 20px`, gap `16px`
+- Tablet/Mobile: `8px 15px 8px 16px`, gap `16px`
+
+---
+
+### 5. Disabled State
+
+| Property | Value | SCSS Variable |
+|----------|-------|---------------|
+| **Text Color** | Neutral 400 `#8A919A` | `$gray-400` ¹ |
+| **Background** | Transparent | `transparent` |
+| **Border Color** | Neutral 400 `#8A919A` | `$gray-400` ¹ |
+| **Border Width** | `2px` | - |
+| **Cursor** | `not-allowed` | - |
+| **Pointer Events** | `none` | - |
+| **Icon** | Hidden (removed) | - |
+
+> ¹ **Note:** The Figma design uses `#8A919A` for Neutral 400. The existing `_colors.scss` has `$gray-400: #A2A2A4`. Either use the existing variable for consistency or add a new token. Recommend using existing `$gray-400` for codebase consistency.
+
+**Padding & Gap:** Same as enabled state
+- Desktop: `8px 19px 8px 20px`, gap `16px`
+- Tablet/Mobile: `8px 15px 8px 16px`, gap `16px`
+
+---
+
+## Color Token Mapping
+
+### Required Colors from `_colors.scss`
+
+```scss
+// Already available in styles/_colors.scss
+$green-100: #EAFCF1; // Hover/Focus background
+$green-400: #0DAA3E; // Enabled state (text, border, icon)
+$green-500: #078139; // Hover/Focus state (text, border, icon)
+$gray-400: #A2A2A4; // Disabled state (text, border) - closest match
+```
+
+### Recommended SCSS Variables for Secondary Button
+
+```scss
+// Colors - Secondary Button
+$bds-btn-secondary-text: $green-400; // #0DAA3E - Enabled
+$bds-btn-secondary-text-hover: $green-500; // #078139 - Hover/Focus
+$bds-btn-secondary-border: $green-400; // #0DAA3E - Enabled
+$bds-btn-secondary-border-hover: $green-500; // #078139 - Hover/Focus
+$bds-btn-secondary-bg-hover: $green-100; // #EAFCF1 - Hover/Focus fill
+$bds-btn-secondary-disabled-text: $gray-400; // Disabled text & border
+$bds-btn-secondary-disabled-border: $gray-400; // Disabled border
+```
+
+---
+
+## Implementation Structure
+
+### CSS Class Names (BEM)
+
+```
+// SHARED (already exist in base .bds-btn - DO NOT DUPLICATE)
+.bds-btn // Base button layout, typography, transitions
+.bds-btn__label // Label element
+.bds-btn__icon // Icon container (uses currentColor)
+.bds-btn__icon-line // Arrow line + hover animation
+.bds-btn__icon-chevron // Arrow chevron
+.bds-btn--disabled // Disabled state modifier
+.bds-btn--no-icon // No icon modifier
+
+// VARIANT-SPECIFIC (add for secondary)
+.bds-btn--secondary // Colors, borders, padding/gap values only
+```
+
+### Component Props
+
+The existing `ButtonProps` interface supports the secondary variant:
+
+```tsx
+interface ButtonProps {
+ variant?: 'primary' | 'secondary'; // Add 'secondary' to union type
+ children: React.ReactNode;
+ onClick?: () => void;
+ disabled?: boolean;
+ type?: 'button' | 'submit' | 'reset';
+ className?: string;
+ showIcon?: boolean;
+}
+```
+
+---
+
+## SCSS Implementation Guide
+
+> ⚠️ **Important:** Do NOT add any icon/arrow styles to `.bds-btn--secondary`. The icon inherits its color via `currentColor` and the hover animation is already handled in the base `.bds-btn` class.
+
+### Design Tokens to Add
+
+```scss
+// =============================================================================
+// Design Tokens - Secondary Button
+// =============================================================================
+
+// Colors - Secondary Button
+$bds-btn-secondary-text: $green-400; // #0DAA3E
+$bds-btn-secondary-text-hover: $green-500; // #078139
+$bds-btn-secondary-bg: transparent;
+$bds-btn-secondary-bg-hover: $green-100; // #EAFCF1
+$bds-btn-secondary-border: $green-400; // #0DAA3E
+$bds-btn-secondary-border-hover: $green-500; // #078139
+$bds-btn-secondary-disabled-text: $gray-400; // Disabled state
+$bds-btn-secondary-disabled-border: $gray-400; // Disabled border
+```
+
+### State Styles Structure
+
+```scss
+// =============================================================================
+// Secondary Variant
+// =============================================================================
+// NOTE: Arrow icon animation is inherited from base .bds-btn class.
+// The icon color automatically follows text color via currentColor.
+// Only define: colors, backgrounds, borders, padding, and gap.
+
+.bds-btn--secondary {
+ // Default/Enabled state
+ color: $bds-btn-secondary-text;
+ background-color: $bds-btn-secondary-bg;
+ border: 2px solid $bds-btn-secondary-border;
+
+ // Desktop padding and gap (≥1024px)
+ padding: 6px 17px 6px 18px; // Compensate for 2px border
+ gap: 16px;
+
+ // No icon - symmetric padding
+ &.bds-btn--no-icon {
+ padding: 6px 18px;
+ }
+
+ // ---------------------------------------------------------------------------
+ // Hover State
+ // ---------------------------------------------------------------------------
+ &:hover:not(:disabled):not(.bds-btn--disabled):not(.bds-btn--no-icon) {
+ color: $bds-btn-secondary-text-hover;
+ background-color: $bds-btn-secondary-bg-hover;
+ border-color: $bds-btn-secondary-border-hover;
+ padding: 6px 11px 6px 18px;
+ gap: 22px;
+ }
+
+ &:hover:not(:disabled):not(.bds-btn--disabled).bds-btn--no-icon {
+ color: $bds-btn-secondary-text-hover;
+ background-color: $bds-btn-secondary-bg-hover;
+ border-color: $bds-btn-secondary-border-hover;
+ }
+
+ // ---------------------------------------------------------------------------
+ // Focus State (keyboard navigation)
+ // ---------------------------------------------------------------------------
+ &:focus-visible:not(:disabled):not(.bds-btn--disabled):not(.bds-btn--no-icon) {
+ color: $bds-btn-secondary-text-hover;
+ background-color: $bds-btn-secondary-bg-hover;
+ border-color: $bds-btn-secondary-border-hover;
+ outline: $bds-btn-focus-border-width solid $bds-btn-primary-focus-border;
+ outline-offset: 0;
+ padding: 6px 11px 6px 18px;
+ gap: 22px;
+ }
+
+ &:focus-visible:not(:disabled):not(.bds-btn--disabled).bds-btn--no-icon {
+ color: $bds-btn-secondary-text-hover;
+ background-color: $bds-btn-secondary-bg-hover;
+ border-color: $bds-btn-secondary-border-hover;
+ outline: $bds-btn-focus-border-width solid $bds-btn-primary-focus-border;
+ outline-offset: 0;
+ padding: 6px 17px 6px 18px;
+ }
+
+ // ---------------------------------------------------------------------------
+ // Active State (being pressed)
+ // ---------------------------------------------------------------------------
+ &:active:not(:disabled):not(.bds-btn--disabled) {
+ color: $bds-btn-secondary-text;
+ background-color: $bds-btn-secondary-bg;
+ border-color: $bds-btn-secondary-border;
+ transform: scale(0.98);
+ padding: 6px 17px 6px 18px;
+ gap: 16px;
+ }
+
+ // ---------------------------------------------------------------------------
+ // Disabled State
+ // Note: Icon is hidden via component logic when disabled
+ // ---------------------------------------------------------------------------
+ &:disabled,
+ &.bds-btn--disabled {
+ color: $bds-btn-secondary-disabled-text;
+ background-color: transparent;
+ border-color: $bds-btn-secondary-disabled-border;
+ cursor: not-allowed;
+ pointer-events: none;
+ }
+
+ // ---------------------------------------------------------------------------
+ // Tablet & Mobile Responsive Styles (≤1023px)
+ // ---------------------------------------------------------------------------
+ @media (max-width: 1023px) {
+ padding: 6px 13px 6px 14px;
+ gap: 16px;
+
+ &.bds-btn--no-icon {
+ padding: 6px 14px;
+ }
+
+ &:hover:not(:disabled):not(.bds-btn--disabled):not(.bds-btn--no-icon) {
+ padding: 6px 8px 6px 14px;
+ gap: 21px;
+ }
+
+ &:hover:not(:disabled):not(.bds-btn--disabled).bds-btn--no-icon {
+ // Background and border color changes applied, padding stable
+ }
+
+ &:focus-visible:not(:disabled):not(.bds-btn--disabled):not(.bds-btn--no-icon) {
+ padding: 6px 8px 6px 14px;
+ gap: 21px;
+ }
+
+ &:focus-visible:not(:disabled):not(.bds-btn--disabled).bds-btn--no-icon {
+ padding: 6px 13px 6px 14px;
+ }
+
+ &:active:not(:disabled):not(.bds-btn--disabled) {
+ padding: 6px 13px 6px 14px;
+ gap: 16px;
+ }
+ }
+}
+```
+
+---
+
+## Key Differences from Primary Button
+
+| Aspect | Primary | Secondary |
+|--------|---------|-----------|
+| **Background (Enabled)** | Green 300 `#21E46B` | Transparent |
+| **Background (Hover/Focus)** | Green 200 `#70EE97` | Green 100 `#EAFCF1` |
+| **Border (Enabled)** | None | 2px Green 400 `#0DAA3E` |
+| **Border (Hover/Focus)** | None (only focus ring) | 2px Green 500 `#078139` |
+| **Text Color (Enabled)** | Neutral Black `#141414` | Green 400 `#0DAA3E` |
+| **Text Color (Hover/Focus)** | Neutral Black `#141414` | Green 500 `#078139` |
+| **Disabled Background** | Gray 200 `#E0E0E1` | Transparent |
+| **Disabled Border** | None | 2px Gray 400 |
+| **Focus Ring** | 2px Black border | 2px Black outline (additional) |
+| **Arrow Icon** | ✅ Shared (base class) | ✅ Shared (base class) |
+| **Arrow Animation** | ✅ Shared (base class) | ✅ Shared (base class) |
+
+---
+
+## Accessibility Notes
+
+1. **Color Contrast:** Green 400/500 on white background meets WCAG AA requirements
+2. **Focus Indicator:** Black outline provides clear keyboard navigation visibility
+3. **Disabled State:** Reduced opacity icon + muted colors clearly indicate non-interactive state
+4. **Icon:** `aria-hidden="true"` on arrow icon (decorative)
+5. **Button:** `aria-disabled` attribute mirrors disabled prop
+
+---
+
+## Usage Example
+
+```tsx
+// Secondary button with icon (default)
+