@cronos-labs/ui 0.2.0

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.
Files changed (63) hide show
  1. package/dist/FilterPillGroup/index.d.ts +1 -0
  2. package/dist/FilterPillGroup/index.js +1 -0
  3. package/dist/FilterPillGroup/styles.d.ts +8 -0
  4. package/dist/FilterPillGroup/styles.js +36 -0
  5. package/dist/Footer/index.d.ts +34 -0
  6. package/dist/Footer/index.js +48 -0
  7. package/dist/Footer/styles.d.ts +97 -0
  8. package/dist/Footer/styles.js +326 -0
  9. package/dist/Header/NavDropdown.d.ts +17 -0
  10. package/dist/Header/NavDropdown.js +39 -0
  11. package/dist/Header/helper.d.ts +1 -0
  12. package/dist/Header/helper.js +1 -0
  13. package/dist/Header/index.d.ts +46 -0
  14. package/dist/Header/index.js +162 -0
  15. package/dist/Header/styles.d.ts +158 -0
  16. package/dist/Header/styles.js +770 -0
  17. package/dist/LocaleSelector/index.d.ts +9 -0
  18. package/dist/LocaleSelector/index.js +62 -0
  19. package/dist/LocaleSelector/styles.d.ts +33 -0
  20. package/dist/LocaleSelector/styles.js +156 -0
  21. package/dist/SearchField/index.d.ts +14 -0
  22. package/dist/SearchField/index.js +6 -0
  23. package/dist/SearchField/styles.d.ts +20 -0
  24. package/dist/SearchField/styles.js +85 -0
  25. package/dist/SectionAnchorNav/index.d.ts +11 -0
  26. package/dist/SectionAnchorNav/index.js +41 -0
  27. package/dist/SectionAnchorNav/styles.d.ts +22 -0
  28. package/dist/SectionAnchorNav/styles.js +74 -0
  29. package/dist/Seo/index.d.ts +18 -0
  30. package/dist/Seo/index.js +53 -0
  31. package/dist/Seo/types.d.ts +4 -0
  32. package/dist/Seo/types.js +1 -0
  33. package/dist/config/eslintConfig.d.ts +6 -0
  34. package/dist/config/eslintConfig.js +31 -0
  35. package/dist/config/prettierConfig.d.ts +8 -0
  36. package/dist/config/prettierConfig.js +8 -0
  37. package/dist/format.d.ts +3 -0
  38. package/dist/format.js +9 -0
  39. package/dist/index.d.ts +21 -0
  40. package/dist/index.js +18 -0
  41. package/dist/locale/config.d.ts +5 -0
  42. package/dist/locale/config.js +103 -0
  43. package/dist/locale/hooks.d.ts +3 -0
  44. package/dist/locale/hooks.js +36 -0
  45. package/dist/locale/localePreference.d.ts +7 -0
  46. package/dist/locale/localePreference.js +21 -0
  47. package/dist/locale/localization.d.ts +11 -0
  48. package/dist/locale/localization.js +12 -0
  49. package/dist/locale/routes.d.ts +5 -0
  50. package/dist/locale/routes.js +32 -0
  51. package/dist/locale/types.d.ts +25 -0
  52. package/dist/locale/types.js +1 -0
  53. package/dist/navigationContent.d.ts +59 -0
  54. package/dist/navigationContent.js +552 -0
  55. package/dist/scrollToSectionHeading.d.ts +1 -0
  56. package/dist/scrollToSectionHeading.js +12 -0
  57. package/dist/tokens.d.ts +252 -0
  58. package/dist/tokens.js +253 -0
  59. package/dist/typography.d.ts +11 -0
  60. package/dist/typography.js +106 -0
  61. package/eslint-config.js +1 -0
  62. package/package.json +98 -0
  63. package/prettier-config.js +1 -0
@@ -0,0 +1 @@
1
+ export { PillButton, FilterPillRow } from './styles.js';
@@ -0,0 +1 @@
1
+ export { PillButton, FilterPillRow } from './styles.js';
@@ -0,0 +1,8 @@
1
+ export declare const FilterPillRow: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
2
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
3
+ }> & string;
4
+ export declare const PillButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "style"> & {
5
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
6
+ }, {
7
+ $active: boolean;
8
+ }>> & string;
@@ -0,0 +1,36 @@
1
+ import styled from 'styled-components';
2
+ export const FilterPillRow = styled.div `
3
+ display: flex;
4
+ flex-wrap: wrap;
5
+ gap: ${({ theme }) => theme.sizes.xxs};
6
+ `;
7
+ export const PillButton = styled.button `
8
+ padding: 6px ${({ theme }) => theme.sizes.sm};
9
+ border: none;
10
+ border-radius: ${({ theme }) => theme.borderRadius.pill};
11
+ background: ${({ theme, $active }) => $active ? theme.colors.brandSky : theme.colors.brandSkySurfaceLight};
12
+ color: ${({ theme }) => theme.colors.ink};
13
+ font-family: inherit;
14
+ font-size: ${({ theme }) => theme.typography.fontSize.footnote};
15
+ font-weight: ${({ theme }) => theme.fontWeight.medium};
16
+ white-space: nowrap;
17
+ cursor: pointer;
18
+ transition:
19
+ background ${({ theme }) => theme.motion.duration.fast}
20
+ ${({ theme }) => theme.motion.easing.standard},
21
+ color ${({ theme }) => theme.motion.duration.fast}
22
+ ${({ theme }) => theme.motion.easing.standard};
23
+
24
+ &:hover {
25
+ background: ${({ theme, $active }) => $active ? theme.colors.brandSky : theme.colors.brandSkyMuted};
26
+ }
27
+
28
+ &:focus-visible {
29
+ outline: none;
30
+ box-shadow: 0 0 0 3px ${({ theme }) => theme.colors.focusRing};
31
+ }
32
+
33
+ @media (prefers-reduced-motion: reduce) {
34
+ transition: none;
35
+ }
36
+ `;
@@ -0,0 +1,34 @@
1
+ export interface FooterLinkItem {
2
+ label: string;
3
+ target: string;
4
+ external: boolean;
5
+ localizeTarget?: boolean;
6
+ }
7
+ export interface FooterLinkGroup {
8
+ group: string;
9
+ links: FooterLinkItem[];
10
+ }
11
+ export interface FooterLegalLinkItem {
12
+ label: string;
13
+ target: string;
14
+ external: boolean;
15
+ disabled?: boolean;
16
+ isCookiePreferences?: boolean;
17
+ }
18
+ export interface FooterContent {
19
+ localeSelectorAriaLabel: string;
20
+ legalNavLabel: string;
21
+ copyrightText: string;
22
+ disclaimer: string[];
23
+ }
24
+ interface FooterProps {
25
+ brandWordmarkSrc: string;
26
+ columns: FooterLinkGroup[];
27
+ content: FooterContent;
28
+ forceDocumentNavigation?: boolean;
29
+ legalLinks: FooterLegalLinkItem[];
30
+ onOpenCookiePreferences: () => void;
31
+ waitlistSlot?: ((legalMeta: React.ReactNode | undefined) => React.ReactNode) | undefined;
32
+ }
33
+ export declare function Footer({ brandWordmarkSrc, columns, content, forceDocumentNavigation, legalLinks, onOpenCookiePreferences, waitlistSlot, }: FooterProps): React.JSX.Element;
34
+ export {};
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment, useEffect, useState } from 'react';
3
+ import { LocaleSelector } from '../LocaleSelector/index.js';
4
+ import { buildLocalizedPath } from '../locale/routes.js';
5
+ import { useCurrentLocale } from '../locale/hooks.js';
6
+ import { desktopViewportQuery } from '../tokens.js';
7
+ import { FooterColumn, FooterColumnHeading, FooterContainer, FooterCopyright, FooterColumnsGrid, FooterDesktopLocaleSlot, FooterDisclaimer, FooterDisclaimerStack, FooterGrid, FooterLegalButton, FooterLegalDivider, FooterLegalLink as FooterLegalLinkStyled, FooterLegalMeta, FooterLegalNav, FooterLegalText, FooterLocaleSlot, FooterLink as FooterLinkStyled, FooterLinkList, FooterMobileCopyright, FooterMobileDivider, FooterMobileLegalDividerTrack, FooterMobileLegalMeta, FooterMobileLegalNav, FooterShell, FooterWaitlistSlot, FooterWordmark, FooterWordmarkImage, } from './styles.js';
8
+ const buildFooterHref = (target, locale, localize = true) => {
9
+ if (target.startsWith('/') && localize) {
10
+ return buildLocalizedPath(target, locale);
11
+ }
12
+ return target;
13
+ };
14
+ const getExternalLinkProps = (external) => {
15
+ if (!external) {
16
+ return {};
17
+ }
18
+ return { target: '_blank', rel: 'noreferrer' };
19
+ };
20
+ export function Footer({ brandWordmarkSrc, columns, content, forceDocumentNavigation = false, legalLinks, onOpenCookiePreferences, waitlistSlot, }) {
21
+ const locale = useCurrentLocale();
22
+ const [isDesktopFooterLayout, setIsDesktopFooterLayout] = useState(true);
23
+ useEffect(() => {
24
+ const desktopMediaQuery = window.matchMedia(desktopViewportQuery);
25
+ const handleChange = (event) => {
26
+ setIsDesktopFooterLayout(event.matches);
27
+ };
28
+ setIsDesktopFooterLayout(desktopMediaQuery.matches);
29
+ desktopMediaQuery.addEventListener('change', handleChange);
30
+ return () => {
31
+ desktopMediaQuery.removeEventListener('change', handleChange);
32
+ };
33
+ }, []);
34
+ const renderFooterLink = (link) => {
35
+ return (_jsx(FooterLinkStyled, { href: buildFooterHref(link.target, locale, link.localizeTarget ?? true), ...getExternalLinkProps(link.external), children: _jsx("span", { children: link.label }) }, link.target));
36
+ };
37
+ const renderLegalLink = (link) => {
38
+ if (link.isCookiePreferences) {
39
+ return (_jsx(FooterLegalButton, { id: "ot-sdk-btn", className: "ot-sdk-show-settings", type: "button", onClick: onOpenCookiePreferences, children: link.label }));
40
+ }
41
+ if (link.disabled) {
42
+ return _jsx(FooterLegalText, { "aria-disabled": "true", children: link.label });
43
+ }
44
+ return (_jsx(FooterLegalLinkStyled, { href: buildFooterHref(link.target, locale), ...getExternalLinkProps(link.external), children: link.label }));
45
+ };
46
+ const legalMeta = isDesktopFooterLayout ? (_jsxs(FooterLegalMeta, { children: [_jsx(FooterCopyright, { children: content.copyrightText }), _jsx(FooterLegalNav, { "aria-label": content.legalNavLabel, children: legalLinks.map((link, index) => (_jsxs("span", { children: [index > 0 ? _jsx(FooterLegalDivider, { "aria-hidden": "true" }) : null, renderLegalLink(link)] }, link.target))) })] })) : undefined;
47
+ return (_jsx(FooterShell, { children: _jsxs(FooterContainer, { children: [_jsxs(FooterGrid, { children: [_jsx(FooterWaitlistSlot, { children: waitlistSlot?.(legalMeta) }), _jsx(FooterMobileDivider, { "aria-hidden": "true" }), _jsxs(FooterColumnsGrid, { children: [columns.map((group) => (_jsxs(FooterColumn, { children: [_jsx(FooterColumnHeading, { children: group.group }), _jsx(FooterLinkList, { children: group.links.map((link) => renderFooterLink(link)) })] }, group.group))), _jsxs(FooterDisclaimerStack, { children: [isDesktopFooterLayout ? (_jsx(FooterDesktopLocaleSlot, { children: _jsx(LocaleSelector, { ariaLabel: content.localeSelectorAriaLabel, forceDocumentNavigation: forceDocumentNavigation }) })) : null, _jsx(FooterDisclaimer, { children: content.disclaimer.map((paragraph) => (_jsx("p", { children: paragraph }, paragraph))) })] })] }), !isDesktopFooterLayout ? (_jsxs(FooterMobileLegalMeta, { children: [_jsx(FooterLocaleSlot, { children: _jsx(LocaleSelector, { ariaLabel: content.localeSelectorAriaLabel, forceDocumentNavigation: forceDocumentNavigation }) }), _jsx(FooterMobileCopyright, { children: content.copyrightText }), _jsx(FooterMobileLegalNav, { "aria-label": content.legalNavLabel, children: legalLinks.map((link, index) => (_jsxs(Fragment, { children: [index > 0 ? (_jsx(FooterMobileLegalDividerTrack, { children: _jsx(FooterLegalDivider, { "aria-hidden": "true" }) })) : null, renderLegalLink(link)] }, link.target))) })] })) : null] }), _jsx(FooterWordmark, { "aria-hidden": "true", children: _jsx(FooterWordmarkImage, { src: brandWordmarkSrc, alt: "" }) })] }) }));
48
+ }
@@ -0,0 +1,97 @@
1
+ export declare const FooterShell: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
2
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
3
+ }> & string;
4
+ export declare const FooterContainer: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
5
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
6
+ }> & string;
7
+ export declare const FooterGrid: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
8
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
9
+ }> & string;
10
+ export declare const FooterWaitlistSlot: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
11
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
12
+ }> & string;
13
+ export declare const FooterMobileDivider: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
14
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
15
+ }> & string;
16
+ export declare const FooterColumnsGrid: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
17
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
18
+ }> & string;
19
+ export declare const FooterDisclaimerStack: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
20
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
21
+ }> & string;
22
+ export declare const FooterDesktopLocaleSlot: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
23
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
24
+ }> & string;
25
+ export declare const FooterDisclaimer: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
26
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
27
+ }> & string;
28
+ export declare const FooterCopyright: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "style"> & {
29
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
30
+ }> & string;
31
+ export declare const FooterColumn: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
32
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
33
+ }> & string;
34
+ export declare const FooterColumnHeading: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, "style"> & {
35
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
36
+ }> & string;
37
+ export declare const FooterLinkList: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
38
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
39
+ }> & string;
40
+ export declare const FooterLink: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "style"> & {
41
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
42
+ }> & string;
43
+ export declare const FooterLegalMeta: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
44
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
45
+ }> & string;
46
+ export declare const FooterLocaleSlot: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
47
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
48
+ }> & string;
49
+ export declare const FooterLegalNav: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
50
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
51
+ }> & string;
52
+ export declare const FooterLegalLink: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "style"> & {
53
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
54
+ }> & string;
55
+ export declare const FooterLegalButton: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "style"> & {
56
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
57
+ }> & string;
58
+ export declare const FooterLegalText: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
59
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
60
+ }> & string;
61
+ export declare const FooterLegalDivider: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
62
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
63
+ }> & string;
64
+ export declare const FooterMobileLegalMeta: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
65
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
66
+ }> & string;
67
+ export declare const FooterMobileCopyright: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("styled-components").FastOmit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "style"> & {
68
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
69
+ }, "as" | "forwardedAs"> & {
70
+ as?: import("styled-components").WebTarget | undefined;
71
+ forwardedAs?: import("styled-components").WebTarget | undefined;
72
+ }, "style"> & {
73
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | (import("react").CSSProperties & {
74
+ [key: `--${string}`]: string | number | undefined;
75
+ }) | undefined;
76
+ }> & string;
77
+ export declare const FooterMobileLegalDividerTrack: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
78
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
79
+ }> & string;
80
+ export declare const FooterMobileLegalNav: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("styled-components").FastOmit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
81
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
82
+ }, "as" | "forwardedAs"> & {
83
+ as?: import("styled-components").WebTarget | undefined;
84
+ forwardedAs?: import("styled-components").WebTarget | undefined;
85
+ }, "style"> & {
86
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | (import("react").CSSProperties & {
87
+ [key: `--${string}`]: string | number | undefined;
88
+ }) | undefined;
89
+ }> & string;
90
+ export declare const FooterWordmark: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
91
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
92
+ }> & string;
93
+ export declare const FooterWordmarkImage: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<Omit<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "style"> & {
94
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
95
+ }, "property" | "title" | "slot" | "style" | "dir" | "content" | "rel" | "ref" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "draggable" | "enterKeyHint" | "hidden" | "id" | "lang" | "nonce" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "resource" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "popover" | "popoverTargetAction" | "popoverTarget" | "inert" | "inputMode" | "is" | "exportparts" | "part" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onScrollEnd" | "onScrollEndCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onToggle" | "onBeforeToggle" | "onTransitionCancel" | "onTransitionCancelCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "onTransitionRun" | "onTransitionRunCapture" | "onTransitionStart" | "onTransitionStartCapture" | "referrerPolicy" | "alt" | "crossOrigin" | "decoding" | "fetchPriority" | "height" | "loading" | "sizes" | "src" | "srcSet" | "useMap" | "width"> & Partial<Pick<Omit<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "style"> & {
96
+ style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
97
+ }, "property" | "title" | "slot" | "style" | "dir" | "content" | "rel" | "ref" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "draggable" | "enterKeyHint" | "hidden" | "id" | "lang" | "nonce" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "resource" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "popover" | "popoverTargetAction" | "popoverTarget" | "inert" | "inputMode" | "is" | "exportparts" | "part" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onScrollEnd" | "onScrollEndCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onToggle" | "onBeforeToggle" | "onTransitionCancel" | "onTransitionCancelCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "onTransitionRun" | "onTransitionRunCapture" | "onTransitionStart" | "onTransitionStartCapture" | "referrerPolicy" | "alt" | "crossOrigin" | "decoding" | "fetchPriority" | "height" | "loading" | "sizes" | "src" | "srcSet" | "useMap" | "width">>> & string;
@@ -0,0 +1,326 @@
1
+ import styled from 'styled-components';
2
+ export const FooterShell = styled.footer `
3
+ position: relative;
4
+ z-index: 1;
5
+ background: ${({ theme }) => theme.colors.brandSky};
6
+ color: ${({ theme }) => theme.colors.ink};
7
+ padding: 64px 0 0;
8
+ overflow: visible;
9
+
10
+ ${({ theme }) => theme.mediaQueries.lg} {
11
+ padding: 56px 0 0;
12
+ }
13
+ `;
14
+ export const FooterContainer = styled.div `
15
+ width: min(
16
+ calc(100% - (2 * ${({ theme }) => theme.layout.pagePaddingInline})),
17
+ ${({ theme }) => theme.layout.landingWideWidth}
18
+ );
19
+ margin: 0 auto;
20
+
21
+ ${({ theme }) => theme.mediaQueries.lg} {
22
+ width: min(calc(100% - (2 * ${({ theme }) => theme.layout.pagePaddingInlineWide})), 1209px);
23
+ margin: 0 auto;
24
+ }
25
+ `;
26
+ export const FooterGrid = styled.div `
27
+ display: grid;
28
+ grid-template-columns: minmax(0, 1fr);
29
+ grid-template-areas:
30
+ 'waitlist'
31
+ 'divider'
32
+ 'columns'
33
+ 'mobileLegal';
34
+ row-gap: 40px;
35
+ align-items: start;
36
+
37
+ ${({ theme }) => theme.mediaQueries.lg} {
38
+ grid-template-columns: minmax(0, 1fr) minmax(320px, 0.92fr);
39
+ grid-template-areas: 'waitlist columns';
40
+ column-gap: clamp(24px, 3vw, 69px);
41
+ row-gap: 40px;
42
+ }
43
+ `;
44
+ export const FooterWaitlistSlot = styled.div `
45
+ display: grid;
46
+ gap: 28px;
47
+ min-width: 0;
48
+ grid-area: waitlist;
49
+
50
+ ${({ theme }) => theme.mediaQueries.lg} {
51
+ align-self: start;
52
+ }
53
+ `;
54
+ export const FooterMobileDivider = styled.div `
55
+ grid-area: divider;
56
+ width: 100%;
57
+ height: 1px;
58
+ background: ${({ theme }) => theme.colors.footerDivider};
59
+
60
+ ${({ theme }) => theme.mediaQueries.lg} {
61
+ display: none;
62
+ }
63
+ `;
64
+ export const FooterColumnsGrid = styled.div `
65
+ display: grid;
66
+ gap: 24px;
67
+ grid-area: columns;
68
+
69
+ ${({ theme }) => theme.mediaQueries.lg} {
70
+ align-self: start;
71
+ grid-template-columns: max-content max-content minmax(0, 1fr);
72
+ column-gap: clamp(32px, 5vw, 63px);
73
+ row-gap: 34px;
74
+ }
75
+ `;
76
+ export const FooterDisclaimerStack = styled.div `
77
+ display: grid;
78
+ gap: 16px;
79
+
80
+ ${({ theme }) => theme.mediaQueries.lg} {
81
+ grid-column: 1 / -1;
82
+ width: min(100%, 487px);
83
+ margin-top: clamp(40px, 6vw, 84px);
84
+ }
85
+ `;
86
+ export const FooterDesktopLocaleSlot = styled.div `
87
+ width: 197px;
88
+ `;
89
+ export const FooterDisclaimer = styled.div `
90
+ display: grid;
91
+ gap: 14px;
92
+ width: 100%;
93
+ margin-top: 10px;
94
+ box-sizing: border-box;
95
+ color: ${({ theme }) => theme.colors.footerTextMuted};
96
+ font-size: 0.75rem;
97
+ font-weight: ${({ theme }) => theme.fontWeight.default};
98
+ line-height: 1.1667;
99
+
100
+ p {
101
+ margin: 0;
102
+ }
103
+
104
+ ${({ theme }) => theme.mediaQueries.lg} {
105
+ margin-top: 0;
106
+ }
107
+ `;
108
+ export const FooterCopyright = styled.p `
109
+ margin: 0;
110
+ color: ${({ theme }) => theme.colors.footerTextMuted};
111
+ font-size: 0.6875rem;
112
+ font-weight: ${({ theme }) => theme.fontWeight.default};
113
+ line-height: 1.2727;
114
+
115
+ ${({ theme }) => theme.mediaQueries.lg} {
116
+ font-size: 0.75rem;
117
+ line-height: 1.3333;
118
+ white-space: nowrap;
119
+ }
120
+ `;
121
+ export const FooterColumn = styled.section `
122
+ display: grid;
123
+ gap: 8px;
124
+ align-content: start;
125
+
126
+ ${({ theme }) => theme.mediaQueries.lg} {
127
+ gap: 4px;
128
+ }
129
+ `;
130
+ export const FooterColumnHeading = styled.h3 `
131
+ margin: 0;
132
+ font-size: 1rem;
133
+ font-weight: ${({ theme }) => theme.fontWeight.bold};
134
+ line-height: 1.2;
135
+
136
+ ${({ theme }) => theme.mediaQueries.lg} {
137
+ font-size: 1.5rem;
138
+ line-height: 2;
139
+ }
140
+ `;
141
+ export const FooterLinkList = styled.div `
142
+ display: grid;
143
+ gap: 8px;
144
+
145
+ ${({ theme }) => theme.mediaQueries.lg} {
146
+ gap: 2px;
147
+ }
148
+ `;
149
+ export const FooterLink = styled.a `
150
+ display: inline-flex;
151
+ align-items: center;
152
+ gap: 8px;
153
+ width: fit-content;
154
+ color: ${({ theme }) => theme.colors.ink};
155
+ font-size: 0.875rem;
156
+ font-weight: ${({ theme }) => theme.fontWeight.medium};
157
+ line-height: 1.5;
158
+ text-decoration: none;
159
+ transition: opacity ${({ theme }) => theme.motion.duration.fast}
160
+ ${({ theme }) => theme.motion.easing.standard};
161
+
162
+ &:hover {
163
+ opacity: 0.68;
164
+ }
165
+
166
+ ${({ theme }) => theme.mediaQueries.lg} {
167
+ font-size: ${({ theme }) => theme.typography.fontSize.body};
168
+ }
169
+ `;
170
+ export const FooterLegalMeta = styled.div `
171
+ display: flex;
172
+ flex-wrap: wrap;
173
+ align-items: center;
174
+ gap: 12px;
175
+
176
+ ${({ theme }) => theme.mediaQueries.lg} {
177
+ gap: 10px 12px;
178
+ }
179
+ `;
180
+ export const FooterLocaleSlot = styled.div `
181
+ width: 100%;
182
+
183
+ ${({ theme }) => theme.mediaQueries.lg} {
184
+ width: auto;
185
+ }
186
+ `;
187
+ export const FooterLegalNav = styled.nav `
188
+ display: flex;
189
+ flex-wrap: wrap;
190
+ align-items: center;
191
+ gap: 12px;
192
+
193
+ > span {
194
+ display: inline-flex;
195
+ align-items: center;
196
+ flex-wrap: wrap;
197
+ gap: 12px;
198
+ }
199
+
200
+ ${({ theme }) => theme.mediaQueries.lg} {
201
+ gap: 10px 12px;
202
+
203
+ > span {
204
+ gap: 10px 12px;
205
+ }
206
+ }
207
+ `;
208
+ export const FooterLegalLink = styled.a `
209
+ color: ${({ theme }) => theme.colors.footerTextMuted};
210
+ font-size: 0.6875rem;
211
+ font-weight: ${({ theme }) => theme.fontWeight.default};
212
+ line-height: 1.2727;
213
+ text-decoration: none;
214
+ white-space: nowrap;
215
+
216
+ &:hover {
217
+ text-decoration: underline;
218
+ }
219
+
220
+ ${({ theme }) => theme.mediaQueries.lg} {
221
+ font-size: 0.75rem;
222
+ line-height: 1.3333;
223
+ }
224
+ `;
225
+ export const FooterLegalButton = styled.button `
226
+ display: inline !important;
227
+ min-width: 0 !important;
228
+ min-height: 0 !important;
229
+ padding: 0 !important;
230
+ border: 0 !important;
231
+ background: transparent !important;
232
+ color: ${({ theme }) => theme.colors.footerTextMuted} !important;
233
+ cursor: pointer;
234
+ font: inherit;
235
+ font-size: 0.6875rem !important;
236
+ font-weight: ${({ theme }) => theme.fontWeight.default} !important;
237
+ line-height: 1.2727 !important;
238
+ text-decoration: none !important;
239
+ white-space: nowrap !important;
240
+
241
+ &:hover {
242
+ background: transparent !important;
243
+ color: ${({ theme }) => theme.colors.footerTextMuted} !important;
244
+ text-decoration: underline !important;
245
+ }
246
+
247
+ &:focus-visible {
248
+ outline: 2px solid ${({ theme }) => theme.colors.focusRing};
249
+ outline-offset: 2px;
250
+ }
251
+
252
+ ${({ theme }) => theme.mediaQueries.lg} {
253
+ font-size: 0.75rem !important;
254
+ line-height: 1.3333 !important;
255
+ }
256
+ `;
257
+ export const FooterLegalText = styled.span `
258
+ color: ${({ theme }) => theme.colors.footerTextMuted};
259
+ font-size: 0.6875rem;
260
+ font-weight: ${({ theme }) => theme.fontWeight.default};
261
+ line-height: 1.2727;
262
+ opacity: 0.6;
263
+ white-space: nowrap;
264
+
265
+ ${({ theme }) => theme.mediaQueries.lg} {
266
+ font-size: 0.75rem;
267
+ line-height: 1.3333;
268
+ }
269
+ `;
270
+ export const FooterLegalDivider = styled.span `
271
+ width: 1px;
272
+ height: 18px;
273
+ background: ${({ theme }) => theme.colors.footerDivider};
274
+ `;
275
+ export const FooterMobileLegalMeta = styled.div `
276
+ grid-area: mobileLegal;
277
+ display: grid;
278
+ gap: 14px;
279
+ width: 100%;
280
+
281
+ ${({ theme }) => theme.mediaQueries.lg} {
282
+ display: none;
283
+ }
284
+ `;
285
+ export const FooterMobileCopyright = styled(FooterCopyright) `
286
+ max-width: none;
287
+ `;
288
+ export const FooterMobileLegalDividerTrack = styled.div `
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ width: 1px;
293
+ height: 18px;
294
+ `;
295
+ export const FooterMobileLegalNav = styled(FooterLegalNav) `
296
+ display: flex;
297
+ flex-wrap: wrap;
298
+ gap: 10px 12px;
299
+ `;
300
+ export const FooterWordmark = styled.div `
301
+ margin-top: 28px;
302
+ pointer-events: none;
303
+ width: calc(100% + (2 * ${({ theme }) => theme.layout.pagePaddingInline}));
304
+ margin-left: calc(-1 * ${({ theme }) => theme.layout.pagePaddingInline});
305
+ max-height: 79px;
306
+ overflow: clip;
307
+ opacity: 0.18;
308
+
309
+ ${({ theme }) => theme.mediaQueries.lg} {
310
+ margin-top: 28px;
311
+ width: 100%;
312
+ margin-left: 0;
313
+ max-height: 132px;
314
+ }
315
+ `;
316
+ export const FooterWordmarkImage = styled.img.attrs({
317
+ decoding: 'async',
318
+ fetchPriority: 'low',
319
+ loading: 'lazy',
320
+ }) `
321
+ display: block;
322
+ width: 100%;
323
+ aspect-ratio: 179 / 31;
324
+ height: auto;
325
+ object-fit: contain;
326
+ `;
@@ -0,0 +1,17 @@
1
+ import type { HeaderPresentationVariant } from './index.js';
2
+ export interface NavDropdownItem {
3
+ key: string;
4
+ label: string;
5
+ href: string;
6
+ ariaLabel?: string | undefined;
7
+ external?: boolean | undefined;
8
+ onClick?: ((event: React.MouseEvent<HTMLAnchorElement>) => void) | undefined;
9
+ }
10
+ interface NavDropdownProps {
11
+ label: string;
12
+ items: NavDropdownItem[];
13
+ variant: HeaderPresentationVariant;
14
+ contrast?: boolean | undefined;
15
+ }
16
+ export declare function NavDropdown({ label, items, variant, contrast, }: NavDropdownProps): React.JSX.Element;
17
+ export {};
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { useLocation } from 'react-router-dom';
4
+ import { NavDropdown as NavDropdownRoot, NavDropdownChevron, NavDropdownLabel, NavDropdownList, NavDropdownMenu, NavDropdownOption, NavDropdownTrigger, } from './styles.js';
5
+ const buildMenuId = (label) => `header-nav-dropdown-${label.toLowerCase().replace(/\s+/gu, '-')}`;
6
+ export function NavDropdown({ label, items, variant, contrast, }) {
7
+ const [isOpen, setIsOpen] = useState(false);
8
+ const rootRef = useRef(null);
9
+ const location = useLocation();
10
+ const menuId = buildMenuId(label);
11
+ useEffect(() => {
12
+ setIsOpen(false);
13
+ }, [location.pathname, location.hash]);
14
+ useEffect(() => {
15
+ if (!isOpen)
16
+ return;
17
+ const handlePointerDown = (event) => {
18
+ if (event.target instanceof Node && rootRef.current?.contains(event.target)) {
19
+ return;
20
+ }
21
+ setIsOpen(false);
22
+ };
23
+ const handleKeyDown = (event) => {
24
+ if (event.key === 'Escape') {
25
+ setIsOpen(false);
26
+ }
27
+ };
28
+ document.addEventListener('pointerdown', handlePointerDown);
29
+ document.addEventListener('keydown', handleKeyDown);
30
+ return () => {
31
+ document.removeEventListener('pointerdown', handlePointerDown);
32
+ document.removeEventListener('keydown', handleKeyDown);
33
+ };
34
+ }, [isOpen]);
35
+ return (_jsxs(NavDropdownRoot, { ref: rootRef, onMouseEnter: () => setIsOpen(true), onMouseLeave: () => setIsOpen(false), children: [_jsxs(NavDropdownTrigger, { type: "button", "$variant": variant, "$contrast": contrast, "aria-haspopup": "menu", "aria-expanded": isOpen, "aria-controls": menuId, onClick: () => setIsOpen((currentValue) => !currentValue), children: [_jsx(NavDropdownLabel, { "$contrast": contrast, children: label }), _jsx(NavDropdownChevron, { "$open": isOpen, "aria-hidden": "true" })] }), _jsx(NavDropdownMenu, { "$open": isOpen, id: menuId, role: "menu", "aria-label": label, children: _jsx(NavDropdownList, { children: items.map((item) => (_jsx(NavDropdownOption, { role: "menuitem", href: item.href, "aria-label": item.ariaLabel, onClick: (event) => {
36
+ setIsOpen(false);
37
+ item.onClick?.(event);
38
+ }, ...(item.external ? { target: '_blank', rel: 'noreferrer' } : {}), children: item.label }, item.key))) }) })] }));
39
+ }
@@ -0,0 +1 @@
1
+ export declare const normalizePathname: (pathname: string) => string;