import * as React from 'react' import { StyledLogo, StyledLogoContainer } from './styled' interface LogoItem { /** * Specify the width of the logo from Desktop view * @desc This is important. You should insert the initial width from the desktop design file you are following, without white space. * @type number * @example * import LogoGrid from 'logo-grid' * import { Stripe } from 'my-awesome-svgs' * * export const logoList = [ * { logo: Stripe, initialWidth: 108 }, * ] * * */ initialWidth?: number /** * Specify the logo which should be rendered. Can also be an image src. * @type number * @example * import LogoGrid from 'logo-grid' * import { Stripe } from 'my-awesome-svgs' * * export const logoList = [ * { logo: Stripe, initialWidth: 108 }, * { logo: 'https://placeimg.com/640/480/nature', initialWidth: 85 }, * ] * * */ logo?: React.ReactNode | string | any } export interface LogoGridProps { /** * The className of the LogoGrid component. * @type string */ className?: string /** * Specify the number of columns for the logos/images on Desktop only * @type number * @defaultValue 5 * @example columns={5} */ columns?: number /** * Specify the alignment of the logos on Desktop only * @type 'center' | 'left' * @defaultValue 'center' * @example desktopAlign="center" */ desktopAlign?: 'center' | 'left' /** * Change the scale of the padding on Desktop between the logos * @type number * @defaultValue 1 * @example * desktopPaddingScale={1.2} * desktopPaddingScale={0.8} */ desktopPaddingScale?: number /** * Add a fill color to all the svg path of the provided logos * @type string * @example * fillColor='red' * fillColor='blue' */ fillColor?: string /** * Add an array of logos * @type LogoItem[] * @defaultValue [{ logo: 'https://placeimg.com/640/480/nature', initialWidth: 100 }] * @example * import LogoGrid from 'logo-grid' * import { Stripe, AirBnbIcon, Amazon } from 'my-awesome-svgs' * * export const logoList = [ * { logo: Stripe, initialWidth: 108 }, * { logo: 'https://placeimg.com/640/480/nature', initialWidth: 85 }, * { logo: AirBnbIcon, initialWidth: 52 }, * { logo: Amazon, initialWidth: 136 }, * { logo: 'https://placeimg.com/640/480/nature', initialWidth: 75 }, * ] * * */ logos?: LogoItem[] /** * Specify the alignment of the logos on Mobile only * @type 'center' | 'left' * @defaultValue 'left' * @example mobileAlign="left" */ mobileAlign?: 'center' | 'left' /** * Specify the breakpoint px value at which to switch from mobile to desktop layouts * @type number * @defaultValue 767 * @example mobileBreakpoint={600} */ mobileBreakpoint?: number /** * Change the scale of the padding on Mobile between the logos * @type number * @defaultValue 1 * @example * mobilePaddingScale={1.2} * mobilePaddingScale={0.8} */ mobilePaddingScale?: number /** * Change the scale of the padding on Mobile between the logos * @desc Will scale the logos proportionally down on mobile. You can guage this with your eye. 0 to 2 usually with do it, since this is a percentage value. so 1.1 would be 110% of the original. * @type number * @defaultValue 1 * @example * mobileScale={1.2} * mobileScale={0.8} */ mobileScale?: number /** * Specify the width of all logos as a group. * @desc This is important. Similar to initialWidth on the logos, you should insert the initial parentWidth from the desktop design file you are following, without white space. * @type number * @defaultValue 1000 * @example * parentWidth={900} * parentWidth={976} */ parentWidth?: number /** * Specify whether the logos should shift to the left or not. * @desc This is make the left side flush with content above or below it. Helpful on left aligned layouts. * @type boolean * @defaultValue false * @example withOffset={true} */ withOffset?: boolean } export interface LogoGridNewProps { centeredOffset?: string firstLogoOffset?: number flushLeft?: string initialLogoWrapperWidth?: number initialPxOffset?: number lastLogoOffset?: number numOfColumns?: number offset?: string singleRow?: boolean } const defaultProps: LogoGridProps = { className: '', columns: 5, desktopAlign: 'center', desktopPaddingScale: 1, logos: [{ logo: 'https://placeimg.com/640/480/nature', initialWidth: 100 }], mobileAlign: 'left', mobileBreakpoint: 767, mobileScale: 1, mobilePaddingScale: 1, parentWidth: 1000, withOffset: false, } const LogoGrid: React.FunctionComponent & { defaultProps: Partial } = ({ className, columns, desktopAlign, desktopPaddingScale, fillColor, logos, mobileAlign, mobileBreakpoint, mobileScale, mobilePaddingScale, parentWidth, withOffset, ...rest }) => { const newProps: LogoGridNewProps = {} newProps.singleRow = logos.length <= columns newProps.numOfColumns = logos.length < columns ? logos.length : columns newProps.initialLogoWrapperWidth = parentWidth / newProps.numOfColumns newProps.firstLogoOffset = (newProps.initialLogoWrapperWidth - logos[0].initialWidth) / 2 newProps.lastLogoOffset = (newProps.initialLogoWrapperWidth - logos[newProps.numOfColumns - 1].initialWidth) / 2 newProps.flushLeft = `${((newProps.firstLogoOffset / parentWidth) * 100).toFixed(3)}%` newProps.initialPxOffset = (newProps.firstLogoOffset - newProps.lastLogoOffset) / 2 newProps.centeredOffset = `${((newProps.initialPxOffset / parentWidth) * 100).toFixed(3)}%` if (withOffset) { if (desktopAlign === 'left') { newProps.offset = newProps.flushLeft } else { newProps.offset = newProps.centeredOffset } } else { newProps.offset = '0%' } return ( {logos.map(({ initialWidth = 100, logo = null }, idx) => { if (!logo) { return null } const key = `logo-${idx + 1}` return (
{typeof logo === 'string' ? React.createElement('img', { src: logo }) : React.createElement(logo)}
) })}
) } LogoGrid.defaultProps = defaultProps export { LogoGrid }