@affinda/react 0.0.21 → 0.0.23

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 CHANGED
@@ -125,6 +125,13 @@ import { Button, Heading, TypographyLockup } from '@affinda/react';
125
125
  **Decorative:**
126
126
  - **PaperclipDecoration** - Decorative paperclip vector for hero sections
127
127
 
128
+ **Footer:**
129
+ - **Footer** / AfFooter - Slot-based footer layout component
130
+ - **FooterColumn** / AfFooterColumn - Navigation column for footer
131
+ - **FooterLink** / AfFooterLink - Styled link for footer navigation
132
+ - **SocialLink** / AfSocialLink - Circular social media icon link
133
+ - **ContactItem** / AfContactItem - Label/value pair for contact info
134
+
128
135
  ## Quick Start Components
129
136
 
130
137
  ### HeroSection
@@ -752,6 +759,107 @@ When generating Affinda UI code:
752
759
 
753
760
  4. **Never use purple colors** - those were placeholder colors and have been removed
754
761
 
762
+ ### Footer
763
+
764
+ A flexible, slot-based footer component for composing marketing page footers.
765
+
766
+ ```tsx
767
+ import {
768
+ Footer,
769
+ FooterColumn,
770
+ FooterLink,
771
+ SocialLink,
772
+ ContactItem,
773
+ Logo
774
+ } from '@affinda/react';
775
+
776
+ <Footer
777
+ copyrightText="© 2025 Your Company. All rights reserved."
778
+ statusText="All systems are operational"
779
+ statusUrl="https://status.example.com"
780
+ systemsOperational={true}
781
+ showStatus={true}
782
+ >
783
+ {/* Logo */}
784
+ <Logo slot="logo" />
785
+
786
+ {/* Social Links */}
787
+ <div slot="social" style={{ display: 'flex', gap: '12px' }}>
788
+ <SocialLink href="https://linkedin.com/company/..." icon="linkedin" label="LinkedIn" />
789
+ <SocialLink href="https://youtube.com/..." icon="youtube" label="YouTube" />
790
+ <SocialLink href="https://github.com/..." icon="github" label="GitHub" />
791
+ </div>
792
+
793
+ {/* Contact Info */}
794
+ <div slot="contact" style={{ display: 'flex', flexDirection: 'column', gap: '20px' }}>
795
+ <ContactItem label="Sales enquiries" value="sales@example.com" />
796
+ <ContactItem label="Support" value="support@example.com" />
797
+ </div>
798
+
799
+ {/* Navigation Columns */}
800
+ <div slot="nav" style={{ display: 'contents' }}>
801
+ <FooterColumn heading="Products">
802
+ <FooterLink href="/product-a">Product A</FooterLink>
803
+ <FooterLink href="/product-b">Product B</FooterLink>
804
+ </FooterColumn>
805
+
806
+ <FooterColumn heading="Company">
807
+ <FooterLink href="/about">About</FooterLink>
808
+ <FooterLink href="/careers">Careers</FooterLink>
809
+ <FooterLink href="https://external.com" external>Partner Site</FooterLink>
810
+ </FooterColumn>
811
+ </div>
812
+
813
+ {/* Legal Links */}
814
+ <div slot="legal" style={{ display: 'flex', gap: '24px' }}>
815
+ <a href="/privacy">Privacy policy</a>
816
+ <a href="/terms">Terms of service</a>
817
+ </div>
818
+
819
+ {/* Certification Badges (optional) */}
820
+ <div slot="badges">
821
+ {/* Your certification badge SVGs or images */}
822
+ </div>
823
+ </Footer>
824
+ ```
825
+
826
+ **Footer Props:**
827
+ - `copyrightText`: Copyright text (e.g., "© 2025 Company. All rights reserved.")
828
+ - `statusText`: Status message text
829
+ - `statusUrl`: Link to status page
830
+ - `systemsOperational`: Boolean for green/red status indicator
831
+ - `showStatus`: Whether to show the status section
832
+
833
+ **Footer Slots:**
834
+ - `logo`: Your logo component
835
+ - `social`: Social media links (use SocialLink components)
836
+ - `contact`: Contact information (use ContactItem components)
837
+ - `nav`: Navigation columns (use FooterColumn + FooterLink components)
838
+ - `legal`: Legal/policy links
839
+ - `badges`: Certification badges
840
+
841
+ **Helper Components:**
842
+
843
+ - **FooterColumn**: Navigation column with heading
844
+ - Props: `heading` (string)
845
+
846
+ - **FooterLink**: Styled footer link
847
+ - Props: `href` (string), `external` (boolean - adds external link icon)
848
+
849
+ - **SocialLink**: Circular social media icon link
850
+ - Props: `href`, `label`, `icon` ('linkedin' | 'youtube' | 'github' | 'twitter' | 'facebook' | 'custom')
851
+
852
+ - **ContactItem**: Label + value pair for contact info
853
+ - Props: `label`, `value`
854
+
855
+ **Features:**
856
+ - Dark inkwell background with mist green text
857
+ - Fully composable via slots
858
+ - Built-in social media icons
859
+ - External link indicators
860
+ - System status indicator
861
+ - Fully responsive design
862
+
755
863
  ## Using Illustrations
756
864
 
757
865
  The `@affinda/illustrations` package provides themed illustration assets:
@@ -8,9 +8,13 @@ import { AfButton as AfButtonElement } from "@affinda/wc/dist/components/af-butt
8
8
  import { AfCard as AfCardElement } from "@affinda/wc/dist/components/af-card.js";
9
9
  import { AfClientCarousel as AfClientCarouselElement } from "@affinda/wc/dist/components/af-client-carousel.js";
10
10
  import { AfColorSwatch as AfColorSwatchElement } from "@affinda/wc/dist/components/af-color-swatch.js";
11
+ import { AfContactItem as AfContactItemElement } from "@affinda/wc/dist/components/af-contact-item.js";
11
12
  import { AfContainer as AfContainerElement } from "@affinda/wc/dist/components/af-container.js";
12
13
  import { AfCtaSection as AfCtaSectionElement } from "@affinda/wc/dist/components/af-cta-section.js";
13
14
  import { AfFeatureAccordion as AfFeatureAccordionElement } from "@affinda/wc/dist/components/af-feature-accordion.js";
15
+ import { AfFooterColumn as AfFooterColumnElement } from "@affinda/wc/dist/components/af-footer-column.js";
16
+ import { AfFooterLink as AfFooterLinkElement } from "@affinda/wc/dist/components/af-footer-link.js";
17
+ import { AfFooter as AfFooterElement } from "@affinda/wc/dist/components/af-footer.js";
14
18
  import { AfHeading as AfHeadingElement } from "@affinda/wc/dist/components/af-heading.js";
15
19
  import { AfHeroSection as AfHeroSectionElement } from "@affinda/wc/dist/components/af-hero-section.js";
16
20
  import { AfIconButton as AfIconButtonElement } from "@affinda/wc/dist/components/af-icon-button.js";
@@ -19,6 +23,7 @@ import { AfLogo as AfLogoElement } from "@affinda/wc/dist/components/af-logo.js"
19
23
  import { AfNavItem as AfNavItemElement } from "@affinda/wc/dist/components/af-nav-item.js";
20
24
  import { AfNavbar as AfNavbarElement } from "@affinda/wc/dist/components/af-navbar.js";
21
25
  import { AfSection as AfSectionElement } from "@affinda/wc/dist/components/af-section.js";
26
+ import { AfSocialLink as AfSocialLinkElement } from "@affinda/wc/dist/components/af-social-link.js";
22
27
  import { AfTestimonialCarousel as AfTestimonialCarouselElement } from "@affinda/wc/dist/components/af-testimonial-carousel.js";
23
28
  import { AfTestimonialStat as AfTestimonialStatElement } from "@affinda/wc/dist/components/af-testimonial-stat.js";
24
29
  import { AfTestimonial as AfTestimonialElement } from "@affinda/wc/dist/components/af-testimonial.js";
@@ -37,12 +42,20 @@ export type AfClientCarouselEvents = NonNullable<unknown>;
37
42
  export declare const AfClientCarousel: StencilReactComponent<AfClientCarouselElement, AfClientCarouselEvents>;
38
43
  export type AfColorSwatchEvents = NonNullable<unknown>;
39
44
  export declare const AfColorSwatch: StencilReactComponent<AfColorSwatchElement, AfColorSwatchEvents>;
45
+ export type AfContactItemEvents = NonNullable<unknown>;
46
+ export declare const AfContactItem: StencilReactComponent<AfContactItemElement, AfContactItemEvents>;
40
47
  export type AfContainerEvents = NonNullable<unknown>;
41
48
  export declare const AfContainer: StencilReactComponent<AfContainerElement, AfContainerEvents>;
42
49
  export type AfCtaSectionEvents = NonNullable<unknown>;
43
50
  export declare const AfCtaSection: StencilReactComponent<AfCtaSectionElement, AfCtaSectionEvents>;
44
51
  export type AfFeatureAccordionEvents = NonNullable<unknown>;
45
52
  export declare const AfFeatureAccordion: StencilReactComponent<AfFeatureAccordionElement, AfFeatureAccordionEvents>;
53
+ export type AfFooterEvents = NonNullable<unknown>;
54
+ export declare const AfFooter: StencilReactComponent<AfFooterElement, AfFooterEvents>;
55
+ export type AfFooterColumnEvents = NonNullable<unknown>;
56
+ export declare const AfFooterColumn: StencilReactComponent<AfFooterColumnElement, AfFooterColumnEvents>;
57
+ export type AfFooterLinkEvents = NonNullable<unknown>;
58
+ export declare const AfFooterLink: StencilReactComponent<AfFooterLinkElement, AfFooterLinkEvents>;
46
59
  export type AfHeadingEvents = NonNullable<unknown>;
47
60
  export declare const AfHeading: StencilReactComponent<AfHeadingElement, AfHeadingEvents>;
48
61
  export type AfHeroSectionEvents = NonNullable<unknown>;
@@ -59,6 +72,8 @@ export type AfNavbarEvents = NonNullable<unknown>;
59
72
  export declare const AfNavbar: StencilReactComponent<AfNavbarElement, AfNavbarEvents>;
60
73
  export type AfSectionEvents = NonNullable<unknown>;
61
74
  export declare const AfSection: StencilReactComponent<AfSectionElement, AfSectionEvents>;
75
+ export type AfSocialLinkEvents = NonNullable<unknown>;
76
+ export declare const AfSocialLink: StencilReactComponent<AfSocialLinkElement, AfSocialLinkEvents>;
62
77
  export type AfTestimonialEvents = NonNullable<unknown>;
63
78
  export declare const AfTestimonial: StencilReactComponent<AfTestimonialElement, AfTestimonialEvents>;
64
79
  export type AfTestimonialCarouselEvents = NonNullable<unknown>;
@@ -10,9 +10,13 @@ import { AfButton as AfButtonElement, defineCustomElement as defineAfButton } fr
10
10
  import { AfCard as AfCardElement, defineCustomElement as defineAfCard } from "@affinda/wc/dist/components/af-card.js";
11
11
  import { AfClientCarousel as AfClientCarouselElement, defineCustomElement as defineAfClientCarousel } from "@affinda/wc/dist/components/af-client-carousel.js";
12
12
  import { AfColorSwatch as AfColorSwatchElement, defineCustomElement as defineAfColorSwatch } from "@affinda/wc/dist/components/af-color-swatch.js";
13
+ import { AfContactItem as AfContactItemElement, defineCustomElement as defineAfContactItem } from "@affinda/wc/dist/components/af-contact-item.js";
13
14
  import { AfContainer as AfContainerElement, defineCustomElement as defineAfContainer } from "@affinda/wc/dist/components/af-container.js";
14
15
  import { AfCtaSection as AfCtaSectionElement, defineCustomElement as defineAfCtaSection } from "@affinda/wc/dist/components/af-cta-section.js";
15
16
  import { AfFeatureAccordion as AfFeatureAccordionElement, defineCustomElement as defineAfFeatureAccordion } from "@affinda/wc/dist/components/af-feature-accordion.js";
17
+ import { AfFooterColumn as AfFooterColumnElement, defineCustomElement as defineAfFooterColumn } from "@affinda/wc/dist/components/af-footer-column.js";
18
+ import { AfFooterLink as AfFooterLinkElement, defineCustomElement as defineAfFooterLink } from "@affinda/wc/dist/components/af-footer-link.js";
19
+ import { AfFooter as AfFooterElement, defineCustomElement as defineAfFooter } from "@affinda/wc/dist/components/af-footer.js";
16
20
  import { AfHeading as AfHeadingElement, defineCustomElement as defineAfHeading } from "@affinda/wc/dist/components/af-heading.js";
17
21
  import { AfHeroSection as AfHeroSectionElement, defineCustomElement as defineAfHeroSection } from "@affinda/wc/dist/components/af-hero-section.js";
18
22
  import { AfIconButton as AfIconButtonElement, defineCustomElement as defineAfIconButton } from "@affinda/wc/dist/components/af-icon-button.js";
@@ -21,6 +25,7 @@ import { AfLogo as AfLogoElement, defineCustomElement as defineAfLogo } from "@a
21
25
  import { AfNavItem as AfNavItemElement, defineCustomElement as defineAfNavItem } from "@affinda/wc/dist/components/af-nav-item.js";
22
26
  import { AfNavbar as AfNavbarElement, defineCustomElement as defineAfNavbar } from "@affinda/wc/dist/components/af-navbar.js";
23
27
  import { AfSection as AfSectionElement, defineCustomElement as defineAfSection } from "@affinda/wc/dist/components/af-section.js";
28
+ import { AfSocialLink as AfSocialLinkElement, defineCustomElement as defineAfSocialLink } from "@affinda/wc/dist/components/af-social-link.js";
24
29
  import { AfTestimonialCarousel as AfTestimonialCarouselElement, defineCustomElement as defineAfTestimonialCarousel } from "@affinda/wc/dist/components/af-testimonial-carousel.js";
25
30
  import { AfTestimonialStat as AfTestimonialStatElement, defineCustomElement as defineAfTestimonialStat } from "@affinda/wc/dist/components/af-testimonial-stat.js";
26
31
  import { AfTestimonial as AfTestimonialElement, defineCustomElement as defineAfTestimonial } from "@affinda/wc/dist/components/af-testimonial.js";
@@ -76,6 +81,14 @@ export const AfColorSwatch = /*@__PURE__*/ createComponent({
76
81
  events: {},
77
82
  defineCustomElement: defineAfColorSwatch
78
83
  });
84
+ export const AfContactItem = /*@__PURE__*/ createComponent({
85
+ tagName: 'af-contact-item',
86
+ elementClass: AfContactItemElement,
87
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
88
+ react: React,
89
+ events: {},
90
+ defineCustomElement: defineAfContactItem
91
+ });
79
92
  export const AfContainer = /*@__PURE__*/ createComponent({
80
93
  tagName: 'af-container',
81
94
  elementClass: AfContainerElement,
@@ -100,6 +113,30 @@ export const AfFeatureAccordion = /*@__PURE__*/ createComponent({
100
113
  events: {},
101
114
  defineCustomElement: defineAfFeatureAccordion
102
115
  });
116
+ export const AfFooter = /*@__PURE__*/ createComponent({
117
+ tagName: 'af-footer',
118
+ elementClass: AfFooterElement,
119
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
120
+ react: React,
121
+ events: {},
122
+ defineCustomElement: defineAfFooter
123
+ });
124
+ export const AfFooterColumn = /*@__PURE__*/ createComponent({
125
+ tagName: 'af-footer-column',
126
+ elementClass: AfFooterColumnElement,
127
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
128
+ react: React,
129
+ events: {},
130
+ defineCustomElement: defineAfFooterColumn
131
+ });
132
+ export const AfFooterLink = /*@__PURE__*/ createComponent({
133
+ tagName: 'af-footer-link',
134
+ elementClass: AfFooterLinkElement,
135
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
136
+ react: React,
137
+ events: {},
138
+ defineCustomElement: defineAfFooterLink
139
+ });
103
140
  export const AfHeading = /*@__PURE__*/ createComponent({
104
141
  tagName: 'af-heading',
105
142
  elementClass: AfHeadingElement,
@@ -164,6 +201,14 @@ export const AfSection = /*@__PURE__*/ createComponent({
164
201
  events: {},
165
202
  defineCustomElement: defineAfSection
166
203
  });
204
+ export const AfSocialLink = /*@__PURE__*/ createComponent({
205
+ tagName: 'af-social-link',
206
+ elementClass: AfSocialLinkElement,
207
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
208
+ react: React,
209
+ events: {},
210
+ defineCustomElement: defineAfSocialLink
211
+ });
167
212
  export const AfTestimonial = /*@__PURE__*/ createComponent({
168
213
  tagName: 'af-testimonial',
169
214
  elementClass: AfTestimonialElement,
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './generated/components.js';
2
- export { AfAspectRatio as AspectRatio, AfButton as Button, AfButtonGroup as ButtonGroup, AfCard as Card, AfClientCarousel as ClientCarousel, AfColorSwatch as ColorSwatch, AfContainer as Container, AfCtaSection as CtaSection, AfFeatureAccordion as FeatureAccordion, AfHeading as Heading, AfHeroSection as HeroSection, AfIconButton as IconButton, AfLogo as Logo, AfLogoWell as LogoWell, AfNavItem as NavItem, AfNavbar as Navbar, AfSection as Section, AfText as Text, AfTestimonial as Testimonial, AfTestimonialCarousel as TestimonialCarousel, AfTestimonialStat as TestimonialStat, AfTypographyLockup as TypographyLockup } from './generated/components.js';
2
+ export { AfAspectRatio as AspectRatio, AfButton as Button, AfButtonGroup as ButtonGroup, AfCard as Card, AfClientCarousel as ClientCarousel, AfColorSwatch as ColorSwatch, AfContactItem as ContactItem, AfContainer as Container, AfCtaSection as CtaSection, AfFeatureAccordion as FeatureAccordion, AfFooter as Footer, AfFooterColumn as FooterColumn, AfFooterLink as FooterLink, AfHeading as Heading, AfHeroSection as HeroSection, AfIconButton as IconButton, AfLogo as Logo, AfLogoWell as LogoWell, AfNavItem as NavItem, AfNavbar as Navbar, AfSection as Section, AfSocialLink as SocialLink, AfText as Text, AfTestimonial as Testimonial, AfTestimonialCarousel as TestimonialCarousel, AfTestimonialStat as TestimonialStat, AfTypographyLockup as TypographyLockup } from './generated/components.js';
3
3
  export * from '@affinda/icons/react';
4
4
  export { PaperclipDecoration } from './components/PaperclipDecoration';
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  export * from './generated/components.js';
3
3
  // Note: defineCustomElements should be imported directly from @affinda/wc/loader/index.js in your app
4
4
  // Re-export components without the 'Af' prefix for cleaner React usage
5
- export { AfAspectRatio as AspectRatio, AfButton as Button, AfButtonGroup as ButtonGroup, AfCard as Card, AfClientCarousel as ClientCarousel, AfColorSwatch as ColorSwatch, AfContainer as Container, AfCtaSection as CtaSection, AfFeatureAccordion as FeatureAccordion, AfHeading as Heading, AfHeroSection as HeroSection, AfIconButton as IconButton, AfLogo as Logo, AfLogoWell as LogoWell, AfNavItem as NavItem, AfNavbar as Navbar, AfSection as Section, AfText as Text, AfTestimonial as Testimonial, AfTestimonialCarousel as TestimonialCarousel, AfTestimonialStat as TestimonialStat, AfTypographyLockup as TypographyLockup } from './generated/components.js';
5
+ export { AfAspectRatio as AspectRatio, AfButton as Button, AfButtonGroup as ButtonGroup, AfCard as Card, AfClientCarousel as ClientCarousel, AfColorSwatch as ColorSwatch, AfContactItem as ContactItem, AfContainer as Container, AfCtaSection as CtaSection, AfFeatureAccordion as FeatureAccordion, AfFooter as Footer, AfFooterColumn as FooterColumn, AfFooterLink as FooterLink, AfHeading as Heading, AfHeroSection as HeroSection, AfIconButton as IconButton, AfLogo as Logo, AfLogoWell as LogoWell, AfNavItem as NavItem, AfNavbar as Navbar, AfSection as Section, AfSocialLink as SocialLink, AfText as Text, AfTestimonial as Testimonial, AfTestimonialCarousel as TestimonialCarousel, AfTestimonialStat as TestimonialStat, AfTypographyLockup as TypographyLockup } from './generated/components.js';
6
6
  // Re-export React icon components from icons package
7
7
  export * from '@affinda/icons/react';
8
8
  // Export custom React components
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@affinda/react",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@affinda/icons": "^0.0.3",
19
- "@affinda/wc": "^0.0.12",
19
+ "@affinda/wc": "^0.0.14",
20
20
  "@stencil/react-output-target": "^1.2.0"
21
21
  },
22
22
  "scripts": {