@shohojdhara/atomix 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -28
- package/dist/atomix.css +1810 -314
- package/dist/atomix.min.css +5 -5
- package/dist/index.d.ts +359 -3
- package/dist/index.esm.js +831 -124
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +834 -123
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/themes/boomdevs.css +1808 -372
- package/dist/themes/boomdevs.min.css +60 -8
- package/dist/themes/esrar.css +1810 -314
- package/dist/themes/esrar.min.css +6 -6
- package/dist/themes/mashroom.css +1807 -308
- package/dist/themes/mashroom.min.css +8 -8
- package/dist/themes/shaj-default.css +1772 -273
- package/dist/themes/shaj-default.min.css +6 -6
- package/dist/themes/yabai.css +1804 -308
- package/dist/themes/yabai.min.css +8 -8
- package/package.json +1 -1
- package/src/components/Footer/Footer.stories.tsx +388 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/FooterLink.tsx +72 -0
- package/src/components/Footer/FooterSection.tsx +87 -0
- package/src/components/Footer/FooterSocialLink.tsx +117 -0
- package/src/components/Footer/README.md +261 -0
- package/src/components/Footer/index.ts +13 -0
- package/src/components/SectionIntro/SectionIntro.tsx +9 -11
- package/src/components/Slider/Slider.stories.tsx +634 -50
- package/src/components/Slider/Slider.tsx +5 -3
- package/src/components/index.ts +13 -0
- package/src/layouts/Grid/Grid.stories.tsx +226 -159
- package/src/lib/composables/useFooter.ts +85 -0
- package/src/lib/composables/useSlider.ts +191 -4
- package/src/lib/constants/components.ts +85 -0
- package/src/lib/types/components.ts +270 -0
- package/src/styles/01-settings/_index.scss +1 -0
- package/src/styles/01-settings/_settings.accordion.scss +20 -19
- package/src/styles/01-settings/_settings.animations.scss +5 -5
- package/src/styles/01-settings/_settings.avatar-group.scss +1 -1
- package/src/styles/01-settings/_settings.avatar.scss +17 -18
- package/src/styles/01-settings/_settings.background.scss +9 -0
- package/src/styles/01-settings/_settings.badge.scss +1 -1
- package/src/styles/01-settings/_settings.breadcrumb.scss +8 -2
- package/src/styles/01-settings/_settings.card.scss +2 -2
- package/src/styles/01-settings/_settings.chart.scss +7 -7
- package/src/styles/01-settings/_settings.checkbox-group.scss +5 -2
- package/src/styles/01-settings/_settings.checkbox.scss +10 -4
- package/src/styles/01-settings/_settings.countdown.scss +6 -4
- package/src/styles/01-settings/_settings.dropdown.scss +9 -7
- package/src/styles/01-settings/_settings.edge-panel.scss +3 -2
- package/src/styles/01-settings/_settings.footer.scss +125 -0
- package/src/styles/01-settings/_settings.form-group.scss +3 -1
- package/src/styles/01-settings/_settings.form.scss +4 -2
- package/src/styles/01-settings/_settings.hero.scss +9 -7
- package/src/styles/01-settings/_settings.input.scss +9 -7
- package/src/styles/01-settings/_settings.list-group.scss +4 -2
- package/src/styles/01-settings/_settings.list.scss +4 -2
- package/src/styles/01-settings/_settings.menu.scss +10 -8
- package/src/styles/01-settings/_settings.messages.scss +19 -17
- package/src/styles/01-settings/_settings.modal.scss +6 -4
- package/src/styles/01-settings/_settings.nav.scss +6 -4
- package/src/styles/01-settings/_settings.navbar.scss +8 -5
- package/src/styles/01-settings/_settings.pagination.scss +5 -3
- package/src/styles/01-settings/_settings.popover.scss +6 -4
- package/src/styles/01-settings/_settings.rating.scss +5 -3
- package/src/styles/01-settings/_settings.river.scss +8 -6
- package/src/styles/01-settings/_settings.sectionintro.scss +8 -6
- package/src/styles/01-settings/_settings.select.scss +7 -5
- package/src/styles/01-settings/_settings.side-menu.scss +15 -13
- package/src/styles/01-settings/_settings.spacing.scss +4 -0
- package/src/styles/01-settings/_settings.steps.scss +7 -5
- package/src/styles/01-settings/_settings.tabs.scss +7 -5
- package/src/styles/01-settings/_settings.testimonials.scss +6 -4
- package/src/styles/01-settings/_settings.toggle.scss +3 -1
- package/src/styles/01-settings/_settings.tooltip.scss +5 -3
- package/src/styles/01-settings/_settings.upload.scss +22 -20
- package/src/styles/02-tools/_tools.background.scss +85 -0
- package/src/styles/02-tools/_tools.rem.scss +18 -5
- package/src/styles/02-tools/_tools.utility-api.scss +32 -26
- package/src/styles/03-generic/_generic.root.scss +14 -2
- package/src/styles/04-elements/_elements.body.scss +24 -0
- package/src/styles/06-components/_components.accordion.scss +8 -4
- package/src/styles/06-components/_components.avatar-group.scss +2 -1
- package/src/styles/06-components/_components.avatar.scss +2 -1
- package/src/styles/06-components/_components.badge.scss +2 -1
- package/src/styles/06-components/_components.breadcrumb.scss +2 -1
- package/src/styles/06-components/_components.button.scss +4 -3
- package/src/styles/06-components/_components.callout.scss +3 -2
- package/src/styles/06-components/_components.card.scss +4 -2
- package/src/styles/06-components/_components.chart.scss +2 -1
- package/src/styles/06-components/_components.checkbox.scss +2 -1
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -2
- package/src/styles/06-components/_components.countdown.scss +2 -1
- package/src/styles/06-components/_components.data-table.scss +7 -6
- package/src/styles/06-components/_components.datepicker.scss +2 -1
- package/src/styles/06-components/_components.dropdown.scss +4 -3
- package/src/styles/06-components/_components.edge-panel.scss +4 -3
- package/src/styles/06-components/_components.footer.scss +825 -0
- package/src/styles/06-components/_components.form-group.scss +1 -0
- package/src/styles/06-components/_components.hero.scss +3 -2
- package/src/styles/06-components/_components.image-gallery.scss +1 -0
- package/src/styles/06-components/_components.input.scss +2 -1
- package/src/styles/06-components/_components.list-group.scss +3 -2
- package/src/styles/06-components/_components.list.scss +2 -1
- package/src/styles/06-components/_components.menu.scss +5 -4
- package/src/styles/06-components/_components.messages.scss +8 -7
- package/src/styles/06-components/_components.modal.scss +3 -2
- package/src/styles/06-components/_components.nav.scss +6 -5
- package/src/styles/06-components/_components.navbar.scss +4 -3
- package/src/styles/06-components/_components.pagination.scss +2 -1
- package/src/styles/06-components/_components.photoviewer.scss +4 -3
- package/src/styles/06-components/_components.popover.scss +3 -2
- package/src/styles/06-components/_components.product-review.scss +3 -2
- package/src/styles/06-components/_components.progress.scss +3 -2
- package/src/styles/06-components/_components.river.scss +3 -2
- package/src/styles/06-components/_components.sectionintro.scss +2 -1
- package/src/styles/06-components/_components.select.scss +5 -4
- package/src/styles/06-components/_components.side-menu.scss +8 -7
- package/src/styles/06-components/_components.skeleton.scss +3 -2
- package/src/styles/06-components/_components.slider.scss +7 -6
- package/src/styles/06-components/_components.spinner.scss +1 -0
- package/src/styles/06-components/_components.steps.scss +3 -2
- package/src/styles/06-components/_components.tabs.scss +4 -3
- package/src/styles/06-components/_components.testimonials.scss +2 -1
- package/src/styles/06-components/_components.todo.scss +3 -2
- package/src/styles/06-components/_components.toggle.scss +5 -4
- package/src/styles/06-components/_components.tooltip.scss +3 -2
- package/src/styles/06-components/_components.upload.scss +4 -3
- package/src/styles/06-components/_components.video-player.scss +4 -3
- package/src/styles/06-components/_index.scss +1 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { FooterSectionProps } from '../../lib/types/components';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* FooterSection component provides a section within the footer for organizing links and content.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <FooterSection title="Products" icon={<ProductIcon />}>
|
|
10
|
+
* <FooterLink href="/product1">Product 1</FooterLink>
|
|
11
|
+
* <FooterLink href="/product2">Product 2</FooterLink>
|
|
12
|
+
* </FooterSection>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const FooterSection = forwardRef<HTMLDivElement, FooterSectionProps>(
|
|
16
|
+
(
|
|
17
|
+
{
|
|
18
|
+
title,
|
|
19
|
+
icon,
|
|
20
|
+
collapsible = false,
|
|
21
|
+
defaultCollapsed = false,
|
|
22
|
+
children,
|
|
23
|
+
className = '',
|
|
24
|
+
...props
|
|
25
|
+
},
|
|
26
|
+
ref
|
|
27
|
+
) => {
|
|
28
|
+
const [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed);
|
|
29
|
+
|
|
30
|
+
const handleToggle = () => {
|
|
31
|
+
if (collapsible) {
|
|
32
|
+
setIsCollapsed(!isCollapsed);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const sectionClass = [
|
|
37
|
+
'c-footer__section',
|
|
38
|
+
collapsible && 'c-footer__section--collapsible',
|
|
39
|
+
isCollapsed && 'c-footer__section--collapsed',
|
|
40
|
+
className,
|
|
41
|
+
]
|
|
42
|
+
.filter(Boolean)
|
|
43
|
+
.join(' ');
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div ref={ref} className={sectionClass} {...props}>
|
|
47
|
+
{title && (
|
|
48
|
+
<div className="c-footer__section-header">
|
|
49
|
+
{collapsible ? (
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
className="c-footer__section-toggle"
|
|
53
|
+
onClick={handleToggle}
|
|
54
|
+
aria-expanded={!isCollapsed}
|
|
55
|
+
aria-controls={`footer-section-${title.toString().toLowerCase().replace(/\s+/g, '-')}`}
|
|
56
|
+
>
|
|
57
|
+
{icon && <span className="c-footer__section-icon">{icon}</span>}
|
|
58
|
+
<h4 className="c-footer__section-title">{title}</h4>
|
|
59
|
+
<span className="c-footer__section-chevron">
|
|
60
|
+
{isCollapsed ? '▼' : '▲'}
|
|
61
|
+
</span>
|
|
62
|
+
</button>
|
|
63
|
+
) : (
|
|
64
|
+
<div className="c-footer__section-header-content">
|
|
65
|
+
{icon && <span className="c-footer__section-icon">{icon}</span>}
|
|
66
|
+
<h4 className="c-footer__section-title">{title}</h4>
|
|
67
|
+
</div>
|
|
68
|
+
)}
|
|
69
|
+
</div>
|
|
70
|
+
)}
|
|
71
|
+
<div
|
|
72
|
+
className="c-footer__section-content"
|
|
73
|
+
id={title ? `footer-section-${title.toString().toLowerCase().replace(/\s+/g, '-')}` : undefined}
|
|
74
|
+
style={{
|
|
75
|
+
display: collapsible && isCollapsed ? 'none' : 'block',
|
|
76
|
+
}}
|
|
77
|
+
>
|
|
78
|
+
{children}
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
FooterSection.displayName = 'FooterSection';
|
|
86
|
+
|
|
87
|
+
export default FooterSection;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { FooterSocialLinkProps } from '../../lib/types/components';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* FooterSocialLink component provides styled social media links with platform-specific icons.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <FooterSocialLink platform="twitter" url="https://twitter.com/company" />
|
|
10
|
+
* <FooterSocialLink platform="custom" url="https://example.com" icon={<CustomIcon />} label="Custom Platform" />
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export const FooterSocialLink = forwardRef<HTMLAnchorElement, FooterSocialLinkProps>(
|
|
14
|
+
(
|
|
15
|
+
{
|
|
16
|
+
platform,
|
|
17
|
+
url,
|
|
18
|
+
icon,
|
|
19
|
+
label,
|
|
20
|
+
size = 'md',
|
|
21
|
+
variant = 'default',
|
|
22
|
+
disabled = false,
|
|
23
|
+
className = '',
|
|
24
|
+
...props
|
|
25
|
+
},
|
|
26
|
+
ref
|
|
27
|
+
) => {
|
|
28
|
+
const getPlatformIcon = (platform: string) => {
|
|
29
|
+
const icons: Record<string, string> = {
|
|
30
|
+
facebook: '📘',
|
|
31
|
+
twitter: '🐦',
|
|
32
|
+
instagram: '📷',
|
|
33
|
+
linkedin: '💼',
|
|
34
|
+
youtube: '📺',
|
|
35
|
+
github: '🐙',
|
|
36
|
+
discord: '🎮',
|
|
37
|
+
tiktok: '🎵',
|
|
38
|
+
pinterest: '📌',
|
|
39
|
+
snapchat: '👻',
|
|
40
|
+
whatsapp: '💬',
|
|
41
|
+
telegram: '✈️',
|
|
42
|
+
reddit: '🤖',
|
|
43
|
+
twitch: '🎮',
|
|
44
|
+
spotify: '🎵',
|
|
45
|
+
dribbble: '🏀',
|
|
46
|
+
behance: '🎨',
|
|
47
|
+
medium: '📝',
|
|
48
|
+
dev: '👨💻',
|
|
49
|
+
codepen: '✏️',
|
|
50
|
+
};
|
|
51
|
+
return icons[platform] || '🔗';
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const getPlatformLabel = (platform: string) => {
|
|
55
|
+
const labels: Record<string, string> = {
|
|
56
|
+
facebook: 'Facebook',
|
|
57
|
+
twitter: 'Twitter',
|
|
58
|
+
instagram: 'Instagram',
|
|
59
|
+
linkedin: 'LinkedIn',
|
|
60
|
+
youtube: 'YouTube',
|
|
61
|
+
github: 'GitHub',
|
|
62
|
+
discord: 'Discord',
|
|
63
|
+
tiktok: 'TikTok',
|
|
64
|
+
pinterest: 'Pinterest',
|
|
65
|
+
snapchat: 'Snapchat',
|
|
66
|
+
whatsapp: 'WhatsApp',
|
|
67
|
+
telegram: 'Telegram',
|
|
68
|
+
reddit: 'Reddit',
|
|
69
|
+
twitch: 'Twitch',
|
|
70
|
+
spotify: 'Spotify',
|
|
71
|
+
dribbble: 'Dribbble',
|
|
72
|
+
behance: 'Behance',
|
|
73
|
+
medium: 'Medium',
|
|
74
|
+
dev: 'Dev.to',
|
|
75
|
+
codepen: 'CodePen',
|
|
76
|
+
};
|
|
77
|
+
return labels[platform] || platform;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const linkClass = [
|
|
81
|
+
'c-footer__social-link',
|
|
82
|
+
`c-footer__social-link--${platform}`,
|
|
83
|
+
`c-footer__social-link--${size}`,
|
|
84
|
+
`c-footer__social-link--${variant}`,
|
|
85
|
+
disabled && 'c-footer__social-link--disabled',
|
|
86
|
+
className,
|
|
87
|
+
]
|
|
88
|
+
.filter(Boolean)
|
|
89
|
+
.join(' ');
|
|
90
|
+
|
|
91
|
+
const ariaLabel = label || `Follow us on ${getPlatformLabel(platform)}`;
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<a
|
|
95
|
+
ref={ref}
|
|
96
|
+
href={disabled ? undefined : url}
|
|
97
|
+
className={linkClass}
|
|
98
|
+
target="_blank"
|
|
99
|
+
rel="noopener noreferrer"
|
|
100
|
+
aria-label={ariaLabel}
|
|
101
|
+
aria-disabled={disabled}
|
|
102
|
+
{...props}
|
|
103
|
+
>
|
|
104
|
+
<span className="c-footer__social-link-icon">
|
|
105
|
+
{icon || getPlatformIcon(platform)}
|
|
106
|
+
</span>
|
|
107
|
+
<span className="c-footer__social-link-label u-visually-hidden">
|
|
108
|
+
{ariaLabel}
|
|
109
|
+
</span>
|
|
110
|
+
</a>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
FooterSocialLink.displayName = 'FooterSocialLink';
|
|
116
|
+
|
|
117
|
+
export default FooterSocialLink;
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Footer Component
|
|
2
|
+
|
|
3
|
+
A comprehensive footer component with multiple layout options, social links, newsletter signup, and responsive design.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Multiple Layouts**: Columns, centered, minimal, and stacked layouts
|
|
8
|
+
- **Social Media Integration**: Built-in support for 20+ social platforms
|
|
9
|
+
- **Newsletter Signup**: Optional newsletter subscription form
|
|
10
|
+
- **Responsive Design**: Mobile-first with collapsible sections
|
|
11
|
+
- **Back to Top**: Optional smooth scroll to top functionality
|
|
12
|
+
- **Accessibility**: WCAG 2.1 AA compliant with proper ARIA attributes
|
|
13
|
+
- **Theme Support**: Multiple color variants and dark mode
|
|
14
|
+
- **Sticky Footer**: Optional sticky positioning
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
### Basic Footer
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { Footer, FooterSection, FooterLink } from '@shohojdhara/atomix';
|
|
22
|
+
|
|
23
|
+
<Footer
|
|
24
|
+
brand="My Company"
|
|
25
|
+
copyright="© 2024 My Company. All rights reserved."
|
|
26
|
+
socialLinks={[
|
|
27
|
+
{ platform: 'twitter', url: 'https://twitter.com/company' },
|
|
28
|
+
{ platform: 'facebook', url: 'https://facebook.com/company' }
|
|
29
|
+
]}
|
|
30
|
+
>
|
|
31
|
+
<FooterSection title="Products">
|
|
32
|
+
<FooterLink href="/product1">Product 1</FooterLink>
|
|
33
|
+
<FooterLink href="/product2">Product 2</FooterLink>
|
|
34
|
+
</FooterSection>
|
|
35
|
+
|
|
36
|
+
<FooterSection title="Company">
|
|
37
|
+
<FooterLink href="/about">About Us</FooterLink>
|
|
38
|
+
<FooterLink href="/contact">Contact</FooterLink>
|
|
39
|
+
</FooterSection>
|
|
40
|
+
</Footer>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### With Newsletter
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
<Footer
|
|
47
|
+
brand="My Company"
|
|
48
|
+
copyright="© 2024 My Company. All rights reserved."
|
|
49
|
+
showNewsletter
|
|
50
|
+
newsletterTitle="Stay Updated"
|
|
51
|
+
newsletterDescription="Get the latest updates delivered to your inbox."
|
|
52
|
+
onNewsletterSubmit={(email) => console.log('Newsletter signup:', email)}
|
|
53
|
+
>
|
|
54
|
+
{/* Footer sections */}
|
|
55
|
+
</Footer>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Collapsible Sections (Mobile)
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
<FooterSection title="Products" collapsible defaultCollapsed>
|
|
62
|
+
<FooterLink href="/product1">Product 1</FooterLink>
|
|
63
|
+
<FooterLink href="/product2">Product 2</FooterLink>
|
|
64
|
+
</FooterSection>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Props
|
|
68
|
+
|
|
69
|
+
### Footer Props
|
|
70
|
+
|
|
71
|
+
| Prop | Type | Default | Description |
|
|
72
|
+
|------|------|---------|-------------|
|
|
73
|
+
| `brand` | `ReactNode` | - | Brand name or logo |
|
|
74
|
+
| `brandLogo` | `string \| ReactNode` | - | Brand logo (image URL or React element) |
|
|
75
|
+
| `brandDescription` | `ReactNode` | - | Brand description text |
|
|
76
|
+
| `copyright` | `ReactNode` | - | Copyright text |
|
|
77
|
+
| `layout` | `'columns' \| 'centered' \| 'minimal' \| 'stacked'` | `'columns'` | Footer layout variant |
|
|
78
|
+
| `variant` | `ThemeColor` | `'primary'` | Color variant |
|
|
79
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Size variant |
|
|
80
|
+
| `showNewsletter` | `boolean` | `false` | Whether to show newsletter signup |
|
|
81
|
+
| `newsletterTitle` | `string` | `'Stay Updated'` | Newsletter section title |
|
|
82
|
+
| `newsletterDescription` | `string` | - | Newsletter section description |
|
|
83
|
+
| `newsletterPlaceholder` | `string` | `'Enter your email'` | Newsletter input placeholder |
|
|
84
|
+
| `newsletterButtonText` | `string` | `'Subscribe'` | Newsletter submit button text |
|
|
85
|
+
| `onNewsletterSubmit` | `(email: string) => void` | - | Newsletter submit handler |
|
|
86
|
+
| `socialLinks` | `SocialLink[]` | `[]` | Social media links |
|
|
87
|
+
| `showBackToTop` | `boolean` | `false` | Whether to show back to top button |
|
|
88
|
+
| `backToTopText` | `string` | `'Back to Top'` | Back to top button text |
|
|
89
|
+
| `onBackToTop` | `() => void` | - | Back to top click handler |
|
|
90
|
+
| `showDivider` | `boolean` | `true` | Whether to show divider above bottom section |
|
|
91
|
+
| `sticky` | `boolean` | `false` | Whether footer should be sticky |
|
|
92
|
+
|
|
93
|
+
### FooterSection Props
|
|
94
|
+
|
|
95
|
+
| Prop | Type | Default | Description |
|
|
96
|
+
|------|------|---------|-------------|
|
|
97
|
+
| `title` | `ReactNode` | - | Section title |
|
|
98
|
+
| `icon` | `ReactNode` | - | Section icon |
|
|
99
|
+
| `collapsible` | `boolean` | `false` | Whether section is collapsible on mobile |
|
|
100
|
+
| `defaultCollapsed` | `boolean` | `false` | Whether section is collapsed by default |
|
|
101
|
+
| `children` | `ReactNode` | - | Section content |
|
|
102
|
+
|
|
103
|
+
### FooterLink Props
|
|
104
|
+
|
|
105
|
+
| Prop | Type | Default | Description |
|
|
106
|
+
|------|------|---------|-------------|
|
|
107
|
+
| `href` | `string` | - | Link URL |
|
|
108
|
+
| `icon` | `ReactNode` | - | Link icon |
|
|
109
|
+
| `external` | `boolean` | `false` | Whether link opens in new tab |
|
|
110
|
+
| `active` | `boolean` | `false` | Whether link is active |
|
|
111
|
+
| `disabled` | `boolean` | `false` | Whether link is disabled |
|
|
112
|
+
| `onClick` | `(event: MouseEvent) => void` | - | Link click handler |
|
|
113
|
+
| `LinkComponent` | `React.ElementType` | - | Custom link component (e.g., React Router Link) |
|
|
114
|
+
|
|
115
|
+
### Social Link Configuration
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
interface SocialLink {
|
|
119
|
+
platform: SocialPlatform;
|
|
120
|
+
url: string;
|
|
121
|
+
icon?: ReactNode; // Custom icon override
|
|
122
|
+
label?: string; // Custom accessibility label
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Supported Social Platforms
|
|
127
|
+
|
|
128
|
+
- `facebook`, `twitter`, `instagram`, `linkedin`
|
|
129
|
+
- `youtube`, `github`, `discord`, `tiktok`
|
|
130
|
+
- `pinterest`, `snapchat`, `whatsapp`, `telegram`
|
|
131
|
+
- `reddit`, `twitch`, `spotify`, `dribbble`
|
|
132
|
+
- `behance`, `medium`, `dev`, `codepen`
|
|
133
|
+
- `custom` (for custom platforms with custom icons)
|
|
134
|
+
|
|
135
|
+
## Layout Variants
|
|
136
|
+
|
|
137
|
+
### Columns (Default)
|
|
138
|
+
```tsx
|
|
139
|
+
<Footer layout="columns">
|
|
140
|
+
{/* Sections arranged in responsive columns */}
|
|
141
|
+
</Footer>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Centered
|
|
145
|
+
```tsx
|
|
146
|
+
<Footer layout="centered">
|
|
147
|
+
{/* All content centered */}
|
|
148
|
+
</Footer>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Minimal
|
|
152
|
+
```tsx
|
|
153
|
+
<Footer layout="minimal" size="sm">
|
|
154
|
+
{/* Compact footer with minimal spacing */}
|
|
155
|
+
</Footer>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Stacked
|
|
159
|
+
```tsx
|
|
160
|
+
<Footer layout="stacked">
|
|
161
|
+
{/* Sections stacked vertically */}
|
|
162
|
+
</Footer>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Styling
|
|
166
|
+
|
|
167
|
+
The Footer component uses CSS custom properties for theming:
|
|
168
|
+
|
|
169
|
+
```css
|
|
170
|
+
.c-footer {
|
|
171
|
+
--atomix-footer-bg: var(--atomix-surface);
|
|
172
|
+
--atomix-footer-color: var(--atomix-text);
|
|
173
|
+
--atomix-footer-padding-y: 3rem;
|
|
174
|
+
--atomix-footer-container-max-width: 1200px;
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Custom Styling
|
|
179
|
+
|
|
180
|
+
```scss
|
|
181
|
+
.c-footer {
|
|
182
|
+
&--custom {
|
|
183
|
+
--atomix-footer-bg: #1a1a1a;
|
|
184
|
+
--atomix-footer-color: #ffffff;
|
|
185
|
+
|
|
186
|
+
.c-footer__brand-name h3 {
|
|
187
|
+
color: #00ff88;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Accessibility
|
|
194
|
+
|
|
195
|
+
- Semantic HTML structure with proper `<footer>` element
|
|
196
|
+
- ARIA attributes for collapsible sections
|
|
197
|
+
- Keyboard navigation support
|
|
198
|
+
- Screen reader friendly
|
|
199
|
+
- Focus management
|
|
200
|
+
- High contrast support
|
|
201
|
+
|
|
202
|
+
## Responsive Behavior
|
|
203
|
+
|
|
204
|
+
- **Mobile**: Sections stack vertically, optional collapsible sections
|
|
205
|
+
- **Tablet**: Responsive grid layout
|
|
206
|
+
- **Desktop**: Multi-column layout with proper spacing
|
|
207
|
+
|
|
208
|
+
## Examples
|
|
209
|
+
|
|
210
|
+
### Complete Footer with All Features
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
<Footer
|
|
214
|
+
brand="Atomix"
|
|
215
|
+
brandLogo="/logo.png"
|
|
216
|
+
brandDescription="A modern design system for building beautiful interfaces."
|
|
217
|
+
copyright="© 2024 Atomix. All rights reserved."
|
|
218
|
+
layout="columns"
|
|
219
|
+
variant="primary"
|
|
220
|
+
size="md"
|
|
221
|
+
showNewsletter
|
|
222
|
+
newsletterTitle="Stay in the Loop"
|
|
223
|
+
newsletterDescription="Get updates on new components and features."
|
|
224
|
+
onNewsletterSubmit={handleNewsletterSubmit}
|
|
225
|
+
socialLinks={[
|
|
226
|
+
{ platform: 'github', url: 'https://github.com/company' },
|
|
227
|
+
{ platform: 'twitter', url: 'https://twitter.com/company' },
|
|
228
|
+
{ platform: 'discord', url: 'https://discord.gg/company' }
|
|
229
|
+
]}
|
|
230
|
+
showBackToTop
|
|
231
|
+
showDivider
|
|
232
|
+
>
|
|
233
|
+
<FooterSection title="Products" icon="🚀">
|
|
234
|
+
<FooterLink href="/components">Components</FooterLink>
|
|
235
|
+
<FooterLink href="/templates">Templates</FooterLink>
|
|
236
|
+
<FooterLink href="/themes">Themes</FooterLink>
|
|
237
|
+
</FooterSection>
|
|
238
|
+
|
|
239
|
+
<FooterSection title="Resources" collapsible>
|
|
240
|
+
<FooterLink href="/docs">Documentation</FooterLink>
|
|
241
|
+
<FooterLink href="/guides">Guides</FooterLink>
|
|
242
|
+
<FooterLink href="/examples">Examples</FooterLink>
|
|
243
|
+
<FooterLink href="/blog" external>Blog</FooterLink>
|
|
244
|
+
</FooterSection>
|
|
245
|
+
|
|
246
|
+
<FooterSection title="Support">
|
|
247
|
+
<FooterLink href="/help">Help Center</FooterLink>
|
|
248
|
+
<FooterLink href="/community">Community</FooterLink>
|
|
249
|
+
<FooterLink href="/contact">Contact Us</FooterLink>
|
|
250
|
+
</FooterSection>
|
|
251
|
+
</Footer>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Best Practices
|
|
255
|
+
|
|
256
|
+
1. **Keep it organized**: Group related links in logical sections
|
|
257
|
+
2. **Limit sections**: 3-5 sections work best for readability
|
|
258
|
+
3. **Use meaningful labels**: Clear, descriptive link text
|
|
259
|
+
4. **Consider mobile**: Test collapsible sections on mobile devices
|
|
260
|
+
5. **Accessibility first**: Always provide proper ARIA labels
|
|
261
|
+
6. **Performance**: Optimize social media icons and brand logos
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { Footer, default } from './Footer';
|
|
2
|
+
export { FooterSection } from './FooterSection';
|
|
3
|
+
export { FooterLink } from './FooterLink';
|
|
4
|
+
export { FooterSocialLink } from './FooterSocialLink';
|
|
5
|
+
export type {
|
|
6
|
+
FooterProps,
|
|
7
|
+
FooterSectionProps,
|
|
8
|
+
FooterLinkProps,
|
|
9
|
+
FooterSocialLinkProps,
|
|
10
|
+
FooterLayout,
|
|
11
|
+
SocialPlatform,
|
|
12
|
+
SocialLink,
|
|
13
|
+
} from '../../lib/types/components';
|
|
@@ -164,17 +164,15 @@ export const SectionIntro: React.FC<SectionIntroProps> = ({
|
|
|
164
164
|
return (
|
|
165
165
|
<div className={sectionIntroClasses} ref={sectionIntroRef}>
|
|
166
166
|
{renderBackground()}
|
|
167
|
-
<div className="c-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
<
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
)}
|
|
177
|
-
</div>
|
|
167
|
+
{label && <div className="c-sectionintro__label">{label}</div>}
|
|
168
|
+
<h2 className="c-sectionintro__title">{title}</h2>
|
|
169
|
+
{text && <div className="c-sectionintro__text">{text}</div>}
|
|
170
|
+
{actions && <div className="c-sectionintro__actions">{actions}</div>}
|
|
171
|
+
{imageSrc && (
|
|
172
|
+
<div className="c-sectionintro__image-wrapper">
|
|
173
|
+
<img src={imageSrc} alt={imageAlt} className="c-sectionintro__image" />
|
|
174
|
+
</div>
|
|
175
|
+
)}
|
|
178
176
|
</div>
|
|
179
177
|
);
|
|
180
178
|
};
|