tenara-ui-components 0.3.51 → 0.3.52
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/dist/components/atoms/RichText/EnhancedRichText.d.ts +29 -0
- package/dist/components/atoms/RichText/EnhancedRichText.d.ts.map +1 -0
- package/dist/components/atoms/RichText/index.d.ts +4 -0
- package/dist/components/atoms/RichText/index.d.ts.map +1 -1
- package/dist/components/atoms/RichText/replacers/index.d.ts +4 -0
- package/dist/components/atoms/RichText/replacers/index.d.ts.map +1 -0
- package/dist/components/atoms/RichText/replacers/types.d.ts +11 -0
- package/dist/components/atoms/RichText/replacers/types.d.ts.map +1 -0
- package/dist/components/atoms/RichText/replacers/videoReplacer.d.ts +20 -0
- package/dist/components/atoms/RichText/replacers/videoReplacer.d.ts.map +1 -0
- package/dist/components/index.d.ts +6 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/molecules/primax/SideBar/SideBar.d.ts +4 -0
- package/dist/components/molecules/primax/SideBar/SideBar.d.ts.map +1 -1
- package/dist/components/pages/primax/IndividualPost/IndividualPost.d.ts +45 -0
- package/dist/components/pages/primax/IndividualPost/IndividualPost.d.ts.map +1 -0
- package/dist/components/pages/primax/IndividualPost/index.d.ts +3 -0
- package/dist/components/pages/primax/IndividualPost/index.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/themes/presets/primax.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/components/pages/Page.d.ts +0 -4
- package/dist/components/pages/Page.d.ts.map +0 -1
- package/dist/components/pages/index.d.ts +0 -2
- package/dist/components/pages/index.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/components/atoms/Button/buttonIcons.tsx","../src/themes/presets/color-systems/default-colors.ts","../src/themes/presets/default.ts","../src/themes/utils/helpers.ts","../src/themes/utils/generator.ts","../src/themes/core/context.tsx","../src/themes/core/client-provider.tsx","../src/components/atoms/Button/Button.tsx","../src/components/atoms/ButtonLink/ButtonLink.tsx","../src/components/atoms/TextLink/TextLink.tsx","../src/components/atoms/BackgroundMedia/BackgroundMedia.tsx","../src/components/atoms/Media/Media.tsx","../src/components/atoms/Breadcrumb/Breadcrumb.tsx","../src/components/atoms/Divider/Divider.tsx","../src/components/atoms/Container/Container.tsx","../src/components/atoms/Heading/Heading.tsx","../src/components/atoms/Grid/Grid.tsx","../src/components/atoms/Icon/Icon.tsx","../src/components/atoms/RichText/RichText.tsx","../src/components/atoms/Paragraph/Paragraph.tsx","../src/components/atoms/BulletList/BulletList.tsx","../src/components/atoms/FilterPill/FilterPill.tsx","../src/components/molecules/AssetMeta/AssetMeta.tsx","../src/components/atoms/Image/Image.tsx","../src/components/molecules/Accordion/Accordion.tsx","../src/components/molecules/Header/Header.tsx","../src/components/molecules/VideoPlayer/VideoPlayer.tsx","../src/components/molecules/primax/MediaBlock/MediaBlock.tsx","../src/assets/sparkle-overlay.svg","../src/assets/spark-small-sparks.svg","../src/assets/spark-icon-large.svg","../src/assets/spark-icon-small.svg","../src/components/molecules/primax/Banner/Banner.tsx","../src/components/atoms/TextInput/TextInput.tsx","../src/components/atoms/Dropdown/Dropdown.tsx","../src/components/atoms/Checkbox/Checkbox.tsx","../src/components/molecules/primax/DropdownSelect/DropdownSelect.tsx","../src/components/molecules/primax/Form/Form.tsx","../src/components/molecules/primax/Subscribe/Subscribe.tsx","../src/components/molecules/primax/TwoColumn/TwoColumn.tsx","../src/components/molecules/primax/Card/Card.tsx","../src/components/molecules/primax/IconListItem/IconListItem.tsx","../src/components/molecules/primax/IconBulletList/IconBulletList.tsx","../src/components/molecules/primax/OverflowMediaSection/OverflowMediaSection.tsx","../src/components/molecules/primax/IconBulletSection/IconBulletSection.tsx","../src/components/molecules/primax/PostFeed/PostItem.tsx","../src/components/molecules/primax/Accordion/Accordion.tsx","../src/components/molecules/primax/Footer/Footer.tsx","../src/components/molecules/primax/HeaderNav/HeaderNavGroup.tsx","../src/components/molecules/primax/HeaderNav/HeaderOverlay.tsx","../src/components/molecules/primax/HeaderNav/HeaderMobileNav.tsx","../src/components/molecules/primax/HeaderNav/HeaderNav.tsx","../src/components/molecules/advisors-plus/Footer/Footer.tsx","../src/components/molecules/advisors-plus/TestimonialCard/TestimonialCard.tsx","../src/components/atoms/DataDial/DataDial.tsx","../src/components/atoms/StatPill/StatPill.tsx","../src/components/molecules/PercentDialCard/PercentDialCard.tsx","../src/assets/testimonial-standalone-bg.png","../src/components/molecules/advisors-plus/PercentDialCards/PercentDialCards.tsx","../src/components/atoms/Pagination/Pagination.tsx","../src/components/molecules/Carousel/Carousel.tsx","../src/themes/presets/color-systems/advisors-plus-colors.ts","../src/themes/presets/advisors-plus.ts","../src/themes/presets/color-systems/primax-colors.ts","../src/themes/presets/primax.ts","../src/assets/primax-logo-dark.svg","../src/assets/primax-logo-light.svg","../src/themes/hooks/useColorTokens.ts","../src/components/molecules/advisors-plus/TeamCard/TeamCard.tsx","../src/components/atoms/AlertBanner/AlertBanner.tsx","../src/components/atoms/Author/Author.tsx","../src/components/molecules/primax/CTA/CTA.tsx","../src/components/atoms/Blockquote/Blockquote.tsx","../src/components/molecules/CTA/CTA.tsx","../src/components/molecules/Card/Card.tsx","../src/components/molecules/primax/FilterSection/FilterSection.tsx","../src/components/atoms/Footnote/Footnote.tsx","../src/components/molecules/primax/HalfColumn/HalfColumn.tsx","../src/components/molecules/Modal/Modal.tsx","../src/components/pages/Page.tsx","../src/components/atoms/PlayButton/PlayButton.tsx","../src/components/molecules/primax/PlayIcon/PlayIcon.tsx","../src/components/molecules/primax/PostFeed/PostFeed.tsx","../src/components/molecules/primax/SearchResults/SearchResults.tsx","../src/components/molecules/primax/SideBar/SideBar.tsx","../src/components/molecules/primax/VideoSection/VideoSection.tsx"],"sourcesContent":["/**\n * Button icon configuration\n * Maps button types to their default icons with hover states\n */\n\nimport React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faAnglesRight,\n faArrowRight,\n faCirclePlay as faCirclePlaySolid,\n faEnvelope as faEnvelopeSolid,\n faPlay,\n faDownload,\n type IconDefinition,\n} from '@fortawesome/free-solid-svg-icons';\n\nimport { faSparkle, faSparkles } from '@fortawesome/pro-solid-svg-icons';\nimport {\n faCirclePlay as faCirclePlayRegular,\n faEnvelope as faEnvelopeRegular,\n} from '@fortawesome/free-regular-svg-icons';\nimport { faXTwitter, faLinkedin, faSquareFacebook } from '@fortawesome/free-brands-svg-icons';\nimport { ButtonType } from './Button';\n\nconst iconRegistry: Record<string, IconDefinition> = {\n 'arrow-right': faArrowRight,\n 'circle-play': faCirclePlaySolid,\n play: faPlay,\n download: faDownload,\n};\n\nexport function resolveIcon(icon: string | React.ReactNode): React.ReactNode {\n if (typeof icon === 'string') {\n const iconDef = iconRegistry[icon];\n return iconDef ? <FontAwesomeIcon icon={iconDef} /> : null;\n }\n return icon;\n}\n\ninterface ButtonIconConfig {\n regular: React.ReactNode;\n hover?: React.ReactNode;\n}\n\n/**\n * Default icon configuration for each button type\n */\nexport const defaultButtonIcons: Partial<Record<ButtonType, ButtonIconConfig>> = {\n video: {\n regular: <FontAwesomeIcon icon={faCirclePlayRegular} />,\n hover: <FontAwesomeIcon icon={faCirclePlaySolid} />,\n },\n subscribe: {\n regular: <FontAwesomeIcon icon={faEnvelopeRegular} />,\n hover: <FontAwesomeIcon icon={faEnvelopeSolid} />,\n },\n cta: {\n regular: <FontAwesomeIcon icon={faAnglesRight} />,\n },\n twitter: {\n regular: <FontAwesomeIcon icon={faXTwitter} />,\n },\n linkedin: {\n regular: <FontAwesomeIcon icon={faLinkedin} />,\n },\n facebook: {\n regular: <FontAwesomeIcon icon={faSquareFacebook} />,\n },\n};\n\n/**\n * Get icon configuration for a button type\n * @param buttonType - The button variant type\n * @param customIcon - Custom icon override\n * @param customHoverIcon - Custom hover icon override\n * @param themeName - Current theme name for theme-specific icons\n */\nexport function getButtonIcon(\n buttonType: ButtonType,\n customIcon?: React.ReactNode,\n customHoverIcon?: React.ReactNode,\n themeName?: string\n): ButtonIconConfig | null {\n // Custom icons take precedence\n if (customIcon) {\n return {\n regular: customIcon,\n hover: customHoverIcon,\n };\n }\n\n // Theme-specific icons for Primax\n if (themeName === 'primax') {\n if (\n buttonType === 'general' ||\n buttonType === 'secondary' ||\n buttonType === 'link' ||\n buttonType === 'danger' ||\n buttonType === 'generalDark' ||\n buttonType === 'secondaryDark'\n ) {\n return {\n regular: <FontAwesomeIcon icon={faSparkle} />,\n hover: <FontAwesomeIcon icon={faSparkles} />,\n };\n }\n }\n\n // Return default icon for button type\n return defaultButtonIcons[buttonType] || null;\n}\n","/**\n * Default color system implementation\n * Demonstrates the three-tier color abstraction with new naming convention\n */\n\nimport { ColorSystem } from '../../core/color-system';\n\nexport const defaultColorSystem: ColorSystem = {\n // ============================================================================\n // TIER 1: BASE COLORS\n // ============================================================================\n primitives: {\n // Blue scale (Cobalt brand color)\n 'color-blue-50': '#eff6ff',\n 'color-blue-100': '#dbeafe',\n 'color-blue-200': '#bfdbfe',\n 'color-blue-300': '#93c5fd',\n 'color-blue-400': '#60a5fa',\n 'color-blue-500': '#2e6bf0', // Primary brand blue\n 'color-blue-600': '#1e40af',\n 'color-blue-700': '#1e3a8a',\n 'color-blue-800': '#1e3a8a',\n 'color-blue-900': '#1e293b',\n\n // Yellow/Gold scale (Accent color)\n 'color-yellow-50': '#fefce8',\n 'color-yellow-100': '#fef9c3',\n 'color-yellow-200': '#fef08a',\n 'color-yellow-300': '#fde047',\n 'color-yellow-400': '#efe63f', // Primary gold\n 'color-yellow-500': '#eab308',\n 'color-yellow-600': '#ca8a04',\n 'color-yellow-700': '#a16207',\n 'color-yellow-800': '#854d0e',\n 'color-yellow-900': '#713f12',\n\n // Purple scale\n 'color-purple-50': '#faf5ff',\n 'color-purple-100': '#f3e8ff',\n 'color-purple-200': '#e9d5ff',\n 'color-purple-300': '#d8b4fe',\n 'color-purple-400': '#c084fc',\n 'color-purple-500': '#a855f7',\n 'color-purple-600': '#9333ea',\n 'color-purple-700': '#7e22ce',\n 'color-purple-800': '#3d2589', // Dark purple for CTA backgrounds\n 'color-purple-900': '#581c87',\n 'color-purple-950': '#091757',\n\n // Neutral/Gray scale\n 'color-neutral-50': '#f9fafb',\n 'color-neutral-100': '#f3f4f6',\n 'color-neutral-200': '#e5e7eb',\n 'color-neutral-300': '#d1d5db',\n 'color-neutral-400': '#9ca3af',\n 'color-neutral-500': '#6b7280',\n 'color-neutral-600': '#4b5563',\n 'color-neutral-700': '#374151',\n 'color-neutral-800': '#1f2937',\n 'color-neutral-900': '#111827',\n\n // Semantic colors\n 'color-success-50': '#f0fdf4',\n 'color-success-500': '#10b981',\n 'color-success-700': '#047857',\n 'color-alert-50': '#fef2f2',\n 'color-alert-500': '#ef4444',\n 'color-alert-700': '#b91c1c',\n 'color-warning-50': '#fefce8',\n 'color-warning-400': '#efe63f',\n 'color-warning-500': '#eab308',\n\n // Base\n 'color-white': '#ffffff',\n 'color-black': '#000000',\n },\n\n // ============================================================================\n // TIER 2: SEMANTIC COLOR TOKENS\n // ============================================================================\n semantic: {\n // Background colors\n 'tier1-theme-color-background-default-primary-default': 'var(--color-purple-800)',\n 'tier1-theme-color-background-default-primary-hover': 'var(--color-purple-950)',\n 'tier1-theme-color-background-default-primary-active': 'var(--color-purple-800)',\n 'tier1-theme-color-background-default-secondary-default': 'var(--color-neutral-50)',\n 'tier1-theme-color-background-default-secondary-hover': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-tertiary-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-tertiary-hover': 'var(--color-neutral-200)',\n 'tier1-theme-color-background-accent-primary-default': 'var(--color-yellow-400)',\n 'tier1-theme-color-background-accent-primary-hover': 'var(--color-yellow-500)',\n 'tier1-theme-color-background-accent-primary-active': 'var(--color-yellow-600)',\n 'tier1-theme-color-background-default-inverse-default': 'var(--color-neutral-900)',\n 'tier1-theme-color-background-utility-overlay-default': 'rgba(0, 0, 0, 0.5)',\n\n // Content (text) colors\n 'tier1-theme-color-content-title-primary-default': 'var(--color-purple-950)',\n 'tier1-theme-color-content-default-primary-default': 'var(--color-purple-950)',\n 'tier1-theme-color-content-default-secondary-default': 'var(--color-purple-800)',\n 'tier1-theme-color-content-default-tertiary-default': 'var(--color-neutral-500)',\n 'tier1-theme-color-content-default-inverse-default': 'var(--color-white)',\n 'tier1-theme-color-content-disabled-subtle-default': 'var(--color-neutral-400)',\n 'tier1-theme-color-content-accent-primary-default': 'var(--color-yellow-400)',\n 'tier1-theme-color-content-default-link-default': 'var(--color-blue-500)',\n 'tier1-theme-color-content-default-link-hover': 'var(--color-blue-600)',\n\n // Border colors\n 'tier1-theme-color-border-default-subtle-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-border-default-default-default': 'var(--color-neutral-200)',\n 'tier1-theme-color-border-default-strong-default': 'var(--color-neutral-300)',\n 'tier1-theme-color-border-focus-primary-focus': 'var(--color-blue-500)',\n\n // State colors\n 'tier1-theme-color-background-utility-success-default': 'var(--color-success-50)',\n 'tier1-theme-color-content-utility-success-default': 'var(--color-success-500)',\n 'tier1-theme-color-content-utility-success-hover': 'var(--color-success-700)',\n 'tier1-theme-color-background-utility-warning-default': 'var(--color-warning-50)',\n 'tier1-theme-color-content-utility-warning-default': 'var(--color-warning-500)',\n 'tier1-theme-color-content-utility-warning-hover': 'var(--color-warning-400)',\n 'tier1-theme-color-background-utility-error-default': 'var(--color-alert-50)',\n 'tier1-theme-color-content-utility-error-default': 'var(--color-alert-500)',\n 'tier1-theme-color-content-utility-error-hover': 'var(--color-alert-700)',\n 'tier1-theme-color-background-utility-info-default': 'var(--color-blue-50)',\n 'tier1-theme-color-content-utility-info-default': 'var(--color-blue-500)',\n 'tier1-theme-color-content-utility-info-hover': 'var(--color-blue-600)',\n\n // Interactive colors\n 'tier1-theme-color-background-default-interactive-default': 'var(--color-blue-500)',\n 'tier1-theme-color-background-default-interactive-hover': 'var(--color-blue-600)',\n 'tier1-theme-color-background-default-interactive-active': 'var(--color-blue-700)',\n 'tier1-theme-color-background-default-interactive-disabled': 'var(--color-neutral-300)',\n\n // Legacy semantic tokens for backward compatibility\n primary: 'var(--tier1-theme-color-background-default-primary-default)',\n primaryHover: 'var(--tier1-theme-color-background-default-primary-hover)',\n primaryActive: 'var(--tier1-theme-color-background-default-primary-active)',\n primaryText: 'var(--tier1-theme-color-content-default-inverse-default)',\n secondary: 'var(--color-blue-500)',\n secondaryHover: 'var(--color-blue-600)',\n secondaryActive: 'var(--color-blue-700)',\n secondaryText: 'var(--tier1-theme-color-content-default-inverse-default)',\n accent: 'var(--tier1-theme-color-background-accent-primary-default)',\n accentHover: 'var(--tier1-theme-color-background-accent-primary-hover)',\n accentActive: 'var(--tier1-theme-color-background-accent-primary-active)',\n accentText: 'var(--color-purple-950)',\n tertiary: 'var(--color-neutral-200)',\n tertiaryHover: 'var(--color-neutral-300)',\n tertiaryActive: 'var(--color-neutral-400)',\n tertiaryText: 'var(--color-purple-950)',\n textPrimary: 'var(--tier1-theme-color-content-default-primary-default)',\n textSecondary: 'var(--tier1-theme-color-content-default-secondary-default)',\n textAccent: 'var(--tier1-theme-color-content-accent-primary-default)',\n textTertiary: 'var(--tier1-theme-color-content-default-tertiary-default)',\n textInverse: 'var(--tier1-theme-color-content-default-inverse-default)',\n textDisabled: 'var(--tier1-theme-color-content-disabled-subtle-default)',\n textLink: 'var(--tier1-theme-color-content-default-link-default)',\n textLinkHover: 'var(--tier1-theme-color-content-default-link-hover)',\n bgPrimary: 'var(--tier1-theme-color-background-default-primary-default)',\n bgSecondary: 'var(--tier1-theme-color-background-default-secondary-default)',\n bgTertiary: 'var(--tier1-theme-color-background-default-tertiary-default)',\n bgInverse: 'var(--tier1-theme-color-background-default-inverse-default)',\n bgOverlay: 'var(--tier1-theme-color-background-utility-overlay-default)',\n borderDefault: 'var(--tier1-theme-color-border-default-default-default)',\n borderSubtle: 'var(--tier1-theme-color-border-default-subtle-default)',\n borderStrong: 'var(--tier1-theme-color-border-default-strong-default)',\n borderFocus: 'var(--tier1-theme-color-border-focus-primary-focus)',\n stateSuccess: 'var(--tier1-theme-color-content-utility-success-default)',\n stateSuccessHover: 'var(--tier1-theme-color-content-utility-success-hover)',\n stateSuccessBg: 'var(--tier1-theme-color-background-utility-success-default)',\n stateWarning: 'var(--tier1-theme-color-content-utility-warning-default)',\n stateWarningHover: 'var(--tier1-theme-color-content-utility-warning-hover)',\n stateWarningBg: 'var(--tier1-theme-color-background-utility-warning-default)',\n stateError: 'var(--tier1-theme-color-content-utility-error-default)',\n stateErrorHover: 'var(--tier1-theme-color-content-utility-error-hover)',\n stateErrorBg: 'var(--tier1-theme-color-background-utility-error-default)',\n stateInfo: 'var(--tier1-theme-color-content-utility-info-default)',\n stateInfoHover: 'var(--tier1-theme-color-content-utility-info-hover)',\n stateInfoBg: 'var(--tier1-theme-color-background-utility-info-default)',\n interactivePrimary: 'var(--tier1-theme-color-background-default-interactive-default)',\n interactivePrimaryHover: 'var(--tier1-theme-color-background-default-interactive-hover)',\n interactivePrimaryActive: 'var(--tier1-theme-color-background-default-interactive-active)',\n interactiveSecondary: 'var(--color-neutral-200)',\n interactiveSecondaryHover: 'var(--color-neutral-300)',\n interactiveSecondaryActive: 'var(--color-neutral-400)',\n interactiveDisabled: 'var(--tier1-theme-color-background-default-interactive-disabled)',\n\n // ============================================================================\n // TIER 3: COMPONENT COLOR TOKENS\n // ============================================================================\n\n // Button component tokens\n 'tier3-theme-button-general-background-default': 'var(--color-blue-500)',\n 'tier3-theme-button-general-background-hover': 'var(--color-blue-600)',\n 'tier3-theme-button-general-background-active': 'var(--color-blue-700)',\n 'tier3-theme-button-general-content-default': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-general-content-hover': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-general-border-default': 'var(--color-blue-500)',\n 'tier3-theme-button-general-border-hover': 'var(--color-blue-600)',\n\n 'tier3-theme-button-cta-background-default': 'var(--tier1-theme-color-background-accent-primary-default)',\n 'tier3-theme-button-cta-background-hover': 'var(--tier1-theme-color-background-accent-primary-hover)',\n 'tier3-theme-button-cta-background-active': 'var(--tier1-theme-color-background-accent-primary-active)',\n 'tier3-theme-button-cta-content-default': 'var(--color-purple-950)',\n 'tier3-theme-button-cta-content-hover': 'var(--color-purple-950)',\n 'tier3-theme-button-cta-border-default': 'var(--color-blue-500)',\n 'tier3-theme-button-cta-border-hover': 'var(--color-blue-600)',\n\n 'tier3-theme-button-secondary-background-default': 'transparent',\n 'tier3-theme-button-secondary-background-hover': 'var(--tier1-theme-color-background-default-primary-default)',\n 'tier3-theme-button-secondary-background-active': 'var(--tier1-theme-color-background-default-primary-active)',\n 'tier3-theme-button-secondary-content-default': 'var(--tier1-theme-color-background-default-primary-default)',\n 'tier3-theme-button-secondary-content-hover': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-secondary-border-default': 'var(--tier1-theme-color-background-default-primary-default)',\n 'tier3-theme-button-secondary-border-hover': 'var(--tier1-theme-color-background-default-primary-default)',\n\n 'tier3-theme-button-outline-background-default': 'transparent',\n 'tier3-theme-button-outline-background-hover': 'var(--tier1-theme-color-background-default-secondary-default)',\n 'tier3-theme-button-outline-background-active': 'var(--tier1-theme-color-background-default-tertiary-default)',\n 'tier3-theme-button-outline-content-default': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-outline-content-hover': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-outline-border-default': 'var(--tier1-theme-color-border-default-default-default)',\n 'tier3-theme-button-outline-border-hover': 'var(--tier1-theme-color-border-default-strong-default)',\n\n 'tier3-theme-button-ghost-background-default': 'transparent',\n 'tier3-theme-button-ghost-background-hover': 'var(--tier1-theme-color-background-default-secondary-default)',\n 'tier3-theme-button-ghost-background-active': 'var(--tier1-theme-color-background-default-tertiary-default)',\n 'tier3-theme-button-ghost-content-default': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-ghost-content-hover': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-ghost-border-default': 'transparent',\n 'tier3-theme-button-ghost-border-hover': 'transparent',\n\n // Social media button tokens\n 'tier3-theme-button-twitter-background-default': 'transparent',\n 'tier3-theme-button-twitter-background-hover': '#5f8df0',\n 'tier3-theme-button-twitter-background-active': '#004cb1',\n 'tier3-theme-button-twitter-content-default': '#2e6bf0',\n 'tier3-theme-button-twitter-content-hover': '#ffffff',\n 'tier3-theme-button-twitter-content-active': '#ffffff',\n 'tier3-theme-button-twitter-border-default': '#2e6bf0',\n 'tier3-theme-button-twitter-border-hover': '#5f8df0',\n 'tier3-theme-button-twitter-border-active': '#004cb1',\n\n 'tier3-theme-button-linkedin-background-default': 'transparent',\n 'tier3-theme-button-linkedin-background-hover': '#5f8df0',\n 'tier3-theme-button-linkedin-background-active': '#004cb1',\n 'tier3-theme-button-linkedin-content-default': '#2e6bf0',\n 'tier3-theme-button-linkedin-content-hover': '#ffffff',\n 'tier3-theme-button-linkedin-content-active': '#ffffff',\n 'tier3-theme-button-linkedin-border-default': '#2e6bf0',\n 'tier3-theme-button-linkedin-border-hover': '#5f8df0',\n 'tier3-theme-button-linkedin-border-active': '#004cb1',\n\n 'tier3-theme-button-facebook-background-default': 'transparent',\n 'tier3-theme-button-facebook-background-hover': '#5f8df0',\n 'tier3-theme-button-facebook-background-active': '#004cb1',\n 'tier3-theme-button-facebook-content-default': '#2e6bf0',\n 'tier3-theme-button-facebook-content-hover': '#ffffff',\n 'tier3-theme-button-facebook-content-active': '#ffffff',\n 'tier3-theme-button-facebook-border-default': '#2e6bf0',\n 'tier3-theme-button-facebook-border-hover': '#5f8df0',\n 'tier3-theme-button-facebook-border-active': '#004cb1',\n },\n};\n","/**\n * Default theme configuration\n * Base theme with multi-level color system and standard design tokens\n */\n\nimport { ThemeConfig } from '../core/types';\nimport { defaultColorSystem } from './color-systems/default-colors';\n\nexport const defaultTheme: ThemeConfig = {\n name: 'default',\n fontImportUrl: 'https://use.typekit.net/nmh6hoc.css',\n\n // Three-tier color system (integrated)\n colors: {\n primitives: defaultColorSystem.primitives,\n semantic: defaultColorSystem.semantic,\n },\n\n colorPalettes: [\n { name: 'Primary', bg: 'primary', text: 'primaryText' },\n { name: 'Secondary', bg: 'secondary', text: 'secondaryText' },\n { name: 'Accent', bg: 'accent', text: 'accentText' },\n { name: 'Tertiary', bg: 'tertiary', text: 'tertiaryText' },\n ],\n\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '24px',\n xl: '30px',\n xxl: '60px',\n },\n\n borderRadius: {\n sm: '4px',\n md: '8px',\n lg: '16px',\n xl: '24px',\n },\n\n shadows: {\n sm: '0 2px 4px rgba(0, 0, 0, 0.1)',\n md: '0 4px 8px rgba(0, 0, 0, 0.15)',\n lg: '0 8px 16px rgba(0, 0, 0, 0.2)',\n xl: '0 16px 32px rgba(0, 0, 0, 0.25)',\n },\n\n breakpoints: {\n xs: '320px',\n sm: '576px',\n md: '768px',\n lg: '992px',\n xl: '1200px',\n xxl: '1400px',\n },\n\n typography: {\n // Tier 1: Base typography foundation tokens\n fontFamily: \"'azo-sans-web', serif\",\n fontFamilyHeading: \"'azo-sans-web', serif\",\n fontFamilyMono: \"'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace\",\n\n // Base font sizes\n fontSizeXs: '21px', // heading xs\n fontSizeSm: '28px', // heading sm\n fontSizeMd: '37px', // heading md\n fontSizeLg: '50px', // heading lg\n fontSizeXl: '67px', // heading xl\n fontSize2xl: '72px', // heading 2xl\n\n // Base font weights\n fontWeightLight: '100',\n fontWeightRegular: '400',\n fontWeightSemibold: '600',\n fontWeightBold: '700',\n fontWeightBlack: '900',\n\n // Base line heights\n lineHeightTight: '1.25',\n lineHeightSnug: '1.375',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.625',\n lineHeightLoose: '1.75',\n\n // Base letter spacing\n letterSpacingTighter: '-0.05em',\n letterSpacingTight: '-0.025em',\n letterSpacingNormal: '0',\n letterSpacingWide: '0.025em',\n letterSpacingWider: '0.05em',\n letterSpacingWidest: '0.1em',\n\n // Tier 2: Semantic typography variants with responsive breakpoints\n variants: {\n // Display typography (largest headings)\n display: {\n fontSize: '4rem',\n fontWeight: '900',\n lineHeight: '1.1',\n letterSpacing: '-0.03em',\n mobile: {\n fontSize: '2.5rem',\n lineHeight: '1.2',\n },\n tablet: {\n fontSize: '3rem',\n },\n },\n\n // Body text variants\n bodyDefault: {\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.5',\n letterSpacing: '0',\n mobile: {\n fontSize: '0.875rem',\n lineHeight: '1.6',\n },\n },\n bodyLarge: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n letterSpacing: '0',\n mobile: {\n fontSize: '1rem',\n },\n },\n bodySmall: {\n fontSize: '0.875rem',\n fontWeight: '400',\n lineHeight: '1.5',\n letterSpacing: '0',\n mobile: {\n fontSize: '0.75rem',\n },\n },\n\n // Specialized text variants\n lead: {\n fontSize: '1.25rem',\n fontWeight: '400',\n lineHeight: '1.6',\n letterSpacing: '-0.01em',\n mobile: {\n fontSize: '1.125rem',\n },\n },\n caption: {\n fontSize: '0.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n letterSpacing: '0.03em',\n textTransform: 'uppercase',\n },\n overline: {\n fontSize: '0.75rem',\n fontWeight: '600',\n lineHeight: '1.4',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n },\n\n // Legacy variants (maintained for backward compatibility)\n pageTitle: {\n fontSize: '1.5rem',\n fontWeight: '400',\n lineHeight: '1.1',\n letterSpacing: '0',\n textTransform: 'uppercase',\n mobile: {\n fontSize: '2rem',\n lineHeight: '1.2',\n },\n tablet: {\n fontSize: '2.5rem',\n },\n },\n sectionTitle: {\n fontSize: '2.625rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '-0.02em',\n mobile: {\n fontSize: '2.25rem',\n },\n tablet: {\n fontSize: '2.25rem',\n },\n },\n title: {\n fontSize: '3.5rem',\n fontWeight: '900',\n lineHeight: '1.1',\n letterSpacing: '0',\n mobile: {\n fontSize: '2.875rem',\n lineHeight: '1.2',\n },\n tablet: {\n fontSize: '2.875rem',\n },\n },\n subtitle: {\n fontSize: '1.5rem',\n fontWeight: '400',\n lineHeight: '1.4',\n mobile: {\n fontSize: '1.5rem',\n },\n },\n body: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.5',\n },\n textlink: {\n fontSize: '1.125rem',\n fontWeight: '600',\n lineHeight: '1.5',\n textTransform: 'uppercase',\n textDecoration: 'underline',\n },\n bodyBold: {\n fontSize: '1.125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n bodyBoldLarge: {\n fontSize: '1.313rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n },\n },\n\n components: {\n card: {\n background: 'var(--tier1-theme-color-surface-primary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-default-default)',\n borderRadius: '8px',\n shadow: '0 2px 4px rgba(0, 0, 0, 0.1)',\n padding: '24px',\n },\n header: {\n background: 'var(--tier1-theme-color-surface-primary-default)',\n borderBottom: '1px solid var(--tier1-theme-color-border-default-default-default)',\n height: '64px',\n padding: '0 24px',\n },\n cta: {\n background: 'var(--primary)',\n borderRadius: '0 0 200px',\n padding: '32px',\n titleFontWeight: '900',\n titleFontSize: '55px',\n titleLineHeight: '65px',\n descriptionLineHeight: '32px',\n descriptionFontWeight: '100',\n descriptionFontSize: '24px',\n descriptionMargin: '0px 0px 30px 0px',\n },\n },\n\n // Component-scoped token abstraction layer\n componentTokens: {\n button: {\n // Shared button properties (apply to all variants)\n borderRadius: '20px',\n borderWidth: '1px',\n padding: '14px 25px 13px',\n fontSize: '16px',\n fontWeight: '600',\n lineHeight: '22px',\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n\n // Focus state (shared)\n focusOutline: '1px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '1pt',\n\n // Disabled state (shared)\n disabledOpacity: '0.6',\n\n // Shadow (shared)\n shadow: 'var(--tier1-theme-shadow-sm, none)',\n\n // Animation tokens - Default theme has no hover animation\n hoverAnimation: 'none',\n\n // Variant-specific styles\n variants: {\n general: {\n bg: 'var(--tier3-theme-button-general-background-default)',\n bgHover: 'var(--tier3-theme-button-general-background-hover)',\n bgActive: 'var(--tier3-theme-button-general-background-active)',\n text: 'var(--tier3-theme-button-general-content-default)',\n textHover: 'var(--tier3-theme-button-general-content-hover)',\n border: 'var(--tier3-theme-button-general-border-default)',\n borderHover: 'var(--tier3-theme-button-general-border-hover)',\n },\n cta: {\n bg: 'var(--tier3-theme-button-cta-background-default)',\n bgHover: 'var(--tier3-theme-button-cta-background-hover)',\n bgActive: 'var(--tier3-theme-button-cta-background-active)',\n text: 'var(--tier3-theme-button-cta-content-default)',\n textHover: 'var(--tier3-theme-button-cta-content-hover)',\n border: 'var(--tier3-theme-button-cta-border-default)',\n borderHover: 'var(--tier3-theme-button-cta-border-hover)',\n },\n secondary: {\n bg: 'var(--tier3-theme-button-secondary-background-default)',\n bgHover: 'var(--tier3-theme-button-secondary-background-hover)',\n bgActive: 'var(--tier3-theme-button-secondary-background-active)',\n text: 'var(--tier3-theme-button-secondary-content-default)',\n textHover: 'var(--tier3-theme-button-secondary-content-hover)',\n border: 'var(--tier3-theme-button-secondary-border-default)',\n borderHover: 'var(--tier3-theme-button-secondary-border-hover)',\n },\n twitter: {\n bg: 'var(--tier3-theme-button-twitter-background-default)',\n bgHover: 'var(--tier3-theme-button-twitter-background-hover)',\n bgActive: 'var(--tier3-theme-button-twitter-background-active)',\n text: 'var(--tier3-theme-button-twitter-content-default)',\n textHover: 'var(--tier3-theme-button-twitter-content-hover)',\n border: 'var(--tier3-theme-button-twitter-border-default)',\n borderHover: 'var(--tier3-theme-button-twitter-border-hover)',\n },\n linkedin: {\n bg: 'var(--tier3-theme-button-linkedin-background-default)',\n bgHover: 'var(--tier3-theme-button-linkedin-background-hover)',\n bgActive: 'var(--tier3-theme-button-linkedin-background-active)',\n text: 'var(--tier3-theme-button-linkedin-content-default)',\n textHover: 'var(--tier3-theme-button-linkedin-content-hover)',\n border: 'var(--tier3-theme-button-linkedin-border-default)',\n borderHover: 'var(--tier3-theme-button-linkedin-border-hover)',\n },\n facebook: {\n bg: 'var(--tier3-theme-button-facebook-background-default)',\n bgHover: 'var(--tier3-theme-button-facebook-background-hover)',\n bgActive: 'var(--tier3-theme-button-facebook-background-active)',\n text: 'var(--tier3-theme-button-facebook-content-default)',\n textHover: 'var(--tier3-theme-button-facebook-content-hover)',\n border: 'var(--tier3-theme-button-facebook-border-default)',\n borderHover: 'var(--tier3-theme-button-facebook-border-hover)',\n },\n secondaryDarkMode: {\n bg: 'transparent',\n text: 'var(--tier1-theme-color-content-default-inverse-default)',\n border: 'var(--tier1-theme-color-content-default-inverse-default)',\n bgHover: 'var(--tier1-theme-color-background-default-interactive-default)',\n borderHover: 'var(--tier1-theme-color-background-default-interactive-hover)',\n bgActive: 'var(--tier1-theme-color-background-default-interactive-active)',\n },\n },\n },\n\n card: {\n // Base properties\n bg: 'var(--tier1-theme-color-background-default-secondary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-default-default)',\n borderRadius: 'var(--tier1-theme-border-radius-lg)',\n shadow: 'var(--tier1-theme-shadow-md)',\n padding: 'var(--tier1-theme-spacing-xl)',\n maxWidth: '340px',\n\n // Focus state\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '2px',\n\n // Active state\n borderActive: '2px solid var(--tier1-theme-color-background-default-interactive-default)',\n\n // Image wrapper\n imageWrapperBorderRadius:\n 'var(--tier1-theme-border-radius-lg, 20px) var(--tier1-theme-border-radius-lg, 20px) 0 0',\n imageAspectRatio: '3/2',\n\n // Responsive overrides\n md: {\n imageAspectRatio: '16/9',\n },\n },\n\n grid: {\n // Gap size mappings - reference theme spacing tokens\n gapXs: 'var(--tier1-theme-spacing-xs)',\n gapSm: 'var(--tier1-theme-spacing-sm)',\n gapMd: 'var(--tier1-theme-spacing-md)',\n gapLg: 'var(--tier1-theme-spacing-lg)',\n gapXl: 'var(--tier1-theme-spacing-xl)',\n gapXxl: 'var(--tier1-theme-spacing-xxl)',\n },\n\n header: {\n // Base properties\n bg: 'var(--tier1-theme-color-background-default-secondary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-subtle-default)',\n height: '64px',\n padding: 'var(--tier1-theme-spacing-md) var(--tier1-theme-spacing-lg)',\n\n // Title\n titleColor: 'var(--tier1-theme-color-content-default-primary-default)',\n titleFontSize: 'var(--tier1-theme-typography-h5-desktop-font-size, 20px)',\n titleFontWeight: 'var(--tier1-theme-typography-h1-desktop-font-weight, 700)',\n titleMargin: '6px 0 6px var(--tier1-theme-spacing-sm, 10px)',\n\n // Welcome text\n welcomeColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n welcomeFontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 14px)',\n welcomeMargin: 'var(--tier1-theme-spacing-sm, 10px)',\n\n // Button spacing\n buttonSpacing: 'var(--tier1-theme-spacing-sm, 10px)',\n },\n\n cta: {\n // Container\n height: '500px',\n\n // Content box\n contentBg: 'var(--tier1-theme-color-background-default-primary-default)',\n contentMaxWidth: '765px',\n contentBorderRadius: '0px 0px 200px',\n contentPadding: 'var(--tier1-theme-spacing-xxl) var(--tier1-theme-spacing-xl) 0px var(--tier1-theme-spacing-xxl)',\n\n // Title\n titleColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n titleFontSize: '55px',\n titleLineHeight: '65px',\n titleFontWeight: '900',\n titleMargin: '0 0 1rem',\n titleFontFamily: 'var(--tier1-theme-typography-font-family-heading, var(--tier1-theme-typography-font-family))',\n\n // Description\n descriptionColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n descriptionFontSize: '24px',\n descriptionLineHeight: '32px',\n descriptionFontWeight: '100',\n descriptionMargin: '0px 0px 30px 0px',\n descriptionFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Responsive overrides\n md: {\n height: '450px',\n titleFontSize: '2.5rem',\n titleLineHeight: '1.2',\n descriptionFontSize: '1.125rem',\n descriptionLineHeight: '1.6',\n },\n },\n\n icon: {\n // Base size\n size: '24px',\n\n // Color variants - separate fill, stroke, and stroke-width\n fillPrimary: 'var(--color-blue-600)',\n strokePrimary: 'var(--color-blue-600)',\n strokeWidthPrimary: '1',\n\n fillSecondary: 'var(--color-gray-600)',\n strokeSecondary: 'var(--color-gray-600)',\n strokeWidthSecondary: '0',\n\n fillAccent: 'var(--color-purple-600)',\n strokeAccent: 'var(--color-purple-600)',\n strokeWidthAccent: '0',\n\n fillSuccess: 'var(--color-green-600)',\n strokeSuccess: 'var(--color-green-600)',\n strokeWidthSuccess: '0',\n\n fillWarning: 'var(--color-yellow-600)',\n strokeWarning: 'var(--color-yellow-600)',\n strokeWidthWarning: '0',\n\n fillError: 'var(--color-red-600)',\n strokeError: 'var(--color-red-600)',\n strokeWidthError: '0',\n\n // Size variants\n sizes: {\n xs: {\n size: '12px',\n },\n sm: {\n size: '16px',\n },\n md: {\n size: '24px',\n },\n lg: {\n size: '32px',\n },\n xl: {\n size: '48px',\n },\n },\n },\n\n heading: {\n // Base properties\n margin: '0',\n padding: '0',\n color: 'var(--tier1-theme-color-content-default-primary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family-heading, var(--tier1-theme-typography-font-family))',\n\n // H1 variant\n h1FontSize: 'var(--tier1-theme-typography-font-size-2xl, 2.5rem)',\n h1FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-desktop-line-height, 1.2)',\n h1LetterSpacing: 'var(--tier1-theme-typography-h1-desktop-letter-spacing, -0.02em)',\n\n // H2 variant\n h2FontSize: 'var(--tier1-theme-typography-font-size-xl, 2rem)',\n h2FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h2LineHeight: 'var(--tier1-theme-typography-h2-desktop-line-height, 1.3)',\n h2LetterSpacing: 'var(--tier1-theme-typography-h2-desktop-letter-spacing, -0.01em)',\n\n // H3 variant\n h3FontSize: 'var(--tier1-theme-typography-font-size-lg, 1.75rem)',\n h3FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h3LineHeight: 'var(--tier1-theme-typography-h3-desktop-line-height, 1.4)',\n h3LetterSpacing: 'var(--tier1-theme-typography-h3-desktop-letter-spacing, 0)',\n\n // H4 variant\n h4FontSize: 'var(--tier1-theme-typography-font-size-md, 1.5rem)',\n h4FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h4LineHeight: 'var(--tier1-theme-typography-h4-desktop-line-height, 1.4)',\n\n // H5 variant\n h5FontSize: 'var(--tier1-theme-typography-font-size-sm, 1.25rem)',\n h5FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h5LineHeight: 'var(--tier1-theme-typography-h5-desktop-line-height, 1.5)',\n\n // H6 variant\n h6FontSize: 'var(--tier1-theme-typography-font-size-xs, 1rem)',\n h6FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h6LineHeight: 'var(--tier1-theme-typography-h6-desktop-line-height, 1.5)',\n\n // Display variant\n displayFontSize: 'var(--tier1-theme-typography-display-desktop-font-size, 4rem)',\n displayFontWeight: 'var(--tier1-theme-typography-display-desktop-font-weight, 900)',\n displayLineHeight: 'var(--tier1-theme-typography-display-desktop-line-height, 1.1)',\n displayLetterSpacing: 'var(--tier1-theme-typography-display-desktop-letter-spacing, -0.03em)',\n\n // Body Default variant\n bodyDefaultFontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n bodyDefaultFontWeight: 'var(--tier1-theme-typography-body-default-desktop-font-weight, 400)',\n bodyDefaultLineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n bodyDefaultLetterSpacing: 'var(--tier1-theme-typography-body-default-desktop-letter-spacing, 0)',\n bodyDefaultFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Lead variant\n leadFontSize: 'var(--tier1-theme-typography-lead-desktop-font-size, 1.25rem)',\n leadFontWeight: 'var(--tier1-theme-typography-lead-desktop-font-weight, 400)',\n leadLineHeight: 'var(--tier1-theme-typography-lead-desktop-line-height, 1.6)',\n leadLetterSpacing: 'var(--tier1-theme-typography-lead-desktop-letter-spacing, -0.01em)',\n\n // Caption variant\n captionFontSize: 'var(--tier1-theme-typography-caption-desktop-font-size, 0.75rem)',\n captionFontWeight: 'var(--tier1-theme-typography-caption-desktop-font-weight, 400)',\n captionLineHeight: 'var(--tier1-theme-typography-caption-desktop-line-height, 1.4)',\n captionLetterSpacing: 'var(--tier1-theme-typography-caption-desktop-letter-spacing, 0.03em)',\n captionTextTransform: 'var(--tier1-theme-typography-caption-desktop-text-transform, uppercase)',\n\n // Overline variant\n overlineFontSize: 'var(--tier1-theme-typography-overline-desktop-font-size, 0.75rem)',\n overlineFontWeight: 'var(--tier1-theme-typography-overline-desktop-font-weight, 600)',\n overlineLineHeight: 'var(--tier1-theme-typography-overline-desktop-line-height, 1.4)',\n overlineLetterSpacing: 'var(--tier1-theme-typography-overline-desktop-letter-spacing, 0.1em)',\n overlineTextTransform: 'var(--tier1-theme-typography-overline-desktop-text-transform, uppercase)',\n\n // Legacy Page Title variant\n pageTitleFontSize: 'var(--tier1-theme-typography-page-title-desktop-font-size, 3rem)',\n pageTitleFontWeight: 'var(--tier1-theme-typography-page-title-desktop-font-weight, 900)',\n pageTitleLineHeight: 'var(--tier1-theme-typography-page-title-desktop-line-height, 1.1)',\n pageTitleLetterSpacing: 'var(--tier1-theme-typography-page-title-desktop-letter-spacing, -0.03em)',\n pageTitleTextTransform: 'var(--tier1-theme-typography-page-title-desktop-text-transform, uppercase)',\n pageTitleColor: 'var(--tier1-theme-color-content-accent-primary-default)',\n\n // Legacy Section Title variant\n sectionTitleFontSize: 'var(--tier1-theme-typography-section-title-desktop-font-size, 2.625rem)',\n sectionTitleFontWeight: 'var(--tier1-theme-typography-section-title-desktop-font-weight, 700)',\n sectionTitleLineHeight: 'var(--tier1-theme-typography-section-title-desktop-line-height, 1.2)',\n sectionTitleLetterSpacing: 'var(--tier1-theme-typography-section-title-desktop-letter-spacing, -0.02em)',\n\n // Legacy Title variant\n titleFontSize: 'var(--tier1-theme-typography-title-desktop-font-size, 3.5rem)',\n titleFontWeight: 'var(--tier1-theme-typography-title-desktop-font-weight, 900)',\n titleLineHeight: 'var(--tier1-theme-typography-title-desktop-line-height, 1.1)',\n titleLetterSpacing: 'var(--tier1-theme-typography-title-desktop-letter-spacing, -0.03em)',\n\n // Legacy Subtitle variant\n subtitleFontSize: 'var(--tier1-theme-typography-subtitle-desktop-font-size, 1.5rem)',\n subtitleFontWeight: 'var(--tier1-theme-typography-subtitle-desktop-font-weight, 400)',\n subtitleLineHeight: 'var(--tier1-theme-typography-subtitle-desktop-line-height, 1.4)',\n\n // Legacy Body variant\n bodyFontSize: 'var(--tier1-theme-typography-body-desktop-font-size, 1.125rem)',\n bodyFontWeight: 'var(--tier1-theme-typography-body-desktop-font-weight, 400)',\n bodyLineHeight: 'var(--tier1-theme-typography-body-desktop-line-height, 1.5)',\n\n // Legacy Text Link variant\n textlinkFontSize: 'var(--tier1-theme-typography-textlink-desktop-font-size, 1.125rem)',\n textlinkFontWeight: 'var(--tier1-theme-typography-textlink-desktop-font-weight, 600)',\n textlinkLineHeight: 'var(--tier1-theme-typography-textlink-desktop-line-height, 1.5)',\n textlinkFontFamily: 'var(--tier1-theme-typography-font-family)',\n textlinkTextDecoration: 'var(--tier1-theme-typography-textlink-desktop-text-decoration, underline)',\n textlinkTextTransform: 'var(--tier1-theme-typography-textlink-desktop-text-transform, uppercase)',\n\n // Legacy Body Bold variant\n bodyBoldFontSize: 'var(--tier1-theme-typography-body-bold-desktop-font-size, 1.125rem)',\n bodyBoldFontWeight: 'var(--tier1-theme-typography-body-bold-desktop-font-weight, 700)',\n bodyBoldLineHeight: 'var(--tier1-theme-typography-body-bold-desktop-line-height, 1.6)',\n bodyBoldFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Legacy Body Large variant\n bodyLargeFontSize: 'var(--tier1-theme-typography-body-large-desktop-font-size, 1.125rem)',\n bodyLargeFontWeight: 'var(--tier1-theme-typography-body-large-desktop-font-weight, 400)',\n bodyLargeLineHeight: 'var(--tier1-theme-typography-body-large-desktop-line-height, 1.6)',\n bodyLargeFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Legacy Body Bold Large variant\n bodyBoldLargeFontSize: 'var(--tier1-theme-typography-body-bold-large-desktop-font-size, 1.313rem)',\n bodyBoldLargeFontWeight: 'var(--tier1-theme-typography-body-bold-large-desktop-font-weight, 700)',\n bodyBoldLargeLineHeight: 'var(--tier1-theme-typography-body-bold-large-desktop-line-height, 1.6)',\n bodyBoldLargeFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Legacy Body Small variant\n bodySmallFontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 0.875rem)',\n bodySmallFontWeight: 'var(--tier1-theme-typography-body-small-desktop-font-weight, 400)',\n bodySmallLineHeight: 'var(--tier1-theme-typography-body-small-desktop-line-height, 1.5)',\n bodySmallFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Responsive overrides (mobile)\n mobile: {\n h1FontSize: 'var(--tier1-theme-typography-h1-mobile-font-size, 2rem)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-mobile-line-height, 1.25)',\n h2FontSize: 'var(--tier1-theme-typography-h2-mobile-font-size, 1.75rem)',\n h2LineHeight: 'var(--tier1-theme-typography-h2-mobile-line-height, 1.3)',\n h3FontSize: 'var(--tier1-theme-typography-h3-mobile-font-size, 1.5rem)',\n h4FontSize: 'var(--tier1-theme-typography-h4-mobile-font-size, 1.25rem)',\n h5FontSize: 'var(--tier1-theme-typography-h5-mobile-font-size, 1.125rem)',\n h6FontSize: 'var(--tier1-theme-typography-h6-mobile-font-size, 0.875rem)',\n displayFontSize: 'var(--tier1-theme-typography-display-mobile-font-size, 2.5rem)',\n displayLineHeight: 'var(--tier1-theme-typography-display-mobile-line-height, 1.2)',\n bodyDefaultFontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n bodyDefaultLineHeight: 'var(--tier1-theme-typography-body-default-mobile-line-height, 1.6)',\n leadFontSize: 'var(--tier1-theme-typography-lead-mobile-font-size, 1.125rem)',\n pageTitleFontSize: 'var(--tier1-theme-typography-page-title-mobile-font-size, 2rem)',\n pageTitleLineHeight: 'var(--tier1-theme-typography-page-title-mobile-line-height, 1.2)',\n sectionTitleFontSize: 'var(--tier1-theme-typography-section-title-mobile-font-size, 2.25rem)',\n titleFontSize: 'var(--tier1-theme-typography-title-mobile-font-size, 2.875rem)',\n titleLineHeight: 'var(--tier1-theme-typography-title-mobile-line-height, 1.2)',\n subtitleFontSize: 'var(--tier1-theme-typography-subtitle-mobile-font-size, 1.5rem)',\n },\n\n // Responsive overrides (tablet)\n tablet: {\n h1FontSize: 'var(--tier1-theme-typography-h1-tablet-font-size, 2.25rem)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-tablet-line-height, 1.2)',\n h2FontSize: 'var(--tier1-theme-typography-h2-tablet-font-size, 1.875rem)',\n h3FontSize: 'var(--tier1-theme-typography-h3-tablet-font-size, 1.625rem)',\n displayFontSize: 'var(--tier1-theme-typography-display-tablet-font-size, 3rem)',\n pageTitleFontSize: 'var(--tier1-theme-typography-page-title-tablet-font-size, 2.5rem)',\n sectionTitleFontSize: 'var(--tier1-theme-typography-section-title-tablet-font-size, 2.25rem)',\n titleFontSize: 'var(--tier1-theme-typography-title-tablet-font-size, 2.875rem)',\n },\n\n // Dark mode override\n dark: {\n color: 'var(--color-white)',\n },\n },\n\n textLink: {\n color: 'var(--tier1-theme-color-content-default-link-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n fontSize: 'var(--tier1-theme-typography-textlink-desktop-font-size, 1.125rem)',\n fontWeight: 'var(--tier1-theme-typography-textlink-desktop-font-weight, 600)',\n textDecoration: 'var(--tier1-theme-typography-textlink-desktop-text-decoration, underline)',\n\n colorHover: 'var(--tier1-theme-color-content-default-link-hover)',\n\n colorFocus: 'var(--tier1-theme-color-content-default-link-default)',\n textDecorationFocus: 'underline',\n textDecorationStyleFocus: 'solid',\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '2px',\n\n colorActive: 'var(--tier1-theme-color-content-default-link-hover)',\n colorVisited:\n 'var(--tier1-theme-color-content-default-link-visited, var(--tier1-theme-color-content-default-link-default))',\n\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n colorHover: 'var(--tier1-theme-color-content-accent-primary-default)',\n colorFocus: 'var(--tier1-theme-color-content-default-inverse-default)',\n colorActive: 'var(--tier1-theme-color-content-accent-primary-default)',\n },\n },\n\n richText: {\n // Base container\n color: 'var(--tier1-theme-color-content-default-primary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n lineHeight: 'var(--tier1-theme-typography-line-height-normal, 1.5)',\n\n // Heading spacing\n headingMarginBottom: 'var(--tier1-theme-spacing-md, 16px)',\n\n // Paragraph styles\n paragraphFontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n paragraphFontWeight: 'var(--tier1-theme-typography-body-default-desktop-font-weight, 400)',\n paragraphLineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n paragraphMarginBottom: 'var(--tier1-theme-spacing-md, 16px)',\n paragraphColor: 'var(--tier1-theme-color-content-default-primary-default)',\n\n // List styles\n listMargin: 'var(--tier1-theme-spacing-md, 16px) 0',\n listPaddingLeft: 'var(--tier1-theme-spacing-xl, 30px)',\n listItemFontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n listItemLineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n listItemMarginBottom: 'var(--tier1-theme-spacing-sm, 8px)',\n listItemColor: 'var(--tier1-theme-color-content-default-primary-default)',\n ulListStyleType: 'disc',\n olListStyleType: 'decimal',\n\n // Strong/bold\n strongFontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n\n // Code styles\n codeFontSize: '0.875em',\n codeBg: 'var(--tier1-theme-color-background-default-tertiary-default)',\n codePadding: '0.125rem 0.25rem',\n\n preFontSize: '0.875rem',\n preBg: 'var(--tier1-theme-color-background-default-tertiary-default)',\n prePadding: 'var(--tier1-theme-spacing-md, 16px)',\n\n // Blockquote styles\n blockquoteMargin: 'var(--tier1-theme-spacing-md, 16px) 0',\n blockquotePadding: 'var(--tier1-theme-spacing-sm, 8px) var(--tier1-theme-spacing-md, 16px)',\n blockquoteBorderLeft: '4px solid var(--tier1-theme-color-border-default-default-default)',\n blockquoteColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n\n // Horizontal rule\n hrBorder: '1px solid var(--tier1-theme-color-border-default-default-default)',\n hrMargin: 'var(--tier1-theme-spacing-lg, 24px) 0',\n\n // Responsive overrides\n mobile: {\n paragraphFontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n paragraphLineHeight: 'var(--tier1-theme-typography-body-default-mobile-line-height, 1.6)',\n listItemFontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n },\n\n // Dark mode overrides\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n paragraphColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n listItemColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n blockquoteColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n },\n },\n\n blockquote: {\n margin: 'var(--tier1-theme-spacing-md, 16px) 0',\n padding: 'var(--tier1-theme-spacing-sm, 8px) var(--tier1-theme-spacing-md, 16px)',\n borderLeft: 'none',\n bg: 'transparent',\n borderRadius: '0',\n fontStyle: 'italic',\n\n borderPrimaryWidth: '4px',\n borderSecondaryWidth: '0px',\n borderColorPrimary: 'var(--tier1-theme-color-border-default-default-default)',\n borderColorSecondary: 'transparent',\n\n fontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n fontWeight: '400',\n lineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n color: 'var(--tier1-theme-color-content-default-secondary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n\n citationMarginTop: 'var(--tier1-theme-spacing-sm, 8px)',\n citationFontSize: '0.875rem',\n citationFontWeight: '500',\n citationColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n citationPrefix: '\"— \"',\n\n mobile: {\n fontSize: '0.9375rem',\n lineHeight: '1.6',\n },\n\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n citationColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n borderColorPrimary: 'var(--tier1-theme-color-border-default-subtle-default)',\n borderColorSecondary: 'transparent',\n },\n },\n\n footnote: {\n labelFontWeight: '700',\n markerFontSize: '0.75em',\n markerFontWeight: '700',\n },\n\n author: {\n labelFontWeight: '700',\n },\n\n media: {\n bg: 'transparent',\n borderRadius: '0',\n objectFit: 'cover',\n objectPosition: 'center',\n aspectRatio: 'auto',\n\n dark: {\n bg: 'var(--tier1-theme-color-background-default-inverse-default)',\n },\n },\n\n videoPlayer: {\n borderRadius: '0',\n thumbnailBg: 'var(--tier1-theme-color-background-default-secondary-default)',\n placeholderBg: '#1a1a2e',\n playIconSize: '64px',\n playIconBg: 'rgba(0, 0, 0, 0.6)',\n playIconBorder: 'rgba(255, 255, 255, 0.8)',\n playIconColor: '#fff',\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n\n dark: {\n thumbnailBg: 'var(--tier1-theme-color-background-default-inverse-default)',\n playIconBg: 'rgba(0, 0, 0, 0.7)',\n },\n },\n\n paragraph: {\n // Base properties\n fontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n fontWeight: 'var(--tier1-theme-typography-body-default-desktop-font-weight, 400)',\n lineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n color: 'var(--tier1-theme-color-content-default-primary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n letterSpacing: 'var(--tier1-theme-typography-body-default-desktop-letter-spacing, 0)',\n\n // Strong/bold\n strongFontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n\n // Responsive overrides\n mobile: {\n fontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n lineHeight: 'var(--tier1-theme-typography-body-default-mobile-line-height, 1.6)',\n },\n\n tablet: {\n fontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n lineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n },\n\n // Dark mode overrides\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n },\n },\n\n modal: {\n // Overlay\n overlayBg: 'rgba(0, 0, 0, 0.5)',\n\n // Content area\n contentBg: 'var(--tier1-theme-color-background-default-secondary-default)',\n contentBorder: '1px solid var(--tier1-theme-color-border-default-default-default)',\n contentPadding: 'var(--tier1-theme-spacing-xl)',\n borderRadius: 'var(--tier1-theme-border-radius-lg)',\n shadow: 'var(--tier1-theme-shadow-lg)',\n maxWidth: '37.5rem',\n width: '100%',\n\n // Close button\n closeButtonTop: '1rem',\n closeButtonRight: '1rem',\n closeButtonSize: '2rem',\n closeButtonBorderRadius: '50%',\n closeButtonBg: 'transparent',\n closeButtonColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n closeButtonBgHover: 'var(--tier1-theme-color-background-default-tertiary-default)',\n closeButtonColorHover: 'var(--tier1-theme-color-content-default-primary-default)',\n closeButtonFontSize: '1.25rem',\n\n // Focus\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '2px',\n\n // Size variants\n sizes: {\n sm: {\n maxWidth: '25rem',\n contentPadding: 'var(--tier1-theme-spacing-lg)',\n },\n md: {\n maxWidth: '37.5rem',\n contentPadding: 'var(--tier1-theme-spacing-xl)',\n },\n lg: {\n maxWidth: '50rem',\n contentPadding: 'var(--tier1-theme-spacing-xxl)',\n },\n },\n\n // Responsive\n mobile: {\n contentPadding: 'var(--tier1-theme-spacing-lg)',\n maxWidth: 'calc(100% - 2rem)',\n },\n\n // Dark mode\n dark: {\n contentBg: 'var(--tier1-theme-color-background-default-primary-default)',\n contentBorder: '1px solid var(--tier1-theme-color-border-default-subtle-default)',\n },\n },\n\n dataDial: {\n ringBg: 'transparent',\n ringTrack: 'var(--color-neutral-300)',\n ringProgress: 'var(--color-primary-700)',\n text: 'var(--color-primary-950)',\n valueFontSize: '2.75rem',\n percentFontSize: '1.375rem',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n\n statPill: {\n bg: 'rgba(46, 222, 128, 0.18)',\n text: 'var(--color-success-700)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n paddingY: '0.25rem',\n paddingX: '0.75rem',\n },\n },\n};\n","/**\n * Theme utility helper functions\n */\n\n/**\n * Converts camelCase to kebab-case:\n * - textPrimary -> text-primary\n * - blue500 -> blue-500\n * - brandPrimary -> brand-primary\n * - h1 -> h1\n * - h2 -> h2\n * - bodyLarge -> body-large\n */\nexport function toKebabCase(str: string): string {\n const typographyVariants = /^(h|b|p|span|div)(\\d+)$/i;\n if (typographyVariants.test(str)) {\n return str.toLowerCase();\n }\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2') // camelCase\n .replace(/([a-z])(\\d)/g, '$1-$2')\n .toLowerCase();\n}\n","/**\n * Theme CSS generation utilities\n * Converts theme configurations to CSS custom properties and applies them\n * Updated to support three-tier naming convention\n */\n\nimport { ThemeConfig, ThemeTypography, TypographyVariant, ComponentTokens } from '../core/types';\nimport { ColorSystem } from '../core/color-system';\nimport { toKebabCase } from './helpers';\n\n/**\n * Converts an object to CSS custom properties with a prefix\n * Handles camelCase to kebab-case conversion including numbers\n */\nfunction objectToCSSVars(obj: Record<string, string | undefined>, prefix: string): string[] {\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => {\n // For new tier naming convention, don't convert keys that already have proper format\n const cssKey = key.startsWith('tier') || key.startsWith('color-') ? key : toKebabCase(key);\n return ` --${prefix}${cssKey}: ${value};`;\n });\n}\n\n/**\n * Generates CSS custom properties for the three-tier color system\n * Creates CSS variables that reference each other\n * Also generates legacy variable names for backward compatibility\n */\nfunction generateColorSystemCSS(colorSystem: ColorSystem, selector: string = ':root'): string {\n const sections: string[] = [];\n\n // Tier 1: Base colors (primitives)\n sections.push(...objectToCSSVars(colorSystem.primitives as unknown as Record<string, string>, ''));\n\n // Tier 2 & 3: Semantic and component tokens\n sections.push(...objectToCSSVars(colorSystem.semantic as unknown as Record<string, string>, ''));\n\n // Legacy compatibility: Generate old-style variable names for ColorTable\n const legacyMapping: Record<string, string> = {\n 'text-primary': 'textPrimary',\n 'text-secondary': 'textSecondary',\n 'bg-secondary': 'bgSecondary',\n 'bg-tertiary': 'bgTertiary',\n 'border-default': 'borderDefault',\n 'border-subtle': 'borderSubtle',\n 'border-strong': 'borderStrong',\n };\n\n const legacyVars = Object.entries(legacyMapping)\n .map(([oldVar, newKey]) => {\n const value = colorSystem.semantic[newKey as keyof typeof colorSystem.semantic];\n return value ? ` --${oldVar}: ${value};` : '';\n })\n .filter(Boolean);\n\n sections.push(...legacyVars);\n\n return `${selector} {\\n${sections.join('\\n')}\\n}`;\n}\n\n/**\n * Generates typography CSS variables using the new tier naming convention\n * Tier 1: Foundation tokens (base font properties)\n * Tier 2: Semantic tokens (typography variants with responsive breakpoints)\n */\nfunction generateTypographyCSS(typography: ThemeTypography, selector: string = ':root'): string {\n const sections: string[] = [];\n\n // Tier 1: Base typography foundation tokens\n const { variants, ...typographyBase } = typography;\n\n // Add base typography variables with tier1-theme prefix\n Object.entries(typographyBase).forEach(([key, value]) => {\n if (value !== undefined) {\n const cssKey = toKebabCase(key);\n sections.push(` --tier1-theme-typography-${cssKey}: ${value};`);\n }\n });\n\n // Tier 2: Typography variants (semantic tokens with responsive breakpoints)\n if (variants) {\n Object.entries(variants).forEach(([variantName, variantStyles]: [string, TypographyVariant]) => {\n if (variantStyles) {\n const { mobile, tablet, ...desktopStyles } = variantStyles;\n\n // Desktop styles (default) - Tier 2 semantic tokens\n Object.entries(desktopStyles).forEach(([prop, value]) => {\n if (value !== undefined) {\n const propKey = toKebabCase(prop);\n const variantKey = toKebabCase(variantName);\n sections.push(` --tier1-theme-typography-${variantKey}-desktop-${propKey}: ${value};`);\n }\n });\n\n // Mobile styles - responsive variants\n if (mobile) {\n Object.entries(mobile).forEach(([prop, value]) => {\n if (value !== undefined) {\n const propKey = toKebabCase(prop);\n const variantKey = toKebabCase(variantName);\n sections.push(` --tier1-theme-typography-${variantKey}-mobile-${propKey}: ${value};`);\n }\n });\n }\n\n // Tablet styles - responsive variants\n if (tablet) {\n Object.entries(tablet).forEach(([prop, value]) => {\n if (value !== undefined) {\n const propKey = toKebabCase(prop);\n const variantKey = toKebabCase(variantName);\n sections.push(` --tier1-theme-typography-${variantKey}-tablet-${propKey}: ${value};`);\n }\n });\n }\n }\n });\n }\n\n return sections.length > 0 ? `${selector} {\\n${sections.join('\\n')}\\n}` : '';\n}\n\n/**\n * Generates CSS custom properties from theme configuration\n * Uses the integrated three-tier system\n */\nexport function generateThemeCSS(theme: ThemeConfig, selector: string = ':root'): string {\n let css = '';\n\n // Generate three-tier color system CSS\n const colorSystem = {\n primitives: theme.colors.primitives,\n semantic: theme.colors.semantic,\n };\n css += generateColorSystemCSS(colorSystem, selector);\n css += '\\n\\n';\n\n // Generate typography CSS with new naming convention\n const typographyCSS = generateTypographyCSS(theme.typography, selector);\n if (typographyCSS) {\n css += typographyCSS;\n css += '\\n\\n';\n }\n\n // Non-color theme properties (spacing, shadows, etc.)\n const sections: Record<string, string[]> = {};\n\n // Spacing (Tier 1)\n sections['Spacing'] = objectToCSSVars(theme.spacing as unknown as Record<string, string>, 'tier1-theme-spacing-');\n\n // Border Radius (Tier 1)\n sections['Border Radius'] = objectToCSSVars(\n theme.borderRadius as unknown as Record<string, string>,\n 'tier1-theme-border-radius-'\n );\n\n // Shadows (Tier 1)\n sections['Shadows'] = objectToCSSVars(theme.shadows as unknown as Record<string, string>, 'tier1-theme-shadow-');\n\n // Breakpoints (no tier prefix)\n sections['Breakpoints'] = objectToCSSVars(theme.breakpoints as unknown as Record<string, string>, 'breakpoint-');\n\n // Components (Tier 1)\n sections['Card Component'] = objectToCSSVars(\n theme.components.card as unknown as Record<string, string>,\n 'tier1-theme-component-card-'\n );\n sections['Header Component'] = objectToCSSVars(\n theme.components.header as unknown as Record<string, string>,\n 'tier1-theme-component-header-'\n );\n sections['CTA Component'] = objectToCSSVars(\n theme.components.cta as unknown as Record<string, string>,\n 'tier1-theme-component-cta-'\n );\n\n // Build final CSS\n const cssOutput = Object.entries(sections)\n .map(([name, vars]) => `\\n /* ${name} */\\n${vars.join('\\n')}`)\n .join('');\n\n css += `${selector} {${cssOutput}\\n}`;\n\n // NEW: Automatically generate component-scoped tokens with breakpoint support\n if (theme.componentTokens) {\n css += '\\n\\n';\n css += generateComponentTokensCSS(theme.componentTokens, selector);\n }\n\n return css;\n}\n\n/**\n * Helper function to convert camelCase to kebab-case\n */\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\n/**\n * Generates component-scoped CSS variables with breakpoint, variant, dark mode, and size support\n * Automatically handles any component without needing generator code changes\n * Supports nested variants pattern: { borderRadius: \"0px\", variants: { general: {...}, secondary: {...} } }\n * Supports dark mode overrides: { bg: \"white\", dark: { bg: \"black\" } }\n * Supports size variants: { sizes: { sm: { padding: \"8px\" }, md: { padding: \"12px\" } } }\n */\nfunction generateComponentTokensCSS(componentTokens: ComponentTokens, selector: string = ':root'): string {\n const sections: string[] = [];\n const darkSections: string[] = [];\n const sizeSections: { [size: string]: string[] } = {};\n\n // Reserved breakpoint keys\n const breakpointKeys = ['desktop', 'tablet', 'mobile', 'sm', 'md', 'lg', 'xl'];\n\n sections.push(`${selector} {`);\n sections.push(' /* Component-Scoped Tokens */');\n\n // Dark mode selector targets elements with data-dark-mode attribute\n const darkSelector = selector === ':root' ? '[data-dark-mode=\"true\"]' : `${selector} [data-dark-mode=\"true\"]`;\n darkSections.push(`${darkSelector} {`);\n darkSections.push(' /* Dark Mode Overrides */');\n\n // Generic loop - works for any component automatically\n Object.entries(componentTokens).forEach(([componentName, componentProps]) => {\n if (componentProps && typeof componentProps === 'object') {\n const componentPrefix = camelToKebab(componentName);\n sections.push(`\\n /* ${componentName} component */`);\n\n let hasDarkOverrides = false;\n\n // Process base tokens (non-breakpoint, non-variant, non-dark, non-sizes properties)\n Object.entries(componentProps).forEach(([propKey, propValue]) => {\n // Skip breakpoint objects, variants object, dark object, and sizes object\n if (breakpointKeys.includes(propKey) || propKey === 'variants' || propKey === 'dark' || propKey === 'sizes')\n return;\n\n if (propValue !== undefined && typeof propValue === 'string') {\n const cssVarName = camelToKebab(propKey);\n sections.push(` --${componentPrefix}-${cssVarName}: ${propValue};`);\n }\n });\n\n // Process component-level dark mode overrides\n if (componentProps.dark && typeof componentProps.dark === 'object') {\n hasDarkOverrides = true;\n darkSections.push(`\\n /* ${componentName} component - dark mode */`);\n Object.entries(componentProps.dark).forEach(([propKey, propValue]) => {\n if (propValue !== undefined && typeof propValue === 'string') {\n const cssVarName = camelToKebab(propKey);\n darkSections.push(` --${componentPrefix}-${cssVarName}: ${propValue};`);\n }\n });\n }\n\n // Process size variants\n if (componentProps.sizes && typeof componentProps.sizes === 'object') {\n Object.entries(componentProps.sizes).forEach(([sizeName, sizeProps]) => {\n if (sizeProps && typeof sizeProps === 'object') {\n // Initialize size section if not exists\n if (!sizeSections[sizeName]) {\n const sizeSelector =\n selector === ':root' ? `[data-size=\"${sizeName}\"]` : `${selector} [data-size=\"${sizeName}\"]`;\n sizeSections[sizeName] = [`${sizeSelector} {`, ` /* Size: ${sizeName} */`];\n }\n\n sizeSections[sizeName].push(`\\n /* ${componentName} component - ${sizeName} */`);\n Object.entries(sizeProps).forEach(([propKey, propValue]) => {\n if (propValue !== undefined && typeof propValue === 'string') {\n const cssVarName = camelToKebab(propKey);\n sizeSections[sizeName].push(` --${componentPrefix}-${cssVarName}: ${propValue};`);\n }\n });\n }\n });\n }\n\n // Process variants (nested variant-specific tokens)\n if (componentProps.variants && typeof componentProps.variants === 'object') {\n Object.entries(componentProps.variants).forEach(([variantName, variantProps]) => {\n if (variantProps && typeof variantProps === 'object') {\n const variantKebab = camelToKebab(variantName); // Convert variant name to kebab-case\n\n // Process variant base tokens\n Object.entries(variantProps).forEach(([propKey, propValue]) => {\n // Skip breakpoint objects and dark object within variants\n if (breakpointKeys.includes(propKey) || propKey === 'dark') return;\n\n if (propValue !== undefined && typeof propValue === 'string') {\n // Extract base property and state from camelCase\n // e.g., bgHover -> bg + Hover, textActive -> text + Active\n const match = propKey.match(/^([a-z]+)([A-Z][a-z]+)?$/);\n if (match) {\n const baseProp = match[1]; // 'bg', 'text', 'border'\n const state = match[2] ? match[2].toLowerCase() : null; // 'hover', 'active', null\n\n // Pattern: --button-bg-general or --button-bg-general-hover\n const cssVarName = state\n ? `--${componentPrefix}-${baseProp}-${variantKebab}-${state}`\n : `--${componentPrefix}-${baseProp}-${variantKebab}`;\n\n sections.push(` ${cssVarName}: ${propValue};`);\n }\n }\n });\n\n // Process variant dark mode overrides\n if (variantProps.dark && typeof variantProps.dark === 'object') {\n hasDarkOverrides = true;\n Object.entries(variantProps.dark).forEach(([propKey, propValue]) => {\n if (propValue !== undefined && typeof propValue === 'string') {\n const match = propKey.match(/^([a-z]+)([A-Z][a-z]+)?$/);\n if (match) {\n const baseProp = match[1];\n const state = match[2] ? match[2].toLowerCase() : null;\n\n const cssVarName = state\n ? `--${componentPrefix}-${baseProp}-${variantKebab}-${state}`\n : `--${componentPrefix}-${baseProp}-${variantKebab}`;\n\n darkSections.push(` ${cssVarName}: ${propValue};`);\n }\n }\n });\n }\n\n // Process variant breakpoint-scoped tokens\n breakpointKeys.forEach((breakpoint) => {\n const breakpointProps = (variantProps as any)[breakpoint];\n if (breakpointProps && typeof breakpointProps === 'object') {\n Object.entries(breakpointProps).forEach(([propKey, propValue]) => {\n if (propValue !== undefined) {\n const match = propKey.match(/^([a-z]+)([A-Z][a-z]+)?$/);\n if (match) {\n const baseProp = match[1];\n const state = match[2] ? match[2].toLowerCase() : null;\n\n const cssVarName = state\n ? `--${componentPrefix}-${baseProp}-${variantKebab}-${state}-${breakpoint}`\n : `--${componentPrefix}-${baseProp}-${variantKebab}-${breakpoint}`;\n\n sections.push(` ${cssVarName}: ${propValue};`);\n }\n }\n });\n }\n });\n }\n });\n }\n\n // Process component-level breakpoint-scoped tokens\n breakpointKeys.forEach((breakpoint) => {\n const breakpointProps = componentProps[breakpoint];\n if (breakpointProps && typeof breakpointProps === 'object') {\n Object.entries(breakpointProps).forEach(([propKey, propValue]) => {\n if (propValue !== undefined) {\n const cssVarName = camelToKebab(propKey);\n sections.push(` --${componentPrefix}-${cssVarName}-${breakpoint}: ${propValue};`);\n }\n });\n }\n });\n }\n });\n\n sections.push('}');\n darkSections.push('}');\n\n // Close all size sections\n Object.values(sizeSections).forEach((sizeSection) => {\n sizeSection.push('}');\n });\n\n // Only include dark mode section if there are actual overrides\n const hasDarkContent = darkSections.length > 3; // More than just opening, comment, and closing\n const hasSizeContent = Object.keys(sizeSections).length > 0;\n\n let result = sections.join('\\n');\n\n if (hasDarkContent) {\n result += '\\n\\n' + darkSections.join('\\n');\n }\n\n if (hasSizeContent) {\n Object.values(sizeSections).forEach((sizeSection) => {\n result += '\\n\\n' + sizeSection.join('\\n');\n });\n }\n\n return result;\n}\n\n/**\n * Applies theme to document by injecting CSS\n */\nexport function applyTheme(theme: ThemeConfig, themeName?: string): void {\n const selector = themeName ? `[data-theme=\"${themeName}\"]` : ':root';\n const css = generateThemeCSS(theme, selector);\n\n // Remove existing theme style if it exists\n const existingStyle = document.getElementById(`theme-${theme.name}`);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Create and inject new theme style\n const style = document.createElement('style');\n style.id = `theme-${theme.name}`;\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/**\n * Sets theme attribute on document element\n */\nexport function setThemeAttribute(themeName: string): void {\n document.documentElement.setAttribute('data-theme', themeName);\n}\n","/**\n * React context for theme management\n * Optimized for single-theme tenant sites\n */\n\nimport React, { createContext, useContext, useEffect, ReactNode } from 'react';\nimport { ThemeConfig, ThemeVariant } from './types';\nimport { defaultTheme } from '../presets/default';\nimport { generateThemeCSS } from '../utils/generator';\n\n/**\n * Converts theme config to CSS custom properties and injects them\n */\nfunction applyThemeCSS(theme: ThemeConfig, themeName: string): void {\n const style = document.getElementById(`theme-${themeName}`) || document.createElement('style');\n style.id = `theme-${themeName}`;\n\n const selector = `[data-theme=\"${themeName}\"]`;\n\n // Handle both single URL and array of URLs\n let fontImport = '';\n if (theme.fontImportUrl) {\n const urls = Array.isArray(theme.fontImportUrl) ? theme.fontImportUrl : [theme.fontImportUrl];\n fontImport = urls.map((url) => `@import url('${url}');`).join('\\n ');\n }\n\n const css = `\n ${fontImport}\n ${generateThemeCSS(theme, selector)}\n `;\n\n style.textContent = css;\n if (!document.head.contains(style)) {\n document.head.appendChild(style);\n }\n}\n\ninterface ThemeContextValue {\n currentTheme: ThemeConfig;\n themeName: ThemeVariant;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n initialTheme?: ThemeConfig;\n initialThemeName?: ThemeVariant;\n}\n\n/**\n * Theme provider optimized for single-theme tenant sites\n * Sets theme once on mount - no runtime switching needed\n */\nexport function ThemeProvider({\n children,\n initialTheme = defaultTheme,\n initialThemeName = 'default',\n}: ThemeProviderProps) {\n // Apply theme CSS and set data attribute on mount\n useEffect(() => {\n applyThemeCSS(initialTheme, initialThemeName);\n document.documentElement.setAttribute('data-theme', initialThemeName);\n }, [initialTheme, initialThemeName]);\n\n const value: ThemeContextValue = {\n currentTheme: initialTheme,\n themeName: initialThemeName,\n };\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Hook to access current theme (read-only for tenant sites)\n */\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n","/**\n * Client-side theme provider wrapper\n * This component can be used in any React application\n */\n\nimport { ThemeProvider as BaseThemeProvider } from './context';\nexport { useTheme } from './context';\n\n// Re-export the theme provider\nexport const ThemeProvider = BaseThemeProvider;\n","import React from 'react';\nimport './Button.scss';\nimport { getButtonIcon, resolveIcon } from './buttonIcons';\nimport { ButtonVariantType } from '@/themes/core/types';\nimport { useTheme } from '@/themes/core/client-provider';\nimport { toKebabCase } from '@/themes/utils/helpers';\n\n// Re-export for convenience\nexport type ButtonType = ButtonVariantType;\n\nexport type ColorPalette = 'primary' | 'secondary' | 'accent' | 'tertiary';\n\nexport interface ButtonProps {\n /** Button variant type */\n buttonType?: ButtonType;\n /** Color palette to apply */\n palette?: ColorPalette;\n /** Button label text */\n label?: string;\n /** Accepts an icon name string (e.g. \"circle-play\") or React element */\n icon?: string | React.ReactNode;\n /** Accepts a hover icon name string */\n hoverIcon?: string;\n /** Icon position relative to label */\n iconPosition?: 'leading' | 'trailing' | 'none';\n /** Allow passing classname to component */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Child elements */\n children?: React.ReactNode;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Size variant - controls button dimensions and spacing */\n size?: 'sm' | 'md' | 'lg';\n /** Enable/disable hover animation - overrides theme default */\n animated?: boolean;\n /** Click handler */\n onClick?: () => void;\n}\n\n/** Primary UI component for user interaction */\n\nexport const Button = ({\n buttonType = 'general',\n palette,\n label,\n icon,\n hoverIcon,\n iconPosition,\n className,\n children,\n style,\n disabled = false,\n darkMode = false,\n size = 'md',\n animated,\n onClick,\n ...props\n}: ButtonProps) => {\n const { currentTheme } = useTheme();\n const buttonClass = `button button--${toKebabCase(buttonType)} ${className || ''}`;\n const iconConfig = getButtonIcon(buttonType, resolveIcon(icon), resolveIcon(hoverIcon), currentTheme?.name);\n const resolvedIconPosition = iconPosition ?? (iconConfig && currentTheme?.name === 'primax' ? 'trailing' : undefined);\n\n const paletteStyle = palette\n ? {\n backgroundColor: `var(--${palette})`,\n color: `var(--${palette}-text)`,\n borderColor: `var(--${palette})`,\n ...style,\n }\n : style;\n\n const iconNode =\n iconConfig &&\n (iconConfig.hover ? (\n <>\n <span className=\"icon icon--regular\">{iconConfig.regular}</span>\n <span className=\"icon icon--hover\">{iconConfig.hover}</span>\n </>\n ) : (\n <span className=\"icon\">{iconConfig.regular}</span>\n ));\n\n return (\n <button\n type=\"button\"\n className={buttonClass}\n data-dark-mode={darkMode ? 'true' : undefined}\n data-size={size}\n data-animated={animated !== undefined ? (animated ? 'true' : 'false') : undefined}\n style={paletteStyle}\n onClick={onClick}\n disabled={disabled}\n {...props}\n >\n {resolvedIconPosition === 'leading' && iconNode}\n {children || label}\n {resolvedIconPosition === 'trailing' && iconNode}\n </button>\n );\n};\n","import React from 'react';\nimport { ButtonProps } from '../Button/Button';\nimport { getButtonIcon, resolveIcon } from '../Button/buttonIcons';\nimport { useTheme } from '@/themes/core/client-provider';\nimport { toKebabCase } from '@/themes/utils/helpers';\nimport '../Button/Button.scss';\nimport './ButtonLink.scss';\n\nexport interface ButtonLinkProps extends Omit<ButtonProps, 'onClick'> {\n /** Link URL */\n href: string;\n /** Link target */\n target?: '_blank' | '_self';\n /** ARIA label */\n 'aria-label'?: string;\n /** Test ID */\n 'data-testid'?: string;\n}\n\n/** Button-styled link component for navigation */\nexport const ButtonLink = ({\n buttonType = 'general',\n label,\n icon,\n hoverIcon,\n iconPosition,\n href,\n target = '_self',\n className,\n children,\n style,\n disabled = false,\n size = 'md',\n darkMode = false,\n ...props\n}: ButtonLinkProps) => {\n const { currentTheme } = useTheme();\n const buttonClass = `button button--${toKebabCase(buttonType)} ${className || ''}`;\n const rel = target === '_blank' ? 'noopener noreferrer' : undefined;\n const iconConfig = getButtonIcon(buttonType, resolveIcon(icon), resolveIcon(hoverIcon), currentTheme?.name);\n const resolvedIconPosition = iconPosition ?? (iconConfig && currentTheme?.name === 'primax' ? 'trailing' : undefined);\n\n const iconNode =\n iconConfig &&\n (iconConfig.hover ? (\n <>\n <span className=\"icon icon--regular\">{iconConfig.regular}</span>\n <span className=\"icon icon--hover\">{iconConfig.hover}</span>\n </>\n ) : (\n <span className=\"icon\">{iconConfig.regular}</span>\n ));\n\n if (disabled) {\n return (\n <span\n className={buttonClass}\n data-size={size}\n data-dark-mode={darkMode || undefined}\n style={style}\n aria-disabled=\"true\"\n {...props}\n >\n {resolvedIconPosition === 'leading' && iconNode}\n {children || label}\n {resolvedIconPosition === 'trailing' && iconNode}\n </span>\n );\n }\n\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n className={buttonClass}\n data-size={size}\n data-dark-mode={darkMode || undefined}\n style={style}\n {...props}\n >\n {resolvedIconPosition === 'leading' && iconNode}\n {children || label}\n {resolvedIconPosition === 'trailing' && iconNode}\n </a>\n );\n};\n","import React, { AnchorHTMLAttributes } from 'react';\nimport { resolveIcon } from '@/components/atoms/Button/buttonIcons';\nimport './TextLink.scss';\n\nexport type TextLinkType = 'in-text' | 'external';\n\nexport interface TextLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n linkType?: TextLinkType;\n label: string;\n disabled?: boolean;\n darkMode?: boolean;\n href?: string;\n icon?: string | React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n 'data-testid'?: string;\n}\n\nexport const TextLink: React.FC<TextLinkProps> = ({\n linkType,\n label,\n disabled = false,\n darkMode = false,\n href,\n icon,\n className = '',\n style,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n 'data-testid': testId,\n}) => {\n const isExternal = linkType === 'external';\n const target = isExternal ? '_blank' : '_self';\n\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n event.preventDefault();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n }\n };\n\n const typeClass = isExternal ? 'text-link--external' : '';\n const resolvedIcon = resolveIcon(icon);\n\n if (!href || disabled) {\n return (\n <span\n className={`text-link text-link--disabled ${typeClass} ${className}`}\n data-dark-mode={darkMode || undefined}\n style={style}\n data-testid={testId}\n aria-label={ariaLabel || label}\n aria-describedby={ariaDescribedBy}\n >\n {label} {resolvedIcon}\n </span>\n );\n }\n\n return (\n <a\n href={href}\n target={target}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={`text-link ${typeClass} ${className}`}\n data-dark-mode={darkMode || undefined}\n style={style}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n data-testid={testId}\n >\n {label} {resolvedIcon}\n </a>\n );\n};\n","import React from 'react';\nimport './BackgroundMedia.scss';\n\nexport interface BackgroundMediaProps {\n /** Video URL for video background */\n videoUrl?: string;\n /** Image URL for image background */\n imageUrl?: string;\n /** CSS gradient overlay */\n gradient?: string;\n /** Background color */\n bgColor?: string;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/** Background media component supporting image or video */\nexport const BackgroundMedia: React.FC<BackgroundMediaProps> = ({\n videoUrl,\n imageUrl,\n gradient,\n bgColor,\n className,\n style,\n}) => {\n const baseClasses = ['background-media', className].filter(Boolean).join(' ');\n\n if (videoUrl) {\n return (\n <video className={`${baseClasses} background-media--video`} autoPlay muted loop playsInline style={style}>\n <source src={videoUrl} type=\"video/mp4\" />\n Your browser does not support video.\n </video>\n );\n }\n\n const backgroundStyle: React.CSSProperties = {\n backgroundImage: gradient ? `${gradient}, url(${imageUrl})` : imageUrl ? `url(${imageUrl})` : undefined,\n backgroundColor: bgColor,\n ...style,\n };\n\n return <div className={baseClasses} style={backgroundStyle} />;\n};\n","import React, { useRef, useEffect, useState } from 'react';\nimport './Media.scss';\n\nconst WISTIA_SCRIPT_ID = 'wistia-external-script';\nconst WISTIA_SCRIPT_SRC = 'https://fast.wistia.com/assets/external/E-v1.js';\n\n/** Extract Wistia video ID from various URL formats or bare IDs */\nfunction extractWistiaId(url: string): string | null {\n // Bare Wistia ID (alphanumeric, 8-12 chars, no slashes or dots)\n if (/^[a-zA-Z0-9]{8,12}$/.test(url)) return url;\n const match = url.match(/(?:medias|iframe)\\/([a-zA-Z0-9]+)/) || url.match(/wi\\.st\\/medias\\/([a-zA-Z0-9]+)/);\n return match?.[1] ?? null;\n}\n\n/** Check if a URL is a Wistia video or bare Wistia ID */\nfunction isWistiaUrl(url: string): boolean {\n if (/^[a-zA-Z0-9]{8,12}$/.test(url)) return true;\n return /wistia\\.(com|net)/i.test(url) || /wi\\.st/i.test(url);\n}\n\nexport interface VideoProviderConfig {\n /** Unique provider key */\n name: string;\n /** Test if a URL belongs to this provider */\n match: (url: string) => boolean;\n /** Build the embed URL for the iframe */\n buildEmbedUrl: (url: string, options?: VideoProviderOptions) => string;\n}\n\nexport interface VideoProviderOptions {\n autoplay?: boolean;\n controls?: boolean;\n muted?: boolean;\n loop?: boolean;\n}\n\n/**\n * Resolve a URL to a custom provider and build the embed URL.\n * Wistia is handled natively (async embed), so only custom providers are checked here.\n */\nfunction resolveCustomProvider(\n url: string,\n providers: VideoProviderConfig[],\n options: VideoProviderOptions\n): { type: 'embed'; embedUrl: string; providerName: string } | { type: 'native' } {\n for (const provider of providers) {\n if (provider.match(url)) {\n return {\n type: 'embed',\n embedUrl: provider.buildEmbedUrl(url, options),\n providerName: provider.name,\n };\n }\n }\n return { type: 'native' };\n}\n\nexport type MediaType = 'image' | 'video';\nexport type ObjectFit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n\nexport interface MediaProps {\n /** Media source URL (image path, video file, or embed URL like Wistia) */\n src: string;\n /** Force media type. Auto-detected if omitted. */\n type?: MediaType;\n /** Alt text for images, title for video iframes */\n alt?: string;\n /** How the media fills its container */\n objectFit?: ObjectFit;\n /** Object position (e.g. \"center top\") */\n objectPosition?: string;\n /** Aspect ratio (e.g. \"16/9\", \"4/3\", \"1/1\"). If omitted, media fills container height. */\n aspectRatio?: string;\n /** Autoplay video (muted by default for browser compliance) */\n autoplay?: boolean;\n /** Show video controls */\n controls?: boolean;\n /** Loop video playback */\n loop?: boolean;\n /** Mute video. Defaults to true when autoplay is enabled. */\n muted?: boolean;\n /** Lazy load media */\n loading?: 'lazy' | 'eager';\n /** Image srcSet for responsive images */\n srcSet?: string;\n /** Image sizes attribute */\n sizes?: string;\n /** Additional video providers (YouTube, Vimeo, etc.) */\n providers?: VideoProviderConfig[];\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Callback when media loads / Wistia is ready */\n onLoad?: () => void;\n /** Callback on load error */\n onError?: () => void;\n /** Callback when Wistia video is ready — receives the Wistia video handle for programmatic control */\n onReady?: (videoHandle: any) => void;\n}\n\n/** Check if a string looks like a bare Wistia media ID (alphanumeric, 8-12 chars) */\nfunction isWistiaId(src: string): boolean {\n return /^[a-zA-Z0-9]{8,12}$/.test(src);\n}\n\n/** Detect media type from URL if not explicitly provided */\nfunction detectMediaType(src: string): MediaType {\n const videoExts = /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i;\n const videoProviders = /wistia\\.(com|net)|wi\\.st/i;\n if (videoExts.test(src) || videoProviders.test(src) || isWistiaId(src)) return 'video';\n return 'image';\n}\n\n/** Atom component for rendering images or videos (native, Wistia async embed, or custom providers) */\nexport const Media: React.FC<MediaProps> = ({\n src,\n type,\n alt = '',\n objectFit = 'cover',\n objectPosition,\n aspectRatio,\n autoplay = false,\n controls = true,\n loop = false,\n muted,\n loading = 'lazy',\n srcSet,\n sizes,\n providers = [],\n darkMode = false,\n className,\n style,\n onLoad,\n onError,\n onReady,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const wistiaDivRef = useRef<HTMLDivElement | null>(null);\n const [isClient, setIsClient] = useState(false);\n const [isWistiaReady, setIsWistiaReady] = useState(false);\n\n const resolvedType = type ?? detectMediaType(src);\n const resolvedMuted = muted ?? autoplay;\n const wistiaId = resolvedType === 'video' ? extractWistiaId(src) : null;\n const isWistia = resolvedType === 'video' && isWistiaUrl(src) && !!wistiaId;\n\n // SSR guard\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n // Wistia: load script and register onReady\n useEffect(() => {\n if (!isClient || !isWistia || !wistiaId) return;\n\n // Inject Wistia E-v1 script once\n if (!document.getElementById(WISTIA_SCRIPT_ID)) {\n const script = document.createElement('script');\n script.id = WISTIA_SCRIPT_ID;\n script.src = WISTIA_SCRIPT_SRC;\n script.async = true;\n document.body.appendChild(script);\n }\n\n // Register with Wistia queue\n (window as any)._wq = (window as any)._wq || [];\n (window as any)._wq.push({\n id: wistiaId,\n onReady: (video: any) => {\n setIsWistiaReady(true);\n onReady?.(video);\n onLoad?.();\n },\n });\n }, [isClient, isWistia, wistiaId, onLoad, onReady]);\n\n // Autoplay native videos after mount\n useEffect(() => {\n if (resolvedType === 'video' && !isWistia && autoplay && videoRef.current) {\n videoRef.current.play().catch(() => {\n // Autoplay blocked by browser — silent fail\n });\n }\n }, [resolvedType, isWistia, autoplay, src]);\n\n const baseClass = 'media';\n const classes = [baseClass, `${baseClass}--${resolvedType}`, className].filter(Boolean).join(' ');\n\n const cssVars: React.CSSProperties = {\n ...(objectFit && ({ '--media-object-fit': objectFit } as React.CSSProperties)),\n ...(objectPosition && ({ '--media-object-position': objectPosition } as React.CSSProperties)),\n ...(aspectRatio && ({ '--media-aspect-ratio': aspectRatio } as React.CSSProperties)),\n ...style,\n };\n\n if (resolvedType === 'image') {\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <img\n className={`${baseClass}__image`}\n src={src}\n alt={alt}\n loading={loading}\n srcSet={srcSet}\n sizes={sizes}\n onLoad={onLoad}\n onError={onError}\n />\n </div>\n );\n }\n\n if (isWistia && wistiaId) {\n // Build Wistia embed options via class names\n const wistiaOptions = [\n `wistia_embed`,\n `wistia_async_${wistiaId}`,\n !controls && 'controlsVisibleOnLoad=false',\n !controls && 'playbar=false',\n !controls && 'playPauseNotifier=false',\n !controls && 'settingsControl=false',\n !controls && 'fullscreenButton=false',\n !controls && 'volumeControl=false',\n !controls && 'smallPlayButton=false',\n autoplay && 'autoPlay=true',\n resolvedMuted && 'muted=true',\n loop && 'endVideoBehavior=loop',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={`${classes} ${baseClass}--provider-wistia`}\n style={cssVars}\n data-dark-mode={darkMode || undefined}\n >\n {isClient && (\n <div\n ref={wistiaDivRef}\n className={`${wistiaOptions} ${baseClass}__wistia`}\n style={{\n width: '100%',\n height: '100%',\n visibility: isWistiaReady ? 'visible' : 'hidden',\n }}\n />\n )}\n </div>\n );\n }\n\n const providerResult = resolveCustomProvider(src, providers, {\n autoplay,\n controls,\n muted: resolvedMuted,\n loop,\n });\n\n if (providerResult.type === 'embed') {\n return (\n <div\n className={`${classes} ${baseClass}--provider-${providerResult.providerName}`}\n style={cssVars}\n data-dark-mode={darkMode || undefined}\n >\n <iframe\n className={`${baseClass}__iframe`}\n src={providerResult.embedUrl}\n title={alt || 'Video'}\n allow=\"autoplay; fullscreen; encrypted-media; picture-in-picture\"\n allowFullScreen\n loading={loading}\n onLoad={onLoad}\n onError={onError}\n />\n </div>\n );\n }\n\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <video\n ref={videoRef}\n className={`${baseClass}__video`}\n src={src}\n autoPlay={autoplay}\n controls={controls}\n loop={loop}\n muted={resolvedMuted}\n playsInline\n onLoadedData={onLoad}\n onError={onError}\n />\n </div>\n );\n};\n","import React from 'react';\nimport './Breadcrumb.scss';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: string;\n darkMode?: boolean;\n className?: string;\n}\n\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({ items, separator = '/', darkMode = false, className = '' }) => {\n return (\n <nav className={`breadcrumb ${className}`} aria-label=\"Breadcrumb\" data-dark-mode={darkMode || undefined}>\n <ol className=\"breadcrumb__list\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={index} className=\"breadcrumb__item\">\n {item.href && !isLast ? (\n <a href={item.href} className=\"breadcrumb__link\">\n {item.label}\n </a>\n ) : (\n <span className=\"breadcrumb__text\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n {!isLast && (\n <span className=\"breadcrumb__separator\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n","import React from 'react';\nimport './Divider.scss';\n\nexport type ShapeDivider = 'top' | 'bottom' | 'both' | 'none';\n\nexport interface DividerProps {\n children?: React.ReactNode;\n backgroundColor?: string;\n backgroundImage?: string;\n backgroundPattern?: 'dots' | 'grid' | 'sparks' | 'none';\n shapeDivider?: ShapeDivider;\n shapeColor?: string;\n className?: string;\n padding?: string;\n height?: string;\n verticalAlign?: 'top' | 'center' | 'bottom';\n darkMode?: boolean;\n /** Control overflow behavior — defaults to 'hidden' */\n overflow?: 'hidden' | 'visible';\n}\n\nexport const Divider: React.FC<DividerProps> = ({\n children,\n backgroundColor,\n backgroundImage,\n backgroundPattern = 'none',\n shapeDivider = 'none',\n shapeColor = '#ffffff',\n className = '',\n padding,\n height,\n verticalAlign = 'top',\n darkMode = false,\n overflow,\n}) => {\n const dividerClasses = [\n 'divider',\n `divider--divider-${shapeDivider}`,\n backgroundPattern !== 'none' && `divider--pattern-${backgroundPattern}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const style: React.CSSProperties = {\n ...(backgroundColor && ({ '--divider-bg': backgroundColor } as React.CSSProperties)),\n ...(backgroundImage &&\n ({\n '--divider-bg-image': `url(${backgroundImage})`,\n } as React.CSSProperties)),\n ...(padding && ({ '--divider-padding': padding } as React.CSSProperties)),\n ...(height && ({ '--divider-height': height } as React.CSSProperties)),\n ...(verticalAlign && ({ '--divider-vertical-align': verticalAlign } as React.CSSProperties)),\n ...(shapeColor && ({ '--divider-shape-color': shapeColor } as React.CSSProperties)),\n ...(overflow && ({ '--divider-overflow': overflow } as React.CSSProperties)),\n };\n\n return (\n <div className={dividerClasses} style={style} data-dark-mode={darkMode || undefined} data-test=\"test\">\n {/* Background layer — receives clip-path from shape dividers */}\n <div className=\"divider__bg\" />\n {/* Content layer — unclipped so decorative elements (sparkles) aren't cut off */}\n <div className=\"divider__content\">{children}</div>\n </div>\n );\n};\n","import React from 'react';\nimport './Container.scss';\n\nexport interface ContainerProps {\n children?: React.ReactNode;\n /** Full-width container with no max-width constraint */\n fluid?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** HTML element to render — defaults to div */\n as?: React.ElementType;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\nexport const Container: React.FC<ContainerProps> = ({\n children,\n fluid = false,\n className = '',\n as: Tag = 'div',\n style,\n}) => {\n const classes = [fluid ? 'container-fluid' : 'container', className].filter(Boolean).join(' ');\n\n return (\n <Tag className={classes} style={style}>\n {children}\n </Tag>\n );\n};\n","import React from 'react';\nimport type { SemanticColorTokens } from '@/themes/core/color-system';\nimport { toKebabCase } from '@/themes/utils/helpers';\nimport './Heading.scss';\n\nexport type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\nexport type ColorPalette = 'primary' | 'secondary' | 'accent' | 'tertiary';\nexport type HeadingWeight = 'light' | 'regular' | 'semibold' | 'bold' | 'black';\nexport type HeadingSize = '2xl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs';\n\n// Variant type is now flexible - accepts any string\n// The actual available variants are defined in the theme\nexport type HeadingVariant = string;\n\n// Color type derives from SemanticColorTokens keys\n// Automatically converts camelCase to kebab-case for CSS variables\nexport type HeadingColor = keyof SemanticColorTokens;\n\nexport interface HeadingProps {\n /** Heading level (semantic HTML tag) */\n level?: HeadingLevel;\n /** Visual style variant (independent of semantic level) - defined by theme */\n variant?: HeadingVariant;\n /** Font weight (maps to --tier1-theme-typography-font-weight-*) */\n weight?: HeadingWeight;\n /** Font size (maps to --tier1-theme-typography-font-size-*) */\n size?: HeadingSize;\n /** Color from theme semantic tokens */\n color?: HeadingColor;\n /** Color palette to apply (background + text) */\n palette?: ColorPalette;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Heading text */\n children: React.ReactNode;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Heading component with configurable level and visual variants\n * Supports responsive typography through CSS custom properties\n */\nexport const Heading: React.FC<HeadingProps> = ({\n level = 'h2',\n variant,\n weight,\n size,\n color,\n palette,\n darkMode = false,\n children,\n className,\n style,\n}) => {\n const Tag = level;\n\n // Apply palette, color, weight, and size\n let finalStyle = style;\n\n if (palette) {\n finalStyle = {\n ...style,\n backgroundColor: `var(--${palette})`,\n color: `var(--${palette}-text)`,\n padding: style?.padding || '0.5rem 1rem',\n borderRadius: style?.borderRadius || '4px',\n };\n } else if (color) {\n finalStyle = {\n ...style,\n color: `var(--${toKebabCase(color as string)})`,\n };\n }\n\n // Apply weight and size using theme typography tokens\n if (weight) {\n finalStyle = {\n ...finalStyle,\n fontWeight: `var(--tier1-theme-typography-font-weight-${weight})`,\n };\n }\n\n if (size) {\n finalStyle = {\n ...finalStyle,\n fontSize: `var(--tier1-theme-typography-font-size-${size === '2xl' ? '2xl' : size})`,\n };\n }\n\n const headingClasses = ['heading', `heading--${level}`, variant && `heading--variant-${variant}`, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Tag className={headingClasses} style={finalStyle} data-dark-mode={darkMode ? 'true' : undefined}>\n {children}\n </Tag>\n );\n};\n","import React from 'react';\nimport './Grid.scss';\n\nexport interface GridProps {\n /** Number of columns (default: 12). Use a string for custom grid-template-columns (e.g. \"1fr auto\") */\n columns?:\n | number\n | string\n | { sm?: number | string; md?: number | string; lg?: number | string; xl?: number | string };\n /** Gap between grid items */\n gap?: string | { xs?: string; sm?: string; md?: string; lg?: string; xl?: string };\n /** Row gap (if different from column gap) */\n rowGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Column gap (if different from row gap) */\n columnGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Minimum column width (auto-fit behavior) */\n minColumnWidth?: string;\n /** Maximum column width */\n maxColumnWidth?: string;\n /** Align items vertically */\n alignItems?: 'start' | 'center' | 'end' | 'stretch';\n /** Justify items horizontally (aligns content inside each grid cell) */\n justifyItems?: 'start' | 'center' | 'end' | 'stretch';\n /** Justify content (aligns the entire grid within the container) */\n justifyContent?: 'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly';\n /** Column alignment (left, center, right) - controls entire grid position */\n columnAlign?: 'left' | 'center' | 'right';\n /** Custom className */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Children elements */\n children: React.ReactNode;\n /** Full width grid */\n fullWidth?: boolean;\n}\n\nexport interface GridItemProps {\n /** Column span - use \"auto\" to fit content width */\n colSpan?:\n | number\n | 'auto'\n | { sm?: number | 'auto'; md?: number | 'auto'; lg?: number | 'auto'; xl?: number | 'auto' };\n /** Row span - use \"auto\" to fit content height */\n rowSpan?:\n | number\n | 'auto'\n | { sm?: number | 'auto'; md?: number | 'auto'; lg?: number | 'auto'; xl?: number | 'auto' };\n /** Column start position */\n colStart?: number | { sm?: number; md?: number; lg?: number; xl?: number };\n /** Row start position */\n rowStart?: number | { sm?: number; md?: number; lg?: number; xl?: number };\n /** Gap between grid items */\n gap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Row gap (if different from column gap) */\n rowGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Column gap (if different from row gap) */\n columnGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Custom className */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Children elements */\n children: React.ReactNode;\n}\n\nexport const Grid = ({\n columns = 12,\n gap,\n rowGap,\n columnGap,\n minColumnWidth,\n maxColumnWidth,\n alignItems,\n justifyItems,\n justifyContent,\n columnAlign,\n className = '',\n style = {},\n children,\n fullWidth = false,\n}: GridProps) => {\n const gridClass = `grid ${fullWidth ? 'grid--full-width' : ''} ${className}`;\n\n // Map columnAlign to justifyContent (aligns entire grid)\n const resolvedJustifyContent = columnAlign\n ? columnAlign === 'left'\n ? 'start'\n : columnAlign === 'right'\n ? 'end'\n : 'center'\n : justifyContent;\n\n // Build inline styles for responsive behavior\n const gridStyles: Record<string, string | number | undefined> = {\n ...style,\n alignItems,\n justifyItems,\n justifyContent: resolvedJustifyContent,\n };\n\n // Handle columns with automatic responsive defaults\n if (typeof columns === 'number') {\n // Set the base column count\n gridStyles['--grid-columns'] = columns.toString();\n\n // Auto-generate responsive breakpoints only when not using minColumnWidth\n // (minColumnWidth creates its own responsive behavior via auto-fit)\n if (!minColumnWidth) {\n // Mobile: 1 column for 3+ columns, preserve original for 1-2 columns\n if (columns >= 3) {\n gridStyles['--grid-columns-sm'] = '1';\n }\n\n // Tablet: 2 columns for 3+ columns, preserve original for 1-2 columns\n if (columns >= 3) {\n gridStyles['--grid-columns-md'] = '2';\n }\n\n // Desktop: use the specified column count\n gridStyles['--grid-columns-lg'] = columns.toString();\n }\n } else if (typeof columns === 'string') {\n // Custom grid-template-columns string (e.g., \"1fr auto\")\n gridStyles.gridTemplateColumns = columns;\n } else if (columns) {\n // Manual responsive control - user provides breakpoint values\n if (columns.sm !== undefined) {\n if (typeof columns.sm === 'string') {\n gridStyles['--grid-template-columns-sm'] = columns.sm;\n } else {\n gridStyles['--grid-columns-sm'] = columns.sm.toString();\n }\n }\n if (columns.md !== undefined) {\n if (typeof columns.md === 'string') {\n gridStyles['--grid-template-columns-md'] = columns.md;\n } else {\n gridStyles['--grid-columns-md'] = columns.md.toString();\n }\n }\n if (columns.lg !== undefined) {\n if (typeof columns.lg === 'string') {\n gridStyles['--grid-template-columns-lg'] = columns.lg;\n } else {\n gridStyles['--grid-columns-lg'] = columns.lg.toString();\n }\n }\n if (columns.xl !== undefined) {\n if (typeof columns.xl === 'string') {\n gridStyles['--grid-template-columns-xl'] = columns.xl;\n } else {\n gridStyles['--grid-columns-xl'] = columns.xl.toString();\n }\n } else if (columns.lg !== undefined) {\n // xl inherits from lg when not explicitly set\n if (typeof columns.lg === 'string') {\n gridStyles['--grid-template-columns-xl'] = columns.lg;\n } else {\n gridStyles['--grid-columns-xl'] = columns.lg.toString();\n }\n }\n }\n\n // Handle min/max column width for auto-fit\n if (minColumnWidth) {\n gridStyles['--grid-min-column-width'] = minColumnWidth;\n }\n if (maxColumnWidth) {\n gridStyles['--grid-max-column-width'] = maxColumnWidth;\n }\n\n // Handle gaps - use theme tokens as fallback\n if (gap) {\n if (typeof gap === 'string') {\n // Map t-shirt sizes to grid component tokens\n const gapMap: Record<string, string> = {\n xs: 'var(--grid-gap-xs)',\n sm: 'var(--grid-gap-sm)',\n md: 'var(--grid-gap-md)',\n lg: 'var(--grid-gap-lg)',\n xl: 'var(--grid-gap-xl)',\n xxl: 'var(--grid-gap-xxl)',\n };\n gridStyles.gap = gapMap[gap] || gap;\n } else {\n if (gap.sm) gridStyles['--grid-gap-sm'] = gap.sm;\n if (gap.md) gridStyles['--grid-gap-md'] = gap.md;\n if (gap.lg) gridStyles['--grid-gap-lg'] = gap.lg;\n gridStyles['--grid-gap-xl'] = gap.xl || gap.lg || gap.md || gap.sm || '2rem';\n }\n } else {\n // Use theme tokens when no gap prop is provided\n gridStyles['--grid-gap-sm'] = 'var(--grid-gap-mobile, 1rem)';\n gridStyles['--grid-gap-md'] = 'var(--grid-gap-tablet, 1.5rem)';\n gridStyles['--grid-gap-lg'] = 'var(--grid-gap, 2rem)';\n gridStyles['--grid-gap-xl'] = 'var(--grid-gap, 2rem)';\n }\n\n if (rowGap) {\n if (typeof rowGap === 'string') {\n gridStyles.rowGap = rowGap;\n } else {\n if (rowGap.sm) gridStyles['--grid-row-gap-sm'] = rowGap.sm;\n if (rowGap.md) gridStyles['--grid-row-gap-md'] = rowGap.md;\n if (rowGap.lg) gridStyles['--grid-row-gap-lg'] = rowGap.lg;\n gridStyles['--grid-row-gap-xl'] = rowGap.xl || rowGap.lg || rowGap.md || rowGap.sm || '2rem';\n }\n }\n\n if (columnGap) {\n if (typeof columnGap === 'string') {\n gridStyles.columnGap = columnGap;\n } else {\n if (columnGap.sm) gridStyles['--grid-column-gap-sm'] = columnGap.sm;\n if (columnGap.md) gridStyles['--grid-column-gap-md'] = columnGap.md;\n if (columnGap.lg) gridStyles['--grid-column-gap-lg'] = columnGap.lg;\n gridStyles['--grid-column-gap-xl'] = columnGap.xl || columnGap.lg || columnGap.md || columnGap.sm || '2rem';\n }\n }\n\n return (\n <div className={gridClass} style={gridStyles as React.CSSProperties}>\n {children}\n </div>\n );\n};\n\nexport const GridItem = ({\n colSpan,\n rowSpan,\n colStart,\n rowStart,\n gap,\n rowGap,\n columnGap,\n className = '',\n style = {},\n children,\n}: GridItemProps) => {\n const itemStyles: Record<string, string | number | undefined> = { ...style };\n\n // Handle column span\n if (typeof colSpan === 'number') {\n itemStyles.gridColumn = `span ${colSpan}`;\n } else if (colSpan === 'auto') {\n itemStyles.gridColumn = 'auto';\n } else if (colSpan) {\n if (colSpan.sm) itemStyles['--grid-col-span-sm'] = colSpan.sm === 'auto' ? 'auto' : colSpan.sm.toString();\n if (colSpan.md) itemStyles['--grid-col-span-md'] = colSpan.md === 'auto' ? 'auto' : colSpan.md.toString();\n if (colSpan.lg) itemStyles['--grid-col-span-lg'] = colSpan.lg === 'auto' ? 'auto' : colSpan.lg.toString();\n if (colSpan.xl) itemStyles['--grid-col-span-xl'] = colSpan.xl === 'auto' ? 'auto' : colSpan.xl.toString();\n }\n\n // Handle row span\n if (typeof rowSpan === 'number') {\n itemStyles.gridRow = `span ${rowSpan}`;\n } else if (rowSpan === 'auto') {\n itemStyles.gridRow = 'auto';\n } else if (rowSpan) {\n if (rowSpan.sm) itemStyles['--grid-row-span-sm'] = rowSpan.sm === 'auto' ? 'auto' : rowSpan.sm.toString();\n if (rowSpan.md) itemStyles['--grid-row-span-md'] = rowSpan.md === 'auto' ? 'auto' : rowSpan.md.toString();\n if (rowSpan.lg) itemStyles['--grid-row-span-lg'] = rowSpan.lg === 'auto' ? 'auto' : rowSpan.lg.toString();\n if (rowSpan.xl) itemStyles['--grid-row-span-xl'] = rowSpan.xl === 'auto' ? 'auto' : rowSpan.xl.toString();\n }\n\n // Handle column start\n if (typeof colStart === 'number') {\n itemStyles.gridColumnStart = colStart;\n } else if (colStart) {\n if (colStart.sm) itemStyles['--grid-col-start-sm'] = colStart.sm.toString();\n if (colStart.md) itemStyles['--grid-col-start-md'] = colStart.md.toString();\n if (colStart.lg) itemStyles['--grid-col-start-lg'] = colStart.lg.toString();\n if (colStart.xl) itemStyles['--grid-col-start-xl'] = colStart.xl.toString();\n }\n\n // Handle row start\n if (typeof rowStart === 'number') {\n itemStyles.gridRowStart = rowStart;\n } else if (rowStart) {\n if (rowStart.sm) itemStyles['--grid-row-start-sm'] = rowStart.sm.toString();\n if (rowStart.md) itemStyles['--grid-row-start-md'] = rowStart.md.toString();\n if (rowStart.lg) itemStyles['--grid-row-start-lg'] = rowStart.lg.toString();\n if (rowStart.xl) itemStyles['--grid-row-start-xl'] = rowStart.xl.toString();\n }\n\n // Handle gaps\n if (gap) {\n if (typeof gap === 'string') {\n itemStyles.gap = gap;\n } else {\n if (gap.sm) itemStyles['--grid-item-gap-sm'] = gap.sm;\n if (gap.md) itemStyles['--grid-item-gap-md'] = gap.md;\n if (gap.lg) itemStyles['--grid-item-gap-lg'] = gap.lg;\n if (gap.xl) itemStyles['--grid-item-gap-xl'] = gap.xl;\n }\n }\n\n if (rowGap) {\n if (typeof rowGap === 'string') {\n itemStyles.rowGap = rowGap;\n } else {\n if (rowGap.sm) itemStyles['--grid-item-row-gap-sm'] = rowGap.sm;\n if (rowGap.md) itemStyles['--grid-item-row-gap-md'] = rowGap.md;\n if (rowGap.lg) itemStyles['--grid-item-row-gap-lg'] = rowGap.lg;\n if (rowGap.xl) itemStyles['--grid-item-row-gap-xl'] = rowGap.xl;\n }\n }\n\n if (columnGap) {\n if (typeof columnGap === 'string') {\n itemStyles.columnGap = columnGap;\n } else {\n if (columnGap.sm) itemStyles['--grid-item-column-gap-sm'] = columnGap.sm;\n if (columnGap.md) itemStyles['--grid-item-column-gap-md'] = columnGap.md;\n if (columnGap.lg) itemStyles['--grid-item-column-gap-lg'] = columnGap.lg;\n if (columnGap.xl) itemStyles['--grid-item-column-gap-xl'] = columnGap.xl;\n }\n }\n\n return (\n <div className={`grid-item ${className}`} style={itemStyles as React.CSSProperties}>\n {children}\n </div>\n );\n};\n","import React from 'react';\nimport './Icon.scss';\n\nexport type IconSizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';\n\nexport interface IconProps {\n /**\n * SVG content or path to SVG\n */\n svg: React.ReactNode;\n /**\n * Icon size variant\n */\n size?: IconSizeType;\n /**\n * Icon color variant\n */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'inherit';\n /**\n * Custom fill color (overrides color variant)\n */\n fill?: string;\n /**\n * Custom stroke color (overrides color variant)\n */\n stroke?: string;\n /**\n * Custom stroke width (overrides color variant)\n */\n strokeWidth?: string | number;\n /**\n * Additional CSS class\n */\n className?: string;\n /**\n * Accessible label for screen readers\n */\n ariaLabel?: string;\n /**\n * Whether icon is decorative (hidden from screen readers)\n */\n decorative?: boolean;\n}\n\nexport const Icon: React.FC<IconProps> = ({\n svg,\n size = 'lg',\n color = 'inherit',\n fill = '',\n stroke = '',\n strokeWidth = '0',\n className = '',\n ariaLabel,\n decorative = false,\n ...props\n}) => {\n const classes = [\n 'icon-component',\n `icon-component--${size}`,\n color !== 'inherit' ? `icon-component--${color}` : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Build inline styles for custom fill/stroke/strokeWidth\n const customStyles: Record<string, string | number> = {};\n if (fill) customStyles['--icon-fill'] = fill;\n if (stroke) customStyles['--icon-stroke'] = stroke;\n if (strokeWidth !== undefined) customStyles['--icon-stroke-width'] = strokeWidth;\n\n return (\n <span\n className={classes}\n data-size={size}\n style={Object.keys(customStyles).length > 0 ? customStyles : undefined}\n role={decorative ? 'presentation' : 'img'}\n aria-label={decorative ? undefined : ariaLabel}\n aria-hidden={decorative ? 'true' : undefined}\n {...props}\n >\n {svg}\n </span>\n );\n};\n","import React from 'react';\nimport './RichText.scss';\n\nexport interface RichTextProps {\n /** HTML content to render */\n content: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Maximum width constraint */\n maxWidth?: string;\n}\n\n/**\n * RichText component for rendering styled HTML content\n * Inherits typography styles from Heading and TextLink components\n * Supports future extension for lists, paragraphs, and other HTML elements\n */\nexport const RichText: React.FC<RichTextProps> = ({ content, darkMode = false, className, style, maxWidth }) => {\n const richTextClasses = ['rich-text', className].filter(Boolean).join(' ');\n\n const finalStyle = maxWidth ? { ...style, maxWidth } : style;\n\n return (\n <div\n className={richTextClasses}\n style={finalStyle}\n data-dark-mode={darkMode ? 'true' : undefined}\n dangerouslySetInnerHTML={{ __html: content }}\n />\n );\n};\n","import React from 'react';\nimport type { SemanticColorTokens } from '@/themes/core/color-system';\nimport { toKebabCase } from '@/themes/utils/helpers';\nimport './Paragraph.scss';\n\nexport type ParagraphElement = 'p' | 'span' | 'div';\nexport type ColorPalette = 'primary' | 'secondary' | 'accent' | 'tertiary';\nexport type ParagraphWeight = 'light' | 'regular' | 'semibold' | 'bold' | 'black';\nexport type ParagraphSize = '2xl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs';\n\n// Typography variant type — matches Heading variants for consistent styling\nexport type ParagraphVariant = string;\n\n// Color type derives from SemanticColorTokens keys\nexport type ParagraphColor = keyof SemanticColorTokens;\n\nexport interface ParagraphProps {\n /** Paragraph content - supports text and HTML tags (bold, em, strong, etc) */\n children?: React.ReactNode;\n /** HTML element to render (default: 'p') */\n as?: ParagraphElement;\n /** Typography variant — applies the same variant styles as Heading (e.g., 'body', 'bodyBold', 'caption') */\n variant?: ParagraphVariant;\n /** Font weight (maps to --tier1-theme-typography-font-weight-*) */\n weight?: ParagraphWeight;\n /** Font size (maps to --tier1-theme-typography-font-size-*) */\n size?: ParagraphSize;\n /** Color from theme semantic tokens */\n color?: ParagraphColor;\n /** Color palette to apply (background + text) */\n palette?: ColorPalette;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Render HTML string (use with caution - sanitize external content) */\n dangerouslySetInnerHTML?: { __html: string };\n\n id?: string;\n role?: string;\n}\n\n/**\n * Paragraph component for body text\n * Supports text and HTML tags (bold, em, strong, etc)\n * Integrates with RichText component through shared tokens\n */\nexport const Paragraph: React.FC<ParagraphProps> = ({\n children,\n as = 'p',\n variant,\n weight,\n size,\n color,\n palette,\n darkMode = false,\n className,\n style,\n dangerouslySetInnerHTML,\n}) => {\n const Tag = as;\n\n // Apply palette and color styling only\n let finalStyle = style;\n\n if (palette) {\n finalStyle = {\n ...style,\n backgroundColor: `var(--${palette})`,\n color: `var(--${palette}-text)`,\n padding: style?.padding || '0.5rem 1rem',\n borderRadius: style?.borderRadius || '4px',\n };\n } else if (color) {\n finalStyle = {\n ...style,\n color: `var(--${toKebabCase(color as string)})`,\n };\n }\n\n // Note: weight and size are handled via data attributes and CSS variables\n // Don't apply inline styles for these - let the component-scoped tokens handle it\n\n const paragraphClasses = ['paragraph', variant && `paragraph--variant-${variant}`, className]\n .filter(Boolean)\n .join(' ');\n\n const commonProps = {\n className: paragraphClasses,\n style: finalStyle,\n 'data-dark-mode': darkMode ? 'true' : undefined,\n 'data-size': size || undefined,\n 'data-weight': weight || undefined,\n };\n\n if (dangerouslySetInnerHTML) {\n return <Tag {...commonProps} dangerouslySetInnerHTML={dangerouslySetInnerHTML} />;\n }\n\n return <Tag {...commonProps}>{children}</Tag>;\n};\n","import React from 'react';\nimport './BulletList.scss';\n\nexport interface BulletItem {\n /** Bullet point text content */\n text: React.ReactNode;\n /** Custom icon override for this specific item */\n icon?: React.ReactNode;\n}\n\nexport interface BulletListProps {\n /** Array of bullet items */\n items: BulletItem[];\n /** Custom icon for all bullet points (overridden by per-item icon) */\n icon?: React.ReactNode;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * BulletList atom for rendering styled bullet point lists.\n * Uses component-scoped tokens (--bullet-list-*) for theming.\n * RichText inherits these same tokens for `ul > li` rendering.\n */\n\nconst defaultIcon = (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"4\" />\n </svg>\n);\n\nexport const BulletList: React.FC<BulletListProps> = ({ items, icon, darkMode = false, className, style }) => {\n const classes = ['bullet-list', className].filter(Boolean).join(' ');\n\n return (\n <ul className={classes} style={style} role=\"list\" data-dark-mode={darkMode ? 'true' : undefined}>\n {items.map((item, index) => {\n const itemIcon = item.icon ?? icon ?? defaultIcon;\n return (\n <li key={index} className=\"bullet-list__item\">\n <span className=\"bullet-list__icon\" aria-hidden=\"true\">\n {itemIcon}\n </span>\n <span className=\"bullet-list__text\">{item.text}</span>\n </li>\n );\n })}\n </ul>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCircleXmark } from '@fortawesome/pro-duotone-svg-icons';\nimport './FilterPill.scss';\n\nexport type FilterPillStyle = 'navy' | 'blue' | 'white';\n\nexport interface FilterPillProps {\n /** Display label text */\n label: string;\n /** Visual style variant */\n pillStyle?: FilterPillStyle;\n /** Show dismiss (x-mark) badge */\n dismissible?: boolean;\n /** Callback when dismiss is clicked */\n onDismiss?: () => void;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * FilterPill — A small tag/badge for displaying active filters.\n * Supports three style variants (Navy, Blue, White), hover/focus states,\n * and an optional dismissible x-mark icon.\n */\nexport const FilterPill: React.FC<FilterPillProps> = ({\n label,\n pillStyle = 'white',\n dismissible = true,\n onDismiss,\n darkMode = false,\n className,\n}) => {\n const baseClass = 'filter-pill';\n const classes = [baseClass, `${baseClass}--${pillStyle}`, className].filter(Boolean).join(' ');\n\n return (\n <span className={classes} data-dark-mode={darkMode || undefined} role=\"listitem\">\n <span className={`${baseClass}__label`}>{label}</span>\n {dismissible && (\n <button\n type=\"button\"\n className={`${baseClass}__dismiss`}\n onClick={onDismiss}\n aria-label={`Remove ${label} filter`}\n >\n <FontAwesomeIcon icon={faCircleXmark} className={`${baseClass}__dismiss-icon`} />\n </button>\n )}\n </span>\n );\n};\n","import React from 'react';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './AssetMeta.scss';\n\nexport interface AssetMetaProps {\n /** Asset type/category label */\n assetType?: string;\n /** Duration string or duration in minutes (renders as \"12 Mins\") */\n duration?: string | number;\n /** Date or timestamp string */\n date?: string;\n /** Separator between duration and date */\n separator?: string;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * AssetMeta — Reusable metadata block for content assets.\n *\n * Renders the common pattern of:\n * - Asset type/category (bold)\n * - Duration | Date (secondary text)\n *\n */\nexport const AssetMeta: React.FC<AssetMetaProps> = ({\n assetType,\n duration,\n date,\n separator = ' | ',\n darkMode = false,\n className = '',\n}) => {\n const durationText = typeof duration === 'number' ? `${duration} Mins` : duration;\n const metaParts: string[] = [];\n if (durationText) metaParts.push(durationText);\n if (date) metaParts.push(date);\n const metaLine = metaParts.join(separator);\n\n // Don't render if nothing to show\n if (!assetType && !metaLine) return null;\n\n const classes = ['asset-meta', className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n {assetType && (\n <Paragraph className=\"asset-meta__type\" darkMode={darkMode}>\n {assetType}\n </Paragraph>\n )}\n {metaLine && (\n <Paragraph className=\"asset-meta__details\" darkMode={darkMode}>\n {metaLine}\n </Paragraph>\n )}\n </div>\n );\n};\n","import React from 'react';\n\nexport type ObjectFit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n\n/**\n * Image configuration interface extending native img attributes with layout props.\n * Reusable across any component that renders an image (Card, SideBar, PostItem, etc.)\n */\nexport interface ImageProps extends Pick<\n React.ImgHTMLAttributes<HTMLImageElement>,\n 'src' | 'alt' | 'srcSet' | 'sizes' | 'loading' | 'decoding'\n> {\n /** Required image source URL */\n src: string;\n /** How the image fills its container (default: 'cover') */\n objectFit?: ObjectFit;\n /** Object position (e.g. \"center top\") */\n objectPosition?: string;\n /** Aspect ratio (e.g. \"16/9\", \"3/2\") */\n aspectRatio?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/** Atom component for rendering images with layout control */\nexport const Image: React.FC<ImageProps> = ({\n src,\n alt = '',\n objectFit = 'cover',\n objectPosition,\n aspectRatio,\n srcSet,\n sizes,\n loading = 'lazy',\n decoding,\n\n className = '',\n}) => {\n const classes = ['image', className].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n objectFit,\n objectPosition,\n aspectRatio,\n width: '100%',\n height: '100%',\n display: 'block',\n };\n\n return (\n <img\n className={classes}\n src={src}\n alt={alt}\n srcSet={srcSet}\n sizes={sizes}\n loading={loading}\n decoding={decoding}\n style={style}\n />\n );\n};\n","import React, { useState, useCallback, useRef, useEffect, useId } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons';\nimport { RichText } from '@/components/atoms/RichText';\nimport './Accordion.scss';\n\nexport interface AccordionItem {\n /** Unique identifier for the item */\n id: string;\n /** Title displayed in the accordion header */\n title: string;\n /** Rich text HTML content for the expanded panel */\n content: string;\n}\n\nexport interface AccordionProps {\n /** Array of accordion items */\n items: AccordionItem[];\n /** Index of the initially open item (undefined = all closed) */\n defaultOpenIndex?: number;\n /** Allow multiple items open simultaneously */\n allowMultiple?: boolean;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Custom chevron icon (ReactNode) — defaults to built-in SVG chevron */\n chevronIcon?: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n /** Callback when an item is toggled */\n onToggle?: (itemId: string, isOpen: boolean) => void;\n}\n\n/** Default chevron using FontAwesome */\nconst DefaultChevron: React.FC = () => <FontAwesomeIcon icon={faChevronDown} aria-hidden=\"true\" />;\n\n/**\n * Accordion component — expandable/collapsible content panels.\n *\n * By default only one item stays open at a time (single-expand mode).\n * Set `allowMultiple` to allow multiple panels open simultaneously.\n * Content renders via RichText component for HTML support.\n */\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n defaultOpenIndex,\n allowMultiple = false,\n darkMode = false,\n chevronIcon,\n className,\n onToggle,\n}) => {\n const baseId = useId();\n\n // Track open items as a Set of IDs\n const [openItems, setOpenItems] = useState<Set<string>>(() => {\n if (defaultOpenIndex !== undefined && items[defaultOpenIndex]) {\n return new Set([items[defaultOpenIndex].id]);\n }\n return new Set();\n });\n\n const handleToggle = useCallback(\n (itemId: string) => {\n setOpenItems((prev) => {\n const next = new Set(prev);\n const isCurrentlyOpen = next.has(itemId);\n\n if (isCurrentlyOpen) {\n next.delete(itemId);\n } else {\n if (!allowMultiple) {\n next.clear();\n }\n next.add(itemId);\n }\n\n onToggle?.(itemId, !isCurrentlyOpen);\n return next;\n });\n },\n [allowMultiple, onToggle]\n );\n\n const baseClass = 'accordion';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined} role=\"region\">\n {items.map((item, index) => {\n const isOpen = openItems.has(item.id);\n const headerId = `${baseId}-header-${index}`;\n const panelId = `${baseId}-panel-${index}`;\n\n return (\n <AccordionItemPanel\n key={item.id}\n item={item}\n isOpen={isOpen}\n headerId={headerId}\n panelId={panelId}\n darkMode={darkMode}\n chevronIcon={chevronIcon}\n onToggle={handleToggle}\n />\n );\n })}\n </div>\n );\n};\n\n/** Individual accordion item with animated expand/collapse */\ninterface AccordionItemPanelProps {\n item: AccordionItem;\n isOpen: boolean;\n headerId: string;\n panelId: string;\n darkMode: boolean;\n chevronIcon?: React.ReactNode;\n onToggle: (itemId: string) => void;\n}\n\nconst AccordionItemPanel: React.FC<AccordionItemPanelProps> = ({\n item,\n isOpen,\n headerId,\n panelId,\n darkMode,\n chevronIcon,\n onToggle,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentHeight, setContentHeight] = useState<number>(0);\n\n // Measure content height for slide animation\n useEffect(() => {\n if (contentRef.current) {\n setContentHeight(contentRef.current.scrollHeight);\n }\n }, [isOpen, item.content]);\n\n const baseClass = 'accordion';\n\n return (\n <div className={`${baseClass}__item ${isOpen ? `${baseClass}__item--open` : ''}`}>\n <button\n id={headerId}\n className={`${baseClass}__header`}\n onClick={() => onToggle(item.id)}\n aria-expanded={isOpen}\n aria-controls={panelId}\n type=\"button\"\n >\n <span className={`${baseClass}__title`}>{item.title}</span>\n <span className={`${baseClass}__chevron`}>{chevronIcon || <DefaultChevron />}</span>\n </button>\n\n <div\n id={panelId}\n className={`${baseClass}__panel`}\n role=\"region\"\n aria-labelledby={headerId}\n aria-hidden={!isOpen}\n style={{ height: isOpen ? contentHeight : 0 }}\n >\n <div className={`${baseClass}__content`} ref={contentRef}>\n <RichText content={item.content} darkMode={darkMode} />\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Button } from '../../atoms/Button/Button';\nimport './Header.scss';\n\ntype User = {\n name: string;\n};\n\nexport interface HeaderProps {\n user?: User;\n onLogin?: () => void;\n onLogout?: () => void;\n onCreateAccount?: () => void;\n}\n\nexport const Header = ({ user, onLogin, onLogout, onCreateAccount }: HeaderProps) => (\n <header>\n <div className=\"storybook-header\">\n <div>\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill=\"none\" fillRule=\"evenodd\">\n <path d=\"M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z\" fill=\"#FFF\" />\n <path d=\"M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z\" fill=\"#555AB9\" />\n <path d=\"M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z\" fill=\"#91BAF8\" />\n </g>\n </svg>\n <h1>Acme</h1>\n </div>\n <div>\n {user ? (\n <>\n <span className=\"welcome\">\n Welcome, <b>{user.name}</b>!\n </span>\n <Button buttonType=\"secondary\" onClick={onLogout} label=\"Log out\" />\n </>\n ) : (\n <>\n <Button buttonType=\"secondary\" onClick={onLogin} label=\"Log in\" />\n <Button buttonType=\"cta\" onClick={onCreateAccount} label=\"Sign up\" />\n </>\n )}\n </div>\n </div>\n </header>\n);\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { Media, MediaProps } from '@/components/atoms/Media';\nimport './VideoPlayer.scss';\n\nconst WISTIA_PLAYER_SCRIPT = 'https://fast.wistia.com/player.js';\n\nlet wistiaScriptLoaded = false;\nlet wistiaScriptLoading = false;\nconst wistiaLoadCallbacks: (() => void)[] = [];\n\nfunction ensureWistiaScript(): Promise<void> {\n if (wistiaScriptLoaded) return Promise.resolve();\n\n return new Promise((resolve) => {\n wistiaLoadCallbacks.push(resolve);\n\n if (wistiaScriptLoading) return;\n wistiaScriptLoading = true;\n\n // Check if script already exists in DOM\n const existing = document.querySelector(`script[src=\"${WISTIA_PLAYER_SCRIPT}\"]`);\n if (existing) {\n wistiaScriptLoaded = true;\n wistiaLoadCallbacks.forEach((cb) => cb());\n wistiaLoadCallbacks.length = 0;\n return;\n }\n\n const script = document.createElement('script');\n script.src = WISTIA_PLAYER_SCRIPT;\n script.async = true;\n script.onload = () => {\n wistiaScriptLoaded = true;\n wistiaLoadCallbacks.forEach((cb) => cb());\n wistiaLoadCallbacks.length = 0;\n };\n document.head.appendChild(script);\n });\n}\n\n/** Extract Wistia video ID from various URL formats */\nfunction extractWistiaId(url: string): string | null {\n const match =\n url.match(/(?:medias|iframe|embed)\\/([a-zA-Z0-9]+)/) ||\n url.match(/wi\\.st\\/medias\\/([a-zA-Z0-9]+)/) ||\n url.match(/wistia\\.com\\/medias\\/([a-zA-Z0-9]+)/);\n return match?.[1] ?? null;\n}\n\nfunction isWistiaUrl(url: string): boolean {\n return /wistia\\.(com|net)/i.test(url) || /wi\\.st/i.test(url);\n}\n\nexport type VideoPlaybackMode = 'inline' | 'popover';\n\nexport interface VideoPlayerProps {\n /** Video source URL (native video file, Wistia, or any provider supported by Media) */\n src: string;\n /** Thumbnail image URL. If omitted, shows the video directly. */\n thumbnail?: string;\n /** Alt text for thumbnail image and video title */\n alt?: string;\n /** Custom play button element/icon. Receives default styling wrapper. */\n playIcon?: React.ReactNode;\n /** Playback mode: 'inline' plays in-place, 'popover' opens Wistia lightbox */\n playbackMode?: VideoPlaybackMode;\n /** Aspect ratio for the player container (e.g. \"16/9\") */\n aspectRatio?: string;\n /** Additional Media props passed to the video when playing inline */\n mediaProps?: Partial<MediaProps>;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/** Molecule that composes Media atom with thumbnail, play button, and playback modes */\nexport const VideoPlayer: React.FC<VideoPlayerProps> = ({\n src,\n thumbnail,\n alt = '',\n playIcon,\n playbackMode = 'inline',\n aspectRatio = '16/9',\n mediaProps,\n darkMode = false,\n className,\n style,\n}) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const wistiaId = isWistiaUrl(src) ? extractWistiaId(src) : null;\n\n const baseClass = 'video-player';\n const classes = [baseClass, isPlaying && `${baseClass}--playing`, className].filter(Boolean).join(' ');\n\n useEffect(() => {\n if (playbackMode !== 'popover' || !wistiaId) return;\n\n ensureWistiaScript().then(() => {\n const mediaScriptSrc = `https://fast.wistia.com/embed/${wistiaId}.js`;\n if (!document.querySelector(`script[src=\"${mediaScriptSrc}\"]`)) {\n const mediaScript = document.createElement('script');\n mediaScript.src = mediaScriptSrc;\n mediaScript.async = true;\n mediaScript.type = 'module';\n document.head.appendChild(mediaScript);\n }\n });\n }, [playbackMode, wistiaId]);\n\n const handlePlay = useCallback(() => {\n if (playbackMode === 'inline') {\n setIsPlaying(true);\n }\n }, [playbackMode]);\n\n const renderPlayIcon = () => {\n if (playIcon) {\n return <div className={`${baseClass}__play-icon`}>{playIcon}</div>;\n }\n\n return (\n <div className={`${baseClass}__play-icon`}>\n <svg viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle\n cx=\"32\"\n cy=\"32\"\n r=\"31\"\n fill=\"var(--video-player-play-icon-bg, rgba(0, 0, 0, 0.6))\"\n stroke=\"var(--video-player-play-icon-border, rgba(255, 255, 255, 0.8))\"\n strokeWidth=\"2\"\n />\n <polygon points=\"26,20 26,44 46,32\" fill=\"var(--video-player-play-icon-color, #fff)\" />\n </svg>\n </div>\n );\n };\n\n const cssVars: React.CSSProperties = {\n ...style,\n };\n\n if (playbackMode === 'popover' && wistiaId) {\n const transparentPng =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\n return (\n <div\n className={classes}\n style={cssVars}\n data-dark-mode={darkMode || undefined}\n ref={(node) => {\n if (!node) return;\n const existing = node.querySelector('wistia-player');\n if (existing) return;\n\n const player = document.createElement('wistia-player');\n player.setAttribute('media-id', wistiaId);\n player.setAttribute('wistia-popover', '');\n player.setAttribute('popover-content', 'html');\n player.setAttribute('poster', transparentPng);\n player.style.display = 'block';\n player.style.width = '100%';\n if (aspectRatio) player.style.aspectRatio = aspectRatio;\n\n const thumbnailEl = node.querySelector(`.${baseClass}__thumbnail-wrapper`);\n if (thumbnailEl) {\n player.appendChild(thumbnailEl);\n }\n\n node.insertBefore(player, node.firstChild);\n }}\n >\n <div className={`${baseClass}__thumbnail-wrapper`} style={{ aspectRatio }}>\n {thumbnail && <Media src={thumbnail} type=\"image\" alt={alt} objectFit=\"cover\" aspectRatio={aspectRatio} />}\n {renderPlayIcon()}\n </div>\n </div>\n );\n }\n\n if (isPlaying) {\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <Media src={src} type=\"video\" alt={alt} autoplay controls aspectRatio={aspectRatio} {...mediaProps} />\n </div>\n );\n }\n\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <button\n className={`${baseClass}__thumbnail-wrapper`}\n onClick={handlePlay}\n aria-label={`Play video: ${alt}`}\n type=\"button\"\n style={{ aspectRatio }}\n >\n {thumbnail ? (\n <Media src={thumbnail} type=\"image\" alt={alt} objectFit=\"cover\" aspectRatio={aspectRatio} />\n ) : (\n <div className={`${baseClass}__placeholder`} />\n )}\n {renderPlayIcon()}\n </button>\n </div>\n );\n};\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { Media } from '@/components/atoms/Media';\nimport { SPARKLE_OVERLAY_PATH, SPARK_SMALL_SPARKS_PATH, SPARK_ICON_LARGE_PATH, SPARK_ICON_SMALL_PATH } from './assets';\nimport './MediaBlock.scss';\n\nexport type MediaBlockVariant = 'default' | 'croppedSpark';\n\nexport interface MediaBlockProps {\n /** Display variant — \"default\" for the standard grid layout, \"croppedSpark\" for sparkle-masked image with decorative sparks */\n variant?: MediaBlockVariant;\n /** Video source URL (mp4, webm, Wistia embed URL, etc.). Not used for static images. */\n src?: string;\n /** Image URL — used as the display image for image-only blocks, or as the video thumbnail when src/wistiaId is set */\n thumbnail?: string;\n /** Alt text for accessibility */\n alt?: string;\n /** Custom play button element (e.g. primax play button PNG) */\n playIcon?: React.ReactNode;\n /** Aspect ratio for the media (e.g. \"16/9\") */\n aspectRatio?: string;\n /** Show the L-shaped mint accent border */\n accentBorder?: boolean;\n /** Show the dark overlay on thumbnail */\n overlay?: boolean;\n /** Show the decorative sparkle overlay */\n sparkle?: boolean;\n /** Source URL for the sparkle overlay image (SVG or PNG) */\n sparkSrc?: string;\n /** Scale the sparkle size from 1 (10%) to 10 (100%) */\n sparkScale?: number;\n /** Mirror decorative elements (L-shape on left, sparkle on right) */\n mirror?: boolean;\n /** Toggle video controls prop */\n controls?: boolean;\n /** Override the L-shaped accent border color (e.g. \"#00FFD2\" or \"var(--color-secondary-200)\") */\n accentColor?: string;\n /** Wistia media ID. Used for inline embed by default, or popover lightbox when popover=true */\n wistiaId?: string;\n /** When true and wistiaId is set, opens the video in a Wistia popover lightbox instead of inline */\n popover?: boolean;\n /** Source URL for the sparkle mask image (used by croppedSpark variant) */\n sparkMaskSrc?: string;\n /** Source URL for the small decorative sparks SVG (used by croppedSpark variant on tablet/mobile) */\n sparkSmallSrc?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/** Detect if a source URL is a video */\nfunction isVideoSource(src: string): boolean {\n const videoExts = /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i;\n const videoProviders = /wistia\\.(com|net)|wi\\.st/i;\n return videoExts.test(src) || videoProviders.test(src);\n}\n\nconst WISTIA_PLAYER_SCRIPT_ID = 'wistia-player-script';\nconst WISTIA_PLAYER_SCRIPT_SRC = 'https://fast.wistia.com/player.js';\n\n/** Load the Wistia player.js script (new Web Component API) */\nfunction loadWistiaPlayerScript(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(WISTIA_PLAYER_SCRIPT_ID)) return;\n const script = document.createElement('script');\n script.id = WISTIA_PLAYER_SCRIPT_ID;\n script.src = WISTIA_PLAYER_SCRIPT_SRC;\n script.async = true;\n document.head.appendChild(script);\n}\n\n/** Load the Wistia media-specific module script */\nfunction loadWistiaMediaModule(mediaId: string): void {\n if (typeof document === 'undefined') return;\n const moduleId = `wistia-module-${mediaId}`;\n if (document.getElementById(moduleId)) return;\n const script = document.createElement('script');\n script.id = moduleId;\n script.src = `https://fast.wistia.com/embed/${mediaId}.js`;\n script.async = true;\n script.type = 'module';\n document.head.appendChild(script);\n}\n\nexport const MediaBlock: React.FC<MediaBlockProps> = ({\n variant = 'default',\n src,\n thumbnail,\n alt = '',\n playIcon,\n aspectRatio = '',\n accentBorder = false,\n overlay = false,\n sparkle = false,\n controls = true,\n accentColor,\n sparkSrc = SPARKLE_OVERLAY_PATH,\n sparkScale,\n mirror = false,\n wistiaId,\n popover = false,\n sparkSmallSrc = SPARK_SMALL_SPARKS_PATH,\n className,\n}) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const videoHandleRef = useRef<any>(null);\n const videoContainerRef = useRef<HTMLDivElement>(null);\n\n // Determine display mode\n const isPopover = !!wistiaId && popover;\n // Wistia inline: wistiaId without popover — build embed URL for the Media atom\n const wistiaInlineSrc = wistiaId && !popover ? `https://fast.wistia.com/medias/${wistiaId}` : undefined;\n const videoSrc = src || wistiaInlineSrc;\n const hasVideo = isPopover || (!!videoSrc && isVideoSource(videoSrc));\n const isImage = !hasVideo && !!thumbnail;\n\n const baseClass = 'media-block';\n const classes = [\n baseClass,\n variant !== 'default' && `${baseClass}--${variant}`,\n accentBorder && `${baseClass}--accent`,\n mirror && `${baseClass}--mirror`,\n hasVideo && `${baseClass}--video`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Load Wistia popover scripts (only needed for popover mode)\n useEffect(() => {\n if (!isPopover || !wistiaId) return;\n loadWistiaPlayerScript();\n loadWistiaMediaModule(wistiaId);\n }, [isPopover, wistiaId]);\n\n // Store the Wistia video handle when Media reports ready\n const handleVideoReady = useCallback((handle: any) => {\n videoHandleRef.current = handle;\n }, []);\n\n // On play click: show video and trigger playback (non-popover mode)\n const handlePlay = useCallback(() => {\n if (!hasVideo || isPopover) return;\n setIsPlaying(true);\n\n // Wistia handle\n if (videoHandleRef.current?.play) {\n videoHandleRef.current.play();\n return;\n }\n\n // Native <video> element — find it in the container\n const videoEl = videoContainerRef.current?.querySelector('video');\n if (videoEl) {\n videoEl.play().catch(() => {});\n }\n }, [hasVideo, isPopover]);\n\n // Render the thumbnail with play button (used for inline video mode)\n const renderThumbnailOverlay = (onClick: () => void) => (\n <button className={`${baseClass}__trigger`} onClick={onClick} aria-label={`Play video: ${alt}`} type=\"button\">\n {thumbnail && <Media src={thumbnail} type=\"image\" alt=\"\" objectFit=\"cover\" aspectRatio={aspectRatio} />}\n {overlay && <div className={`${baseClass}__overlay`} aria-hidden=\"true\" />}\n {playIcon && (\n <div className={`${baseClass}__play-icon`} aria-hidden=\"true\">\n {playIcon}\n </div>\n )}\n </button>\n );\n\n // ── croppedSpark variant: sparkle-masked image with decorative spark icons ──\n if (variant === 'croppedSpark') {\n // Spark mask SVG path (from spark-mask.svg, viewBox 0 0 218 239)\n const sparkPath =\n 'M215.208 122.007C197.838 122.065 179.583 127.759 164.968 135.541C124.822 156.905 112.194 197.875 111.885 236.575C111.856 239.811 106.136 239.806 106.112 236.575C105.798 197.875 93.1749 156.91 53.0289 135.541C38.4141 127.764 20.154 122.065 2.78832 122.007C-0.934274 121.992 -0.924605 116.998 2.78832 116.983C20.1588 116.93 38.4141 111.23 53.0289 103.449C93.1749 82.0848 105.798 41.1197 106.112 2.41994C106.098 0.796987 107.553 0 108.998 0C110.449 0 111.904 0.801817 111.889 2.41994C112.194 41.1197 124.827 82.0848 164.973 103.454C179.587 111.23 197.848 116.93 215.213 116.988C218.936 117.002 218.926 121.997 215.213 122.011L215.208 122.007Z';\n\n return (\n <figure className={classes} role=\"group\" aria-label={alt || 'Media content'}>\n <div className={`${baseClass}__cropped-spark`}>\n {/* Inline SVG sparkle shape — clip image + stroke border */}\n <svg\n className={`${baseClass}__spark-svg`}\n viewBox=\"0 0 218 239\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <clipPath id=\"spark-clip\">\n <path d={sparkPath} />\n </clipPath>\n </defs>\n\n {/* Image clipped to sparkle shape */}\n <foreignObject x=\"0\" y=\"0\" width=\"218\" height=\"239\" clipPath=\"url(#spark-clip)\">\n {thumbnail && (\n <img\n src={thumbnail}\n alt={alt}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n }}\n />\n )}\n </foreignObject>\n\n {/* Solid stroke on the sparkle shape */}\n <path className={`${baseClass}__spark-svg-stroke`} d={sparkPath} fill=\"none\" />\n </svg>\n\n {/* Decorative spark icons (large + small) */}\n <img\n className={`${baseClass}__spark-icon ${baseClass}__spark-icon--large`}\n src={SPARK_ICON_LARGE_PATH}\n alt=\"\"\n aria-hidden=\"true\"\n />\n <img\n className={`${baseClass}__spark-icon ${baseClass}__spark-icon--small`}\n src={SPARK_ICON_SMALL_PATH}\n alt=\"\"\n aria-hidden=\"true\"\n />\n\n {/* Small sparks — visible on tablet/mobile as fallback decoration */}\n <img className={`${baseClass}__spark-small-sparks`} src={sparkSmallSrc} alt=\"\" aria-hidden=\"true\" />\n </div>\n </figure>\n );\n }\n\n return (\n <figure\n className={classes}\n role=\"group\"\n aria-label={alt || 'Media content'}\n style={accentColor ? ({ '--media-block-accent-color': accentColor } as React.CSSProperties) : undefined}\n >\n <div className={`${baseClass}__grid`}>\n {/* Decorative sparkle overlay */}\n {sparkle && (\n <div\n className={`${baseClass}__spark`}\n aria-hidden=\"true\"\n style={sparkScale ? ({ '--media-block-spark-scale': sparkScale / 10 } as React.CSSProperties) : undefined}\n >\n <img src={sparkSrc} alt=\"\" />\n </div>\n )}\n\n {/* Media container */}\n <div className={`${baseClass}__inner`} ref={videoContainerRef}>\n {isImage && thumbnail ? (\n <Media src={thumbnail} type=\"image\" alt={alt} objectFit=\"cover\" aspectRatio={aspectRatio} />\n ) : isPopover ? (\n <>\n {/* Visual thumbnail layer (non-interactive, purely decorative) */}\n <div className={`${baseClass}__popover-thumbnail`} aria-hidden=\"true\">\n {thumbnail && <Media src={thumbnail} type=\"image\" alt=\"\" objectFit=\"cover\" aspectRatio={aspectRatio} />}\n {overlay && <div className={`${baseClass}__overlay`} />}\n {playIcon && <div className={`${baseClass}__play-icon`}>{playIcon}</div>}\n </div>\n\n {/* Transparent Wistia popover player on top — receives the actual click */}\n <div className={`${baseClass}__wistia-popover`}>\n {React.createElement('wistia-player', {\n 'media-id': wistiaId,\n 'wistia-popover': 'true',\n aspect: '1.7777777777777777',\n style: { width: '100%', height: '100%' },\n })}\n </div>\n </>\n ) : videoSrc ? (\n <>\n {/* Video preloads behind the thumbnail */}\n <Media\n src={videoSrc}\n type=\"video\"\n alt={alt}\n controls={controls}\n aspectRatio={aspectRatio}\n onReady={handleVideoReady}\n className={`${baseClass}__video-layer`}\n />\n\n {/* Thumbnail overlay — hides once playing */}\n {!isPlaying && renderThumbnailOverlay(handlePlay)}\n </>\n ) : null}\n </div>\n\n {/* L-shaped accent */}\n {accentBorder && <div className={`${baseClass}__accent-side`} aria-hidden=\"true\" />}\n {accentBorder && <div className={`${baseClass}__accent-bottom`} aria-hidden=\"true\" />}\n </div>\n </figure>\n );\n};\n","export default \"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%22224%22%20height%3D%22224%22%20viewBox%3D%220%200%20224%20224%22%20fill%3D%22none%22%3E%20%20%3Cpath%20d%3D%22M0.87146%208.04027C-2.23028%203.39342%203.61165%20-2.23422%208.22653%200.913946C50.1288%2029.4986%2074.7621%2038.9595%20108.417%2041.2004C144.268%2040.259%20168.419%2032.9657%20207.023%209.04353C211.607%206.20271%20217.138%2011.584%20214.28%2016.1584L207.095%2027.6592L197.353%2044.936C197.233%2045.1482%20197.129%2045.369%20197.042%2045.5965L188.666%2067.367C188.58%2067.5906%20188.51%2067.8202%20188.457%2068.0539L183.062%2091.7796C182.998%2092.0584%20182.959%2092.3422%20182.944%2092.6278L181.818%20114.177C181.804%20114.457%20181.813%20114.738%20181.845%20115.016L184.062%20134.065L189.35%20155.826C189.424%20156.13%20189.526%20156.426%20189.656%20156.711L199.198%20177.743L210.718%20197.93L222.95%20215.579C226.11%20220.138%20220.604%20225.686%20216.023%20222.558L198.236%20210.415L178.309%20198.637L156.966%20189.313C156.722%20189.207%20156.47%20189.12%20156.212%20189.053L134.642%20183.498L115.598%20181.28C115.32%20181.248%20115.039%20181.239%20114.759%20181.253L93.2054%20182.38C92.9265%20182.394%2092.6493%20182.432%2092.3767%20182.493L72.3782%20186.96L52.1128%20193.684C51.8508%20193.771%2051.5964%20193.88%2051.3523%20194.009L30.0474%20205.263L15.9227%20214.159C11.3991%20217.008%206.16338%20211.724%209.05253%20207.225L18.0312%20193.244L26.1703%20177.942L33.03%20160.852L40.0008%20133.277C40.0836%20132.95%2040.133%20132.615%2040.1483%20132.277L41.2088%20108.832C41.2216%20108.549%2041.2104%20108.266%2041.1752%20107.985L37.2945%2076.9864C37.2429%2076.574%2037.14%2076.1696%2036.9884%2075.7827L26.8364%2049.8781C26.7491%2049.6552%2026.6458%2049.4389%2026.5275%2049.2308L15.9527%2030.6342L0.87146%208.04027Z%22%20fill%3D%22url%28%23pattern0_1168_343%29%22%2F%3E%20%20%3Cdefs%3E%20%20%20%20%3Cpattern%20id%3D%22pattern0_1168_343%22%20patternUnits%3D%22userSpaceOnUse%22%20patternTransform%3D%22matrix%284.28304%20-4.28413%204.71404%204.71523%20-101.391%20103.538%29%22%20preserveAspectRatio%3D%22none%22%20viewBox%3D%2215.3594%2022.6016%20201.93%20222.25%22%20width%3D%221%22%20height%3D%221%22%3E%20%20%20%20%20%20%3Cg%20id%3D%22pattern0_1168_343_inner%22%3E%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M74.2117%2026.5152C75.2622%2021.2484%2083.3188%2021.3292%2084.6373%2026.5354C88.6999%2042.5762%2093.807%2052.1527%20102.548%2062.1325C113.95%2072.9426%20123.867%2078.746%20141.357%2083.488C145.376%2084.5776%20145.43%2090.6299%20141.372%2091.5657L132.206%2094.119C131.971%2094.1844%20131.742%2094.2668%20131.519%2094.3656L121.43%2098.844C121.211%2098.9411%20120.999%2099.0539%20120.796%2099.1814L111.064%20105.302C110.822%20105.454%20110.594%20105.626%20110.381%20105.818L102.861%20112.586C102.653%20112.773%20102.461%20112.978%20102.287%20113.198L96.5987%20120.379L91.0265%20129.522C90.8636%20129.79%2090.7262%20130.072%2090.616%20130.365L86.7273%20140.707L83.7306%20151.667C82.8621%20156.457%2075.9966%20156.45%2075.0931%20151.667L72.2727%20140.707L68.1884%20130.297C68.091%20130.049%2067.974%20129.809%2067.8384%20129.579L62.4013%20120.379L56.7134%20113.198C56.5394%20112.978%2056.3471%20112.773%2056.1388%20112.586L48.6112%20105.811C48.4037%20105.624%2048.1808%20105.455%2047.945%20105.306L39.6619%20100.051L30.5137%2095.4636C30.267%2095.3399%2030.0105%2095.2369%2029.7468%2095.1555L18.6851%2091.7424C14.2515%2090.7358%2014.2426%2084.401%2018.6851%2083.4343L26.7938%2080.9596L35.0787%2077.4242L46.8055%2070.4367C47.0955%2070.2638%2047.3673%2070.0621%2047.6167%2069.8345L55.7411%2062.4194C55.9503%2062.2285%2056.1428%2062.0202%2056.3167%2061.7967L65.3661%2050.1658C65.6214%2049.8377%2065.8348%2049.479%2066.0013%2049.0981L71.2473%2037.0973C71.3432%2036.8778%2071.4232%2036.6518%2071.4868%2036.4208L74.2117%2026.5152Z%22%20fill%3D%22%2300FFD2%22%2F%3E%20%20%20%20%20%20%3C%2Fg%3E%20%20%20%20%3C%2Fpattern%3E%3C%2Fdefs%3E%20%20%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22297%22%20height%3D%22189%22%20viewBox%3D%220%200%20297%20189%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M295.475%2068.9159C285.993%2068.9486%20276.028%2072.1653%20268.051%2076.5607C246.136%2088.6283%20239.243%20111.77%20239.074%20133.63C239.058%20135.458%20235.936%20135.455%20235.923%20133.63C235.752%20111.77%20228.861%2088.631%20206.947%2076.5607C198.969%2072.1681%20189.001%2068.9486%20179.522%2068.9159C177.49%2068.9077%20177.495%2066.0865%20179.522%2066.0784C189.004%2066.0483%20198.969%2062.8289%20206.947%2058.4335C228.861%2046.3659%20235.752%2023.2266%20235.923%201.36691C235.915%200.450181%20236.71%200%20237.499%200C238.29%200%20239.085%200.452909%20239.077%201.36691C239.243%2023.2266%20246.139%2046.3659%20268.053%2058.4362C276.031%2062.8289%20285.999%2066.0483%20295.478%2066.0811C297.51%2066.0893%20297.505%2068.9104%20295.478%2068.9186L295.475%2068.9159Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3Cpath%20d%3D%22M66.1416%20151.797C60.8029%20151.816%2055.1924%20153.626%2050.7008%20156.101C38.3624%20162.894%2034.4814%20175.923%2034.3863%20188.229C34.3774%20189.258%2032.6196%20189.256%2032.6122%20188.229C32.5156%20175.923%2028.6361%20162.896%2016.2977%20156.101C11.8061%20153.628%206.19407%20151.816%200.856955%20151.797C-0.287137%20151.792%20-0.284166%20150.204%200.856955%20150.2C6.19556%20150.183%2011.8061%20148.37%2016.2977%20145.896C28.6361%20139.102%2032.5156%20126.076%2032.6122%20113.77C32.6078%20113.253%2033.055%20113%2033.4993%20113C33.945%20113%2034.3922%20113.255%2034.3878%20113.77C34.4814%20126.076%2038.3639%20139.102%2050.7022%20145.897C55.1939%20148.37%2060.8059%20150.183%2066.143%20150.201C67.2871%20150.206%2067.2842%20151.794%2066.143%20151.799L66.1416%20151.797Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22218%22%20height%3D%22239%22%20viewBox%3D%220%200%20218%20239%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M215.208%20122.007C197.838%20122.065%20179.583%20127.759%20164.968%20135.541C124.822%20156.905%20112.194%20197.875%20111.885%20236.575C111.856%20239.811%20106.136%20239.806%20106.112%20236.575C105.798%20197.875%2093.1749%20156.91%2053.0289%20135.541C38.4141%20127.764%2020.154%20122.065%202.78832%20122.007C-0.934274%20121.992%20-0.924605%20116.998%202.78832%20116.983C20.1588%20116.93%2038.4141%20111.23%2053.0289%20103.449C93.1749%2082.0848%20105.798%2041.1197%20106.112%202.41994C106.098%200.796987%20107.553%200%20108.998%200C110.449%200%20111.904%200.801817%20111.889%202.41994C112.194%2041.1197%20124.827%2082.0848%20164.973%20103.454C179.587%20111.23%20197.848%20116.93%20215.213%20116.988C218.936%20117.002%20218.926%20121.997%20215.213%20122.011L215.208%20122.007Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22123%22%20height%3D%22135%22%20viewBox%3D%220%200%20123%20135%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M121.373%2068.9159C111.577%2068.9486%20101.281%2072.1653%2093.0387%2076.5607C70.3971%2088.6283%2063.2753%20111.77%2063.1008%20133.63C63.0844%20135.458%2059.8589%20135.455%2059.8452%20133.63C59.668%20111.77%2052.5489%2088.631%2029.9073%2076.5607C21.6648%2072.1681%2011.3665%2068.9486%201.57256%2068.9159C-0.526913%2068.9077%20-0.521459%2066.0865%201.57256%2066.0784C11.3692%2066.0483%2021.6648%2062.8289%2029.9073%2058.4335C52.5489%2046.3659%2059.668%2023.2266%2059.8452%201.36691C59.837%200.450181%2060.6577%200%2061.473%200C62.291%200%2063.1117%200.452909%2063.1035%201.36691C63.2753%2023.2266%2070.3998%2046.3659%2093.0414%2058.4362C101.284%2062.8289%20111.582%2066.0483%20121.376%2066.0811C123.476%2066.0893%20123.47%2068.9104%20121.376%2068.9186L121.373%2068.9159Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3C%2Fsvg%3E\"","import React from 'react';\nimport { Breadcrumb } from '@/components/atoms/Breadcrumb';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem, GridProps } from '@/components/atoms/Grid';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { Media } from '@/components/atoms/Media';\nimport { MediaBlock, MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport { toKebabCase } from '@/themes/utils';\nimport './Banner.scss';\n\ntype CTABannerVariant = 'hero' | 'videoBackground' | 'level2' | 'level2Video' | 'gated' | 'level3';\ntype Alignment = 'left' | 'center' | 'right';\ntype VerticalAlignment = 'top' | 'center' | 'bottom';\n\n/** Banner-specific media props — extends MediaBlockProps with layout constraints */\nexport interface BannerMediaProps extends MediaBlockProps {\n /** Width constraint for column media */\n width?: number | string;\n /** Height constraint for column media */\n height?: number | string;\n}\n\nexport interface BannerI extends DividerProps {\n bannerType: CTABannerVariant;\n gridGap?: GridProps['gap'];\n contentGap?: GridProps['gap'];\n\n // Content\n heading: string;\n headingLevel?: HeadingLevel;\n breadcrumbs?: BreadcrumbItem[];\n /** Button or link — pass `href` to render an <a>, omit it to render a <button> */\n button?: ButtonProps | ButtonLinkProps;\n\n /** Media for column display (level2, gated) or hero background */\n media?: BannerMediaProps;\n /** Background video URL for hero variant (autoplays, muted, no controls) */\n backgroundVideo?: string;\n\n // Overrides\n backgroundImage?: string;\n className?: string;\n align?: Alignment;\n verticalAlign?: VerticalAlignment;\n contentVerticalAlign?: VerticalAlignment;\n mediaVerticalAlign?: VerticalAlignment;\n}\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\n// Banner variant configuration - centralized for scalability\nconst BANNER_CONFIG: Record<CTABannerVariant, { columns: number; darkMode: boolean }> = {\n hero: { columns: 1, darkMode: true },\n videoBackground: { columns: 1, darkMode: true },\n level2: { columns: 2, darkMode: false },\n level2Video: { columns: 2, darkMode: false },\n gated: { columns: 2, darkMode: true },\n level3: { columns: 1, darkMode: true },\n};\n\n// Helper function to map alignment to CSS flexbox values\nconst mapAlignmentToFlex = (alignment: Alignment): string => {\n const alignmentMap: Record<Alignment, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n };\n return alignmentMap[alignment];\n};\n\n// Helper function to map vertical alignment to CSS values\nconst mapVerticalAlignment = (alignment?: VerticalAlignment): 'start' | 'center' | 'end' | undefined => {\n if (!alignment) return undefined;\n\n const verticalMap: Record<VerticalAlignment, 'start' | 'center' | 'end'> = {\n top: 'start',\n center: 'center',\n bottom: 'end',\n };\n return verticalMap[alignment];\n};\n\n/** Render the appropriate media element for column display */\nfunction renderColumnMedia(media: BannerMediaProps, darkMode: boolean) {\n // Destructure Banner-specific layout props; pass the rest straight to MediaBlock\n const { width, height, ...mediaBlockProps } = media;\n return <MediaBlock {...mediaBlockProps} />;\n}\n\nexport const Banner = ({\n children,\n align = 'left',\n verticalAlign = 'center',\n headingLevel = 'h1',\n ...props\n}: BannerI) => {\n const config = BANNER_CONFIG[props.bannerType];\n const hasBackgroundVideo =\n (props.bannerType === 'hero' || props.bannerType === 'videoBackground') && !!props.backgroundVideo;\n\n const BannerClass = [\n 'banner',\n `banner--${toKebabCase(props.bannerType)}`,\n hasBackgroundVideo && 'banner--has-bg-video',\n props.className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const contentStyle: React.CSSProperties = {\n textAlign: align,\n alignItems: mapAlignmentToFlex(align),\n };\n\n const gridAlignItems = mapVerticalAlignment(verticalAlign);\n const contentAlignSelf = mapVerticalAlignment(props.contentVerticalAlign);\n const mediaAlignSelf = mapVerticalAlignment(props.mediaVerticalAlign);\n\n return (\n <>\n <Divider className={BannerClass} verticalAlign={verticalAlign} {...props}>\n {children ? (\n children\n ) : (\n <>\n <Grid\n columns={{\n sm: 1,\n md: 1,\n lg: config.columns > 1 ? '1fr auto' : config.columns,\n }}\n maxColumnWidth={config.columns > 1 ? '630px' : undefined}\n justifyContent=\"center\"\n gap={props?.gridGap || 'sm'}\n alignItems={gridAlignItems}\n >\n {/* Column 1: Content */}\n <GridItem className=\"content\" style={contentAlignSelf ? { alignSelf: contentAlignSelf } : undefined}>\n <Grid columns={1} gap={props?.contentGap === 'none' ? '0' : props?.contentGap}>\n {props?.breadcrumbs && (\n <Breadcrumb items={props.breadcrumbs} separator=\"/\" darkMode={props?.darkMode} />\n )}\n {props?.heading && (\n <GridItem style={contentStyle}>\n <Heading level={headingLevel || 'h5'} variant=\"title\" darkMode={config.darkMode}>\n {props.heading}\n </Heading>\n </GridItem>\n )}\n {props?.button && (\n <GridItem style={contentStyle}>\n {'href' in props.button ? (\n <ButtonLink darkMode={config.darkMode} {...(props.button as ButtonLinkProps)} />\n ) : (\n <Button darkMode={config.darkMode} {...(props.button as ButtonProps)} />\n )}\n </GridItem>\n )}\n </Grid>\n </GridItem>\n\n {/* Column 2: Media (only if multi-column layout) */}\n {config.columns > 1 && props?.media && (\n <GridItem\n className=\"media\"\n colSpan={'auto'}\n style={mediaAlignSelf ? { alignSelf: mediaAlignSelf } : undefined}\n >\n {renderColumnMedia(props.media, config.darkMode)}\n </GridItem>\n )}\n </Grid>\n </>\n )}\n {/* Hero background video — absolutely positioned behind content */}\n {hasBackgroundVideo && (\n <div className=\"banner__bg-video\">\n <Media src={props.backgroundVideo!} type=\"video\" autoplay loop muted controls={false} objectFit=\"cover\" />\n </div>\n )}\n </Divider>\n\n {/* Background media for gated variant on mobile/tablet */}\n {props.bannerType === 'gated' &&\n props?.media &&\n (() => {\n const { width, height, ...mediaBlockProps } = props.media;\n return (\n <div className=\"banner__background-image\">\n <MediaBlock {...mediaBlockProps} overlay={false} />\n </div>\n );\n })()}\n </>\n );\n};\n","import React, { useId } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faXmark } from '@fortawesome/pro-solid-svg-icons';\nimport './TextInput.scss';\nimport { Paragraph } from '../Paragraph';\n\nexport interface TextInputValidation {\n /** Mark field as required */\n required?: boolean;\n /** Minimum character length */\n minLength?: number;\n /** Maximum character length */\n maxLength?: number;\n /** Regex pattern to validate against */\n pattern?: RegExp;\n /** Validate as email format */\n email?: boolean;\n /** Custom error message — overrides the default for any failed rule */\n errorMessage?: string;\n}\n\nexport interface TextInputProps {\n /** Field label (used for accessibility even when visually hidden) */\n label: string;\n /** Input name attribute */\n name: string;\n /** Input type */\n type?: 'text' | 'email' | 'tel' | 'url' | 'password';\n /** Placeholder / hint text */\n placeholder?: string;\n /** Current value (controlled) */\n value?: string;\n /** Change handler */\n onChange?: (value: string) => void;\n /** Blur handler */\n onBlur?: () => void;\n /** Validation rules */\n validation?: TextInputValidation;\n /** Error message to display */\n error?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Visually hide the label (remains accessible to screen readers) */\n hideLabel?: boolean;\n /** Show a clear (x) icon when the input has a value */\n clearable?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n}\n\nexport const TextInput: React.FC<TextInputProps> = ({\n label,\n name,\n type = 'text',\n placeholder,\n value,\n onChange,\n onBlur,\n validation,\n error,\n disabled = false,\n hideLabel = false,\n clearable = false,\n darkMode = false,\n className,\n}) => {\n const id = useId();\n const errorId = `${id}-error`;\n const isRequired = validation?.required;\n const showClear = clearable && !!value;\n\n const classes = ['text-input', error && 'text-input--error', disabled && 'text-input--disabled', className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n <label htmlFor={id} className={`text-input__label ${hideLabel ? 'sr-only' : ''}`}>\n {label}\n {isRequired && (\n <span className=\"text-input__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n <div className=\"text-input__wrapper\">\n <input\n id={id}\n name={name}\n type={type}\n className={`text-input__field ${showClear ? 'text-input__field--clearable' : ''}`}\n placeholder={placeholder}\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n onBlur={onBlur}\n disabled={disabled}\n required={isRequired}\n minLength={validation?.minLength}\n maxLength={validation?.maxLength}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={error ? errorId : undefined}\n />\n {showClear && (\n <button\n type=\"button\"\n className=\"text-input__clear\"\n onClick={() => onChange?.('')}\n aria-label={`Clear ${label}`}\n tabIndex={-1}\n >\n <FontAwesomeIcon icon={faXmark} />\n </button>\n )}\n </div>\n {error && (\n <Paragraph id={errorId} className=\"text-input__error\" role=\"alert\">\n {error}\n </Paragraph>\n )}\n </div>\n );\n};\n","import React, { useId, useRef, useState, useCallback, useEffect } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';\nimport './Dropdown.scss';\n\nexport interface DropdownProps {\n /** Field label */\n label?: string;\n /** Input name attribute */\n name: string;\n /** Placeholder text shown when nothing is selected */\n placeholder?: string;\n /** Whether the dropdown is open */\n isOpen?: boolean;\n /** Called when the dropdown open state changes */\n onToggle?: (isOpen: boolean) => void;\n /** Display value shown in the trigger (e.g. selected items summary) */\n displayValue?: string;\n /** Whether the field is required (shows asterisk on label) */\n required?: boolean;\n /** Error message to display */\n error?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n /** Dropdown panel content (e.g. checkbox list) */\n children?: React.ReactNode;\n}\n\n/**\n * Dropdown atom component providing a trigger button with label,\n * chevron icon, and a collapsible panel for custom content.\n */\nexport const Dropdown: React.FC<DropdownProps> = ({\n label,\n name,\n placeholder = 'Select from below',\n isOpen: controlledOpen,\n onToggle,\n displayValue,\n required,\n error,\n disabled = false,\n darkMode = false,\n className,\n children,\n}) => {\n const id = useId();\n const errorId = `${id}-error`;\n const listboxId = `${id}-listbox`;\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Support both controlled and uncontrolled open state\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n const handleToggle = useCallback(() => {\n if (disabled) return;\n const next = !isOpen;\n setInternalOpen(next);\n onToggle?.(next);\n }, [disabled, isOpen, onToggle]);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setInternalOpen(false);\n onToggle?.(false);\n }\n };\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onToggle]);\n\n // Close on Escape\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n setInternalOpen(false);\n onToggle?.(false);\n }\n },\n [isOpen, onToggle]\n );\n\n const classes = [\n 'dropdown',\n isOpen && 'dropdown--open',\n error && 'dropdown--error',\n disabled && 'dropdown--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={containerRef} className={classes} data-dark-mode={darkMode || undefined} onKeyDown={handleKeyDown}>\n {label && (\n <label htmlFor={id} className=\"dropdown__label\">\n {label}\n {required && (\n <span className=\"dropdown__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n <div className=\"dropdown__wrapper\">\n <button\n id={id}\n type=\"button\"\n className=\"dropdown__trigger\"\n onClick={handleToggle}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={error ? errorId : undefined}\n data-name={name}\n >\n <span className={`dropdown__value ${!displayValue ? 'dropdown__value--placeholder' : ''}`}>\n {displayValue || placeholder}\n </span>\n <span className=\"dropdown__chevron\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={isOpen ? faChevronUp : faChevronDown} />\n </span>\n </button>\n\n {isOpen && (\n <div id={listboxId} className=\"dropdown__panel\" role=\"listbox\" aria-label={label}>\n {children}\n </div>\n )}\n </div>\n\n {error && (\n <p id={errorId} className=\"dropdown__error\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n};\n","import React, { useId } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSquareCheck } from '@fortawesome/pro-solid-svg-icons';\nimport { faSquare } from '@fortawesome/pro-regular-svg-icons';\nimport './Checkbox.scss';\n\nexport interface CheckboxProps {\n /** Checkbox label text */\n label: string;\n /** Input name attribute */\n name: string;\n /** Whether the checkbox is checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n}\n\n/**\n * Checkbox atom component using FontAwesome icons for visual states.\n * Supports default, hover, active (checked), and focused states.\n */\nexport const Checkbox: React.FC<CheckboxProps> = ({\n label,\n name,\n checked = false,\n onChange,\n disabled = false,\n darkMode = false,\n className,\n}) => {\n const id = useId();\n\n const classes = ['checkbox', checked && 'checkbox--checked', disabled && 'checkbox--disabled', className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <label className={classes} data-dark-mode={darkMode || undefined} htmlFor={id}>\n <input\n id={id}\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n className=\"checkbox__input\"\n aria-checked={checked}\n />\n <span className=\"checkbox__icon\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={checked ? faSquareCheck : faSquare} />\n </span>\n <span className=\"checkbox__label\">{label}</span>\n </label>\n );\n};\n","import React, { useState, useCallback } from 'react';\nimport { Dropdown } from '@/components/atoms/Dropdown';\nimport { Checkbox } from '@/components/atoms/Checkbox';\nimport './DropdownSelect.scss';\n\nexport interface DropdownSelectOption {\n /** Unique value for the option */\n value: string;\n /** Display label for the option */\n label: string;\n}\n\nexport interface DropdownSelectValidation {\n /** Mark field as required (at least one selection) */\n required?: boolean;\n /** Minimum number of selections */\n minSelections?: number;\n /** Maximum number of selections */\n maxSelections?: number;\n /** Custom error message */\n errorMessage?: string;\n}\n\nexport interface DropdownSelectProps {\n /** Field label */\n label?: string;\n /** Input name attribute */\n name: string;\n /** Placeholder text when nothing is selected */\n placeholder?: string;\n /** Available options */\n options: DropdownSelectOption[];\n /** Currently selected values (controlled) */\n value?: string[];\n /** Change handler with selected values */\n onChange?: (values: string[]) => void;\n /** Blur handler (when dropdown closes) */\n onBlur?: () => void;\n /** Validation rules */\n validation?: DropdownSelectValidation;\n /** Error message to display */\n error?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n}\n\n/**\n * DropdownSelect molecule combining a Dropdown trigger with a\n * checkbox list panel. Supports multi-select with validation.\n */\nexport const DropdownSelect: React.FC<DropdownSelectProps> = ({\n label,\n name,\n placeholder = 'Select from below',\n options,\n value: controlledValue,\n onChange,\n onBlur,\n validation,\n error,\n disabled = false,\n darkMode = false,\n className,\n}) => {\n const [internalValue, setInternalValue] = useState<string[]>([]);\n const selectedValues = controlledValue !== undefined ? controlledValue : internalValue;\n\n const handleToggleOption = useCallback(\n (optionValue: string, checked: boolean) => {\n const next = checked ? [...selectedValues, optionValue] : selectedValues.filter((v) => v !== optionValue);\n\n setInternalValue(next);\n onChange?.(next);\n },\n [selectedValues, onChange]\n );\n\n const handleDropdownClose = useCallback(\n (isOpen: boolean) => {\n if (!isOpen) {\n onBlur?.();\n }\n },\n [onBlur]\n );\n\n // No display value — always show placeholder regardless of selection\n const displayValue = '';\n\n const classes = ['dropdown-select', className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n <Dropdown\n label={label}\n name={name}\n placeholder={placeholder}\n displayValue={displayValue}\n onToggle={handleDropdownClose}\n required={validation?.required}\n error={error}\n disabled={disabled}\n darkMode={darkMode}\n >\n <div className=\"dropdown-select__options\" role=\"group\" aria-label={label}>\n {options.map((option) => (\n <div\n key={option.value}\n className=\"dropdown-select__option\"\n role=\"option\"\n aria-selected={selectedValues.includes(option.value)}\n >\n <Checkbox\n label={option.label}\n name={`${name}-${option.value}`}\n checked={selectedValues.includes(option.value)}\n onChange={(checked) => handleToggleOption(option.value, checked)}\n disabled={disabled}\n darkMode={darkMode}\n />\n </div>\n ))}\n </div>\n </Dropdown>\n </div>\n );\n};\n","import React, { useState, useCallback, useRef } from 'react';\nimport { Button } from '@/components/atoms/Button';\nimport { Grid, GridProps, GridItem, GridItemProps } from '@/components/atoms/Grid';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { TextInput, TextInputValidation } from '@/components/atoms/TextInput';\nimport {\n DropdownSelect,\n DropdownSelectOption,\n DropdownSelectValidation,\n} from '@/components/molecules/primax/DropdownSelect';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './Form.scss';\n\nexport interface FormField {\n /** Unique field name (used as form data key) */\n name: string;\n /** Field label */\n label: string;\n /** Input type — includes 'dropdown-select' for multi-select dropdown */\n type?: 'text' | 'email' | 'tel' | 'url' | 'dropdown-select';\n /** Placeholder text */\n placeholder?: string;\n /** Visually hide the label (remains accessible to screen readers) */\n hideLabel?: boolean;\n /** Show a clear (x) icon when the input has a value */\n clearable?: boolean;\n /** Column span — number or responsive object { sm, md, lg } */\n colSpan?: GridItemProps['colSpan'];\n /** Validation rules (for text inputs) */\n validation?: TextInputValidation;\n /** Options for dropdown-select type */\n options?: DropdownSelectOption[];\n /** Validation rules for dropdown-select type */\n dropdownValidation?: DropdownSelectValidation;\n}\n\nexport interface FormProps {\n /** Form heading */\n heading?: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Heading visual variant */\n headingVariant?: string;\n /** Form field configuration */\n fields: FormField[];\n /** Grid columns — number, string, or responsive object { sm, md, lg } */\n columns?: GridProps['columns'];\n /** Grid gap — string or responsive object { sm, md, lg } */\n gap?: GridProps['gap'];\n /** Grid row gap — string or responsive object { sm, md, lg } */\n rowGap?: GridProps['rowGap'];\n /** Grid column gap — string or responsive object { sm, md, lg } */\n columnGap?: GridProps['columnGap'];\n /** Submit button label */\n submitLabel?: string;\n /** When provided, the submit button is placed inside the fields grid as a GridItem */\n submitColSpan?: GridItemProps['colSpan'];\n /** Loading state — disables button and shows spinner */\n loading?: boolean;\n /** Disclaimer text (supports HTML for links) */\n disclaimer?: string;\n /** Called with collected form data on valid submission */\n onSubmit?: (data: Record<string, string>) => void;\n /** Async or cross-field validation escape hatch. Return error map or null. */\n onValidate?: (data: Record<string, string>) => Record<string, string> | null | Promise<Record<string, string> | null>;\n /** Called when validation fails with the error map */\n onError?: (errors: Record<string, string>) => void;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n /** Children rendered after the form fields and before the submit button */\n children?: React.ReactNode;\n}\n\n/** Email regex — simple but covers common cases */\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nexport function validateField(value: string, field: FormField): string | undefined {\n // Handle dropdown-select validation\n if (field.type === 'dropdown-select') {\n const v = field.dropdownValidation;\n if (!v) return undefined;\n const custom = v.errorMessage;\n const selections = value ? value.split(',') : [];\n\n if (v.required && selections.length === 0) {\n return custom ?? 'Please select at least one option.';\n }\n if (v.minSelections && selections.length < v.minSelections) {\n return custom ?? `Please select at least ${v.minSelections} option(s).`;\n }\n if (v.maxSelections && selections.length > v.maxSelections) {\n return custom ?? `Please select no more than ${v.maxSelections} option(s).`;\n }\n return undefined;\n }\n\n // Handle text input validation\n const v = field.validation;\n if (!v) return undefined;\n const custom = v.errorMessage;\n\n if (v.required && !value.trim()) {\n return custom ?? `This field is required.`;\n }\n if (v.email && value.trim() && !EMAIL_RE.test(value.trim())) {\n return custom ?? 'Please enter a valid email address.';\n }\n if (v.minLength && value.trim().length < v.minLength) {\n return custom ?? `Must be at least ${v.minLength} characters.`;\n }\n if (v.maxLength && value.trim().length > v.maxLength) {\n return custom ?? `Must be no more than ${v.maxLength} characters.`;\n }\n if (v.pattern && !v.pattern.test(value.trim())) {\n return custom ?? `${field.label} is not valid.`;\n }\n return undefined;\n}\n\nexport const Form: React.FC<FormProps> = ({\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n fields,\n columns = { sm: 1, md: 2, lg: 3 },\n gap,\n rowGap,\n columnGap,\n submitLabel = 'Submit',\n submitColSpan,\n loading = false,\n disclaimer,\n onSubmit,\n onValidate,\n onError,\n darkMode = false,\n className,\n children,\n}) => {\n const formRef = useRef<HTMLFormElement>(null);\n\n const [values, setValues] = useState<Record<string, string>>(() =>\n Object.fromEntries(fields.map((f) => [f.name, '']))\n );\n const [dropdownValues, setDropdownValues] = useState<Record<string, string[]>>(() =>\n Object.fromEntries(fields.filter((f) => f.type === 'dropdown-select').map((f) => [f.name, []]))\n );\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n const handleChange = useCallback((name: string, value: string) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n // Clear error on change\n setErrors((prev) => {\n if (!prev[name]) return prev;\n const next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const handleDropdownChange = useCallback((name: string, selected: string[]) => {\n setDropdownValues((prev) => ({ ...prev, [name]: selected }));\n // Store as comma-separated in values for form submission\n setValues((prev) => ({ ...prev, [name]: selected.join(',') }));\n // Clear error on change\n setErrors((prev) => {\n if (!prev[name]) return prev;\n const next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const handleBlur = useCallback(\n (field: FormField) => {\n setTouched((prev) => ({ ...prev, [field.name]: true }));\n const err = validateField(values[field.name] ?? '', field);\n if (err) {\n setErrors((prev) => ({ ...prev, [field.name]: err }));\n }\n },\n [values]\n );\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Run built-in validation\n const fieldErrors: Record<string, string> = {};\n fields.forEach((field) => {\n const err = validateField(values[field.name] ?? '', field);\n if (err) fieldErrors[field.name] = err;\n });\n\n // Run custom validation if provided\n if (onValidate) {\n const custom = await onValidate(values);\n if (custom) Object.assign(fieldErrors, custom);\n }\n\n if (Object.keys(fieldErrors).length > 0) {\n setErrors(fieldErrors);\n setTouched(Object.fromEntries(fields.map((f) => [f.name, true])));\n onError?.(fieldErrors);\n return;\n }\n\n onSubmit?.(values);\n },\n [fields, values, onSubmit, onValidate, onError]\n );\n\n const hasErrors = Object.keys(errors).length > 0;\n\n const classes = ['primax-form', className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n {heading && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode} className=\"primax-form__heading\">\n {heading}\n </Heading>\n )}\n\n <form ref={formRef} className=\"primax-form__form\" onSubmit={handleSubmit} noValidate>\n <Grid columns={columns} gap={gap} className=\"primax-form__fields\" rowGap={rowGap} columnGap={columnGap}>\n {fields.map((field) => (\n <GridItem key={field.name} colSpan={field.colSpan}>\n {field.type === 'dropdown-select' ? (\n <DropdownSelect\n name={field.name}\n label={field.label}\n placeholder={field.placeholder}\n options={field.options ?? []}\n value={dropdownValues[field.name] ?? []}\n onChange={(selected) => handleDropdownChange(field.name, selected)}\n onBlur={() => handleBlur(field)}\n validation={field.dropdownValidation}\n error={touched[field.name] ? errors[field.name] : undefined}\n darkMode={darkMode}\n />\n ) : (\n <TextInput\n name={field.name}\n label={field.label}\n type={field.type ?? 'text'}\n placeholder={field.placeholder}\n value={values[field.name] ?? ''}\n onChange={(v) => handleChange(field.name, v)}\n onBlur={() => handleBlur(field)}\n validation={field.validation}\n error={touched[field.name] ? errors[field.name] : undefined}\n hideLabel={field.hideLabel}\n clearable={field.clearable}\n darkMode={darkMode}\n />\n )}\n </GridItem>\n ))}\n\n {submitColSpan && (\n <GridItem colSpan={submitColSpan} className=\"primax-form__submit-grid-item\">\n <Button\n buttonType=\"general\"\n size=\"md\"\n darkMode={darkMode}\n disabled={loading || hasErrors}\n className=\"primax-form__submit\"\n onClick={() => formRef.current?.requestSubmit()}\n >\n {loading ? 'Submitting' : submitLabel}\n </Button>\n </GridItem>\n )}\n </Grid>\n\n {children}\n\n {!submitColSpan && (\n <Button\n buttonType=\"general\"\n size=\"md\"\n darkMode={darkMode}\n disabled={loading || hasErrors}\n className=\"primax-form__submit\"\n onClick={() => formRef.current?.requestSubmit()}\n >\n {loading ? 'Submitting' : submitLabel}\n </Button>\n )}\n\n {disclaimer && (\n <Paragraph\n className=\"primax-form__disclaimer\"\n darkMode={darkMode}\n dangerouslySetInnerHTML={{ __html: disclaimer }}\n />\n )}\n </form>\n </div>\n );\n};\n","import React from 'react';\nimport { Form, FormField } from '@/components/molecules/primax/Form';\nimport { Container } from '@/components/atoms/Container';\nimport { Divider } from '@/components/atoms/Divider';\nimport { HeadingLevel } from '@/components/atoms/Heading';\nimport { GridProps, GridItemProps } from '@/components/atoms/Grid';\nimport './Subscribe.scss';\n\nexport type SubscribeField = FormField;\n\nexport type SubscribeVariant = 'divider-dark' | 'divider-light' | 'divider-white' | 'dark' | 'light' | 'white';\n\nexport interface SubscribeProps {\n /** Section heading */\n heading: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Heading visual variant */\n headingVariant?: string;\n /** Form field configuration */\n fields: SubscribeField[];\n /** Grid columns — number, string, or responsive object { sm, md, lg } */\n columns?: GridProps['columns'];\n /** Grid gap — string or responsive object { sm, md, lg } */\n gap?: GridProps['gap'];\n /** Grid row gap — string or responsive object { sm, md, lg } */\n rowGap?: GridProps['rowGap'];\n /** Grid column gap — string or responsive object { sm, md, lg } */\n columnGap?: GridProps['columnGap'];\n /** Submit button label */\n submitLabel?: string;\n /** When provided, the submit button is placed inside the fields grid as a GridItem */\n submitColSpan?: GridItemProps['colSpan'];\n /** Loading state — disables button and shows spinner */\n loading?: boolean;\n /** Disclaimer text (supports HTML for links) */\n disclaimer?: string;\n /** Called with collected form data on valid submission */\n onSubmit?: (data: Record<string, string>) => void;\n /** Async or cross-field validation escape hatch. Return error map or null. */\n onValidate?: (data: Record<string, string>) => Record<string, string> | null | Promise<Record<string, string> | null>;\n /** Called when validation fails with the error map */\n onError?: (errors: Record<string, string>) => void;\n /** Dark mode */\n darkMode?: boolean;\n /** Container and background variant. */\n variant?: SubscribeVariant;\n /** Additional class */\n className?: string;\n}\n\nconst VARIANT_CONFIG: Record<\n SubscribeVariant,\n { useDivider: boolean; backgroundColor: string; isDark: boolean; backgroundPattern: 'sparks' | 'none' }\n> = {\n 'divider-dark': {\n useDivider: true,\n backgroundColor: 'var(--color-primary-950)',\n isDark: true,\n backgroundPattern: 'none',\n },\n 'divider-light': {\n useDivider: true,\n backgroundColor: 'var(--color-neutral-75)',\n isDark: false,\n backgroundPattern: 'none',\n },\n 'divider-white': {\n useDivider: true,\n backgroundColor: 'var(--color-neutral-00)',\n isDark: false,\n backgroundPattern: 'none',\n },\n dark: {\n useDivider: false,\n backgroundColor: 'var(--color-primary-950)',\n isDark: true,\n backgroundPattern: 'none',\n },\n light: {\n useDivider: false,\n backgroundColor: 'var(--color-neutral-75)',\n isDark: false,\n backgroundPattern: 'none',\n },\n white: {\n useDivider: false,\n backgroundColor: 'var(--color-neutral-00)',\n isDark: false,\n backgroundPattern: 'none',\n },\n};\n\nexport const Subscribe: React.FC<SubscribeProps> = ({\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n fields,\n columns = { sm: 1, md: 2, lg: 3 },\n gap,\n rowGap,\n columnGap,\n submitLabel = 'Submit',\n submitColSpan,\n loading = false,\n disclaimer,\n onSubmit,\n onValidate,\n onError,\n darkMode,\n variant,\n className,\n}) => {\n const config = variant ? VARIANT_CONFIG[variant] : null;\n const resolvedDarkMode = config ? config.isDark : (darkMode ?? false);\n\n const classes = [className].filter(Boolean).join(' ');\n\n const formContent = (\n <Form\n heading={heading}\n headingLevel={headingLevel}\n headingVariant={headingVariant}\n fields={fields}\n columns={columns}\n gap={gap}\n rowGap={rowGap}\n columnGap={columnGap}\n submitLabel={submitLabel}\n submitColSpan={submitColSpan}\n loading={loading}\n disclaimer={disclaimer}\n onSubmit={onSubmit}\n onValidate={onValidate}\n onError={onError}\n darkMode={resolvedDarkMode}\n />\n );\n\n if (config?.useDivider) {\n return (\n <Divider\n className={classes}\n backgroundColor={config.backgroundColor}\n backgroundPattern={config.backgroundPattern}\n shapeDivider=\"both\"\n darkMode={resolvedDarkMode}\n >\n <Container className=\"subscribe subscribe--no-padding\">{formContent}</Container>\n </Divider>\n );\n }\n\n return (\n <section\n className={`subscribe ${classes}`}\n data-dark-mode={resolvedDarkMode || undefined}\n aria-label={heading}\n style={config ? { backgroundColor: config.backgroundColor } : undefined}\n >\n <Container>{formContent}</Container>\n </section>\n );\n};\n","import React from 'react';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport './TwoColumn.scss';\n\nexport type TwoColumnVariation = 'left-first' | 'right-first';\n\nexport interface TwoColumnRow {\n /** Content for the left column */\n left: React.ReactNode;\n /** Content for the right column */\n right: React.ReactNode;\n /** Column order on desktop — stacks vertically on mobile */\n variation?: TwoColumnVariation;\n /** Vertical alignment of columns */\n verticalAlign?: 'top' | 'center' | 'bottom';\n}\n\nexport interface TwoColumnProps extends DividerProps {\n /** Content for the left column (single-row shorthand) */\n left?: React.ReactNode;\n /** Content for the right column (single-row shorthand) */\n right?: React.ReactNode;\n /** Column order on desktop — stacks vertically on mobile (single-row shorthand) */\n variation?: TwoColumnVariation;\n /** Vertical alignment of columns (single-row shorthand, also default for rows) */\n verticalAlign?: 'top' | 'center' | 'bottom';\n /** Multiple rows of two-column content */\n rows?: TwoColumnRow[];\n /** Gap between columns — responsive object or single value */\n gap?: string | { xs?: string; sm?: string; md?: string; lg?: string };\n /** Additional class name */\n className?: string;\n}\n\nconst verticalAlignMap: Record<string, 'start' | 'center' | 'end'> = {\n top: 'start',\n center: 'center',\n bottom: 'end',\n};\n\nexport const TwoColumn: React.FC<TwoColumnProps> = ({\n left,\n right,\n rows,\n variation = 'left-first',\n verticalAlign = 'top',\n gap,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n children: _children,\n ...rest\n}) => {\n const baseClass = 'primax-two-column';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n // Build the list of rows: use `rows` prop if provided, otherwise fall back to single left/right\n const resolvedRows: TwoColumnRow[] = rows ?? [{ left, right, variation, verticalAlign }];\n\n return (\n <Divider\n backgroundColor={backgroundColor}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {resolvedRows.map((row, index) => {\n const rowVariation = row.variation ?? variation;\n const rowAlign = row.verticalAlign ?? verticalAlign;\n const isReversed = rowVariation === 'right-first';\n\n return (\n <Grid\n key={index}\n columns={{ sm: 1, md: 1, lg: 2 }}\n maxColumnWidth=\"630px\"\n justifyContent=\"center\"\n alignItems={verticalAlignMap[rowAlign]}\n className={`${baseClass}__grid`}\n gap={gap}\n >\n <GridItem\n className={`${baseClass}__col ${baseClass}__col--left`}\n style={isReversed ? { order: 2 } : undefined}\n >\n {row.left}\n </GridItem>\n <GridItem\n className={`${baseClass}__col ${baseClass}__col--right`}\n style={isReversed ? { order: 1 } : undefined}\n >\n {row.right}\n </GridItem>\n </Grid>\n );\n })}\n </Divider>\n );\n};\n","import React from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { Image } from '@/components/atoms/Image';\nimport type { ImageProps } from '@/components/atoms/Image';\nimport './Card.scss';\n\nexport type PrimaxCardVariant = 'icon' | 'image' | 'profile';\nexport type PrimaxCardButtonVariant = 'general' | 'link';\n\nexport interface PrimaxCardProps {\n /** Card layout variant */\n variant?: PrimaxCardVariant;\n /** SVG icon element (for icon variant) */\n icon?: React.ReactNode;\n /** Image configuration (for image/profile variants) — renders via Media atom */\n image?: ImageProps;\n /** Card title */\n title: string;\n /** HTML element for the title. Defaults to 'p' for image variant, 'h4' for others.\n * Use 'p' or 'span' when cards are repeated in lists to avoid heading hierarchy issues. */\n titleAs?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';\n /** Card description text */\n description?: string;\n /** Optional metadata slot (e.g. asset type, duration) */\n metadata?: React.ReactNode;\n /** Text alignment */\n textAlign?: 'left' | 'center';\n /** Visual button props — purely decorative, the card itself is the link */\n button?: Omit<ButtonProps, 'buttonType'>;\n /** Button style: solid primary or text link */\n buttonVariant?: PrimaxCardButtonVariant;\n /** Card destination URL */\n href: string;\n /** Link target */\n target?: '_blank' | '_self';\n /** Dark mode */\n darkMode?: boolean;\n /** Enable/disable hover animation - overrides theme default */\n animated?: boolean;\n /** Additional class */\n className?: string;\n /** Children rendered after description, before button */\n children?: React.ReactNode;\n /** Accessible label */\n 'aria-label'?: string;\n}\n\nexport const Card: React.FC<PrimaxCardProps> = ({\n variant = 'icon',\n icon,\n image,\n title,\n titleAs,\n description,\n metadata,\n textAlign,\n button,\n buttonVariant = 'general',\n href,\n target = '_self',\n darkMode = false,\n animated,\n className,\n children,\n 'aria-label': ariaLabel,\n}) => {\n const align = textAlign ?? (variant === 'image' ? 'left' : 'center');\n\n // Default to 'p' for image (insight) variant to avoid heading hierarchy issues\n // when many cards are rendered in a list. Other variants default to 'h4'.\n const resolvedTitleAs = titleAs ?? (variant === 'image' ? 'p' : 'h4');\n\n const cardClasses = ['primax-card', `primax-card--${variant}`, `primax-card--align-${align}`, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n className={cardClasses}\n data-dark-mode={darkMode || undefined}\n data-animated={animated !== undefined ? (animated ? 'true' : 'false') : undefined}\n aria-label={ariaLabel || title}\n >\n {(variant === 'image' || variant === 'profile') && image && (\n <div className=\"primax-card__image-wrapper\">\n <Image\n src={image.src}\n alt={image.alt ?? ''}\n objectFit={image.objectFit ?? 'cover'}\n objectPosition={image.objectPosition}\n aspectRatio={image.aspectRatio}\n srcSet={image.srcSet}\n sizes={image.sizes}\n loading={image.loading ?? 'lazy'}\n />\n </div>\n )}\n\n <div className=\"primax-card__content\">\n {variant === 'icon' && icon && (\n <div className=\"primax-card__icon\" aria-hidden=\"true\">\n {icon}\n </div>\n )}\n\n {metadata && <div className=\"primax-card__metadata\">{metadata}</div>}\n\n <div className=\"primax-card__text\">\n {resolvedTitleAs === 'p' || resolvedTitleAs === 'span' ? (\n <Paragraph as={resolvedTitleAs} weight=\"bold\" className=\"primax-card__title\" darkMode={darkMode}>\n {title}\n </Paragraph>\n ) : (\n <Heading\n level={resolvedTitleAs}\n variant=\"componentTitle\"\n className=\"primax-card__title\"\n darkMode={darkMode}\n >\n {title}\n </Heading>\n )}\n\n {description && (\n <Paragraph className=\"primax-card__description\" darkMode={darkMode}>\n {description}\n </Paragraph>\n )}\n </div>\n\n {button && buttonVariant === 'link' && (\n <div className=\"primax-card__action primax-card__action--link\" aria-hidden=\"true\">\n <Button {...button} buttonType=\"link\" darkMode={darkMode} />\n </div>\n )}\n\n {children}\n </div>\n\n {button && buttonVariant !== 'link' && (\n <div className=\"primax-card__action primax-card__action--button\" aria-hidden=\"true\">\n <Button {...button} buttonType=\"general\" darkMode={darkMode} />\n </div>\n )}\n </a>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { IconName, IconPrefix } from '@fortawesome/fontawesome-svg-core';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport './IconListItem.scss';\n\nexport interface IconListItemProps {\n /** FontAwesome icon name (e.g. \"credit-card\", \"chart-line\") — renders with 'fal' (light) prefix by default */\n icon: string;\n /** FontAwesome icon prefix (default: 'fal' for light) */\n iconPrefix?: IconPrefix;\n /** Title text */\n title?: string;\n /** Description text */\n description?: string;\n /** Button link config — renders when provided. Uses ButtonLinkProps. */\n button?: ButtonLinkProps;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\nexport const IconListItem: React.FC<IconListItemProps> = ({\n icon,\n iconPrefix = 'fal',\n title,\n description,\n button,\n darkMode = false,\n className,\n}) => {\n const baseClass = 'icon-list-item';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n return (\n <li className={classes} data-dark-mode={darkMode || undefined}>\n <div className={`${baseClass}__icon-block`}>\n <FontAwesomeIcon icon={[iconPrefix, icon as IconName]} className={`${baseClass}__icon`} aria-hidden=\"true\" />\n </div>\n\n <div className={`${baseClass}__content`}>\n <div className={`${baseClass}__text-content`}>\n {title && (\n <Heading level=\"h3\" variant=\"componentTitle\" darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n )}\n\n {description && (\n <Paragraph darkMode={darkMode} className={`${baseClass}__description`}>\n {description}\n </Paragraph>\n )}\n </div>\n\n {button && (\n <div className={`${baseClass}__link-wrap`}>\n <ButtonLink\n buttonType=\"link\"\n size=\"md\"\n darkMode={darkMode}\n {...button}\n className={`${baseClass}__link${button.className ? ` ${button.className}` : ''}`}\n />\n </div>\n )}\n </div>\n </li>\n );\n};\n","import React from 'react';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Container } from '@/components/atoms/Container';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport type { GridProps } from '@/components/atoms/Grid/Grid';\nimport { ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { IconListItem } from '@/components/molecules/primax/IconListItem';\nimport './IconBulletList.scss';\n\nexport type IconBulletListBackground = 'white' | 'light' | 'dark';\n\nexport interface IconBulletListItem {\n /** FontAwesome icon name */\n icon: string;\n /** Title text */\n title?: string;\n /** Description text */\n description?: string;\n /** Button link config — renders when provided. Uses ButtonLinkProps. */\n button?: ButtonLinkProps;\n}\n\nexport interface IconBulletListProps extends Omit<DividerProps, 'children'> {\n /** Section title displayed above the list */\n title?: string;\n /** Array of list items */\n items: IconBulletListItem[];\n /** Grid columns config */\n columns?: GridProps['columns'];\n /** Grid gap config */\n gap?: GridProps['gap'];\n /** Background style preset */\n background?: IconBulletListBackground;\n}\n\n/** Map background option to Divider backgroundColor */\nfunction getBackgroundColor(background: IconBulletListBackground): string {\n switch (background) {\n case 'white':\n return 'var(--color-neutral-00)';\n case 'light':\n return 'var(--background-color)';\n case 'dark':\n return 'var(--dark-background-color)';\n }\n}\n\n/**\n * IconBulletList — A grid of IconListItems with an optional section title,\n * wrapped in a Divider for background/shape control.\n */\nexport const IconBulletList: React.FC<IconBulletListProps> = ({\n title,\n items,\n columns = { sm: 1, md: 1, lg: 2 },\n gap = { sm: '1.875rem', md: '1.875rem', lg: '1.875rem 3.75rem' },\n background = 'white',\n darkMode: darkModeProp,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n ...rest\n}) => {\n const baseClass = 'icon-bullet-list';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n // Derive dark mode from the background preset so consumers don't need to\n // redundantly pass both `background=\"dark\"` and/or `darkMode={true}`. An explicit\n // `darkMode` prop still takes priority, allowing opt-out when needed.\n const darkMode = darkModeProp ?? background === 'dark';\n const resolvedBg = backgroundColor ?? getBackgroundColor(background);\n\n return (\n <Divider\n backgroundColor={resolvedBg}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {title && (\n <Heading level=\"h2\" variant=\"sectionDivider\" darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n )}\n\n <Container>\n <Grid columns={columns} gap={gap} className={`${baseClass}__grid`}>\n {items.map((item, index) => (\n <GridItem key={index}>\n <IconListItem\n icon={item.icon}\n title={item.title}\n description={item.description}\n button={item.button}\n darkMode={darkMode}\n />\n </GridItem>\n ))}\n </Grid>\n </Container>\n </Divider>\n );\n};\n","import React from 'react';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport { MediaBlock, MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport './OverflowMediaSection.scss';\n\nexport type OverflowMediaPosition = 'left' | 'right';\nexport type OverflowMediaStackBreakpoint = 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface OverflowMediaSectionProps extends DividerProps {\n /** Content rendered opposite the media block */\n children: React.ReactNode;\n /** Header content rendered above the two-column layout (full-width, centered) */\n header?: React.ReactNode;\n /** Media block props (thumbnail, accentBorder, sparkle, etc.) */\n media: MediaBlockProps;\n /** Which side the media appears on (default: 'left') */\n mediaPosition?: OverflowMediaPosition;\n /** Breakpoint at which the layout stacks to single column */\n stackAt?: OverflowMediaStackBreakpoint;\n}\n\n/**\n * OverflowMediaSection — A two-column layout where the media block\n * is allowed to overflow its container and gets clipped at the section boundary.\n * On resize, the media gracefully clips rather than shrinking.\n *\n * Supports an optional `header` slot that renders above the grid, spanning full width.\n *\n * Used by AccordionWithMedia and IconBulletSection.\n */\nexport const OverflowMediaSection: React.FC<OverflowMediaSectionProps> = ({\n children,\n header,\n media,\n mediaPosition = 'left',\n stackAt,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n ...rest\n}) => {\n const baseClass = 'overflow-media-section';\n const classes = [baseClass, `${baseClass}--media-${mediaPosition}`, `${baseClass}--stack-${stackAt}`, className]\n .filter(Boolean)\n .join(' ');\n\n const shouldMirror = media.mirror ?? mediaPosition === 'right';\n const isReversed = mediaPosition === 'right';\n\n const mediaColumn = (\n <div className={`${baseClass}__media`}>\n <MediaBlock {...media} mirror={shouldMirror} />\n </div>\n );\n\n const contentColumn = <div className={`${baseClass}__content`}>{children}</div>;\n\n return (\n <Divider\n backgroundColor={backgroundColor}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {header && <div className={`${baseClass}__header`}>{header}</div>}\n\n <Grid\n columns={{ sm: 1, md: 1, lg: 2 }}\n maxColumnWidth=\"630px\"\n justifyContent=\"center\"\n alignItems=\"center\"\n className={`${baseClass}__grid`}\n >\n <GridItem className={`${baseClass}__col ${baseClass}__col--left`}>\n {isReversed ? contentColumn : mediaColumn}\n </GridItem>\n <GridItem className={`${baseClass}__col ${baseClass}__col--right`}>\n {isReversed ? mediaColumn : contentColumn}\n </GridItem>\n </Grid>\n </Divider>\n );\n};\n","import React from 'react';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { DividerProps } from '@/components/atoms/Divider';\nimport { MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport { OverflowMediaSection } from '@/components/molecules/primax/OverflowMediaSection';\nimport type { OverflowMediaStackBreakpoint } from '@/components/molecules/primax/OverflowMediaSection';\nimport { IconListItem } from '@/components/molecules/primax/IconListItem';\nimport { IconBulletListItem } from '@/components/molecules/primax/IconBulletList';\nimport './IconBulletSection.scss';\n\nexport type IconBulletSectionBackground = 'white' | 'light' | 'dark' | 'divider';\nexport type IconBulletSectionMediaPosition = 'left' | 'right';\n\nexport interface IconBulletSectionProps extends DividerProps {\n /** Section title displayed above the list */\n title?: string;\n /** Heading level (default: 'h2') */\n headingLevel?: HeadingProps['level'];\n /** Heading variant (default: 'sectionDivider') */\n headingVariant?: HeadingProps['variant'];\n /** Array of list items */\n items: IconBulletListItem[];\n /** Media block props (image/video) */\n media: MediaBlockProps;\n /** Position of the media block relative to the list */\n mediaPosition?: IconBulletSectionMediaPosition;\n /** Breakpoint at which the layout stacks to single column (default: 'lg') */\n stackAt?: OverflowMediaStackBreakpoint;\n /** Background style — controls divider wrapper background */\n background?: IconBulletSectionBackground;\n /** Dark mode styling — cascades to children */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/** Map background option to Divider backgroundColor */\nfunction getBackgroundColor(background: IconBulletSectionBackground): string | undefined {\n switch (background) {\n case 'white':\n return 'var(--color-neutral-00)';\n case 'light':\n return 'var(--background-color)';\n case 'dark':\n return 'var(--dark-background-color)';\n case 'divider':\n return undefined;\n default:\n return undefined;\n }\n}\n\nexport const IconBulletSection: React.FC<IconBulletSectionProps> = ({\n title,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n items,\n media,\n mediaPosition = 'left',\n stackAt = 'xl',\n background = 'white',\n darkMode: darkModeProp,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n ...rest\n}) => {\n const baseClass = 'icon-bullet-section';\n\n // Derive dark mode from the background preset so consumers don't need to\n // redundantly pass both `background=\"dark\"` and/or `darkMode={true}`. An explicit\n // `darkMode` prop still takes priority, allowing opt-out when needed.\n const darkMode = darkModeProp ?? background === 'dark';\n\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n const resolvedBg = backgroundColor ?? getBackgroundColor(background);\n const resolvedShape = shapeDivider ?? (background === 'divider' ? 'both' : 'none');\n\n const titleElement = title ? (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n ) : undefined;\n\n return (\n <OverflowMediaSection\n header={titleElement}\n media={media}\n mediaPosition={mediaPosition}\n stackAt={stackAt}\n backgroundColor={resolvedBg}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={resolvedShape}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n <ul className={`${baseClass}__list`} role=\"list\">\n {items.map((item, index) => (\n <IconListItem\n key={index}\n icon={item.icon}\n title={item.title}\n description={item.description}\n button={item.button}\n darkMode={darkMode}\n />\n ))}\n </ul>\n </OverflowMediaSection>\n );\n};\n","import React from 'react';\nimport { AssetMeta } from '@/components/molecules/AssetMeta';\nimport './PostItem.scss';\n\n/** Link properties for post navigation — extends native anchor attributes */\nexport interface ItemLink extends React.AnchorHTMLAttributes<HTMLAnchorElement> {}\n\nexport interface PostItemData {\n /** Post title */\n title: string;\n /** Asset type label (e.g. \"Webinar\", \"Podcast\", \"Article\") */\n assetType: string;\n /** Duration (e.g. \"12 Mins\") */\n duration?: string;\n /** Date string (e.g. \"01-15-25\") */\n date: string;\n /** Post image URL */\n imageUrl: string;\n /** Image alt text */\n imageAlt?: string;\n /** Link configuration for the post */\n link: ItemLink;\n /** Whether this post is featured (vertical layout with large image) */\n isFeatured?: boolean;\n}\n\nexport interface PostItemProps extends PostItemData {\n /** Additional class name */\n className?: string;\n}\n\n/**\n * PostItem component for the PostFeed section.\n * Renders in two modes:\n * - Featured (vertical): large image on top, metadata + clickable title below\n * - Regular (horizontal): metadata + clickable title on left, small thumbnail on right\n */\nexport const PostItem: React.FC<PostItemProps> = ({\n title,\n assetType,\n duration,\n date,\n imageUrl,\n imageAlt = '',\n link,\n isFeatured = false,\n className,\n}) => {\n const rootClasses = ['post-item', isFeatured ? 'post-item--featured' : 'post-item--regular', className]\n .filter(Boolean)\n .join(' ');\n\n const { href, target = '_self', rel } = link;\n const resolvedRel = rel ?? (target === '_blank' ? 'noopener noreferrer' : undefined);\n\n return (\n <article className={rootClasses}>\n {/* Featured: image on top */}\n {isFeatured && (\n <a\n href={href}\n target={target}\n rel={resolvedRel}\n className=\"post-item__image-link post-item__image-link--featured\"\n aria-label={title}\n >\n <img src={imageUrl} alt={imageAlt} className=\"post-item__image\" loading=\"lazy\" />\n </a>\n )}\n\n <div className=\"post-item__body\">\n <AssetMeta assetType={assetType} duration={duration} date={date} className=\"post-item__meta\" />\n\n <a href={href} target={target} rel={resolvedRel} className=\"post-item__title-link\">\n {title}\n </a>\n </div>\n\n {/* Regular: thumbnail on right */}\n {!isFeatured && (\n <a\n href={href}\n target={target}\n rel={resolvedRel}\n className=\"post-item__image-link post-item__image-link--thumbnail\"\n aria-label={title}\n >\n <img src={imageUrl} alt={imageAlt} className=\"post-item__image\" loading=\"lazy\" />\n </a>\n )}\n </article>\n );\n};\n","import React from 'react';\nimport { Accordion as BaseAccordion, AccordionItem } from '@/components/molecules/Accordion';\nimport { OverflowMediaSection } from '@/components/molecules/primax/OverflowMediaSection';\nimport type { OverflowMediaStackBreakpoint } from '@/components/molecules/primax/OverflowMediaSection';\nimport { MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { DividerProps } from '@/components/atoms/Divider';\nimport { Divider } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport { RichText } from '@/components/atoms/RichText';\nimport './Accordion.scss';\n\nexport type PrimaxAccordionLayout = 'mediaRight' | 'mediaLeft' | 'fullWidth' | 'contentRight' | 'contentLeft';\nexport type PrimaxAccordionVariant = 'white' | 'grey' | 'greyAngled';\n\nexport interface PrimaxAccordionProps extends DividerProps {\n layout?: PrimaxAccordionLayout;\n variant?: PrimaxAccordionVariant;\n heading?: string;\n headingLevel?: HeadingProps['level'];\n headingVariant?: HeadingProps['variant'];\n items: AccordionItem[];\n defaultOpenIndex?: number;\n allowMultiple?: boolean;\n mediaProps?: Omit<MediaBlockProps, 'className'>;\n stackAt?: OverflowMediaStackBreakpoint;\n content?: string;\n chevronIcon?: React.ReactNode;\n onToggle?: (itemId: string, isOpen: boolean) => void;\n className?: string;\n}\n\nconst variantConfig = {\n white: { backgroundColor: 'var(--color-neutral-00)', shapeDivider: 'none' as const },\n grey: { backgroundColor: 'var(--color-neutral-50)', shapeDivider: 'none' as const },\n greyAngled: { backgroundColor: 'var(--color-neutral-50)', shapeDivider: 'both' as const },\n};\n\nexport const Accordion = ({\n layout = 'mediaRight',\n variant = 'white',\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n items,\n defaultOpenIndex,\n allowMultiple = false,\n mediaProps = {},\n stackAt = 'lg',\n content,\n chevronIcon,\n onToggle,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n ...rest\n}: PrimaxAccordionProps) => {\n if (layout === 'mediaRight' || layout === 'mediaLeft') {\n const mediaPosition = layout === 'mediaRight' ? 'right' : 'left';\n const baseClass = 'primax-accordion';\n const classes = [baseClass, `${baseClass}--media-${mediaPosition}`, className].filter(Boolean).join(' ');\n const resolvedBg = backgroundColor ?? variantConfig[variant].backgroundColor;\n const resolvedShape = shapeDivider ?? variantConfig[variant].shapeDivider;\n\n return (\n <OverflowMediaSection\n media={mediaProps}\n mediaPosition={mediaPosition}\n stackAt={stackAt}\n backgroundColor={resolvedBg}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={resolvedShape}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {heading && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode}>\n {heading}\n </Heading>\n )}\n <BaseAccordion\n items={items}\n defaultOpenIndex={defaultOpenIndex}\n allowMultiple={allowMultiple}\n darkMode={darkMode}\n chevronIcon={chevronIcon}\n onToggle={onToggle}\n />\n </OverflowMediaSection>\n );\n }\n\n const baseClass = 'primax-accordion-without-media';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n const accordionColumn = (\n <div className={`${baseClass}__accordion-col`}>\n {heading && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode}>\n {heading}\n </Heading>\n )}\n <BaseAccordion\n items={items}\n defaultOpenIndex={defaultOpenIndex}\n allowMultiple={allowMultiple}\n darkMode={darkMode}\n chevronIcon={chevronIcon}\n onToggle={onToggle}\n />\n </div>\n );\n\n const contentColumn = content ? (\n <div className={`${baseClass}__content-col`}>\n <RichText content={content} darkMode={darkMode} />\n </div>\n ) : null;\n\n const renderGrid = () => {\n if (layout === 'contentRight') {\n return (\n <Grid columns={{ sm: 1, lg: 2 }} gap=\"var(--accordion-without-media-col-gap)\" alignItems=\"start\">\n <GridItem>{accordionColumn}</GridItem>\n <GridItem>{contentColumn}</GridItem>\n </Grid>\n );\n }\n if (layout === 'contentLeft') {\n return (\n <Grid columns={{ sm: 1, lg: 2 }} gap=\"var(--accordion-without-media-col-gap)\" alignItems=\"start\">\n <GridItem>{contentColumn}</GridItem>\n <GridItem>{accordionColumn}</GridItem>\n </Grid>\n );\n }\n return accordionColumn;\n };\n\n return (\n <Divider shapeDivider=\"none\" darkMode={darkMode} className={classes}>\n {renderGrid()}\n </Divider>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faLinkedin, faSquareFacebook, faXTwitter } from '@fortawesome/free-brands-svg-icons';\nimport type { IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport './Footer.scss';\nimport { Paragraph } from '@/components/atoms/Paragraph';\n\n/** Supported social platform keys */\nexport type SocialPlatform = 'linkedin' | 'twitter' | 'facebook';\n\nexport const socialIconRegistry: Record<SocialPlatform, IconDefinition> = {\n linkedin: faLinkedin,\n twitter: faXTwitter,\n facebook: faSquareFacebook,\n};\n\nexport interface FooterLogo {\n /** Logo image source for light backgrounds */\n light: string;\n /** Logo image source for dark backgrounds */\n dark: string;\n /** Alt text for the logo */\n alt?: string;\n /** Logo width */\n width?: number;\n /** Logo height */\n height?: number;\n}\n\nexport interface FooterSocialLink {\n /** Social platform key — resolves to the corresponding FontAwesome brand icon */\n platform: SocialPlatform;\n /** URL for the social link */\n href: string;\n /** Accessible label (defaults to platform name) */\n ariaLabel?: string;\n}\n\nexport interface FooterLink {\n /** Link display text */\n label: string;\n /** Link URL */\n href?: string;\n /** Whether the link opens in a new tab */\n external?: boolean;\n}\n\nexport interface FooterLinkGroup {\n /** Optional group heading (e.g., \"Follow Us\") */\n heading?: string;\n /** Links in this group */\n links: FooterLink[];\n /** Social icons rendered after heading */\n socialLinks?: FooterSocialLink[];\n}\n\nexport interface FooterProps {\n /** Logo configuration with light/dark variants */\n logo?: FooterLogo;\n /** Groups of navigation links */\n linkGroups?: FooterLinkGroup[];\n /** Legal/copyright text (supports HTML) */\n legalText?: string;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Test ID */\n}\n\nexport const Footer: React.FC<FooterProps> = ({\n logo,\n linkGroups = [],\n legalText,\n darkMode = false,\n className = '',\n style,\n}) => {\n const classes = ['primax-footer', className].filter(Boolean).join(' ');\n const logoSrc = logo ? (darkMode ? logo.dark : logo.light) : undefined;\n\n return (\n <footer className={classes} data-dark-mode={darkMode || undefined} style={style} role=\"contentinfo\">\n {/* Logo */}\n {logo && logoSrc && (\n <div className=\"primax-footer__logo\">\n <img src={logoSrc} alt={logo.alt || 'Logo'} width={logo.width} height={logo.height} />\n </div>\n )}\n\n {/* Link Groups */}\n {linkGroups.length > 0 && (\n <nav className=\"primax-footer__nav\" aria-label=\"Footer navigation\">\n {linkGroups.map((group, groupIndex) => (\n <div key={groupIndex} className=\"primax-footer__link-group\">\n {group.heading && <span className=\"primax-footer__group-heading\">{group.heading}</span>}\n {group.socialLinks && group.socialLinks.length > 0 && (\n <div className=\"primax-footer__social\">\n {group.socialLinks.map((social, socialIndex) => {\n const iconDef = socialIconRegistry[social.platform];\n return (\n <a\n key={socialIndex}\n href={social.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"primax-footer__social-link\"\n aria-label={social.ariaLabel || social.platform}\n >\n <FontAwesomeIcon icon={iconDef} />\n </a>\n );\n })}\n </div>\n )}\n {group.links.map((link, linkIndex) => (\n <a\n key={linkIndex}\n href={link.href || '#'}\n className=\"primax-footer__link\"\n target={link.external ? '_blank' : undefined}\n rel={link.external ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n ))}\n </nav>\n )}\n\n {/* Legal Text */}\n {legalText && (\n <Paragraph\n darkMode={darkMode || undefined}\n className=\"primax-footer__legal\"\n dangerouslySetInnerHTML={{ __html: legalText }}\n />\n )}\n </footer>\n );\n};\n","import React from 'react';\nimport { HeaderNavGroup as HeaderNavGroupType } from './HeaderNav';\n\nexport interface HeaderNavGroupProps {\n /** Nav group data */\n group: HeaderNavGroupType;\n /** CSS class prefix for styling */\n classPrefix?: string;\n}\n\n/** Renders a navigation group with optional heading and link list */\nexport const HeaderNavGroup: React.FC<HeaderNavGroupProps> = ({ group, classPrefix = 'primax-header' }) => {\n return (\n <div className={`${classPrefix}__group`}>\n {group.heading && (\n <a\n href={group.links[0]?.href || '#'}\n className={`${classPrefix}__group-heading`}\n target={group.links[0]?.target}\n rel={group.links[0]?.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {group.heading}\n </a>\n )}\n <ul className={`${classPrefix}__group-links`}>\n {group.links.map((link, linkIndex) => (\n <li key={linkIndex}>\n <a\n href={link.href}\n className={`${classPrefix}__group-link`}\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n );\n};\n","import React from 'react';\nimport { Form, FormField } from '@/components/molecules/primax/Form/Form';\nimport { Grid, GridItem } from '@/components/atoms/Grid/Grid';\nimport { Media, MediaProps } from '@/components/atoms/Media/Media';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faMagnifyingGlass } from '@fortawesome/pro-light-svg-icons';\nimport { HeaderNavItem } from './HeaderNav';\nimport { HeaderNavGroup } from './HeaderNavGroup';\n\nexport interface HeaderOverlayProps {\n /** The active nav item to display */\n navItem: HeaderNavItem;\n /** Whether search is enabled */\n showSearch: boolean;\n /** Whether search form is open */\n searchOpen: boolean;\n /** Whether search is in closing animation */\n searchClosing: boolean;\n /** Ref for the search form wrapper (click-outside detection) */\n searchFormRef: React.RefObject<HTMLDivElement | null>;\n /** Toggle search open/close */\n onToggleSearch: () => void;\n /** Search field configuration */\n searchFields: FormField[];\n /** Search submit button label */\n searchSubmitLabel: string;\n /** Search submit handler */\n onSearch?: (data: Record<string, string>) => void;\n /** Mouse enter handler for the overlay */\n onMouseEnter: () => void;\n /** Mouse leave handler for the overlay */\n onMouseLeave: () => void;\n}\n\n/** Desktop dropdown overlay with search, nav groups, and side content */\nexport const HeaderOverlay: React.FC<HeaderOverlayProps> = ({\n navItem,\n showSearch,\n searchOpen,\n searchClosing,\n searchFormRef,\n onToggleSearch,\n searchFields,\n searchSubmitLabel,\n onSearch,\n onMouseEnter,\n onMouseLeave,\n}) => {\n return (\n <div\n className=\"primax-header__overlay\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n role=\"region\"\n aria-label={`${navItem.label} submenu`}\n >\n {/* Search section */}\n {showSearch && (\n <div className=\"primax-header__overlay-search\">\n {!searchOpen ? (\n <button\n type=\"button\"\n className=\"primax-header__search-toggle\"\n onClick={onToggleSearch}\n aria-label=\"Open search\"\n aria-expanded={searchOpen}\n >\n <FontAwesomeIcon icon={faMagnifyingGlass} />\n </button>\n ) : (\n <div\n className={`primax-header__search-form ${searchClosing ? 'primax-header__search-form--closing' : ''}`}\n ref={searchFormRef}\n >\n <Form\n fields={searchFields}\n columns={1}\n gap=\"0\"\n submitLabel={searchSubmitLabel}\n onSubmit={onSearch}\n darkMode={false}\n className=\"primax-header__search-form-inner\"\n />\n </div>\n )}\n </div>\n )}\n\n {/* Nav content */}\n <div className=\"primax-header__overlay-content\">\n <div className=\"primax-header__overlay-nav\">\n <Grid columns={{ sm: 1, md: 2, lg: 2 }} gap=\"1.88rem\" columnGap=\"3.75rem\" className=\"primax-header__nav-grid\">\n {navItem.groups!.map((group, groupIndex) => (\n <GridItem key={groupIndex}>\n <HeaderNavGroup group={group} />\n </GridItem>\n ))}\n </Grid>\n </div>\n\n {(navItem.sideContent || navItem.featuredImage) && (\n <div className=\"primax-header__overlay-side\">\n {navItem.sideContent ? (\n <Media type=\"image\" {...navItem.sideContent} className=\"primax-header__featured-image\" />\n ) : navItem.featuredImage ? (\n <div className=\"primax-header__featured-image\">\n <img src={navItem.featuredImage.src} alt={navItem.featuredImage.alt} />\n </div>\n ) : null}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';\nimport { ButtonProps } from '@/components/atoms/Button/Button';\nimport { ButtonLinkProps } from '@/components/atoms/ButtonLink/ButtonLink';\nimport { Form, FormField } from '@/components/molecules/primax/Form/Form';\nimport { HeaderNavItem } from './HeaderNav';\n\nexport interface HeaderMobileNavProps {\n /** Whether the mobile nav is open */\n isOpen: boolean;\n /** Navigation items */\n navItems: HeaderNavItem[];\n /** CTA configuration */\n cta?: ButtonProps | ButtonLinkProps;\n /** Currently expanded top-level items */\n expandedItems: number[];\n /** Currently expanded group keys */\n expandedGroups: string[];\n /** Toggle a top-level item */\n onToggleItem: (index: number) => void;\n /** Toggle a group */\n onToggleGroup: (key: string) => void;\n /** Search field configuration */\n searchFields: FormField[];\n /** Search submit button label */\n searchSubmitLabel: string;\n /** Search submit handler */\n onSearch?: (data: Record<string, string>) => void;\n}\n\n/** Mobile accordion navigation rendered below the main nav bar */\nexport const HeaderMobileNav: React.FC<HeaderMobileNavProps> = ({\n isOpen,\n navItems,\n cta,\n expandedItems,\n expandedGroups,\n onToggleItem,\n onToggleGroup,\n searchFields,\n searchSubmitLabel,\n onSearch,\n}) => {\n return (\n <div\n id=\"primax-header-mobile-nav\"\n className={`primax-header__mobile-nav-wrapper ${isOpen ? 'primax-header__mobile-nav-wrapper--open' : ''}`}\n aria-hidden={!isOpen}\n >\n <nav className=\"primax-header__mobile-nav\" aria-label=\"Mobile navigation\">\n {navItems.map((item, index) => {\n const isExpanded = expandedItems.includes(index);\n const hasChildren = !!item.groups;\n\n return (\n <div key={index} className=\"primax-header__mobile-item\">\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"primax-header__mobile-item-btn\"\n onClick={() => onToggleItem(index)}\n aria-expanded={isExpanded}\n >\n <span>{item.label}</span>\n <FontAwesomeIcon\n icon={isExpanded ? faChevronUp : faChevronDown}\n className=\"primax-header__mobile-chevron\"\n />\n </button>\n ) : (\n <a\n href={item.href || '#'}\n className=\"primax-header__mobile-item-btn\"\n target={item.target}\n rel={item.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n <span>{item.label}</span>\n </a>\n )}\n\n {hasChildren && isExpanded && (\n <div className=\"primax-header__mobile-submenu\">\n {item.groups!.map((group, groupIndex) => {\n const groupKey = `${index}-${groupIndex}`;\n const isGroupExpanded = expandedGroups.includes(groupKey);\n\n return (\n <div key={groupIndex} className=\"primax-header__mobile-group\">\n {group.heading ? (\n <>\n <button\n type=\"button\"\n className=\"primax-header__mobile-group-btn\"\n onClick={() => onToggleGroup(groupKey)}\n aria-expanded={isGroupExpanded}\n >\n <span>{group.heading}</span>\n <FontAwesomeIcon\n icon={isGroupExpanded ? faChevronUp : faChevronDown}\n className=\"primax-header__mobile-chevron\"\n />\n </button>\n\n {isGroupExpanded && (\n <ul className=\"primax-header__mobile-group-links\">\n {group.links.map((link, linkIndex) => (\n <li key={linkIndex}>\n <a\n href={link.href}\n className=\"primax-header__mobile-sublink\"\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n )}\n </>\n ) : (\n <ul className=\"primax-header__mobile-group-links\">\n {group.links.map((link, linkIndex) => (\n <li key={linkIndex}>\n <a\n href={link.href}\n className=\"primax-header__mobile-sublink\"\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n\n {/* CTA in mobile */}\n {cta && (\n <div className=\"primax-header__mobile-item\">\n {'href' in cta ? (\n <a href={(cta as ButtonLinkProps).href} className=\"primax-header__mobile-item-btn\">\n <span>{(cta as ButtonLinkProps).label || 'Contact Us'}</span>\n </a>\n ) : (\n <button type=\"button\" className=\"primax-header__mobile-item-btn\" onClick={(cta as ButtonProps).onClick}>\n <span>{(cta as ButtonProps).label || 'Contact Us'}</span>\n </button>\n )}\n </div>\n )}\n </nav>\n\n {/* Mobile search */}\n <div className=\"primax-header__mobile-search\">\n <Form\n fields={searchFields}\n columns={1}\n gap=\"0\"\n submitLabel={searchSubmitLabel}\n onSubmit={onSearch}\n darkMode={false}\n className=\"primax-header__mobile-search-form\"\n />\n </div>\n </div>\n );\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink/ButtonLink';\nimport { MediaProps } from '@/components/atoms/Media/Media';\nimport { FormField } from '@/components/molecules/primax/Form/Form';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faBars, faXmark } from '@fortawesome/free-solid-svg-icons';\nimport { HeaderOverlay } from './HeaderOverlay';\nimport { HeaderMobileNav } from './HeaderMobileNav';\nimport './HeaderNav.scss';\n\nexport interface HeaderNavLink {\n /** Display text */\n label: string;\n /** Link URL */\n href: string;\n /** Link target (e.g. '_blank') */\n target?: string;\n}\n\nexport interface HeaderNavGroup {\n /** Category heading (optional — renders links directly if omitted) */\n heading?: string;\n /** Sub-links within this group */\n links: HeaderNavLink[];\n}\n\nexport interface HeaderNavItem extends Omit<HeaderNavLink, 'href'> {\n /** Direct link URL (renders as <a>, dropdown triggered by hover) */\n href?: string;\n /** Dropdown content groups (if present, renders a mega-menu on hover) */\n groups?: HeaderNavGroup[];\n /** Optional featured image for the dropdown */\n featuredImage?: {\n src: string;\n alt: string;\n };\n /** Media displayed on the right side of the dropdown (uses Media atom). Defaults to type 'image' if not specified. */\n sideContent?: MediaProps;\n}\n\nexport interface HeaderNavProps {\n /** Logo configuration */\n logo?: {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n href?: string;\n };\n /** Top-level navigation items */\n navItems?: HeaderNavItem[];\n /** CTA button or link — pass `href` to render a ButtonLink */\n cta?: ButtonProps | ButtonLinkProps;\n /** Show search functionality in the dropdown overlay */\n showSearch?: boolean;\n /** Search form field configuration (uses Form component) */\n searchFields?: FormField[];\n /** Submit button label for the search form */\n searchSubmitLabel?: string;\n /** Search submit handler — receives form data keyed by field name */\n onSearch?: (data: Record<string, string>) => void;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_SEARCH_FIELDS: FormField[] = [\n {\n name: 'search',\n label: 'Search',\n type: 'text',\n placeholder: 'Search',\n hideLabel: true,\n clearable: true,\n },\n];\n\nexport const HeaderNav: React.FC<HeaderNavProps> = ({\n logo,\n navItems = [],\n cta,\n showSearch = true,\n searchFields,\n searchSubmitLabel = 'SEARCH',\n onSearch,\n darkMode = false,\n className = '',\n}) => {\n // Desktop dropdown state\n const [activeDropdown, setActiveDropdown] = useState<number | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const headerRef = useRef<HTMLElement>(null);\n\n // Search state\n const [searchOpen, setSearchOpen] = useState(false);\n const [searchClosing, setSearchClosing] = useState(false);\n const searchFormRef = useRef<HTMLDivElement>(null);\n\n // Mobile state\n const [mobileOpen, setMobileOpen] = useState(false);\n const [mobileExpandedItems, setMobileExpandedItems] = useState<number[]>([]);\n const [mobileExpandedGroups, setMobileExpandedGroups] = useState<string[]>([]);\n\n // Reset mobile expanded state when closing\n useEffect(() => {\n if (!mobileOpen) {\n setMobileExpandedItems([]);\n setMobileExpandedGroups([]);\n }\n }, [mobileOpen]);\n\n // Global escape key handler\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (mobileOpen) setMobileOpen(false);\n if (searchOpen) setSearchOpen(false);\n if (activeDropdown !== null) setActiveDropdown(null);\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [mobileOpen, searchOpen, activeDropdown]);\n\n const closeSearch = useCallback(() => {\n setSearchClosing(true);\n setTimeout(() => {\n setSearchOpen(false);\n setSearchClosing(false);\n }, 300);\n }, []);\n\n // Close search on click outside\n useEffect(() => {\n if (!searchOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (searchFormRef.current && !searchFormRef.current.contains(e.target as Node)) {\n closeSearch();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [searchOpen, closeSearch]);\n\n const toggleSearch = useCallback(() => {\n if (searchOpen) {\n closeSearch();\n } else {\n setSearchOpen(true);\n }\n }, [searchOpen, closeSearch]);\n\n const handleNavEnter = useCallback((index: number) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setActiveDropdown(index);\n }, []);\n\n const handleNavLeave = useCallback(() => {\n if (searchOpen) return;\n timeoutRef.current = setTimeout(() => setActiveDropdown(null), 150);\n }, [searchOpen]);\n\n const handleDropdownEnter = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleDropdownLeave = useCallback(() => {\n if (searchOpen) return;\n timeoutRef.current = setTimeout(() => setActiveDropdown(null), 150);\n }, [searchOpen]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent, index: number) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setActiveDropdown(activeDropdown === index ? null : index);\n }\n if (event.key === 'Escape') {\n setActiveDropdown(null);\n }\n },\n [activeDropdown]\n );\n\n const toggleMobileItem = useCallback((index: number) => {\n setMobileExpandedItems((prev) => (prev.includes(index) ? [] : [index]));\n setMobileExpandedGroups([]);\n }, []);\n\n const toggleMobileGroup = useCallback((key: string) => {\n setMobileExpandedGroups((prev) => (prev.includes(key) ? [] : [key]));\n }, []);\n\n const resolvedSearchFields = searchFields || DEFAULT_SEARCH_FIELDS;\n const classes = ['primax-header', className].filter(Boolean).join(' ');\n\n return (\n <header ref={headerRef} className={classes} data-dark-mode={darkMode || undefined}>\n {/* Top navigation bar */}\n <div className=\"primax-header__top-nav\">\n <nav className=\"primax-header__nav\" aria-label=\"Main navigation\">\n {/* Logo */}\n {logo && (\n <div className=\"primax-header__logo\">\n {logo.href ? (\n <a href={logo.href} aria-label={logo.alt || 'Home'}>\n <img src={logo.src} alt={logo.alt || 'Logo'} width={logo.width || 200} height={logo.height || 63} />\n </a>\n ) : (\n <img src={logo.src} alt={logo.alt || 'Logo'} width={logo.width || 200} height={logo.height || 63} />\n )}\n </div>\n )}\n\n {/* Desktop nav items + CTA */}\n <div className=\"primax-header__right\">\n {navItems.map((item, index) => (\n <div\n key={index}\n className={`primax-header__nav-item ${activeDropdown === index ? 'primax-header__nav-item--active' : ''}`}\n onMouseEnter={() => item.groups && handleNavEnter(index)}\n onMouseLeave={handleNavLeave}\n >\n <span className=\"primax-header__nav-item-bg\" aria-hidden=\"true\" />\n\n {item.href ? (\n <a\n href={item.href}\n className=\"primax-header__nav-link\"\n target={item.target}\n rel={item.target === '_blank' ? 'noopener noreferrer' : undefined}\n aria-haspopup={item.groups ? 'true' : undefined}\n aria-expanded={item.groups ? activeDropdown === index : undefined}\n onKeyDown={(e) => item.groups && handleKeyDown(e, index)}\n >\n {item.label}\n </a>\n ) : (\n <button\n type=\"button\"\n className=\"primax-header__nav-link\"\n aria-expanded={item.groups ? activeDropdown === index : undefined}\n aria-haspopup={item.groups ? 'true' : undefined}\n onKeyDown={(e) => item.groups && handleKeyDown(e, index)}\n >\n {item.label}\n </button>\n )}\n </div>\n ))}\n\n {cta && (\n <div className=\"primax-header__cta\">\n {'href' in cta ? (\n <ButtonLink darkMode={darkMode} {...(cta as ButtonLinkProps)} />\n ) : (\n <Button darkMode={darkMode} {...(cta as ButtonProps)} />\n )}\n </div>\n )}\n </div>\n\n {/* Mobile hamburger */}\n <button\n type=\"button\"\n className=\"primax-header__hamburger\"\n onClick={() => setMobileOpen((prev) => !prev)}\n aria-label={mobileOpen ? 'Close menu' : 'Open menu'}\n aria-expanded={mobileOpen}\n aria-controls=\"primax-header-mobile-nav\"\n >\n <FontAwesomeIcon icon={mobileOpen ? faXmark : faBars} />\n </button>\n </nav>\n </div>\n\n {/* Desktop dropdown overlay */}\n {activeDropdown !== null && navItems[activeDropdown]?.groups && (\n <HeaderOverlay\n navItem={navItems[activeDropdown]}\n showSearch={showSearch}\n searchOpen={searchOpen}\n searchClosing={searchClosing}\n searchFormRef={searchFormRef}\n onToggleSearch={toggleSearch}\n searchFields={resolvedSearchFields}\n searchSubmitLabel={searchSubmitLabel}\n onSearch={onSearch}\n onMouseEnter={handleDropdownEnter}\n onMouseLeave={handleDropdownLeave}\n />\n )}\n\n {/* Mobile nav */}\n <HeaderMobileNav\n isOpen={mobileOpen}\n navItems={navItems}\n cta={cta}\n expandedItems={mobileExpandedItems}\n expandedGroups={mobileExpandedGroups}\n onToggleItem={toggleMobileItem}\n onToggleGroup={toggleMobileGroup}\n searchFields={resolvedSearchFields}\n searchSubmitLabel={searchSubmitLabel}\n onSearch={onSearch}\n />\n </header>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faLinkedin, faXTwitter, faSquareFacebook, faInstagram } from '@fortawesome/free-brands-svg-icons';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './Footer.scss';\n\nexport interface FooterLink {\n label: string;\n href: string;\n target?: '_blank' | '_self';\n}\n\nexport interface FooterSocialLink {\n platform: 'linkedin' | 'twitter' | 'facebook' | 'instagram';\n href: string;\n ariaLabel: string;\n}\n\nexport interface FooterProps {\n /** Navigation columns — each inner array is one column of links */\n linkColumns?: FooterLink[][];\n /** Social media icon links */\n socialLinks?: FooterSocialLink[];\n /** Copyright content — accepts a plain string or JSX */\n copyrightText?: React.ReactNode;\n /** Logo node rendered below the content row */\n logo?: React.ReactNode;\n className?: string;\n}\n\nconst socialIconMap: Record<FooterSocialLink['platform'], IconDefinition> = {\n linkedin: faLinkedin,\n twitter: faXTwitter,\n facebook: faSquareFacebook,\n instagram: faInstagram,\n};\n\nexport const Footer = ({ linkColumns = [], socialLinks = [], copyrightText, logo, className }: FooterProps) => {\n return (\n <footer className={`footer${className ? ` ${className}` : ''}`}>\n {(linkColumns.length > 0 || socialLinks.length > 0) && (\n <div className=\"footer__top-row\">\n {linkColumns.map((column, colIndex) => (\n <nav\n key={colIndex}\n aria-label={`Footer navigation ${colIndex + 1}`}\n className={`footer__nav-column${colIndex === 0 ? ' footer__nav-column--first' : ''}`}\n >\n <ul className=\"footer__nav-list\">\n {column.map((link) => (\n <li key={link.href}>\n <a\n href={link.href}\n target={link.target ?? '_self'}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n className=\"footer__nav-link\"\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n ))}\n\n {socialLinks.length > 0 && (\n <div className=\"footer__social\">\n <span className=\"footer__social-label\">Follow Us</span>\n <div className=\"footer__social-icons\">\n {socialLinks.map((social) => (\n <a\n key={social.platform}\n href={social.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"footer__social-link\"\n aria-label={social.ariaLabel}\n >\n <FontAwesomeIcon icon={socialIconMap[social.platform]} />\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {copyrightText && (\n <div className=\"footer__copyright-bar\">\n <Paragraph className=\"footer__copyright\">{copyrightText}</Paragraph>\n </div>\n )}\n\n {logo && <div className=\"footer__logo\">{logo}</div>}\n </footer>\n );\n};\n","import React from 'react';\nimport { Icon } from '@/components/atoms/Icon';\nimport './TestimonialCard.scss';\n\nexport interface TestimonialCardProps {\n quote: string;\n name: string;\n position: string;\n company: string;\n variant?: 'standalone' | 'slider';\n imageSrc?: string;\n}\n\nconst QuoteMarkSvg = (\n <svg viewBox=\"0 0 60 47\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0 29.4312C0 22.8242 2.20233 16.9179 6.607 11.7124C11.0117 6.50689 16.8679 2.60275 24.1756 0L26.8785 6.30668C24.8764 7.30774 22.674 8.90944 20.2715 11.1118C17.969 13.3141 15.8168 15.8168 13.8146 18.6197L21.1724 23.575C23.4749 25.1767 25.0265 26.9285 25.8274 28.8305C26.6282 30.6325 27.0286 32.5845 27.0286 34.6868C27.0286 38.0904 25.7273 40.9934 23.1245 43.396C20.5217 45.7985 17.6187 46.9998 14.4153 46.9998C11.9126 46.9998 9.8104 46.4993 8.10859 45.4982C6.40679 44.4971 4.95525 43.5461 3.75398 42.6452C2.4526 40.6431 1.50159 38.4908 0.900955 36.1883C0.300318 33.8859 0 31.6335 0 29.4312ZM32.7347 29.4312C32.7347 22.8242 34.937 16.9179 39.3417 11.7124C43.7464 6.50689 49.6026 2.60275 56.9103 0L59.6132 6.30668C57.6111 7.30774 55.4087 8.90944 53.0062 11.1118C50.7037 13.3141 48.5514 15.8168 46.5493 18.6197L53.9071 23.575C56.2096 25.1767 57.7612 26.9285 58.5621 28.8305C59.3629 30.6325 59.7633 32.5845 59.7633 34.6868C59.7633 38.0904 58.462 40.9934 55.8592 43.396C53.2564 45.7985 50.3534 46.9998 47.15 46.9998C44.6473 46.9998 42.5451 46.4993 40.8433 45.4982C39.1415 44.4971 37.6899 43.5461 36.4887 42.6452C35.1873 40.6431 34.2363 38.4908 33.6356 36.1883C33.035 33.8859 32.7347 31.6335 32.7347 29.4312Z\" />\n </svg>\n);\n\nconst SliderCard = ({ quote, name, position, company }: TestimonialCardProps) => {\n const initials = name\n .split(' ')\n .map((w) => w[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n const role = [position, company].filter(Boolean).join(', ');\n return (\n <article className=\"testimonial-card testimonial-card--slider\">\n <div className=\"testimonial-card__text-content\">\n <div className=\"testimonial-card__quote-wrapper\" aria-hidden=\"true\">\n <Icon svg={QuoteMarkSvg} decorative fill=\"var(--testimonial-card-slider-quote-mark-color)\" strokeWidth={0} />\n </div>\n <p className=\"testimonial-card__quote\">{quote}</p>\n </div>\n <div className=\"testimonial-card__footer\">\n <div className=\"testimonial-card__author\">\n {initials && (\n <div className=\"testimonial-card__avatar\" aria-hidden=\"true\">\n <span className=\"testimonial-card__initials\">{initials}</span>\n </div>\n )}\n <div className=\"testimonial-card__name-column\">\n <span className=\"testimonial-card__name\">{name}</span>\n <span className=\"testimonial-card__role\">{role}</span>\n </div>\n </div>\n </div>\n </article>\n );\n};\n\nconst StandaloneCard = ({ quote, name, position, company, imageSrc }: TestimonialCardProps) => {\n const imageAlt = [`Portrait of ${name}`, position, `of ${company}`].join(', ');\n return (\n <div className=\"testimonial-card testimonial-card--standalone\">\n <div className=\"testimonial-card__content-wrapper\">\n {imageSrc && (\n <div className=\"testimonial-card__image\">\n <img src={imageSrc} alt={imageAlt} />\n </div>\n )}\n <div className=\"testimonial-card__bottom-content\">\n <div className=\"testimonial-card__quote-mark-wrapper\" aria-hidden=\"true\">\n <Icon\n svg={QuoteMarkSvg}\n decorative\n fill=\"var(--testimonial-card-standalone-quote-mark-color)\"\n strokeWidth={0}\n />\n </div>\n <div className=\"testimonial-card__text-content\">\n <p className=\"testimonial-card__quote\">{quote}</p>\n <div className=\"testimonial-card__attribution\">\n <div className=\"testimonial-card__name-title-row\">\n <span className=\"testimonial-card__author-name\">{name}</span>\n {position && (\n <>\n <span className=\"testimonial-card__sep\" aria-hidden=\"true\">\n |\n </span>\n <span className=\"testimonial-card__author-title\">{position}</span>\n </>\n )}\n </div>\n <div className=\"testimonial-card__company\">{company}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const TestimonialCard = ({ variant = 'slider', ...props }: TestimonialCardProps) => {\n return variant === 'standalone' ? <StandaloneCard {...props} /> : <SliderCard {...props} />;\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport './DataDial.scss';\n\nexport interface DataDialProps {\n value: number;\n unit?: string;\n progressColor?: string;\n trackColor?: string;\n backgroundColor?: string;\n valueColor?: string;\n ringWidth?: number;\n darkMode?: boolean;\n disableAnimation?: boolean;\n className?: string;\n}\n\nconst SVG_CENTER = 82;\nconst DEFAULT_RING_WIDTH = 27;\nconst ANIMATION_DURATION = 1000;\n\nexport const DataDial = ({\n value,\n unit = '%',\n progressColor,\n trackColor,\n backgroundColor,\n valueColor,\n ringWidth = DEFAULT_RING_WIDTH,\n darkMode,\n disableAnimation = false,\n className,\n}: DataDialProps) => {\n const clamped = Math.min(100, Math.max(0, value));\n const radius = SVG_CENTER - ringWidth / 2;\n const circumference = 2 * Math.PI * radius;\n const innerRadius = radius - ringWidth / 2;\n\n const prefersReducedMotion =\n typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const skipAnimation = disableAnimation || prefersReducedMotion;\n\n const [animatedValue, setAnimatedValue] = useState(skipAnimation ? clamped : 0);\n const containerRef = useRef<HTMLDivElement>(null);\n const hasAnimated = useRef(false);\n const rafRef = useRef<number>(0);\n\n useEffect(() => {\n if (skipAnimation) {\n setAnimatedValue(clamped);\n return;\n }\n\n const el = containerRef.current;\n if (!el) return;\n\n const runAnimation = () => {\n if (hasAnimated.current) return;\n hasAnimated.current = true;\n\n const start = performance.now();\n const tick = (now: number) => {\n const elapsed = now - start;\n const progress = Math.min(elapsed / ANIMATION_DURATION, 1);\n const eased = 1 - Math.pow(1 - progress, 3);\n setAnimatedValue(eased * clamped);\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(tick);\n }\n };\n rafRef.current = requestAnimationFrame(tick);\n };\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) runAnimation();\n },\n { threshold: 0.1 }\n );\n\n observer.observe(el);\n return () => {\n observer.disconnect();\n cancelAnimationFrame(rafRef.current);\n };\n }, [clamped, skipAnimation]);\n\n const offset = circumference - (animatedValue / 100) * circumference;\n\n const style = {\n ...(progressColor && { '--data-dial-ring-progress': progressColor }),\n ...(trackColor && { '--data-dial-ring-track': trackColor }),\n ...(backgroundColor && { '--data-dial-ring-bg': backgroundColor }),\n ...(valueColor && { '--data-dial-text': valueColor }),\n } as React.CSSProperties;\n\n return (\n <div\n ref={containerRef}\n role=\"meter\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${clamped}${unit}`}\n className={`data-dial${darkMode ? ' data-dial--dark' : ''}${className ? ` ${className}` : ''}`}\n style={Object.keys(style).length ? style : undefined}\n >\n <div className=\"data-dial__ring-container\">\n <svg className=\"data-dial__svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 164 164\" aria-hidden=\"true\">\n <circle className=\"data-dial__ring-bg\" cx=\"82\" cy=\"82\" r={innerRadius} />\n <circle className=\"data-dial__track\" cx=\"82\" cy=\"82\" r={radius} strokeWidth={ringWidth} fill=\"none\" />\n <circle\n className=\"data-dial__progress\"\n cx=\"82\"\n cy=\"82\"\n r={radius}\n strokeWidth={ringWidth}\n fill=\"none\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n />\n </svg>\n <div className=\"data-dial__center\" aria-hidden=\"true\">\n <div className=\"data-dial__value-row\">\n <span className=\"data-dial__value\" aria-hidden=\"true\">\n {Math.round(animatedValue)}\n </span>\n {unit && (\n <div className=\"data-dial__unit-wrap\">\n <span className=\"data-dial__unit\">{unit}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faArrowUp, faArrowDown } from '@fortawesome/free-solid-svg-icons';\nimport './StatPill.scss';\n\nexport interface StatPillProps {\n stat: string;\n label?: string;\n direction?: 'up' | 'down';\n darkMode?: boolean;\n className?: string;\n}\n\nexport const StatPill = ({ stat, label, direction = 'up', darkMode, className }: StatPillProps) => (\n <div className={`stat-pill${darkMode ? ' stat-pill--dark' : ''}${className ? ` ${className}` : ''}`}>\n <FontAwesomeIcon\n icon={direction === 'down' ? faArrowDown : faArrowUp}\n className=\"stat-pill__arrow\"\n aria-hidden=\"true\"\n />\n <span className=\"stat-pill__sign\">{direction === 'down' ? '−' : '+'}</span>\n <span className=\"stat-pill__stat\">{stat}</span>\n <span className=\"stat-pill__pct\">%</span>\n {label && (\n <>\n <span className=\"stat-pill__spacer\" aria-hidden=\"true\" />\n <span className=\"stat-pill__suffix\">{label}</span>\n </>\n )}\n </div>\n);\n","import React from 'react';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { DataDial } from '@/components/atoms/DataDial';\nimport { StatPill } from '@/components/atoms/StatPill';\nimport './PercentDialCard.scss';\n\nexport interface PercentDialCardProps {\n value: number;\n title: string;\n body?: string;\n stat?: string;\n label?: string;\n direction?: 'up' | 'down';\n darkMode?: boolean;\n className?: string;\n}\n\nexport const PercentDialCard = ({\n value,\n title,\n body,\n stat,\n label,\n direction = 'up',\n darkMode,\n className,\n}: PercentDialCardProps) => (\n <div className={`percent-dial-card${darkMode ? ' percent-dial-card--dark' : ''}${className ? ` ${className}` : ''}`}>\n <DataDial value={value} darkMode={darkMode} />\n <Paragraph\n className=\"percent-dial-card__label\"\n weight=\"bold\"\n size=\"md\"\n style={{ color: 'var(--percent-dial-card-label)' }}\n >\n {title}\n </Paragraph>\n {body && (\n <Paragraph className=\"percent-dial-card__body\" size=\"md\" style={{ color: 'var(--percent-dial-card-text)' }}>\n {body}\n </Paragraph>\n )}\n {stat && <StatPill stat={stat} label={label} direction={direction} darkMode={darkMode} />}\n </div>\n);\n","export default \"data:image/png;base64,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wEZM75wdPrJjZqp3DuyYmdq/c3a4G1fiMiMr8C786c7Z4eU7Z4ev7pwddjtmpnrh/xv0fe+tUDfdBCrnh2FuU+9trm66SQz88fW5TUNnqW669fgiNigew9dym446h+qmux634GKLzeFJPIH9OIBDOJrbNOcCM+j73pulbrpVeCc24gqsQ8KU889RvIID2I99eDy36SXLSN10q7ER78J6TGMtJp1/hngZ+3EAT+KJ3KbDTqNuupX4Aj6g2IvbcpuOOofqpluBD+FjWGd56THEEB0O4Fk8gadzm+a9SQZ93xtH3XSr8H7cgM1YaXl7Dg8i5za96DxUN91qXI8a12Bg+eqxDxm7c5sOe4266Sp8Dh9W7MVtuU1HnWN10w2wGTW2YMrydgSPYhf25DbNG8Og73tLUTfdGtyEmzDl7afHI/hBbtM+54G66S7Dx/EhrPD2cww/xw9zm15wkrrpBtiObYq9uC236ai3SN10FTZgE67ENC7DJFZYfg7ih3ggt2nOEgz6vnc26qZbgY/hzzFhsUPYi304gOdxGMPcpmPOA3XTTWESl2AaG7AJVzq1X+N7uU0v+COom241Pok/QWWxF7EHv8d+vIjDmMttmvdHVjddhQmsxqWYxlW4FpdabB734+7cpsNOqJtugO3YptiL23Kbjvojq5tuBVY5P1SYxBpchmlcg41YZbFXcDfuz23qnYVB3/fOVN1078JfY9pCh/EgduGp3KbeMlQ33VpcjxuxwUKv4h78MLdp3lukbrrrMIOLLNRhF3Ju037LVN1006hxA5KFDmE2t+khJ9RNN8B2bFPsxW25TUeF11U33Qpswo3YglUW+h2+ndv0jDM06PveG6mbboCP45OoFC/jB3ggt2nO20jddJvxF9hkob34Zm7Ty86huulW4TP4Ews9h+/jodymeW8TddNVuA4343IL3Y87c5uOOq5uugG2Y5tiL27LbToqnJG66dbgJtyEKcWrmM1tesAZGPR97/XUTbcCX8BWxTx+jHtym+a8jdVN937MICkO4p9zm55xDtRNdxH+E65WDHE3/m9u07y3qbrpKnwEn8Sk4il8NbfpkOPqphtgO7Yp9uK23Kajwhmrm24N/gofwkBxP76b2zTvdQz6vnc6ddNN4e+xSfE8bs9tetoFom66CczgRsUQt+U2PeFNVDfdpfjPWK94At/IbTroAlE33cX4W2xUHMA/5Ta96Li66QbYjm2KPfhqbtMx4azUTbcJX8DFiofxjdymV53GiltvvdWp1E23Al/GZsXD+Ofcps4FZMfM1LEdM1MP75wddngvKqzE1p2zwz07ZqYOehPUTXcR/gHrFT/Ct3Kbhi4gO2am5nbODjNW4Z1G1uB9O2eHu3fMTB3dMTNl5+zwUazF1UYuw/TO2eGvdsxMCWdux8zUiztnh7vwDlxqZBpX7Jwd/nLHzFTvFCqnUDfdAF/AZsX9uD23aegCldv0c/x3HDUyia/UTXeZMdVNN4GvYJ3iztymu3Kb5l2Acpvmc5vuwp2KdfhK3XQTjstt6vFd3K+4Dp8Wzlpu0yv4Jzyk2ILPOY3KqX0cWxUP5Db9r9ymeRe43Kbf4Ks4ZmQN/q5uupXG8zlcpfhebtNPBLlNP8H3FFfhc07IberxXfxK8bG66bYIZy236Ri+iYcUH66bbptTqLxG3XTvwicVD+M7wh/kNj2Obyo24DOWqG66D6NW3Jvb9FPhD3Kbfop7FXXddB92Qm7TPL6JfYrP1013iXDWcpvmcQf2Kj5TN90Gr1E5Sd10K/AfUBl5Ht/KbZoXFsht+iV+oNhWN90mZ6luuotxi+Ix3C2cyt14THFL3XQXOyG36VV8HUeMrMYtwpLkNh3D1/GSkZX4fN10lZNUFvp3uNzIPL6e2zQUTudu7FPM1E23wtm5BZNGDuGO3KZeWCS3qccdOGRkErc4SW5Th+8orqubbrOwJLlNr+Cb6I1chW1OUjmhbrrVuFnxk9ym3wunlds0j+9g3sgV+JAzVDfd1bhecVdu0yHhtHKbDuEuxfV1013tJLlNu7FH8SlhyXKbnsD9ir+sm27CCZXiJkwYeRn3CG8ot+lp3Kf4WN10lTNzs+JJZOFMZDypuNlid6I3ck3ddJuFcfwLXjGyGn/qhMpxddOtxEcVP8ptGgpn6l4cM7IOW72BuunWY4vintymXnhDuU097lFsqZtuvZPkNj2LRxQfFZYst+kwfqb4aN10KxxXGXk/powcwX3CGcttOohdihu8sRsVT+U2PSacsdymx/CU4kaL/VDx3rrp1gjj+AnmjKzFexxXGakVu3Ob5oSz9YDi3XXTrXUaddMNUCseEJbiAUVdN93ASXKbfovnjVS4Tliy3KYj+KXiBsdVddOtxLWKXcJZy23ahwNGKrzH6V2BZOQYHhKW4iEcM5JwhcUeVLxbGNcuxXvqpqsqXINVRg5jn7BUjyo2Ob3Nit/mNh0Wzlpu02H8VrHZYo8pNtZNNxDG8QSGRiZwTYWNisdzm3phqfYoNjm9jYq9wjj2KjZa7Hc4amQ1poUly22axxOKjRWmFfuEcfxOkeqmW+XUphX7hHHsU0x7jdymY3hWMS2M67eKyytMKw4IS5bbdAhHjAyw3mvUTVdhneKAMI4DinV101UWO6BYL4xrv2K6wiWKA8K4DigusdharDByDJ0wjg7HjKzAWou9qFgrjOt5RaowoRgK4xoqJiw2oRjmNvXCkuU29RgqJiw2VEwI4zqimKiwSjEnjGtOMWGxCcWc8GaYU0xY7JhiQhjXULGqEs6lCYtNCOfShNe3UnhTVUIIYQyVEEIYQyWEEMZQCSGEMVRCCGEMlRBCGEMlhBDGUAkhhDFUQghhDJUQQhhDJYQQxlAJIYQxVEIIYQyVEEIYQyWEEMZQCSGEMVRCCGEM/w+FPL2jkK5yeQAAAABJRU5ErkJggg==\"","import React from 'react';\nimport { Container } from '@/components/atoms/Container';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { PercentDialCard } from '../../PercentDialCard';\nimport type { PercentDialCardProps } from '../../PercentDialCard';\nimport bgPattern from '@assets/testimonial-standalone-bg.png';\nimport './PercentDialCards.scss';\n\nexport type { PercentDialCardProps };\n\nexport interface PercentDialCardsProps {\n eyebrow?: string;\n title: string;\n description?: string;\n dials: PercentDialCardProps[];\n backgroundImage?: string;\n darkMode?: boolean;\n className?: string;\n}\n\nexport const PercentDialCards = ({\n eyebrow,\n title,\n description,\n dials,\n backgroundImage,\n darkMode,\n className,\n}: PercentDialCardsProps) => {\n const patternUrl = backgroundImage ?? (darkMode ? bgPattern : undefined);\n const sectionStyle = patternUrl\n ? ({ '--percent-dial-cards-bg-image': `url(${patternUrl})` } as React.CSSProperties)\n : undefined;\n\n return (\n <section\n className={`percent-dial-cards${darkMode ? ' percent-dial-cards--dark' : ''}${className ? ` ${className}` : ''}`}\n style={sectionStyle}\n >\n <Container>\n <div className=\"percent-dial-cards__header\">\n {eyebrow && (\n <Paragraph\n className=\"percent-dial-cards__eyebrow\"\n weight=\"bold\"\n size=\"md\"\n style={{ color: 'var(--percent-dial-cards-text)' }}\n >\n {eyebrow.toUpperCase()}\n </Paragraph>\n )}\n <Heading\n level=\"h2\"\n className=\"percent-dial-cards__heading\"\n style={{ color: 'var(--percent-dial-cards-text)' }}\n >\n {title}\n </Heading>\n {description && (\n <Paragraph\n className=\"percent-dial-cards__description\"\n size=\"md\"\n style={{ color: 'var(--percent-dial-cards-subheading)' }}\n >\n {description}\n </Paragraph>\n )}\n </div>\n\n <div className=\"percent-dial-cards__grid\">\n {dials.map((dial, index) => (\n <PercentDialCard key={index} {...dial} darkMode={darkMode} />\n ))}\n </div>\n </Container>\n </section>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons';\nimport './Pagination.scss';\n\nexport interface PaginationProps {\n totalPages: number;\n currentPage: number;\n onPrev: () => void;\n onNext: () => void;\n onPageSelect: (index: number) => void;\n className?: string;\n}\n\nexport const Pagination = ({ totalPages, currentPage, onPrev, onNext, onPageSelect, className }: PaginationProps) => (\n <div className={`pagination${className ? ` ${className}` : ''}`}>\n {currentPage > 0 ? (\n <button className=\"pagination__arrow\" onClick={onPrev} aria-label=\"Previous page\">\n <FontAwesomeIcon icon={faChevronLeft} aria-hidden=\"true\" />\n </button>\n ) : (\n <span className=\"pagination__arrow-placeholder\" aria-hidden=\"true\" />\n )}\n\n {Array.from({ length: totalPages }, (_, i) => (\n <button\n key={i}\n className={`pagination__dot${i === currentPage ? ' pagination__dot--active' : ''}`}\n onClick={() => onPageSelect(i)}\n aria-label={`Go to page ${i + 1}`}\n aria-current={i === currentPage ? 'page' : undefined}\n >\n <span className=\"pagination__dot-indicator\" />\n </button>\n ))}\n\n {currentPage < totalPages - 1 ? (\n <button className=\"pagination__arrow\" onClick={onNext} aria-label=\"Next page\">\n <FontAwesomeIcon icon={faChevronRight} aria-hidden=\"true\" />\n </button>\n ) : (\n <span className=\"pagination__arrow-placeholder\" aria-hidden=\"true\" />\n )}\n </div>\n);\n","import React, { useState, useRef, useLayoutEffect } from 'react';\nimport { Pagination } from '../../atoms/Pagination';\nimport './Carousel.scss';\n\nexport interface CarouselVisibleCardsType {\n desktop?: number;\n tablet?: number;\n mobile?: number;\n}\n\nexport type CarouselShowPeekType = number | { desktop?: number; tablet?: number; mobile?: number };\n\nexport interface CarouselProps {\n children?: React.ReactNode;\n visibleCards?: CarouselVisibleCardsType;\n gap?: string;\n\n showPeek?: CarouselShowPeekType;\n showFader?: boolean;\n className?: string;\n}\n\nconst parseGapPx = (gapStr?: string): number => {\n if (!gapStr) return 40;\n const val = parseFloat(gapStr);\n if (gapStr.includes('rem')) return val * 16;\n return val;\n};\n\nconst deriveBreakpoint = (width: number): 'mobile' | 'tablet' | 'desktop' => {\n if (width < 768) return 'mobile';\n if (width < 992) return 'tablet';\n return 'desktop';\n};\n\nexport const Carousel = ({\n children,\n visibleCards = {},\n gap,\n showPeek = 0,\n showFader = false,\n className,\n}: CarouselProps) => {\n const { desktop = 3, tablet = 2, mobile = 1 } = visibleCards;\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const [viewportWidth, setViewportWidth] = useState(0);\n\n useLayoutEffect(() => {\n const el = viewportRef.current;\n if (!el) return;\n const update = () => setViewportWidth(el.offsetWidth);\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const breakpoint = deriveBreakpoint(viewportWidth);\n const isMobile = breakpoint === 'mobile';\n const visibleCount = isMobile ? mobile : breakpoint === 'tablet' ? tablet : desktop;\n\n const resolvedPeek = typeof showPeek === 'object' ? (showPeek[breakpoint] ?? 0) : (showPeek ?? 0);\n\n const cards = React.Children.toArray(children);\n const totalPages = Math.max(1, cards.length - visibleCount + 1);\n\n const [currentPage, setCurrentPage] = useState(0);\n const clampedPage = Math.min(currentPage, totalPages - 1);\n\n const handlePrev = () => setCurrentPage((p) => Math.max(0, p - 1));\n const handleNext = () => setCurrentPage((p) => Math.min(totalPages - 1, p + 1));\n\n let trackStyle: React.CSSProperties;\n\n if (isMobile) {\n const peekPx = resolvedPeek && viewportWidth > 0 ? Math.round(viewportWidth * resolvedPeek) : 0;\n const gapPx = peekPx > 0 ? parseGapPx(gap) : 0;\n const slotWidth = Math.max(0, viewportWidth - 2 * peekPx - 2 * gapPx);\n trackStyle = {\n '--carousel-slot-width': `${slotWidth}px`,\n '--carousel-peek-px': `${peekPx}px`,\n '--carousel-gap-px': `${gapPx}px`,\n '--carousel-active-index': String(clampedPage),\n ...(gap ? { '--carousel-gap': gap } : {}),\n } as React.CSSProperties;\n } else {\n const effectiveGap = gap ?? '2.5rem';\n const gapPx = parseGapPx(effectiveGap);\n const cssVisibleCount = visibleCount + resolvedPeek;\n const slotPx = viewportWidth > 0 ? (viewportWidth - (cssVisibleCount - 1) * gapPx) / cssVisibleCount : 0;\n trackStyle = {\n '--carousel-slot-width': `${slotPx}px`,\n '--carousel-visible-count': String(cssVisibleCount),\n '--carousel-current-step': String(clampedPage),\n '--carousel-gap': effectiveGap,\n } as React.CSSProperties;\n }\n\n const carouselClass = [\n 'carousel',\n showFader ? 'carousel--fader' : '',\n isMobile ? 'carousel--mobile' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={carouselClass}>\n <div className=\"carousel__viewport\" ref={viewportRef}>\n <div className=\"carousel__track\" style={trackStyle}>\n {cards.map((card, i) => (\n <div key={i} className=\"carousel__item\">\n {card}\n </div>\n ))}\n </div>\n </div>\n <Pagination\n totalPages={totalPages}\n currentPage={clampedPage}\n onPrev={handlePrev}\n onNext={handleNext}\n onPageSelect={setCurrentPage}\n />\n </div>\n );\n};\n","/**\n * Advisors Plus color system\n * Primary (Royalblue), Secondary (Medium Purple), and Accent (Coral) color scheme\n */\n\nimport { ColorSystem } from '../../core/color-system';\n\nexport const advisorsPlusColorSystem: ColorSystem = {\n // ============================================================================\n // TIER 1: BASE COLORS\n // ============================================================================\n primitives: {\n // Accent (Carnation) - Primary Accent\n 'color-accent-50': '#FFECEB',\n 'color-accent-100': '#FFDFDE',\n 'color-accent-200': '#FFCDCB',\n 'color-accent-300': '#FDB0AF',\n 'color-accent-400': '#FD787C',\n 'color-accent-500': '#F6525F',\n 'color-accent-600': '#C52A3E',\n 'color-accent-700': '#A50B2B',\n 'color-accent-800': '#7F041E',\n 'color-accent-900': '#5C0112',\n 'color-accent-950': '#390209',\n\n // Medium Purple - Secondary\n 'color-secondary-50': '#F6F5FF',\n 'color-secondary-100': '#EBEAFF',\n 'color-secondary-200': '#DBD9FF',\n 'color-secondary-300': '#C3BFFE',\n 'color-secondary-400': '#A298FB',\n 'color-secondary-500': '#8978F0',\n 'color-secondary-600': '#6B59C8',\n 'color-secondary-700': '#5643A9',\n 'color-secondary-800': '#413282',\n 'color-secondary-900': '#2C215E',\n 'color-secondary-950': '#1A0D43',\n\n // Royalblue - Primary\n 'color-primary-50': '#D6E9FC',\n 'color-primary-100': '#B4D0FA',\n 'color-primary-200': '#92B7F7',\n 'color-primary-300': '#719DF5',\n 'color-primary-400': '#4F84F2',\n 'color-primary-500': '#2D6BF0',\n 'color-primary-600': '#265AD1',\n 'color-primary-700': '#1E49B3',\n 'color-primary-800': '#173794',\n 'color-primary-900': '#0F2676',\n 'color-primary-950': '#081557',\n\n // Neutral\n 'color-neutral-00': '#FFFFFF',\n 'color-neutral-50': '#FAFAFA',\n 'color-neutral-100': '#F5F5F5',\n 'color-neutral-200': '#E5E5E5',\n 'color-neutral-300': '#D4D4D4',\n 'color-neutral-400': '#A1A1A1',\n 'color-neutral-500': '#737373',\n 'color-neutral-600': '#525252',\n 'color-neutral-700': '#404040',\n 'color-neutral-800': '#262626',\n 'color-neutral-900': '#171717',\n 'color-neutral-950': '#0A0A0A',\n 'color-neutral-1000': '#000000',\n\n // Success - Green\n 'color-success-50': '#E3FFF1',\n 'color-success-100': '#C3FEE0',\n 'color-success-200': '#7AFBC2',\n 'color-success-300': '#5BE5AB',\n 'color-success-400': '#10B981',\n 'color-success-500': '#039F6D',\n 'color-success-600': '#09835A',\n 'color-success-700': '#056947',\n 'color-success-800': '#015035',\n 'color-success-900': '#043724',\n 'color-success-950': '#012114',\n\n // Warning - Amber\n 'color-warning-50': '#FFF4DB',\n 'color-warning-100': '#FFE9CB',\n 'color-warning-200': '#FED6AA',\n 'color-warning-300': '#FEB761',\n 'color-warning-400': '#F59E0B',\n 'color-warning-500': '#B87501',\n 'color-warning-600': '#986106',\n 'color-warning-700': '#7A4D03',\n 'color-warning-800': '#5E3901',\n 'color-warning-900': '#412703',\n 'color-warning-950': '#281601',\n\n // Error - Pink\n 'color-error-50': '#FFECE7',\n 'color-error-100': '#FFDFD9',\n 'color-error-200': '#FFCDC6',\n 'color-error-300': '#FDB1AA',\n 'color-error-400': '#FD7A72',\n 'color-error-500': '#EF4444',\n 'color-error-600': '#C8252B',\n 'color-error-700': '#A4111C',\n 'color-error-800': '#7F0813',\n 'color-error-900': '#5B030A',\n 'color-error-950': '#3A0003',\n\n // Info - Sky\n 'color-info-50': '#E2FEFF',\n 'color-info-100': '#D3F6FF',\n 'color-info-200': '#A4EBFE',\n 'color-info-300': '#52DBF9',\n 'color-info-400': '#06B6D4',\n 'color-info-500': '#0C96AF',\n 'color-info-600': '#0F7C90',\n 'color-info-700': '#086374',\n 'color-info-800': '#034B58',\n 'color-info-900': '#01343E',\n 'color-info-950': '#011F25',\n\n // Red - Danger\n 'color-red-500': '#EF4444',\n 'color-red-700': '#A4111C',\n\n // Emerald - Success\n 'color-emerald-500': '#039F6D',\n 'color-emerald-600': '#09835A',\n 'color-emerald-700': '#056947',\n\n // Amber - Warning\n 'color-amber-600': '#B87501',\n 'color-amber-700': '#986106',\n 'color-amber-800': '#7A4D03',\n\n // Teal - Info\n 'color-teal-500': '#0C96AF',\n 'color-teal-600': '#0F7C90',\n 'color-teal-700': '#086374',\n\n // Base\n 'color-white': '#FFFFFF',\n 'color-black': '#000000',\n 'color-transparent': 'transparent',\n\n // Link-specific\n 'color-link-focus': '#4F84F2',\n 'color-link-focus-external': '#719DF5',\n 'color-link-focus-dark': '#92B7F7',\n 'color-link-navy': '#081557',\n 'color-link-hover': '#173794',\n 'color-link-visited': '#6B59C8',\n 'color-link-visited-dark': '#EBEAFF',\n },\n\n semantic: {\n // ============================================================================\n // TIER 1: COLOR TOKENS\n // ============================================================================\n\n // Background colors\n 'tier1-theme-color-background-default-primary-default': 'var(--color-primary-950)',\n 'tier1-theme-color-background-default-primary-hover': 'var(--color-primary-900)',\n 'tier1-theme-color-background-default-primary-active': 'var(--color-primary-900)',\n 'tier1-theme-color-background-default-secondary-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-secondary-hover': 'var(--color-neutral-200)',\n 'tier1-theme-color-background-default-tertiary-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-tertiary-hover': 'var(--color-neutral-200)',\n 'tier1-theme-color-background-accent-primary-default': 'var(--color-accent-500)',\n 'tier1-theme-color-background-accent-primary-hover': 'var(--color-accent-700)',\n 'tier1-theme-color-background-accent-primary-active': 'var(--color-accent-700)',\n 'tier1-theme-color-background-default-inverse-default': 'var(--color-primary-900)',\n 'tier1-theme-color-background-utility-overlay-default': 'rgba(0, 0, 0, 0.5)',\n\n // Content (text) colors\n 'tier1-theme-color-content-title-primary-default': 'var(--color-primary-950)',\n 'tier1-theme-color-content-default-primary-default': 'var(--color-primary-950)',\n 'tier1-theme-color-content-default-secondary-default': 'var(--color-neutral-700)',\n 'tier1-theme-color-content-default-tertiary-default': 'var(--color-neutral-600)',\n 'tier1-theme-color-content-default-inverse-default': 'var(--color-white)',\n 'tier1-theme-color-content-disabled-subtle-default': 'var(--color-neutral-400)',\n 'tier1-theme-color-content-accent-primary-default': 'var(--color-accent-500)',\n 'tier1-theme-color-content-default-link-default': 'var(--color-primary-500)',\n 'tier1-theme-color-content-default-link-hover': 'var(--color-primary-950)',\n\n // Border colors\n 'tier1-theme-color-border-default-subtle-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-border-default-default-default': 'var(--color-neutral-200)',\n 'tier1-theme-color-border-default-strong-default': 'var(--color-neutral-300)',\n 'tier1-theme-color-border-focus-primary-focus': 'var(--color-primary-500)',\n 'tier1-theme-color-border-default-white-default': 'var(--color-white)',\n\n // State colors\n 'tier1-theme-color-background-utility-success-default': 'var(--color-success-50)',\n 'tier1-theme-color-content-utility-success-default': 'var(--color-success-500)',\n 'tier1-theme-color-content-utility-success-hover': 'var(--color-success-600)',\n 'tier1-theme-color-background-utility-warning-default': 'var(--color-warning-50)',\n 'tier1-theme-color-content-utility-warning-default': 'var(--color-warning-500)',\n 'tier1-theme-color-content-utility-warning-hover': 'var(--color-warning-600)',\n 'tier1-theme-color-background-utility-error-default': 'var(--color-error-50)',\n 'tier1-theme-color-content-utility-error-default': 'var(--color-error-500)',\n 'tier1-theme-color-content-utility-error-hover': 'var(--color-error-600)',\n 'tier1-theme-color-background-utility-info-default': 'var(--color-info-50)',\n 'tier1-theme-color-content-utility-info-default': 'var(--color-info-500)',\n 'tier1-theme-color-content-utility-info-hover': 'var(--color-info-600)',\n\n // Action link colors\n 'color-action-link-default': 'var(--color-primary-500)',\n 'color-action-link-hover': 'var(--color-primary-600)',\n 'color-action-link-active': 'var(--color-primary-700)',\n 'color-action-link-visited': 'var(--color-secondary-400)',\n 'color-action-link-disabled': 'var(--color-neutral-400)',\n\n // Link focus ring and text\n 'color-link-focus-ring': 'var(--color-link-focus)',\n 'color-link-focus-ring-external': 'var(--color-link-focus-external)',\n 'color-link-focus-ring-dark': 'var(--color-link-focus-dark)',\n 'color-link-text-focus': 'var(--color-link-navy)',\n 'color-link-text-visited': 'var(--color-link-visited)',\n 'color-link-text-dark': 'var(--color-white)',\n 'color-link-text-visited-dark': 'var(--color-link-visited-dark)',\n 'color-link-text-disabled-dark': 'rgba(255, 255, 255, 0.4)',\n\n // Interactive colors\n 'tier1-theme-color-background-default-interactive-default': 'var(--color-accent-500)',\n 'tier1-theme-color-background-default-interactive-hover': 'var(--color-accent-600)',\n 'tier1-theme-color-background-default-interactive-active': 'var(--color-accent-700)',\n 'tier1-theme-color-background-default-interactive-disabled': 'var(--color-neutral-300)',\n\n // ============================================================================\n // TIER 2: SEMANTIC COLOR TOKENS\n // ============================================================================\n\n // Action — primary\n primary: 'var(--color-primary-500)',\n primaryHover: 'var(--color-primary-600)',\n primaryActive: 'var(--color-primary-700)',\n primaryText: 'var(--color-white)',\n primaryDisabled: 'var(--color-neutral-100)',\n\n // Action — secondary\n secondary: 'var(--color-secondary-500)',\n secondaryHover: 'var(--color-secondary-700)',\n secondaryActive: 'var(--color-secondary-700)',\n secondaryText: 'var(--color-white)',\n\n // Action — accent (tertiary/CTA)\n accent: 'var(--color-accent-500)',\n accentHover: 'var(--color-accent-700)',\n accentActive: 'var(--color-accent-700)',\n accentText: 'var(--color-white)',\n\n // Action — danger\n danger: 'var(--color-error-500)',\n dangerHover: 'var(--color-error-700)',\n dangerActive: 'var(--color-error-700)',\n\n // Action — tertiary/ghost\n tertiary: 'var(--color-neutral-200)',\n tertiaryHover: 'var(--color-neutral-300)',\n tertiaryActive: 'var(--color-neutral-400)',\n tertiaryText: 'var(--color-primary-950)',\n\n // Text\n textPrimary: 'var(--color-neutral-900)',\n textSecondary: 'var(--color-neutral-700)',\n textTertiary: 'var(--color-neutral-500)',\n textInverse: 'var(--color-white)',\n textDisabled: 'var(--color-neutral-400)',\n textOnBrand: 'var(--color-neutral-50)',\n textNav: 'var(--color-primary-950)',\n textSubheading: 'var(--color-primary-950)',\n\n // Action link\n textLink: 'var(--color-primary-500)',\n textLinkHover: 'var(--color-primary-600)',\n textLinkActive: 'var(--color-primary-700)',\n textLinkVisited: 'var(--color-secondary-600)',\n linkFocusRing: 'var(--color-primary-400)',\n linkFocusText: 'var(--color-primary-950)',\n\n // Backgrounds\n bgPrimary: 'var(--color-primary-950)',\n bgSecondary: 'var(--color-neutral-100)',\n bgTertiary: 'var(--color-neutral-100)',\n bgInverse: 'var(--color-primary-900)',\n bgOverlay: 'rgba(0, 0, 0, 0.5)',\n\n // Surface & border\n sectionBg: 'var(--color-neutral-00)',\n surfaceSubtle: 'var(--color-neutral-100)',\n borderDivider: 'var(--color-neutral-200)',\n borderDefault: 'var(--color-neutral-200)',\n borderSubtle: 'var(--color-neutral-100)',\n borderStrong: 'var(--color-neutral-300)',\n borderFocus: 'var(--color-primary-500)',\n borderWhite: 'var(--color-white)',\n\n // Feedback — success\n successMain: 'var(--color-success-500)',\n successMainHover: 'var(--color-success-600)',\n successMainActive: 'var(--color-success-700)',\n successText: 'var(--color-success-700)',\n successTextOnTint: 'var(--color-success-700)',\n stateSuccess: 'var(--color-success-500)',\n stateSuccessHover: 'var(--color-success-600)',\n stateSuccessBg: 'var(--color-success-50)',\n\n // Feedback — warning\n warningMain: 'var(--color-warning-500)',\n warningMainHover: 'var(--color-warning-600)',\n warningMainActive: 'var(--color-warning-700)',\n warningText: 'var(--color-warning-700)',\n stateWarning: 'var(--color-warning-500)',\n stateWarningHover: 'var(--color-warning-600)',\n stateWarningBg: 'var(--color-warning-50)',\n\n // Feedback — error/danger state\n stateError: 'var(--color-error-500)',\n stateErrorHover: 'var(--color-error-600)',\n stateErrorBg: 'var(--color-error-50)',\n\n // Feedback — info\n infoMain: 'var(--color-info-500)',\n infoMainHover: 'var(--color-info-600)',\n infoMainActive: 'var(--color-info-700)',\n infoText: 'var(--color-info-700)',\n stateInfo: 'var(--color-info-500)',\n stateInfoHover: 'var(--color-info-600)',\n stateInfoBg: 'var(--color-info-50)',\n\n // Action — breadcrumb\n breadcrumbDefault: 'var(--color-primary-950)',\n breadcrumbHover: 'var(--color-primary-800)',\n breadcrumbActive: 'var(--color-primary-700)',\n breadcrumbFocusRing: 'var(--color-primary-400)',\n breadcrumbCurrent: 'var(--color-primary-950)',\n\n // Dial\n dialCardGradientStart: '#D6E9FC7F',\n dialCardGradientEnd: 'var(--color-neutral-00)',\n dialCardOverlay: '#00000000',\n dialCardStroke: 'var(--color-neutral-300)',\n dialRingTrack: 'var(--color-neutral-300)',\n dialRingProgress: 'var(--color-primary-700)',\n\n // Interactive (CTA / accent-driven)\n interactivePrimary: 'var(--color-accent-500)',\n interactivePrimaryHover: 'var(--color-accent-600)',\n interactivePrimaryActive: 'var(--color-accent-700)',\n interactiveSecondary: 'var(--color-neutral-200)',\n interactiveSecondaryHover: 'var(--color-neutral-300)',\n interactiveSecondaryActive: 'var(--color-neutral-400)',\n interactiveDisabled: 'var(--color-neutral-300)',\n\n // ============================================================================\n // TIER 3: COMPONENT COLOR TOKENS\n // ============================================================================\n\n // Button component tokens\n // Primary - Royal Blue\n 'tier3-theme-button-general-background-default': 'var(--color-primary-500)',\n 'tier3-theme-button-general-background-hover': 'var(--color-primary-600)',\n 'tier3-theme-button-general-background-active': 'var(--color-primary-700)',\n 'tier3-theme-button-general-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-general-content-default': 'var(--color-white)',\n 'tier3-theme-button-general-content-hover': 'var(--color-white)',\n 'tier3-theme-button-general-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-general-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-general-border-hover': 'var(--color-primary-600)',\n 'tier3-theme-button-general-border-disabled': 'var(--color-neutral-200)',\n\n 'tier3-theme-button-cta-background-default': 'var(--tier1-theme-color-background-accent-primary-default)',\n 'tier3-theme-button-cta-background-hover': 'var(--tier1-theme-color-background-accent-primary-hover)',\n 'tier3-theme-button-cta-background-active': 'var(--tier1-theme-color-background-accent-primary-active)',\n 'tier3-theme-button-cta-content-default': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-cta-content-hover': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-cta-border-default': 'var(--tier1-theme-color-border-default-white-default)',\n 'tier3-theme-button-cta-border-hover': 'var(--color-secondary-600)',\n\n // Secondary - Medium Purple\n 'tier3-theme-button-secondary-background-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-background-hover': 'var(--color-secondary-600)',\n 'tier3-theme-button-secondary-background-active': 'var(--color-secondary-700)',\n 'tier3-theme-button-secondary-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-secondary-content-default': 'var(--color-white)',\n 'tier3-theme-button-secondary-content-hover': 'var(--color-white)',\n 'tier3-theme-button-secondary-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-secondary-border-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-border-hover': 'var(--color-secondary-600)',\n 'tier3-theme-button-secondary-border-disabled': 'var(--color-neutral-200)',\n\n // Primary Ghost\n 'tier3-theme-button-ghost-background-default': 'transparent',\n 'tier3-theme-button-ghost-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-ghost-background-active': 'var(--color-primary-700)',\n 'tier3-theme-button-ghost-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-ghost-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-ghost-border-hover': 'var(--color-primary-500)',\n\n // Secondary Ghost\n 'tier3-theme-button-secondary-ghost-background-default': 'transparent',\n 'tier3-theme-button-secondary-ghost-background-hover': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-ghost-background-active': 'var(--color-secondary-700)',\n 'tier3-theme-button-secondary-ghost-content-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-secondary-ghost-border-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-ghost-border-hover': 'var(--color-secondary-400)',\n\n // Danger Ghost\n 'tier3-theme-button-danger-ghost-background-default': 'transparent',\n 'tier3-theme-button-danger-ghost-background-hover': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-ghost-background-active': 'var(--color-accent-700)',\n 'tier3-theme-button-danger-ghost-content-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-danger-ghost-border-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-ghost-border-hover': 'var(--color-accent-500)',\n\n // Success Ghost\n 'tier3-theme-button-success-ghost-background-default': 'transparent',\n 'tier3-theme-button-success-ghost-background-hover': 'var(--color-success-500)',\n 'tier3-theme-button-success-ghost-background-active': 'var(--color-success-700)',\n 'tier3-theme-button-success-ghost-content-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-success-ghost-border-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-ghost-border-hover': 'var(--color-success-500)',\n\n // Warning Ghost\n 'tier3-theme-button-warning-ghost-background-default': 'transparent',\n 'tier3-theme-button-warning-ghost-background-hover': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-ghost-background-active': 'var(--color-warning-700)',\n 'tier3-theme-button-warning-ghost-content-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-ghost-content-hover': 'var(--color-neutral-900)',\n 'tier3-theme-button-warning-ghost-border-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-ghost-border-hover': 'var(--color-warning-500)',\n\n // Info Ghost\n 'tier3-theme-button-info-ghost-background-default': 'transparent',\n 'tier3-theme-button-info-ghost-background-hover': 'var(--color-info-500)',\n 'tier3-theme-button-info-ghost-background-active': 'var(--color-info-700)',\n 'tier3-theme-button-info-ghost-content-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-info-ghost-border-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-ghost-border-hover': 'var(--color-info-500)',\n\n // Social Media\n 'tier3-theme-button-twitter-background-default': 'transparent',\n 'tier3-theme-button-twitter-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-background-active': 'var(--color-primary-950)',\n 'tier3-theme-button-twitter-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-content-hover': 'var(--color-white)',\n 'tier3-theme-button-twitter-content-active': 'var(--color-white)',\n 'tier3-theme-button-twitter-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-border-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-border-active': 'var(--color-primary-950)',\n\n 'tier3-theme-button-linkedin-background-default': 'transparent',\n 'tier3-theme-button-linkedin-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-background-active': 'var(--color-primary-950)',\n 'tier3-theme-button-linkedin-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-content-hover': 'var(--color-white)',\n 'tier3-theme-button-linkedin-content-active': 'var(--color-white)',\n 'tier3-theme-button-linkedin-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-border-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-border-active': 'var(--color-primary-950)',\n\n 'tier3-theme-button-facebook-background-default': 'transparent',\n 'tier3-theme-button-facebook-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-background-active': 'var(--color-primary-950)',\n 'tier3-theme-button-facebook-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-content-hover': 'var(--color-white)',\n 'tier3-theme-button-facebook-content-active': 'var(--color-white)',\n 'tier3-theme-button-facebook-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-border-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-border-active': 'var(--color-primary-950)',\n\n // Danger - Accent (Coral)\n 'tier3-theme-button-danger-background-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-background-hover': 'var(--color-accent-600)',\n 'tier3-theme-button-danger-background-active': 'var(--color-accent-700)',\n 'tier3-theme-button-danger-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-danger-content-default': 'var(--color-white)',\n 'tier3-theme-button-danger-content-hover': 'var(--color-white)',\n 'tier3-theme-button-danger-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-danger-border-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-border-hover': 'var(--color-accent-600)',\n 'tier3-theme-button-danger-border-disabled': 'var(--color-neutral-200)',\n\n // Success — Green\n 'tier3-theme-button-success-background-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-background-hover': 'var(--color-success-600)',\n 'tier3-theme-button-success-background-active': 'var(--color-success-700)',\n 'tier3-theme-button-success-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-success-content-default': 'var(--color-white)',\n 'tier3-theme-button-success-content-hover': 'var(--color-white)',\n 'tier3-theme-button-success-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-success-border-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-border-hover': 'var(--color-success-600)',\n 'tier3-theme-button-success-border-disabled': 'var(--color-neutral-200)',\n\n // Warning — Amber\n 'tier3-theme-button-warning-background-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-background-hover': 'var(--color-warning-600)',\n 'tier3-theme-button-warning-background-active': 'var(--color-warning-700)',\n 'tier3-theme-button-warning-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-warning-content-default': 'var(--color-neutral-900)',\n 'tier3-theme-button-warning-content-hover': 'var(--color-neutral-900)',\n 'tier3-theme-button-warning-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-warning-border-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-border-hover': 'var(--color-warning-600)',\n 'tier3-theme-button-warning-border-disabled': 'var(--color-neutral-200)',\n\n // Info — Sky blue\n 'tier3-theme-button-info-background-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-background-hover': 'var(--color-info-600)',\n 'tier3-theme-button-info-background-active': 'var(--color-info-700)',\n 'tier3-theme-button-info-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-info-content-default': 'var(--color-white)',\n 'tier3-theme-button-info-content-hover': 'var(--color-white)',\n 'tier3-theme-button-info-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-info-border-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-border-hover': 'var(--color-info-600)',\n 'tier3-theme-button-info-border-disabled': 'var(--color-neutral-200)',\n },\n};\n","/**\n * Advisors Plus theme configuration\n * Midnight blue and violet color scheme for financial advisory brand\n */\n\nimport { ThemeConfig } from '../core/types';\nimport { defaultTheme } from './default';\nimport { advisorsPlusColorSystem } from './color-systems/advisors-plus-colors';\nimport testimonialBg from '@assets/testimonial-standalone-bg.png';\n\nexport const advisorsPlusTheme: ThemeConfig = {\n ...defaultTheme,\n name: 'advisors-plus',\n fontImportUrl: [\n 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap',\n 'https://fonts.googleapis.com/css2?family=Source+Serif+4:opsz,wght@8..60,300;8..60,400;8..60,600;8..60,700;8..60,900&display=swap',\n ],\n\n // Three-tier color system\n colors: {\n primitives: advisorsPlusColorSystem.primitives,\n semantic: advisorsPlusColorSystem.semantic,\n },\n\n colorPalettes: [\n { name: 'Primary', bg: 'primary', text: 'primaryText' },\n { name: 'Secondary', bg: 'secondary', text: 'secondaryText' },\n { name: 'Accent', bg: 'accent', text: 'accentText' },\n { name: 'Tertiary', bg: 'tertiary', text: 'tertiaryText' },\n ],\n\n typography: {\n ...defaultTheme.typography,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontFamilyHeading: \"'Source Serif 4', Georgia, serif\",\n variants: {\n title: {\n fontSize: '3.125rem',\n fontWeight: '700',\n lineHeight: '1.2',\n mobile: { fontSize: '2rem' },\n },\n sectionTitle: {\n fontSize: '2.3125rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '0',\n mobile: { fontSize: '1.75rem' },\n },\n iconsData: {\n fontSize: '1.75rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n subTitle: {\n fontSize: '1.3125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n pageTitle: {\n fontSize: '1.3125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n buttonText: {\n fontSize: '1rem',\n fontWeight: '700',\n lineHeight: '1.5625',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n textLink: {\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.5625',\n textDecoration: 'underline',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodyLrg: {\n fontSize: '1.3125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodyLrgBold: {\n fontSize: '1.3125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n body: {\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodyBold: {\n fontSize: '1rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodySmall: {\n fontSize: '0.875rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n iconDataPct: {\n fontSize: '1.375rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '-0.06em',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n iconDataNumber: {\n fontSize: '2.75rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '-0.06em',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n },\n },\n\n components: {\n ...defaultTheme.components,\n cta: {\n ...defaultTheme.components.cta,\n },\n },\n\n // Inherit component tokens from default theme\n componentTokens: {\n ...defaultTheme.componentTokens,\n\n icon: {\n ...defaultTheme.componentTokens?.icon,\n sizes: {\n xs: { size: '16px' },\n sm: { size: '21px' },\n md: { size: '28px' },\n lg: { size: '37px' },\n xl: { size: '50px' },\n '2xl': { size: '67px' },\n '3xl': { size: '89px' },\n },\n },\n\n // Advisors Plus button overrides — pill shape, spacing, all variants\n button: {\n ...defaultTheme.componentTokens?.button,\n borderRadius: 'var(--border-radius-full, 9999px)',\n padding: 'var(--space-5, 12px) var(--space-8, 24px)',\n gap: 'var(--space-3, 4px)',\n fontFamily: 'var(--body-b2-font_family, Inter)',\n fontSize: 'var(--body-b2-font_size, 16px)',\n fontStyle: 'normal',\n fontWeight: 'var(--body-b2-font_weight, 400)',\n lineHeight: 'normal',\n letterSpacing: 'var(--body-b2-letter_spacing, 0)',\n shadow: 'none',\n focusOutline: '2px solid var(--color-primary-500)',\n focusOutlinePrimary: '2px solid var(--color-primary-500)',\n focusOutlinePrimaryGhost: '2px solid var(--color-primary-500)',\n focusOutlineSecondary: '2px solid var(--color-secondary-400)',\n focusOutlineSecondaryGhost: '2px solid var(--color-secondary-400)',\n focusOutlineDanger: '2px solid var(--color-red-500)',\n focusOutlineDangerGhost: '2px solid var(--color-red-500)',\n focusOutlineSuccess: '2px solid var(--color-emerald-500)',\n focusOutlineSuccessGhost: '2px solid var(--color-emerald-500)',\n focusOutlineWarning: '2px solid var(--color-amber-600)',\n focusOutlineWarningGhost: '2px solid var(--color-amber-600)',\n focusOutlineInfo: '2px solid var(--color-teal-500)',\n focusOutlineInfoGhost: '2px solid var(--color-teal-500)',\n focusOutlineOffset: '4px',\n transition: 'background-color 225ms ease-in-out, color 225ms ease-in-out, border-color 225ms ease-in-out',\n sizes: {\n md: {\n fontSize: '16px',\n lineHeight: 'normal',\n padding: '12px 24px',\n faWidth: '20px',\n },\n lg: {\n fontSize: '21px',\n lineHeight: 'normal',\n padding: '16px 24px',\n faWidth: '24px',\n },\n },\n variants: {\n primary: {\n bg: 'var(--button-primary-bg, var(--color-primary-500))',\n bgHover: 'var(--button-primary-bg-hover, var(--color-primary-600))',\n bgActive: 'var(--button-primary-bg-active, var(--color-primary-700))',\n bgDisabled: 'var(--button-primary-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-primary-text, var(--color-neutral-50))',\n textHover: 'var(--button-primary-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-primary-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-primary-border, var(--color-primary-500))',\n borderHover: 'var(--button-primary-border-hover, var(--color-primary-600))',\n borderDisabled: 'var(--button-primary-border-disabled, var(--color-neutral-100))',\n },\n primaryGhost: {\n bg: 'var(--button-primary-ghost-bg, transparent)',\n bgHover: 'var(--button-primary-ghost-bg-hover, var(--color-primary-600))',\n bgActive: 'var(--button-primary-ghost-bg-active, var(--color-primary-700))',\n bgDisabled: 'var(--button-primary-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-primary-ghost-text, var(--color-primary-500))',\n textHover: 'var(--button-primary-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-primary-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-primary-ghost-border, var(--color-primary-500))',\n borderHover: 'var(--button-primary-ghost-border-hover, var(--color-primary-600))',\n borderDisabled: 'var(--button-primary-ghost-border-disabled, var(--color-neutral-100))',\n },\n secondary: {\n bg: 'var(--button-secondary-bg, var(--color-secondary-400))',\n bgHover: 'var(--button-secondary-bg-hover, var(--color-secondary-700))',\n bgActive: 'var(--button-secondary-bg-active, var(--color-secondary-700))',\n bgDisabled: 'var(--button-secondary-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-secondary-text, var(--color-neutral-50))',\n textHover: 'var(--button-secondary-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-secondary-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-secondary-border, var(--color-secondary-400))',\n borderHover: 'var(--button-secondary-border-hover, var(--color-secondary-700))',\n borderDisabled: 'var(--button-secondary-border-disabled, var(--color-neutral-100))',\n },\n secondaryGhost: {\n bg: 'var(--button-secondary-ghost-bg, transparent)',\n bgHover: 'var(--button-secondary-ghost-bg-hover, var(--color-secondary-700))',\n bgActive: 'var(--button-secondary-ghost-bg-active, var(--color-secondary-700))',\n bgDisabled: 'var(--button-secondary-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-secondary-ghost-text, var(--color-secondary-400))',\n textHover: 'var(--button-secondary-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-secondary-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-secondary-ghost-border, var(--color-secondary-400))',\n borderHover: 'var(--button-secondary-ghost-border-hover, var(--color-secondary-700))',\n borderDisabled: 'var(--button-secondary-ghost-border-disabled, var(--color-neutral-100))',\n },\n danger: {\n bg: 'var(--button-danger-bg, var(--color-red-500))',\n bgHover: 'var(--button-danger-bg-hover, var(--color-red-700))',\n bgActive: 'var(--button-danger-bg-active, var(--color-red-700))',\n bgDisabled: 'var(--button-danger-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-danger-text, var(--color-neutral-50))',\n textHover: 'var(--button-danger-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-danger-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-danger-border, var(--color-red-500))',\n borderHover: 'var(--button-danger-border-hover, var(--color-red-700))',\n borderDisabled: 'var(--button-danger-border-disabled, var(--color-neutral-100))',\n },\n dangerGhost: {\n bg: 'var(--button-danger-ghost-bg, transparent)',\n bgHover: 'var(--button-danger-ghost-bg-hover, var(--color-red-700))',\n bgActive: 'var(--button-danger-ghost-bg-active, var(--color-red-700))',\n bgDisabled: 'var(--button-danger-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-danger-ghost-text, var(--color-red-500))',\n textHover: 'var(--button-danger-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-danger-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-danger-ghost-border, var(--color-red-500))',\n borderHover: 'var(--button-danger-ghost-border-hover, var(--color-red-700))',\n borderDisabled: 'var(--button-danger-ghost-border-disabled, var(--color-neutral-100))',\n },\n success: {\n bg: 'var(--button-success-bg, var(--color-emerald-500))',\n bgHover: 'var(--button-success-bg-hover, var(--color-emerald-600))',\n bgActive: 'var(--button-success-bg-active, var(--color-emerald-700))',\n bgDisabled: 'var(--button-success-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-success-text, var(--color-neutral-50))',\n textHover: 'var(--button-success-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-success-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-success-border, var(--color-emerald-500))',\n borderHover: 'var(--button-success-border-hover, var(--color-emerald-600))',\n borderDisabled: 'var(--button-success-border-disabled, var(--color-neutral-100))',\n },\n successGhost: {\n bg: 'var(--button-success-ghost-bg, transparent)',\n bgHover: 'var(--button-success-ghost-bg-hover, var(--color-emerald-600))',\n bgActive: 'var(--button-success-ghost-bg-active, var(--color-emerald-700))',\n bgDisabled: 'var(--button-success-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-success-ghost-text, var(--color-emerald-500))',\n textHover: 'var(--button-success-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-success-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-success-ghost-border, var(--color-emerald-500))',\n borderHover: 'var(--button-success-ghost-border-hover, var(--color-emerald-600))',\n borderDisabled: 'var(--button-success-ghost-border-disabled, var(--color-neutral-100))',\n },\n warning: {\n bg: 'var(--button-warning-bg, var(--color-amber-600))',\n bgHover: 'var(--button-warning-bg-hover, var(--color-amber-700))',\n bgActive: 'var(--button-warning-bg-active, var(--color-amber-800))',\n bgDisabled: 'var(--button-warning-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-warning-text, var(--color-neutral-50))',\n textHover: 'var(--button-warning-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-warning-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-warning-border, var(--color-amber-600))',\n borderHover: 'var(--button-warning-border-hover, var(--color-amber-700))',\n borderDisabled: 'var(--button-warning-border-disabled, var(--color-neutral-100))',\n },\n warningGhost: {\n bg: 'var(--button-warning-ghost-bg, transparent)',\n bgHover: 'var(--button-warning-ghost-bg-hover, var(--color-amber-700))',\n bgActive: 'var(--button-warning-ghost-bg-active, var(--color-amber-800))',\n bgDisabled: 'var(--button-warning-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-warning-ghost-text, var(--color-amber-600))',\n textHover: 'var(--button-warning-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-warning-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-warning-ghost-border, var(--color-amber-600))',\n borderHover: 'var(--button-warning-ghost-border-hover, var(--color-amber-700))',\n borderDisabled: 'var(--button-warning-ghost-border-disabled, var(--color-neutral-100))',\n },\n info: {\n bg: 'var(--button-info-bg, var(--color-teal-500))',\n bgHover: 'var(--button-info-bg-hover, var(--color-teal-600))',\n bgActive: 'var(--button-info-bg-active, var(--color-teal-700))',\n bgDisabled: 'var(--button-info-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-info-text, var(--color-neutral-50))',\n textHover: 'var(--button-info-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-info-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-info-border, var(--color-teal-500))',\n borderHover: 'var(--button-info-border-hover, var(--color-teal-600))',\n borderDisabled: 'var(--button-info-border-disabled, var(--color-neutral-100))',\n },\n infoGhost: {\n bg: 'var(--button-info-ghost-bg, transparent)',\n bgHover: 'var(--button-info-ghost-bg-hover, var(--color-teal-600))',\n bgActive: 'var(--button-info-ghost-bg-active, var(--color-teal-700))',\n bgDisabled: 'var(--button-info-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-info-ghost-text, var(--color-teal-500))',\n textHover: 'var(--button-info-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-info-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-info-ghost-border, var(--color-teal-500))',\n borderHover: 'var(--button-info-ghost-border-hover, var(--color-teal-600))',\n borderDisabled: 'var(--button-info-ghost-border-disabled, var(--color-neutral-100))',\n },\n },\n },\n\n textLink: {\n ...defaultTheme.componentTokens?.textLink,\n color: 'var(--color-primary-500)',\n colorHover: 'var(--color-primary-600)',\n colorActive: 'var(--color-primary-700)',\n colorFocus: 'var(--color-link-text-focus)',\n colorVisited: 'var(--color-link-text-visited)',\n fontSize: '16px',\n fontWeight: '400',\n textDecoration: 'none',\n textDecorationHover: 'underline',\n textDecorationFocus: 'none',\n focusOutline: '3px solid var(--color-link-focus-ring)',\n focusOutlineOffset: '3px',\n dark: {\n color: 'var(--color-link-text-dark)',\n colorHover: 'var(--color-link-text-dark)',\n colorActive: 'var(--color-link-text-dark)',\n colorFocus: 'var(--color-link-text-dark)',\n colorVisited: 'var(--color-link-text-visited-dark)',\n textDecoration: 'underline',\n textDecorationHover: 'none',\n focusOutline: '3px solid var(--color-link-focus-ring-dark)',\n },\n variants: {\n external: {\n fontSize: '14px',\n fontWeight: '700',\n },\n },\n },\n\n footer: {\n bg: 'var(--color-primary-800)',\n text: 'var(--color-white)',\n borderTop: '1px solid rgba(255, 255, 255, 0.15)',\n paddingVertical: '48px',\n paddingHorizontal: '16px',\n gap: '30px',\n columnGap: '10px',\n socialGap: '15px',\n socialIconSize: '50px',\n socialIconFontSize: '30px',\n socialIconBorder: '1px solid var(--footer-text)',\n socialIconBorderRadius: '10px',\n socialIconPadding: '10px',\n fontFamily: \"var(--tier1-theme-typography-font-family, 'Inter', sans-serif)\",\n linkFontSize: 'var(--body-b1-font_size, 21px)',\n linkFontWeight: 'var(--body-b1-font_weight, 400)',\n linkLineHeight: '1.333',\n linkHoverOpacity: '0.75',\n copyrightFontSize: 'var(--body-b2-font_size, 16px)',\n copyrightFontWeight: 'var(--body-b2-font_weight, 400)',\n copyrightLineHeight: 'var(--body-b2-line_height, 1.6)',\n },\n\n breadcrumb: {\n fontFamily: \"var(--tier1-theme-typography-font-family, 'Inter', sans-serif)\",\n fontSize: '0.75rem',\n fontWeight: '700',\n letterSpacing: '0.02rem',\n gap: '0.25rem',\n linkColor: 'var(--color-link-navy)',\n linkHoverColor: 'var(--color-link-hover)',\n linkActiveColor: 'var(--color-primary-700)',\n linkActiveFontWeight: '700',\n textDecorationHover: 'underline',\n textDecorationActive: 'underline',\n textDecorationFocus: 'none',\n focusColor: 'var(--color-link-focus)',\n lastItemColor: 'var(--color-link-navy)',\n lastItemFontWeight: '700',\n separatorColor: 'var(--color-link-navy)',\n dark: {\n linkColor: 'var(--color-white)',\n linkHoverColor: 'var(--color-white)',\n linkActiveColor: 'var(--color-link-focus-dark)',\n focusColor: 'var(--color-link-focus-dark)',\n lastItemColor: 'var(--color-white)',\n separatorColor: 'var(--color-white)',\n },\n },\n heading: {\n ...defaultTheme.componentTokens?.heading,\n margin: '0',\n padding: '0',\n color: 'var(--color-text-primary)',\n fontFamily: \"'Source Serif 4', Georgia, serif\",\n\n h1FontSize: 'var(--tier1-theme-typography-font-size-2xl, 4.5rem)',\n h1FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h1LineHeight: '1.2',\n h1LetterSpacing: 'normal',\n\n h2FontSize: 'var(--tier1-theme-typography-font-size-xl, 4.1875rem)',\n h2FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h2LineHeight: '1.2',\n h2LetterSpacing: 'normal',\n\n h3FontSize: 'var(--tier1-theme-typography-font-size-lg, 3.125rem)',\n h3FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h3LineHeight: '1.2',\n h3LetterSpacing: 'normal',\n\n h4FontSize: 'var(--tier1-theme-typography-font-size-md, 2.3125rem)',\n h4FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 600)',\n h4LineHeight: '1.2',\n\n h5FontSize: 'var(--tier1-theme-typography-font-size-sm, 1.75rem)',\n h5FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 600)',\n h5LineHeight: '1.2',\n\n h6FontSize: 'var(--tier1-theme-typography-font-size-xs, 1.3125rem)',\n h6FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 600)',\n h6LineHeight: '1.2',\n\n titleFontSize: '3.125rem',\n titleFontWeight: '700',\n titleLineHeight: '1.2',\n titleColor: 'var(--color-text-primary)',\n\n sectionTitleFontSize: '2.3125rem',\n sectionTitleFontWeight: '700',\n sectionTitleLineHeight: '1.2',\n sectionTitleLetterSpacing: '0',\n\n iconsDataFontSize: '1.75rem',\n iconsDataFontWeight: '700',\n iconsDataLineHeight: '1.6',\n iconsDataFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n iconDataNumberFontSize: '2.75rem',\n iconDataNumberFontWeight: '700',\n iconDataNumberLineHeight: '1.2',\n iconDataNumberLetterSpacing: '-0.06em',\n iconDataNumberFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n iconDataPctFontSize: '1.375rem',\n iconDataPctFontWeight: '700',\n iconDataPctLineHeight: '1.2',\n iconDataPctLetterSpacing: '-0.06em',\n iconDataPctFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n subTitleFontSize: '1.3125rem',\n subTitleFontWeight: '400',\n subTitleLineHeight: '1.6',\n subTitleFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n pageTitleFontSize: '1.3125rem',\n pageTitleFontWeight: '700',\n pageTitleLineHeight: '1.6',\n pageTitleLetterSpacing: '0',\n pageTitleTextTransform: 'none',\n pageTitleColor: 'var(--color-text-primary)',\n pageTitleFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n buttonTextFontSize: '1rem',\n buttonTextFontWeight: '700',\n buttonTextLineHeight: '1.5625',\n buttonTextFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n textLinkFontSize: '1rem',\n textLinkFontWeight: '400',\n textLinkLineHeight: '1.5625',\n textLinkTextDecoration: 'underline',\n textLinkFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n bodyLrgFontSize: '1.3125rem',\n bodyLrgFontWeight: '400',\n bodyLrgLineHeight: '1.6',\n bodyLrgFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n bodyLrgBoldFontSize: '1.3125rem',\n bodyLrgBoldFontWeight: '700',\n bodyLrgBoldLineHeight: '1.6',\n bodyLrgBoldFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n bodyFontSize: '1rem',\n bodyFontWeight: '400',\n bodyFontFamily: 'var(--tier1-theme-typography-font-family)',\n bodyLineHeight: '1.6',\n\n bodyBoldFontSize: '1rem',\n bodyBoldFontWeight: '700',\n bodyBoldFontFamily: 'var(--tier1-theme-typography-font-family)',\n bodyBoldLineHeight: '1.6',\n\n bodySmallFontSize: '0.875rem',\n bodySmallFontWeight: '400',\n bodySmallFontFamily: 'var(--tier1-theme-typography-font-family)',\n bodySmallLineHeight: '1.6',\n\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n },\n },\n\n advisorsTeamCard: {\n width: '19.875rem',\n height: '20.5rem',\n borderRadius: '1.25rem 1.25rem 0 0',\n overlayBg: 'rgba(8, 21, 87, 0.7)',\n overlayBlur: 'blur(15px)',\n overlayHeight: '4.5rem',\n overlayPadding: '1.25rem',\n nameColor: 'var(--color-white)',\n companyColor: 'var(--color-neutral-300)',\n textGap: '-0.3125rem',\n hoverTranslateY: '-0.625rem',\n shadowHover: '0 8px 24px rgba(8, 21, 87, 0.25)',\n focusRingColor: 'var(--color-primary-300)',\n focusRingWidth: '0.625rem',\n },\n\n // Override paragraph tokens for Advisors Plus specific sizes\n paragraph: {\n // Size variants for Advisors Plus (lg, md, sm)\n sizes: {\n lg: {\n fontSize: '21px',\n lineHeight: '1.5',\n },\n md: {\n fontSize: '16px',\n lineHeight: '1.5',\n },\n sm: {\n fontSize: '14px',\n lineHeight: '1.5',\n },\n },\n },\n testimonialCard: {\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n standaloneBg: 'var(--color-primary-950)',\n standaloneBackgroundImage: `url(${testimonialBg})`,\n standaloneMaxHeight: '35rem',\n standaloneCardBg: 'rgba(255, 255, 255, 0.1)',\n standaloneCardBorder: '2px solid rgba(255, 255, 255, 0.25)',\n standaloneCardBorderRadius: '1.25rem',\n standaloneCardBackdropFilter: 'blur(5px)',\n standaloneTextColor: 'var(--color-white)',\n standaloneQuoteMarkColor: 'var(--color-accent-500)',\n standaloneImageBorderRadius: '0 0 1.25rem 1.25rem',\n standaloneImageBorder: '1px solid rgba(255, 255, 255, 0.25)',\n quoteFont: \"var(--tier1-theme-typography-font-family-heading, 'Source Serif 4', Georgia, serif)\",\n quoteFontSize: '1.75rem',\n quoteLineHeight: '2.125rem',\n quoteFontWeight: '400',\n attributionFontSize: '1.3125rem',\n attributionLineHeight: '160%',\n attributionFontWeight: '700',\n sliderBg: 'var(--color-neutral-50)',\n sliderBorder: '1px solid var(--color-neutral-300)',\n sliderBorderRadius: '1.25rem',\n sliderPadding: '2rem',\n sliderGap: '2.5rem',\n sliderWidth: '23rem',\n sliderHeight: '22.5rem',\n sliderSeparatorColor: '#C6C6C6',\n sliderQuoteMarkColor: 'var(--color-primary-600)',\n sliderQuoteTextColor: 'var(--color-neutral-900)',\n sliderQuoteFontSize: '0.9375rem',\n sliderQuoteLineHeight: '1.625rem',\n sliderAvatarBg: 'var(--color-primary-950)',\n sliderAvatarSize: '3rem',\n sliderAvatarBorderRadius: '1.5rem',\n sliderAvatarTextColor: 'var(--color-white)',\n sliderAvatarFontSize: '1rem',\n sliderAuthorNameColor: 'var(--color-primary-950)',\n sliderAuthorNameSize: '0.9375rem',\n sliderAuthorRoleColor: 'var(--color-neutral-500)',\n sliderAuthorRoleSize: '0.8125rem',\n },\n\n percentDialCard: {\n bg: 'linear-gradient(0deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 100%), linear-gradient(180deg, rgba(214, 233, 252, 0.5) 0%, var(--color-neutral-00, #fff) 49.5%)',\n stroke: 'var(--color-neutral-300)',\n label: 'var(--color-action-link-default, var(--color-primary-500))',\n text: 'var(--color-primary-950)',\n },\n\n percentDialCards: {\n text: 'var(--color-primary-950)',\n subheading: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-00)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n headingFontSize: '1.75rem',\n headingFontWeight: '700',\n headingLineHeight: '1.6',\n },\n\n pagination: {\n dotColor: 'var(--color-primary-950)',\n arrowColor: 'var(--color-primary-950)',\n arrowDisabledColor: 'var(--color-neutral-400)',\n },\n\n carousel: {\n gap: '2.5rem',\n transitionDuration: '300ms',\n transitionEasing: 'ease-out',\n faderColor: 'var(--color-white)',\n },\n },\n};\n","/**\n * Primax color system\n * Brilliant Blue, Neon Mint, and Electric Berry color scheme\n */\n\nimport { ColorSystem } from '../../core/color-system';\n\nexport const primaxColorSystem: ColorSystem = {\n // ============================================================================\n // TIER 1: BASE COLORS\n // ============================================================================\n primitives: {\n // Primary (Blue scale)\n 'color-primary-50': '#E0FAFF',\n 'color-primary-100': '#D1F0FF',\n 'color-primary-200': '#BEDFFF',\n 'color-primary-300': '#A6C8FF',\n 'color-primary-400': '#78A7FB',\n 'color-primary-500': '#3B7EFD',\n 'color-primary-600': '#0061FF', // Key color\n 'color-primary-700': '#1944CE',\n 'color-primary-800': '#203399',\n 'color-primary-900': '#1B2369',\n 'color-primary-950': '#0D0942', // Key color (Navy)\n\n // Secondary (Mint/Teal scale)\n 'color-secondary-50': '#DBFFF6',\n 'color-secondary-100': '#BEFFEB',\n 'color-secondary-200': '#00FFD2', // Key color\n 'color-secondary-300': '#2EE6BF',\n 'color-secondary-400': '#06C3A0',\n 'color-secondary-500': '#1A9C80',\n 'color-secondary-600': '#05816A',\n 'color-secondary-700': '#026754',\n 'color-secondary-800': '#084E3F',\n 'color-secondary-900': '#03372B',\n 'color-secondary-950': '#012119',\n\n // Accent (Pink/Magenta scale)\n 'color-accent-50': '#FFE7EE',\n 'color-accent-100': '#FFDAE2',\n 'color-accent-200': '#FFC7D0',\n 'color-accent-300': '#FEAEB9',\n 'color-accent-400': '#FE748F',\n 'color-accent-500': '#FE0066', // Key color\n 'color-accent-600': '#C91452',\n 'color-accent-700': '#A20D40',\n 'color-accent-800': '#7D062F',\n 'color-accent-900': '#5A011F',\n 'color-accent-950': '#380211',\n\n // Neutral (Gray scale)\n 'color-neutral-00': '#FFFFFF',\n 'color-neutral-50': '#FAFAFA',\n 'color-neutral-75': '#F7F7F7',\n 'color-neutral-100': '#E7EFFD',\n 'color-neutral-200': '#D6DEEE',\n 'color-neutral-250': '#D9D9D9',\n 'color-neutral-300': '#BFC8D8',\n 'color-neutral-400': '#A0A8B8',\n 'color-neutral-500': '#7F8696',\n 'color-neutral-600': '#6B7280', // Key color\n 'color-neutral-700': '#525865',\n 'color-neutral-800': '#3D424D',\n 'color-neutral-850': '#3D3D3D',\n 'color-neutral-900': '#2A2E35',\n 'color-neutral-950': '#171B21',\n 'color-neutral-1000': '#000000',\n\n // Success (Teal scale)\n 'color-success-50': '#E3FFFA',\n 'color-success-100': '#BBFEF2',\n 'color-success-200': '#79F8E4',\n 'color-success-300': '#5AE1CE',\n 'color-success-400': '#14B8A6', // Key color\n 'color-success-500': '#1B9A8B',\n 'color-success-600': '#068073',\n 'color-success-700': '#03675C',\n 'color-success-800': '#004E45',\n 'color-success-900': '#033630',\n 'color-success-950': '#01201C',\n\n // Warning (Yellow scale)\n 'color-warning-50': '#FFF7DA',\n 'color-warning-100': '#FEEDC7',\n 'color-warning-200': '#FED987',\n 'color-warning-300': '#EAB308', // Key color\n 'color-warning-400': '#D19F03',\n 'color-warning-500': '#A68015',\n 'color-warning-600': '#8B6904',\n 'color-warning-700': '#6F5301',\n 'color-warning-800': '#543F06',\n 'color-warning-900': '#3B2B02',\n 'color-warning-950': '#241900',\n\n // Error (Red scale)\n 'color-error-50': '#FFECE7',\n 'color-error-100': '#FFDFD9',\n 'color-error-200': '#FFCDC6',\n 'color-error-300': '#FDB1AA',\n 'color-error-400': '#FD7A72',\n 'color-error-500': '#EF4444', // Key color\n 'color-error-600': '#C8252B',\n 'color-error-700': '#A4111C',\n 'color-error-800': '#7F0813',\n 'color-error-900': '#5B030A',\n 'color-error-950': '#3A0003',\n\n // Info (Cyan scale)\n 'color-info-50': '#E2FDFF',\n 'color-info-100': '#D3F4FF',\n 'color-info-200': '#BEE4FD',\n 'color-info-300': '#89D1FE',\n 'color-info-400': '#0EA5E9', // Key color\n 'color-info-500': '#0D90CC',\n 'color-info-600': '#0F77A8',\n 'color-info-700': '#095F88',\n 'color-info-800': '#044868',\n 'color-info-900': '#01324A',\n 'color-info-950': '#011D2D',\n\n // Base\n 'color-white': '#FFFFFF',\n 'color-black': '#000000',\n 'color-transparent': 'transparent',\n },\n\n // ============================================================================\n // TIER 2: SEMANTIC COLOR TOKENS\n // ============================================================================\n semantic: {\n // ============================================================================\n // LIGHT BACKGROUND SEMANTIC TOKENS\n // ============================================================================\n\n // Surface colors (light backgrounds)\n 'color-surface-canvas': 'var(--color-neutral-00)',\n 'color-surface-default': 'var(--color-neutral-50)',\n 'color-surface-subtle': 'var(--color-neutral-100)',\n 'color-surface-raised': 'var(--color-neutral-50)',\n 'color-surface-sunken': 'var(--color-neutral-200)',\n 'color-surface-inverse': 'var(--color-neutral-900)',\n 'color-surface-icons': 'var(--color-accent-500)',\n\n // Text colors (light backgrounds)\n 'color-text-primary': 'var(--color-primary-950)',\n 'color-text-secondary': 'var(--color-neutral-800)',\n 'color-text-tertiary': 'var(--color-neutral-500)',\n 'color-text-caption': 'var(--color-neutral-600)',\n 'color-text-disabled': 'var(--color-neutral-400)',\n 'color-text-on-brand': 'var(--color-neutral-00)',\n 'color-text-inverse': 'var(--color-primary-950)',\n 'color-text-forground': 'var(--color-neutral-00)',\n\n // Link colors (light backgrounds)\n 'color-text-link-default': 'var(--color-primary-600)',\n 'color-text-link-hover': 'var(--color-primary-700)',\n 'color-text-link-active': 'var(--color-primary-800)',\n 'color-text-link-visited': 'var(--color-primary-500)',\n\n // Border colors (light backgrounds)\n 'color-border-default': 'var(--color-primary-600)',\n 'color-border-subtle': 'var(--color-neutral-100)',\n 'color-border-strong': 'var(--color-primary-950)',\n 'color-border-focus-ring': 'var(--color-primary-600)',\n 'color-border-ghost': 'var(--color-primary-950)',\n\n // Action colors (light backgrounds)\n 'color-action-primary-default': 'var(--color-primary-600)',\n 'color-action-primary-foreground': 'var(--color-neutral-00)',\n 'color-action-primary-hover': 'var(--color-secondary-200)',\n 'color-action-primary-inverse': 'var(--color-primary-950)',\n 'color-action-primary-active': 'var(--color-primary-600)',\n 'color-action-primary-disabled': 'var(--color-neutral-500)',\n\n 'color-action-secondary-default': 'var(--color-primary-600)',\n 'color-action-secondary-foreground': 'var(--color-primary-600)',\n 'color-action-secondary-hover': 'var(--color-primary-950)',\n\n 'color-action-danger-default': 'var(--color-error-600)',\n 'color-action-danger-foreground': 'var(--color-error-500)',\n 'color-action-danger-hover': 'var(--color-error-700)',\n\n 'color-action-ghost-foreground': 'var(--color-primary-600)',\n 'color-action-ghost-hover-fg': 'var(--color-primary-950)',\n 'color-action-ghost-focus': 'var(--color-primary-600)',\n\n // Feedback colors (light backgrounds)\n 'color-feedback-success-background': 'var(--color-success-50)',\n 'color-feedback-success-foreground': 'var(--color-success-50)',\n 'color-feedback-success-border': 'var(--color-success-300)',\n 'color-feedback-success-text': 'var(--color-success-700)',\n\n 'color-feedback-error-background': 'var(--color-error-50)',\n 'color-feedback-error-foreground': 'var(--color-error-50)',\n 'color-feedback-error-border': 'var(--color-error-300)',\n 'color-feedback-error-text': 'var(--color-error-700)',\n\n 'color-feedback-warning-background': 'var(--color-warning-50)',\n 'color-feedback-warning-foreground': 'var(--color-warning-50)',\n 'color-feedback-warning-border': 'var(--color-warning-300)',\n 'color-feedback-warning-text': 'var(--color-warning-700)',\n\n 'color-feedback-info-background': 'var(--color-info-50)',\n 'color-feedback-info-foreground': 'var(--color-info-50)',\n 'color-feedback-info-border': 'var(--color-info-300)',\n 'color-feedback-info-text': 'var(--color-info-700)',\n\n // Overlay and state colors (light backgrounds)\n 'color-overlay-scrim': 'var(--color-neutral-900)',\n 'color-state-hover': 'var(--color-neutral-900)',\n 'color-state-active': 'var(--color-neutral-900)',\n\n // ============================================================================\n // DARK BACKGROUND SEMANTIC TOKENS\n // ============================================================================\n\n // Surface colors (dark backgrounds)\n 'color-surface-canvas-dark': 'var(--color-primary-950)',\n 'color-surface-default-dark': 'var(--color-neutral-900)',\n 'color-surface-subtle-dark': 'var(--color-neutral-800)',\n 'color-surface-raised-dark': 'var(--color-neutral-700)',\n 'color-surface-sunken-dark': 'var(--color-neutral-950)',\n 'color-surface-inverse-dark': 'var(--color-neutral-50)',\n 'color-surface-icons-dark': 'var(--color-accent-500)',\n\n // Text colors (dark backgrounds)\n 'color-text-primary-dark': 'var(--color-neutral-50)',\n 'color-text-secondary-dark': 'var(--color-neutral-200)',\n 'color-text-tertiary-dark': 'var(--color-neutral-400)',\n 'color-text-caption-dark': 'var(--color-neutral-300)',\n 'color-text-disabled-dark': 'var(--color-neutral-600)',\n 'color-text-on-brand-dark': 'var(--color-primary-950)',\n 'color-text-inverse-dark': 'var(--color-primary-950)',\n 'color-text-forground-dark': 'var(--color-neutral-1000)',\n\n // Link colors (dark backgrounds)\n 'color-text-link-default-dark': 'var(--color-primary-400)',\n 'color-text-link-hover-dark': 'var(--color-primary-300)',\n 'color-text-link-active-dark': 'var(--color-primary-200)',\n 'color-text-link-visited-dark': 'var(--color-primary-500)',\n\n // Border colors (dark backgrounds)\n 'color-border-default-dark': 'var(--color-neutral-00)',\n 'color-border-subtle-dark': 'var(--color-neutral-900)',\n 'color-border-strong-dark': 'var(--color-primary-950)',\n 'color-border-focus-ring-dark': 'var(--color-primary-600)',\n 'color-border-ghost-dark': 'var(--color-secondary-200)',\n\n // Action colors (dark backgrounds)\n 'color-action-primary-default-dark': 'var(--color-primary-600)',\n 'color-action-primary-foreground-dark': 'var(--color-neutral-00)',\n 'color-action-primary-hover-dark': 'var(--color-secondary-200)',\n 'color-action-primary-inverse-dark': 'var(--color-secondary-200)',\n 'color-action-primary-active-dark': 'var(--color-primary-600)',\n 'color-action-primary-disabled-dark': 'var(--color-neutral-500)',\n\n 'color-action-secondary-default-dark': 'var(--color-secondary-200)',\n 'color-action-secondary-foreground-dark': 'var(--color-neutral-00)',\n 'color-action-secondary-hover-dark': 'var(--color-neutral-00)',\n\n 'color-action-danger-default-dark': 'var(--color-error-600)',\n 'color-action-danger-foreground-dark': 'var(--color-error-500)',\n 'color-action-danger-hover-dark': 'var(--color-error-600)',\n 'color-action-danger-border-hover-dark': 'var(--color-error-400)',\n\n 'color-action-ghost-foreground-dark': 'var(--color-primary-950)',\n 'color-action-ghost-hover-fg-dark': 'var(--color-secondary-200)',\n 'color-action-ghost-focus-dark': 'var(--color-neutral-00)',\n\n // Feedback colors (dark backgrounds)\n 'color-feedback-success-background-dark': 'var(--color-success-950)',\n 'color-feedback-success-foreground-dark': 'var(--color-success-950)',\n 'color-feedback-success-border-dark': 'var(--color-success-700)',\n 'color-feedback-success-text-dark': 'var(--color-success-400)',\n\n 'color-feedback-error-background-dark': 'var(--color-error-950)',\n 'color-feedback-error-foreground-dark': 'var(--color-error-950)',\n 'color-feedback-error-border-dark': 'var(--color-error-700)',\n 'color-feedback-error-text-dark': 'var(--color-error-400)',\n\n 'color-feedback-warning-background-dark': 'var(--color-warning-950)',\n 'color-feedback-warning-foreground-dark': 'var(--color-warning-950)',\n 'color-feedback-warning-border-dark': 'var(--color-warning-700)',\n 'color-feedback-warning-text-dark': 'var(--color-warning-400)',\n\n 'color-feedback-info-background-dark': 'var(--color-info-950)',\n 'color-feedback-info-foreground-dark': 'var(--color-info-950)',\n 'color-feedback-info-border-dark': 'var(--color-info-700)',\n 'color-feedback-info-text-dark': 'var(--color-info-400)',\n\n // Overlay and state colors (dark backgrounds)\n 'color-overlay-scrim-dark': 'var(--color-neutral-950)',\n 'color-state-hover-dark': 'var(--color-neutral-50)',\n 'color-state-active-dark': 'var(--color-neutral-50)',\n\n // ============================================================================\n // LEGACY TIER 1 SEMANTIC TOKENS (mapped to new semantic structure)\n // ============================================================================\n\n // Background colors - mapped to new surface tokens\n 'tier1-theme-color-background-default-primary-default': 'var(--color-surface-canvas)', // Was Navy, now canvas\n 'tier1-theme-color-background-default-primary-hover': 'var(--color-primary-900)',\n 'tier1-theme-color-background-default-primary-active': 'var(--color-primary-800)',\n 'tier1-theme-color-background-default-secondary-default': 'var(--color-surface-default)', // Mapped to surface-default\n 'tier1-theme-color-background-default-secondary-hover': 'var(--color-surface-subtle)', // Mapped to surface-subtle\n 'tier1-theme-color-background-default-tertiary-default': 'var(--color-surface-subtle)', // Mapped to surface-subtle\n 'tier1-theme-color-background-default-tertiary-hover': 'var(--color-surface-sunken)', // Mapped to surface-sunken\n 'tier1-theme-color-background-accent-primary-default': 'var(--color-accent-500)', // Pink\n 'tier1-theme-color-background-accent-primary-hover': 'var(--color-accent-600)',\n 'tier1-theme-color-background-accent-primary-active': 'var(--color-accent-700)',\n 'tier1-theme-color-background-accent-secondary-default': 'var(--color-secondary-200)', // Mint\n 'tier1-theme-color-background-accent-secondary-hover': 'var(--color-secondary-300)',\n 'tier1-theme-color-background-accent-secondary-active': 'var(--color-secondary-400)',\n 'tier1-theme-color-background-default-inverse-default': 'var(--color-surface-inverse)', // Mapped to surface-inverse\n 'tier1-theme-color-background-utility-overlay-default': 'var(--color-overlay-scrim)', // Mapped to overlay-scrim\n\n // Content (text) colors - mapped to new text tokens\n 'tier1-theme-color-content-title-primary-default': 'var(--color-text-primary)', // Mapped to text-primary\n 'tier1-theme-color-content-default-primary-default': 'var(--color-text-primary)', // Mapped to text-primary\n 'tier1-theme-color-content-default-secondary-default': 'var(--color-text-secondary)', // Mapped to text-secondary\n 'tier1-theme-color-content-default-tertiary-default': 'var(--color-text-tertiary)', // Mapped to text-tertiary\n 'tier1-theme-color-content-default-inverse-default': 'var(--color-text-on-brand)', // Mapped to text-on-brand\n 'tier1-theme-color-content-disabled-subtle-default': 'var(--color-text-disabled)', // Mapped to text-disabled\n 'tier1-theme-color-content-accent-primary-default': 'var(--color-accent-500)', // Pink\n 'tier1-theme-color-content-accent-secondary-default': 'var(--color-secondary-200)', // Mint\n 'tier1-theme-color-content-default-link-default': 'var(--color-text-link-default)', // Mapped to text-link-default\n 'tier1-theme-color-content-default-link-hover': 'var(--color-text-link-hover)', // Mapped to text-link-hover\n\n // Border colors - mapped to new border tokens\n 'tier1-theme-color-border-default-subtle-default': 'var(--color-border-subtle)', // Mapped to border-subtle\n 'tier1-theme-color-border-default-default-default': 'var(--color-border-default)', // Mapped to border-default\n 'tier1-theme-color-border-default-strong-default': 'var(--color-border-strong)', // Mapped to border-strong\n 'tier1-theme-color-border-focus-primary-focus': 'var(--color-border-focus-ring)', // Mapped to border-focus-ring\n\n // State colors - mapped to new feedback tokens\n 'tier1-theme-color-background-utility-success-default': 'var(--color-feedback-success-background)',\n 'tier1-theme-color-content-utility-success-default': 'var(--color-feedback-success-text)',\n 'tier1-theme-color-content-utility-success-hover': 'var(--color-success-600)',\n 'tier1-theme-color-background-utility-warning-default': 'var(--color-feedback-warning-background)',\n 'tier1-theme-color-content-utility-warning-default': 'var(--color-feedback-warning-text)',\n 'tier1-theme-color-content-utility-warning-hover': 'var(--color-warning-600)',\n 'tier1-theme-color-background-utility-error-default': 'var(--color-feedback-error-background)',\n 'tier1-theme-color-content-utility-error-default': 'var(--color-feedback-error-text)',\n 'tier1-theme-color-content-utility-error-hover': 'var(--color-error-600)',\n 'tier1-theme-color-background-utility-info-default': 'var(--color-feedback-info-background)',\n 'tier1-theme-color-content-utility-info-default': 'var(--color-feedback-info-text)',\n 'tier1-theme-color-content-utility-info-hover': 'var(--color-info-500)',\n\n // Interactive colors - mapped to new action tokens\n 'tier1-theme-color-background-default-interactive-default': 'var(--color-action-primary-default)',\n 'tier1-theme-color-background-default-interactive-hover': 'var(--color-primary-700)',\n 'tier1-theme-color-background-default-interactive-active': 'var(--color-action-primary-active)',\n 'tier1-theme-color-background-default-interactive-disabled': 'var(--color-action-primary-disabled)',\n\n // Legacy semantic tokens for backward compatibility\n textBreadcrumbSeparator: 'var(--color-neutral-850)',\n textBreadcrumbLast: 'var(--color-primary-600)',\n textBreadcrumbHover: 'var(--color-primary-600)',\n textBreadcrumbActive: 'var(--color-secondary-100)',\n textBreadcrumb: 'var(--color-neutral-700)',\n containerStrokeColor: 'var(--color-neutral-250)',\n bodyTextColor: 'var(--color-neutral-850)',\n backgroundColor: 'var(--color-neutral-75)',\n darkBackgroundColor: 'var(--color-primary-950)',\n primary: 'var(--color-action-primary-default)', // Mapped to action-primary-default\n primaryHover: 'var(--color-primary-700)',\n primaryActive: 'var(--color-action-primary-active)',\n primaryText: 'var(--color-action-primary-foreground)', // Mapped to action-primary-foreground\n secondary: 'var(--color-action-secondary-default)', // Mapped to action-secondary-default\n secondaryHover: 'var(--color-primary-700)',\n secondaryActive: 'var(--color-primary-800)',\n secondaryText: 'var(--color-text-on-brand)', // Mapped to text-on-brand\n accent: 'var(--color-accent-500)',\n accentHover: 'var(--color-accent-600)',\n accentActive: 'var(--color-accent-700)',\n accentText: 'var(--color-text-on-brand)', // Mapped to text-on-brand\n tertiary: 'var(--color-secondary-200)',\n tertiaryHover: 'var(--color-secondary-300)',\n tertiaryActive: 'var(--color-secondary-400)',\n tertiaryText: 'var(--color-text-primary)', // Mapped to text-primary\n textPrimary: 'var(--color-text-primary)', // Mapped to text-primary\n textSecondary: 'var(--color-text-secondary)', // Mapped to text-secondary\n textTertiary: 'var(--color-text-tertiary)', // Mapped to text-tertiary\n textInverse: 'var(--color-text-inverse)', // Mapped to text-inverse\n textDisabled: 'var(--color-text-disabled)', // Mapped to text-disabled\n textLink: 'var(--color-text-link-default)', // Mapped to text-link-default\n textLinkHover: 'var(--color-text-link-hover)', // Mapped to text-link-hover\n bgPrimary: 'var(--color-surface-canvas)', // Mapped to surface-canvas\n bgSecondary: 'var(--color-surface-default)', // Mapped to surface-default\n bgTertiary: 'var(--color-surface-subtle)', // Mapped to surface-subtle\n bgInverse: 'var(--color-surface-inverse)', // Mapped to surface-inverse\n bgOverlay: 'var(--color-overlay-scrim)', // Mapped to overlay-scrim\n borderDefault: 'var(--color-border-default)', // Mapped to border-default\n borderSubtle: 'var(--color-border-subtle)', // Mapped to border-subtle\n borderStrong: 'var(--color-border-strong)', // Mapped to border-strong\n borderFocus: 'var(--color-border-focus-ring)', // Mapped to border-focus-ring\n stateSuccess: 'var(--color-feedback-success-text)', // Mapped to feedback-success-text\n stateSuccessHover: 'var(--color-success-600)',\n stateSuccessBg: 'var(--color-feedback-success-background)', // Mapped to feedback-success-background\n stateWarning: 'var(--color-feedback-warning-text)', // Mapped to feedback-warning-text\n stateWarningHover: 'var(--color-warning-600)',\n stateWarningBg: 'var(--color-feedback-warning-background)', // Mapped to feedback-warning-background\n stateError: 'var(--color-feedback-error-text)', // Mapped to feedback-error-text\n stateErrorHover: 'var(--color-error-600)',\n stateErrorBg: 'var(--color-feedback-error-background)', // Mapped to feedback-error-background\n stateInfo: 'var(--color-feedback-info-text)', // Mapped to feedback-info-text\n stateInfoHover: 'var(--color-info-500)',\n stateInfoBg: 'var(--color-feedback-info-background)', // Mapped to feedback-info-background\n interactivePrimary: 'var(--color-action-primary-default)', // Mapped to action-primary-default\n interactivePrimaryHover: 'var(--color-action-primary-hover)',\n interactivePrimaryHoverForeground: 'var(--color-text-inverse)',\n interactivePrimaryActive: 'var(--color-action-primary-active)', // Mapped to action-primary-active\n interactiveSecondary: 'var(--color-neutral-200)',\n interactiveSecondaryHover: 'var(--color-neutral-300)',\n interactiveSecondaryActive: 'var(--color-neutral-400)',\n interactiveDisabled: 'var(--color-action-primary-disabled)', // Mapped to action-primary-disabled\n },\n};\n","/**\n * Primax theme configuration\n * Blue and orange color scheme for Primax brand\n */\n\nimport { ThemeConfig } from '../core/types';\nimport { defaultTheme } from './default';\nimport { primaxColorSystem } from './color-systems/primax-colors';\nimport sparkPattern from '@assets/spark-pattern.png';\nimport primaxLogoDark from '@assets/primax-logo-dark.svg';\nimport primaxLogoLight from '@assets/primax-logo-light.svg';\n\n/** Primax footer logo configuration */\nexport const primaxFooterLogo = {\n light: primaxLogoDark,\n dark: primaxLogoLight,\n alt: 'Primax',\n width: 200,\n height: 63,\n};\n\nexport const primaxTheme: ThemeConfig = {\n ...defaultTheme,\n name: 'primax',\n fontImportUrl: ['https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap'],\n\n colors: {\n primitives: primaxColorSystem.primitives,\n semantic: primaxColorSystem.semantic,\n },\n\n colorPalettes: [\n { name: 'Primary', bg: 'primary', text: 'primaryText' },\n { name: 'Secondary', bg: 'secondary', text: 'secondaryText' },\n { name: 'Accent', bg: 'accent', text: 'accentText' },\n { name: 'Tertiary', bg: 'tertiary', text: 'tertiaryText' },\n ],\n\n typography: {\n ...defaultTheme.typography,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontFamilyHeading: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n\n variants: {\n title: {\n fontSize: '3.5rem',\n fontWeight: '700',\n lineHeight: '1.2',\n mobile: {\n fontSize: '2.25rem',\n },\n },\n sectionDivider: {\n fontSize: '2.5rem',\n fontWeight: '700',\n lineHeight: '1.2',\n mobile: {\n fontSize: '1.75rem',\n },\n },\n subtitle: {\n fontSize: '1.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n mobile: {\n fontSize: '1.375rem',\n },\n },\n componentTitle: {\n fontSize: '1.5rem',\n fontWeight: '700',\n lineHeight: '1.3',\n mobile: {\n fontSize: '1.25rem',\n },\n },\n body: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n },\n bodyBold: {\n fontSize: '1.125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n bodySmall: {\n fontSize: '1.125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n },\n },\n\n components: {\n ...defaultTheme.components,\n cta: {\n ...defaultTheme.components.cta,\n },\n },\n\n componentTokens: {\n playButton: {\n color: 'var(--icon-fill-accent)',\n shadowOpacity: '0.4',\n shadowOpacityHover: '1',\n shadowOpacityActive: '0.4',\n\n colorHover: 'var(--icon-fill-accent)',\n colorFocus: 'var(--icon-fill-accent)',\n colorActive: '#1944CE',\n\n dark: {\n color: 'var(--icon-fill-accent)',\n colorHover: 'var(--icon-fill-accent)',\n colorFocus: 'var(--icon-fill-accent)',\n colorActive: '#1944CE',\n },\n },\n\n breadcrumb: {\n gap: 'var(--tier1-theme-spacing-sm, 0.5rem)',\n fontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 0.875rem)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n fontWeight: 'var(--paragraph-font-weight, 400)',\n fontWeightHover: 'var(--paragraph-strong-font-weight, 700)',\n linkColor: 'var(--text-breadcrumb)',\n linkHoverColor: 'var(--text-breadcrumb-hover)',\n linkActiveFontWeight: 'var(--paragraph-strong-font-weight)',\n linkActiveColor: 'var(--text-breadcrumb)',\n lastItemColor: 'var(--text-breadcrumb)',\n lastItemFontWeight: 'var(--paragraph-strong-font-weight, 700)',\n\n separatorColor: 'var(--text-breadcrumb-separator)',\n\n focusColor: 'var(--tier1-theme-color-border-focus-default-default)',\n\n dark: {\n lastItemColor: 'var(--color-neutral-00)',\n linkColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n linkHoverColor: 'var(--breadcrumb-text-color)',\n linkActiveColor: 'var(--text-breadcrumb-active)',\n textColor: 'var(--color-secondary-200)',\n separatorColor: 'var(--color-neutral-00)',\n },\n },\n halfColumn: {\n gap: '7.62rem',\n },\n\n primaxCta: {\n gap: '3.75rem',\n padding: '0',\n headingMaxWidth: '53.75rem',\n formWidth: '39.375rem',\n lg: {\n formWidth: '100%',\n },\n tablet: {\n gap: '1.875rem',\n padding: '0',\n },\n mobile: {\n gap: '1.875rem',\n padding: '0',\n },\n },\n\n banner: {\n contentGapY: '0.9375rem',\n xl: {\n mediaBlockImagePadding: '0 1.875rem',\n mediaBlockImageOffset: '-6.25rem',\n },\n md: {\n mediaBlockImageOffset: '-4.9375rem',\n },\n sm: {\n mediaBlockImageOffset: '-3.4375rem',\n },\n },\n divider: {\n sparkPatternUrl: `url(${sparkPattern})`,\n lg: {\n height: 'auto',\n },\n md: {\n height: 'auto',\n padding: '32px',\n },\n sm: {\n height: 'auto',\n padding: '16px',\n },\n },\n\n mediaBlock: {\n width: '33.75rem',\n height: '31.25rem',\n\n borderRadius: '0 0 0 2rem',\n borderRadiusMirror: '2rem 0 2rem 0',\n\n videoBorderRadius: '0 2rem 0 2rem',\n videoBorderRadiusMirror: '2rem 0 2rem 0',\n videoAccentColor: 'var(--color-secondary-200)',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n\n overlayBg: 'rgba(0, 0, 0, 0.3)',\n\n accentColor: 'var(--color-action-primary-default)',\n accentThickness: '0.625rem',\n accentGap: '0',\n accentSideRow: '6',\n accentSideSpan: '7',\n accentBottomCol: '4',\n accentBottomSpan: '6',\n playIconBg: 'transparent',\n playIconWidth: '9.375rem',\n playIconHeight: 'auto',\n playIconPaddingLeft: '1.5rem',\n playIconImageWidth: '9.375rem',\n playIconImageHeight: '11rem',\n\n sparkRow: '4',\n sparkRowSpan: '6',\n sparkCol: '1',\n sparkColSpan: '4',\n sparkWidth: '58%',\n sparkHeight: '80%',\n sparkRotate: '0deg',\n sparkColMirror: '7',\n sparkTranslateMirrorX: '125%',\n\n croppedSparkWidth: '42.8125rem',\n croppedSparkHeight: '40.8125rem',\n croppedSparkMaskRotate: '-15deg',\n croppedSparkMaskOffsetY: '15%',\n croppedSparkMaskOffsetX: '-10%',\n croppedSparkSvgScale: '1.3',\n croppedSparkStrokeColor: 'var(--color-secondary-200)',\n croppedSparkStrokeWidth: '3px',\n croppedSparkIconLgWidth: '13.625rem',\n croppedSparkIconLgTop: '4%',\n croppedSparkIconLgRight: '2%',\n croppedSparkIconSmWidth: '7.6875rem',\n croppedSparkIconSmTop: '34.6%',\n croppedSparkIconSmLeft: '10%',\n croppedSparkSmallSparksWidth: '18.5625rem',\n croppedSparkSmallSparksTop: '40%',\n croppedSparkSmallSparksRight: '10%',\n mobile: {\n videoHeight: '25rem',\n height: '25rem',\n maxWidth: '27.5rem',\n maxHeight: '100%',\n accentThickness: '0.5rem',\n playIconWidth: '7.8125rem',\n playIconHeight: '7.8125rem',\n playIconImageWidth: '5.625rem',\n playIconImageHeight: '6.625rem',\n croppedSparkSmallSparksTop: '30%',\n croppedSparkSmallSparksRight: '10%',\n },\n\n tablet: {\n videoHeight: '43rem',\n height: '43.75rem',\n maxWidth: '100%',\n maxHeight: '100%',\n accentThickness: '0.9375rem',\n },\n },\n\n icon: {\n size: '1.5rem',\n\n fillPrimary: 'var(--color-primary-600)',\n strokePrimary: 'var(--color-primary-600)',\n strokeWidthPrimary: '0',\n\n fillSecondary: 'var(--color-secondary-200)',\n strokeSecondary: 'var(--color-secondary-200)',\n strokeWidthSecondary: '0',\n\n fillAccent: 'var(--color-accent-500)',\n strokeAccent: 'var(--color-accent-500)',\n strokeWidthAccent: '0',\n\n fillSuccess: 'var(--color-success-500)',\n strokeSuccess: 'var(--color-success-500)',\n strokeWidthSuccess: '0',\n\n fillWarning: 'var(--color-warning-500)',\n strokeWarning: 'var(--color-warning-500)',\n strokeWidthWarning: '0',\n\n fillError: 'var(--color-error-500)',\n strokeError: 'var(--color-error-500)',\n strokeWidthError: '0',\n\n sizes: {\n xs: {\n size: '0.75rem',\n },\n sm: {\n size: '1rem',\n },\n md: {\n size: '1.5rem',\n },\n lg: {\n size: '2rem',\n },\n xl: {\n size: '4.375rem',\n },\n },\n },\n\n button: {\n borderWidth: '2px',\n padding: '1rem 1.5rem',\n fontSize: '1rem',\n fontWeight: '600',\n lineHeight: '1.375rem',\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n shadow: 'none',\n\n gap: '0.3125rem',\n\n faWidth: '0.875rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n hoverAnimation: 'button-spring-up 0.3s ease-out forwards',\n hoverOutAnimation: 'button-spring-down 0.3s ease-out forwards',\n\n sizes: {\n sm: {\n padding: '0.75rem 1rem',\n fontSize: '0.875rem',\n lineHeight: '1.125rem',\n faWidth: '0.75rem',\n },\n md: {\n padding: '1rem 1.5rem',\n fontSize: '1rem',\n lineHeight: '1.375rem',\n faWidth: '0.8125rem',\n },\n lg: {\n padding: '1.25rem 1.875rem',\n fontSize: '1.125rem',\n lineHeight: '1.5rem',\n faWidth: '0.875rem',\n },\n },\n\n variants: {\n general: {\n bg: 'var(--color-primary-600)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-primary-600)',\n bgHover: 'var(--color-secondary-200)',\n textHover: 'var(--color-primary-950)',\n borderHover: 'var(--color-primary-950)',\n bgActive: 'var(--color-primary-700)',\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n\n bgDisabled: 'var(--color-neutral-500)',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'var(--color-neutral-500)',\n\n dark: {\n bg: 'var(--color-primary-600)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-primary-600)',\n bgHover: 'var(--color-secondary-200)',\n textHover: 'var(--color-primary-950)',\n borderHover: 'var(--color-primary-950)',\n bgActive: 'var(--color-primary-700)',\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n },\n },\n secondary: {\n bg: 'transparent',\n border: 'var(--color-primary-600)',\n text: 'var(--color-primary-600)',\n\n textActive: 'var(--color-primary-600)',\n bgActive: 'transparent',\n\n bgHover: 'transparent',\n textHover: 'var(--color-primary-950)',\n borderHover: 'var(--color-primary-950)',\n\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n\n bgDisabled: 'transparent',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'var(--color-neutral-300)',\n\n dark: {\n bg: 'transparent',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-neutral-00)',\n\n bgHover: 'transparent',\n textHover: 'var(--color-secondary-200)',\n borderHover: 'var(--color-secondary-200)',\n\n borderActive: 'var(--color-primary-300)',\n textActive: 'var(--color-primary-300)',\n bgActive: 'transparent',\n\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n },\n },\n link: {\n bg: 'transparent',\n text: 'var(--color-primary-600)',\n border: 'transparent',\n fontSize: '1.125rem',\n fontWeight: '700',\n padding: '0.25rem 0.5rem',\n focusOutline: 'none',\n focusOutlineOffset: '0',\n\n bgHover: 'transparent',\n textHover: 'var(--color-primary-950)',\n borderHover: 'transparent',\n\n bgActive: 'transparent',\n textActive: 'var(--color-primary-950)',\n borderActive: 'transparent',\n\n bgFocus: 'transparent',\n textFocus: 'var(--color-primary-600)',\n borderFocus: 'transparent',\n\n bgDisabled: 'transparent',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'transparent',\n\n sizes: {\n sm: {\n fontSize: '0.875rem',\n },\n md: {\n fontSize: '1rem',\n },\n lg: {\n fontSize: '1.125rem',\n },\n },\n\n dark: {\n bg: 'transparent',\n text: 'var(--color-neutral-00)',\n border: 'transparent',\n\n bgHover: 'transparent',\n textHover: 'var(--color-secondary-200)',\n borderHover: 'transparent',\n\n bgActive: 'transparent',\n textActive: 'var(--color-secondary-200)',\n borderActive: 'transparent',\n\n bgFocus: 'transparent',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'transparent',\n },\n },\n danger: {\n bg: 'var(--color-action-danger-default)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-action-danger-default)',\n focusOutline: '0.125rem solid var(--color-action-danger-default)',\n focusOutlineOffset: '0.125rem',\n\n bgHover: 'var(--color-action-danger-hover)',\n textHover: 'var(--color-neutral-00)',\n borderHover: 'var(--color-error-900)',\n\n bgActive: 'var(--color-error-700)',\n textActive: 'var(--color-neutral-00)',\n borderActive: 'var(--color-error-700)',\n\n bgFocus: 'var(--color-action-danger-default)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-action-danger-default)',\n\n bgDisabled: 'var(--color-neutral-500)',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'var(--color-neutral-500)',\n\n dark: {\n bg: 'var(--color-action-danger-default-dark)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-action-danger-default-dark)',\n focusOutline: '0.125rem solid var(--color-action-danger-default-dark)',\n\n bgHover: 'var(--color-action-danger-hover-dark)',\n textHover: 'var(--color-neutral-00)',\n borderHover: 'var(--color-action-danger-border-hover-dark)',\n\n bgActive: 'var(--color-error-700)',\n textActive: 'var(--color-neutral-00)',\n borderActive: 'var(--color-error-700)',\n\n bgFocus: 'var(--color-action-danger-default-dark)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-action-danger-default-dark)',\n },\n },\n },\n },\n textLink: {\n color: 'var(--color-primary-600)',\n fontSize: '1.125rem',\n fontWeight: '700',\n textDecoration: 'none',\n\n colorActive: 'var(--color-primary-700)',\n colorHover: 'var(--color-primary-950)',\n colorFocus: 'var(--color-primary-600)',\n\n textDecorationFocus: 'underline',\n textDecorationStyleFocus: 'solid',\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n dark: {\n color: 'var(--color-secondary-200)',\n colorHover: 'var(--color-neutral-00)',\n colorFocus: 'var(--color-secondary-200)',\n colorActive: 'var(--color-secondary-100)',\n },\n },\n heading: {\n margin: '0',\n padding: '0',\n color: 'var(--color-text-primary)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n\n h1FontSize: 'var(--tier1-theme-typography-font-size-2xl, 2.5rem)',\n h1FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-desktop-line-height, 1.2)',\n h1LetterSpacing: 'normal',\n\n h2FontSize: 'var(--tier1-theme-typography-font-size-xl, 2rem)',\n h2FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h2LineHeight: 'var(--tier1-theme-typography-h2-desktop-line-height, 1.3)',\n h2LetterSpacing: 'normal',\n\n h3FontSize: 'var(--tier1-theme-typography-font-size-lg, 1.75rem)',\n h3FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h3LineHeight: 'var(--tier1-theme-typography-h3-desktop-line-height, 1.4)',\n h3LetterSpacing: 'normal',\n\n h4FontSize: 'var(--tier1-theme-typography-font-size-md, 1.5rem)',\n h4FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h4LineHeight: 'var(--tier1-theme-typography-h4-desktop-line-height, 1.4)',\n\n h5FontSize: 'var(--tier1-theme-typography-font-size-sm, 1.25rem)',\n h5FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h5LineHeight: 'var(--tier1-theme-typography-h5-desktop-line-height, 1.5)',\n\n h6FontSize: 'var(--tier1-theme-typography-font-size-xs, 1rem)',\n h6FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h6LineHeight: 'var(--tier1-theme-typography-h6-desktop-line-height, 1.5)',\n\n titleFontSize: '3.5rem',\n titleFontWeight: '700',\n titleLineHeight: '1.2',\n titleColor: 'var(--color-text-primary)',\n\n sectionDividerFontSize: '2.5rem',\n sectionDividerFontWeight: '700',\n sectionDividerLineHeight: '1.2',\n sectionDividerColor: 'var(--color-text-primary)',\n\n subtitleFontSize: '1.75rem',\n subtitleFontWeight: '400',\n subtitleLineHeight: '1.4',\n subtitleColor: 'var(--color-text-primary)',\n\n componentTitleFontSize: '1.5rem',\n componentTitleFontWeight: '700',\n componentTitleLineHeight: '1.3',\n componentTitleColor: 'var(--color-text-primary)',\n\n bodyFontSize: '1.125rem',\n bodyFontWeight: '400',\n bodyLineHeight: '1.6',\n bodyColor: 'var(--color-text-secondary)',\n\n bodyBoldFontSize: '1.125rem',\n bodyBoldFontWeight: '700',\n bodyBoldLineHeight: '1.6',\n bodyBoldColor: 'var(--color-text-secondary)',\n\n bodySmallFontSize: '1.125rem',\n bodySmallFontWeight: '700',\n bodySmallLineHeight: '1.6',\n bodySmallColor: 'var(--color-text-secondary)',\n\n dark: {\n color: 'var(--color-neutral-00)',\n },\n\n mobile: {\n titleFontSize: '2.25rem',\n sectionDividerFontSize: '1.75rem',\n subtitleFontSize: '1.375rem',\n componentTitleFontSize: '1.25rem',\n },\n },\n card: {\n bg: '#fff',\n border: '1px solid var(--color-neutral-200)',\n borderRadius: '0',\n shadow: 'var(--tier1-theme-shadow-md)',\n padding: 'var(--tier1-theme-spacing-xl)',\n maxWidth: '25rem',\n height: '21.5625rem',\n\n focusOutline: '0.125rem solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '0.125rem',\n\n borderActive: '0.125rem solid var(--tier1-theme-color-background-default-interactive-default)',\n\n imageWrapperBorderRadius:\n 'var(--tier1-theme-border-radius-lg, 1.25rem) var(--tier1-theme-border-radius-lg, 1.25rem) 0 0',\n imageAspectRatio: '3/2',\n\n md: {\n imageAspectRatio: '16/9',\n },\n },\n\n grid: {\n gapXs: '0.9375rem',\n gapSm: '1.875rem',\n gapMd: '3.75rem',\n gapLg: '4.5rem',\n gapXl: '9rem',\n\n gap: '3.75rem',\n\n tablet: {\n gap: '2rem',\n\n gapSm: '0.9375rem',\n gapMd: '2rem',\n gapLg: '3rem',\n gapXl: '5rem',\n },\n mobile: {\n gap: '1rem',\n\n gapSm: '0.3125rem',\n gapMd: '1rem',\n gapLg: '1.5rem',\n gapXl: '4rem',\n },\n },\n\n header: {\n bg: 'var(--tier1-theme-color-background-default-secondary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-subtle-default)',\n height: '4rem',\n padding: 'var(--tier1-theme-spacing-md) var(--tier1-theme-spacing-lg)',\n\n titleColor: 'var(--tier1-theme-color-content-default-primary-default)',\n titleFontSize: 'var(--tier1-theme-typography-h5-desktop-font-size, 1.25rem)',\n titleFontWeight: 'var(--tier1-theme-typography-h1-desktop-font-weight, 700)',\n titleMargin: '0.375rem 0 0.375rem var(--tier1-theme-spacing-sm, 0.625rem)',\n\n welcomeColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n welcomeFontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 0.875rem)',\n welcomeMargin: 'var(--tier1-theme-spacing-sm, 0.625rem)',\n\n buttonSpacing: 'var(--tier1-theme-spacing-sm, 0.625rem)',\n },\n\n cta: {\n height: '31.25rem',\n\n contentBg: 'var(--tier1-theme-color-background-default-primary-default)',\n contentMaxWidth: '47.8125rem',\n contentBorderRadius: '0 0 12.5rem',\n contentPadding: 'var(--tier1-theme-spacing-xxl) var(--tier1-theme-spacing-xl) 0 var(--tier1-theme-spacing-xxl)',\n\n titleColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n titleFontSize: '3.4375rem',\n titleLineHeight: '4.0625rem',\n titleFontWeight: '900',\n titleMargin: '0 0 1rem',\n titleFontFamily: 'var(--tier1-theme-typography-font-family-heading, var(--tier1-theme-typography-font-family))',\n\n descriptionColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n descriptionFontSize: '1.5rem',\n descriptionLineHeight: '2rem',\n descriptionFontWeight: '100',\n descriptionMargin: '0 0 1.875rem 0',\n descriptionFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n md: {\n height: '28.125rem',\n titleFontSize: '2.5rem',\n titleLineHeight: '1.2',\n descriptionFontSize: '1.125rem',\n descriptionLineHeight: '1.6',\n },\n },\n\n richText: {\n color: 'var(--color-text-primary)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n lineHeight: '1.6',\n\n headingMarginBottom: 'var(--tier1-theme-spacing-md, 1rem)',\n\n paragraphFontSize: '1.125rem',\n paragraphFontWeight: '400',\n paragraphLineHeight: '1.6',\n paragraphMarginBottom: 'var(--tier1-theme-spacing-md, 1rem)',\n paragraphColor: 'var(--color-text-secondary)',\n\n listMargin: 'var(--tier1-theme-spacing-md, 1rem) 0',\n listPaddingLeft: '1rem',\n listItemFontSize: '1.125rem',\n listItemLineHeight: '1.6',\n listItemMarginBottom: 'var(--tier1-theme-spacing-sm, 0.5rem)',\n listItemColor: 'var(--color-text-secondary)',\n ulListStyleType: 'none',\n olListStyleType: 'decimal',\n\n strongFontWeight: '700',\n\n codeFontSize: '0.875em',\n codeBg: 'var(--color-neutral-100)',\n codePadding: '0.125rem 0.25rem',\n\n preFontSize: '0.875rem',\n preBg: 'var(--color-neutral-100)',\n prePadding: 'var(--tier1-theme-spacing-md, 1rem)',\n\n blockquoteMargin: 'var(--tier1-theme-spacing-md, 1rem) 0',\n blockquotePadding: 'var(--tier1-theme-spacing-sm, 0.5rem) var(--tier1-theme-spacing-md, 1rem)',\n blockquoteBorderLeft: '0.25rem solid var(--color-primary-600)',\n blockquoteColor: 'var(--color-text-secondary)',\n\n hrBorder: '1px solid var(--color-neutral-200)',\n hrMargin: 'var(--tier1-theme-spacing-lg, 1.5rem) 0',\n\n mobile: {\n paragraphFontSize: '1rem',\n paragraphLineHeight: '1.6',\n listItemFontSize: '1rem',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n paragraphColor: 'var(--color-neutral-00)',\n listItemColor: 'var(--color-neutral-00)',\n blockquoteColor: 'var(--color-neutral-00)',\n codeBg: 'var(--color-neutral-800)',\n preBg: 'var(--color-neutral-800)',\n hrBorder: '1px solid var(--color-neutral-700)',\n },\n },\n\n paragraph: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n color: 'var(--color-text-secondary)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n letterSpacing: 'normal',\n\n strongFontWeight: '700',\n\n mobile: {\n fontSize: '1rem',\n lineHeight: '1.6',\n },\n\n tablet: {\n fontSize: '1.125rem',\n lineHeight: '1.6',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n },\n },\n\n blockquote: {\n margin: 'var(--tier1-theme-spacing-md, 1rem) 0',\n padding: '0 0 0 var(--tier1-theme-spacing-lg, 1.5rem)',\n borderLeft: 'none',\n bg: 'transparent',\n borderRadius: '0',\n fontStyle: 'normal',\n\n borderPrimaryWidth: '10px',\n borderSecondaryWidth: '5px',\n borderColorPrimary: 'var(--color-primary-950)',\n borderColorSecondary: 'var(--color-secondary-200)',\n\n fontSize: 'var(--heading-subtitle-font-size, 1.75rem)',\n fontWeight: 'var(--heading-subtitle-font-weight, 400)',\n lineHeight: 'var(--heading-subtitle-line-height, 1.4)',\n color: 'var(--color-primary-950)',\n\n citationMarginTop: 'var(--tier1-theme-spacing-md, 1rem)',\n citationFontSize: '1rem',\n citationFontWeight: '600',\n citationColor: 'var(--color-text-secondary)',\n citationPrefix: '\"— \"',\n\n mobile: {\n fontSize: 'var(--heading-subtitle-font-size-mobile, 1.375rem)',\n lineHeight: '1.3',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n citationColor: 'var(--color-neutral-00)',\n borderColorPrimary: 'var(--color-secondary-200)',\n borderColorSecondary: 'var(--color-neutral-00)',\n },\n },\n\n footnote: {\n labelFontWeight: '700',\n markerFontSize: '0.75em',\n markerFontWeight: '700',\n labelColor: 'var(--color-primary-950)',\n dark: {\n labelFontWeight: '700',\n },\n },\n\n author: {\n labelFontWeight: '700',\n labelColor: 'var(--color-primary-950)',\n },\n\n twoColumn: {\n gap: '3.75rem',\n rowGap: '7.625rem',\n leftColSparkIconSmallLeft: '0%',\n leftColSparkIconLargeRight: '20%',\n rightColSparkIconSmallLeft: '0%',\n rightColSparkIconLargeRight: '20%',\n tablet: {\n gap: '1.875rem',\n },\n mobile: {\n gap: '1rem',\n },\n },\n\n videoSection: {\n padding: '0.5rem 3.75rem',\n gap: '3.75rem',\n alignItems: 'center',\n contentPadding: '5.625rem',\n contentGap: '1.875rem',\n textGap: '0.625rem',\n\n tablet: {\n padding: '0.5rem 3.75rem',\n gap: '1.875rem',\n },\n mobile: {\n padding: '0.5rem 1.875rem',\n },\n },\n\n primaxCard: {\n hoverAnimation: 'spring-up 0.3s ease-out forwards',\n hoverOutAnimation: 'spring-down 0.3s ease-out forwards',\n\n bg: '#fff',\n border: '2px solid var(--color-neutral-200)',\n focusBorder: '2px solid var(--color-primary-600)',\n focusOutline: '0px solid var(--color-primary-600)',\n focusOutlineOffset: '0',\n shadowFocus: 'none',\n shadowActive: 'none',\n textGap: '0.625rem',\n maxWidth: '400px',\n\n titleFontSize: 'var(--heading-body-bold-font-size)',\n titleFontWeight: 'var(--heading-body-bold-font-weight)',\n titleLineHeight: 'var(--heading-body-bold-line-height)',\n titleColor: 'var(--heading-color)',\n\n iconPadding: '3.75rem',\n iconContentGap: '0.625rem',\n iconSize: '4.375rem',\n iconActionLinkPadding: '0 3.75rem',\n\n imageHeight: '15.625rem',\n imageContentPadding: '1.875rem',\n imageContentGap: '1.875rem',\n imageActionLinkPadding: '0 1.875rem',\n\n profileImageAspect: '1 / 1',\n profileContentPadding: '1.875rem',\n profileContentGap: '1.875rem',\n profileDescriptionMaxWidth: '17.5rem',\n profileActionLinkPadding: '0 1.875rem',\n\n dark: {\n bg: 'var(--color-neutral-900)',\n border: '2px solid var(--color-neutral-700)',\n },\n },\n\n bulletList: {\n gap: '0.625rem',\n itemGap: '0.9375rem',\n itemAlign: 'center',\n\n iconSize: '1.125rem',\n iconColor: 'var(--color-accent-500)',\n iconContent: '\"\\\\e5d6\"',\n iconFontFamily: \"'Font Awesome 7 Pro'\",\n iconFontWeight: '900',\n\n fontSize: 'var(--paragraph-font-size, 1.125rem)',\n fontWeight: 'var(--paragraph-font-weight, 400)',\n lineHeight: 'var(--paragraph-line-height, 1.6)',\n color: 'var(--paragraph-color, var(--color-text-secondary))',\n fontFamily: 'var(--paragraph-font-family, inherit)',\n letterSpacing: 'var(--paragraph-letter-spacing, normal)',\n\n mobile: {\n fontSize: 'var(--paragraph-font-size-mobile, 1rem)',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n iconColor: 'var(--color-accent-500)',\n },\n },\n\n modal: {\n overlayBg: 'rgba(0, 0, 0, 0.8)',\n\n bodyMaxWidth: '31.875rem',\n\n contentBg: 'var(--color-neutral-00)',\n contentBorder: '1px solid var(--color-neutral-200)',\n contentPadding: '3.75rem',\n borderRadius: '0',\n shadow: 'var(--tier1-theme-shadow-lg)',\n maxWidth: '39.375rem',\n width: '100%',\n\n closeButtonTop: '0.9375rem',\n closeButtonRight: '0.9375rem',\n closeButtonSize: 'auto',\n closeButtonBorderRadius: '50%',\n closeButtonBg: 'transparent',\n closeButtonColor: 'var(--color-primary-950)',\n closeButtonColorHover: 'var(--color-primary-950)',\n closeButtonFontSize: '1.3125rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n borderRadiusMobile: '1.5rem 1.5rem 0 0',\n contentPaddingMobile: '1.5rem',\n dragIndicatorBg: 'var(--color-neutral-300)',\n\n sizes: {\n sm: {\n maxWidth: '39.375rem',\n contentPadding: '3.75rem',\n },\n md: {\n maxWidth: '39.375rem',\n contentPadding: '3.75rem',\n },\n lg: {\n maxWidth: '39.375rem',\n contentPadding: '3.75rem',\n },\n },\n\n mobile: {\n contentPadding: '1.5rem',\n maxWidth: '100%',\n borderRadius: '1.5rem 1.5rem 0 0',\n dragHandleBorderRadius: '0',\n dragHandleBorderBottom: 'none',\n dragHandleMarginBottom: '0',\n },\n dark: {\n contentBg: 'var(--color-neutral-900)',\n contentBorder: '1px solid var(--color-neutral-700)',\n dragIndicatorBg: 'var(--color-neutral-600)',\n },\n },\n checkbox: {\n iconSize: '1.5rem',\n borderColor: 'var(--color-primary-950)',\n borderColorHover: 'var(--color-primary-600)',\n checkedColor: 'var(--color-primary-600)',\n checkedColorHover: 'var(--color-primary-700)',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.333',\n labelColor: 'var(--color-neutral-700)',\n gap: '0.625rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n dark: {\n borderColor: 'var(--color-neutral-00)',\n borderColorHover: 'var(--color-secondary-200)',\n checkedColor: 'var(--color-secondary-200)',\n labelColor: 'var(--color-neutral-00)',\n },\n },\n\n dropdown: {\n labelFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n labelFontSize: '1.125rem',\n labelFontWeight: '700',\n labelLineHeight: '1.333',\n labelColor: 'var(--color-primary-950)',\n labelGap: '0.5rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.333',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-50)',\n borderWidth: '1px',\n borderColor: 'var(--color-neutral-300)',\n borderRadius: '0',\n padding: '1rem',\n placeholderColor: 'var(--color-neutral-700)',\n borderColorFocus: 'var(--color-primary-600)',\n\n chevronSize: '1rem',\n chevronColor: 'var(--color-primary-950)',\n\n panelBg: 'var(--color-neutral-00)',\n panelBorderColor: 'var(--color-neutral-300)',\n panelMaxHeight: '15rem',\n panelPadding: '0.5rem 0',\n\n errorFontSize: '0.875rem',\n errorFontWeight: '400',\n errorColor: 'var(--color-error-500)',\n errorTextAlign: 'right',\n\n dark: {\n labelColor: 'var(--color-neutral-00)',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-00)',\n borderColor: 'var(--color-neutral-300)',\n placeholderColor: 'var(--color-neutral-500)',\n chevronColor: 'var(--color-primary-950)',\n panelBg: 'var(--color-neutral-00)',\n panelBorderColor: 'var(--color-neutral-300)',\n errorColor: 'var(--color-error-300)',\n },\n },\n\n dropdownSelect: {\n optionPadding: '0.5rem 1rem',\n optionBgHover: 'transparent',\n\n dark: {\n optionBgHover: 'var(--color-neutral-100)',\n },\n },\n\n textInput: {\n labelFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n labelFontSize: '1.125rem',\n labelFontWeight: '700',\n labelLineHeight: '1.333',\n labelColor: 'var(--color-primary-950)',\n labelGap: '0.5rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.333',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-50)',\n borderWidth: '1px',\n borderColor: 'var(--color-neutral-300)',\n borderRadius: '0',\n padding: '1rem',\n placeholderColor: 'var(--color-neutral-500)',\n borderColorFocus: 'var(--color-primary-600)',\n\n errorFontWeight: '400',\n errorColor: 'var(--color-error-500)',\n errorTextAlign: 'right',\n\n dark: {\n labelColor: 'var(--color-neutral-00)',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-00)',\n borderColor: 'var(--color-neutral-300)',\n placeholderColor: 'var(--color-neutral-500)',\n errorColor: 'var(--color-error-300)',\n },\n },\n\n form: {\n gap: '2rem',\n formGap: '1.875rem',\n fieldsRowGap: '1.75rem',\n\n disclaimerFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n disclaimerFontSize: '1rem',\n disclaimerFontWeight: '700',\n disclaimerLineHeight: '1.5',\n\n dark: {\n disclaimerLinkColor: 'var(--color-secondary-200)',\n },\n },\n\n subscribe: {\n bg: 'var(--background-color)',\n inputBg: 'var(--color-neutral-00)',\n\n gap: '2rem',\n padding: '3.75rem',\n formGap: '1.875rem',\n fieldsGap: '3.75rem',\n\n disclaimerFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n disclaimerFontSize: '1rem',\n disclaimerFontWeight: '700',\n disclaimerLineHeight: '1.5',\n\n tablet: {\n padding: '3.75rem 2rem',\n fieldsGap: '3.75rem',\n },\n mobile: {\n padding: '2rem 1rem',\n fieldsGap: '2rem',\n },\n\n dark: {\n bg: 'transparent',\n disclaimerColor: 'var(--color-neutral-00)',\n disclaimerLinkColor: 'var(--color-secondary-200)',\n },\n },\n\n primaxHeader: {\n bg: 'var(--color-neutral-00)',\n padding: '0 3.75rem',\n navHeight: '8.125rem',\n logoWidth: '12.5rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n navFontSize: 'var(--tier1-theme-typography-body-bold-desktop-font-size)',\n navFontWeight: 'var(--tier1-theme-typography-body-bold-desktop-font-weight)',\n navLineHeight: 'var(--tier1-theme-typography-body-bold-desktop-line-height)',\n navLinkPadding: '3.3125rem 0.9375rem',\n\n navItemBgActive: 'var(--color-primary-950)',\n navLinkColor: 'var(--color-primary-950)',\n navLinkColorActive: 'var(--color-secondary-200)',\n navLinkColorHover: 'var(--color-neutral-00)',\n navLinkTextDecorationHover: 'underline',\n navLinkTextDecorationActive: 'none',\n\n ctaPaddingLeft: '1rem',\n\n overlayBg: 'var(--color-primary-950)',\n overlayPadding: '3.75rem 3rem',\n overlayGap: '3.75rem',\n overlayMaxWidth: '100%',\n overlaySideWidth: '25rem',\n\n groupGap: '0.625rem',\n groupHeadingFontSize: '1.125rem',\n groupHeadingColor: 'var(--color-neutral-00)',\n groupHeadingColorHover: 'var(--color-secondary-200)',\n groupHeadingColorActive: 'var(--color-neutral-00)',\n groupHeadingColorFocus: 'var(--color-neutral-00)',\n groupHeadingOutlineWidth: '0rem',\n groupHeadingOutlineOffset: '0.125rem',\n groupLinkGap: '0.625rem',\n groupLinkFontSize: '1.125rem',\n groupLinkColor: 'var(--color-neutral-00)',\n groupLinkColorHover: 'var(--color-neutral-00)',\n groupLinkColorActive: 'var(--color-secondary-200)',\n groupLinkColorFocus: 'var(--color-secondary-200)',\n groupLinkOutlineWidth: '0rem',\n groupLinkOutlineOffset: '0.125rem',\n\n mobileBg: '#ffffff',\n mobileBorder: '#e5e5e5',\n mobileItemPadding: '1rem',\n mobileItemFontSize: '1.125rem',\n mobileGroupBorder: '#e5e5e5',\n mobileGroupPadding: '1rem',\n mobileGroupFontSize: '1.125rem',\n mobileSearchPadding: '0.5rem',\n mobileSublinkBg: '#ffffff',\n mobileSublinkFontSize: '1.125rem',\n mobileSublinkPadding: '1rem',\n\n //Hamburger\n hamburgerColor: 'var(--color-primary-950)',\n\n featuredImageMaxWidth: '25rem',\n featuredImageBorderRadius: '0',\n\n focusColor: 'var(--color-primary-600)',\n\n tablet: {\n padding: '0rem 1rem',\n overlayPadding: '2rem 1.875rem',\n },\n mobile: {\n padding: '2rem 1rem',\n mobileItemColor: 'var(--color-neutral-00)',\n navLinkColor: 'var(--color-primary-950)',\n mobileItemBackground: 'var(--color-primary-950)',\n mobileSublinkBgAlt: 'var(--color-neutral-100)',\n mobileSublinkColorHover: 'var(--color-primary-950)',\n overlaySearchHeight: '4.5rem',\n overlaySearchPadding: '0rem 0rem 2rem',\n },\n\n dark: {\n bg: 'var(--color-primary-950)',\n hamburgerColor: 'var(--color-neutral-00)',\n navLinkColor: 'var(--color-neutral-00)',\n navItemBgActive: 'var(--color-neutral-00)',\n navLinkColorActive: 'var(--color-primary-950)',\n },\n },\n alertBanner: {\n bg: 'var(--color-primary-950)',\n\n borderStyle: 'solid',\n borderColor: 'var(--color-secondary-200)',\n borderTopWidth: '2px',\n borderBottomWidth: '2px',\n\n padding: '1.13rem 2rem',\n contentPadding: '0rem',\n contentGap: '0.5rem',\n textGap: '1rem',\n\n dismissColor: 'var(--color-secondary-200)',\n dismissColorHover: 'var(--color-secondary-200)',\n dismissColorActive: 'var(--color-secondary-100)',\n dismissSize: '1.125rem',\n dismissPadding: '0.125rem',\n\n focusOutline: '0.125rem solid var(--color-secondary-200)',\n focusOutlineOffset: '0.12rem',\n\n mobile: {\n padding: '0.75rem 1rem',\n textWrapMaxWidth: '343px',\n },\n },\n\n iconListItem: {\n gap: '0.9375rem',\n width: '100%',\n maxWidth: '60rem',\n\n iconBlockWidth: '7.69rem',\n iconBlockHeight: '7.69rem',\n iconBlockBg: 'var(--color-primary-950)',\n iconColor: 'var(--color-secondary-200)',\n iconSize: '3rem',\n\n contentGap: '0.3125rem',\n textGap: '0.25rem',\n linkPaddingTop: '0.3125rem',\n\n dark: {\n iconBlockBg: 'var(--color-primary-800)',\n iconColor: 'var(--color-secondary-200)',\n },\n tablet: {\n iconBlockWidth: '7.69rem',\n iconBlockHeight: '7.69rem',\n maxWidth: '100%',\n },\n },\n\n iconBulletList: {\n gap: '3.75rem',\n padding: '3.75rem',\n\n dividerContentPadding: '0rem',\n\n itemsRowGap: '1.875rem',\n itemsColGap: '3.75rem',\n },\n\n iconBulletSection: {\n gap: '3.75rem',\n padding: '3.75rem 0',\n dividerPadding: '3.75rem',\n\n contentGap: '3.75rem',\n mediaWidth: '53.75rem',\n listGap: '1.875rem',\n\n tablet: {\n contentGap: '2.5rem',\n },\n },\n\n accordion: {\n borderColor: 'var(--color-neutral-200)',\n\n itemPadding: '1rem 0',\n headerBgHover: 'transparent',\n\n titleFontFamily: 'var(--tier1-theme-typography-font-family)',\n titleFontSize: 'var(--heading-body-bold-font-size)',\n titleFontWeight: 'var(--heading-body-bold-font-weight)',\n titleLineHeight: 'var(--heading-body-bold-line-height)',\n titleColor: 'var(--color-primary-950)',\n\n chevronSize: '1.3125rem',\n chevronColor: 'var(--color-primary-950)',\n\n animationDuration: '0.3s',\n\n contentPadding: '0 0 1rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '-0.125rem',\n\n dark: {\n titleColor: 'var(--color-neutral-00)',\n chevronColor: 'var(--color-neutral-00)',\n borderColor: 'rgba(255, 255, 255, 0.2)',\n },\n },\n\n accordionSection: {\n contentGap: '2rem',\n contentMaxWidth: '100%',\n gap: '9.5625rem',\n mediaRadius: '0 2rem 0 2rem',\n\n tablet: {\n gap: '3.75rem',\n },\n mobile: {\n gap: '2.5rem',\n },\n },\n\n postFeed: {\n padding: '3.75rem 0',\n sectionGap: '2.5rem',\n gap: '3.75rem',\n postGap: '1.875rem',\n\n featuredContentGap: '0.9375rem',\n featuredImageAspect: '3/2',\n\n regularGap: '1.25rem',\n bodyGap: '0.3125rem',\n thumbnailWidth: '11.25rem',\n thumbnailAspect: '3/2',\n\n titleColor: 'var(--color-primary-950)',\n titleFontSize: 'var(--heading-body-bold-font-size)',\n titleFontWeight: 'var(--heading-body-bold-font-weight)',\n titleLineHeight: 'var(--heading-body-bold-line-height)',\n titleColorHover: 'var(--color-primary-600)',\n titleColorActive: 'var(--color-primary-700)',\n\n assetTypeColor: 'var(--color-primary-950)',\n metaColor: 'var(--paragraph-color)',\n metaFontSize: 'var(--paragraph-font-size)',\n metaLineHeight: 'var(--paragraph-line-height)',\n\n dividerColor: 'var(--color-neutral-200)',\n dividerHeight: '1px',\n\n loadMoreGap: '2.5rem',\n\n tablet: {\n padding: '2rem 2rem',\n gap: '1.875rem',\n postGap: '1.875rem',\n },\n mobile: {\n padding: '2rem 1rem',\n gap: '1.5rem',\n postGap: '1.25rem',\n sectionGap: '1.5rem',\n thumbnailWidth: '7.5rem',\n loadMoreGap: '1.875rem',\n },\n },\n\n footer: {\n gap: '1.88rem',\n padding: '3.75rem',\n bg: 'var(--background-color)',\n navMaxWidth: '63.75rem',\n\n logoWidth: '12.5rem',\n\n navGap: '2rem',\n linkGap: '0.75rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n headingFontSize: '1.125rem',\n headingFontWeight: '700',\n headingColor: 'var(--color-primary-950)',\n\n linkFontSize: '1.125rem',\n linkFontWeight: '700',\n linkColor: 'var(--color-primary-950)',\n linkColorHover: 'var(--color-primary-600)',\n linkColorActive: 'var(--color-primary-700)',\n\n socialIconSize: '1.562rem', //25px\n\n legalFontSize: '1rem',\n legalFontWeight: '700',\n legalColor: 'var(--bodyTextColor)',\n legalColorDark: 'var(--color-neutral-00)',\n\n focusOutlineWidth: '0px',\n focusOutlineColor: 'var(--color-primary-950)',\n\n tablet: {\n padding: '3.75rem 2rem',\n gap: '1.88rem',\n },\n mobile: {\n padding: '3.75rem 2rem',\n gap: '1.88rem',\n },\n\n dark: {\n bg: 'var(--color-primary-950)',\n linkColor: 'var(--color-neutral-00)',\n headingColor: 'var(--color-neutral-00)',\n linkColorHover: 'var(--color-secondary-200)',\n legalColor: 'var(--color-neutral-300)',\n legalLinkColor: 'var(--color-secondary-200)',\n focusOutlineColor: 'var(--color-neutral-00)',\n },\n },\n overflowMediaSection: {\n mediaBlockBorderRadiusLeft: '0 2rem 0 2rem',\n mediaBlockBorderRadiusRight: '2rem 0 2rem 0',\n },\n\n filterSection: {\n inputBg: 'var(--color-neutral-00)',\n },\n assetMeta: {\n typeColor: 'var(--color-primary-950)',\n detailsColor: 'var(--color-neutral-700)',\n\n dark: {\n typeColor: 'var(--color-neutral-00)',\n detailsColor: 'var(--color-neutral-200)',\n },\n },\n\n sidebar: {\n width: '25.25rem',\n imageHeight: '14.125rem',\n contentPadding: '1.875rem',\n contentBg: 'var(--color-neutral-50)',\n innerGap: '1.875rem',\n sectionTitleColor: 'var(--color-primary-950)',\n assetTitleColor: 'var(--color-primary-950)',\n socialsGap: '0.9375rem',\n socialIconsGap: '0.9375rem',\n socialIconSize: '1.5625rem',\n socialIconColor: 'var(--color-primary-950)',\n socialIconColorHover: 'var(--color-primary-600)',\n assetGap: '0.9375rem',\n dividerColor: '#D4D4D4',\n ctaPadding: '2rem',\n ctaBg: 'var(--color-primary-950)',\n ctaGap: '0.9375rem',\n ctaTitleColor: 'var(--color-neutral-00)',\n tablet: {\n width: '100%',\n },\n mobile: {\n width: '100%',\n },\n },\n },\n};\n","export default \"data:image/svg+xml,%3Csvg%20width%3D%22200%22%20height%3D%2263%22%20viewBox%3D%220%200%20200%2063%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url%28%23clip0_1256_11767%29%22%3E%3Cpath%20d%3D%22M73.8374%2015.5151H61.7612V50.2152H73.8374V15.5151Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M67.7967%200C64.2156%200%2061.3169%202.91112%2061.3169%206.49567C61.3169%2010.0802%2064.2209%2012.9913%2067.7967%2012.9913C71.3724%2012.9913%2074.2764%2010.0855%2074.2764%206.49567C74.2764%202.90582%2071.3724%200%2067.7967%200Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M54.8533%2015.4995H54.1551C53.0813%2015.4995%2051.9546%2015.8548%2051.0501%2016.3373C48.5692%2017.663%2047.7864%2020.2029%2047.7652%2022.605C47.7652%2022.8065%2047.4108%2022.8065%2047.4055%2022.605C47.3844%2020.2029%2046.6068%2017.663%2044.1207%2016.3373C43.2162%2015.8548%2042.0895%2015.5048%2041.0157%2015.4995H36.0752V50.2102H48.1514V33.8199C48.1514%2030.4634%2050.6163%2027.7432%2053.9646%2027.7432V27.7273C55.6362%2027.7326%2057.1384%2028.4166%2058.2386%2029.5089C58.2439%2029.5142%2058.2545%2029.5248%2058.2598%2029.5301C58.2968%2029.5673%2058.3444%2029.6044%2058.3815%2029.6468C58.4132%2029.6733%2058.4502%2029.6945%2058.4873%2029.721V16.0139C58.4873%2016.0139%2056.8951%2015.5207%2054.8533%2015.5048H54.848L54.8533%2015.4995Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M114.969%2015.1069C110.352%2015.1069%20106.49%2018.3308%20105.485%2022.6577V22.5941C105.485%2022.5941%20105.485%2022.6047%20105.485%2022.61C105.485%2022.8115%20105.131%2022.8115%20105.125%2022.61C105.125%2022.5835%20105.125%2022.5623%20105.125%2022.5358H105.12C104.951%2018.4051%20101.566%2015.1016%2097.4027%2015.1016C93.2397%2015.1016%2089.8544%2018.3998%2089.6851%2022.5358H89.6746C89.6746%2022.5358%2089.6746%2022.5835%2089.6746%2022.61C89.6746%2022.8115%2089.3202%2022.8115%2089.3149%2022.61C89.2937%2020.208%2088.5161%2017.668%2086.03%2016.3424C85.1308%2015.8598%2084.0094%2015.5099%2082.9409%2015.5046H77.2334V50.2153H89.3043L89.3096%2050.21V29.8746C89.3096%2028.6072%2090.0766%2027.4142%2091.2773%2027.0324C93.0176%2026.4756%2094.7684%2027.7959%2094.7684%2029.5034V50.2153H95.07H95.3926L106.633%2050.2206H106.85V29.6147C106.85%2028.1936%20108.241%2026.9051%20109.664%2026.9104C111.113%2026.9157%20112.462%2028.0452%20112.462%2029.5087V50.2206L112.859%2050.2259H124.538V24.8901C124.538%2019.4921%20120.365%2015.1175%20114.98%2015.1175L114.969%2015.1069Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M190.092%2028.9575C191.759%2028.9522%20193.509%2028.406%20194.911%2027.653C198.762%2025.5956%20199.973%2021.6558%20200%2017.9334V15.4995H188.098V16.2313C188.098%2019.959%20185.083%2022.9815%20181.365%2022.9815C177.646%2022.9815%20174.631%2019.959%20174.631%2016.2313V15.4995H136.234C134.842%2015.5048%20133.383%2015.9661%20132.214%2016.5865C128.992%2018.3046%20127.977%2021.6081%20127.955%2024.7207C127.955%2024.7313%20127.95%2024.7419%20127.95%2024.7525V24.7631H140.248L143.861%2024.7684C145.014%2024.7684%20145.945%2025.7017%20145.945%2026.8576C145.945%2026.8576%20145.945%2026.8576%20145.945%2026.8629C145.94%2028.0136%20145.009%2028.9416%20143.861%2028.9416H142.962C142.93%2028.9416%20142.904%2028.9469%20142.872%2028.9469H137.276C135.456%2028.9522%20133.541%2029.5514%20132.013%2030.368C129.685%2031.6088%20128.241%2033.4806%20127.411%2035.5963C126.374%2038.2264%20126.416%2041.2011%20127.516%2043.81C128.098%2045.1834%20128.945%2046.4507%20130.14%2047.4953C130.145%2047.5006%20130.151%2047.5059%20130.161%2047.5112C130.336%2047.665%20130.521%2047.8135%20130.717%2047.9566C130.722%2047.9566%20130.727%2047.9672%20130.732%2047.9672C131.129%2048.2642%20131.558%2048.5346%20132.018%2048.7838C133.536%2049.5951%20135.435%2050.189%20137.239%2050.2049H145.448C146.564%2050.1996%20147.739%2049.8284%20148.68%2049.33C151.277%2047.946%20152.092%2045.2841%20152.113%2042.776C152.113%2042.67%20152.208%2042.6169%20152.298%2042.6169C152.393%2042.6169%20152.489%2042.67%20152.483%2042.776C152.504%2045.2894%20153.319%2047.946%20155.916%2049.33C156.858%2049.8337%20158.032%2050.1996%20159.148%2050.2049H162.327H171.113H171.748H174.647V42.1397C174.647%2038.412%20177.662%2035.3895%20181.38%2035.3895C185.099%2035.3895%20188.114%2038.412%20188.114%2042.1397V50.2049H193.991H200.016V40.4535C199.984%2036.7311%20198.773%2032.7912%20194.927%2030.7338C193.525%2029.9862%20191.774%2029.4347%20190.108%2029.4294C189.754%2029.4294%20189.754%2028.9469%20190.108%2028.9469L190.092%2028.9575ZM145.718%2039.8543C145.374%2041.4026%20144.131%2042.6487%20142.592%2042.9881C139.529%2043.6668%20136.863%2040.9943%20137.545%2037.9241C137.889%2036.3811%20139.132%2035.1297%20140.677%2034.7903C143.734%2034.1116%20146.4%2036.7841%20145.723%2039.8543H145.718ZM172.912%2029.4294C171.246%2029.4347%20169.495%2029.9809%20168.093%2030.7338C164.242%2032.7912%20163.031%2036.7311%20163.004%2040.4535C163.004%2040.7663%20162.454%2040.7663%20162.449%2040.4535C162.417%2036.7311%20161.211%2032.7912%20157.36%2030.7338C155.959%2029.9862%20154.208%2029.4347%20152.541%2029.4294C152.187%2029.4294%20152.187%2028.9469%20152.541%2028.9469C154.208%2028.9416%20155.959%2028.3954%20157.36%2027.6424C161.211%2025.585%20162.422%2021.6452%20162.449%2017.9228C162.449%2017.769%20162.586%2017.6895%20162.724%2017.6895C162.862%2017.6895%20163.004%2017.769%20162.999%2017.9228C163.031%2021.6452%20164.237%2025.585%20168.088%2027.6424C169.489%2028.3901%20171.24%2028.9416%20172.906%2028.9469C173.261%2028.9469%20173.261%2029.4294%20172.906%2029.4294H172.912Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M16.6094%2015.3511C16.3449%2015.3564%2016.0592%2015.3564%2015.7842%2015.3723H0V63.0001H12.1185V49.6535L12.9437%2049.855C14.155%2050.1466%2015.3875%2050.2951%2016.6094%2050.2951C21.4758%2050.2951%2025.5964%2048.5346%2028.5321%2045.2046C31.2669%2042.1026%2032.8643%2037.6962%2033.0336%2032.8019C33.224%2027.2819%2031.7958%2022.78%2028.913%2019.784C26.0936%2016.857%2021.9519%2015.367%2016.6094%2015.3564V15.3511ZM20.7617%2033.7192C20.2169%2036.1849%2018.2756%2038.1257%2015.8212%2038.6718C15.3134%2038.7832%2014.8109%2038.8415%2014.3137%2038.8415C13.7424%2038.8415%2013.1817%2038.7673%2012.6263%2038.6241L12.1291%2038.4915V25.9191L12.6316%2025.7919C12.6951%2025.776%2012.7532%2025.76%2012.8167%2025.7494C15.0807%2025.251%2017.3869%2025.9138%2018.995%2027.5258C20.603%2029.1378%2021.2642%2031.455%2020.767%2033.7245L20.7617%2033.7192Z%22%20fill%3D%22%230D0942%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22clip0_1256_11767%22%3E%3Crect%20width%3D%22200%22%20height%3D%2263%22%20fill%3D%22white%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22200%22%20height%3D%2263%22%20viewBox%3D%220%200%20200%2063%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url%28%23clip0_1119_2843%29%22%3E%3Cpath%20d%3D%22M73.8376%2015.5151H61.7614V50.2152H73.8376V15.5151Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M67.7969%200C64.2158%200%2061.3171%202.91112%2061.3171%206.49567C61.3171%2010.0802%2064.2211%2012.9913%2067.7969%2012.9913C71.3726%2012.9913%2074.2766%2010.0855%2074.2766%206.49567C74.2766%202.90582%2071.3726%200%2067.7969%200Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M54.8532%2015.4995H54.155C53.0812%2015.4995%2051.9545%2015.8548%2051.05%2016.3373C48.5692%2017.663%2047.7863%2020.2029%2047.7651%2022.605C47.7651%2022.8065%2047.4107%2022.8065%2047.4054%2022.605C47.3843%2020.2029%2046.6067%2017.663%2044.1206%2016.3373C43.2161%2015.8548%2042.0894%2015.5048%2041.0156%2015.4995H36.0751V50.2102H48.1513V33.8199C48.1513%2030.4634%2050.6162%2027.7432%2053.9646%2027.7432V27.7273C55.6361%2027.7326%2057.1383%2028.4166%2058.2386%2029.5089C58.2439%2029.5142%2058.2544%2029.5248%2058.2597%2029.5301C58.2967%2029.5673%2058.3444%2029.6044%2058.3814%2029.6468C58.4131%2029.6733%2058.4501%2029.6945%2058.4872%2029.721V16.0139C58.4872%2016.0139%2056.895%2015.5207%2054.8532%2015.5048H54.8479L54.8532%2015.4995Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M114.97%2015.1069C110.352%2015.1069%20106.49%2018.3308%20105.485%2022.6577V22.5941C105.485%2022.5941%20105.485%2022.6047%20105.485%2022.61C105.485%2022.8115%20105.131%2022.8115%20105.126%2022.61C105.126%2022.5835%20105.126%2022.5623%20105.126%2022.5358H105.12C104.951%2018.4051%20101.566%2015.1016%2097.4028%2015.1016C93.2399%2015.1016%2089.8545%2018.3998%2089.6853%2022.5358H89.6747C89.6747%2022.5358%2089.6747%2022.5835%2089.6747%2022.61C89.6747%2022.8115%2089.3203%2022.8115%2089.315%2022.61C89.2938%2020.208%2088.5163%2017.668%2086.0301%2016.3424C85.1309%2015.8598%2084.0095%2015.5099%2082.941%2015.5046H77.2335V50.2153H89.3044L89.3097%2050.21V29.8746C89.3097%2028.6072%2090.0767%2027.4142%2091.2774%2027.0324C93.0177%2026.4756%2094.7686%2027.7959%2094.7686%2029.5034V50.2153H95.0701H95.3927L106.633%2050.2206H106.85V29.6147C106.85%2028.1936%20108.241%2026.9051%20109.664%2026.9104C111.113%2026.9157%20112.462%2028.0452%20112.462%2029.5087V50.2206L112.859%2050.2259H124.538V24.8901C124.538%2019.4921%20120.365%2015.1175%20114.98%2015.1175L114.97%2015.1069Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M190.093%2028.9575C191.759%2028.9522%20193.51%2028.406%20194.911%2027.653C198.762%2025.5956%20199.974%2021.6558%20200%2017.9334V15.4995H188.098V16.2313C188.098%2019.959%20185.083%2022.9815%20181.365%2022.9815C177.646%2022.9815%20174.631%2019.959%20174.631%2016.2313V15.4995H136.234C134.843%2015.5048%20133.383%2015.9661%20132.214%2016.5865C128.992%2018.3046%20127.977%2021.6081%20127.956%2024.7207C127.956%2024.7313%20127.95%2024.7419%20127.95%2024.7525V24.7631H140.249L143.861%2024.7684C145.015%2024.7684%20145.946%2025.7017%20145.946%2026.8576C145.946%2026.8576%20145.946%2026.8576%20145.946%2026.8629C145.94%2028.0136%20145.009%2028.9416%20143.861%2028.9416H142.962C142.93%2028.9416%20142.904%2028.9469%20142.872%2028.9469H137.276C135.456%2028.9522%20133.541%2029.5514%20132.013%2030.368C129.685%2031.6088%20128.241%2033.4806%20127.411%2035.5963C126.374%2038.2264%20126.416%2041.2011%20127.517%2043.81C128.098%2045.1834%20128.945%2046.4507%20130.14%2047.4953C130.145%2047.5006%20130.151%2047.5059%20130.161%2047.5112C130.336%2047.665%20130.521%2047.8135%20130.717%2047.9566C130.722%2047.9566%20130.727%2047.9672%20130.733%2047.9672C131.129%2048.2642%20131.558%2048.5346%20132.018%2048.7838C133.536%2049.5951%20135.435%2050.189%20137.239%2050.2049H145.448C146.564%2050.1996%20147.739%2049.8284%20148.68%2049.33C151.277%2047.946%20152.092%2045.2841%20152.113%2042.776C152.113%2042.67%20152.208%2042.6169%20152.298%2042.6169C152.394%2042.6169%20152.489%2042.67%20152.483%2042.776C152.505%2045.2894%20153.319%2047.946%20155.916%2049.33C156.858%2049.8337%20158.032%2050.1996%20159.148%2050.2049H162.327H171.113H171.748H174.647V42.1397C174.647%2038.412%20177.662%2035.3895%20181.381%2035.3895C185.099%2035.3895%20188.114%2038.412%20188.114%2042.1397V50.2049H193.991H200.016V40.4535C199.984%2036.7311%20198.773%2032.7912%20194.927%2030.7338C193.526%2029.9862%20191.775%2029.4347%20190.108%2029.4294C189.754%2029.4294%20189.754%2028.9469%20190.108%2028.9469L190.093%2028.9575ZM145.718%2039.8543C145.374%2041.4026%20144.131%2042.6487%20142.592%2042.9881C139.529%2043.6668%20136.863%2040.9943%20137.546%2037.9241C137.889%2036.3811%20139.133%2035.1297%20140.677%2034.7903C143.734%2034.1116%20146.4%2036.7841%20145.723%2039.8543H145.718ZM172.912%2029.4294C171.246%2029.4347%20169.495%2029.9809%20168.093%2030.7338C164.242%2032.7912%20163.031%2036.7311%20163.005%2040.4535C163.005%2040.7663%20162.454%2040.7663%20162.449%2040.4535C162.417%2036.7311%20161.211%2032.7912%20157.36%2030.7338C155.959%2029.9862%20154.208%2029.4347%20152.542%2029.4294C152.187%2029.4294%20152.187%2028.9469%20152.542%2028.9469C154.208%2028.9416%20155.959%2028.3954%20157.36%2027.6424C161.211%2025.585%20162.423%2021.6452%20162.449%2017.9228C162.449%2017.769%20162.587%2017.6895%20162.724%2017.6895C162.862%2017.6895%20163.004%2017.769%20162.999%2017.9228C163.031%2021.6452%20164.237%2025.585%20168.088%2027.6424C169.49%2028.3901%20171.24%2028.9416%20172.907%2028.9469C173.261%2028.9469%20173.261%2029.4294%20172.907%2029.4294H172.912Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M16.6094%2015.3511C16.3449%2015.3564%2016.0592%2015.3564%2015.7842%2015.3723H0V63.0001H12.1185V49.6535L12.9437%2049.855C14.155%2050.1466%2015.3875%2050.2951%2016.6094%2050.2951C21.4758%2050.2951%2025.5964%2048.5346%2028.5321%2045.2046C31.2669%2042.1026%2032.8643%2037.6962%2033.0336%2032.8019C33.224%2027.2819%2031.7958%2022.78%2028.913%2019.784C26.0936%2016.857%2021.9519%2015.367%2016.6094%2015.3564V15.3511ZM20.7617%2033.7192C20.2169%2036.1849%2018.2756%2038.1257%2015.8212%2038.6718C15.3134%2038.7832%2014.8109%2038.8415%2014.3137%2038.8415C13.7424%2038.8415%2013.1817%2038.7673%2012.6263%2038.6241L12.1291%2038.4915V25.9191L12.6316%2025.7919C12.6951%2025.776%2012.7532%2025.76%2012.8167%2025.7494C15.0807%2025.251%2017.3869%2025.9138%2018.995%2027.5258C20.603%2029.1378%2021.2642%2031.455%2020.767%2033.7245L20.7617%2033.7192Z%22%20fill%3D%22white%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22clip0_1119_2843%22%3E%3Crect%20width%3D%22200%22%20height%3D%2263%22%20fill%3D%22white%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E\"","/**\n * React hook for accessing color tokens programmatically\n * Useful when you need to use colors in JavaScript/TypeScript\n */\n\nimport { useTheme } from '../core/client-provider';\nimport type { ColorPrimitives } from '../core/color-system';\n\nexport interface ColorTokens {\n // Primitives\n primitives: Record<string, string>;\n // Semantic tokens\n semantic: Record<string, string>;\n}\n\n/**\n * Hook to access color tokens from the current theme\n * Returns resolved CSS variable values\n */\nexport function useColorTokens(): ColorTokens {\n const { currentTheme } = useTheme();\n\n // Helper to get computed CSS variable value\n const getCSSVar = (varName: string): string => {\n if (typeof window === 'undefined') return '';\n return getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n };\n\n // Convert color system to resolved values\n const primitives: Record<string, string> = {};\n const semantic: Record<string, string> = {};\n\n // Resolve primitives\n Object.keys(currentTheme.colors.primitives).forEach((key) => {\n const cssVar = `--color-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`;\n primitives[key] = getCSSVar(cssVar) || currentTheme.colors.primitives[key as keyof ColorPrimitives];\n });\n\n // Resolve semantic tokens (no prefix)\n Object.keys(currentTheme.colors.semantic).forEach((key) => {\n const cssVar = `--${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`;\n semantic[key] = getCSSVar(cssVar);\n });\n\n return { primitives, semantic };\n}\n\n/**\n * Hook to get a specific color token value\n * @param level - The color system level ('primitives' or 'semantic')\n * @param tokenName - The name of the token\n * @returns The resolved color value\n */\nexport function useColorToken(level: 'primitives' | 'semantic', tokenName: string): string {\n const tokens = useColorTokens();\n return tokens[level][tokenName] || '';\n}\n\n/**\n * Hook to get CSS variable name for a color token\n * Useful for inline styles\n */\nexport function useColorVar(level: 'primitives' | 'semantic', tokenName: string): string {\n const cssKey = tokenName.replace(/([A-Z])/g, '-$1').toLowerCase();\n if (level === 'primitives') {\n return `var(--color-${cssKey})`;\n }\n // Semantic tokens have no prefix\n return `var(--${cssKey})`;\n}\n","import React from 'react';\nimport './TeamCard.scss';\n\nexport interface AdvisorsTeamCardProps {\n name: string;\n title: string;\n company: string;\n imageUrl: string;\n imageAlt?: string;\n href?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\nexport const AdvisorsTeamCard = ({\n name,\n title,\n company,\n imageUrl,\n imageAlt,\n href,\n className,\n 'aria-label': ariaLabel,\n}: AdvisorsTeamCardProps) => {\n const Tag = href ? 'a' : 'div';\n const interactiveProps = href ? { href, 'aria-label': ariaLabel } : { 'aria-label': ariaLabel };\n const resolvedAlt = imageAlt ?? `${name}, ${title}`;\n\n return (\n <Tag className={`advisors-team-card${className ? ` ${className}` : ''}`} {...interactiveProps}>\n <div className=\"advisors-team-card__portrait\">\n <img className=\"advisors-team-card__photo\" src={imageUrl} alt={resolvedAlt} />\n <div className=\"advisors-team-card__overlay\">\n <div className=\"advisors-team-card__text\">\n <p className=\"advisors-team-card__name\">\n {name}, {title}\n </p>\n <p className=\"advisors-team-card__company\">{company}</p>\n </div>\n </div>\n </div>\n </Tag>\n );\n};\n","import React, { useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCircleXmark as faCircleXmarkSolid } from '@fortawesome/pro-solid-svg-icons';\nimport { faCircleXmark as faCircleXmarkRegular } from '@fortawesome/pro-regular-svg-icons';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './AlertBanner.scss';\n\nexport interface AlertBannerProps {\n /** The alert message as an HTML string (supports links, bold, etc.) */\n message: string;\n /** Whether the banner can be dismissed */\n dismissible?: boolean;\n /** Callback when the banner is dismissed */\n onDismiss?: () => void;\n /** Dark mode styling (default: true since banner has dark background) */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Accessible label for the dismiss button */\n dismissAriaLabel?: string;\n}\n\n/**\n * AlertBanner - A full-width notification banner for important announcements.\n * Displays a single line of rich text content with an optional dismiss button.\n */\nexport const AlertBanner: React.FC<AlertBannerProps> = ({\n message,\n dismissible = true,\n onDismiss,\n darkMode = true,\n className = '',\n dismissAriaLabel = 'Dismiss alert',\n}) => {\n const [isVisible, setIsVisible] = useState(true);\n\n const handleDismiss = () => {\n setIsVisible(false);\n onDismiss?.();\n };\n\n if (!isVisible) return null;\n\n return (\n <div className={`alert-banner ${className}`} data-dark-mode={darkMode} role=\"alert\" aria-live=\"polite\">\n <div className=\"alert-banner__content\">\n <div className=\"alert-banner__text-wrap\">\n <Paragraph\n as=\"p\"\n darkMode={darkMode}\n className=\"alert-banner__message\"\n dangerouslySetInnerHTML={{ __html: message }}\n />\n {dismissible && (\n <button\n className=\"alert-banner__dismiss\"\n onClick={handleDismiss}\n aria-label={dismissAriaLabel}\n type=\"button\"\n >\n <span className=\"alert-banner__dismiss-icon alert-banner__dismiss-icon--default\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={faCircleXmarkSolid} />\n </span>\n <span className=\"alert-banner__dismiss-icon alert-banner__dismiss-icon--hover\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={faCircleXmarkRegular} />\n </span>\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Paragraph } from '../Paragraph/Paragraph';\nimport './Author.scss';\n\nexport interface AuthorProps {\n /** Author bio/description text (plain text) */\n children?: string;\n /** Author bio as HTML string (supports inline links). Takes precedence over children. */\n html?: string;\n /** Label prefix displayed in bold before the bio. Defaults to \"Author:\" */\n label?: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Author component for attributing content to a person.\n * Renders a paragraph with a bold label prefix followed by the author bio text.\n * Supports plain text or rich HTML content (inline links, bold, italic).\n */\nexport const Author: React.FC<AuthorProps> = ({\n children,\n html,\n label = 'Author:',\n darkMode = false,\n className,\n style,\n}) => {\n const authorClasses = ['author', className].filter(Boolean).join(' ');\n\n if (html) {\n return (\n <Paragraph\n className={authorClasses}\n style={style}\n darkMode={darkMode}\n dangerouslySetInnerHTML={{ __html: `<strong class=\"author__label\">${label}</strong> ${html}` }}\n />\n );\n }\n\n return (\n <Paragraph className={authorClasses} style={style} darkMode={darkMode}>\n <strong className=\"author__label\">{label}</strong> {children}\n </Paragraph>\n );\n};\n","import React from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { Subscribe, SubscribeField } from '@/components/molecules/primax/Subscribe';\nimport { GridProps } from '@/components/atoms/Grid';\nimport './CTA.scss';\nimport { Container } from '@/components/atoms/Container';\n\ntype CTAVariant = 'small' | 'large';\ntype CTAAlignment = 'left' | 'center' | 'right';\n\nexport interface PrimaxCTAProps extends Omit<DividerProps, 'children'> {\n /** CTA variant - small (heading + button) or large (heading + subscribe form) */\n variant?: CTAVariant;\n /** Content alignment - left, center, or right */\n alignment?: CTAAlignment;\n /** CTA heading text */\n heading: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Button or link props for the small variant — pass `href` to render a ButtonLink */\n button?: ButtonProps | ButtonLinkProps;\n\n /* --- Subscribe form props (large variant) --- */\n /** Form heading displayed above the fields (large variant) */\n formHeading?: string;\n /** Form heading semantic level (large variant) */\n formHeadingLevel?: HeadingLevel;\n /** Form heading visual variant (large variant) */\n formHeadingVariant?: string;\n /** Form field configuration (large variant) */\n fields?: SubscribeField[];\n /** Grid columns for form fields (large variant) */\n columns?: GridProps['columns'];\n /** Grid gap for form fields (large variant) */\n gap?: GridProps['gap'];\n /** Grid row gap for form fields (large variant) */\n rowGap?: GridProps['rowGap'];\n /** Grid column gap for form fields (large variant) */\n columnGap?: GridProps['columnGap'];\n /** Submit button label (large variant) */\n submitLabel?: string;\n /** Loading state for form submission (large variant) */\n loading?: boolean;\n /** Disclaimer text below the form (large variant, supports HTML) */\n disclaimer?: string;\n /** Called with collected form data on valid submission (large variant) */\n onSubmit?: (data: Record<string, string>) => void;\n /** Async or cross-field validation (large variant) */\n onValidate?: (data: Record<string, string>) => Record<string, string> | null | Promise<Record<string, string> | null>;\n /** Called when validation fails (large variant) */\n onError?: (errors: Record<string, string>) => void;\n\n /** Fallback: custom content slot (overrides Subscribe when provided in large variant) */\n children?: React.ReactNode;\n /** Make the inner container full-width (no max-width constraint) */\n fluid?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nexport const BannerCTA: React.FC<PrimaxCTAProps> = ({\n variant = 'small',\n alignment = 'left',\n heading,\n headingLevel = 'h1',\n button,\n // Subscribe form props\n formHeading,\n formHeadingLevel,\n formHeadingVariant,\n fields,\n columns,\n gap,\n rowGap,\n columnGap,\n submitLabel,\n loading,\n disclaimer,\n onSubmit,\n onValidate,\n onError,\n // Layout\n children,\n fluid = false,\n className,\n backgroundColor = 'var(--color-primary-950)',\n backgroundPattern = 'sparks',\n shapeDivider = 'top',\n darkMode = true,\n ...dividerProps\n}) => {\n const ctaClass = ['primax-cta', `primax-cta--${variant}`, `primax-cta--${alignment}`, className]\n .filter(Boolean)\n .join(' ');\n\n const renderLargeContent = () => {\n // If children are provided, use them as a custom override\n if (children) {\n return <div className=\"primax-cta__form\">{children}</div>;\n }\n\n // Otherwise render the Subscribe component from props\n if (fields && fields.length > 0) {\n return (\n <div className=\"primax-cta__form\">\n <Subscribe\n heading={formHeading || heading}\n headingLevel={formHeadingLevel || 'h2'}\n headingVariant={formHeadingVariant}\n fields={fields}\n columns={columns}\n gap={gap}\n rowGap={rowGap}\n columnGap={columnGap}\n submitLabel={submitLabel}\n loading={loading}\n disclaimer={disclaimer}\n onSubmit={onSubmit}\n onValidate={onValidate}\n onError={onError}\n darkMode={darkMode}\n />\n </div>\n );\n }\n\n return null;\n };\n\n return (\n <Divider\n className={ctaClass}\n backgroundColor={backgroundColor}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n darkMode={darkMode}\n {...dividerProps}\n >\n <Container fluid={fluid} className=\"primax-cta__inner container\">\n <Heading level={headingLevel} variant=\"title\" darkMode={darkMode} className=\"primax-cta__heading\">\n {heading}\n </Heading>\n\n {variant === 'small' &&\n button &&\n ('href' in button ? (\n <ButtonLink\n buttonType={button.buttonType || 'general'}\n size={button.size || 'lg'}\n darkMode={darkMode}\n {...(button as ButtonLinkProps)}\n >\n {button.children || button.label}\n </ButtonLink>\n ) : (\n <Button\n buttonType={button.buttonType || 'general'}\n size={button.size || 'lg'}\n darkMode={darkMode}\n {...(button as ButtonProps)}\n >\n {button.children || button.label}\n </Button>\n ))}\n\n {variant === 'large' && renderLargeContent()}\n </Container>\n </Divider>\n );\n};\n","import React from 'react';\nimport './Blockquote.scss';\n\nexport interface BlockquoteProps {\n /** Quote text content */\n children: React.ReactNode;\n /** Optional citation source (renders as <cite>) */\n citation?: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Blockquote component for quoted content\n * Renders a styled blockquote with optional citation\n * Integrates with RichText component through shared tokens\n */\nexport const Blockquote: React.FC<BlockquoteProps> = ({ children, citation, darkMode = false, className, style }) => {\n const quoteClasses = ['blockquote', className].filter(Boolean).join(' ');\n\n return (\n <blockquote className={quoteClasses} style={style} data-dark-mode={darkMode ? 'true' : undefined}>\n <div className=\"blockquote__content\">{children}</div>\n {citation && <cite className=\"blockquote__citation\">{citation}</cite>}\n </blockquote>\n );\n};\n","import React from 'react';\nimport { BackgroundMedia } from '../../atoms/BackgroundMedia';\nimport { Button } from '../../atoms/Button/Button';\nimport { ButtonLink } from '../../atoms/ButtonLink';\nimport { Heading, HeadingLevel } from '../../atoms/Heading';\nimport './CTA.scss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faAnglesRight } from '@fortawesome/free-solid-svg-icons';\n\nexport interface CTAProps {\n /** Video URL for background */\n videoUrl?: string;\n /** Image URL for background */\n imageUrl?: string;\n /** CSS gradient overlay */\n gradient?: string;\n /** Background color */\n bgColor?: string;\n /** CTA title */\n title: string;\n /** Heading level */\n headingLevel?: HeadingLevel;\n /** CTA description */\n description?: string;\n /** Button text */\n buttonText: string;\n /** Button link */\n link?: string;\n /** External link flag */\n externalLink?: boolean;\n /** Link target */\n target?: '_blank' | '_self';\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/** CTA component with background media and content */\nexport const CTA: React.FC<CTAProps> = ({\n videoUrl,\n imageUrl,\n gradient,\n bgColor,\n title,\n headingLevel = 'h2',\n description,\n buttonText,\n link,\n externalLink,\n target = '_self',\n className,\n style,\n}) => {\n const ctaClasses = ['cta', className].filter(Boolean).join(' ');\n\n return (\n <div className={ctaClasses} style={style}>\n <BackgroundMedia videoUrl={videoUrl} imageUrl={imageUrl} gradient={gradient} bgColor={bgColor} />\n <div className=\"cta__content\">\n <Heading level={headingLevel} className=\"cta__title\">\n {title}\n </Heading>\n {description && <p className=\"cta__description\">{description}</p>}\n {link ? (\n <ButtonLink\n buttonType=\"cta\"\n label={buttonText}\n href={link}\n target={externalLink ? target : '_self'}\n icon={<FontAwesomeIcon icon={faAnglesRight} />}\n />\n ) : (\n <Button\n buttonType=\"cta\"\n label={buttonText}\n onClick={() => {}}\n icon={<FontAwesomeIcon icon={faAnglesRight} />}\n />\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport '../../molecules/Card/Card.scss';\n\nexport interface CardProps {\n children: React.ReactNode;\n maxWidth?: number | string;\n height?: number | string;\n width?: number | string;\n padding?: string;\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n href?: string;\n target?: '_blank' | '_self' | '_parent' | '_top';\n imageUrl?: string;\n imageAlt?: string;\n className?: string;\n style?: React.CSSProperties;\n aspectRatio?: string;\n borderRadius?: string;\n hoverEffect?: boolean;\n 'aria-label'?: string;\n 'data-testid'?: string;\n}\n\nexport const Card: React.FC<CardProps> = ({\n children,\n maxWidth = '',\n padding = '30px',\n onClick,\n href,\n target = '_self',\n imageUrl,\n imageAlt = '',\n className = '',\n style,\n aspectRatio = '3/2',\n borderRadius = '',\n hoverEffect = true,\n 'aria-label': ariaLabel,\n 'data-testid': testId,\n}) => {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if ((event.key === 'Enter' || event.key === ' ') && onClick) {\n event.preventDefault();\n onClick(event as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n const handleLinkClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (onClick) {\n onClick(event as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n const wrapperStyle: React.CSSProperties = {\n maxWidth,\n ...style,\n };\n\n const cardStyle: React.CSSProperties = {\n borderRadius,\n };\n\n const imageWrapperStyle: React.CSSProperties = {\n aspectRatio,\n borderRadius: `${borderRadius} ${borderRadius} 0 0`,\n };\n\n const bodyStyle: React.CSSProperties = {\n padding,\n };\n\n const cardClasses = ['card', hoverEffect && 'card--hover-effect', className].filter(Boolean).join(' ');\n\n const cardContent = (\n <div className={cardClasses} style={cardStyle} data-testid={testId}>\n {imageUrl && (\n <div className=\"card__image-wrapper\" style={imageWrapperStyle}>\n <div className=\"card__image-container\">\n <img src={imageUrl} alt={imageAlt} className=\"card__image\" loading=\"lazy\" />\n </div>\n </div>\n )}\n <div className=\"card__body\" style={bodyStyle}>\n {children}\n </div>\n </div>\n );\n\n if (href) {\n return (\n <div className=\"card-wrapper\" style={wrapperStyle}>\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n onClick={handleLinkClick}\n className=\"card__link\"\n style={{ borderRadius }}\n aria-label={ariaLabel}\n >\n {cardContent}\n </a>\n </div>\n );\n }\n\n if (onClick) {\n return (\n <div className=\"card-wrapper\" style={wrapperStyle}>\n <div\n className={cardClasses}\n style={cardStyle}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={ariaLabel}\n data-testid={testId}\n >\n {imageUrl && (\n <div className=\"card__image-wrapper\" style={imageWrapperStyle}>\n <div className=\"card__image-container\">\n <img src={imageUrl} alt={imageAlt} className=\"card__image\" loading=\"lazy\" />\n </div>\n </div>\n )}\n <div className=\"card__body\" style={bodyStyle}>\n {children}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"card-wrapper\" style={wrapperStyle}>\n {cardContent}\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { Button } from '@/components/atoms/Button';\nimport { TextInput } from '@/components/atoms/TextInput';\nimport { TextLink } from '@/components/atoms/TextLink';\nimport { FilterPill as FilterPillAtom } from '@/components/atoms/FilterPill';\nimport type { FilterPillStyle } from '@/components/atoms/FilterPill';\nimport { AssetMeta } from '@/components/molecules/AssetMeta';\nimport { DropdownSelect, DropdownSelectOption } from '@/components/molecules/primax/DropdownSelect';\nimport { PrimaxCard } from '@/components/molecules/primax/Card';\nimport type { ImageProps } from '@/components/atoms/Image';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport './FilterSection.scss';\nimport { Container } from '@/components/atoms/Container';\n\nexport interface FilterPillData {\n /** Unique identifier for the pill */\n id: string;\n /** Display label */\n label: string;\n /** Visual style variant (default: 'white') */\n pillStyle?: FilterPillStyle;\n}\n\nexport interface FilterDropdownConfig {\n /** Field name for the dropdown */\n name: string;\n /** Placeholder text */\n placeholder?: string;\n /** Available options */\n options: DropdownSelectOption[];\n /** Currently selected values (controlled) */\n value?: string[];\n}\n\nexport interface FilterResultCard {\n /** Unique identifier */\n id: string;\n /** Image configuration — renders via Image atom in PrimaxCard */\n image?: ImageProps;\n /** Asset type label (e.g. \"Article\", \"Video\") */\n assetType?: string;\n /** Duration in minutes */\n durationMinutes?: number;\n /** Timestamp string (e.g. \"01-30-45\") */\n timestamp?: string;\n /** Card title */\n title: string;\n /** Card destination URL */\n href: string;\n /** Button label text */\n buttonLabel?: string;\n}\n\nexport interface FilterSectionProps {\n /** Section title displayed above filters */\n title?: string;\n /** Heading level (default: 'h2') */\n headingLevel?: HeadingProps['level'];\n /** Heading variant (default: 'sectionDivider') */\n headingVariant?: HeadingProps['variant'];\n /** Filter dropdown configurations (including current selected values) */\n dropdowns?: FilterDropdownConfig[];\n /** Active filter pills (derived from selections by consumer) */\n activePills?: FilterPillData[];\n /** Search input placeholder */\n searchPlaceholder?: string;\n /** Current search input value (controlled) */\n searchValue?: string;\n /** Search button label */\n searchButtonLabel?: string;\n /** Result cards to display */\n results?: FilterResultCard[];\n /** Whether results section is visible (default: true) */\n showResults?: boolean;\n /** Number of columns for results grid */\n resultsColumns?: number;\n /** Number of results visible initially (default: 6) */\n initialCount?: number;\n /** Number of results to reveal per \"Load More\" click (default: 3) */\n loadMoreCount?: number;\n /** Load more button label (default: 'Load More') */\n loadMoreLabel?: string;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Callback when a dropdown selection changes */\n onDropdownChange?: (name: string, values: string[]) => void;\n /** Callback when search input value changes */\n onSearchChange?: (value: string) => void;\n /** Callback when search is submitted (button click or Enter) */\n onSearchSubmit?: () => void;\n /** Callback when a filter pill is dismissed */\n onPillDismiss?: (id: string) => void;\n /** Callback when \"Clear\" link is clicked */\n onClearAll?: () => void;\n}\n\n/**\n * FilterSection — A controlled, presentational molecule that composes:\n * - A section heading\n * - Filter dropdowns (multi-select)\n * - A search input with submit button\n * - Active filter pills (dismissible)\n * - A results grid of insight cards\n *\n * The component does NOT manage filter state internally.\n * The consuming page/container owns the state, handles filtering logic,\n * and passes everything via props. This follows atomic design principles\n * where molecules are presentational and pages orchestrate data flow.\n */\nexport const FilterSection: React.FC<FilterSectionProps> = ({\n title = 'Want More? Explore All Resources',\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n dropdowns = [],\n activePills = [],\n searchPlaceholder = 'Search',\n searchValue = '',\n searchButtonLabel = 'SEARCH',\n results = [],\n showResults = true,\n resultsColumns = 3,\n initialCount = 6,\n loadMoreCount = 3,\n loadMoreLabel = 'Load More',\n darkMode = false,\n className,\n onDropdownChange,\n onSearchChange,\n onSearchSubmit,\n onPillDismiss,\n onClearAll,\n}) => {\n const baseClass = 'filter-section';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n const [visibleCount, setVisibleCount] = useState(initialCount);\n\n // Reset visible count when results change (e.g. new filter applied)\n useEffect(() => {\n setVisibleCount(initialCount);\n }, [results, initialCount]);\n\n const visibleResults = results.slice(0, visibleCount);\n const hasMore = visibleCount < results.length;\n\n const handleLoadMore = (): void => {\n setVisibleCount((prev) => prev + loadMoreCount);\n };\n\n const handleSearchKeyDown = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter') {\n onSearchSubmit?.();\n }\n };\n\n return (\n <Container as=\"section\" className={classes} data-dark-mode={darkMode || undefined} aria-label={title}>\n {/* Title */}\n {title && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n )}\n\n {/* Filters area */}\n <div className={`${baseClass}__filters`}>\n {/* Active pills row */}\n {activePills.length > 0 && (\n <div className={`${baseClass}__pills-row`}>\n <ul className={`${baseClass}__pills`} role=\"list\" aria-label=\"Active filters\">\n {activePills.map((pill) => (\n <FilterPillAtom\n key={pill.id}\n label={pill.label}\n pillStyle={pill.pillStyle ?? 'white'}\n dismissible\n onDismiss={() => onPillDismiss?.(pill.id)}\n darkMode={darkMode}\n />\n ))}\n </ul>\n <span\n className={`${baseClass}__clear-link`}\n onClick={(e) => {\n e.preventDefault();\n onClearAll?.();\n }}\n aria-label=\"Clear all filters\"\n >\n <TextLink label=\"Clear\" darkMode={darkMode} href=\"#\" />\n </span>\n </div>\n )}\n\n {/* Dropdowns + Search row */}\n <div className={`${baseClass}__controls`}>\n {dropdowns.map((dropdown) => (\n <DropdownSelect\n key={dropdown.name}\n name={dropdown.name}\n placeholder={dropdown.placeholder ?? 'Select from below'}\n options={dropdown.options}\n value={dropdown.value}\n onChange={(values) => onDropdownChange?.(dropdown.name, values)}\n darkMode={darkMode}\n className={`${baseClass}__dropdown`}\n />\n ))}\n\n {/* Search input with button */}\n <div\n className={`${baseClass}__search`}\n onKeyDown={handleSearchKeyDown}\n role=\"search\"\n aria-label=\"Filter resources\"\n >\n <TextInput\n label=\"Search\"\n name=\"filter-search\"\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={(value) => onSearchChange?.(value)}\n hideLabel\n clearable\n darkMode={darkMode}\n className={`${baseClass}__search-input`}\n />\n <Button\n buttonType=\"general\"\n label={searchButtonLabel}\n darkMode={darkMode}\n onClick={onSearchSubmit}\n className={`${baseClass}__search-button`}\n />\n </div>\n </div>\n </div>\n\n {/* Results grid */}\n {showResults && visibleResults.length > 0 && (\n <Grid\n columns={{ sm: 1, md: 2, lg: resultsColumns }}\n gap=\"3.75rem\"\n alignItems=\"stretch\"\n className={`${baseClass}__results`}\n >\n {visibleResults.map((card) => (\n <GridItem key={card.id}>\n <PrimaxCard\n variant=\"image\"\n image={card.image}\n title={card.title}\n titleAs=\"p\"\n metadata={\n card.assetType || card.durationMinutes || card.timestamp ? (\n <AssetMeta\n assetType={card.assetType}\n duration={card.durationMinutes}\n date={card.timestamp}\n darkMode={darkMode}\n />\n ) : undefined\n }\n button={{ label: card.buttonLabel ?? 'submit' }}\n buttonVariant=\"general\"\n href={card.href}\n darkMode={darkMode}\n />\n </GridItem>\n ))}\n </Grid>\n )}\n\n {/* Empty state */}\n {showResults && results.length === 0 && (\n <Heading level=\"h3\" variant=\"sectionDivider\" darkMode={darkMode} className={`${baseClass}__empty`}>\n No results found\n </Heading>\n )}\n\n {/* Load More button */}\n {showResults && hasMore && (\n <div className={`${baseClass}__load-more`}>\n <Button\n buttonType=\"secondary\"\n label={loadMoreLabel}\n icon=\"sparkle\"\n iconPosition=\"trailing\"\n darkMode={darkMode}\n onClick={handleLoadMore}\n />\n </div>\n )}\n </Container>\n );\n};\n","import React from 'react';\nimport { Paragraph } from '../Paragraph/Paragraph';\nimport './Footnote.scss';\n\nexport interface FootnoteItem {\n /** Footnote marker/number (e.g., \"1\", \"2\", \"*\") */\n marker: string;\n /** Footnote content — plain text or HTML string (supports inline links) */\n content: string;\n}\n\nexport interface FootnoteProps {\n /** Array of footnote items with marker and content */\n items: FootnoteItem[];\n /** Label prefix displayed in bold before the footnotes. Defaults to \"Footnotes:\" */\n label?: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Footnote component for supplementary text annotations.\n * Renders a paragraph with a bold label followed by numbered footnote entries.\n * Each footnote displays its marker as a superscript followed by content (supports inline links via HTML).\n */\nexport const Footnote: React.FC<FootnoteProps> = ({\n items,\n label = 'Footnotes:',\n darkMode = false,\n className,\n style,\n}) => {\n const footnoteClasses = ['footnote', className].filter(Boolean).join(' ');\n\n return (\n <Paragraph className={footnoteClasses} style={style} darkMode={darkMode}>\n <strong className=\"footnote__label\">{label}</strong>{' '}\n {items.map((item, index) => (\n <React.Fragment key={index}>\n <sup className=\"footnote__marker\">{item.marker}</sup>\n <span className=\"footnote__text\" dangerouslySetInnerHTML={{ __html: item.content }} />\n {index < items.length - 1 && '\\n'}\n </React.Fragment>\n ))}\n </Paragraph>\n );\n};\n","import React from 'react';\nimport { TwoColumn, TwoColumnRow } from '../TwoColumn';\nimport { MediaBlock, MediaBlockProps } from '../MediaBlock';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { BulletList, BulletItem } from '@/components/atoms/BulletList';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { RichText } from '@/components/atoms/RichText';\nimport { DividerProps } from '@/components/atoms/Divider';\nimport './HalfColumn.scss';\n\nexport type HalfColumnVariant = 'sparkle' | 'video' | 'media';\n\nexport type HalfColumnMediaPosition = 'left' | 'right';\n\n/** Content configuration for the text side of a HalfColumn */\nexport interface HalfColumnContentProps {\n /** Rich text HTML content (renders via RichText component, takes priority over individual props) */\n richText?: string;\n /** Heading text */\n heading?: string;\n /** Heading level (default: 'h2') */\n headingLevel?: HeadingProps['level'];\n /** Heading variant (default: 'sectionDivider') */\n headingVariant?: HeadingProps['variant'];\n /** Paragraph text */\n paragraph?: string;\n /** Bullet list items */\n bulletItems?: BulletItem[];\n /** Custom icon for bullet list items */\n bulletIcon?: React.ReactNode;\n /** Button or link — pass `href` to render a ButtonLink, omit it to render a Button */\n button?: ButtonProps | ButtonLinkProps;\n}\n\nexport interface HalfColumnRow extends HalfColumnContentProps {\n /** Text/content side — rendered opposite the media (overrides prop-based content) */\n content?: React.ReactNode;\n /** Override the variant for this specific row */\n variant?: HalfColumnVariant;\n /** Override media props for this specific row */\n mediaProps?: Omit<MediaBlockProps, 'className'>;\n /** Which side the media appears on */\n mediaPosition?: HalfColumnMediaPosition;\n /** Vertical alignment of columns */\n verticalAlign?: 'top' | 'center' | 'bottom';\n}\n\nexport interface HalfColumnProps extends DividerProps, HalfColumnContentProps {\n /** Visual variant controlling the media block style */\n variant?: HalfColumnVariant;\n /** Props passed directly to MediaBlock (thumbnail, src, wistiaId, accentBorder, sparkle, etc.) */\n mediaProps?: Omit<MediaBlockProps, 'className'>;\n\n /* --- Layout --- */\n /** Which side the media appears on (single-row shorthand) */\n mediaPosition?: HalfColumnMediaPosition;\n /** Text/content for the non-media column (overrides prop-based content) */\n content?: React.ReactNode;\n /** Multiple rows of half-column content */\n rows?: HalfColumnRow[];\n /** Gap between columns */\n gap?: string | { xs?: string; sm?: string; md?: string; lg?: string };\n /** Additional class name */\n className?: string;\n}\n\n/**\n * HalfColumn — a pre-configured two-column layout with built-in media variants.\n *\n * Supports two content modes:\n * 1. **Prop-based** (recommended): Pass `heading`, `paragraph`, `bulletItems`, and `buttonLabel`\n * directly as props for a streamlined API.\n * 2. **RichText**: Pass an HTML string via `richText` for CMS-driven content.\n * 3. **Custom content**: Pass a `content` ReactNode for full control over the text column.\n *\n * Media is configured via `mediaProps` which accepts all MediaBlock props directly.\n *\n * Variants:\n * - `sparkle` — cropped spark media block (no video)\n * - `video` — video player with accent border, sparkle & overlay\n * - `media` — static image with accent border & sparkle\n */\nexport const HalfColumn: React.FC<HalfColumnProps> = ({\n variant = 'media',\n mediaProps = {},\n mediaPosition = 'right',\n content,\n rows,\n gap,\n className,\n richText,\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n paragraph,\n bulletItems,\n bulletIcon,\n button,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider = 'none',\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n ...rest\n}) => {\n /** Build the text content from props when no explicit `content` node is provided */\n const buildContent = (contentProps: HalfColumnContentProps, isDark: boolean): React.ReactNode => {\n const {\n richText: rt,\n heading: h,\n headingLevel: hl,\n headingVariant: hv,\n paragraph: p,\n bulletItems: bi,\n bulletIcon: bIcon,\n button: btn,\n } = contentProps;\n\n const renderButton = () => {\n if (!btn) return null;\n if ('href' in btn) {\n return (\n <div>\n <ButtonLink darkMode={isDark} {...(btn as ButtonLinkProps)}>\n {btn.children || btn.label}\n </ButtonLink>\n </div>\n );\n }\n return (\n <div>\n <Button darkMode={isDark} {...(btn as ButtonProps)}>\n {btn.children || btn.label}\n </Button>\n </div>\n );\n };\n\n // RichText takes priority over individual props\n if (rt) {\n return (\n <div className=\"primax-half-column__content\">\n <RichText content={rt} darkMode={isDark} />\n {renderButton()}\n </div>\n );\n }\n\n if (!h && !p && !bi && !btn) return null;\n\n return (\n <div className=\"primax-half-column__content\">\n {h && (\n <Heading level={hl || 'h2'} variant={hv || 'sectionDivider'} darkMode={isDark}>\n {h}\n </Heading>\n )}\n {p && <Paragraph darkMode={isDark}>{p}</Paragraph>}\n {bi && bi.length > 0 && <BulletList items={bi} icon={bIcon} darkMode={isDark} />}\n {renderButton()}\n </div>\n );\n };\n\n const buildMedia = (\n position: HalfColumnMediaPosition,\n rowVariant?: HalfColumnVariant,\n rowMediaProps?: Omit<MediaBlockProps, 'className'>\n ) => {\n const v = rowVariant ?? variant;\n const resolvedMediaProps = rowMediaProps ?? mediaProps;\n const shouldMirror = resolvedMediaProps.mirror ?? position === 'right';\n\n switch (v) {\n case 'sparkle':\n return (\n <MediaBlock\n variant=\"croppedSpark\"\n thumbnail={resolvedMediaProps.thumbnail}\n alt={resolvedMediaProps.alt || ''}\n />\n );\n case 'video':\n return <MediaBlock {...resolvedMediaProps} mirror={shouldMirror} />;\n case 'media':\n default:\n return <MediaBlock {...resolvedMediaProps} mirror={shouldMirror} />;\n }\n };\n\n // Wrap media in a marker div so CSS can identify and reorder it on mobile\n const wrapMedia = (mediaNode: React.ReactNode) => <div className=\"primax-half-column__media\">{mediaNode}</div>;\n\n // Resolve content for a row: explicit content node takes priority, then prop-based content\n const resolveRowContent = (row: HalfColumnRow): React.ReactNode => {\n if (row.content) return row.content;\n return buildContent(row, darkMode);\n };\n\n // Resolve top-level content: explicit content node takes priority, then prop-based content\n const resolveTopLevelContent = (): React.ReactNode => {\n if (content) return content;\n return buildContent(\n { richText, heading, headingLevel, headingVariant, paragraph, bulletItems, bulletIcon, button },\n darkMode\n );\n };\n\n // Build TwoColumn rows\n const resolvedRows: TwoColumnRow[] = rows\n ? rows.map((row) => {\n const pos = row.mediaPosition ?? mediaPosition;\n const media = wrapMedia(buildMedia(pos, row.variant, row.mediaProps));\n const rowContent = resolveRowContent(row);\n return {\n left: pos === 'left' ? media : rowContent,\n right: pos === 'right' ? media : rowContent,\n verticalAlign: row.verticalAlign,\n };\n })\n : (() => {\n const media = wrapMedia(buildMedia(mediaPosition));\n const topContent = resolveTopLevelContent();\n return [\n {\n left: mediaPosition === 'left' ? media : topContent,\n right: mediaPosition === 'right' ? media : topContent,\n verticalAlign: 'center' as const,\n },\n ];\n })();\n\n const baseClass = 'primax-half-column';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n return (\n <TwoColumn\n rows={resolvedRows}\n gap={gap}\n backgroundColor={backgroundColor}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n />\n );\n};\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faXmark } from '@fortawesome/free-solid-svg-icons';\nimport './Modal.scss';\n\nexport interface ModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback when the modal should close */\n onClose: () => void;\n /** Child elements rendered inside the modal content area */\n children: React.ReactNode;\n /** Additional CSS class name for the content area */\n className?: string;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Accessible label for the modal */\n ariaLabel?: string;\n /** Whether clicking the overlay closes the modal */\n closeOnOverlayClick?: boolean;\n /** Whether pressing Escape closes the modal */\n closeOnEscape?: boolean;\n /** Force bottom sheet layout regardless of device pointer type (useful for previews/Storybook) */\n forceBottomSheet?: boolean;\n /** Show close (X) button in the top-right corner of the modal */\n showCloseButton?: boolean;\n}\n\n/** Threshold in px — if dragged past this, dismiss the sheet */\nconst DISMISS_THRESHOLD = 150;\n/** Velocity threshold — fast swipe dismisses even if distance is short */\nconst VELOCITY_THRESHOLD = 0.5;\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n children,\n className = '',\n darkMode = false,\n size = 'md',\n ariaLabel,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n forceBottomSheet = false,\n showCloseButton = true,\n}) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Touch gesture state\n const [dragY, setDragY] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n const touchStartRef = useRef<{ y: number; time: number } | null>(null);\n\n const handleClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n /** Animate out then close */\n const dismissSheet = useCallback(() => {\n setIsClosing(true);\n // Wait for the slide-out animation to finish\n const timer = setTimeout(() => {\n setIsClosing(false);\n setDragY(0);\n handleClose();\n }, 300);\n return () => clearTimeout(timer);\n }, [handleClose]);\n\n // Sync open state with the native dialog element\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (isOpen && !dialog.open) {\n previousFocusRef.current = document.activeElement as HTMLElement;\n dialog.showModal();\n setIsClosing(false);\n setDragY(0);\n } else if (!isOpen && dialog.open) {\n dialog.close();\n previousFocusRef.current?.focus();\n }\n }, [isOpen]);\n\n // Handle native dialog close event (e.g. Escape key)\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (e: Event) => {\n if (!closeOnEscape) {\n e.preventDefault();\n return;\n }\n handleClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [closeOnEscape, handleClose]);\n\n // Touch gesture handlers for mobile bottom sheet\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n const touch = e.touches[0];\n touchStartRef.current = { y: touch.clientY, time: Date.now() };\n setIsDragging(true);\n }, []);\n\n const handleTouchMove = useCallback((e: React.TouchEvent) => {\n if (!touchStartRef.current) return;\n const touch = e.touches[0];\n const deltaY = touch.clientY - touchStartRef.current.y;\n // Only allow dragging downward\n if (deltaY > 0) {\n setDragY(deltaY);\n }\n }, []);\n\n const handleTouchEnd = useCallback(() => {\n if (!touchStartRef.current) return;\n\n const elapsed = (Date.now() - touchStartRef.current.time) / 1000; // seconds\n const velocity = dragY / elapsed; // px/s\n\n // Dismiss if dragged past threshold or fast swipe\n if (dragY > DISMISS_THRESHOLD || velocity > VELOCITY_THRESHOLD * 1000) {\n dismissSheet();\n } else {\n // Snap back\n setDragY(0);\n }\n\n setIsDragging(false);\n touchStartRef.current = null;\n }, [dragY, dismissSheet]);\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDialogElement>) => {\n if (closeOnOverlayClick && e.target === dialogRef.current) {\n handleClose();\n }\n };\n\n if (!isOpen) return null;\n\n const contentStyle: React.CSSProperties =\n dragY > 0\n ? {\n transform: `translateY(${dragY}px)`,\n transition: isDragging ? 'none' : undefined,\n }\n : {};\n\n return (\n <dialog\n ref={dialogRef}\n className={`modal ${isClosing ? 'modal--closing' : ''} ${className}`}\n data-dark-mode={darkMode || undefined}\n data-size={size}\n data-bottom-sheet={forceBottomSheet || undefined}\n aria-label={ariaLabel}\n onClick={handleOverlayClick}\n >\n <div ref={contentRef} className=\"modal__content\" style={contentStyle}>\n {/* Close button — visible only on desktop modal (hidden on bottom sheet) */}\n {showCloseButton && (\n <button className=\"modal__close-button\" onClick={handleClose} aria-label=\"Close modal\" type=\"button\">\n <FontAwesomeIcon icon={faXmark} />\n </button>\n )}\n {/* Drag handle — visible only on mobile via CSS */}\n <div\n className=\"modal__drag-handle\"\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n aria-hidden=\"true\"\n >\n <div className=\"modal__drag-indicator\" />\n </div>\n <div className=\"modal__body\">{children}</div>\n </div>\n </dialog>\n );\n};\n","import React from 'react';\nimport { Header } from '../molecules/Header/Header';\nimport './Page.scss';\n\ntype User = {\n name: string;\n};\n\nexport const Page: React.FC = () => {\n const [user, setUser] = React.useState<User>();\n\n return (\n <article>\n <Header\n user={user}\n onLogin={() => setUser({ name: 'Jane Doe' })}\n onLogout={() => setUser(undefined)}\n onCreateAccount={() => setUser({ name: 'Jane Doe' })}\n />\n\n <section className=\"storybook-page\">\n <h2>Pages in Storybook</h2>\n <p>\n We recommend building UIs with a{' '}\n <a href=\"https://componentdriven.org\" target=\"_blank\" rel=\"noopener noreferrer\">\n <strong>component-driven</strong>\n </a>{' '}\n process starting with atomic components and ending with pages.\n </p>\n </section>\n </article>\n );\n};\n","import React from 'react';\nimport './PlayButton.scss';\n\nexport interface PlayButtonProps {\n /** Custom icon element to render inside the play button wrapper.\n * When omitted, nothing renders — pass a tenant-specific icon\n * (e.g. primax PlayIcon) or any React node. */\n icon?: React.ReactNode;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Themeable play button wrapper.\n * Colors are driven by CSS custom properties so themes can override\n * default, hover, focus, and active states.\n *\n * Pass any SVG or React node as `icon` — the wrapper handles\n * sizing, positioning, and state-based color transitions.\n */\nexport const PlayButton: React.FC<PlayButtonProps> = ({ icon, darkMode = false, size, className, style }) => {\n const classes = ['play-button', className].filter(Boolean).join(' ');\n\n return (\n <span\n className={classes}\n style={style}\n data-dark-mode={darkMode || undefined}\n data-size={size || undefined}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n );\n};\n","import React from 'react';\n\n/**\n * Primax-branded play button SVG icon (matches public/play-button.svg).\n * Renders inline so fill colors can be controlled via CSS custom properties.\n *\n * Uses two class names for targeted theming:\n * - `.play-button__shadow` — the semi-transparent background triangle\n * - `.play-button__shape` — the outlined foreground triangle\n */\nexport const PlayIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 150 176\" aria-hidden=\"true\" {...props}>\n {/* Shadow / background layer */}\n <g className=\"play-button__shadow\">\n <path d=\"M0,175.6V.6l150,87.5L0,175.6Z\" />\n </g>\n {/* Foreground outlined play triangle */}\n <path\n className=\"play-button__shape\"\n d=\"M18.8,11.6l112.7,65.7,18.6,10.9-18.6,10.9L18.8,164.7,0,175.6V.6l18.8,10.9ZM18.8,143l94-54.8L18.8,33.3v109.7Z\"\n />\n </svg>\n);\n","import React, { useState } from 'react';\nimport { Button } from '@/components/atoms/Button';\nimport { Container } from '@/components/atoms/Container';\nimport { Heading } from '@/components/atoms/Heading';\nimport { PostItem, PostItemData } from './PostItem';\nimport './PostFeed.scss';\n\nexport interface PostFeedProps {\n /** Section title */\n title: string;\n /** Full array of posts — component manages visibility internally */\n posts: PostItemData[];\n /** Number of posts visible initially (including featured). Default: 4 */\n initialCount?: number;\n /** Number of posts to reveal per \"Load More\" click. Default: 4 */\n loadMoreCount?: number;\n /** Load more button label */\n loadMoreLabel?: string;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * PostFeed section component.\n * Renders all posts in a single grid, showing `initialCount` initially\n * and revealing more on each \"Load More\" click.\n *\n * Layout:\n * - Desktop: Two columns — featured post left (spans rows), regular posts right (horizontal layout, border dividers via CSS)\n * - Tablet: Featured full-width, regular posts in two-column grid (vertical layout)\n * - Mobile: Single column, vertical layout for all\n */\nexport const PostFeed: React.FC<PostFeedProps> = ({\n title,\n posts,\n initialCount = 4,\n loadMoreCount = 4,\n loadMoreLabel = 'Load More',\n className,\n}) => {\n const [visibleCount, setVisibleCount] = useState(initialCount);\n\n const featuredPost = posts.find((post) => post.isFeatured);\n const regularPosts = posts.filter((post) => !post.isFeatured);\n\n // Featured counts as 1 toward visible count\n const visibleRegularCount = featuredPost ? visibleCount - 1 : visibleCount;\n const visibleRegularPosts = regularPosts.slice(0, visibleRegularCount);\n\n // Tablet: if regular posts are odd, show one extra to fill the 2-column grid evenly\n const tabletExtraCount = visibleRegularCount % 2 !== 0 ? 1 : 0;\n const tabletExtraPosts =\n tabletExtraCount > 0 ? regularPosts.slice(visibleRegularCount, visibleRegularCount + tabletExtraCount) : [];\n\n const allVisiblePosts = [...(featuredPost ? [featuredPost] : []), ...visibleRegularPosts];\n\n const hasMore = visibleRegularPosts.length + tabletExtraPosts.length < regularPosts.length;\n\n const handleLoadMore = () => {\n setVisibleCount((prev) => prev + loadMoreCount);\n };\n\n const rootClasses = ['post-feed', className].filter(Boolean).join(' ');\n\n return (\n <section className={rootClasses} aria-label={title}>\n <Container>\n <Heading level=\"h3\" variant=\"sectionDivider\" className=\"post-feed__title\">\n {title}\n </Heading>\n\n <div className=\"post-feed__grid\">\n {allVisiblePosts.map((post) => (\n <div\n key={post.link.href}\n className={[\n 'post-feed__item',\n post.isFeatured ? 'post-feed__item--featured' : 'post-feed__item--regular',\n ].join(' ')}\n >\n <PostItem {...post} />\n </div>\n ))}\n\n {/* Extra posts visible only on tablet to fill the grid */}\n {tabletExtraPosts.map((post) => (\n <div key={post.link.href} className=\"post-feed__item post-feed__item--regular post-feed__item--tablet-only\">\n <PostItem {...post} />\n </div>\n ))}\n </div>\n\n {hasMore && (\n <div className=\"post-feed__load-more\">\n <Button\n buttonType=\"secondary\"\n label={loadMoreLabel}\n icon=\"sparkle\"\n iconPosition=\"trailing\"\n onClick={handleLoadMore}\n />\n </div>\n )}\n </Container>\n </section>\n );\n};\n","import React, { useState } from 'react';\nimport { Button } from '@/components/atoms/Button';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { Form } from '@/components/molecules/primax/Form';\nimport type { FormField } from '@/components/molecules/primax/Form';\nimport './SearchResults.scss';\n\n/** A single search result item */\nexport interface SearchResultItem {\n /** Category label (e.g., \"Product\", \"Blog\", \"White Paper\") */\n category: string;\n /** Result title */\n title: string;\n /** Result description/excerpt */\n description: string;\n /** Optional link URL */\n href?: string;\n}\n\nexport interface SearchResultsProps {\n /** Initial search query to display in the input */\n query?: string;\n /** List of search result items */\n results?: SearchResultItem[];\n /** Number of results visible initially. Default: all */\n initialCount?: number;\n /** Number of results to reveal per \"Load More\" click. Default: same as initialCount */\n loadMoreCount?: number;\n /** Load more button label */\n loadMoreLabel?: string;\n /** Callback when search is submitted */\n onSearch?: (query: string) => void;\n /** Callback when \"Load More\" is clicked */\n onLoadMore?: () => void;\n /** Callback when a result item is clicked */\n onResultClick?: (item: SearchResultItem, index: number) => void;\n /** Loading state */\n loading?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\nexport const SearchResults: React.FC<SearchResultsProps> = ({\n query = '',\n results = [],\n initialCount,\n loadMoreCount,\n loadMoreLabel = 'LOAD MORE',\n onSearch,\n onLoadMore,\n onResultClick,\n loading = false,\n darkMode = false,\n className,\n}) => {\n const [visibleCount, setVisibleCount] = useState(initialCount ?? results.length);\n\n const visibleResults = initialCount ? results.slice(0, visibleCount) : results;\n const hasMore = visibleResults.length < results.length;\n const resultCount = results.length;\n const classes = ['primax-search-results', className].filter(Boolean).join(' ');\n\n const handleLoadMore = () => {\n const increment = loadMoreCount ?? initialCount ?? results.length;\n setVisibleCount((prev) => Math.min(prev + increment, results.length));\n onLoadMore?.();\n };\n\n const searchFields: FormField[] = [\n {\n name: 'search',\n label: 'Search',\n type: 'text',\n placeholder: 'Search',\n hideLabel: true,\n },\n ];\n\n const handleFormSubmit = (data: Record<string, string>) => {\n onSearch?.(data.search ?? '');\n };\n\n return (\n <section className={classes} data-dark-mode={darkMode || undefined} aria-label=\"Search results\">\n {/* Results Heading */}\n {resultCount > 0 && (\n <Heading level=\"h2\" variant=\"sectionDivider\" className=\"primax-search-results__heading\">\n {resultCount} search result{resultCount !== 1 ? 's' : ''} for “{query}”\n </Heading>\n )}\n\n {/* Search Bar */}\n <Form\n fields={searchFields}\n columns=\"1fr auto\"\n submitLabel=\"SEARCH\"\n submitColSpan=\"auto\"\n loading={loading}\n onSubmit={handleFormSubmit}\n darkMode={darkMode}\n className=\"primax-search-results__search-bar\"\n />\n\n {/* Results List */}\n {visibleResults.length > 0 && (\n <div className=\"primax-search-results__list\" role=\"list\">\n {visibleResults.map((item, index) => (\n <div key={index} className=\"primax-search-results__item\" role=\"listitem\">\n <Paragraph className=\"primax-search-results__category\" weight=\"bold\">\n {item.category}\n </Paragraph>\n {item.href ? (\n <a\n href={item.href}\n className=\"primax-search-results__title-link\"\n onClick={(e) => {\n if (onResultClick) {\n e.preventDefault();\n onResultClick(item, index);\n }\n }}\n >\n <Paragraph className=\"primax-search-results__title\" variant=\"bodyBold\">\n {item.title}\n </Paragraph>\n </a>\n ) : (\n <Paragraph className=\"primax-search-results__title\" variant=\"bodyBold\">\n {item.title}\n </Paragraph>\n )}\n <Paragraph className=\"primax-search-results__description\" variant=\"body\">\n {item.description}\n </Paragraph>\n <div className=\"primax-search-results__divider\" aria-hidden=\"true\" />\n </div>\n ))}\n </div>\n )}\n\n {/* Load More Button */}\n {hasMore && (\n <div className=\"primax-search-results__load-more\">\n <Button buttonType=\"secondary\" label={loadMoreLabel} onClick={handleLoadMore} disabled={loading} />\n </div>\n )}\n </section>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, ButtonProps } from '@/components/atoms/Button/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink/ButtonLink';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Media } from '@/components/atoms/Media';\nimport { AssetMeta } from '@/components/molecules/AssetMeta';\nimport { TextLink } from '@/components/atoms/TextLink';\nimport { socialIconRegistry, type SocialPlatform } from '@/components/molecules/primax/Footer';\nimport './SideBar.scss';\n\nexport interface SideBarSocialLink {\n /** Social platform key — uses the same platforms as the Footer */\n platform: SocialPlatform;\n /** URL for the social link */\n href: string;\n /** Accessible label (defaults to platform name) */\n ariaLabel?: string;\n}\n\nexport interface SideBarAsset {\n /** Asset category label (e.g., \"Article\", \"Webinar\") */\n category: string;\n /** Reading/viewing duration (e.g., \"12 Mins\") */\n duration?: string;\n /** Date string (e.g., \"01-15-25\") */\n date?: string;\n /** Asset title */\n title: string;\n /** Link configuration for the asset */\n link?: React.AnchorHTMLAttributes<HTMLAnchorElement>;\n /** Whether the title is visible */\n showTitle?: boolean;\n}\n\nexport interface SideBarCTA {\n /** CTA heading text */\n title: string;\n /** CTA button or link — pass `href` to render a ButtonLink */\n button: ButtonProps | ButtonLinkProps;\n}\n\nexport interface SideBarProps {\n /** Hero image source URL */\n imageSrc?: string;\n /** Hero image alt text */\n imageAlt?: string;\n /** Social sharing links */\n socialLinks?: SideBarSocialLink[];\n /** Recommended next assets */\n assets?: SideBarAsset[];\n /** CTA section configuration */\n cta?: SideBarCTA;\n /** Additional CSS class */\n className?: string;\n}\n\nexport const SideBar: React.FC<SideBarProps> = ({\n imageSrc,\n imageAlt = '',\n socialLinks = [],\n assets = [],\n cta,\n className = '',\n}) => {\n const classes = ['primax-sidebar', className].filter(Boolean).join(' ');\n\n return (\n <aside className={classes} aria-label=\"Sidebar\">\n {/* Hero Image */}\n {imageSrc && (\n <div className=\"primax-sidebar__image\">\n <Media src={imageSrc} alt={imageAlt} objectFit=\"cover\" loading=\"lazy\" />\n </div>\n )}\n\n {/* Content Area */}\n <div className=\"primax-sidebar__content\">\n <div className=\"primax-sidebar__inner\">\n {/* Share This Section */}\n {socialLinks.length > 0 && (\n <div className=\"primax-sidebar__socials-wrap\">\n <Heading level=\"h4\" variant=\"componentTitle\" className=\"primax-sidebar__section-title\">\n Share This\n </Heading>\n <div className=\"primax-sidebar__social-icons\" role=\"list\" aria-label=\"Social sharing links\">\n {socialLinks.map((social, index) => {\n const iconDef = socialIconRegistry[social.platform];\n return (\n <a\n key={index}\n href={social.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"primax-sidebar__social-link\"\n role=\"listitem\"\n aria-label={social.ariaLabel || `Share on ${social.platform}`}\n >\n <FontAwesomeIcon icon={iconDef} />\n </a>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Recommended Next Section */}\n {assets.length > 0 && (\n <>\n <Heading level=\"h4\" variant=\"componentTitle\" className=\"primax-sidebar__section-title\">\n Recommended Next\n </Heading>\n <div className=\"primax-sidebar__list\">\n {assets.map((asset, index) => {\n const { href, target, ...linkRest } = asset.link || {};\n const linkType = target === '_blank' ? 'external' : 'in-text';\n\n return (\n <React.Fragment key={index}>\n <article className=\"primax-sidebar__asset\">\n <AssetMeta\n assetType={asset.category}\n duration={asset.duration}\n date={asset.date}\n className=\"primax-sidebar__asset-meta\"\n />\n {asset.showTitle !== false && (\n <TextLink\n label={asset.title}\n href={href}\n linkType={linkType}\n disabled={!href}\n className=\"primax-sidebar__asset-title\"\n {...linkRest}\n />\n )}\n </article>\n {index < assets.length - 1 && <hr className=\"primax-sidebar__divider\" />}\n </React.Fragment>\n );\n })}\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* CTA Section */}\n {cta && (\n <div className=\"primax-sidebar__cta\">\n <div className=\"primax-sidebar__cta-inner\">\n <Heading level=\"h4\" variant=\"componentTitle\" darkMode className=\"primax-sidebar__cta-title\">\n {cta.title}\n </Heading>\n {'href' in cta.button ? (\n <ButtonLink darkMode {...(cta.button as ButtonLinkProps)} />\n ) : (\n <Button darkMode {...(cta.button as ButtonProps)} />\n )}\n </div>\n </div>\n )}\n </aside>\n );\n};\n","import React from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { BulletList, BulletItem } from '@/components/atoms/BulletList';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { MediaBlock, MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport './VideoSection.scss';\n\nexport type VideoSectionVariation = 'media-first' | 'content-first';\n\nexport interface VideoSectionProps {\n /** Layout variation: media on left or right */\n variation?: VideoSectionVariation;\n /** Section heading text */\n heading: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Description text below the heading */\n description?: string;\n /** List of bullet items rendered via BulletList atom */\n bulletPoints?: BulletItem[];\n /** Shared icon for all bullet points (can be overridden per-item) */\n bulletIcon?: React.ReactNode;\n /** Button props */\n button?: ButtonProps;\n /** Media block props (video/image with accent border, sparkle, etc.) */\n media: MediaBlockProps;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nexport const VideoSection: React.FC<VideoSectionProps> = ({\n variation = 'media-first',\n heading,\n headingLevel = 'h2',\n description,\n bulletPoints,\n bulletIcon,\n button,\n media,\n darkMode = false,\n className,\n}) => {\n const baseClass = 'primax-video-section';\n const classes = [baseClass, `${baseClass}--${variation}`, className].filter(Boolean).join(' ');\n\n const contentBlock = (\n <div className={`${baseClass}__content`}>\n <div className={`${baseClass}__text-content`}>\n <Heading level={headingLevel} variant=\"sectionDivider\" darkMode={darkMode} className={`${baseClass}__heading`}>\n {heading}\n </Heading>\n\n {description && (\n <Paragraph className={`${baseClass}__description`} darkMode={darkMode}>\n {description}\n </Paragraph>\n )}\n\n {bulletPoints && bulletPoints.length > 0 && (\n <BulletList items={bulletPoints} icon={bulletIcon} darkMode={darkMode} />\n )}\n </div>\n\n {button && (\n <Button buttonType={button.buttonType || 'general'} size={button.size || 'lg'} darkMode={darkMode} {...button}>\n {button.children || button.label}\n </Button>\n )}\n </div>\n );\n\n const mediaBlock = (\n <div className={`${baseClass}__media`}>\n <MediaBlock {...media} />\n </div>\n );\n\n return (\n <section className={classes} data-dark-mode={darkMode || undefined}>\n <div className={`${baseClass}__inner`}>\n {variation === 'media-first' ? (\n <>\n {mediaBlock}\n {contentBlock}\n </>\n ) : (\n <>\n {contentBlock}\n {mediaBlock}\n </>\n )}\n </div>\n </section>\n );\n};\n"],"names":["iconRegistry","faArrowRight","faCirclePlaySolid","play","faPlay","download","faDownload","resolveIcon","icon","iconDef","jsx","FontAwesomeIcon","defaultButtonIcons","video","regular","faCirclePlayRegular","hover","subscribe","faEnvelopeRegular","faEnvelopeSolid","cta","faAnglesRight","twitter","faXTwitter","linkedin","faLinkedin","facebook","faSquareFacebook","getButtonIcon","buttonType","customIcon","customHoverIcon","themeName","faSparkle","faSparkles","defaultColorSystem","primitives","semantic","primary","primaryHover","primaryActive","primaryText","secondary","secondaryHover","secondaryActive","secondaryText","accent","accentHover","accentActive","accentText","tertiary","tertiaryHover","tertiaryActive","tertiaryText","textPrimary","textSecondary","textAccent","textTertiary","textInverse","textDisabled","textLink","textLinkHover","bgPrimary","bgSecondary","bgTertiary","bgInverse","bgOverlay","borderDefault","borderSubtle","borderStrong","borderFocus","stateSuccess","stateSuccessHover","stateSuccessBg","stateWarning","stateWarningHover","stateWarningBg","stateError","stateErrorHover","stateErrorBg","stateInfo","stateInfoHover","stateInfoBg","interactivePrimary","interactivePrimaryHover","interactivePrimaryActive","interactiveSecondary","interactiveSecondaryHover","interactiveSecondaryActive","interactiveDisabled","defaultTheme","name","fontImportUrl","colors","colorPalettes","bg","text","spacing","xs","sm","md","lg","xl","xxl","borderRadius","shadows","breakpoints","typography","fontFamily","fontFamilyHeading","fontFamilyMono","fontSizeXs","fontSizeSm","fontSizeMd","fontSizeLg","fontSizeXl","fontSize2xl","fontWeightLight","fontWeightRegular","fontWeightSemibold","fontWeightBold","fontWeightBlack","lineHeightTight","lineHeightSnug","lineHeightNormal","lineHeightRelaxed","lineHeightLoose","letterSpacingTighter","letterSpacingTight","letterSpacingNormal","letterSpacingWide","letterSpacingWider","letterSpacingWidest","variants","display","fontSize","fontWeight","lineHeight","letterSpacing","mobile","tablet","bodyDefault","bodyLarge","bodySmall","lead","caption","textTransform","overline","pageTitle","sectionTitle","title","subtitle","body","textlink","textDecoration","bodyBold","bodyBoldLarge","components","card","background","border","shadow","padding","header","borderBottom","height","titleFontWeight","titleFontSize","titleLineHeight","descriptionLineHeight","descriptionFontWeight","descriptionFontSize","descriptionMargin","componentTokens","button","borderWidth","focusOutline","focusOutlineOffset","disabledOpacity","hoverAnimation","general","bgHover","bgActive","textHover","borderHover","secondaryDarkMode","maxWidth","borderActive","imageWrapperBorderRadius","imageAspectRatio","grid","gapXs","gapSm","gapMd","gapLg","gapXl","gapXxl","titleColor","titleMargin","welcomeColor","welcomeFontSize","welcomeMargin","buttonSpacing","contentBg","contentMaxWidth","contentBorderRadius","contentPadding","titleFontFamily","descriptionColor","descriptionFontFamily","size","fillPrimary","strokePrimary","strokeWidthPrimary","fillSecondary","strokeSecondary","strokeWidthSecondary","fillAccent","strokeAccent","strokeWidthAccent","fillSuccess","strokeSuccess","strokeWidthSuccess","fillWarning","strokeWarning","strokeWidthWarning","fillError","strokeError","strokeWidthError","sizes","heading","margin","color","h1FontSize","h1FontWeight","h1LineHeight","h1LetterSpacing","h2FontSize","h2FontWeight","h2LineHeight","h2LetterSpacing","h3FontSize","h3FontWeight","h3LineHeight","h3LetterSpacing","h4FontSize","h4FontWeight","h4LineHeight","h5FontSize","h5FontWeight","h5LineHeight","h6FontSize","h6FontWeight","h6LineHeight","displayFontSize","displayFontWeight","displayLineHeight","displayLetterSpacing","bodyDefaultFontSize","bodyDefaultFontWeight","bodyDefaultLineHeight","bodyDefaultLetterSpacing","bodyDefaultFontFamily","leadFontSize","leadFontWeight","leadLineHeight","leadLetterSpacing","captionFontSize","captionFontWeight","captionLineHeight","captionLetterSpacing","captionTextTransform","overlineFontSize","overlineFontWeight","overlineLineHeight","overlineLetterSpacing","overlineTextTransform","pageTitleFontSize","pageTitleFontWeight","pageTitleLineHeight","pageTitleLetterSpacing","pageTitleTextTransform","pageTitleColor","sectionTitleFontSize","sectionTitleFontWeight","sectionTitleLineHeight","sectionTitleLetterSpacing","titleLetterSpacing","subtitleFontSize","subtitleFontWeight","subtitleLineHeight","bodyFontSize","bodyFontWeight","bodyLineHeight","textlinkFontSize","textlinkFontWeight","textlinkLineHeight","textlinkFontFamily","textlinkTextDecoration","textlinkTextTransform","bodyBoldFontSize","bodyBoldFontWeight","bodyBoldLineHeight","bodyBoldFontFamily","bodyLargeFontSize","bodyLargeFontWeight","bodyLargeLineHeight","bodyLargeFontFamily","bodyBoldLargeFontSize","bodyBoldLargeFontWeight","bodyBoldLargeLineHeight","bodyBoldLargeFontFamily","bodySmallFontSize","bodySmallFontWeight","bodySmallLineHeight","bodySmallFontFamily","dark","colorHover","colorFocus","textDecorationFocus","textDecorationStyleFocus","colorActive","colorVisited","richText","headingMarginBottom","paragraphFontSize","paragraphFontWeight","paragraphLineHeight","paragraphMarginBottom","paragraphColor","listMargin","listPaddingLeft","listItemFontSize","listItemLineHeight","listItemMarginBottom","listItemColor","ulListStyleType","olListStyleType","strongFontWeight","codeFontSize","codeBg","codePadding","preFontSize","preBg","prePadding","blockquoteMargin","blockquotePadding","blockquoteBorderLeft","blockquoteColor","hrBorder","hrMargin","blockquote","borderLeft","fontStyle","borderPrimaryWidth","borderSecondaryWidth","borderColorPrimary","borderColorSecondary","citationMarginTop","citationFontSize","citationFontWeight","citationColor","citationPrefix","footnote","labelFontWeight","markerFontSize","markerFontWeight","author","media","objectFit","objectPosition","aspectRatio","videoPlayer","thumbnailBg","placeholderBg","playIconSize","playIconBg","playIconBorder","playIconColor","paragraph","modal","overlayBg","contentBorder","width","closeButtonTop","closeButtonRight","closeButtonSize","closeButtonBorderRadius","closeButtonBg","closeButtonColor","closeButtonBgHover","closeButtonColorHover","closeButtonFontSize","dataDial","ringBg","ringTrack","ringProgress","valueFontSize","percentFontSize","statPill","paddingY","paddingX","toKebabCase","str","test","toLowerCase","replace","objectToCSSVars","obj","prefix","Object","entries","filter","value","map","key","cssKey","startsWith","generateThemeCSS","theme","selector","css","colorSystem","sections","push","legacyVars","oldVar","newKey","Boolean","join","generateColorSystemCSS","typographyCSS","typographyBase","forEach","variantName","variantStyles","desktopStyles","prop","propKey","variantKey","length","generateTypographyCSS","vars","darkSections","sizeSections","breakpointKeys","darkSelector","componentName","componentProps","componentPrefix","camelToKebab","propValue","includes","cssVarName","sizeName","sizeProps","sizeSelector","variantProps","variantKebab","match","baseProp","state","breakpoint","breakpointProps","values","sizeSection","hasDarkContent","hasSizeContent","keys","result","generateComponentTokensCSS","ThemeContext","createContext","useTheme","context","useContext","Error","ThemeProvider","children","initialTheme","initialThemeName","useEffect","style","document","getElementById","createElement","id","fontImport","Array","isArray","url","textContent","head","contains","appendChild","applyThemeCSS","documentElement","setAttribute","currentTheme","Provider","Button","palette","label","hoverIcon","iconPosition","className","disabled","darkMode","animated","onClick","props","buttonClass","iconConfig","resolvedIconPosition","paletteStyle","backgroundColor","borderColor","iconNode","jsxs","Fragment","type","ButtonLink","href","target","rel","TextLink","linkType","ariaLabel","ariaDescribedBy","testId","isExternal","typeClass","resolvedIcon","event","preventDefault","onKeyDown","BackgroundMedia","videoUrl","imageUrl","gradient","bgColor","baseClasses","autoPlay","muted","loop","playsInline","src","backgroundStyle","backgroundImage","WISTIA_SCRIPT_ID","Media","alt","autoplay","controls","loading","srcSet","providers","onLoad","onError","onReady","videoRef","useRef","wistiaDivRef","isClient","setIsClient","useState","isWistiaReady","setIsWistiaReady","resolvedType","isWistiaId","detectMediaType","resolvedMuted","wistiaId","extractWistiaId","isWistia","script","async","window","_wq","current","catch","baseClass","classes","cssVars","wistiaOptions","ref","visibility","providerResult","options","provider","embedUrl","buildEmbedUrl","providerName","resolveCustomProvider","allow","allowFullScreen","onLoadedData","Breadcrumb","items","separator","item","index","isLast","Divider","backgroundPattern","shapeDivider","shapeColor","verticalAlign","overflow","dividerClasses","Container","fluid","as","Tag","Heading","level","variant","weight","finalStyle","headingClasses","Grid","columns","gap","rowGap","columnGap","minColumnWidth","maxColumnWidth","alignItems","justifyItems","justifyContent","columnAlign","fullWidth","gridClass","gridStyles","toString","gridTemplateColumns","gapMap","GridItem","colSpan","rowSpan","colStart","rowStart","itemStyles","gridColumn","gridRow","gridColumnStart","gridRowStart","Icon","svg","fill","stroke","strokeWidth","decorative","customStyles","role","RichText","content","richTextClasses","dangerouslySetInnerHTML","__html","Paragraph","commonProps","defaultIcon","viewBox","xmlns","cx","cy","r","BulletList","itemIcon","FilterPill","pillStyle","dismissible","onDismiss","faCircleXmark","AssetMeta","assetType","duration","date","durationText","metaParts","metaLine","Image","decoding","DefaultChevron","faChevronDown","Accordion","defaultOpenIndex","allowMultiple","chevronIcon","onToggle","baseId","useId","openItems","setOpenItems","Set","handleToggle","useCallback","itemId","prev","next","isCurrentlyOpen","has","delete","clear","add","isOpen","headerId","panelId","AccordionItemPanel","contentRef","contentHeight","setContentHeight","scrollHeight","Header","user","onLogin","onLogout","onCreateAccount","fillRule","d","WISTIA_PLAYER_SCRIPT","wistiaScriptLoaded","wistiaScriptLoading","wistiaLoadCallbacks","WISTIA_PLAYER_SCRIPT_ID","MediaBlock","thumbnail","playIcon","accentBorder","overlay","sparkle","accentColor","sparkSrc","sparkScale","mirror","popover","sparkSmallSrc","isPlaying","setIsPlaying","videoHandleRef","videoContainerRef","isPopover","videoSrc","hasVideo","isVideoSource","isImage","loadWistiaPlayerScript","mediaId","moduleId","loadWistiaMediaModule","handleVideoReady","handle","handlePlay","videoEl","querySelector","sparkPath","x","y","clipPath","React","aspect","BANNER_CONFIG","hero","videoBackground","level2","level2Video","gated","level3","mapVerticalAlignment","alignment","top","center","bottom","renderColumnMedia","mediaBlockProps","TextInput","placeholder","onChange","onBlur","validation","error","hideLabel","clearable","errorId","isRequired","required","showClear","htmlFor","e","minLength","maxLength","tabIndex","faXmark","Dropdown","controlledOpen","displayValue","listboxId","containerRef","internalOpen","setInternalOpen","handleClickOutside","addEventListener","removeEventListener","handleKeyDown","faChevronUp","Checkbox","checked","faSquareCheck","faSquare","DropdownSelect","controlledValue","internalValue","setInternalValue","selectedValues","handleToggleOption","optionValue","v","handleDropdownClose","option","EMAIL_RE","validateField","field","dropdownValidation","custom","errorMessage","selections","split","minSelections","maxSelections","trim","email","pattern","Form","headingLevel","headingVariant","fields","submitLabel","submitColSpan","disclaimer","onSubmit","onValidate","formRef","setValues","fromEntries","f","dropdownValues","setDropdownValues","errors","setErrors","touched","setTouched","handleChange","handleDropdownChange","selected","handleBlur","err","handleSubmit","fieldErrors","assign","hasErrors","noValidate","requestSubmit","VARIANT_CONFIG","useDivider","isDark","light","white","Subscribe","config","resolvedDarkMode","formContent","verticalAlignMap","TwoColumn","left","right","rows","variation","_children","rest","resolvedRows","row","rowVariation","rowAlign","isReversed","order","Card","image","titleAs","description","metadata","textAlign","buttonVariant","resolvedTitleAs","cardClasses","IconListItem","iconPrefix","OverflowMediaSection","mediaPosition","stackAt","shouldMirror","mediaColumn","contentColumn","PostItem","imageAlt","link","isFeatured","rootClasses","resolvedRel","variantConfig","grey","greyAngled","socialIconRegistry","HeaderNavGroup","group","classPrefix","links","linkIndex","HeaderOverlay","navItem","showSearch","searchOpen","searchClosing","searchFormRef","onToggleSearch","searchFields","searchSubmitLabel","onSearch","onMouseEnter","onMouseLeave","faMagnifyingGlass","groups","groupIndex","sideContent","featuredImage","HeaderMobileNav","navItems","expandedItems","expandedGroups","onToggleItem","onToggleGroup","isExpanded","hasChildren","groupKey","isGroupExpanded","DEFAULT_SEARCH_FIELDS","socialIconMap","instagram","faInstagram","QuoteMarkSvg","SliderCard","quote","position","company","initials","w","toUpperCase","slice","StandaloneCard","imageSrc","DataDial","unit","progressColor","trackColor","valueColor","ringWidth","disableAnimation","clamped","Math","min","max","radius","circumference","PI","innerRadius","prefersReducedMotion","matchMedia","matches","skipAnimation","animatedValue","setAnimatedValue","hasAnimated","rafRef","el","observer","IntersectionObserver","entry","isIntersecting","start","performance","now","tick","elapsed","progress","eased","pow","requestAnimationFrame","runAnimation","threshold","observe","disconnect","cancelAnimationFrame","offset","strokeDasharray","strokeDashoffset","round","StatPill","stat","direction","faArrowDown","faArrowUp","PercentDialCard","testimonialBg","Pagination","totalPages","currentPage","onPrev","onNext","onPageSelect","faChevronLeft","from","_","i","faChevronRight","parseGapPx","gapStr","val","parseFloat","advisorsPlusColorSystem","primaryDisabled","danger","dangerHover","dangerActive","textOnBrand","textNav","textSubheading","textLinkActive","textLinkVisited","linkFocusRing","linkFocusText","sectionBg","surfaceSubtle","borderDivider","borderWhite","successMain","successMainHover","successMainActive","successText","successTextOnTint","warningMain","warningMainHover","warningMainActive","warningText","infoMain","infoMainHover","infoMainActive","infoText","breadcrumbDefault","breadcrumbHover","breadcrumbActive","breadcrumbFocusRing","breadcrumbCurrent","dialCardGradientStart","dialCardGradientEnd","dialCardOverlay","dialCardStroke","dialRingTrack","dialRingProgress","advisorsPlusTheme","iconsData","subTitle","buttonText","bodyLrg","bodyLrgBold","iconDataPct","iconDataNumber","focusOutlinePrimary","focusOutlinePrimaryGhost","focusOutlineSecondary","focusOutlineSecondaryGhost","focusOutlineDanger","focusOutlineDangerGhost","focusOutlineSuccess","focusOutlineSuccessGhost","focusOutlineWarning","focusOutlineWarningGhost","focusOutlineInfo","focusOutlineInfoGhost","transition","faWidth","bgDisabled","borderDisabled","primaryGhost","secondaryGhost","dangerGhost","success","successGhost","warning","warningGhost","info","infoGhost","textDecorationHover","external","footer","borderTop","paddingVertical","paddingHorizontal","socialGap","socialIconSize","socialIconFontSize","socialIconBorder","socialIconBorderRadius","socialIconPadding","linkFontSize","linkFontWeight","linkLineHeight","linkHoverOpacity","copyrightFontSize","copyrightFontWeight","copyrightLineHeight","breadcrumb","linkColor","linkHoverColor","linkActiveColor","linkActiveFontWeight","textDecorationActive","focusColor","lastItemColor","lastItemFontWeight","separatorColor","iconsDataFontSize","iconsDataFontWeight","iconsDataLineHeight","iconsDataFontFamily","iconDataNumberFontSize","iconDataNumberFontWeight","iconDataNumberLineHeight","iconDataNumberLetterSpacing","iconDataNumberFontFamily","iconDataPctFontSize","iconDataPctFontWeight","iconDataPctLineHeight","iconDataPctLetterSpacing","iconDataPctFontFamily","subTitleFontSize","subTitleFontWeight","subTitleLineHeight","subTitleFontFamily","pageTitleFontFamily","buttonTextFontSize","buttonTextFontWeight","buttonTextLineHeight","buttonTextFontFamily","textLinkFontSize","textLinkFontWeight","textLinkLineHeight","textLinkTextDecoration","textLinkFontFamily","bodyLrgFontSize","bodyLrgFontWeight","bodyLrgLineHeight","bodyLrgFontFamily","bodyLrgBoldFontSize","bodyLrgBoldFontWeight","bodyLrgBoldLineHeight","bodyLrgBoldFontFamily","bodyFontFamily","advisorsTeamCard","overlayBlur","overlayHeight","overlayPadding","nameColor","companyColor","textGap","hoverTranslateY","shadowHover","focusRingColor","focusRingWidth","testimonialCard","standaloneBg","standaloneBackgroundImage","standaloneMaxHeight","standaloneCardBg","standaloneCardBorder","standaloneCardBorderRadius","standaloneCardBackdropFilter","standaloneTextColor","standaloneQuoteMarkColor","standaloneImageBorderRadius","standaloneImageBorder","quoteFont","quoteFontSize","quoteLineHeight","quoteFontWeight","attributionFontSize","attributionLineHeight","attributionFontWeight","sliderBg","sliderBorder","sliderBorderRadius","sliderPadding","sliderGap","sliderWidth","sliderHeight","sliderSeparatorColor","sliderQuoteMarkColor","sliderQuoteTextColor","sliderQuoteFontSize","sliderQuoteLineHeight","sliderAvatarBg","sliderAvatarSize","sliderAvatarBorderRadius","sliderAvatarTextColor","sliderAvatarFontSize","sliderAuthorNameColor","sliderAuthorNameSize","sliderAuthorRoleColor","sliderAuthorRoleSize","percentDialCard","percentDialCards","subheading","headingFontSize","headingFontWeight","headingLineHeight","pagination","dotColor","arrowColor","arrowDisabledColor","carousel","transitionDuration","transitionEasing","faderColor","primaxColorSystem","textBreadcrumbSeparator","textBreadcrumbLast","textBreadcrumbHover","textBreadcrumbActive","textBreadcrumb","containerStrokeColor","bodyTextColor","darkBackgroundColor","interactivePrimaryHoverForeground","primaxFooterLogo","primaxTheme","sectionDivider","componentTitle","playButton","shadowOpacity","shadowOpacityHover","shadowOpacityActive","fontWeightHover","textColor","halfColumn","primaxCta","headingMaxWidth","formWidth","banner","contentGapY","mediaBlockImagePadding","mediaBlockImageOffset","divider","sparkPatternUrl","mediaBlock","borderRadiusMirror","videoBorderRadius","videoBorderRadiusMirror","videoAccentColor","accentThickness","accentGap","accentSideRow","accentSideSpan","accentBottomCol","accentBottomSpan","playIconWidth","playIconHeight","playIconPaddingLeft","playIconImageWidth","playIconImageHeight","sparkRow","sparkRowSpan","sparkCol","sparkColSpan","sparkWidth","sparkHeight","sparkRotate","sparkColMirror","sparkTranslateMirrorX","croppedSparkWidth","croppedSparkHeight","croppedSparkMaskRotate","croppedSparkMaskOffsetY","croppedSparkMaskOffsetX","croppedSparkSvgScale","croppedSparkStrokeColor","croppedSparkStrokeWidth","croppedSparkIconLgWidth","croppedSparkIconLgTop","croppedSparkIconLgRight","croppedSparkIconSmWidth","croppedSparkIconSmTop","croppedSparkIconSmLeft","croppedSparkSmallSparksWidth","croppedSparkSmallSparksTop","croppedSparkSmallSparksRight","videoHeight","maxHeight","hoverOutAnimation","bgFocus","textFocus","textActive","sectionDividerFontSize","sectionDividerFontWeight","sectionDividerLineHeight","sectionDividerColor","subtitleColor","componentTitleFontSize","componentTitleFontWeight","componentTitleLineHeight","componentTitleColor","bodyColor","bodyBoldColor","bodySmallColor","labelColor","twoColumn","leftColSparkIconSmallLeft","leftColSparkIconLargeRight","rightColSparkIconSmallLeft","rightColSparkIconLargeRight","videoSection","contentGap","primaxCard","focusBorder","shadowFocus","shadowActive","iconPadding","iconContentGap","iconSize","iconActionLinkPadding","imageHeight","imageContentPadding","imageContentGap","imageActionLinkPadding","profileImageAspect","profileContentPadding","profileContentGap","profileDescriptionMaxWidth","profileActionLinkPadding","bulletList","itemGap","itemAlign","iconColor","iconContent","iconFontFamily","iconFontWeight","bodyMaxWidth","borderRadiusMobile","contentPaddingMobile","dragIndicatorBg","dragHandleBorderRadius","dragHandleBorderBottom","dragHandleMarginBottom","checkbox","borderColorHover","checkedColor","checkedColorHover","dropdown","labelFontFamily","labelFontSize","labelLineHeight","labelGap","placeholderColor","borderColorFocus","chevronSize","chevronColor","panelBg","panelBorderColor","panelMaxHeight","panelPadding","errorFontSize","errorFontWeight","errorColor","errorTextAlign","dropdownSelect","optionPadding","optionBgHover","textInput","form","formGap","fieldsRowGap","disclaimerFontFamily","disclaimerFontSize","disclaimerFontWeight","disclaimerLineHeight","disclaimerLinkColor","inputBg","fieldsGap","disclaimerColor","primaxHeader","navHeight","logoWidth","navFontSize","navFontWeight","navLineHeight","navLinkPadding","navItemBgActive","navLinkColor","navLinkColorActive","navLinkColorHover","navLinkTextDecorationHover","navLinkTextDecorationActive","ctaPaddingLeft","overlayGap","overlayMaxWidth","overlaySideWidth","groupGap","groupHeadingFontSize","groupHeadingColor","groupHeadingColorHover","groupHeadingColorActive","groupHeadingColorFocus","groupHeadingOutlineWidth","groupHeadingOutlineOffset","groupLinkGap","groupLinkFontSize","groupLinkColor","groupLinkColorHover","groupLinkColorActive","groupLinkColorFocus","groupLinkOutlineWidth","groupLinkOutlineOffset","mobileBg","mobileBorder","mobileItemPadding","mobileItemFontSize","mobileGroupBorder","mobileGroupPadding","mobileGroupFontSize","mobileSearchPadding","mobileSublinkBg","mobileSublinkFontSize","mobileSublinkPadding","hamburgerColor","featuredImageMaxWidth","featuredImageBorderRadius","mobileItemColor","mobileItemBackground","mobileSublinkBgAlt","mobileSublinkColorHover","overlaySearchHeight","overlaySearchPadding","alertBanner","borderStyle","borderTopWidth","borderBottomWidth","dismissColor","dismissColorHover","dismissColorActive","dismissSize","dismissPadding","textWrapMaxWidth","iconListItem","iconBlockWidth","iconBlockHeight","iconBlockBg","linkPaddingTop","iconBulletList","dividerContentPadding","itemsRowGap","itemsColGap","iconBulletSection","dividerPadding","mediaWidth","listGap","accordion","itemPadding","headerBgHover","animationDuration","accordionSection","mediaRadius","postFeed","sectionGap","postGap","featuredContentGap","featuredImageAspect","regularGap","bodyGap","thumbnailWidth","thumbnailAspect","titleColorHover","titleColorActive","assetTypeColor","metaColor","metaFontSize","metaLineHeight","dividerColor","dividerHeight","loadMoreGap","navMaxWidth","navGap","linkGap","headingColor","linkColorHover","linkColorActive","legalFontSize","legalFontWeight","legalColor","legalColorDark","focusOutlineWidth","focusOutlineColor","legalLinkColor","overflowMediaSection","mediaBlockBorderRadiusLeft","mediaBlockBorderRadiusRight","filterSection","assetMeta","typeColor","detailsColor","sidebar","innerGap","sectionTitleColor","assetTitleColor","socialsGap","socialIconsGap","socialIconColor","socialIconColorHover","assetGap","ctaPadding","ctaBg","ctaGap","ctaTitleColor","useColorTokens","getCSSVar","varName","getComputedStyle","getPropertyValue","cssVar","linkColumns","socialLinks","copyrightText","logo","column","colIndex","social","platform","interactiveProps","resolvedAlt","message","dismissAriaLabel","isVisible","setIsVisible","faCircleXmarkSolid","faCircleXmarkRegular","html","authorClasses","align","bannerType","hasBackgroundVideo","backgroundVideo","BannerClass","contentStyle","gridAlignItems","contentAlignSelf","contentVerticalAlign","mediaAlignSelf","mediaVerticalAlign","gridGap","alignSelf","breadcrumbs","formHeading","formHeadingLevel","formHeadingVariant","dividerProps","ctaClass","citation","quoteClasses","externalLink","ctaClasses","hoverEffect","handleLinkClick","wrapperStyle","cardStyle","imageWrapperStyle","bodyStyle","cardContent","visibleCards","showPeek","showFader","desktop","viewportRef","viewportWidth","setViewportWidth","useLayoutEffect","update","offsetWidth","ro","ResizeObserver","isMobile","visibleCount","resolvedPeek","cards","Children","toArray","setCurrentPage","clampedPage","trackStyle","peekPx","gapPx","String","effectiveGap","cssVisibleCount","carouselClass","p","dropdowns","activePills","searchPlaceholder","searchValue","searchButtonLabel","results","showResults","resultsColumns","initialCount","loadMoreCount","loadMoreLabel","onDropdownChange","onSearchChange","onSearchSubmit","onPillDismiss","onClearAll","setVisibleCount","visibleResults","hasMore","pill","FilterPillAtom","PrimaxCard","durationMinutes","timestamp","buttonLabel","linkGroups","legalText","logoSrc","socialIndex","footnoteClasses","marker","mediaProps","bulletItems","bulletIcon","buildContent","contentProps","rt","h","hl","hv","bi","bIcon","btn","renderButton","buildMedia","rowVariant","rowMediaProps","resolvedMediaProps","wrapMedia","mediaNode","pos","rowContent","resolveRowContent","topContent","darkModeProp","resolvedBg","getBackgroundColor","resolvedShape","titleElement","onClose","closeOnOverlayClick","closeOnEscape","forceBottomSheet","showCloseButton","dialogRef","previousFocusRef","dragY","setDragY","isDragging","setIsDragging","isClosing","setIsClosing","touchStartRef","handleClose","dismissSheet","timer","setTimeout","clearTimeout","dialog","open","activeElement","showModal","close","focus","handleCancel","handleTouchStart","touch","touches","clientY","time","Date","handleTouchMove","deltaY","handleTouchEnd","VELOCITY_THRESHOLD","transform","onTouchStart","onTouchMove","onTouchEnd","setUser","eyebrow","dials","patternUrl","bgPattern","sectionStyle","dial","posts","featuredPost","find","post","regularPosts","visibleRegularCount","visibleRegularPosts","tabletExtraCount","tabletExtraPosts","allVisiblePosts","layout","BaseAccordion","accordionColumn","activeDropdown","setActiveDropdown","timeoutRef","headerRef","setSearchOpen","setSearchClosing","mobileOpen","setMobileOpen","mobileExpandedItems","setMobileExpandedItems","mobileExpandedGroups","setMobileExpandedGroups","handleEscape","closeSearch","toggleSearch","handleNavEnter","handleNavLeave","handleDropdownEnter","handleDropdownLeave","toggleMobileItem","toggleMobileGroup","resolvedSearchFields","faBars","query","onLoadMore","onResultClick","resultCount","data","search","category","increment","assets","asset","linkRest","showTitle","playbackMode","Promise","resolve","cb","onload","then","mediaScriptSrc","mediaScript","renderPlayIcon","points","transparentPng","node","player","thumbnailEl","insertBefore","firstChild","bulletPoints","contentBlock","existingStyle","remove","tokenName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/atoms/Button/buttonIcons.tsx","../src/themes/presets/color-systems/default-colors.ts","../src/themes/presets/default.ts","../src/themes/utils/helpers.ts","../src/themes/utils/generator.ts","../src/themes/core/context.tsx","../src/themes/core/client-provider.tsx","../src/components/atoms/Button/Button.tsx","../src/components/atoms/ButtonLink/ButtonLink.tsx","../src/components/atoms/TextLink/TextLink.tsx","../src/components/atoms/BackgroundMedia/BackgroundMedia.tsx","../src/components/atoms/Media/Media.tsx","../src/components/atoms/Breadcrumb/Breadcrumb.tsx","../src/components/atoms/Divider/Divider.tsx","../src/components/atoms/Container/Container.tsx","../src/components/atoms/Heading/Heading.tsx","../src/components/atoms/Grid/Grid.tsx","../src/components/atoms/Icon/Icon.tsx","../src/components/atoms/RichText/RichText.tsx","../node_modules/domelementtype/dist/index.js","../node_modules/domhandler/dist/node.js","../node_modules/domhandler/dist/index.js","../node_modules/entities/dist/decode-codepoint.js","../node_modules/entities/dist/internal/decode-shared.js","../node_modules/entities/dist/generated/decode-data-html.js","../node_modules/entities/dist/generated/decode-data-xml.js","../node_modules/entities/dist/internal/bin-trie-flags.js","../node_modules/entities/dist/decode.js","../node_modules/htmlparser2/dist/Tokenizer.js","../node_modules/htmlparser2/dist/Parser.js","../node_modules/domutils/dist/querying.js","../node_modules/domutils/dist/legacy.js","../node_modules/entities/dist/escape.js","../node_modules/dom-serializer/dist/foreign-names.js","../node_modules/dom-serializer/dist/index.js","../node_modules/domutils/dist/stringify.js","../node_modules/domutils/dist/feeds.js","../node_modules/domutils/dist/helpers.js","../node_modules/domutils/dist/manipulation.js","../node_modules/domutils/dist/traversal.js","../node_modules/htmlparser2/dist/index.js","../node_modules/html-dom-parser/lib/server/html-to-dom.js","../node_modules/html-dom-parser/lib/server/utilities.js","../node_modules/react-property/lib/possibleStandardNamesOptimized.js","../node_modules/style-to-object/cjs/index.js","../node_modules/inline-style-parser/cjs/index.js","../node_modules/style-to-js/dist/index.js","../node_modules/html-react-parser/lib/utilities.js","../node_modules/html-react-parser/lib/attributes-to-props.js","../node_modules/react-property/lib/index.js","../node_modules/html-react-parser/lib/dom-to-react.js","../node_modules/html-react-parser/lib/index.js","../node_modules/html-dom-parser/lib/index.js","../node_modules/html-react-parser/esm/index.mjs","../src/components/atoms/RichText/EnhancedRichText.tsx","../src/components/molecules/VideoPlayer/VideoPlayer.tsx","../src/components/atoms/Paragraph/Paragraph.tsx","../src/components/atoms/BulletList/BulletList.tsx","../src/components/atoms/Footnote/Footnote.tsx","../src/components/atoms/Author/Author.tsx","../src/components/atoms/FilterPill/FilterPill.tsx","../src/components/molecules/AssetMeta/AssetMeta.tsx","../src/components/atoms/Image/Image.tsx","../src/components/molecules/Accordion/Accordion.tsx","../src/components/molecules/primax/MediaBlock/MediaBlock.tsx","../src/assets/sparkle-overlay.svg","../src/assets/spark-small-sparks.svg","../src/assets/spark-icon-large.svg","../src/assets/spark-icon-small.svg","../src/components/molecules/primax/Banner/Banner.tsx","../src/components/atoms/TextInput/TextInput.tsx","../src/components/atoms/Dropdown/Dropdown.tsx","../src/components/atoms/Checkbox/Checkbox.tsx","../src/components/molecules/primax/DropdownSelect/DropdownSelect.tsx","../src/components/molecules/primax/Form/Form.tsx","../src/components/molecules/primax/Subscribe/Subscribe.tsx","../src/components/molecules/primax/TwoColumn/TwoColumn.tsx","../src/components/molecules/primax/Card/Card.tsx","../src/components/molecules/primax/IconListItem/IconListItem.tsx","../src/components/molecules/primax/IconBulletList/IconBulletList.tsx","../src/components/molecules/primax/OverflowMediaSection/OverflowMediaSection.tsx","../src/components/molecules/primax/IconBulletSection/IconBulletSection.tsx","../src/components/molecules/primax/PostFeed/PostItem.tsx","../src/components/molecules/primax/Accordion/Accordion.tsx","../src/components/molecules/primax/Footer/Footer.tsx","../src/components/molecules/primax/HeaderNav/HeaderNavGroup.tsx","../src/components/molecules/primax/HeaderNav/HeaderOverlay.tsx","../src/components/molecules/primax/HeaderNav/HeaderMobileNav.tsx","../src/components/molecules/primax/HeaderNav/HeaderNav.tsx","../src/components/molecules/primax/SideBar/SideBar.tsx","../src/components/molecules/advisors-plus/Footer/Footer.tsx","../src/components/molecules/advisors-plus/TestimonialCard/TestimonialCard.tsx","../src/components/atoms/DataDial/DataDial.tsx","../src/components/atoms/StatPill/StatPill.tsx","../src/components/molecules/PercentDialCard/PercentDialCard.tsx","../src/assets/testimonial-standalone-bg.png","../src/components/molecules/advisors-plus/PercentDialCards/PercentDialCards.tsx","../src/components/atoms/Pagination/Pagination.tsx","../src/components/molecules/Carousel/Carousel.tsx","../src/themes/presets/color-systems/advisors-plus-colors.ts","../src/themes/presets/advisors-plus.ts","../src/themes/presets/color-systems/primax-colors.ts","../src/themes/presets/primax.ts","../src/assets/primax-logo-dark.svg","../src/assets/primax-logo-light.svg","../src/themes/hooks/useColorTokens.ts","../src/components/molecules/advisors-plus/TeamCard/TeamCard.tsx","../src/components/atoms/AlertBanner/AlertBanner.tsx","../src/components/molecules/primax/CTA/CTA.tsx","../src/components/atoms/Blockquote/Blockquote.tsx","../src/components/molecules/CTA/CTA.tsx","../src/components/molecules/Card/Card.tsx","../src/components/molecules/primax/FilterSection/FilterSection.tsx","../src/components/molecules/primax/HalfColumn/HalfColumn.tsx","../src/components/molecules/Header/Header.tsx","../src/components/pages/primax/IndividualPost/IndividualPost.tsx","../src/components/molecules/Modal/Modal.tsx","../src/components/atoms/PlayButton/PlayButton.tsx","../src/components/molecules/primax/PlayIcon/PlayIcon.tsx","../src/components/molecules/primax/PostFeed/PostFeed.tsx","../src/components/molecules/primax/SearchResults/SearchResults.tsx","../src/components/molecules/primax/VideoSection/VideoSection.tsx","../src/components/atoms/RichText/replacers/videoReplacer.tsx"],"sourcesContent":["/**\n * Button icon configuration\n * Maps button types to their default icons with hover states\n */\n\nimport React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faAnglesRight,\n faArrowRight,\n faCirclePlay as faCirclePlaySolid,\n faEnvelope as faEnvelopeSolid,\n faPlay,\n faDownload,\n type IconDefinition,\n} from '@fortawesome/free-solid-svg-icons';\n\nimport { faSparkle, faSparkles } from '@fortawesome/pro-solid-svg-icons';\nimport {\n faCirclePlay as faCirclePlayRegular,\n faEnvelope as faEnvelopeRegular,\n} from '@fortawesome/free-regular-svg-icons';\nimport { faXTwitter, faLinkedin, faSquareFacebook } from '@fortawesome/free-brands-svg-icons';\nimport { ButtonType } from './Button';\n\nconst iconRegistry: Record<string, IconDefinition> = {\n 'arrow-right': faArrowRight,\n 'circle-play': faCirclePlaySolid,\n play: faPlay,\n download: faDownload,\n};\n\nexport function resolveIcon(icon: string | React.ReactNode): React.ReactNode {\n if (typeof icon === 'string') {\n const iconDef = iconRegistry[icon];\n return iconDef ? <FontAwesomeIcon icon={iconDef} /> : null;\n }\n return icon;\n}\n\ninterface ButtonIconConfig {\n regular: React.ReactNode;\n hover?: React.ReactNode;\n}\n\n/**\n * Default icon configuration for each button type\n */\nexport const defaultButtonIcons: Partial<Record<ButtonType, ButtonIconConfig>> = {\n video: {\n regular: <FontAwesomeIcon icon={faCirclePlayRegular} />,\n hover: <FontAwesomeIcon icon={faCirclePlaySolid} />,\n },\n subscribe: {\n regular: <FontAwesomeIcon icon={faEnvelopeRegular} />,\n hover: <FontAwesomeIcon icon={faEnvelopeSolid} />,\n },\n cta: {\n regular: <FontAwesomeIcon icon={faAnglesRight} />,\n },\n twitter: {\n regular: <FontAwesomeIcon icon={faXTwitter} />,\n },\n linkedin: {\n regular: <FontAwesomeIcon icon={faLinkedin} />,\n },\n facebook: {\n regular: <FontAwesomeIcon icon={faSquareFacebook} />,\n },\n};\n\n/**\n * Get icon configuration for a button type\n * @param buttonType - The button variant type\n * @param customIcon - Custom icon override\n * @param customHoverIcon - Custom hover icon override\n * @param themeName - Current theme name for theme-specific icons\n */\nexport function getButtonIcon(\n buttonType: ButtonType,\n customIcon?: React.ReactNode,\n customHoverIcon?: React.ReactNode,\n themeName?: string\n): ButtonIconConfig | null {\n // Custom icons take precedence\n if (customIcon) {\n return {\n regular: customIcon,\n hover: customHoverIcon,\n };\n }\n\n // Theme-specific icons for Primax\n if (themeName === 'primax') {\n if (\n buttonType === 'general' ||\n buttonType === 'secondary' ||\n buttonType === 'link' ||\n buttonType === 'danger' ||\n buttonType === 'generalDark' ||\n buttonType === 'secondaryDark'\n ) {\n return {\n regular: <FontAwesomeIcon icon={faSparkle} />,\n hover: <FontAwesomeIcon icon={faSparkles} />,\n };\n }\n }\n\n // Return default icon for button type\n return defaultButtonIcons[buttonType] || null;\n}\n","/**\n * Default color system implementation\n * Demonstrates the three-tier color abstraction with new naming convention\n */\n\nimport { ColorSystem } from '../../core/color-system';\n\nexport const defaultColorSystem: ColorSystem = {\n // ============================================================================\n // TIER 1: BASE COLORS\n // ============================================================================\n primitives: {\n // Blue scale (Cobalt brand color)\n 'color-blue-50': '#eff6ff',\n 'color-blue-100': '#dbeafe',\n 'color-blue-200': '#bfdbfe',\n 'color-blue-300': '#93c5fd',\n 'color-blue-400': '#60a5fa',\n 'color-blue-500': '#2e6bf0', // Primary brand blue\n 'color-blue-600': '#1e40af',\n 'color-blue-700': '#1e3a8a',\n 'color-blue-800': '#1e3a8a',\n 'color-blue-900': '#1e293b',\n\n // Yellow/Gold scale (Accent color)\n 'color-yellow-50': '#fefce8',\n 'color-yellow-100': '#fef9c3',\n 'color-yellow-200': '#fef08a',\n 'color-yellow-300': '#fde047',\n 'color-yellow-400': '#efe63f', // Primary gold\n 'color-yellow-500': '#eab308',\n 'color-yellow-600': '#ca8a04',\n 'color-yellow-700': '#a16207',\n 'color-yellow-800': '#854d0e',\n 'color-yellow-900': '#713f12',\n\n // Purple scale\n 'color-purple-50': '#faf5ff',\n 'color-purple-100': '#f3e8ff',\n 'color-purple-200': '#e9d5ff',\n 'color-purple-300': '#d8b4fe',\n 'color-purple-400': '#c084fc',\n 'color-purple-500': '#a855f7',\n 'color-purple-600': '#9333ea',\n 'color-purple-700': '#7e22ce',\n 'color-purple-800': '#3d2589', // Dark purple for CTA backgrounds\n 'color-purple-900': '#581c87',\n 'color-purple-950': '#091757',\n\n // Neutral/Gray scale\n 'color-neutral-50': '#f9fafb',\n 'color-neutral-100': '#f3f4f6',\n 'color-neutral-200': '#e5e7eb',\n 'color-neutral-300': '#d1d5db',\n 'color-neutral-400': '#9ca3af',\n 'color-neutral-500': '#6b7280',\n 'color-neutral-600': '#4b5563',\n 'color-neutral-700': '#374151',\n 'color-neutral-800': '#1f2937',\n 'color-neutral-900': '#111827',\n\n // Semantic colors\n 'color-success-50': '#f0fdf4',\n 'color-success-500': '#10b981',\n 'color-success-700': '#047857',\n 'color-alert-50': '#fef2f2',\n 'color-alert-500': '#ef4444',\n 'color-alert-700': '#b91c1c',\n 'color-warning-50': '#fefce8',\n 'color-warning-400': '#efe63f',\n 'color-warning-500': '#eab308',\n\n // Base\n 'color-white': '#ffffff',\n 'color-black': '#000000',\n },\n\n // ============================================================================\n // TIER 2: SEMANTIC COLOR TOKENS\n // ============================================================================\n semantic: {\n // Background colors\n 'tier1-theme-color-background-default-primary-default': 'var(--color-purple-800)',\n 'tier1-theme-color-background-default-primary-hover': 'var(--color-purple-950)',\n 'tier1-theme-color-background-default-primary-active': 'var(--color-purple-800)',\n 'tier1-theme-color-background-default-secondary-default': 'var(--color-neutral-50)',\n 'tier1-theme-color-background-default-secondary-hover': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-tertiary-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-tertiary-hover': 'var(--color-neutral-200)',\n 'tier1-theme-color-background-accent-primary-default': 'var(--color-yellow-400)',\n 'tier1-theme-color-background-accent-primary-hover': 'var(--color-yellow-500)',\n 'tier1-theme-color-background-accent-primary-active': 'var(--color-yellow-600)',\n 'tier1-theme-color-background-default-inverse-default': 'var(--color-neutral-900)',\n 'tier1-theme-color-background-utility-overlay-default': 'rgba(0, 0, 0, 0.5)',\n\n // Content (text) colors\n 'tier1-theme-color-content-title-primary-default': 'var(--color-purple-950)',\n 'tier1-theme-color-content-default-primary-default': 'var(--color-purple-950)',\n 'tier1-theme-color-content-default-secondary-default': 'var(--color-purple-800)',\n 'tier1-theme-color-content-default-tertiary-default': 'var(--color-neutral-500)',\n 'tier1-theme-color-content-default-inverse-default': 'var(--color-white)',\n 'tier1-theme-color-content-disabled-subtle-default': 'var(--color-neutral-400)',\n 'tier1-theme-color-content-accent-primary-default': 'var(--color-yellow-400)',\n 'tier1-theme-color-content-default-link-default': 'var(--color-blue-500)',\n 'tier1-theme-color-content-default-link-hover': 'var(--color-blue-600)',\n\n // Border colors\n 'tier1-theme-color-border-default-subtle-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-border-default-default-default': 'var(--color-neutral-200)',\n 'tier1-theme-color-border-default-strong-default': 'var(--color-neutral-300)',\n 'tier1-theme-color-border-focus-primary-focus': 'var(--color-blue-500)',\n\n // State colors\n 'tier1-theme-color-background-utility-success-default': 'var(--color-success-50)',\n 'tier1-theme-color-content-utility-success-default': 'var(--color-success-500)',\n 'tier1-theme-color-content-utility-success-hover': 'var(--color-success-700)',\n 'tier1-theme-color-background-utility-warning-default': 'var(--color-warning-50)',\n 'tier1-theme-color-content-utility-warning-default': 'var(--color-warning-500)',\n 'tier1-theme-color-content-utility-warning-hover': 'var(--color-warning-400)',\n 'tier1-theme-color-background-utility-error-default': 'var(--color-alert-50)',\n 'tier1-theme-color-content-utility-error-default': 'var(--color-alert-500)',\n 'tier1-theme-color-content-utility-error-hover': 'var(--color-alert-700)',\n 'tier1-theme-color-background-utility-info-default': 'var(--color-blue-50)',\n 'tier1-theme-color-content-utility-info-default': 'var(--color-blue-500)',\n 'tier1-theme-color-content-utility-info-hover': 'var(--color-blue-600)',\n\n // Interactive colors\n 'tier1-theme-color-background-default-interactive-default': 'var(--color-blue-500)',\n 'tier1-theme-color-background-default-interactive-hover': 'var(--color-blue-600)',\n 'tier1-theme-color-background-default-interactive-active': 'var(--color-blue-700)',\n 'tier1-theme-color-background-default-interactive-disabled': 'var(--color-neutral-300)',\n\n // Legacy semantic tokens for backward compatibility\n primary: 'var(--tier1-theme-color-background-default-primary-default)',\n primaryHover: 'var(--tier1-theme-color-background-default-primary-hover)',\n primaryActive: 'var(--tier1-theme-color-background-default-primary-active)',\n primaryText: 'var(--tier1-theme-color-content-default-inverse-default)',\n secondary: 'var(--color-blue-500)',\n secondaryHover: 'var(--color-blue-600)',\n secondaryActive: 'var(--color-blue-700)',\n secondaryText: 'var(--tier1-theme-color-content-default-inverse-default)',\n accent: 'var(--tier1-theme-color-background-accent-primary-default)',\n accentHover: 'var(--tier1-theme-color-background-accent-primary-hover)',\n accentActive: 'var(--tier1-theme-color-background-accent-primary-active)',\n accentText: 'var(--color-purple-950)',\n tertiary: 'var(--color-neutral-200)',\n tertiaryHover: 'var(--color-neutral-300)',\n tertiaryActive: 'var(--color-neutral-400)',\n tertiaryText: 'var(--color-purple-950)',\n textPrimary: 'var(--tier1-theme-color-content-default-primary-default)',\n textSecondary: 'var(--tier1-theme-color-content-default-secondary-default)',\n textAccent: 'var(--tier1-theme-color-content-accent-primary-default)',\n textTertiary: 'var(--tier1-theme-color-content-default-tertiary-default)',\n textInverse: 'var(--tier1-theme-color-content-default-inverse-default)',\n textDisabled: 'var(--tier1-theme-color-content-disabled-subtle-default)',\n textLink: 'var(--tier1-theme-color-content-default-link-default)',\n textLinkHover: 'var(--tier1-theme-color-content-default-link-hover)',\n bgPrimary: 'var(--tier1-theme-color-background-default-primary-default)',\n bgSecondary: 'var(--tier1-theme-color-background-default-secondary-default)',\n bgTertiary: 'var(--tier1-theme-color-background-default-tertiary-default)',\n bgInverse: 'var(--tier1-theme-color-background-default-inverse-default)',\n bgOverlay: 'var(--tier1-theme-color-background-utility-overlay-default)',\n borderDefault: 'var(--tier1-theme-color-border-default-default-default)',\n borderSubtle: 'var(--tier1-theme-color-border-default-subtle-default)',\n borderStrong: 'var(--tier1-theme-color-border-default-strong-default)',\n borderFocus: 'var(--tier1-theme-color-border-focus-primary-focus)',\n stateSuccess: 'var(--tier1-theme-color-content-utility-success-default)',\n stateSuccessHover: 'var(--tier1-theme-color-content-utility-success-hover)',\n stateSuccessBg: 'var(--tier1-theme-color-background-utility-success-default)',\n stateWarning: 'var(--tier1-theme-color-content-utility-warning-default)',\n stateWarningHover: 'var(--tier1-theme-color-content-utility-warning-hover)',\n stateWarningBg: 'var(--tier1-theme-color-background-utility-warning-default)',\n stateError: 'var(--tier1-theme-color-content-utility-error-default)',\n stateErrorHover: 'var(--tier1-theme-color-content-utility-error-hover)',\n stateErrorBg: 'var(--tier1-theme-color-background-utility-error-default)',\n stateInfo: 'var(--tier1-theme-color-content-utility-info-default)',\n stateInfoHover: 'var(--tier1-theme-color-content-utility-info-hover)',\n stateInfoBg: 'var(--tier1-theme-color-background-utility-info-default)',\n interactivePrimary: 'var(--tier1-theme-color-background-default-interactive-default)',\n interactivePrimaryHover: 'var(--tier1-theme-color-background-default-interactive-hover)',\n interactivePrimaryActive: 'var(--tier1-theme-color-background-default-interactive-active)',\n interactiveSecondary: 'var(--color-neutral-200)',\n interactiveSecondaryHover: 'var(--color-neutral-300)',\n interactiveSecondaryActive: 'var(--color-neutral-400)',\n interactiveDisabled: 'var(--tier1-theme-color-background-default-interactive-disabled)',\n\n // ============================================================================\n // TIER 3: COMPONENT COLOR TOKENS\n // ============================================================================\n\n // Button component tokens\n 'tier3-theme-button-general-background-default': 'var(--color-blue-500)',\n 'tier3-theme-button-general-background-hover': 'var(--color-blue-600)',\n 'tier3-theme-button-general-background-active': 'var(--color-blue-700)',\n 'tier3-theme-button-general-content-default': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-general-content-hover': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-general-border-default': 'var(--color-blue-500)',\n 'tier3-theme-button-general-border-hover': 'var(--color-blue-600)',\n\n 'tier3-theme-button-cta-background-default': 'var(--tier1-theme-color-background-accent-primary-default)',\n 'tier3-theme-button-cta-background-hover': 'var(--tier1-theme-color-background-accent-primary-hover)',\n 'tier3-theme-button-cta-background-active': 'var(--tier1-theme-color-background-accent-primary-active)',\n 'tier3-theme-button-cta-content-default': 'var(--color-purple-950)',\n 'tier3-theme-button-cta-content-hover': 'var(--color-purple-950)',\n 'tier3-theme-button-cta-border-default': 'var(--color-blue-500)',\n 'tier3-theme-button-cta-border-hover': 'var(--color-blue-600)',\n\n 'tier3-theme-button-secondary-background-default': 'transparent',\n 'tier3-theme-button-secondary-background-hover': 'var(--tier1-theme-color-background-default-primary-default)',\n 'tier3-theme-button-secondary-background-active': 'var(--tier1-theme-color-background-default-primary-active)',\n 'tier3-theme-button-secondary-content-default': 'var(--tier1-theme-color-background-default-primary-default)',\n 'tier3-theme-button-secondary-content-hover': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-secondary-border-default': 'var(--tier1-theme-color-background-default-primary-default)',\n 'tier3-theme-button-secondary-border-hover': 'var(--tier1-theme-color-background-default-primary-default)',\n\n 'tier3-theme-button-outline-background-default': 'transparent',\n 'tier3-theme-button-outline-background-hover': 'var(--tier1-theme-color-background-default-secondary-default)',\n 'tier3-theme-button-outline-background-active': 'var(--tier1-theme-color-background-default-tertiary-default)',\n 'tier3-theme-button-outline-content-default': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-outline-content-hover': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-outline-border-default': 'var(--tier1-theme-color-border-default-default-default)',\n 'tier3-theme-button-outline-border-hover': 'var(--tier1-theme-color-border-default-strong-default)',\n\n 'tier3-theme-button-ghost-background-default': 'transparent',\n 'tier3-theme-button-ghost-background-hover': 'var(--tier1-theme-color-background-default-secondary-default)',\n 'tier3-theme-button-ghost-background-active': 'var(--tier1-theme-color-background-default-tertiary-default)',\n 'tier3-theme-button-ghost-content-default': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-ghost-content-hover': 'var(--tier1-theme-color-content-default-primary-default)',\n 'tier3-theme-button-ghost-border-default': 'transparent',\n 'tier3-theme-button-ghost-border-hover': 'transparent',\n\n // Social media button tokens\n 'tier3-theme-button-twitter-background-default': 'transparent',\n 'tier3-theme-button-twitter-background-hover': '#5f8df0',\n 'tier3-theme-button-twitter-background-active': '#004cb1',\n 'tier3-theme-button-twitter-content-default': '#2e6bf0',\n 'tier3-theme-button-twitter-content-hover': '#ffffff',\n 'tier3-theme-button-twitter-content-active': '#ffffff',\n 'tier3-theme-button-twitter-border-default': '#2e6bf0',\n 'tier3-theme-button-twitter-border-hover': '#5f8df0',\n 'tier3-theme-button-twitter-border-active': '#004cb1',\n\n 'tier3-theme-button-linkedin-background-default': 'transparent',\n 'tier3-theme-button-linkedin-background-hover': '#5f8df0',\n 'tier3-theme-button-linkedin-background-active': '#004cb1',\n 'tier3-theme-button-linkedin-content-default': '#2e6bf0',\n 'tier3-theme-button-linkedin-content-hover': '#ffffff',\n 'tier3-theme-button-linkedin-content-active': '#ffffff',\n 'tier3-theme-button-linkedin-border-default': '#2e6bf0',\n 'tier3-theme-button-linkedin-border-hover': '#5f8df0',\n 'tier3-theme-button-linkedin-border-active': '#004cb1',\n\n 'tier3-theme-button-facebook-background-default': 'transparent',\n 'tier3-theme-button-facebook-background-hover': '#5f8df0',\n 'tier3-theme-button-facebook-background-active': '#004cb1',\n 'tier3-theme-button-facebook-content-default': '#2e6bf0',\n 'tier3-theme-button-facebook-content-hover': '#ffffff',\n 'tier3-theme-button-facebook-content-active': '#ffffff',\n 'tier3-theme-button-facebook-border-default': '#2e6bf0',\n 'tier3-theme-button-facebook-border-hover': '#5f8df0',\n 'tier3-theme-button-facebook-border-active': '#004cb1',\n },\n};\n","/**\n * Default theme configuration\n * Base theme with multi-level color system and standard design tokens\n */\n\nimport { ThemeConfig } from '../core/types';\nimport { defaultColorSystem } from './color-systems/default-colors';\n\nexport const defaultTheme: ThemeConfig = {\n name: 'default',\n fontImportUrl: 'https://use.typekit.net/nmh6hoc.css',\n\n // Three-tier color system (integrated)\n colors: {\n primitives: defaultColorSystem.primitives,\n semantic: defaultColorSystem.semantic,\n },\n\n colorPalettes: [\n { name: 'Primary', bg: 'primary', text: 'primaryText' },\n { name: 'Secondary', bg: 'secondary', text: 'secondaryText' },\n { name: 'Accent', bg: 'accent', text: 'accentText' },\n { name: 'Tertiary', bg: 'tertiary', text: 'tertiaryText' },\n ],\n\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '24px',\n xl: '30px',\n xxl: '60px',\n },\n\n borderRadius: {\n sm: '4px',\n md: '8px',\n lg: '16px',\n xl: '24px',\n },\n\n shadows: {\n sm: '0 2px 4px rgba(0, 0, 0, 0.1)',\n md: '0 4px 8px rgba(0, 0, 0, 0.15)',\n lg: '0 8px 16px rgba(0, 0, 0, 0.2)',\n xl: '0 16px 32px rgba(0, 0, 0, 0.25)',\n },\n\n breakpoints: {\n xs: '320px',\n sm: '576px',\n md: '768px',\n lg: '992px',\n xl: '1200px',\n xxl: '1400px',\n },\n\n typography: {\n // Tier 1: Base typography foundation tokens\n fontFamily: \"'azo-sans-web', serif\",\n fontFamilyHeading: \"'azo-sans-web', serif\",\n fontFamilyMono: \"'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace\",\n\n // Base font sizes\n fontSizeXs: '21px', // heading xs\n fontSizeSm: '28px', // heading sm\n fontSizeMd: '37px', // heading md\n fontSizeLg: '50px', // heading lg\n fontSizeXl: '67px', // heading xl\n fontSize2xl: '72px', // heading 2xl\n\n // Base font weights\n fontWeightLight: '100',\n fontWeightRegular: '400',\n fontWeightSemibold: '600',\n fontWeightBold: '700',\n fontWeightBlack: '900',\n\n // Base line heights\n lineHeightTight: '1.25',\n lineHeightSnug: '1.375',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.625',\n lineHeightLoose: '1.75',\n\n // Base letter spacing\n letterSpacingTighter: '-0.05em',\n letterSpacingTight: '-0.025em',\n letterSpacingNormal: '0',\n letterSpacingWide: '0.025em',\n letterSpacingWider: '0.05em',\n letterSpacingWidest: '0.1em',\n\n // Tier 2: Semantic typography variants with responsive breakpoints\n variants: {\n // Display typography (largest headings)\n display: {\n fontSize: '4rem',\n fontWeight: '900',\n lineHeight: '1.1',\n letterSpacing: '-0.03em',\n mobile: {\n fontSize: '2.5rem',\n lineHeight: '1.2',\n },\n tablet: {\n fontSize: '3rem',\n },\n },\n\n // Body text variants\n bodyDefault: {\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.5',\n letterSpacing: '0',\n mobile: {\n fontSize: '0.875rem',\n lineHeight: '1.6',\n },\n },\n bodyLarge: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n letterSpacing: '0',\n mobile: {\n fontSize: '1rem',\n },\n },\n bodySmall: {\n fontSize: '0.875rem',\n fontWeight: '400',\n lineHeight: '1.5',\n letterSpacing: '0',\n mobile: {\n fontSize: '0.75rem',\n },\n },\n\n // Specialized text variants\n lead: {\n fontSize: '1.25rem',\n fontWeight: '400',\n lineHeight: '1.6',\n letterSpacing: '-0.01em',\n mobile: {\n fontSize: '1.125rem',\n },\n },\n caption: {\n fontSize: '0.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n letterSpacing: '0.03em',\n textTransform: 'uppercase',\n },\n overline: {\n fontSize: '0.75rem',\n fontWeight: '600',\n lineHeight: '1.4',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n },\n\n // Legacy variants (maintained for backward compatibility)\n pageTitle: {\n fontSize: '1.5rem',\n fontWeight: '400',\n lineHeight: '1.1',\n letterSpacing: '0',\n textTransform: 'uppercase',\n mobile: {\n fontSize: '2rem',\n lineHeight: '1.2',\n },\n tablet: {\n fontSize: '2.5rem',\n },\n },\n sectionTitle: {\n fontSize: '2.625rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '-0.02em',\n mobile: {\n fontSize: '2.25rem',\n },\n tablet: {\n fontSize: '2.25rem',\n },\n },\n title: {\n fontSize: '3.5rem',\n fontWeight: '900',\n lineHeight: '1.1',\n letterSpacing: '0',\n mobile: {\n fontSize: '2.875rem',\n lineHeight: '1.2',\n },\n tablet: {\n fontSize: '2.875rem',\n },\n },\n subtitle: {\n fontSize: '1.5rem',\n fontWeight: '400',\n lineHeight: '1.4',\n mobile: {\n fontSize: '1.5rem',\n },\n },\n body: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.5',\n },\n textlink: {\n fontSize: '1.125rem',\n fontWeight: '600',\n lineHeight: '1.5',\n textTransform: 'uppercase',\n textDecoration: 'underline',\n },\n bodyBold: {\n fontSize: '1.125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n bodyBoldLarge: {\n fontSize: '1.313rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n },\n },\n\n components: {\n card: {\n background: 'var(--tier1-theme-color-surface-primary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-default-default)',\n borderRadius: '8px',\n shadow: '0 2px 4px rgba(0, 0, 0, 0.1)',\n padding: '24px',\n },\n header: {\n background: 'var(--tier1-theme-color-surface-primary-default)',\n borderBottom: '1px solid var(--tier1-theme-color-border-default-default-default)',\n height: '64px',\n padding: '0 24px',\n },\n cta: {\n background: 'var(--primary)',\n borderRadius: '0 0 200px',\n padding: '32px',\n titleFontWeight: '900',\n titleFontSize: '55px',\n titleLineHeight: '65px',\n descriptionLineHeight: '32px',\n descriptionFontWeight: '100',\n descriptionFontSize: '24px',\n descriptionMargin: '0px 0px 30px 0px',\n },\n },\n\n // Component-scoped token abstraction layer\n componentTokens: {\n button: {\n // Shared button properties (apply to all variants)\n borderRadius: '20px',\n borderWidth: '1px',\n padding: '14px 25px 13px',\n fontSize: '16px',\n fontWeight: '600',\n lineHeight: '22px',\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n\n // Focus state (shared)\n focusOutline: '1px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '1pt',\n\n // Disabled state (shared)\n disabledOpacity: '0.6',\n\n // Shadow (shared)\n shadow: 'var(--tier1-theme-shadow-sm, none)',\n\n // Animation tokens - Default theme has no hover animation\n hoverAnimation: 'none',\n\n // Variant-specific styles\n variants: {\n general: {\n bg: 'var(--tier3-theme-button-general-background-default)',\n bgHover: 'var(--tier3-theme-button-general-background-hover)',\n bgActive: 'var(--tier3-theme-button-general-background-active)',\n text: 'var(--tier3-theme-button-general-content-default)',\n textHover: 'var(--tier3-theme-button-general-content-hover)',\n border: 'var(--tier3-theme-button-general-border-default)',\n borderHover: 'var(--tier3-theme-button-general-border-hover)',\n },\n cta: {\n bg: 'var(--tier3-theme-button-cta-background-default)',\n bgHover: 'var(--tier3-theme-button-cta-background-hover)',\n bgActive: 'var(--tier3-theme-button-cta-background-active)',\n text: 'var(--tier3-theme-button-cta-content-default)',\n textHover: 'var(--tier3-theme-button-cta-content-hover)',\n border: 'var(--tier3-theme-button-cta-border-default)',\n borderHover: 'var(--tier3-theme-button-cta-border-hover)',\n },\n secondary: {\n bg: 'var(--tier3-theme-button-secondary-background-default)',\n bgHover: 'var(--tier3-theme-button-secondary-background-hover)',\n bgActive: 'var(--tier3-theme-button-secondary-background-active)',\n text: 'var(--tier3-theme-button-secondary-content-default)',\n textHover: 'var(--tier3-theme-button-secondary-content-hover)',\n border: 'var(--tier3-theme-button-secondary-border-default)',\n borderHover: 'var(--tier3-theme-button-secondary-border-hover)',\n },\n twitter: {\n bg: 'var(--tier3-theme-button-twitter-background-default)',\n bgHover: 'var(--tier3-theme-button-twitter-background-hover)',\n bgActive: 'var(--tier3-theme-button-twitter-background-active)',\n text: 'var(--tier3-theme-button-twitter-content-default)',\n textHover: 'var(--tier3-theme-button-twitter-content-hover)',\n border: 'var(--tier3-theme-button-twitter-border-default)',\n borderHover: 'var(--tier3-theme-button-twitter-border-hover)',\n },\n linkedin: {\n bg: 'var(--tier3-theme-button-linkedin-background-default)',\n bgHover: 'var(--tier3-theme-button-linkedin-background-hover)',\n bgActive: 'var(--tier3-theme-button-linkedin-background-active)',\n text: 'var(--tier3-theme-button-linkedin-content-default)',\n textHover: 'var(--tier3-theme-button-linkedin-content-hover)',\n border: 'var(--tier3-theme-button-linkedin-border-default)',\n borderHover: 'var(--tier3-theme-button-linkedin-border-hover)',\n },\n facebook: {\n bg: 'var(--tier3-theme-button-facebook-background-default)',\n bgHover: 'var(--tier3-theme-button-facebook-background-hover)',\n bgActive: 'var(--tier3-theme-button-facebook-background-active)',\n text: 'var(--tier3-theme-button-facebook-content-default)',\n textHover: 'var(--tier3-theme-button-facebook-content-hover)',\n border: 'var(--tier3-theme-button-facebook-border-default)',\n borderHover: 'var(--tier3-theme-button-facebook-border-hover)',\n },\n secondaryDarkMode: {\n bg: 'transparent',\n text: 'var(--tier1-theme-color-content-default-inverse-default)',\n border: 'var(--tier1-theme-color-content-default-inverse-default)',\n bgHover: 'var(--tier1-theme-color-background-default-interactive-default)',\n borderHover: 'var(--tier1-theme-color-background-default-interactive-hover)',\n bgActive: 'var(--tier1-theme-color-background-default-interactive-active)',\n },\n },\n },\n\n card: {\n // Base properties\n bg: 'var(--tier1-theme-color-background-default-secondary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-default-default)',\n borderRadius: 'var(--tier1-theme-border-radius-lg)',\n shadow: 'var(--tier1-theme-shadow-md)',\n padding: 'var(--tier1-theme-spacing-xl)',\n maxWidth: '340px',\n\n // Focus state\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '2px',\n\n // Active state\n borderActive: '2px solid var(--tier1-theme-color-background-default-interactive-default)',\n\n // Image wrapper\n imageWrapperBorderRadius:\n 'var(--tier1-theme-border-radius-lg, 20px) var(--tier1-theme-border-radius-lg, 20px) 0 0',\n imageAspectRatio: '3/2',\n\n // Responsive overrides\n md: {\n imageAspectRatio: '16/9',\n },\n },\n\n grid: {\n // Gap size mappings - reference theme spacing tokens\n gapXs: 'var(--tier1-theme-spacing-xs)',\n gapSm: 'var(--tier1-theme-spacing-sm)',\n gapMd: 'var(--tier1-theme-spacing-md)',\n gapLg: 'var(--tier1-theme-spacing-lg)',\n gapXl: 'var(--tier1-theme-spacing-xl)',\n gapXxl: 'var(--tier1-theme-spacing-xxl)',\n },\n\n header: {\n // Base properties\n bg: 'var(--tier1-theme-color-background-default-secondary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-subtle-default)',\n height: '64px',\n padding: 'var(--tier1-theme-spacing-md) var(--tier1-theme-spacing-lg)',\n\n // Title\n titleColor: 'var(--tier1-theme-color-content-default-primary-default)',\n titleFontSize: 'var(--tier1-theme-typography-h5-desktop-font-size, 20px)',\n titleFontWeight: 'var(--tier1-theme-typography-h1-desktop-font-weight, 700)',\n titleMargin: '6px 0 6px var(--tier1-theme-spacing-sm, 10px)',\n\n // Welcome text\n welcomeColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n welcomeFontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 14px)',\n welcomeMargin: 'var(--tier1-theme-spacing-sm, 10px)',\n\n // Button spacing\n buttonSpacing: 'var(--tier1-theme-spacing-sm, 10px)',\n },\n\n cta: {\n // Container\n height: '500px',\n\n // Content box\n contentBg: 'var(--tier1-theme-color-background-default-primary-default)',\n contentMaxWidth: '765px',\n contentBorderRadius: '0px 0px 200px',\n contentPadding: 'var(--tier1-theme-spacing-xxl) var(--tier1-theme-spacing-xl) 0px var(--tier1-theme-spacing-xxl)',\n\n // Title\n titleColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n titleFontSize: '55px',\n titleLineHeight: '65px',\n titleFontWeight: '900',\n titleMargin: '0 0 1rem',\n titleFontFamily: 'var(--tier1-theme-typography-font-family-heading, var(--tier1-theme-typography-font-family))',\n\n // Description\n descriptionColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n descriptionFontSize: '24px',\n descriptionLineHeight: '32px',\n descriptionFontWeight: '100',\n descriptionMargin: '0px 0px 30px 0px',\n descriptionFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Responsive overrides\n md: {\n height: '450px',\n titleFontSize: '2.5rem',\n titleLineHeight: '1.2',\n descriptionFontSize: '1.125rem',\n descriptionLineHeight: '1.6',\n },\n },\n\n icon: {\n // Base size\n size: '24px',\n\n // Color variants - separate fill, stroke, and stroke-width\n fillPrimary: 'var(--color-blue-600)',\n strokePrimary: 'var(--color-blue-600)',\n strokeWidthPrimary: '1',\n\n fillSecondary: 'var(--color-gray-600)',\n strokeSecondary: 'var(--color-gray-600)',\n strokeWidthSecondary: '0',\n\n fillAccent: 'var(--color-purple-600)',\n strokeAccent: 'var(--color-purple-600)',\n strokeWidthAccent: '0',\n\n fillSuccess: 'var(--color-green-600)',\n strokeSuccess: 'var(--color-green-600)',\n strokeWidthSuccess: '0',\n\n fillWarning: 'var(--color-yellow-600)',\n strokeWarning: 'var(--color-yellow-600)',\n strokeWidthWarning: '0',\n\n fillError: 'var(--color-red-600)',\n strokeError: 'var(--color-red-600)',\n strokeWidthError: '0',\n\n // Size variants\n sizes: {\n xs: {\n size: '12px',\n },\n sm: {\n size: '16px',\n },\n md: {\n size: '24px',\n },\n lg: {\n size: '32px',\n },\n xl: {\n size: '48px',\n },\n },\n },\n\n heading: {\n // Base properties\n margin: '0',\n padding: '0',\n color: 'var(--tier1-theme-color-content-default-primary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family-heading, var(--tier1-theme-typography-font-family))',\n\n // H1 variant\n h1FontSize: 'var(--tier1-theme-typography-font-size-2xl, 2.5rem)',\n h1FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-desktop-line-height, 1.2)',\n h1LetterSpacing: 'var(--tier1-theme-typography-h1-desktop-letter-spacing, -0.02em)',\n\n // H2 variant\n h2FontSize: 'var(--tier1-theme-typography-font-size-xl, 2rem)',\n h2FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h2LineHeight: 'var(--tier1-theme-typography-h2-desktop-line-height, 1.3)',\n h2LetterSpacing: 'var(--tier1-theme-typography-h2-desktop-letter-spacing, -0.01em)',\n\n // H3 variant\n h3FontSize: 'var(--tier1-theme-typography-font-size-lg, 1.75rem)',\n h3FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h3LineHeight: 'var(--tier1-theme-typography-h3-desktop-line-height, 1.4)',\n h3LetterSpacing: 'var(--tier1-theme-typography-h3-desktop-letter-spacing, 0)',\n\n // H4 variant\n h4FontSize: 'var(--tier1-theme-typography-font-size-md, 1.5rem)',\n h4FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h4LineHeight: 'var(--tier1-theme-typography-h4-desktop-line-height, 1.4)',\n\n // H5 variant\n h5FontSize: 'var(--tier1-theme-typography-font-size-sm, 1.25rem)',\n h5FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h5LineHeight: 'var(--tier1-theme-typography-h5-desktop-line-height, 1.5)',\n\n // H6 variant\n h6FontSize: 'var(--tier1-theme-typography-font-size-xs, 1rem)',\n h6FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h6LineHeight: 'var(--tier1-theme-typography-h6-desktop-line-height, 1.5)',\n\n // Display variant\n displayFontSize: 'var(--tier1-theme-typography-display-desktop-font-size, 4rem)',\n displayFontWeight: 'var(--tier1-theme-typography-display-desktop-font-weight, 900)',\n displayLineHeight: 'var(--tier1-theme-typography-display-desktop-line-height, 1.1)',\n displayLetterSpacing: 'var(--tier1-theme-typography-display-desktop-letter-spacing, -0.03em)',\n\n // Body Default variant\n bodyDefaultFontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n bodyDefaultFontWeight: 'var(--tier1-theme-typography-body-default-desktop-font-weight, 400)',\n bodyDefaultLineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n bodyDefaultLetterSpacing: 'var(--tier1-theme-typography-body-default-desktop-letter-spacing, 0)',\n bodyDefaultFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Lead variant\n leadFontSize: 'var(--tier1-theme-typography-lead-desktop-font-size, 1.25rem)',\n leadFontWeight: 'var(--tier1-theme-typography-lead-desktop-font-weight, 400)',\n leadLineHeight: 'var(--tier1-theme-typography-lead-desktop-line-height, 1.6)',\n leadLetterSpacing: 'var(--tier1-theme-typography-lead-desktop-letter-spacing, -0.01em)',\n\n // Caption variant\n captionFontSize: 'var(--tier1-theme-typography-caption-desktop-font-size, 0.75rem)',\n captionFontWeight: 'var(--tier1-theme-typography-caption-desktop-font-weight, 400)',\n captionLineHeight: 'var(--tier1-theme-typography-caption-desktop-line-height, 1.4)',\n captionLetterSpacing: 'var(--tier1-theme-typography-caption-desktop-letter-spacing, 0.03em)',\n captionTextTransform: 'var(--tier1-theme-typography-caption-desktop-text-transform, uppercase)',\n\n // Overline variant\n overlineFontSize: 'var(--tier1-theme-typography-overline-desktop-font-size, 0.75rem)',\n overlineFontWeight: 'var(--tier1-theme-typography-overline-desktop-font-weight, 600)',\n overlineLineHeight: 'var(--tier1-theme-typography-overline-desktop-line-height, 1.4)',\n overlineLetterSpacing: 'var(--tier1-theme-typography-overline-desktop-letter-spacing, 0.1em)',\n overlineTextTransform: 'var(--tier1-theme-typography-overline-desktop-text-transform, uppercase)',\n\n // Legacy Page Title variant\n pageTitleFontSize: 'var(--tier1-theme-typography-page-title-desktop-font-size, 3rem)',\n pageTitleFontWeight: 'var(--tier1-theme-typography-page-title-desktop-font-weight, 900)',\n pageTitleLineHeight: 'var(--tier1-theme-typography-page-title-desktop-line-height, 1.1)',\n pageTitleLetterSpacing: 'var(--tier1-theme-typography-page-title-desktop-letter-spacing, -0.03em)',\n pageTitleTextTransform: 'var(--tier1-theme-typography-page-title-desktop-text-transform, uppercase)',\n pageTitleColor: 'var(--tier1-theme-color-content-accent-primary-default)',\n\n // Legacy Section Title variant\n sectionTitleFontSize: 'var(--tier1-theme-typography-section-title-desktop-font-size, 2.625rem)',\n sectionTitleFontWeight: 'var(--tier1-theme-typography-section-title-desktop-font-weight, 700)',\n sectionTitleLineHeight: 'var(--tier1-theme-typography-section-title-desktop-line-height, 1.2)',\n sectionTitleLetterSpacing: 'var(--tier1-theme-typography-section-title-desktop-letter-spacing, -0.02em)',\n\n // Legacy Title variant\n titleFontSize: 'var(--tier1-theme-typography-title-desktop-font-size, 3.5rem)',\n titleFontWeight: 'var(--tier1-theme-typography-title-desktop-font-weight, 900)',\n titleLineHeight: 'var(--tier1-theme-typography-title-desktop-line-height, 1.1)',\n titleLetterSpacing: 'var(--tier1-theme-typography-title-desktop-letter-spacing, -0.03em)',\n\n // Legacy Subtitle variant\n subtitleFontSize: 'var(--tier1-theme-typography-subtitle-desktop-font-size, 1.5rem)',\n subtitleFontWeight: 'var(--tier1-theme-typography-subtitle-desktop-font-weight, 400)',\n subtitleLineHeight: 'var(--tier1-theme-typography-subtitle-desktop-line-height, 1.4)',\n\n // Legacy Body variant\n bodyFontSize: 'var(--tier1-theme-typography-body-desktop-font-size, 1.125rem)',\n bodyFontWeight: 'var(--tier1-theme-typography-body-desktop-font-weight, 400)',\n bodyLineHeight: 'var(--tier1-theme-typography-body-desktop-line-height, 1.5)',\n\n // Legacy Text Link variant\n textlinkFontSize: 'var(--tier1-theme-typography-textlink-desktop-font-size, 1.125rem)',\n textlinkFontWeight: 'var(--tier1-theme-typography-textlink-desktop-font-weight, 600)',\n textlinkLineHeight: 'var(--tier1-theme-typography-textlink-desktop-line-height, 1.5)',\n textlinkFontFamily: 'var(--tier1-theme-typography-font-family)',\n textlinkTextDecoration: 'var(--tier1-theme-typography-textlink-desktop-text-decoration, underline)',\n textlinkTextTransform: 'var(--tier1-theme-typography-textlink-desktop-text-transform, uppercase)',\n\n // Legacy Body Bold variant\n bodyBoldFontSize: 'var(--tier1-theme-typography-body-bold-desktop-font-size, 1.125rem)',\n bodyBoldFontWeight: 'var(--tier1-theme-typography-body-bold-desktop-font-weight, 700)',\n bodyBoldLineHeight: 'var(--tier1-theme-typography-body-bold-desktop-line-height, 1.6)',\n bodyBoldFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Legacy Body Large variant\n bodyLargeFontSize: 'var(--tier1-theme-typography-body-large-desktop-font-size, 1.125rem)',\n bodyLargeFontWeight: 'var(--tier1-theme-typography-body-large-desktop-font-weight, 400)',\n bodyLargeLineHeight: 'var(--tier1-theme-typography-body-large-desktop-line-height, 1.6)',\n bodyLargeFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Legacy Body Bold Large variant\n bodyBoldLargeFontSize: 'var(--tier1-theme-typography-body-bold-large-desktop-font-size, 1.313rem)',\n bodyBoldLargeFontWeight: 'var(--tier1-theme-typography-body-bold-large-desktop-font-weight, 700)',\n bodyBoldLargeLineHeight: 'var(--tier1-theme-typography-body-bold-large-desktop-line-height, 1.6)',\n bodyBoldLargeFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Legacy Body Small variant\n bodySmallFontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 0.875rem)',\n bodySmallFontWeight: 'var(--tier1-theme-typography-body-small-desktop-font-weight, 400)',\n bodySmallLineHeight: 'var(--tier1-theme-typography-body-small-desktop-line-height, 1.5)',\n bodySmallFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n // Responsive overrides (mobile)\n mobile: {\n h1FontSize: 'var(--tier1-theme-typography-h1-mobile-font-size, 2rem)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-mobile-line-height, 1.25)',\n h2FontSize: 'var(--tier1-theme-typography-h2-mobile-font-size, 1.75rem)',\n h2LineHeight: 'var(--tier1-theme-typography-h2-mobile-line-height, 1.3)',\n h3FontSize: 'var(--tier1-theme-typography-h3-mobile-font-size, 1.5rem)',\n h4FontSize: 'var(--tier1-theme-typography-h4-mobile-font-size, 1.25rem)',\n h5FontSize: 'var(--tier1-theme-typography-h5-mobile-font-size, 1.125rem)',\n h6FontSize: 'var(--tier1-theme-typography-h6-mobile-font-size, 0.875rem)',\n displayFontSize: 'var(--tier1-theme-typography-display-mobile-font-size, 2.5rem)',\n displayLineHeight: 'var(--tier1-theme-typography-display-mobile-line-height, 1.2)',\n bodyDefaultFontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n bodyDefaultLineHeight: 'var(--tier1-theme-typography-body-default-mobile-line-height, 1.6)',\n leadFontSize: 'var(--tier1-theme-typography-lead-mobile-font-size, 1.125rem)',\n pageTitleFontSize: 'var(--tier1-theme-typography-page-title-mobile-font-size, 2rem)',\n pageTitleLineHeight: 'var(--tier1-theme-typography-page-title-mobile-line-height, 1.2)',\n sectionTitleFontSize: 'var(--tier1-theme-typography-section-title-mobile-font-size, 2.25rem)',\n titleFontSize: 'var(--tier1-theme-typography-title-mobile-font-size, 2.875rem)',\n titleLineHeight: 'var(--tier1-theme-typography-title-mobile-line-height, 1.2)',\n subtitleFontSize: 'var(--tier1-theme-typography-subtitle-mobile-font-size, 1.5rem)',\n },\n\n // Responsive overrides (tablet)\n tablet: {\n h1FontSize: 'var(--tier1-theme-typography-h1-tablet-font-size, 2.25rem)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-tablet-line-height, 1.2)',\n h2FontSize: 'var(--tier1-theme-typography-h2-tablet-font-size, 1.875rem)',\n h3FontSize: 'var(--tier1-theme-typography-h3-tablet-font-size, 1.625rem)',\n displayFontSize: 'var(--tier1-theme-typography-display-tablet-font-size, 3rem)',\n pageTitleFontSize: 'var(--tier1-theme-typography-page-title-tablet-font-size, 2.5rem)',\n sectionTitleFontSize: 'var(--tier1-theme-typography-section-title-tablet-font-size, 2.25rem)',\n titleFontSize: 'var(--tier1-theme-typography-title-tablet-font-size, 2.875rem)',\n },\n\n // Dark mode override\n dark: {\n color: 'var(--color-white)',\n },\n },\n\n textLink: {\n color: 'var(--tier1-theme-color-content-default-link-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n fontSize: 'var(--tier1-theme-typography-textlink-desktop-font-size, 1.125rem)',\n fontWeight: 'var(--tier1-theme-typography-textlink-desktop-font-weight, 600)',\n textDecoration: 'var(--tier1-theme-typography-textlink-desktop-text-decoration, underline)',\n\n colorHover: 'var(--tier1-theme-color-content-default-link-hover)',\n\n colorFocus: 'var(--tier1-theme-color-content-default-link-default)',\n textDecorationFocus: 'underline',\n textDecorationStyleFocus: 'solid',\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '2px',\n\n colorActive: 'var(--tier1-theme-color-content-default-link-hover)',\n colorVisited:\n 'var(--tier1-theme-color-content-default-link-visited, var(--tier1-theme-color-content-default-link-default))',\n\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n colorHover: 'var(--tier1-theme-color-content-accent-primary-default)',\n colorFocus: 'var(--tier1-theme-color-content-default-inverse-default)',\n colorActive: 'var(--tier1-theme-color-content-accent-primary-default)',\n },\n },\n\n richText: {\n // Base container\n color: 'var(--tier1-theme-color-content-default-primary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n lineHeight: 'var(--tier1-theme-typography-line-height-normal, 1.5)',\n\n // Heading spacing\n headingMarginBottom: 'var(--tier1-theme-spacing-md, 16px)',\n\n // Paragraph styles\n paragraphFontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n paragraphFontWeight: 'var(--tier1-theme-typography-body-default-desktop-font-weight, 400)',\n paragraphLineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n paragraphMarginBottom: 'var(--tier1-theme-spacing-md, 16px)',\n paragraphColor: 'var(--tier1-theme-color-content-default-primary-default)',\n\n // List styles\n listMargin: 'var(--tier1-theme-spacing-md, 16px) 0',\n listPaddingLeft: 'var(--tier1-theme-spacing-xl, 30px)',\n listItemFontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n listItemLineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n listItemMarginBottom: 'var(--tier1-theme-spacing-sm, 8px)',\n listItemColor: 'var(--tier1-theme-color-content-default-primary-default)',\n ulListStyleType: 'disc',\n olListStyleType: 'decimal',\n\n // Strong/bold\n strongFontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n\n // Code styles\n codeFontSize: '0.875em',\n codeBg: 'var(--tier1-theme-color-background-default-tertiary-default)',\n codePadding: '0.125rem 0.25rem',\n\n preFontSize: '0.875rem',\n preBg: 'var(--tier1-theme-color-background-default-tertiary-default)',\n prePadding: 'var(--tier1-theme-spacing-md, 16px)',\n\n // Blockquote styles\n blockquoteMargin: 'var(--tier1-theme-spacing-md, 16px) 0',\n blockquotePadding: 'var(--tier1-theme-spacing-sm, 8px) var(--tier1-theme-spacing-md, 16px)',\n blockquoteBorderLeft: '4px solid var(--tier1-theme-color-border-default-default-default)',\n blockquoteColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n\n // Horizontal rule\n hrBorder: '1px solid var(--tier1-theme-color-border-default-default-default)',\n hrMargin: 'var(--tier1-theme-spacing-lg, 24px) 0',\n\n // Responsive overrides\n mobile: {\n paragraphFontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n paragraphLineHeight: 'var(--tier1-theme-typography-body-default-mobile-line-height, 1.6)',\n listItemFontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n },\n\n // Dark mode overrides\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n paragraphColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n listItemColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n blockquoteColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n },\n },\n\n blockquote: {\n margin: 'var(--tier1-theme-spacing-md, 16px) 0',\n padding: 'var(--tier1-theme-spacing-sm, 8px) var(--tier1-theme-spacing-md, 16px)',\n borderLeft: 'none',\n bg: 'transparent',\n borderRadius: '0',\n fontStyle: 'italic',\n\n borderPrimaryWidth: '4px',\n borderSecondaryWidth: '0px',\n borderColorPrimary: 'var(--tier1-theme-color-border-default-default-default)',\n borderColorSecondary: 'transparent',\n\n fontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n fontWeight: '400',\n lineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n color: 'var(--tier1-theme-color-content-default-secondary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n\n citationMarginTop: 'var(--tier1-theme-spacing-sm, 8px)',\n citationFontSize: '0.875rem',\n citationFontWeight: '500',\n citationColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n citationPrefix: '\"— \"',\n\n mobile: {\n fontSize: '0.9375rem',\n lineHeight: '1.6',\n },\n\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n citationColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n borderColorPrimary: 'var(--tier1-theme-color-border-default-subtle-default)',\n borderColorSecondary: 'transparent',\n },\n },\n\n footnote: {\n labelFontWeight: '700',\n markerFontSize: '0.75em',\n markerFontWeight: '700',\n },\n\n author: {\n labelFontWeight: '700',\n },\n\n media: {\n bg: 'transparent',\n borderRadius: '0',\n objectFit: 'cover',\n objectPosition: 'center',\n aspectRatio: 'auto',\n\n dark: {\n bg: 'var(--tier1-theme-color-background-default-inverse-default)',\n },\n },\n\n videoPlayer: {\n borderRadius: '0',\n thumbnailBg: 'var(--tier1-theme-color-background-default-secondary-default)',\n placeholderBg: '#1a1a2e',\n playIconSize: '64px',\n playIconBg: 'rgba(0, 0, 0, 0.6)',\n playIconBorder: 'rgba(255, 255, 255, 0.8)',\n playIconColor: '#fff',\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n\n dark: {\n thumbnailBg: 'var(--tier1-theme-color-background-default-inverse-default)',\n playIconBg: 'rgba(0, 0, 0, 0.7)',\n },\n },\n\n paragraph: {\n // Base properties\n fontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n fontWeight: 'var(--tier1-theme-typography-body-default-desktop-font-weight, 400)',\n lineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n color: 'var(--tier1-theme-color-content-default-primary-default)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n letterSpacing: 'var(--tier1-theme-typography-body-default-desktop-letter-spacing, 0)',\n\n // Strong/bold\n strongFontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n\n // Responsive overrides\n mobile: {\n fontSize: 'var(--tier1-theme-typography-body-default-mobile-font-size, 0.875rem)',\n lineHeight: 'var(--tier1-theme-typography-body-default-mobile-line-height, 1.6)',\n },\n\n tablet: {\n fontSize: 'var(--tier1-theme-typography-body-default-desktop-font-size, 1rem)',\n lineHeight: 'var(--tier1-theme-typography-body-default-desktop-line-height, 1.5)',\n },\n\n // Dark mode overrides\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n },\n },\n\n modal: {\n // Overlay\n overlayBg: 'rgba(0, 0, 0, 0.5)',\n\n // Content area\n contentBg: 'var(--tier1-theme-color-background-default-secondary-default)',\n contentBorder: '1px solid var(--tier1-theme-color-border-default-default-default)',\n contentPadding: 'var(--tier1-theme-spacing-xl)',\n borderRadius: 'var(--tier1-theme-border-radius-lg)',\n shadow: 'var(--tier1-theme-shadow-lg)',\n maxWidth: '37.5rem',\n width: '100%',\n\n // Close button\n closeButtonTop: '1rem',\n closeButtonRight: '1rem',\n closeButtonSize: '2rem',\n closeButtonBorderRadius: '50%',\n closeButtonBg: 'transparent',\n closeButtonColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n closeButtonBgHover: 'var(--tier1-theme-color-background-default-tertiary-default)',\n closeButtonColorHover: 'var(--tier1-theme-color-content-default-primary-default)',\n closeButtonFontSize: '1.25rem',\n\n // Focus\n focusOutline: '2px solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '2px',\n\n // Size variants\n sizes: {\n sm: {\n maxWidth: '25rem',\n contentPadding: 'var(--tier1-theme-spacing-lg)',\n },\n md: {\n maxWidth: '37.5rem',\n contentPadding: 'var(--tier1-theme-spacing-xl)',\n },\n lg: {\n maxWidth: '50rem',\n contentPadding: 'var(--tier1-theme-spacing-xxl)',\n },\n },\n\n // Responsive\n mobile: {\n contentPadding: 'var(--tier1-theme-spacing-lg)',\n maxWidth: 'calc(100% - 2rem)',\n },\n\n // Dark mode\n dark: {\n contentBg: 'var(--tier1-theme-color-background-default-primary-default)',\n contentBorder: '1px solid var(--tier1-theme-color-border-default-subtle-default)',\n },\n },\n\n dataDial: {\n ringBg: 'transparent',\n ringTrack: 'var(--color-neutral-300)',\n ringProgress: 'var(--color-primary-700)',\n text: 'var(--color-primary-950)',\n valueFontSize: '2.75rem',\n percentFontSize: '1.375rem',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n\n statPill: {\n bg: 'rgba(46, 222, 128, 0.18)',\n text: 'var(--color-success-700)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n paddingY: '0.25rem',\n paddingX: '0.75rem',\n },\n },\n};\n","/**\n * Theme utility helper functions\n */\n\n/**\n * Converts camelCase to kebab-case:\n * - textPrimary -> text-primary\n * - blue500 -> blue-500\n * - brandPrimary -> brand-primary\n * - h1 -> h1\n * - h2 -> h2\n * - bodyLarge -> body-large\n */\nexport function toKebabCase(str: string): string {\n const typographyVariants = /^(h|b|p|span|div)(\\d+)$/i;\n if (typographyVariants.test(str)) {\n return str.toLowerCase();\n }\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2') // camelCase\n .replace(/([a-z])(\\d)/g, '$1-$2')\n .toLowerCase();\n}\n","/**\n * Theme CSS generation utilities\n * Converts theme configurations to CSS custom properties and applies them\n * Updated to support three-tier naming convention\n */\n\nimport { ThemeConfig, ThemeTypography, TypographyVariant, ComponentTokens } from '../core/types';\nimport { ColorSystem } from '../core/color-system';\nimport { toKebabCase } from './helpers';\n\n/**\n * Converts an object to CSS custom properties with a prefix\n * Handles camelCase to kebab-case conversion including numbers\n */\nfunction objectToCSSVars(obj: Record<string, string | undefined>, prefix: string): string[] {\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => {\n // For new tier naming convention, don't convert keys that already have proper format\n const cssKey = key.startsWith('tier') || key.startsWith('color-') ? key : toKebabCase(key);\n return ` --${prefix}${cssKey}: ${value};`;\n });\n}\n\n/**\n * Generates CSS custom properties for the three-tier color system\n * Creates CSS variables that reference each other\n * Also generates legacy variable names for backward compatibility\n */\nfunction generateColorSystemCSS(colorSystem: ColorSystem, selector: string = ':root'): string {\n const sections: string[] = [];\n\n // Tier 1: Base colors (primitives)\n sections.push(...objectToCSSVars(colorSystem.primitives as unknown as Record<string, string>, ''));\n\n // Tier 2 & 3: Semantic and component tokens\n sections.push(...objectToCSSVars(colorSystem.semantic as unknown as Record<string, string>, ''));\n\n // Legacy compatibility: Generate old-style variable names for ColorTable\n const legacyMapping: Record<string, string> = {\n 'text-primary': 'textPrimary',\n 'text-secondary': 'textSecondary',\n 'bg-secondary': 'bgSecondary',\n 'bg-tertiary': 'bgTertiary',\n 'border-default': 'borderDefault',\n 'border-subtle': 'borderSubtle',\n 'border-strong': 'borderStrong',\n };\n\n const legacyVars = Object.entries(legacyMapping)\n .map(([oldVar, newKey]) => {\n const value = colorSystem.semantic[newKey as keyof typeof colorSystem.semantic];\n return value ? ` --${oldVar}: ${value};` : '';\n })\n .filter(Boolean);\n\n sections.push(...legacyVars);\n\n return `${selector} {\\n${sections.join('\\n')}\\n}`;\n}\n\n/**\n * Generates typography CSS variables using the new tier naming convention\n * Tier 1: Foundation tokens (base font properties)\n * Tier 2: Semantic tokens (typography variants with responsive breakpoints)\n */\nfunction generateTypographyCSS(typography: ThemeTypography, selector: string = ':root'): string {\n const sections: string[] = [];\n\n // Tier 1: Base typography foundation tokens\n const { variants, ...typographyBase } = typography;\n\n // Add base typography variables with tier1-theme prefix\n Object.entries(typographyBase).forEach(([key, value]) => {\n if (value !== undefined) {\n const cssKey = toKebabCase(key);\n sections.push(` --tier1-theme-typography-${cssKey}: ${value};`);\n }\n });\n\n // Tier 2: Typography variants (semantic tokens with responsive breakpoints)\n if (variants) {\n Object.entries(variants).forEach(([variantName, variantStyles]: [string, TypographyVariant]) => {\n if (variantStyles) {\n const { mobile, tablet, ...desktopStyles } = variantStyles;\n\n // Desktop styles (default) - Tier 2 semantic tokens\n Object.entries(desktopStyles).forEach(([prop, value]) => {\n if (value !== undefined) {\n const propKey = toKebabCase(prop);\n const variantKey = toKebabCase(variantName);\n sections.push(` --tier1-theme-typography-${variantKey}-desktop-${propKey}: ${value};`);\n }\n });\n\n // Mobile styles - responsive variants\n if (mobile) {\n Object.entries(mobile).forEach(([prop, value]) => {\n if (value !== undefined) {\n const propKey = toKebabCase(prop);\n const variantKey = toKebabCase(variantName);\n sections.push(` --tier1-theme-typography-${variantKey}-mobile-${propKey}: ${value};`);\n }\n });\n }\n\n // Tablet styles - responsive variants\n if (tablet) {\n Object.entries(tablet).forEach(([prop, value]) => {\n if (value !== undefined) {\n const propKey = toKebabCase(prop);\n const variantKey = toKebabCase(variantName);\n sections.push(` --tier1-theme-typography-${variantKey}-tablet-${propKey}: ${value};`);\n }\n });\n }\n }\n });\n }\n\n return sections.length > 0 ? `${selector} {\\n${sections.join('\\n')}\\n}` : '';\n}\n\n/**\n * Generates CSS custom properties from theme configuration\n * Uses the integrated three-tier system\n */\nexport function generateThemeCSS(theme: ThemeConfig, selector: string = ':root'): string {\n let css = '';\n\n // Generate three-tier color system CSS\n const colorSystem = {\n primitives: theme.colors.primitives,\n semantic: theme.colors.semantic,\n };\n css += generateColorSystemCSS(colorSystem, selector);\n css += '\\n\\n';\n\n // Generate typography CSS with new naming convention\n const typographyCSS = generateTypographyCSS(theme.typography, selector);\n if (typographyCSS) {\n css += typographyCSS;\n css += '\\n\\n';\n }\n\n // Non-color theme properties (spacing, shadows, etc.)\n const sections: Record<string, string[]> = {};\n\n // Spacing (Tier 1)\n sections['Spacing'] = objectToCSSVars(theme.spacing as unknown as Record<string, string>, 'tier1-theme-spacing-');\n\n // Border Radius (Tier 1)\n sections['Border Radius'] = objectToCSSVars(\n theme.borderRadius as unknown as Record<string, string>,\n 'tier1-theme-border-radius-'\n );\n\n // Shadows (Tier 1)\n sections['Shadows'] = objectToCSSVars(theme.shadows as unknown as Record<string, string>, 'tier1-theme-shadow-');\n\n // Breakpoints (no tier prefix)\n sections['Breakpoints'] = objectToCSSVars(theme.breakpoints as unknown as Record<string, string>, 'breakpoint-');\n\n // Components (Tier 1)\n sections['Card Component'] = objectToCSSVars(\n theme.components.card as unknown as Record<string, string>,\n 'tier1-theme-component-card-'\n );\n sections['Header Component'] = objectToCSSVars(\n theme.components.header as unknown as Record<string, string>,\n 'tier1-theme-component-header-'\n );\n sections['CTA Component'] = objectToCSSVars(\n theme.components.cta as unknown as Record<string, string>,\n 'tier1-theme-component-cta-'\n );\n\n // Build final CSS\n const cssOutput = Object.entries(sections)\n .map(([name, vars]) => `\\n /* ${name} */\\n${vars.join('\\n')}`)\n .join('');\n\n css += `${selector} {${cssOutput}\\n}`;\n\n // NEW: Automatically generate component-scoped tokens with breakpoint support\n if (theme.componentTokens) {\n css += '\\n\\n';\n css += generateComponentTokensCSS(theme.componentTokens, selector);\n }\n\n return css;\n}\n\n/**\n * Helper function to convert camelCase to kebab-case\n */\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\n/**\n * Generates component-scoped CSS variables with breakpoint, variant, dark mode, and size support\n * Automatically handles any component without needing generator code changes\n * Supports nested variants pattern: { borderRadius: \"0px\", variants: { general: {...}, secondary: {...} } }\n * Supports dark mode overrides: { bg: \"white\", dark: { bg: \"black\" } }\n * Supports size variants: { sizes: { sm: { padding: \"8px\" }, md: { padding: \"12px\" } } }\n */\nfunction generateComponentTokensCSS(componentTokens: ComponentTokens, selector: string = ':root'): string {\n const sections: string[] = [];\n const darkSections: string[] = [];\n const sizeSections: { [size: string]: string[] } = {};\n\n // Reserved breakpoint keys\n const breakpointKeys = ['desktop', 'tablet', 'mobile', 'sm', 'md', 'lg', 'xl'];\n\n sections.push(`${selector} {`);\n sections.push(' /* Component-Scoped Tokens */');\n\n // Dark mode selector targets elements with data-dark-mode attribute\n const darkSelector = selector === ':root' ? '[data-dark-mode=\"true\"]' : `${selector} [data-dark-mode=\"true\"]`;\n darkSections.push(`${darkSelector} {`);\n darkSections.push(' /* Dark Mode Overrides */');\n\n // Generic loop - works for any component automatically\n Object.entries(componentTokens).forEach(([componentName, componentProps]) => {\n if (componentProps && typeof componentProps === 'object') {\n const componentPrefix = camelToKebab(componentName);\n sections.push(`\\n /* ${componentName} component */`);\n\n let hasDarkOverrides = false;\n\n // Process base tokens (non-breakpoint, non-variant, non-dark, non-sizes properties)\n Object.entries(componentProps).forEach(([propKey, propValue]) => {\n // Skip breakpoint objects, variants object, dark object, and sizes object\n if (breakpointKeys.includes(propKey) || propKey === 'variants' || propKey === 'dark' || propKey === 'sizes')\n return;\n\n if (propValue !== undefined && typeof propValue === 'string') {\n const cssVarName = camelToKebab(propKey);\n sections.push(` --${componentPrefix}-${cssVarName}: ${propValue};`);\n }\n });\n\n // Process component-level dark mode overrides\n if (componentProps.dark && typeof componentProps.dark === 'object') {\n hasDarkOverrides = true;\n darkSections.push(`\\n /* ${componentName} component - dark mode */`);\n Object.entries(componentProps.dark).forEach(([propKey, propValue]) => {\n if (propValue !== undefined && typeof propValue === 'string') {\n const cssVarName = camelToKebab(propKey);\n darkSections.push(` --${componentPrefix}-${cssVarName}: ${propValue};`);\n }\n });\n }\n\n // Process size variants\n if (componentProps.sizes && typeof componentProps.sizes === 'object') {\n Object.entries(componentProps.sizes).forEach(([sizeName, sizeProps]) => {\n if (sizeProps && typeof sizeProps === 'object') {\n // Initialize size section if not exists\n if (!sizeSections[sizeName]) {\n const sizeSelector =\n selector === ':root' ? `[data-size=\"${sizeName}\"]` : `${selector} [data-size=\"${sizeName}\"]`;\n sizeSections[sizeName] = [`${sizeSelector} {`, ` /* Size: ${sizeName} */`];\n }\n\n sizeSections[sizeName].push(`\\n /* ${componentName} component - ${sizeName} */`);\n Object.entries(sizeProps).forEach(([propKey, propValue]) => {\n if (propValue !== undefined && typeof propValue === 'string') {\n const cssVarName = camelToKebab(propKey);\n sizeSections[sizeName].push(` --${componentPrefix}-${cssVarName}: ${propValue};`);\n }\n });\n }\n });\n }\n\n // Process variants (nested variant-specific tokens)\n if (componentProps.variants && typeof componentProps.variants === 'object') {\n Object.entries(componentProps.variants).forEach(([variantName, variantProps]) => {\n if (variantProps && typeof variantProps === 'object') {\n const variantKebab = camelToKebab(variantName); // Convert variant name to kebab-case\n\n // Process variant base tokens\n Object.entries(variantProps).forEach(([propKey, propValue]) => {\n // Skip breakpoint objects and dark object within variants\n if (breakpointKeys.includes(propKey) || propKey === 'dark') return;\n\n if (propValue !== undefined && typeof propValue === 'string') {\n // Extract base property and state from camelCase\n // e.g., bgHover -> bg + Hover, textActive -> text + Active\n const match = propKey.match(/^([a-z]+)([A-Z][a-z]+)?$/);\n if (match) {\n const baseProp = match[1]; // 'bg', 'text', 'border'\n const state = match[2] ? match[2].toLowerCase() : null; // 'hover', 'active', null\n\n // Pattern: --button-bg-general or --button-bg-general-hover\n const cssVarName = state\n ? `--${componentPrefix}-${baseProp}-${variantKebab}-${state}`\n : `--${componentPrefix}-${baseProp}-${variantKebab}`;\n\n sections.push(` ${cssVarName}: ${propValue};`);\n }\n }\n });\n\n // Process variant dark mode overrides\n if (variantProps.dark && typeof variantProps.dark === 'object') {\n hasDarkOverrides = true;\n Object.entries(variantProps.dark).forEach(([propKey, propValue]) => {\n if (propValue !== undefined && typeof propValue === 'string') {\n const match = propKey.match(/^([a-z]+)([A-Z][a-z]+)?$/);\n if (match) {\n const baseProp = match[1];\n const state = match[2] ? match[2].toLowerCase() : null;\n\n const cssVarName = state\n ? `--${componentPrefix}-${baseProp}-${variantKebab}-${state}`\n : `--${componentPrefix}-${baseProp}-${variantKebab}`;\n\n darkSections.push(` ${cssVarName}: ${propValue};`);\n }\n }\n });\n }\n\n // Process variant breakpoint-scoped tokens\n breakpointKeys.forEach((breakpoint) => {\n const breakpointProps = (variantProps as any)[breakpoint];\n if (breakpointProps && typeof breakpointProps === 'object') {\n Object.entries(breakpointProps).forEach(([propKey, propValue]) => {\n if (propValue !== undefined) {\n const match = propKey.match(/^([a-z]+)([A-Z][a-z]+)?$/);\n if (match) {\n const baseProp = match[1];\n const state = match[2] ? match[2].toLowerCase() : null;\n\n const cssVarName = state\n ? `--${componentPrefix}-${baseProp}-${variantKebab}-${state}-${breakpoint}`\n : `--${componentPrefix}-${baseProp}-${variantKebab}-${breakpoint}`;\n\n sections.push(` ${cssVarName}: ${propValue};`);\n }\n }\n });\n }\n });\n }\n });\n }\n\n // Process component-level breakpoint-scoped tokens\n breakpointKeys.forEach((breakpoint) => {\n const breakpointProps = componentProps[breakpoint];\n if (breakpointProps && typeof breakpointProps === 'object') {\n Object.entries(breakpointProps).forEach(([propKey, propValue]) => {\n if (propValue !== undefined) {\n const cssVarName = camelToKebab(propKey);\n sections.push(` --${componentPrefix}-${cssVarName}-${breakpoint}: ${propValue};`);\n }\n });\n }\n });\n }\n });\n\n sections.push('}');\n darkSections.push('}');\n\n // Close all size sections\n Object.values(sizeSections).forEach((sizeSection) => {\n sizeSection.push('}');\n });\n\n // Only include dark mode section if there are actual overrides\n const hasDarkContent = darkSections.length > 3; // More than just opening, comment, and closing\n const hasSizeContent = Object.keys(sizeSections).length > 0;\n\n let result = sections.join('\\n');\n\n if (hasDarkContent) {\n result += '\\n\\n' + darkSections.join('\\n');\n }\n\n if (hasSizeContent) {\n Object.values(sizeSections).forEach((sizeSection) => {\n result += '\\n\\n' + sizeSection.join('\\n');\n });\n }\n\n return result;\n}\n\n/**\n * Applies theme to document by injecting CSS\n */\nexport function applyTheme(theme: ThemeConfig, themeName?: string): void {\n const selector = themeName ? `[data-theme=\"${themeName}\"]` : ':root';\n const css = generateThemeCSS(theme, selector);\n\n // Remove existing theme style if it exists\n const existingStyle = document.getElementById(`theme-${theme.name}`);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Create and inject new theme style\n const style = document.createElement('style');\n style.id = `theme-${theme.name}`;\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/**\n * Sets theme attribute on document element\n */\nexport function setThemeAttribute(themeName: string): void {\n document.documentElement.setAttribute('data-theme', themeName);\n}\n","/**\n * React context for theme management\n * Optimized for single-theme tenant sites\n */\n\nimport React, { createContext, useContext, useEffect, ReactNode } from 'react';\nimport { ThemeConfig, ThemeVariant } from './types';\nimport { defaultTheme } from '../presets/default';\nimport { generateThemeCSS } from '../utils/generator';\n\n/**\n * Converts theme config to CSS custom properties and injects them\n */\nfunction applyThemeCSS(theme: ThemeConfig, themeName: string): void {\n const style = document.getElementById(`theme-${themeName}`) || document.createElement('style');\n style.id = `theme-${themeName}`;\n\n const selector = `[data-theme=\"${themeName}\"]`;\n\n // Handle both single URL and array of URLs\n let fontImport = '';\n if (theme.fontImportUrl) {\n const urls = Array.isArray(theme.fontImportUrl) ? theme.fontImportUrl : [theme.fontImportUrl];\n fontImport = urls.map((url) => `@import url('${url}');`).join('\\n ');\n }\n\n const css = `\n ${fontImport}\n ${generateThemeCSS(theme, selector)}\n `;\n\n style.textContent = css;\n if (!document.head.contains(style)) {\n document.head.appendChild(style);\n }\n}\n\ninterface ThemeContextValue {\n currentTheme: ThemeConfig;\n themeName: ThemeVariant;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n initialTheme?: ThemeConfig;\n initialThemeName?: ThemeVariant;\n}\n\n/**\n * Theme provider optimized for single-theme tenant sites\n * Sets theme once on mount - no runtime switching needed\n */\nexport function ThemeProvider({\n children,\n initialTheme = defaultTheme,\n initialThemeName = 'default',\n}: ThemeProviderProps) {\n // Apply theme CSS and set data attribute on mount\n useEffect(() => {\n applyThemeCSS(initialTheme, initialThemeName);\n document.documentElement.setAttribute('data-theme', initialThemeName);\n }, [initialTheme, initialThemeName]);\n\n const value: ThemeContextValue = {\n currentTheme: initialTheme,\n themeName: initialThemeName,\n };\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Hook to access current theme (read-only for tenant sites)\n */\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n","/**\n * Client-side theme provider wrapper\n * This component can be used in any React application\n */\n\nimport { ThemeProvider as BaseThemeProvider } from './context';\nexport { useTheme } from './context';\n\n// Re-export the theme provider\nexport const ThemeProvider = BaseThemeProvider;\n","import React from 'react';\nimport './Button.scss';\nimport { getButtonIcon, resolveIcon } from './buttonIcons';\nimport { ButtonVariantType } from '@/themes/core/types';\nimport { useTheme } from '@/themes/core/client-provider';\nimport { toKebabCase } from '@/themes/utils/helpers';\n\n// Re-export for convenience\nexport type ButtonType = ButtonVariantType;\n\nexport type ColorPalette = 'primary' | 'secondary' | 'accent' | 'tertiary';\n\nexport interface ButtonProps {\n /** Button variant type */\n buttonType?: ButtonType;\n /** Color palette to apply */\n palette?: ColorPalette;\n /** Button label text */\n label?: string;\n /** Accepts an icon name string (e.g. \"circle-play\") or React element */\n icon?: string | React.ReactNode;\n /** Accepts a hover icon name string */\n hoverIcon?: string;\n /** Icon position relative to label */\n iconPosition?: 'leading' | 'trailing' | 'none';\n /** Allow passing classname to component */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Child elements */\n children?: React.ReactNode;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Size variant - controls button dimensions and spacing */\n size?: 'sm' | 'md' | 'lg';\n /** Enable/disable hover animation - overrides theme default */\n animated?: boolean;\n /** Click handler */\n onClick?: () => void;\n}\n\n/** Primary UI component for user interaction */\n\nexport const Button = ({\n buttonType = 'general',\n palette,\n label,\n icon,\n hoverIcon,\n iconPosition,\n className,\n children,\n style,\n disabled = false,\n darkMode = false,\n size = 'md',\n animated,\n onClick,\n ...props\n}: ButtonProps) => {\n const { currentTheme } = useTheme();\n const buttonClass = `button button--${toKebabCase(buttonType)} ${className || ''}`;\n const iconConfig = getButtonIcon(buttonType, resolveIcon(icon), resolveIcon(hoverIcon), currentTheme?.name);\n const resolvedIconPosition = iconPosition ?? (iconConfig && currentTheme?.name === 'primax' ? 'trailing' : undefined);\n\n const paletteStyle = palette\n ? {\n backgroundColor: `var(--${palette})`,\n color: `var(--${palette}-text)`,\n borderColor: `var(--${palette})`,\n ...style,\n }\n : style;\n\n const iconNode =\n iconConfig &&\n (iconConfig.hover ? (\n <>\n <span className=\"icon icon--regular\">{iconConfig.regular}</span>\n <span className=\"icon icon--hover\">{iconConfig.hover}</span>\n </>\n ) : (\n <span className=\"icon\">{iconConfig.regular}</span>\n ));\n\n return (\n <button\n type=\"button\"\n className={buttonClass}\n data-dark-mode={darkMode ? 'true' : undefined}\n data-size={size}\n data-animated={animated !== undefined ? (animated ? 'true' : 'false') : undefined}\n style={paletteStyle}\n onClick={onClick}\n disabled={disabled}\n {...props}\n >\n {resolvedIconPosition === 'leading' && iconNode}\n {children || label}\n {resolvedIconPosition === 'trailing' && iconNode}\n </button>\n );\n};\n","import React from 'react';\nimport { ButtonProps } from '../Button/Button';\nimport { getButtonIcon, resolveIcon } from '../Button/buttonIcons';\nimport { useTheme } from '@/themes/core/client-provider';\nimport { toKebabCase } from '@/themes/utils/helpers';\nimport '../Button/Button.scss';\nimport './ButtonLink.scss';\n\nexport interface ButtonLinkProps extends Omit<ButtonProps, 'onClick'> {\n /** Link URL */\n href: string;\n /** Link target */\n target?: '_blank' | '_self';\n /** ARIA label */\n 'aria-label'?: string;\n /** Test ID */\n 'data-testid'?: string;\n}\n\n/** Button-styled link component for navigation */\nexport const ButtonLink = ({\n buttonType = 'general',\n label,\n icon,\n hoverIcon,\n iconPosition,\n href,\n target = '_self',\n className,\n children,\n style,\n disabled = false,\n size = 'md',\n darkMode = false,\n ...props\n}: ButtonLinkProps) => {\n const { currentTheme } = useTheme();\n const buttonClass = `button button--${toKebabCase(buttonType)} ${className || ''}`;\n const rel = target === '_blank' ? 'noopener noreferrer' : undefined;\n const iconConfig = getButtonIcon(buttonType, resolveIcon(icon), resolveIcon(hoverIcon), currentTheme?.name);\n const resolvedIconPosition = iconPosition ?? (iconConfig && currentTheme?.name === 'primax' ? 'trailing' : undefined);\n\n const iconNode =\n iconConfig &&\n (iconConfig.hover ? (\n <>\n <span className=\"icon icon--regular\">{iconConfig.regular}</span>\n <span className=\"icon icon--hover\">{iconConfig.hover}</span>\n </>\n ) : (\n <span className=\"icon\">{iconConfig.regular}</span>\n ));\n\n if (disabled) {\n return (\n <span\n className={buttonClass}\n data-size={size}\n data-dark-mode={darkMode || undefined}\n style={style}\n aria-disabled=\"true\"\n {...props}\n >\n {resolvedIconPosition === 'leading' && iconNode}\n {children || label}\n {resolvedIconPosition === 'trailing' && iconNode}\n </span>\n );\n }\n\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n className={buttonClass}\n data-size={size}\n data-dark-mode={darkMode || undefined}\n style={style}\n {...props}\n >\n {resolvedIconPosition === 'leading' && iconNode}\n {children || label}\n {resolvedIconPosition === 'trailing' && iconNode}\n </a>\n );\n};\n","import React, { AnchorHTMLAttributes } from 'react';\nimport { resolveIcon } from '@/components/atoms/Button/buttonIcons';\nimport './TextLink.scss';\n\nexport type TextLinkType = 'in-text' | 'external';\n\nexport interface TextLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n linkType?: TextLinkType;\n label: string;\n disabled?: boolean;\n darkMode?: boolean;\n href?: string;\n icon?: string | React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n 'data-testid'?: string;\n}\n\nexport const TextLink: React.FC<TextLinkProps> = ({\n linkType,\n label,\n disabled = false,\n darkMode = false,\n href,\n icon,\n className = '',\n style,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n 'data-testid': testId,\n}) => {\n const isExternal = linkType === 'external';\n const target = isExternal ? '_blank' : '_self';\n\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n event.preventDefault();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n }\n };\n\n const typeClass = isExternal ? 'text-link--external' : '';\n const resolvedIcon = resolveIcon(icon);\n\n if (!href || disabled) {\n return (\n <span\n className={`text-link text-link--disabled ${typeClass} ${className}`}\n data-dark-mode={darkMode || undefined}\n style={style}\n data-testid={testId}\n aria-label={ariaLabel || label}\n aria-describedby={ariaDescribedBy}\n >\n {label} {resolvedIcon}\n </span>\n );\n }\n\n return (\n <a\n href={href}\n target={target}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={`text-link ${typeClass} ${className}`}\n data-dark-mode={darkMode || undefined}\n style={style}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n data-testid={testId}\n >\n {label} {resolvedIcon}\n </a>\n );\n};\n","import React from 'react';\nimport './BackgroundMedia.scss';\n\nexport interface BackgroundMediaProps {\n /** Video URL for video background */\n videoUrl?: string;\n /** Image URL for image background */\n imageUrl?: string;\n /** CSS gradient overlay */\n gradient?: string;\n /** Background color */\n bgColor?: string;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/** Background media component supporting image or video */\nexport const BackgroundMedia: React.FC<BackgroundMediaProps> = ({\n videoUrl,\n imageUrl,\n gradient,\n bgColor,\n className,\n style,\n}) => {\n const baseClasses = ['background-media', className].filter(Boolean).join(' ');\n\n if (videoUrl) {\n return (\n <video className={`${baseClasses} background-media--video`} autoPlay muted loop playsInline style={style}>\n <source src={videoUrl} type=\"video/mp4\" />\n Your browser does not support video.\n </video>\n );\n }\n\n const backgroundStyle: React.CSSProperties = {\n backgroundImage: gradient ? `${gradient}, url(${imageUrl})` : imageUrl ? `url(${imageUrl})` : undefined,\n backgroundColor: bgColor,\n ...style,\n };\n\n return <div className={baseClasses} style={backgroundStyle} />;\n};\n","import React, { useRef, useEffect, useState } from 'react';\nimport './Media.scss';\n\nconst WISTIA_SCRIPT_ID = 'wistia-external-script';\nconst WISTIA_SCRIPT_SRC = 'https://fast.wistia.com/assets/external/E-v1.js';\n\n/** Extract Wistia video ID from various URL formats or bare IDs */\nfunction extractWistiaId(url: string): string | null {\n // Bare Wistia ID (alphanumeric, 8-12 chars, no slashes or dots)\n if (/^[a-zA-Z0-9]{8,12}$/.test(url)) return url;\n const match = url.match(/(?:medias|iframe)\\/([a-zA-Z0-9]+)/) || url.match(/wi\\.st\\/medias\\/([a-zA-Z0-9]+)/);\n return match?.[1] ?? null;\n}\n\n/** Check if a URL is a Wistia video or bare Wistia ID */\nfunction isWistiaUrl(url: string): boolean {\n if (/^[a-zA-Z0-9]{8,12}$/.test(url)) return true;\n return /wistia\\.(com|net)/i.test(url) || /wi\\.st/i.test(url);\n}\n\nexport interface VideoProviderConfig {\n /** Unique provider key */\n name: string;\n /** Test if a URL belongs to this provider */\n match: (url: string) => boolean;\n /** Build the embed URL for the iframe */\n buildEmbedUrl: (url: string, options?: VideoProviderOptions) => string;\n}\n\nexport interface VideoProviderOptions {\n autoplay?: boolean;\n controls?: boolean;\n muted?: boolean;\n loop?: boolean;\n}\n\n/**\n * Resolve a URL to a custom provider and build the embed URL.\n * Wistia is handled natively (async embed), so only custom providers are checked here.\n */\nfunction resolveCustomProvider(\n url: string,\n providers: VideoProviderConfig[],\n options: VideoProviderOptions\n): { type: 'embed'; embedUrl: string; providerName: string } | { type: 'native' } {\n for (const provider of providers) {\n if (provider.match(url)) {\n return {\n type: 'embed',\n embedUrl: provider.buildEmbedUrl(url, options),\n providerName: provider.name,\n };\n }\n }\n return { type: 'native' };\n}\n\nexport type MediaType = 'image' | 'video';\nexport type ObjectFit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n\nexport interface MediaProps {\n /** Media source URL (image path, video file, or embed URL like Wistia) */\n src: string;\n /** Force media type. Auto-detected if omitted. */\n type?: MediaType;\n /** Alt text for images, title for video iframes */\n alt?: string;\n /** How the media fills its container */\n objectFit?: ObjectFit;\n /** Object position (e.g. \"center top\") */\n objectPosition?: string;\n /** Aspect ratio (e.g. \"16/9\", \"4/3\", \"1/1\"). If omitted, media fills container height. */\n aspectRatio?: string;\n /** Autoplay video (muted by default for browser compliance) */\n autoplay?: boolean;\n /** Show video controls */\n controls?: boolean;\n /** Loop video playback */\n loop?: boolean;\n /** Mute video. Defaults to true when autoplay is enabled. */\n muted?: boolean;\n /** Lazy load media */\n loading?: 'lazy' | 'eager';\n /** Image srcSet for responsive images */\n srcSet?: string;\n /** Image sizes attribute */\n sizes?: string;\n /** Additional video providers (YouTube, Vimeo, etc.) */\n providers?: VideoProviderConfig[];\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Callback when media loads / Wistia is ready */\n onLoad?: () => void;\n /** Callback on load error */\n onError?: () => void;\n /** Callback when Wistia video is ready — receives the Wistia video handle for programmatic control */\n onReady?: (videoHandle: any) => void;\n}\n\n/** Check if a string looks like a bare Wistia media ID (alphanumeric, 8-12 chars) */\nfunction isWistiaId(src: string): boolean {\n return /^[a-zA-Z0-9]{8,12}$/.test(src);\n}\n\n/** Detect media type from URL if not explicitly provided */\nfunction detectMediaType(src: string): MediaType {\n const videoExts = /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i;\n const videoProviders = /wistia\\.(com|net)|wi\\.st/i;\n if (videoExts.test(src) || videoProviders.test(src) || isWistiaId(src)) return 'video';\n return 'image';\n}\n\n/** Atom component for rendering images or videos (native, Wistia async embed, or custom providers) */\nexport const Media: React.FC<MediaProps> = ({\n src,\n type,\n alt = '',\n objectFit = 'cover',\n objectPosition,\n aspectRatio,\n autoplay = false,\n controls = true,\n loop = false,\n muted,\n loading = 'lazy',\n srcSet,\n sizes,\n providers = [],\n darkMode = false,\n className,\n style,\n onLoad,\n onError,\n onReady,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const wistiaDivRef = useRef<HTMLDivElement | null>(null);\n const [isClient, setIsClient] = useState(false);\n const [isWistiaReady, setIsWistiaReady] = useState(false);\n\n const resolvedType = type ?? detectMediaType(src);\n const resolvedMuted = muted ?? autoplay;\n const wistiaId = resolvedType === 'video' ? extractWistiaId(src) : null;\n const isWistia = resolvedType === 'video' && isWistiaUrl(src) && !!wistiaId;\n\n // SSR guard\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n // Wistia: load script and register onReady\n useEffect(() => {\n if (!isClient || !isWistia || !wistiaId) return;\n\n // Inject Wistia E-v1 script once\n if (!document.getElementById(WISTIA_SCRIPT_ID)) {\n const script = document.createElement('script');\n script.id = WISTIA_SCRIPT_ID;\n script.src = WISTIA_SCRIPT_SRC;\n script.async = true;\n document.body.appendChild(script);\n }\n\n // Register with Wistia queue\n (window as any)._wq = (window as any)._wq || [];\n (window as any)._wq.push({\n id: wistiaId,\n onReady: (video: any) => {\n setIsWistiaReady(true);\n onReady?.(video);\n onLoad?.();\n },\n });\n }, [isClient, isWistia, wistiaId, onLoad, onReady]);\n\n // Autoplay native videos after mount\n useEffect(() => {\n if (resolvedType === 'video' && !isWistia && autoplay && videoRef.current) {\n videoRef.current.play().catch(() => {\n // Autoplay blocked by browser — silent fail\n });\n }\n }, [resolvedType, isWistia, autoplay, src]);\n\n const baseClass = 'media';\n const classes = [baseClass, `${baseClass}--${resolvedType}`, className].filter(Boolean).join(' ');\n\n const cssVars: React.CSSProperties = {\n ...(objectFit && ({ '--media-object-fit': objectFit } as React.CSSProperties)),\n ...(objectPosition && ({ '--media-object-position': objectPosition } as React.CSSProperties)),\n ...(aspectRatio && ({ '--media-aspect-ratio': aspectRatio } as React.CSSProperties)),\n ...style,\n };\n\n if (resolvedType === 'image') {\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <img\n className={`${baseClass}__image`}\n src={src}\n alt={alt}\n loading={loading}\n srcSet={srcSet}\n sizes={sizes}\n onLoad={onLoad}\n onError={onError}\n />\n </div>\n );\n }\n\n if (isWistia && wistiaId) {\n // Build Wistia embed options via class names\n const wistiaOptions = [\n `wistia_embed`,\n `wistia_async_${wistiaId}`,\n !controls && 'controlsVisibleOnLoad=false',\n !controls && 'playbar=false',\n !controls && 'playPauseNotifier=false',\n !controls && 'settingsControl=false',\n !controls && 'fullscreenButton=false',\n !controls && 'volumeControl=false',\n !controls && 'smallPlayButton=false',\n autoplay && 'autoPlay=true',\n resolvedMuted && 'muted=true',\n loop && 'endVideoBehavior=loop',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={`${classes} ${baseClass}--provider-wistia`}\n style={cssVars}\n data-dark-mode={darkMode || undefined}\n >\n {isClient && (\n <div\n ref={wistiaDivRef}\n className={`${wistiaOptions} ${baseClass}__wistia`}\n style={{\n width: '100%',\n height: '100%',\n visibility: isWistiaReady ? 'visible' : 'hidden',\n }}\n />\n )}\n </div>\n );\n }\n\n const providerResult = resolveCustomProvider(src, providers, {\n autoplay,\n controls,\n muted: resolvedMuted,\n loop,\n });\n\n if (providerResult.type === 'embed') {\n return (\n <div\n className={`${classes} ${baseClass}--provider-${providerResult.providerName}`}\n style={cssVars}\n data-dark-mode={darkMode || undefined}\n >\n <iframe\n className={`${baseClass}__iframe`}\n src={providerResult.embedUrl}\n title={alt || 'Video'}\n allow=\"autoplay; fullscreen; encrypted-media; picture-in-picture\"\n allowFullScreen\n loading={loading}\n onLoad={onLoad}\n onError={onError}\n />\n </div>\n );\n }\n\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <video\n ref={videoRef}\n className={`${baseClass}__video`}\n src={src}\n autoPlay={autoplay}\n controls={controls}\n loop={loop}\n muted={resolvedMuted}\n playsInline\n onLoadedData={onLoad}\n onError={onError}\n />\n </div>\n );\n};\n","import React from 'react';\nimport './Breadcrumb.scss';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: string;\n darkMode?: boolean;\n className?: string;\n}\n\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({ items, separator = '/', darkMode = false, className = '' }) => {\n return (\n <nav className={`breadcrumb ${className}`} aria-label=\"Breadcrumb\" data-dark-mode={darkMode || undefined}>\n <ol className=\"breadcrumb__list\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={index} className=\"breadcrumb__item\">\n {item.href && !isLast ? (\n <a href={item.href} className=\"breadcrumb__link\">\n {item.label}\n </a>\n ) : (\n <span className=\"breadcrumb__text\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n {!isLast && (\n <span className=\"breadcrumb__separator\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n","import React from 'react';\nimport './Divider.scss';\n\nexport type ShapeDivider = 'top' | 'bottom' | 'both' | 'none';\n\nexport interface DividerProps {\n children?: React.ReactNode;\n backgroundColor?: string;\n backgroundImage?: string;\n backgroundPattern?: 'dots' | 'grid' | 'sparks' | 'none';\n shapeDivider?: ShapeDivider;\n shapeColor?: string;\n className?: string;\n padding?: string;\n height?: string;\n verticalAlign?: 'top' | 'center' | 'bottom';\n darkMode?: boolean;\n /** Control overflow behavior — defaults to 'hidden' */\n overflow?: 'hidden' | 'visible';\n}\n\nexport const Divider: React.FC<DividerProps> = ({\n children,\n backgroundColor,\n backgroundImage,\n backgroundPattern = 'none',\n shapeDivider = 'none',\n shapeColor = '#ffffff',\n className = '',\n padding,\n height,\n verticalAlign = 'top',\n darkMode = false,\n overflow,\n}) => {\n const dividerClasses = [\n 'divider',\n `divider--divider-${shapeDivider}`,\n backgroundPattern !== 'none' && `divider--pattern-${backgroundPattern}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const style: React.CSSProperties = {\n ...(backgroundColor && ({ '--divider-bg': backgroundColor } as React.CSSProperties)),\n ...(backgroundImage &&\n ({\n '--divider-bg-image': `url(${backgroundImage})`,\n } as React.CSSProperties)),\n ...(padding && ({ '--divider-padding': padding } as React.CSSProperties)),\n ...(height && ({ '--divider-height': height } as React.CSSProperties)),\n ...(verticalAlign && ({ '--divider-vertical-align': verticalAlign } as React.CSSProperties)),\n ...(shapeColor && ({ '--divider-shape-color': shapeColor } as React.CSSProperties)),\n ...(overflow && ({ '--divider-overflow': overflow } as React.CSSProperties)),\n };\n\n return (\n <div className={dividerClasses} style={style} data-dark-mode={darkMode || undefined} data-test=\"test\">\n {/* Background layer — receives clip-path from shape dividers */}\n <div className=\"divider__bg\" />\n {/* Content layer — unclipped so decorative elements (sparkles) aren't cut off */}\n <div className=\"divider__content\">{children}</div>\n </div>\n );\n};\n","import React from 'react';\nimport './Container.scss';\n\nexport interface ContainerProps {\n children?: React.ReactNode;\n /** Full-width container with no max-width constraint */\n fluid?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** HTML element to render — defaults to div */\n as?: React.ElementType;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\nexport const Container: React.FC<ContainerProps> = ({\n children,\n fluid = false,\n className = '',\n as: Tag = 'div',\n style,\n}) => {\n const classes = [fluid ? 'container-fluid' : 'container', className].filter(Boolean).join(' ');\n\n return (\n <Tag className={classes} style={style}>\n {children}\n </Tag>\n );\n};\n","import React from 'react';\nimport type { SemanticColorTokens } from '@/themes/core/color-system';\nimport { toKebabCase } from '@/themes/utils/helpers';\nimport './Heading.scss';\n\nexport type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\nexport type ColorPalette = 'primary' | 'secondary' | 'accent' | 'tertiary';\nexport type HeadingWeight = 'light' | 'regular' | 'semibold' | 'bold' | 'black';\nexport type HeadingSize = '2xl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs';\n\n// Variant type is now flexible - accepts any string\n// The actual available variants are defined in the theme\nexport type HeadingVariant = string;\n\n// Color type derives from SemanticColorTokens keys\n// Automatically converts camelCase to kebab-case for CSS variables\nexport type HeadingColor = keyof SemanticColorTokens;\n\nexport interface HeadingProps {\n /** Heading level (semantic HTML tag) */\n level?: HeadingLevel;\n /** Visual style variant (independent of semantic level) - defined by theme */\n variant?: HeadingVariant;\n /** Font weight (maps to --tier1-theme-typography-font-weight-*) */\n weight?: HeadingWeight;\n /** Font size (maps to --tier1-theme-typography-font-size-*) */\n size?: HeadingSize;\n /** Color from theme semantic tokens */\n color?: HeadingColor;\n /** Color palette to apply (background + text) */\n palette?: ColorPalette;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Heading text */\n children: React.ReactNode;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Heading component with configurable level and visual variants\n * Supports responsive typography through CSS custom properties\n */\nexport const Heading: React.FC<HeadingProps> = ({\n level = 'h2',\n variant,\n weight,\n size,\n color,\n palette,\n darkMode = false,\n children,\n className,\n style,\n}) => {\n const Tag = level;\n\n // Apply palette, color, weight, and size\n let finalStyle = style;\n\n if (palette) {\n finalStyle = {\n ...style,\n backgroundColor: `var(--${palette})`,\n color: `var(--${palette}-text)`,\n padding: style?.padding || '0.5rem 1rem',\n borderRadius: style?.borderRadius || '4px',\n };\n } else if (color) {\n finalStyle = {\n ...style,\n color: `var(--${toKebabCase(color as string)})`,\n };\n }\n\n // Apply weight and size using theme typography tokens\n if (weight) {\n finalStyle = {\n ...finalStyle,\n fontWeight: `var(--tier1-theme-typography-font-weight-${weight})`,\n };\n }\n\n if (size) {\n finalStyle = {\n ...finalStyle,\n fontSize: `var(--tier1-theme-typography-font-size-${size === '2xl' ? '2xl' : size})`,\n };\n }\n\n const headingClasses = ['heading', `heading--${level}`, variant && `heading--variant-${variant}`, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Tag className={headingClasses} style={finalStyle} data-dark-mode={darkMode ? 'true' : undefined}>\n {children}\n </Tag>\n );\n};\n","import React from 'react';\nimport './Grid.scss';\n\nexport interface GridProps {\n /** Number of columns (default: 12). Use a string for custom grid-template-columns (e.g. \"1fr auto\") */\n columns?:\n | number\n | string\n | { sm?: number | string; md?: number | string; lg?: number | string; xl?: number | string };\n /** Gap between grid items */\n gap?: string | { xs?: string; sm?: string; md?: string; lg?: string; xl?: string };\n /** Row gap (if different from column gap) */\n rowGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Column gap (if different from row gap) */\n columnGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Minimum column width (auto-fit behavior) */\n minColumnWidth?: string;\n /** Maximum column width */\n maxColumnWidth?: string;\n /** Align items vertically */\n alignItems?: 'start' | 'center' | 'end' | 'stretch';\n /** Justify items horizontally (aligns content inside each grid cell) */\n justifyItems?: 'start' | 'center' | 'end' | 'stretch';\n /** Justify content (aligns the entire grid within the container) */\n justifyContent?: 'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly';\n /** Column alignment (left, center, right) - controls entire grid position */\n columnAlign?: 'left' | 'center' | 'right';\n /** Custom className */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Children elements */\n children: React.ReactNode;\n /** Full width grid */\n fullWidth?: boolean;\n}\n\nexport interface GridItemProps {\n /** Column span - use \"auto\" to fit content width */\n colSpan?:\n | number\n | 'auto'\n | { sm?: number | 'auto'; md?: number | 'auto'; lg?: number | 'auto'; xl?: number | 'auto' };\n /** Row span - use \"auto\" to fit content height */\n rowSpan?:\n | number\n | 'auto'\n | { sm?: number | 'auto'; md?: number | 'auto'; lg?: number | 'auto'; xl?: number | 'auto' };\n /** Column start position */\n colStart?: number | { sm?: number; md?: number; lg?: number; xl?: number };\n /** Row start position */\n rowStart?: number | { sm?: number; md?: number; lg?: number; xl?: number };\n /** Gap between grid items */\n gap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Row gap (if different from column gap) */\n rowGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Column gap (if different from row gap) */\n columnGap?: string | { sm?: string; md?: string; lg?: string; xl?: string };\n /** Custom className */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Children elements */\n children: React.ReactNode;\n}\n\nexport const Grid = ({\n columns = 12,\n gap,\n rowGap,\n columnGap,\n minColumnWidth,\n maxColumnWidth,\n alignItems,\n justifyItems,\n justifyContent,\n columnAlign,\n className = '',\n style = {},\n children,\n fullWidth = false,\n}: GridProps) => {\n const gridClass = `grid ${fullWidth ? 'grid--full-width' : ''} ${className}`;\n\n // Map columnAlign to justifyContent (aligns entire grid)\n const resolvedJustifyContent = columnAlign\n ? columnAlign === 'left'\n ? 'start'\n : columnAlign === 'right'\n ? 'end'\n : 'center'\n : justifyContent;\n\n // Build inline styles for responsive behavior\n const gridStyles: Record<string, string | number | undefined> = {\n ...style,\n alignItems,\n justifyItems,\n justifyContent: resolvedJustifyContent,\n };\n\n // Handle columns with automatic responsive defaults\n if (typeof columns === 'number') {\n // Set the base column count\n gridStyles['--grid-columns'] = columns.toString();\n\n // Auto-generate responsive breakpoints only when not using minColumnWidth\n // (minColumnWidth creates its own responsive behavior via auto-fit)\n if (!minColumnWidth) {\n // Mobile: 1 column for 3+ columns, preserve original for 1-2 columns\n if (columns >= 3) {\n gridStyles['--grid-columns-sm'] = '1';\n }\n\n // Tablet: 2 columns for 3+ columns, preserve original for 1-2 columns\n if (columns >= 3) {\n gridStyles['--grid-columns-md'] = '2';\n }\n\n // Desktop: use the specified column count\n gridStyles['--grid-columns-lg'] = columns.toString();\n }\n } else if (typeof columns === 'string') {\n // Custom grid-template-columns string (e.g., \"1fr auto\")\n gridStyles.gridTemplateColumns = columns;\n } else if (columns) {\n // Manual responsive control - user provides breakpoint values\n if (columns.sm !== undefined) {\n if (typeof columns.sm === 'string') {\n gridStyles['--grid-template-columns-sm'] = columns.sm;\n } else {\n gridStyles['--grid-columns-sm'] = columns.sm.toString();\n }\n }\n if (columns.md !== undefined) {\n if (typeof columns.md === 'string') {\n gridStyles['--grid-template-columns-md'] = columns.md;\n } else {\n gridStyles['--grid-columns-md'] = columns.md.toString();\n }\n }\n if (columns.lg !== undefined) {\n if (typeof columns.lg === 'string') {\n gridStyles['--grid-template-columns-lg'] = columns.lg;\n } else {\n gridStyles['--grid-columns-lg'] = columns.lg.toString();\n }\n }\n if (columns.xl !== undefined) {\n if (typeof columns.xl === 'string') {\n gridStyles['--grid-template-columns-xl'] = columns.xl;\n } else {\n gridStyles['--grid-columns-xl'] = columns.xl.toString();\n }\n } else if (columns.lg !== undefined) {\n // xl inherits from lg when not explicitly set\n if (typeof columns.lg === 'string') {\n gridStyles['--grid-template-columns-xl'] = columns.lg;\n } else {\n gridStyles['--grid-columns-xl'] = columns.lg.toString();\n }\n }\n }\n\n // Handle min/max column width for auto-fit\n if (minColumnWidth) {\n gridStyles['--grid-min-column-width'] = minColumnWidth;\n }\n if (maxColumnWidth) {\n gridStyles['--grid-max-column-width'] = maxColumnWidth;\n }\n\n // Handle gaps - use theme tokens as fallback\n if (gap) {\n if (typeof gap === 'string') {\n // Map t-shirt sizes to grid component tokens\n const gapMap: Record<string, string> = {\n xs: 'var(--grid-gap-xs)',\n sm: 'var(--grid-gap-sm)',\n md: 'var(--grid-gap-md)',\n lg: 'var(--grid-gap-lg)',\n xl: 'var(--grid-gap-xl)',\n xxl: 'var(--grid-gap-xxl)',\n };\n gridStyles.gap = gapMap[gap] || gap;\n } else {\n if (gap.sm) gridStyles['--grid-gap-sm'] = gap.sm;\n if (gap.md) gridStyles['--grid-gap-md'] = gap.md;\n if (gap.lg) gridStyles['--grid-gap-lg'] = gap.lg;\n gridStyles['--grid-gap-xl'] = gap.xl || gap.lg || gap.md || gap.sm || '2rem';\n }\n } else {\n // Use theme tokens when no gap prop is provided\n gridStyles['--grid-gap-sm'] = 'var(--grid-gap-mobile, 1rem)';\n gridStyles['--grid-gap-md'] = 'var(--grid-gap-tablet, 1.5rem)';\n gridStyles['--grid-gap-lg'] = 'var(--grid-gap, 2rem)';\n gridStyles['--grid-gap-xl'] = 'var(--grid-gap, 2rem)';\n }\n\n if (rowGap) {\n if (typeof rowGap === 'string') {\n gridStyles.rowGap = rowGap;\n } else {\n if (rowGap.sm) gridStyles['--grid-row-gap-sm'] = rowGap.sm;\n if (rowGap.md) gridStyles['--grid-row-gap-md'] = rowGap.md;\n if (rowGap.lg) gridStyles['--grid-row-gap-lg'] = rowGap.lg;\n gridStyles['--grid-row-gap-xl'] = rowGap.xl || rowGap.lg || rowGap.md || rowGap.sm || '2rem';\n }\n }\n\n if (columnGap) {\n if (typeof columnGap === 'string') {\n gridStyles.columnGap = columnGap;\n } else {\n if (columnGap.sm) gridStyles['--grid-column-gap-sm'] = columnGap.sm;\n if (columnGap.md) gridStyles['--grid-column-gap-md'] = columnGap.md;\n if (columnGap.lg) gridStyles['--grid-column-gap-lg'] = columnGap.lg;\n gridStyles['--grid-column-gap-xl'] = columnGap.xl || columnGap.lg || columnGap.md || columnGap.sm || '2rem';\n }\n }\n\n return (\n <div className={gridClass} style={gridStyles as React.CSSProperties}>\n {children}\n </div>\n );\n};\n\nexport const GridItem = ({\n colSpan,\n rowSpan,\n colStart,\n rowStart,\n gap,\n rowGap,\n columnGap,\n className = '',\n style = {},\n children,\n}: GridItemProps) => {\n const itemStyles: Record<string, string | number | undefined> = { ...style };\n\n // Handle column span\n if (typeof colSpan === 'number') {\n itemStyles.gridColumn = `span ${colSpan}`;\n } else if (colSpan === 'auto') {\n itemStyles.gridColumn = 'auto';\n } else if (colSpan) {\n if (colSpan.sm) itemStyles['--grid-col-span-sm'] = colSpan.sm === 'auto' ? 'auto' : colSpan.sm.toString();\n if (colSpan.md) itemStyles['--grid-col-span-md'] = colSpan.md === 'auto' ? 'auto' : colSpan.md.toString();\n if (colSpan.lg) itemStyles['--grid-col-span-lg'] = colSpan.lg === 'auto' ? 'auto' : colSpan.lg.toString();\n if (colSpan.xl) itemStyles['--grid-col-span-xl'] = colSpan.xl === 'auto' ? 'auto' : colSpan.xl.toString();\n }\n\n // Handle row span\n if (typeof rowSpan === 'number') {\n itemStyles.gridRow = `span ${rowSpan}`;\n } else if (rowSpan === 'auto') {\n itemStyles.gridRow = 'auto';\n } else if (rowSpan) {\n if (rowSpan.sm) itemStyles['--grid-row-span-sm'] = rowSpan.sm === 'auto' ? 'auto' : rowSpan.sm.toString();\n if (rowSpan.md) itemStyles['--grid-row-span-md'] = rowSpan.md === 'auto' ? 'auto' : rowSpan.md.toString();\n if (rowSpan.lg) itemStyles['--grid-row-span-lg'] = rowSpan.lg === 'auto' ? 'auto' : rowSpan.lg.toString();\n if (rowSpan.xl) itemStyles['--grid-row-span-xl'] = rowSpan.xl === 'auto' ? 'auto' : rowSpan.xl.toString();\n }\n\n // Handle column start\n if (typeof colStart === 'number') {\n itemStyles.gridColumnStart = colStart;\n } else if (colStart) {\n if (colStart.sm) itemStyles['--grid-col-start-sm'] = colStart.sm.toString();\n if (colStart.md) itemStyles['--grid-col-start-md'] = colStart.md.toString();\n if (colStart.lg) itemStyles['--grid-col-start-lg'] = colStart.lg.toString();\n if (colStart.xl) itemStyles['--grid-col-start-xl'] = colStart.xl.toString();\n }\n\n // Handle row start\n if (typeof rowStart === 'number') {\n itemStyles.gridRowStart = rowStart;\n } else if (rowStart) {\n if (rowStart.sm) itemStyles['--grid-row-start-sm'] = rowStart.sm.toString();\n if (rowStart.md) itemStyles['--grid-row-start-md'] = rowStart.md.toString();\n if (rowStart.lg) itemStyles['--grid-row-start-lg'] = rowStart.lg.toString();\n if (rowStart.xl) itemStyles['--grid-row-start-xl'] = rowStart.xl.toString();\n }\n\n // Handle gaps\n if (gap) {\n if (typeof gap === 'string') {\n itemStyles.gap = gap;\n } else {\n if (gap.sm) itemStyles['--grid-item-gap-sm'] = gap.sm;\n if (gap.md) itemStyles['--grid-item-gap-md'] = gap.md;\n if (gap.lg) itemStyles['--grid-item-gap-lg'] = gap.lg;\n if (gap.xl) itemStyles['--grid-item-gap-xl'] = gap.xl;\n }\n }\n\n if (rowGap) {\n if (typeof rowGap === 'string') {\n itemStyles.rowGap = rowGap;\n } else {\n if (rowGap.sm) itemStyles['--grid-item-row-gap-sm'] = rowGap.sm;\n if (rowGap.md) itemStyles['--grid-item-row-gap-md'] = rowGap.md;\n if (rowGap.lg) itemStyles['--grid-item-row-gap-lg'] = rowGap.lg;\n if (rowGap.xl) itemStyles['--grid-item-row-gap-xl'] = rowGap.xl;\n }\n }\n\n if (columnGap) {\n if (typeof columnGap === 'string') {\n itemStyles.columnGap = columnGap;\n } else {\n if (columnGap.sm) itemStyles['--grid-item-column-gap-sm'] = columnGap.sm;\n if (columnGap.md) itemStyles['--grid-item-column-gap-md'] = columnGap.md;\n if (columnGap.lg) itemStyles['--grid-item-column-gap-lg'] = columnGap.lg;\n if (columnGap.xl) itemStyles['--grid-item-column-gap-xl'] = columnGap.xl;\n }\n }\n\n return (\n <div className={`grid-item ${className}`} style={itemStyles as React.CSSProperties}>\n {children}\n </div>\n );\n};\n","import React from 'react';\nimport './Icon.scss';\n\nexport type IconSizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';\n\nexport interface IconProps {\n /**\n * SVG content or path to SVG\n */\n svg: React.ReactNode;\n /**\n * Icon size variant\n */\n size?: IconSizeType;\n /**\n * Icon color variant\n */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'inherit';\n /**\n * Custom fill color (overrides color variant)\n */\n fill?: string;\n /**\n * Custom stroke color (overrides color variant)\n */\n stroke?: string;\n /**\n * Custom stroke width (overrides color variant)\n */\n strokeWidth?: string | number;\n /**\n * Additional CSS class\n */\n className?: string;\n /**\n * Accessible label for screen readers\n */\n ariaLabel?: string;\n /**\n * Whether icon is decorative (hidden from screen readers)\n */\n decorative?: boolean;\n}\n\nexport const Icon: React.FC<IconProps> = ({\n svg,\n size = 'lg',\n color = 'inherit',\n fill = '',\n stroke = '',\n strokeWidth = '0',\n className = '',\n ariaLabel,\n decorative = false,\n ...props\n}) => {\n const classes = [\n 'icon-component',\n `icon-component--${size}`,\n color !== 'inherit' ? `icon-component--${color}` : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Build inline styles for custom fill/stroke/strokeWidth\n const customStyles: Record<string, string | number> = {};\n if (fill) customStyles['--icon-fill'] = fill;\n if (stroke) customStyles['--icon-stroke'] = stroke;\n if (strokeWidth !== undefined) customStyles['--icon-stroke-width'] = strokeWidth;\n\n return (\n <span\n className={classes}\n data-size={size}\n style={Object.keys(customStyles).length > 0 ? customStyles : undefined}\n role={decorative ? 'presentation' : 'img'}\n aria-label={decorative ? undefined : ariaLabel}\n aria-hidden={decorative ? 'true' : undefined}\n {...props}\n >\n {svg}\n </span>\n );\n};\n","import React from 'react';\nimport './RichText.scss';\n\nexport interface RichTextProps {\n /** HTML content to render */\n content: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Maximum width constraint */\n maxWidth?: string;\n}\n\n/**\n * RichText component for rendering styled HTML content\n * Inherits typography styles from Heading and TextLink components\n * Supports future extension for lists, paragraphs, and other HTML elements\n */\nexport const RichText: React.FC<RichTextProps> = ({ content, darkMode = false, className, style, maxWidth }) => {\n const richTextClasses = ['rich-text', className].filter(Boolean).join(' ');\n\n const finalStyle = maxWidth ? { ...style, maxWidth } : style;\n\n return (\n <div\n className={richTextClasses}\n style={finalStyle}\n data-dark-mode={darkMode ? 'true' : undefined}\n dangerouslySetInnerHTML={{ __html: content }}\n />\n );\n};\n","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n /** Type for the root element of a document */\n ElementType[\"Root\"] = \"root\";\n /** Type for Text */\n ElementType[\"Text\"] = \"text\";\n /** Type for <? ... ?> */\n ElementType[\"Directive\"] = \"directive\";\n /** Type for <!-- ... --> */\n ElementType[\"Comment\"] = \"comment\";\n /** Type for <script> tags */\n ElementType[\"Script\"] = \"script\";\n /** Type for <style> tags */\n ElementType[\"Style\"] = \"style\";\n /** Type for Any tag */\n ElementType[\"Tag\"] = \"tag\";\n /** Type for <![CDATA[ ... ]]> */\n ElementType[\"CDATA\"] = \"cdata\";\n /** Type for <!doctype ...> */\n ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n * @param element Element to test\n * @param element.type Node type discriminator to check.\n */\nexport function isTag(element) {\n return (element.type === ElementType.Tag ||\n element.type === ElementType.Script ||\n element.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\n// eslint-disable-next-line prefer-destructuring\nexport const Root = ElementType.Root;\n/** Type for Text */\n// eslint-disable-next-line prefer-destructuring\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\n// eslint-disable-next-line prefer-destructuring\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\n// eslint-disable-next-line prefer-destructuring\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Style = ElementType.Style;\n/** Type for Any tag */\n// eslint-disable-next-line prefer-destructuring\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\n// eslint-disable-next-line prefer-destructuring\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\n// eslint-disable-next-line prefer-destructuring\nexport const Doctype = ElementType.Doctype;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n /** Parent of the node */\n parent = null;\n /** Previous sibling */\n prev = null;\n /** Next sibling */\n next = null;\n /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n startIndex = null;\n /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n endIndex = null;\n // Read-write aliases for properties\n /**\n * Same as {@link parent}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get parentNode() {\n return this.parent;\n }\n set parentNode(parent) {\n this.parent = parent;\n }\n /**\n * Same as {@link prev}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get previousSibling() {\n return this.prev;\n }\n set previousSibling(previous) {\n this.prev = previous;\n }\n /**\n * Same as {@link next}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nextSibling() {\n return this.next;\n }\n set nextSibling(next) {\n this.next = next;\n }\n /**\n * Clone this node, and optionally its children.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\n cloneNode(recursive = false) {\n return cloneNode(this, recursive);\n }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n data;\n /**\n * @param data The content of the data node\n */\n constructor(data) {\n super();\n this.data = data;\n }\n /**\n * Same as {@link data}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nodeValue() {\n return this.data;\n }\n set nodeValue(data) {\n this.data = data;\n }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n type = ElementType.Text;\n get nodeType() {\n return 3;\n }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n type = ElementType.Comment;\n get nodeType() {\n return 8;\n }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n type = ElementType.Directive;\n name;\n constructor(name, data) {\n super(data);\n this.name = name;\n }\n get nodeType() {\n return 1;\n }\n /** If this is a doctype, the document type name (parse5 only). */\n \"x-name\";\n /** If this is a doctype, the document type public identifier (parse5 only). */\n \"x-publicId\";\n /** If this is a doctype, the document type system identifier (parse5 only). */\n \"x-systemId\";\n}\n/**\n * A node that can have children.\n */\nexport class NodeWithChildren extends Node {\n children;\n /**\n * @param children Children of the node. Only certain node types can have children.\n */\n constructor(children) {\n super();\n this.children = children;\n }\n // Aliases\n /** First child of the node. */\n get firstChild() {\n return this.children[0] ?? null;\n }\n /** Last child of the node. */\n get lastChild() {\n return this.children.length > 0\n ? this.children[this.children.length - 1]\n : null;\n }\n /**\n * Same as {@link children}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get childNodes() {\n return this.children;\n }\n set childNodes(children) {\n this.children = children;\n }\n}\n/**\n * CDATA nodes.\n */\nexport class CDATA extends NodeWithChildren {\n type = ElementType.CDATA;\n get nodeType() {\n return 4;\n }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n type = ElementType.Root;\n get nodeType() {\n return 9;\n }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n name;\n attribs;\n type;\n /**\n * @param name Name of the tag, eg. `div`, `span`.\n * @param attribs Object mapping attribute names to attribute values.\n * @param children Children of the node.\n * @param type Node type used for the new node instance.\n */\n constructor(name, attribs, children = [], type = name === \"script\"\n ? ElementType.Script\n : name === \"style\"\n ? ElementType.Style\n : ElementType.Tag) {\n super(children);\n this.name = name;\n this.attribs = attribs;\n this.type = type;\n }\n get nodeType() {\n return 1;\n }\n // DOM Level 1 aliases\n /**\n * Same as {@link name}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get tagName() {\n return this.name;\n }\n set tagName(name) {\n this.name = name;\n }\n get attributes() {\n return Object.keys(this.attribs).map((name) => ({\n name,\n value: this.attribs[name],\n namespace: this[\"x-attribsNamespace\"]?.[name],\n prefix: this[\"x-attribsPrefix\"]?.[name],\n }));\n }\n /** Element namespace (parse5 only). */\n namespace;\n /** Element attribute namespaces (parse5 only). */\n \"x-attribsNamespace\";\n /** Element attribute namespace-related prefixes (parse5 only). */\n \"x-attribsPrefix\";\n}\n/**\n * Checks if `node` is an element node.\n * @param node Node to check.\n * @returns `true` if the node is an element node.\n */\nexport function isTag(node) {\n return isTagRaw(node);\n}\n/**\n * Checks if `node` is a CDATA node.\n * @param node Node to check.\n * @returns `true` if the node is a CDATA node.\n */\nexport function isCDATA(node) {\n return node.type === ElementType.CDATA;\n}\n/**\n * Checks if `node` is a text node.\n * @param node Node to check.\n * @returns `true` if the node is a text node.\n */\nexport function isText(node) {\n return node.type === ElementType.Text;\n}\n/**\n * Checks if `node` is a comment node.\n * @param node Node to check.\n * @returns `true` if the node is a comment node.\n */\nexport function isComment(node) {\n return node.type === ElementType.Comment;\n}\n/**\n * Checks if `node` is a directive node.\n * @param node Node to check.\n * @returns `true` if the node is a directive node.\n */\nexport function isDirective(node) {\n return node.type === ElementType.Directive;\n}\n/**\n * Checks if `node` is a document node.\n * @param node Node to check.\n * @returns `true` if the node is a document node.\n */\nexport function isDocument(node) {\n return node.type === ElementType.Root;\n}\n/**\n * Checks if `node` has children.\n * @param node Node to check.\n * @returns `true` if the node has children.\n */\nexport function hasChildren(node) {\n return Object.hasOwn(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n * @param node Node to clone.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n let result;\n if (isText(node)) {\n result = new Text(node.data);\n }\n else if (isComment(node)) {\n result = new Comment(node.data);\n }\n else if (isTag(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Element(node.name, { ...node.attribs }, children);\n for (const child of children) {\n child.parent = clone;\n }\n if (node.namespace != null) {\n clone.namespace = node.namespace;\n }\n if (node[\"x-attribsNamespace\"]) {\n clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n }\n if (node[\"x-attribsPrefix\"]) {\n clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n }\n result = clone;\n }\n else if (isCDATA(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new CDATA(children);\n for (const child of children) {\n child.parent = clone;\n }\n result = clone;\n }\n else if (isDocument(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Document(children);\n for (const child of children) {\n child.parent = clone;\n }\n if (node[\"x-mode\"]) {\n clone[\"x-mode\"] = node[\"x-mode\"];\n }\n result = clone;\n }\n else if (isDirective(node)) {\n const instruction = new ProcessingInstruction(node.name, node.data);\n if (node[\"x-name\"] != null) {\n instruction[\"x-name\"] = node[\"x-name\"];\n instruction[\"x-publicId\"] = node[\"x-publicId\"];\n instruction[\"x-systemId\"] = node[\"x-systemId\"];\n }\n result = instruction;\n }\n else {\n throw new Error(`Not implemented yet: ${node.type}`);\n }\n result.startIndex = node.startIndex;\n result.endIndex = node.endIndex;\n if (node.sourceCodeLocation != null) {\n result.sourceCodeLocation = node.sourceCodeLocation;\n }\n return result;\n}\n/**\n * Clone a list of child nodes.\n * @param childs The child nodes to clone.\n * @returns A list of cloned child nodes.\n */\nfunction cloneChildren(childs) {\n const children = childs.map((child) => cloneNode(child, true));\n for (let index = 1; index < children.length; index++) {\n children[index].prev = children[index - 1];\n children[index - 1].next = children[index];\n }\n return children;\n}\n","import { ElementType } from \"domelementtype\";\nimport { CDATA, Comment, Document, Element, ProcessingInstruction, Text, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOptions = {\n withStartIndices: false,\n withEndIndices: false,\n xmlMode: false,\n};\n/**\n * Event-based handler that builds a DOM tree from parser callbacks.\n */\nexport class DomHandler {\n /** The elements of the DOM */\n dom = [];\n /** The root element for the DOM */\n root = new Document(this.dom);\n /** Called once parsing has completed. */\n callback;\n /** Settings for the handler. */\n options;\n /** Callback whenever a tag is closed. */\n elementCB;\n /** Indicated whether parsing has been completed. */\n done = false;\n /** Stack of open tags. */\n tagStack = [this.root];\n /** A data node that is still being written to. */\n lastNode = null;\n /** Reference to the parser instance. Used for location information. */\n parser = null;\n /**\n * @param callback Called once parsing has completed.\n * @param options Settings for the handler.\n * @param elementCB Callback whenever a tag is closed.\n */\n constructor(callback, options, elementCB) {\n // Make it possible to skip arguments, for backwards-compatibility\n if (typeof options === \"function\") {\n elementCB = options;\n options = defaultOptions;\n }\n if (typeof callback === \"object\") {\n options = callback;\n callback = undefined;\n }\n this.callback = callback ?? null;\n this.options = options ?? defaultOptions;\n this.elementCB = elementCB ?? null;\n }\n onparserinit(parser) {\n this.parser = parser;\n }\n // Resets the handler back to starting state\n onreset() {\n this.dom = [];\n this.root = new Document(this.dom);\n this.done = false;\n this.tagStack = [this.root];\n this.lastNode = null;\n this.parser = null;\n }\n // Signals the handler that parsing is done\n onend() {\n if (this.done)\n return;\n this.done = true;\n this.parser = null;\n this.handleCallback(null);\n }\n onerror(error) {\n this.handleCallback(error);\n }\n onclosetag() {\n this.lastNode = null;\n const element = this.tagStack.pop();\n if (this.options.withEndIndices && this.parser) {\n element.endIndex = this.parser.endIndex;\n }\n if (this.elementCB)\n this.elementCB(element);\n }\n onopentag(name, attribs) {\n const type = this.options.xmlMode ? ElementType.Tag : undefined;\n const element = new Element(name, attribs, undefined, type);\n this.addNode(element);\n this.tagStack.push(element);\n }\n ontext(data) {\n const { lastNode } = this;\n if (lastNode && lastNode.type === ElementType.Text) {\n lastNode.data += data;\n if (this.options.withEndIndices && this.parser) {\n lastNode.endIndex = this.parser.endIndex;\n }\n }\n else {\n const node = new Text(data);\n this.addNode(node);\n this.lastNode = node;\n }\n }\n oncomment(data) {\n if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n this.lastNode.data += data;\n return;\n }\n const node = new Comment(data);\n this.addNode(node);\n this.lastNode = node;\n }\n oncommentend() {\n this.lastNode = null;\n }\n oncdatastart() {\n const text = new Text(\"\");\n const node = new CDATA([text]);\n this.addNode(node);\n text.parent = node;\n this.lastNode = text;\n }\n oncdataend() {\n this.lastNode = null;\n }\n onprocessinginstruction(name, data) {\n const node = new ProcessingInstruction(name, data);\n this.addNode(node);\n }\n handleCallback(error) {\n if (typeof this.callback === \"function\") {\n this.callback(error, this.dom);\n }\n else if (error) {\n throw error;\n }\n }\n addNode(node) {\n const parent = this.tagStack[this.tagStack.length - 1];\n const previousSibling = parent.children[parent.children.length - 1];\n if (this.options.withStartIndices && this.parser) {\n node.startIndex = this.parser.startIndex;\n }\n if (this.options.withEndIndices && this.parser) {\n node.endIndex = this.parser.endIndex;\n }\n parent.children.push(node);\n if (previousSibling) {\n node.prev = previousSibling;\n previousSibling.next = node;\n }\n node.parent = parent;\n this.lastNode = null;\n }\n}\nexport default DomHandler;\n","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nconst decodeMap = new Map([\n [0, 65_533],\n // C1 Unicode control character reference replacements\n [128, 8364],\n [130, 8218],\n [131, 402],\n [132, 8222],\n [133, 8230],\n [134, 8224],\n [135, 8225],\n [136, 710],\n [137, 8240],\n [138, 352],\n [139, 8249],\n [140, 338],\n [142, 381],\n [145, 8216],\n [146, 8217],\n [147, 8220],\n [148, 8221],\n [149, 8226],\n [150, 8211],\n [151, 8212],\n [152, 732],\n [153, 8482],\n [154, 353],\n [155, 8250],\n [156, 339],\n [158, 382],\n [159, 376],\n]);\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n * @param codePoint Unicode code point to convert.\n */\nexport function replaceCodePoint(codePoint) {\n if ((codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n codePoint > 0x10_ff_ff) {\n return 0xff_fd;\n }\n return decodeMap.get(codePoint) ?? codePoint;\n}\n//# sourceMappingURL=decode-codepoint.js.map","/**\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n * @param input Input string to encode or decode.\n */\nexport function decodeBase64(input) {\n const binary = atob(input);\n const evenLength = binary.length & ~1; // Round down to even length\n const out = new Uint16Array(evenLength / 2);\n for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n const lo = binary.charCodeAt(index);\n const hi = binary.charCodeAt(index + 1);\n out[outIndex++] = lo | (hi << 8);\n }\n return out;\n}\n//# sourceMappingURL=decode-shared.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed HTML decode trie data. */\nexport const htmlDecodeTree = /* #__PURE__ */ decodeBase64(\"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWlsN2E6ZHIAAOA12CjdciJlZW4AOGFjAHkARWRjAHkAXGRwAGYAAOA12FzdYwByAADgNdjA3IALQUJFSGFiY2RlZmdoamxtbm9wcnN0dXYAXhxtHHEcdRx5HN8cBx0dHTwd3B3tHfEdAR4EHh0eLB5FHrwewx7hHgkfPR9LH4ABYXJ0AGQcZxxpHHIA8gBvB/IAxQLhIWlsAKAbKeEhcnIAoA4pZ6BmIgCgiyphAHIAAKBiKWMJjRwAAJAcAACVHAAAAAAAAAAAAACZHJwcAACmHKgcrRwAANIc9SF0ZTph7SJwdHl2AKC0KXIAYQDuAFoG4iFkYbtjZwAAoegnZGyhHKMcAKCRKeUAiwYAoIUqdQBvADuAqwCrQHIAgKOQIWJmaGxwc3QAuhy/HMIcxBzHHMoczhxmoOQhcwAAoB8pcwAAoB0p6wCyGnAAAKCrIWwAAKA5KWkAbQAAoHMpbAAAoKIhAKGrKmFl1hzaHGkAbAAAoBkpc6CtKgDgrSoA/oABYWJyAOUc6RztHHIAcgAAoAwpcgBrAACgcicAAWFr8Rz4HGMAAAFla/Yc9xx7YFtgAAFlc/wc/hwAoIspbAAAAWR1Ax0FHQCgjykAoI0pAAJhZXV5Dh0RHRodHB3yIW9uPmEAAWRpFR0YHWkAbAA8YewAowbiAPccO2QAAmNxcnMkHScdLB05HWEAAKA2KXUAbwDyoBwgqhEAAWR1MB00HeghYXIAoGcpcyJoYXIAAKBLKWgAAKCyIQCiZCJmZ3FzRB1FB5Qdnh10AIACYWhscnQATh1WHWUdbB2NHXIicm93AHSgkCFhAOkAzxxhI3Jwb29uAAABZHVeHWId7yF3bgCgvSFwAACgvCHlJGZ0YXJyb3dzAKDHIWkiZ2h0AIABYWhzAHUdex2DHXIicm93APOglCGdBmEAcgBwAG8AbwBuAPMAzgtxAHUAaQBnAGEAcgByAG8A9wBlGugkcmVldGltZXMAoMsi8aFkIk0HAACaHWwAYQBuAPQAXgcAon0qY2Rnc6YdqR2xHbcdYwAAoKgqbwB0AG+gfypyoIEqAKCDKmXg2iIA/nMAAKCTKoACYWRlZ3MAwB3GHcod1h3ZHXAAcAByAG8A+ACmHG8AdAAAoNYicQAAAWdxzx3SHXQA8gBGB2cAdADyAHQcdADyAFMHaQDtAGMHgAFpbHIA4h3mHeod8yFodACgfClvAG8A8gDKBgDgNdgp3UWgdiIAoJEqYQH1Hf4dcgAAAWR1YB35HWygvCEAoGopbABrAACghCVjAHkAWWQAomoiYWNodAweDx4VHhkecgDyAGsdbwByAG4AZQDyAGAW4SFyZACgaylyAGkAAKD6JQABaW8hHiQe5CFvdEBh9SFzdGGgsCPjIWhlAKCwIwACRWFlczMeNR48HkEeAKBoInAAcKCJKvIhb3gAoIkqcaCHKvGghyo0HmkAbQAAoOYiAARhYm5vcHR3elIeXB5fHoUelh6mHqsetB4AAW5yVh5ZHmcAAKDsJ3IAAKD9IXIA6wCwBmcAgAFsbXIAZh52Hnse5SFmdAABYXKIB2weaQBnAGgAdABhAHIAcgBvAPcAkwfhInBzdG8AoPwnaQBnAGgAdABhAHIAcgBvAPcAmgdwI2Fycm93AAABbHKNHpEeZQBmAPQAxhxpImdodAAAoKwhgAFhZmwAnB6fHqIecgAAoIUpAOA12F3ddQBzAACgLSppIm1lcwAAoDQqYQGvHrMecwB0AACgFyLhAIoOZaHKJbkeRhLuIWdlAKDKJWEAcgBsoCgAdAAAoJMpgAJhY2htdADMHs8e1R7bHt0ecgDyAJ0GbwByAG4AZQDyANYWYQByAGSgyyEAoG0pAKAOIHIAaQAAoL8iAANhY2hpcXTrHu8e1QfzHv0eBh/xIXVvAKA5IHIAAOA12MHcbQDloXIi+h4AAPweAKCNKgCgjyoAAWJ19xwBH28AcqAYIACgGiDyIW9rQmEAhDwAO2NkaGlscXJCBhcfxh0gHyQfKB8sHzEfAAFjaRsfHR8AoKYqcgAAoHkqcgBlAOUAkx3tIWVzAKDJIuEhcnIAoHYpdSJlc3QAAKB7KgABUGk1HzkfYQByAACglillocMlAgdfEnIAAAFkdUIfRx9zImhhcgAAoEop6CFhcgCgZikAAWVuTx9WH3IjdG5lcXEAAOBoIgD+xQBUHwAHRGFjZGVmaGlsbm9wc3VuH3Ifoh+rH68ftx+7H74f5h/uH/MfBwj/HwsgxCFvdACgOiIAAmNscHJ5H30fiR+eH3IAO4CvAK9AAAFldIEfgx8AoEImZaAgJ3MAZQAAoCAnc6CmIXQAbwCAoaYhZGx1AJQfmB+cH28AdwDuAHkDZQBmAPQA6gbwAOkO6yFlcgCgriUAAW95ph+qH+0hbWEAoCkqPGThIXNoAKAUIOElc3VyZWRhbmdsZQCgISJyAADgNdgq3W8AAKAnIYABY2RuAMQfyR/bH3IAbwA7gLUAtUBhoiMi0B8AANMf1x9zAPQAKxFpAHIAAKDwKm8AdAA7gLcAt0B1AHMA4qESIh4TAADjH3WgOCIAoCoqYwHqH+0fcAAAoNsq8gB+GnAAbAB1APMACAgAAWRw9x/7H+UhbHMAoKciZgAA4DXYXt0AAWN0AyAHIHIAAOA12MLc8CFvcwCgPiJsobwDECAVIPQiaW1hcACguCJhAPAAEyAADEdMUlZhYmNkZWZnaGlqbG1vcHJzdHV2dzwgRyBmIG0geSCqILgg2iDeIBEhFSEyIUMhTSFQIZwhnyHSIQAiIyKLIrEivyIUIwABZ3RAIEMgAODZIjgD9uBrItIgBwmAAWVsdABNIF8gYiBmAHQAAAFhclMgWCByInJvdwAAoM0h6SRnaHRhcnJvdwCgziEA4NgiOAP24Goi0iBfCekkZ2h0YXJyb3cAoM8hAAFEZHEgdSDhIXNoAKCvIuEhc2gAoK4igAJiY25wdACCIIYgiSCNIKIgbABhAACgByL1IXRlRGFnAADgICLSIACiSSJFaW9wlSCYIJwgniAA4HAqOANkAADgSyI4A3MASWFyAG8A+AAyCnUAcgBhoG4mbADzoG4mmwjzAa8gAACzIHAAO4CgAKBAbQBwAOXgTiI4AyoJgAJhZW91eQDBIMogzSDWINkg8AHGIAAAyCAAoEMqbwBuAEhh5CFpbEZhbgBnAGSgRyJvAHQAAOBtKjgDcAAAoEIqPWThIXNoAKATIACjYCJBYWRxc3jpIO0g+SD+IAIhDCFyAHIAAKDXIXIAAAFocvIg9SBrAACgJClvoJch9wAGD28AdAAA4FAiOAN1AGkA9gC7CAABZWkGIQohYQByAACgKCntAN8I6SFzdPOgBCLlCHIAAOA12CvdAAJFZXN0/wgcISshLiHxoXEiIiEAABMJ8aFxIgAJAAAnIWwAYQBuAPQAEwlpAO0AGQlyoG8iAKBvIoABQWFwADghOyE/IXIA8gBeIHIAcgAAoK4hYQByAACg8ipzogsiSiEAAAAAxwtkoPwiAKD6ImMAeQBaZIADQUVhZGVzdABcIV8hYiFmIWkhkyGWIXIA8gBXIADgZiI4A3IAcgAAoJohcgAAoCUggKFwImZxcwBwIYQhjiF0AAABYXJ1IXohcgByAG8A9wBlIWkAZwBoAHQAYQByAHIAbwD3AD4h8aFwImAhAACKIWwAYQBuAPQAZwlz4H0qOAMAoG4iaQDtAG0JcqBuImkA5aDqIkUJaQDkADoKAAFwdKMhpyFmAADgNdhf3YCBrAA7aW4AriGvIcchrEBuAIChCSJFZHYAtyG6Ib8hAOD5IjgDbwB0AADg9SI4A+EB1gjEIcYhAKD3IgCg9iJpAHagDCLhAagJzyHRIQCg/iIAoP0igAFhb3IA2CHsIfEhcgCAoSYiYXN0AOAh5SHpIWwAbABlAOwAywhsAADg/SrlIADgAiI4A2wiaW50AACgFCrjoYAi9yEAAPohdQDlAJsJY+CvKjgDZaCAIvEAkwkAAkFhaXQHIgoiFyIeInIA8gBsIHIAcgAAoZshY3cRIhQiAOAzKTgDAOCdITgDZyRodGFycm93AACgmyFyAGkA5aDrIr4JgANjaGltcHF1AC8iPCJHIpwhTSJQIloigKGBImNlcgA2Iv0JOSJ1AOUABgoA4DXYw9zvIXJ0bQKdIQAAAABEImEAcgDhAOEhbQBloEEi8aBEIiYKYQDyAMsIcwB1AAABYnBWIlgi5QDUCeUA3wmAAWJjcABgInMieCKAoYQiRWVzAGci7glqIgDgxSo4A2UAdABl4IIi0iBxAPGgiCJoImMAZaCBIvEA/gmAoYUiRWVzAH8iFgqCIgDgxio4A2UAdABl4IMi0iBxAPGgiSKAIgACZ2lscpIilCKaIpwi7AAMCWwAZABlADuA8QDxQOcAWwlpI2FuZ2xlAAABbHKkIqoi5SFmdGWg6iLxAEUJaSJnaHQAZaDrIvEAvgltoL0DAKEjAGVzuCK8InIAbwAAoBYhcAAAoAcggARESGFkZ2lscnMAziLSItYi2iLeIugi7SICIw8j4SFzaACgrSLhIXJyAKAEKXAAAOBNItIg4SFzaACgrCIAAWV04iLlIgDgZSLSIADgPgDSIG4iZmluAACg3imAAUFldADzIvci+iJyAHIAAKACKQDgZCLSIHLgPADSIGkAZQAA4LQi0iAAAUF0BiMKI3IAcgAAoAMp8iFpZQDgtSLSIGkAbQAA4Dwi0iCAAUFhbgAaIx4jKiNyAHIAAKDWIXIAAAFociMjJiNrAACgIylvoJYh9wD/DuUhYXIAoCcpUxJqFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCMAAF4jaSN/I4IjjSOeI8AUAAAAAKYjwCMAANoj3yMAAO8jHiQvJD8kRCQAAWNzVyNsFHUAdABlADuA8wDzQAABaXlhI2cjcgBjoJoiO4D0APRAPmSAAmFiaW9zAHEjdCN3I3EBeiNzAOgAdhTsIWFjUWF2AACgOCrvIWxkAKC8KewhaWdTYQABY3KFI4kjaQByAACgvykA4DXYLN1vA5QjAAAAAJYjAACcI24A22JhAHYAZQA7gPIA8kAAoMEpAAFibaEjjAphAHIAAKC1KQACYWNpdKwjryO6I70jcgDyAFkUAAFpcrMjtiNyAACgvinvIXNzAKC7KW4A5QDZCgCgwCmAAWFlaQDFI8gjyyNjAHIATWFnAGEAyWOAAWNkbgDRI9Qj1iPyIW9uv2MAoLYpdQDzAHgBcABmAADgNdhg3YABYWVsAOQj5yPrI3IAAKC3KXIAcAAAoLkpdQDzAHwBAKMoImFkaW9zdvkj/CMPJBMkFiQbJHIA8gBeFIChXSplZm0AAyQJJAwkcgBvoDQhZgAAoDQhO4CqAKpAO4C6ALpA5yFvZgCgtiJyAACgVipsIm9wZQAAoFcqAKBbKoABY2xvACMkJSQrJPIACCRhAHMAaAA7gPgA+EBsAACgmCJpAGwBMyQ4JGQAZQA7gPUA9UBlAHMAYaCXInMAAKA2Km0AbAA7gPYA9kDiIWFyAKA9I+EKXiQAAHokAAB8JJQkAACYJKkkAAAAALUkEQsAAPAkAAAAAAQleiUAAIMlcgCAoSUiYXN0AGUkbyQBCwCBtgA7bGokayS2QGwAZQDsABgDaQJ1JAAAAAB4JG0AAKDzKgCg/Sp5AD9kcgCAAmNpbXB0AIUkiCSLJJkSjyRuAHQAJWBvAGQALmBpAGwAAKAwIOUhbmsAoDEgcgAA4DXYLd2AAWltbwCdJKAkpCR2oMYD1WNtAGEA9AD+B24AZQAAoA4m9KHAA64kAAC0JGMjaGZvcmsAAKDUItZjAAFhdbgkxCRuAAABY2u9JMIkawBooA8hAKAOIfYAaRpzAACkKwBhYmNkZW1zdNMkIRPXJNsk4STjJOck6yTjIWlyAKAjKmkAcgAAoCIqAAFvdYsW3yQAoCUqAKByKm4AO4CxALFAaQBtAACgJip3AG8AAKAnKoABaXB1APUk+iT+JO4idGludACgFSpmAADgNdhh3W4AZAA7gKMAo0CApHoiRWFjZWlub3N1ABMlFSUYJRslTCVRJVklSSV1JQCgsypwAACgtyp1AOUAPwtjoK8qgKJ6ImFjZW5zACclLSU0JTYlSSVwAHAAcgBvAPgAFyV1AHIAbAB5AGUA8QA/C/EAOAuAAWFlcwA8JUElRSXwInByb3gAoLkqcQBxAACgtSppAG0AAKDoImkA7QBEC20AZQDzoDIgIguAAUVhcwBDJVclRSXwAEAlgAFkZnAATwtfJXElgAFhbHMAZSVpJW0l7CFhcgCgLiPpIW5lAKASI/UhcmYAoBMjdKAdIu8AWQvyIWVsAKCwIgABY2l9JYElcgAA4DXYxdzIY24iY3NwAACgCCAAA2Zpb3BzdZElKxuVJZolnyWkJXIAAOA12C7dcABmAADgNdhi3XIiaW1lAACgVyBjAHIAAOA12MbcgAFhZW8AqiW6JcAldAAAAWVpryW2JXIAbgBpAG8AbgDzABkFbgB0AACgFipzAHQAZaA/APEACRj0AG0LgApBQkhhYmNkZWZoaWxtbm9wcnN0dXgA4yXyJfYl+iVpJpAmpia9JtUm5ib4JlonaCdxJ3UnnietJ7EnyCfiJ+cngAFhcnQA6SXsJe4lcgDyAJkM8gD6AuEhaWwAoBwpYQByAPIA3BVhAHIAAKBkKYADY2RlbnFydAAGJhAmEyYYJiYmKyZaJgABZXUKJg0mAOA9IjEDdABlAFVhaQDjACAN7SJwdHl2AKCzKWcAgKHpJ2RlbAAgJiImJCYAoJIpAKClKeUA9wt1AG8AO4C7ALtAcgAApZIhYWJjZmhscHN0dz0mQCZFJkcmSiZMJk4mUSZVJlgmcAAAoHUpZqDlIXMAAKAgKQCgMylzAACgHinrALka8ACVHmwAAKBFKWkAbQAAoHQpbAAAoKMhAKCdIQABYWleJmImaQBsAACgGilvAG6gNiJhAGwA8wB2C4ABYWJyAG8mciZ2JnIA8gAvEnIAawAAoHMnAAFha3omgSZjAAABZWt/JoAmfWBdYAABZXOFJocmAKCMKWwAAAFkdYwmjiYAoI4pAKCQKQACYWV1eZcmmiajJqUm8iFvbllhAAFkaZ4moSZpAGwAV2HsAA8M4gCAJkBkAAJjbHFzrSawJrUmuiZhAACgNylkImhhcgAAoGkpdQBvAPKgHSCjAWgAAKCzIYABYWNnAMMm0iaUC2wAgKEcIWlwcwDLJs4migxuAOUAoAxhAHIA9ADaC3QAAKCtJYABaWxyANsm3ybjJvMhaHQAoH0pbwBvAPIANgwA4DXYL90AAWFv6ib1JnIAAAFkde8m8SYAoMEhbKDAIQCgbCl2oMED8WOAAWducwD+Jk4nUCdoAHQAAANhaGxyc3QKJxInISc1Jz0nRydyInJvdwB0oJIhYQDpAFYmYSNycG9vbgAAAWR1GiceJ28AdwDuAPAmcAAAoMAh5SFmdAABYWgnJy0ncgByAG8AdwDzAAkMYQByAHAAbwBvAG4A8wATBGklZ2h0YXJyb3dzAACgySFxAHUAaQBnAGEAcgByAG8A9wBZJugkcmVldGltZXMAoMwiZwDaYmkAbgBnAGQAbwB0AHMAZQDxABwYgAFhaG0AYCdjJ2YncgDyAAkMYQDyABMEAKAPIG8idXN0AGGgsSPjIWhlAKCxI+0haWQAoO4qAAJhYnB0fCeGJ4knmScAAW5ygCeDJ2cAAKDtJ3IAAKD+IXIA6wAcDIABYWZsAI8nkieVJ3IAAKCGKQDgNdhj3XUAcwAAoC4qaSJtZXMAAKA1KgABYXCiJ6gncgBnoCkAdAAAoJQp7yJsaW50AKASKmEAcgDyADwnAAJhY2hxuCe8J6EMwCfxIXVvAKA6IHIAAOA12MfcAAFidYAmxCdvAPKgGSCoAYABaGlyAM4n0ifWJ3IAZQDlAE0n7SFlcwCgyiJpAIChuSVlZmwAXAxjEt4n9CFyaQCgzinsInVoYXIAoGgpAKAeIWENBSgJKA0oSyhVKIYoAACLKLAoAAAAAOMo5ygAABApJCkxKW0pcSmHKaYpAACYKgAAAACxKmMidXRlAFthcQB1AO8ABR+ApHsiRWFjZWlucHN5ABwoHignKCooLygyKEEoRihJKACgtCrwASMoAAAlKACguCpvAG4AYWF1AOUAgw1koLAqaQBsAF9hcgBjAF1hgAFFYXMAOCg6KD0oAKC2KnAAAKC6KmkAbQAAoOki7yJsaW50AKATKmkA7QCIDUFkbwB0AGKixSKRFgAAAABTKACgZiqAA0FhY21zdHgAYChkKG8ocyh1KHkogihyAHIAAKDYIXIAAAFocmkoayjrAJAab6CYIfcAzAd0ADuApwCnQGkAO2D3IWFyAKApKW0AAAFpbn4ozQBuAHUA8wDOAHQAAKA2J3IA7+A12DDdIxkAAmFjb3mRKJUonSisKHIAcAAAoG8mAAFoeZkonChjAHkASWRIZHIAdABtAqUoAAAAAKgoaQDkAFsPYQByAGEA7ABsJDuArQCtQAABZ22zKLsobQBhAAChwwNmdroouijCY4CjPCJkZWdsbnByAMgozCjPKNMo1yjaKN4obwB0AACgairxoEMiCw5FoJ4qAKCgKkWgnSoAoJ8qZQAAoEYi7CF1cwCgJCrhIXJyAKByKWEAcgDyAPwMAAJhZWl07Sj8KAEpCCkAAWxz8Sj4KGwAcwBlAHQAbQDpAH8oaABwAACgMyrwImFyc2wAoOQpAAFkbFoPBSllAACgIyNloKoqc6CsKgDgrCoA/oABZmxwABUpGCkfKfQhY3lMZGKgLwBhoMQpcgAAoD8jZgAA4DXYZN1hAAABZHIoKRcDZQBzAHWgYCZpAHQAAKBgJoABY3N1ADYpRilhKQABYXU6KUApcABzoJMiAOCTIgD+cABzoJQiAOCUIgD+dQAAAWJwSylWKQChjyJlcz4NUCllAHQAZaCPIvEAPw0AoZAiZXNIDVspZQB0AGWgkCLxAEkNAKGhJWFmZilbBHIAZQFrKVwEAKChJWEAcgDyAAMNAAJjZW10dyl7KX8pgilyAADgNdjI3HQAbQDuAM4AaQDsAAYpYQByAOYAVw0AAWFyiimOKXIA5qAGJhESAAFhbpIpoylpImdodAAAAWVwmSmgKXAAcwBpAGwAbwDuANkXaADpAKAkcwCvYIACYmNtbnAArin8KY4NJSooKgCkgiJFZGVtbnByc7wpvinCKcgpzCnUKdgp3CkAoMUqbwB0AACgvSpkoIYibwB0AACgwyr1IWx0AKDBKgABRWXQKdIpAKDLKgCgiiLsIXVzAKC/KuEhcnIAoHkpgAFlaXUA4inxKfQpdAAAoYIiZW7oKewpcQDxoIYivSllAHEA8aCKItEpbQAAoMcqAAFicPgp+ikAoNUqAKDTKmMAgKJ7ImFjZW5zAAcqDSoUKhYqRihwAHAAcgBvAPgAIyh1AHIAbAB5AGUA8QCDDfEAfA2AAWFlcwAcKiIqPShwAHAAcgBvAPgAPChxAPEAOShnAACgaiYApoMiMTIzRWRlaGxtbnBzPCo/KkIqRSpHKlIqWCpjKmcqaypzKncqO4C5ALlAO4CyALJAO4CzALNAAKDGKgABb3NLKk4qdAAAoL4qdQBiAACg2CpkoIcibwB0AACgxCpzAAABb3VdKmAqbAAAoMknYgAAoNcq4SFycgCgeyn1IWx0AKDCKgABRWVvKnEqAKDMKgCgiyLsIXVzAKDAKoABZWl1AH0qjCqPKnQAAKGDImVugyqHKnEA8aCHIkYqZQBxAPGgiyJwKm0AAKDIKgABYnCTKpUqAKDUKgCg1iqAAUFhbgCdKqEqrCpyAHIAAKDZIXIAAAFocqYqqCrrAJUab6CZIfcAxQf3IWFyAKAqKWwAaQBnADuA3wDfQOELzyrZKtwq6SrsKvEqAAD1KjQrAAAAAAAAAAAAAEwrbCsAAHErvSsAAAAAAADRK3IC1CoAAAAA2CrnIWV0AKAWI8RjcgDrAOUKgAFhZXkA4SrkKucq8iFvbmVh5CFpbGNhQmRvAPQAIg5sInJlYwAAoBUjcgAA4DXYMd0AAmVpa2/7KhIrKCsuK/IBACsAAAkrZQAAATRm6g0EK28AcgDlAOsNYQBzorgDECsAAAAAEit5AG0A0WMAAWNuFislK2sAAAFhcxsrIStwAHAAcgBvAPgAFw5pAG0AAKA8InMA8AD9DQABYXMsKyEr8AAXDnIAbgA7gP4A/kDsATgrOyswG2QA5QBnAmUAcwCAgdcAO2JkAEMrRCtJK9dAYaCgInIAAKAxKgCgMCqAAWVwcwBRK1MraSvhAAkh4qKkIlsrXysAAAAAYytvAHQAAKA2I2kAcgAAoPEqb+A12GXdcgBrAACg2irhAHgociJpbWUAAKA0IIABYWlwAHYreSu3K2QA5QC+DYADYWRlbXBzdACFK6MrmiunK6wrsCuzK24iZ2xlAACitSVkbHFykCuUK5ornCvvIXduAKC/JeUhZnRloMMl8QACBwCgXCJpImdodABloLkl8QBdDG8AdAAAoOwlaSJudXMAAKA6KuwhdXMAoDkqYgAAoM0p6SFtZQCgOyrlInppdW0AoOIjgAFjaHQAwivKK80rAAFyecYrySsA4DXYydxGZGMAeQBbZPIhb2tnYQABaW/UK9creAD0ANERaCJlYWQAAAFsct4r5ytlAGYAdABhAHIAcgBvAPcAXQbpJGdodGFycm93AKCgIQAJQUhhYmNkZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\");\n//# sourceMappingURL=decode-data-html.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed XML decode trie data. */\nexport const xmlDecodeTree = /* #__PURE__ */ decodeBase64(\"AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg\");\n//# sourceMappingURL=decode-data-xml.js.map","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)\n * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').\n * If valueLength==0: compact run flag.\n * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport var BinTrieFlags;\n(function (BinTrieFlags) {\n BinTrieFlags[BinTrieFlags[\"VALUE_LENGTH\"] = 49152] = \"VALUE_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"FLAG13\"] = 8192] = \"FLAG13\";\n BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 8064] = \"BRANCH_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags || (BinTrieFlags = {}));\n//# sourceMappingURL=bin-trie-flags.js.map","import { replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"NUM\"] = 35] = \"NUM\";\n CharCodes[CharCodes[\"SEMI\"] = 59] = \"SEMI\";\n CharCodes[CharCodes[\"EQUALS\"] = 61] = \"EQUALS\";\n CharCodes[CharCodes[\"ZERO\"] = 48] = \"ZERO\";\n CharCodes[CharCodes[\"NINE\"] = 57] = \"NINE\";\n CharCodes[CharCodes[\"LOWER_A\"] = 97] = \"LOWER_A\";\n CharCodes[CharCodes[\"LOWER_F\"] = 102] = \"LOWER_F\";\n CharCodes[CharCodes[\"LOWER_X\"] = 120] = \"LOWER_X\";\n CharCodes[CharCodes[\"LOWER_Z\"] = 122] = \"LOWER_Z\";\n CharCodes[CharCodes[\"UPPER_A\"] = 65] = \"UPPER_A\";\n CharCodes[CharCodes[\"UPPER_F\"] = 70] = \"UPPER_F\";\n CharCodes[CharCodes[\"UPPER_Z\"] = 90] = \"UPPER_Z\";\n})(CharCodes || (CharCodes = {}));\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\nfunction isNumber(code) {\n return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\nfunction isHexadecimalCharacter(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F));\n}\nfunction isAsciiAlphaNumeric(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n isNumber(code));\n}\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n * @param code Code point to decode.\n */\nfunction isEntityInAttributeInvalidEnd(code) {\n return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\nvar EntityDecoderState;\n(function (EntityDecoderState) {\n EntityDecoderState[EntityDecoderState[\"EntityStart\"] = 0] = \"EntityStart\";\n EntityDecoderState[EntityDecoderState[\"NumericStart\"] = 1] = \"NumericStart\";\n EntityDecoderState[EntityDecoderState[\"NumericDecimal\"] = 2] = \"NumericDecimal\";\n EntityDecoderState[EntityDecoderState[\"NumericHex\"] = 3] = \"NumericHex\";\n EntityDecoderState[EntityDecoderState[\"NamedEntity\"] = 4] = \"NamedEntity\";\n})(EntityDecoderState || (EntityDecoderState = {}));\n/**\n * Decoding mode for named entities.\n */\nexport var DecodingMode;\n(function (DecodingMode) {\n /** Entities in text nodes that can end with any character. */\n DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n /** Only allow entities terminated with a semicolon. */\n DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n /** Entities in attributes have limitations on ending characters. */\n DecodingMode[DecodingMode[\"Attribute\"] = 2] = \"Attribute\";\n})(DecodingMode || (DecodingMode = {}));\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n decodeTree;\n emitCodePoint;\n errors;\n constructor(\n /** The tree used to decode entities. */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n decodeTree, \n /**\n * The function that is called when a codepoint is decoded.\n *\n * For multi-byte named entities, this will be called multiple times,\n * with the second codepoint, and the same `consumed` value.\n * @param codepoint The decoded codepoint.\n * @param consumed The number of bytes consumed by the decoder.\n */\n emitCodePoint, \n /** An object that is used to produce errors. */\n errors) {\n this.decodeTree = decodeTree;\n this.emitCodePoint = emitCodePoint;\n this.errors = errors;\n }\n /** The current state of the decoder. */\n state = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n consumed = 1;\n /**\n * The result of the entity.\n *\n * Either the result index of a numeric entity, or the codepoint of a\n * numeric entity.\n */\n result = 0;\n /** The current index in the decode tree. */\n treeIndex = 0;\n /** The number of characters that were consumed in excess. */\n excess = 1;\n /** The mode in which the decoder is operating. */\n decodeMode = DecodingMode.Strict;\n /** The number of characters that have been consumed in the current run. */\n runConsumed = 0;\n /**\n * Resets the instance to make it reusable.\n * @param decodeMode Entity decoding mode to use.\n */\n startEntity(decodeMode) {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n this.runConsumed = 0;\n }\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(input, offset) {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (input.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(input, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(input, offset);\n }\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(input, offset);\n }\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(input, offset);\n }\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(input, offset);\n }\n case EntityDecoderState.NamedEntity: {\n return this.stateNamedEntity(input, offset);\n }\n }\n }\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericStart(input, offset) {\n if (offset >= input.length) {\n return -1;\n }\n if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(input, offset + 1);\n }\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(input, offset);\n }\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericHex(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n const digit = char <= CharCodes.NINE\n ? char - CharCodes.ZERO\n : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n this.result = this.result * 16 + digit;\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 3);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericDecimal(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char)) {\n this.result = this.result * 10 + (char - CharCodes.ZERO);\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 2);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n emitNumericEntity(lastCp, expectedLength) {\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n }\n else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n this.errors.validateNumericCharacterReference(this.result);\n }\n return this.consumed;\n }\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNamedEntity(input, offset) {\n const { decodeTree } = this;\n let current = decodeTree[this.treeIndex];\n // The length is the number of bytes of the value, including the current byte.\n let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n while (offset < input.length) {\n // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n // If we are starting a run, check the first char.\n if (this.runConsumed === 0) {\n const firstChar = current & BinTrieFlags.JUMP_TABLE;\n if (input.charCodeAt(offset) !== firstChar) {\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n // Check remaining characters in the run.\n while (this.runConsumed < runLength) {\n if (offset >= input.length) {\n return -1;\n }\n const charIndexInPacked = this.runConsumed - 1;\n const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];\n const expectedChar = charIndexInPacked % 2 === 0\n ? packedWord & 0xff\n : (packedWord >> 8) & 0xff;\n if (input.charCodeAt(offset) !== expectedChar) {\n this.runConsumed = 0;\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n this.runConsumed = 0;\n this.treeIndex += 1 + (runLength >> 1);\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n }\n if (offset >= input.length)\n break;\n const char = input.charCodeAt(offset);\n /*\n * Implicit semicolon handling for nodes that require a semicolon but\n * don't have an explicit ';' branch stored in the trie. If we have\n * a value on the current node, it requires a semicolon, and the\n * current input character is a semicolon, emit the entity using the\n * current node (without descending further).\n */\n if (char === CharCodes.SEMI &&\n valueLength !== 0 &&\n (current & BinTrieFlags.FLAG13) !== 0) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);\n if (this.treeIndex < 0) {\n return this.result === 0 ||\n // If we are parsing an attribute\n (this.decodeMode === DecodingMode.Attribute &&\n // We shouldn't have consumed any characters after the entity,\n (valueLength === 0 ||\n // And there should be no invalid characters.\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n // If the branch is a value, store it and continue\n if (valueLength !== 0) {\n // If the entity is terminated by a semicolon, we are done.\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n if (this.decodeMode !== DecodingMode.Strict &&\n (current & BinTrieFlags.FLAG13) === 0) {\n this.result = this.treeIndex;\n this.consumed += this.excess;\n this.excess = 0;\n }\n }\n // Increment offset & excess for next iteration\n offset++;\n this.excess++;\n }\n return -1;\n }\n /**\n * Emit a named entity that was not terminated with a semicolon.\n * @returns The number of characters consumed.\n */\n emitNotTerminatedNamedEntity() {\n const { result, decodeTree } = this;\n const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n this.emitNamedEntityData(result, valueLength, this.consumed);\n this.errors?.missingSemicolonAfterCharacterReference();\n return this.consumed;\n }\n /**\n * Emit a named entity.\n * @param result The index of the entity in the decode tree.\n * @param valueLength The number of bytes in the entity.\n * @param consumed The number of characters consumed.\n * @returns The number of characters consumed.\n */\n emitNamedEntityData(result, valueLength, consumed) {\n const { decodeTree } = this;\n this.emitCodePoint(valueLength === 1\n ? decodeTree[result] &\n ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n : decodeTree[result + 1], consumed);\n if (valueLength === 3) {\n // For multi-byte values, we need to emit the second byte.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n return consumed;\n }\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n * @returns The number of characters consumed.\n */\n end() {\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n case EntityDecoderState.EntityStart: {\n // Return 0 if we have no entity.\n return 0;\n }\n }\n }\n}\n/**\n * Creates a function that decodes entities in a string.\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree) {\n let returnValue = \"\";\n const decoder = new EntityDecoder(decodeTree, (data) => (returnValue += String.fromCodePoint(data)));\n return function decodeWithTrie(input, decodeMode) {\n let lastIndex = 0;\n let offset = 0;\n while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n returnValue += input.slice(lastIndex, offset);\n decoder.startEntity(decodeMode);\n const length = decoder.write(input, \n // Skip the \"&\"\n offset + 1);\n if (length < 0) {\n lastIndex = offset + decoder.end();\n break;\n }\n lastIndex = offset + length;\n // If `length` is 0, skip the current `&` and continue.\n offset = length === 0 ? lastIndex + 1 : lastIndex;\n }\n const result = returnValue + input.slice(lastIndex);\n // Make sure we don't keep a reference to the final string.\n returnValue = \"\";\n return result;\n };\n}\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIndex Index immediately after the current node header.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(decodeTree, current, nodeIndex, char) {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n // Case 1: Single branch encoded in jump offset\n if (branchCount === 0) {\n return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n }\n // Case 2: Multiple branches encoded in jump table\n if (jumpOffset) {\n const value = char - jumpOffset;\n return value < 0 || value >= branchCount\n ? -1\n : decodeTree[nodeIndex + value] - 1;\n }\n // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n const packedKeySlots = (branchCount + 1) >> 1;\n /*\n * Treat packed keys as a virtual sorted array of length `branchCount`.\n * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n */\n let lo = 0;\n let hi = branchCount - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const slot = mid >> 1;\n const packed = decodeTree[nodeIndex + slot];\n const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n if (midKey < char) {\n lo = mid + 1;\n }\n else if (midKey > char) {\n hi = mid - 1;\n }\n else {\n return decodeTree[nodeIndex + packedKeySlots + mid];\n }\n }\n return -1;\n}\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n/**\n * Decodes an HTML string.\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(htmlString, mode = DecodingMode.Legacy) {\n return htmlDecoder(htmlString, mode);\n}\n/**\n * Decodes an HTML string in an attribute.\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute) {\n return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString) {\n return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString) {\n return xmlDecoder(xmlString, DecodingMode.Strict);\n}\nexport { replaceCodePoint } from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n//# sourceMappingURL=decode.js.map","import { DecodingMode, EntityDecoder, htmlDecodeTree, xmlDecodeTree, } from \"entities/decode\";\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"Tab\"] = 9] = \"Tab\";\n CharCodes[CharCodes[\"NewLine\"] = 10] = \"NewLine\";\n CharCodes[CharCodes[\"FormFeed\"] = 12] = \"FormFeed\";\n CharCodes[CharCodes[\"CarriageReturn\"] = 13] = \"CarriageReturn\";\n CharCodes[CharCodes[\"Space\"] = 32] = \"Space\";\n CharCodes[CharCodes[\"ExclamationMark\"] = 33] = \"ExclamationMark\";\n CharCodes[CharCodes[\"Number\"] = 35] = \"Number\";\n CharCodes[CharCodes[\"Amp\"] = 38] = \"Amp\";\n CharCodes[CharCodes[\"SingleQuote\"] = 39] = \"SingleQuote\";\n CharCodes[CharCodes[\"DoubleQuote\"] = 34] = \"DoubleQuote\";\n CharCodes[CharCodes[\"Dash\"] = 45] = \"Dash\";\n CharCodes[CharCodes[\"Slash\"] = 47] = \"Slash\";\n CharCodes[CharCodes[\"Zero\"] = 48] = \"Zero\";\n CharCodes[CharCodes[\"Nine\"] = 57] = \"Nine\";\n CharCodes[CharCodes[\"Semi\"] = 59] = \"Semi\";\n CharCodes[CharCodes[\"Lt\"] = 60] = \"Lt\";\n CharCodes[CharCodes[\"Eq\"] = 61] = \"Eq\";\n CharCodes[CharCodes[\"Gt\"] = 62] = \"Gt\";\n CharCodes[CharCodes[\"Questionmark\"] = 63] = \"Questionmark\";\n CharCodes[CharCodes[\"UpperA\"] = 65] = \"UpperA\";\n CharCodes[CharCodes[\"LowerA\"] = 97] = \"LowerA\";\n CharCodes[CharCodes[\"UpperF\"] = 70] = \"UpperF\";\n CharCodes[CharCodes[\"LowerF\"] = 102] = \"LowerF\";\n CharCodes[CharCodes[\"UpperZ\"] = 90] = \"UpperZ\";\n CharCodes[CharCodes[\"LowerZ\"] = 122] = \"LowerZ\";\n CharCodes[CharCodes[\"LowerX\"] = 120] = \"LowerX\";\n CharCodes[CharCodes[\"OpeningSquareBracket\"] = 91] = \"OpeningSquareBracket\";\n})(CharCodes || (CharCodes = {}));\n/** All the states the tokenizer can be in. */\nvar State;\n(function (State) {\n State[State[\"Text\"] = 1] = \"Text\";\n State[State[\"BeforeTagName\"] = 2] = \"BeforeTagName\";\n State[State[\"InTagName\"] = 3] = \"InTagName\";\n State[State[\"InSelfClosingTag\"] = 4] = \"InSelfClosingTag\";\n State[State[\"BeforeClosingTagName\"] = 5] = \"BeforeClosingTagName\";\n State[State[\"InClosingTagName\"] = 6] = \"InClosingTagName\";\n State[State[\"AfterClosingTagName\"] = 7] = \"AfterClosingTagName\";\n // Attributes\n State[State[\"BeforeAttributeName\"] = 8] = \"BeforeAttributeName\";\n State[State[\"InAttributeName\"] = 9] = \"InAttributeName\";\n State[State[\"AfterAttributeName\"] = 10] = \"AfterAttributeName\";\n State[State[\"BeforeAttributeValue\"] = 11] = \"BeforeAttributeValue\";\n State[State[\"InAttributeValueDq\"] = 12] = \"InAttributeValueDq\";\n State[State[\"InAttributeValueSq\"] = 13] = \"InAttributeValueSq\";\n State[State[\"InAttributeValueNq\"] = 14] = \"InAttributeValueNq\";\n // Declarations\n State[State[\"BeforeDeclaration\"] = 15] = \"BeforeDeclaration\";\n State[State[\"InDeclaration\"] = 16] = \"InDeclaration\";\n // Processing instructions\n State[State[\"InProcessingInstruction\"] = 17] = \"InProcessingInstruction\";\n // Comments & CDATA\n State[State[\"BeforeComment\"] = 18] = \"BeforeComment\";\n State[State[\"CDATASequence\"] = 19] = \"CDATASequence\";\n State[State[\"DeclarationSequence\"] = 20] = \"DeclarationSequence\";\n State[State[\"InSpecialComment\"] = 21] = \"InSpecialComment\";\n State[State[\"InCommentLike\"] = 22] = \"InCommentLike\";\n // Special tags\n State[State[\"SpecialStartSequence\"] = 23] = \"SpecialStartSequence\";\n State[State[\"InSpecialTag\"] = 24] = \"InSpecialTag\";\n State[State[\"InPlainText\"] = 25] = \"InPlainText\";\n State[State[\"InEntity\"] = 26] = \"InEntity\";\n})(State || (State = {}));\nfunction isWhitespace(c) {\n return (c === CharCodes.Space ||\n c === CharCodes.NewLine ||\n c === CharCodes.Tab ||\n c === CharCodes.FormFeed ||\n c === CharCodes.CarriageReturn);\n}\nfunction isEndOfTagSection(c) {\n return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\nfunction isASCIIAlpha(c) {\n return ((c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n (c >= CharCodes.UpperA && c <= CharCodes.UpperZ));\n}\n/**\n * Quote style used for parsed attributes.\n */\nexport var QuoteType;\n(function (QuoteType) {\n QuoteType[QuoteType[\"NoValue\"] = 0] = \"NoValue\";\n QuoteType[QuoteType[\"Unquoted\"] = 1] = \"Unquoted\";\n QuoteType[QuoteType[\"Single\"] = 2] = \"Single\";\n QuoteType[QuoteType[\"Double\"] = 3] = \"Double\";\n})(QuoteType || (QuoteType = {}));\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n Empty: new Uint8Array(0),\n Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n CommentEnd: new Uint8Array([0x2d, 0x2d, 0x21, 0x3e]), // `--!>`\n Doctype: new Uint8Array([0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65]), // `doctype`\n IframeEnd: new Uint8Array([0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65]), // `</iframe`\n NoembedEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x65, 0x6d, 0x62, 0x65, 0x64,\n ]), // `</noembed`\n NoframesEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73,\n ]), // `</noframes`\n Plaintext: new Uint8Array([\n 0x3c, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74,\n ]), // `</plaintext`\n ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n TextareaEnd: new Uint8Array([\n 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n ]), // `</textarea`\n XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n/**\n * Maps the first lowercase character of an HTML tag name to the sequence\n * used for special-tag detection. All sequences share a common layout\n * where index 2 is the first tag-name character, so matching always\n * continues from offset 3.\n */\nconst specialStartSequences = new Map([\n [Sequences.IframeEnd[2], Sequences.IframeEnd],\n [Sequences.NoembedEnd[2], Sequences.NoembedEnd],\n [Sequences.Plaintext[2], Sequences.Plaintext],\n [Sequences.ScriptEnd[2], Sequences.ScriptEnd],\n [Sequences.TitleEnd[2], Sequences.TitleEnd],\n [Sequences.XmpEnd[2], Sequences.XmpEnd],\n]);\n/**\n * Tokenizer implementation used by `Parser`.\n */\nexport default class Tokenizer {\n cbs;\n /** The current state the tokenizer is in. */\n state = State.Text;\n /** The read buffer. */\n buffer = \"\";\n /** The beginning of the section that is currently being read. */\n sectionStart = 0;\n /** The index within the buffer that we are currently looking at. */\n index = 0;\n /** The start of the last entity. */\n entityStart = 0;\n /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n baseState = State.Text;\n /** For special parsing behavior inside of script and style tags. */\n isSpecial = false;\n /** Indicates whether the tokenizer has been paused. */\n running = true;\n /** The offset of the current buffer. */\n offset = 0;\n xmlMode;\n decodeEntities;\n recognizeSelfClosing;\n entityDecoder;\n constructor({ xmlMode = false, decodeEntities = true, recognizeSelfClosing = xmlMode, }, cbs) {\n this.cbs = cbs;\n this.xmlMode = xmlMode;\n this.decodeEntities = decodeEntities;\n this.recognizeSelfClosing = recognizeSelfClosing;\n this.entityDecoder = new EntityDecoder(xmlMode ? xmlDecodeTree : htmlDecodeTree, (cp, consumed) => this.emitCodePoint(cp, consumed));\n }\n reset() {\n this.state = State.Text;\n this.buffer = \"\";\n this.sectionStart = 0;\n this.index = 0;\n this.baseState = State.Text;\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.running = true;\n this.offset = 0;\n }\n write(chunk) {\n this.offset += this.buffer.length;\n this.buffer = chunk;\n this.parse();\n }\n end() {\n if (this.running)\n this.finish();\n }\n pause() {\n this.running = false;\n }\n resume() {\n this.running = true;\n if (this.index < this.buffer.length + this.offset) {\n this.parse();\n }\n }\n stateText(c) {\n if (c === CharCodes.Lt ||\n (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))) {\n if (this.index > this.sectionStart) {\n this.cbs.ontext(this.sectionStart, this.index);\n }\n this.state = State.BeforeTagName;\n this.sectionStart = this.index;\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n currentSequence = Sequences.Empty;\n sequenceIndex = 0;\n enterTagBody() {\n if (this.currentSequence === Sequences.Plaintext) {\n this.currentSequence = Sequences.Empty;\n this.state = State.InPlainText;\n }\n else if (this.isSpecial) {\n this.state = State.InSpecialTag;\n this.sequenceIndex = 0;\n }\n else {\n this.state = State.Text;\n }\n }\n /**\n * Match the opening tag name against an HTML text-only tag sequence.\n *\n * Some tags share an initial prefix (`script`/`style`, `title`/`textarea`,\n * `noembed`/`noframes`), so we may switch to an alternate sequence at the\n * first distinguishing byte. On a successful full match we fall back to\n * the normal tag-name state; a later `>` will enter raw-text, RCDATA, or\n * plaintext mode based on `currentSequence` / `isSpecial`.\n * @param c Current character code point.\n */\n stateSpecialStartSequence(c) {\n const lower = c | 0x20;\n // Still matching — check for an alternate sequence at branch points.\n if (this.sequenceIndex < this.currentSequence.length) {\n if (lower === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex++;\n return;\n }\n if (this.sequenceIndex === 3) {\n if (this.currentSequence === Sequences.ScriptEnd &&\n lower === Sequences.StyleEnd[3]) {\n this.currentSequence = Sequences.StyleEnd;\n this.sequenceIndex = 4;\n return;\n }\n if (this.currentSequence === Sequences.TitleEnd &&\n lower === Sequences.TextareaEnd[3]) {\n this.currentSequence = Sequences.TextareaEnd;\n this.sequenceIndex = 4;\n return;\n }\n }\n else if (this.sequenceIndex === 4 &&\n this.currentSequence === Sequences.NoembedEnd &&\n lower === Sequences.NoframesEnd[4]) {\n this.currentSequence = Sequences.NoframesEnd;\n this.sequenceIndex = 5;\n return;\n }\n }\n else if (isEndOfTagSection(c)) {\n // Full match on a valid tag boundary — keep the sequence.\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n return;\n }\n // No match — abandon special-tag detection.\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n }\n stateCDATASequence(c) {\n if (c === Sequences.Cdata[this.sequenceIndex]) {\n if (++this.sequenceIndex === Sequences.Cdata.length) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CdataEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n }\n else {\n this.sequenceIndex = 0;\n if (this.xmlMode) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c); // Reconsume the character\n }\n else {\n this.state = State.InSpecialComment;\n this.stateInSpecialComment(c); // Reconsume the character\n }\n }\n }\n /**\n * When we wait for one specific character, we can speed things up\n * by skipping through the buffer until we find it.\n * @param c Current character code point.\n * @returns Whether the character was found.\n */\n fastForwardTo(c) {\n while (++this.index < this.buffer.length + this.offset) {\n if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n return true;\n }\n }\n /*\n * We increment the index at the end of the `parse` loop,\n * so set it to `buffer.length - 1` here.\n *\n * TODO: Refactor `parse` to increment index before calling states.\n */\n this.index = this.buffer.length + this.offset - 1;\n return false;\n }\n /**\n * Emit a comment token and return to the text state.\n * @param offset Number of characters in the end sequence that have already been matched.\n */\n emitComment(offset) {\n this.cbs.oncomment(this.sectionStart, this.index, offset);\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n /**\n * Comments and CDATA end with `-->` and `]]>`.\n *\n * Their common qualities are:\n * - Their end sequences have a distinct character they start with.\n * - That character is then repeated, so we have to check multiple repeats.\n * - All characters but the start character of the sequence can be skipped.\n * @param c Current character code point.\n */\n stateInCommentLike(c) {\n if (!this.xmlMode &&\n this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex <= 1 &&\n /*\n * We're still at the very start of the comment: the only\n * characters consumed since `<!--` are the dashes that\n * advanced sequenceIndex (0 for `<!-->`, 1 for `<!--->`).\n */\n this.index === this.sectionStart + this.sequenceIndex &&\n c === CharCodes.Gt) {\n // Abruptly closed empty HTML comment.\n this.emitComment(this.sequenceIndex);\n }\n else if (this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === 2 &&\n c === CharCodes.Gt) {\n // `!` is optional here, so the same sequence also accepts `-->`.\n this.emitComment(2);\n }\n else if (this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === this.currentSequence.length - 1 &&\n c !== CharCodes.Gt) {\n this.sequenceIndex = Number(c === CharCodes.Dash);\n }\n else if (c === this.currentSequence[this.sequenceIndex]) {\n if (++this.sequenceIndex === this.currentSequence.length) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, this.index, 2);\n }\n else {\n this.cbs.oncomment(this.sectionStart, this.index, 3);\n }\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n }\n else if (this.sequenceIndex === 0) {\n // Fast-forward to the first character of the sequence\n if (this.fastForwardTo(this.currentSequence[0])) {\n this.sequenceIndex = 1;\n }\n }\n else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n // Allow long sequences, eg. --->, ]]]>\n this.sequenceIndex = 0;\n }\n }\n /**\n * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n *\n * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n * We allow anything that wouldn't end the tag.\n * @param c Current character code point.\n */\n isTagStartChar(c) {\n return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n }\n /**\n * Scan raw-text / RCDATA content for the matching end tag.\n *\n * For RCDATA tags (`<title>`, `<textarea>`) entities are decoded inline.\n * For raw-text tags (`<script>`, `<style>`, etc.) we fast-forward to `<`.\n * @param c Current character code point.\n */\n stateInSpecialTag(c) {\n if (this.sequenceIndex === this.currentSequence.length) {\n if (isEndOfTagSection(c)) {\n const endOfText = this.index - this.currentSequence.length;\n if (this.sectionStart < endOfText) {\n // Spoof the index so that reported locations match up.\n const actualIndex = this.index;\n this.index = endOfText;\n this.cbs.ontext(this.sectionStart, endOfText);\n this.index = actualIndex;\n }\n this.isSpecial = false;\n this.sectionStart = endOfText + 2; // Skip over the `</`\n this.stateInClosingTagName(c);\n return; // We are done; skip the rest of the function.\n }\n this.sequenceIndex = 0;\n }\n if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n }\n else if (this.sequenceIndex === 0) {\n if (this.currentSequence === Sequences.TitleEnd ||\n this.currentSequence === Sequences.TextareaEnd) {\n // RCDATA tags have to parse entities while still looking for their end tag.\n if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n else if (this.fastForwardTo(CharCodes.Lt)) {\n // Outside of RCDATA tags, we can fast-forward.\n this.sequenceIndex = 1;\n }\n }\n else {\n // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n this.sequenceIndex = Number(c === CharCodes.Lt);\n }\n }\n stateBeforeTagName(c) {\n if (c === CharCodes.ExclamationMark) {\n this.state = State.BeforeDeclaration;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Questionmark) {\n if (this.xmlMode) {\n this.state = State.InProcessingInstruction;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n else if (this.isTagStartChar(c)) {\n this.sectionStart = this.index;\n const special = this.xmlMode || this.cbs.isInForeignContext?.()\n ? undefined\n : specialStartSequences.get(c | 0x20);\n if (special === undefined) {\n this.state = State.InTagName;\n }\n else {\n this.isSpecial = true;\n this.currentSequence = special;\n this.sequenceIndex = 3;\n this.state = State.SpecialStartSequence;\n }\n }\n else if (c === CharCodes.Slash) {\n this.state = State.BeforeClosingTagName;\n }\n else {\n this.state = State.Text;\n this.stateText(c);\n }\n }\n stateInTagName(c) {\n if (isEndOfTagSection(c)) {\n this.cbs.onopentagname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n stateBeforeClosingTagName(c) {\n if (isWhitespace(c)) {\n if (this.xmlMode) {\n // Ignore\n }\n else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n else if (c === CharCodes.Gt) {\n this.state = State.Text;\n if (!this.xmlMode) {\n this.sectionStart = this.index + 1;\n }\n }\n else {\n this.state = this.isTagStartChar(c)\n ? State.InClosingTagName\n : State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n stateInClosingTagName(c) {\n if (isEndOfTagSection(c)) {\n this.cbs.onclosetag(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterClosingTagName;\n this.stateAfterClosingTagName(c);\n }\n }\n stateAfterClosingTagName(c) {\n // Skip everything until \">\"\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n stateBeforeAttributeName(c) {\n if (c === CharCodes.Gt) {\n this.cbs.onopentagend(this.index);\n this.enterTagBody();\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Slash) {\n this.state = State.InSelfClosingTag;\n }\n else if (!isWhitespace(c)) {\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n /**\n * Handle `/` before `>` in an opening tag.\n *\n * In HTML mode, text-only tags ignore the self-closing flag and still enter\n * their raw-text/RCDATA/plaintext state unless self-closing tags are being\n * recognized. In XML mode, or for ordinary tags, the tokenizer returns to\n * regular text parsing after emitting the self-closing callback.\n * @param c Current character code point.\n */\n stateInSelfClosingTag(c) {\n if (c === CharCodes.Gt) {\n this.cbs.onselfclosingtag(this.index);\n this.sectionStart = this.index + 1;\n if (!this.recognizeSelfClosing) {\n this.enterTagBody();\n return;\n }\n this.state = State.Text;\n this.isSpecial = false; // Reset special state, in case of self-closing special tags\n this.currentSequence = Sequences.Empty;\n }\n else if (!isWhitespace(c)) {\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n stateInAttributeName(c) {\n if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n this.cbs.onattribname(this.sectionStart, this.index);\n this.sectionStart = this.index;\n this.state = State.AfterAttributeName;\n this.stateAfterAttributeName(c);\n }\n }\n stateAfterAttributeName(c) {\n if (c === CharCodes.Eq) {\n this.state = State.BeforeAttributeValue;\n }\n else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (!isWhitespace(c)) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n stateBeforeAttributeValue(c) {\n if (c === CharCodes.DoubleQuote) {\n this.state = State.InAttributeValueDq;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.SingleQuote) {\n this.state = State.InAttributeValueSq;\n this.sectionStart = this.index + 1;\n }\n else if (!isWhitespace(c)) {\n this.sectionStart = this.index;\n this.state = State.InAttributeValueNq;\n this.stateInAttributeValueNoQuotes(c); // Reconsume token\n }\n }\n handleInAttributeValue(c, quote) {\n if (c === quote ||\n (!this.decodeEntities && this.fastForwardTo(quote))) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(quote === CharCodes.DoubleQuote\n ? QuoteType.Double\n : QuoteType.Single, this.index + 1);\n this.state = State.BeforeAttributeName;\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n stateInAttributeValueDoubleQuotes(c) {\n this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n }\n stateInAttributeValueSingleQuotes(c) {\n this.handleInAttributeValue(c, CharCodes.SingleQuote);\n }\n stateInAttributeValueNoQuotes(c) {\n if (isWhitespace(c) || c === CharCodes.Gt) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(QuoteType.Unquoted, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n /**\n * Distinguish between CDATA, declarations, HTML comments, and HTML bogus\n * comments after `<!`.\n *\n * In HTML mode, only real comments and doctypes stay on declaration paths;\n * everything else becomes a bogus comment terminated by the next `>`.\n * @param c Current character code point.\n */\n stateBeforeDeclaration(c) {\n if (c === CharCodes.OpeningSquareBracket) {\n this.state = State.CDATASequence;\n this.sequenceIndex = 0;\n }\n else if (this.xmlMode) {\n this.state =\n c === CharCodes.Dash\n ? State.BeforeComment\n : State.InDeclaration;\n }\n else if ((c | 0x20) === Sequences.Doctype[0]) {\n this.state = State.DeclarationSequence;\n this.currentSequence = Sequences.Doctype;\n this.sequenceIndex = 1;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Dash) {\n this.state = State.BeforeComment;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n /**\n * Continue matching `doctype` after `<!d`.\n *\n * A full `doctype` match stays on the declaration path; any other name falls\n * back to an HTML bogus comment, which matches browser behavior for\n * non-doctype `<!...>` constructs.\n * @param c Current character code point.\n */\n stateDeclarationSequence(c) {\n if (this.sequenceIndex === this.currentSequence.length) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c);\n }\n else if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n stateInDeclaration(c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.ondeclaration(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n /**\n * XML processing instructions (`<?...?>`).\n *\n * In HTML mode `<?` is routed to `InSpecialComment` instead, so this\n * state is only reachable in XML mode.\n * @param c Current character code point.\n */\n stateInProcessingInstruction(c) {\n if (c === CharCodes.Questionmark) {\n // Remember that we just consumed `?`, so the next `>` closes the PI.\n this.sequenceIndex = 1;\n }\n else if (c === CharCodes.Gt && this.sequenceIndex === 1) {\n this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);\n this.sequenceIndex = 0;\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n // Keep scanning for the next `?`, which can start a closing `?>`.\n this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));\n }\n }\n stateBeforeComment(c) {\n if (c === CharCodes.Dash) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CommentEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n else if (this.xmlMode) {\n this.state = State.InDeclaration;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n stateInSpecialComment(c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n startEntity() {\n this.baseState = this.state;\n this.state = State.InEntity;\n this.entityStart = this.index;\n this.entityDecoder.startEntity(this.xmlMode\n ? DecodingMode.Strict\n : this.baseState === State.Text ||\n this.baseState === State.InSpecialTag\n ? DecodingMode.Legacy\n : DecodingMode.Attribute);\n }\n stateInEntity() {\n const indexInBuffer = this.index - this.offset;\n const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n // If `length` is positive, we are done with the entity.\n if (length >= 0) {\n this.state = this.baseState;\n if (length === 0) {\n this.index -= 1;\n }\n }\n else {\n if (indexInBuffer < this.buffer.length &&\n this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp) {\n this.state = this.baseState;\n this.index -= 1;\n return;\n }\n // Mark buffer as consumed.\n this.index = this.offset + this.buffer.length - 1;\n }\n }\n /**\n * Remove data that has already been consumed from the buffer.\n */\n cleanup() {\n // If we are inside of text or attributes, emit what we already have.\n if (this.running && this.sectionStart !== this.index) {\n if (this.state === State.Text ||\n this.state === State.InPlainText ||\n (this.state === State.InSpecialTag && this.sequenceIndex === 0)) {\n this.cbs.ontext(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n else if (this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueNq) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n }\n }\n shouldContinue() {\n return this.index < this.buffer.length + this.offset && this.running;\n }\n /**\n * Iterates through the buffer, calling the function corresponding to the current state.\n *\n * States that are more likely to be hit are higher up, as a performance improvement.\n */\n parse() {\n while (this.shouldContinue()) {\n const c = this.buffer.charCodeAt(this.index - this.offset);\n switch (this.state) {\n case State.Text: {\n this.stateText(c);\n break;\n }\n case State.InPlainText: {\n // Skip to end of buffer; cleanup() emits the text.\n this.index = this.buffer.length + this.offset - 1;\n break;\n }\n case State.SpecialStartSequence: {\n this.stateSpecialStartSequence(c);\n break;\n }\n case State.InSpecialTag: {\n this.stateInSpecialTag(c);\n break;\n }\n case State.CDATASequence: {\n this.stateCDATASequence(c);\n break;\n }\n case State.DeclarationSequence: {\n this.stateDeclarationSequence(c);\n break;\n }\n case State.InAttributeValueDq: {\n this.stateInAttributeValueDoubleQuotes(c);\n break;\n }\n case State.InAttributeName: {\n this.stateInAttributeName(c);\n break;\n }\n case State.InCommentLike: {\n this.stateInCommentLike(c);\n break;\n }\n case State.InSpecialComment: {\n this.stateInSpecialComment(c);\n break;\n }\n case State.BeforeAttributeName: {\n this.stateBeforeAttributeName(c);\n break;\n }\n case State.InTagName: {\n this.stateInTagName(c);\n break;\n }\n case State.InClosingTagName: {\n this.stateInClosingTagName(c);\n break;\n }\n case State.BeforeTagName: {\n this.stateBeforeTagName(c);\n break;\n }\n case State.AfterAttributeName: {\n this.stateAfterAttributeName(c);\n break;\n }\n case State.InAttributeValueSq: {\n this.stateInAttributeValueSingleQuotes(c);\n break;\n }\n case State.BeforeAttributeValue: {\n this.stateBeforeAttributeValue(c);\n break;\n }\n case State.BeforeClosingTagName: {\n this.stateBeforeClosingTagName(c);\n break;\n }\n case State.AfterClosingTagName: {\n this.stateAfterClosingTagName(c);\n break;\n }\n case State.InAttributeValueNq: {\n this.stateInAttributeValueNoQuotes(c);\n break;\n }\n case State.InSelfClosingTag: {\n this.stateInSelfClosingTag(c);\n break;\n }\n case State.InDeclaration: {\n this.stateInDeclaration(c);\n break;\n }\n case State.BeforeDeclaration: {\n this.stateBeforeDeclaration(c);\n break;\n }\n case State.BeforeComment: {\n this.stateBeforeComment(c);\n break;\n }\n case State.InProcessingInstruction: {\n this.stateInProcessingInstruction(c);\n break;\n }\n case State.InEntity: {\n this.stateInEntity();\n break;\n }\n }\n this.index++;\n }\n this.cleanup();\n }\n finish() {\n if (this.state === State.InEntity) {\n this.entityDecoder.end();\n this.state = this.baseState;\n }\n this.handleTrailingData();\n this.cbs.onend();\n }\n handleTrailingCommentLikeData(endIndex) {\n if (this.state !== State.InCommentLike) {\n return false;\n }\n if (this.currentSequence === Sequences.CdataEnd) {\n if (this.xmlMode) {\n if (this.sectionStart < endIndex) {\n this.cbs.oncdata(this.sectionStart, endIndex, 0);\n }\n }\n else {\n /* In HTML mode, unclosed CDATA is a bogus comment. */\n const cdataStart = this.sectionStart - Sequences.Cdata.length - 1;\n this.cbs.oncomment(cdataStart, endIndex, 0);\n }\n }\n else {\n const offset = this.xmlMode\n ? 0\n : Math.min(this.sequenceIndex, Sequences.CommentEnd.length - 1);\n this.cbs.oncomment(this.sectionStart, endIndex, offset);\n }\n return true;\n }\n handleTrailingMarkupDeclaration(endIndex) {\n if (this.xmlMode) {\n switch (this.state) {\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence:\n case State.DeclarationSequence:\n case State.InDeclaration: {\n this.cbs.ontext(this.sectionStart, endIndex);\n return true;\n }\n default: {\n return false;\n }\n }\n }\n switch (this.state) {\n case State.BeforeDeclaration:\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence: {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n return true;\n }\n case State.DeclarationSequence: {\n if (this.sequenceIndex !== Sequences.Doctype.length) {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n }\n return true;\n }\n case State.InDeclaration: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /** Handle any trailing data. */\n handleTrailingData() {\n const endIndex = this.buffer.length + this.offset;\n if (this.handleTrailingCommentLikeData(endIndex) ||\n this.handleTrailingMarkupDeclaration(endIndex)) {\n return;\n }\n // If there is no remaining data, we are done.\n if (this.sectionStart >= endIndex) {\n return;\n }\n switch (this.state) {\n case State.InTagName:\n case State.BeforeAttributeName:\n case State.BeforeAttributeValue:\n case State.AfterAttributeName:\n case State.InAttributeName:\n case State.InAttributeValueSq:\n case State.InAttributeValueDq:\n case State.InAttributeValueNq:\n case State.InClosingTagName: {\n /*\n * If we are currently in an opening or closing tag, us not calling the\n * respective callback signals that the tag should be ignored.\n */\n break;\n }\n default: {\n this.cbs.ontext(this.sectionStart, endIndex);\n }\n }\n }\n emitCodePoint(cp, consumed) {\n if (this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag) {\n if (this.sectionStart < this.entityStart) {\n this.cbs.onattribdata(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n this.cbs.onattribentity(cp);\n }\n else {\n if (this.sectionStart < this.entityStart) {\n this.cbs.ontext(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n this.cbs.ontextentity(cp, this.sectionStart);\n }\n }\n}\n//# sourceMappingURL=Tokenizer.js.map","const { fromCodePoint } = String;\nimport Tokenizer, { QuoteType } from \"./Tokenizer.js\";\nconst formTags = new Set([\n \"input\",\n \"option\",\n \"optgroup\",\n \"select\",\n \"button\",\n \"datalist\",\n \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst headingTags = new Set([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\nconst openImpliesClose = new Map([\n [\"tr\", new Set([\"tr\", \"th\", \"td\"])],\n [\"th\", new Set([\"th\"])],\n [\"td\", new Set([\"thead\", \"th\", \"td\"])],\n [\"body\", new Set([\"head\", \"link\", \"script\"])],\n [\"a\", new Set([\"a\"])],\n [\"li\", new Set([\"li\"])],\n [\"p\", pTag],\n [\"h1\", headingTags],\n [\"h2\", headingTags],\n [\"h3\", headingTags],\n [\"h4\", headingTags],\n [\"h5\", headingTags],\n [\"h6\", headingTags],\n [\"select\", formTags],\n [\"input\", formTags],\n [\"output\", formTags],\n [\"button\", formTags],\n [\"datalist\", formTags],\n [\"textarea\", formTags],\n [\"option\", new Set([\"option\"])],\n [\"optgroup\", new Set([\"optgroup\", \"option\"])],\n [\"dd\", ddtTags],\n [\"dt\", ddtTags],\n [\"address\", pTag],\n [\"article\", pTag],\n [\"aside\", pTag],\n [\"blockquote\", pTag],\n [\"details\", pTag],\n [\"div\", pTag],\n [\"dl\", pTag],\n [\"fieldset\", pTag],\n [\"figcaption\", pTag],\n [\"figure\", pTag],\n [\"footer\", pTag],\n [\"form\", pTag],\n [\"header\", pTag],\n [\"hr\", pTag],\n [\"main\", pTag],\n [\"nav\", pTag],\n [\"ol\", pTag],\n [\"pre\", pTag],\n [\"section\", pTag],\n [\"table\", pTag],\n [\"ul\", pTag],\n [\"rt\", rtpTags],\n [\"rp\", rtpTags],\n [\"tbody\", tableSectionTags],\n [\"tfoot\", tableSectionTags],\n]);\nconst DOCUMENT_TYPE = \"doctype\";\nconst voidElements = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n/**\n * Elements that can be used to integrate HTML content within foreign namespaces (e.g., SVG or MathML).\n *\n * Entries must use the SVG-adjusted casing (e.g. \"foreignObject\" not\n * \"foreignobject\") since they are compared against adjusted tag names.\n */\nconst htmlIntegrationElements = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignObject\",\n \"desc\",\n \"title\",\n]);\nconst svgTagNameAdjustments = new Map([\n [\"altglyph\", \"altGlyph\"],\n [\"altglyphdef\", \"altGlyphDef\"],\n [\"altglyphitem\", \"altGlyphItem\"],\n [\"animatecolor\", \"animateColor\"],\n [\"animatemotion\", \"animateMotion\"],\n [\"animatetransform\", \"animateTransform\"],\n [\"clippath\", \"clipPath\"],\n [\"feblend\", \"feBlend\"],\n [\"fecolormatrix\", \"feColorMatrix\"],\n [\"fecomponenttransfer\", \"feComponentTransfer\"],\n [\"fecomposite\", \"feComposite\"],\n [\"feconvolvematrix\", \"feConvolveMatrix\"],\n [\"fediffuselighting\", \"feDiffuseLighting\"],\n [\"fedisplacementmap\", \"feDisplacementMap\"],\n [\"fedistantlight\", \"feDistantLight\"],\n [\"fedropshadow\", \"feDropShadow\"],\n [\"feflood\", \"feFlood\"],\n [\"fefunca\", \"feFuncA\"],\n [\"fefuncb\", \"feFuncB\"],\n [\"fefuncg\", \"feFuncG\"],\n [\"fefuncr\", \"feFuncR\"],\n [\"fegaussianblur\", \"feGaussianBlur\"],\n [\"feimage\", \"feImage\"],\n [\"femerge\", \"feMerge\"],\n [\"femergenode\", \"feMergeNode\"],\n [\"femorphology\", \"feMorphology\"],\n [\"feoffset\", \"feOffset\"],\n [\"fepointlight\", \"fePointLight\"],\n [\"fespecularlighting\", \"feSpecularLighting\"],\n [\"fespotlight\", \"feSpotLight\"],\n [\"fetile\", \"feTile\"],\n [\"feturbulence\", \"feTurbulence\"],\n [\"foreignobject\", \"foreignObject\"],\n [\"glyphref\", \"glyphRef\"],\n [\"lineargradient\", \"linearGradient\"],\n [\"radialgradient\", \"radialGradient\"],\n [\"textpath\", \"textPath\"],\n]);\nvar ForeignContext;\n(function (ForeignContext) {\n ForeignContext[ForeignContext[\"None\"] = 0] = \"None\";\n ForeignContext[ForeignContext[\"Svg\"] = 1] = \"Svg\";\n ForeignContext[ForeignContext[\"MathML\"] = 2] = \"MathML\";\n})(ForeignContext || (ForeignContext = {}));\nconst reNameEnd = /\\s|\\//;\n/**\n * Incremental parser implementation.\n */\nexport class Parser {\n options;\n /** The start index of the last event. */\n startIndex = 0;\n /** The end index of the last event. */\n endIndex = 0;\n /**\n * Store the start index of the current open tag,\n * so we can update the start index for attributes.\n */\n openTagStart = 0;\n tagname = \"\";\n attribname = \"\";\n attribvalue = \"\";\n attribs = null;\n stack = [];\n foreignContext;\n cbs;\n lowerCaseTagNames;\n lowerCaseAttributeNames;\n recognizeSelfClosing;\n /** We are parsing HTML. Inverse of the `xmlMode` option. */\n htmlMode;\n tokenizer;\n buffers = [];\n bufferOffset = 0;\n /** The index of the last written buffer. Used when resuming after a `pause()`. */\n writeIndex = 0;\n /** Indicates whether the parser has finished running / `.end` has been called. */\n ended = false;\n constructor(cbs, options = {}) {\n this.options = options;\n this.cbs = cbs ?? {};\n this.htmlMode = !this.options.xmlMode;\n this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n this.lowerCaseAttributeNames =\n options.lowerCaseAttributeNames ?? this.htmlMode;\n this.recognizeSelfClosing =\n options.recognizeSelfClosing ?? !this.htmlMode;\n this.tokenizer = new (options.Tokenizer ?? Tokenizer)(this.options, this);\n this.foreignContext = [ForeignContext.None];\n this.cbs.onparserinit?.(this);\n }\n // Tokenizer event handlers\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontext(start, endIndex) {\n const data = this.getSlice(start, endIndex);\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(data);\n this.startIndex = endIndex;\n }\n /**\n * @param cp Current Unicode code point.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontextentity(cp, endIndex) {\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(fromCodePoint(cp));\n this.startIndex = endIndex;\n }\n /** @internal */\n isInForeignContext() {\n return this.foreignContext[0] !== ForeignContext.None;\n }\n /**\n * Checks if the current tag is a void element. Override this if you want\n * to specify your own additional void elements.\n * @param name Name of the pseudo selector.\n */\n isVoidElement(name) {\n return this.htmlMode && voidElements.has(name);\n }\n /**\n * Read a tag name from the buffer.\n *\n * When `lowerCaseTagNames` is enabled (the default in HTML mode), the name\n * is lowercased and may be adjusted for SVG casing or the `image` → `img`\n * alias.\n * @param start Start index of the tag name in the buffer.\n * @param endIndex End index of the tag name in the buffer.\n */\n readTagName(start, endIndex) {\n const name = this.lowerCaseTagNames\n ? this.getSlice(start, endIndex).toLowerCase()\n : this.getSlice(start, endIndex);\n if (!(this.lowerCaseTagNames && this.htmlMode)) {\n return name;\n }\n if (this.foreignContext[0] === ForeignContext.Svg) {\n return svgTagNameAdjustments.get(name) ?? name;\n }\n /*\n * Closing tags for SVG elements inside HTML integration points\n * (e.g. </foreignObject> while inside its own content) need case\n * adjustment so the name matches what was pushed to the stack.\n * `foreignContext.length > 1` means a foreign ancestor exists —\n * the base [None] entry plus at least one pushed context.\n */\n if (this.foreignContext.length > 1) {\n const adjusted = svgTagNameAdjustments.get(name);\n if (adjusted !== undefined && this.stack.includes(adjusted)) {\n return adjusted;\n }\n }\n if (!this.isInForeignContext()) {\n return name === \"image\" ? \"img\" : name;\n }\n return name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagname(start, endIndex) {\n this.endIndex = endIndex;\n this.emitOpenTag(this.readTagName(start, endIndex));\n }\n emitOpenTag(name) {\n this.openTagStart = this.startIndex;\n this.tagname = name;\n /*\n * The spec ignores a second <form> when one is already open.\n * Setting tagname to \"\" suppresses all downstream effects: attribs\n * stays null so endOpenTag is a no-op, and closeCurrentTag can't\n * match \"\" on the stack.\n */\n if (this.htmlMode && name === \"form\" && this.stack.includes(\"form\")) {\n this.tagname = \"\";\n return;\n }\n const impliesClose = this.htmlMode && openImpliesClose.get(name);\n if (impliesClose) {\n while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n this.popElement(true);\n }\n }\n if (!this.isVoidElement(name)) {\n this.stack.unshift(name);\n if (this.htmlMode) {\n if (name === \"svg\") {\n this.foreignContext.unshift(ForeignContext.Svg);\n }\n else if (name === \"math\") {\n this.foreignContext.unshift(ForeignContext.MathML);\n }\n else if (htmlIntegrationElements.has(name)) {\n this.foreignContext.unshift(ForeignContext.None);\n }\n }\n }\n this.cbs.onopentagname?.(name);\n if (this.cbs.onopentag)\n this.attribs = {};\n }\n endOpenTag(isImplied) {\n this.startIndex = this.openTagStart;\n if (this.attribs) {\n this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n this.attribs = null;\n }\n if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n this.cbs.onclosetag(this.tagname, true);\n }\n this.tagname = \"\";\n }\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagend(endIndex) {\n this.endIndex = endIndex;\n this.endOpenTag(false);\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onclosetag(start, endIndex) {\n this.endIndex = endIndex;\n const name = this.readTagName(start, endIndex);\n if (!this.isVoidElement(name)) {\n const pos = this.stack.indexOf(name);\n if (pos !== -1) {\n for (let index = 0; index < pos; index++) {\n this.popElement(true);\n }\n this.popElement(false);\n }\n else if (this.htmlMode && name === \"p\") {\n // Implicit open before close\n this.emitOpenTag(\"p\");\n this.closeCurrentTag(true);\n }\n }\n else if (this.htmlMode && name === \"br\") {\n // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n this.cbs.onopentagname?.(\"br\");\n this.cbs.onopentag?.(\"br\", {}, true);\n this.cbs.onclosetag?.(\"br\", false);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onselfclosingtag(endIndex) {\n this.endIndex = endIndex;\n if (this.recognizeSelfClosing || this.isInForeignContext()) {\n this.closeCurrentTag(false);\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n else {\n // Ignore the fact that the tag is self-closing.\n this.onopentagend(endIndex);\n }\n }\n /**\n * Pop the top element off the stack, emit a close event, and maintain\n * the foreign context stack.\n * @param implied Whether this close is implied (not from an explicit end tag).\n */\n popElement(implied) {\n // biome-ignore lint/style/noNonNullAssertion: The element is guaranteed to exist.\n const element = this.stack.shift();\n if (this.htmlMode &&\n (foreignContextElements.has(element) ||\n htmlIntegrationElements.has(element))) {\n this.foreignContext.shift();\n }\n this.cbs.onclosetag?.(element, implied);\n }\n closeCurrentTag(isOpenImplied) {\n const name = this.tagname;\n this.endOpenTag(isOpenImplied);\n // Self-closing tags will be on the top of the stack\n if (this.stack[0] === name) {\n this.popElement(!isOpenImplied);\n }\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribname(start, endIndex) {\n this.startIndex = start;\n const name = this.getSlice(start, endIndex);\n this.attribname = this.lowerCaseAttributeNames\n ? name.toLowerCase()\n : name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribdata(start, endIndex) {\n this.attribvalue += this.getSlice(start, endIndex);\n }\n /**\n * @param cp Current Unicode code point.\n * @internal\n */\n onattribentity(cp) {\n this.attribvalue += fromCodePoint(cp);\n }\n /**\n * @param quote Quote type used for the current attribute.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribend(quote, endIndex) {\n this.endIndex = endIndex;\n this.cbs.onattribute?.(this.attribname, this.attribvalue, quote === QuoteType.Double\n ? '\"'\n : quote === QuoteType.Single\n ? \"'\"\n : quote === QuoteType.NoValue\n ? undefined\n : null);\n if (this.attribs && !Object.hasOwn(this.attribs, this.attribname)) {\n this.attribs[this.attribname] = this.attribvalue;\n }\n this.attribvalue = \"\";\n }\n getInstructionName(value) {\n const index = value.search(reNameEnd);\n let name = index < 0 ? value : value.substr(0, index);\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n return name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ondeclaration(start, endIndex) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n if (this.cbs.onprocessinginstruction) {\n /*\n * In HTML mode, ondeclaration is only reached for DOCTYPE\n * (the tokenizer routes everything else to bogus comments).\n */\n const name = this.htmlMode\n ? this.lowerCaseTagNames\n ? DOCUMENT_TYPE\n : value.slice(0, DOCUMENT_TYPE.length)\n : this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onprocessinginstruction(start, endIndex) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncomment(start, endIndex, offset) {\n this.endIndex = endIndex;\n this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n this.cbs.oncommentend?.();\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncdata(start, endIndex, offset) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex - offset);\n if (!this.htmlMode || this.options.recognizeCDATA) {\n this.cbs.oncdatastart?.();\n this.cbs.ontext?.(value);\n this.cbs.oncdataend?.();\n }\n else if (this.isInForeignContext()) {\n this.cbs.ontext?.(value);\n }\n else {\n this.cbs.oncomment?.(`[CDATA[${value}]]`);\n this.cbs.oncommentend?.();\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /** @internal */\n onend() {\n if (this.cbs.onclosetag) {\n // Set the end index for all remaining tags\n this.endIndex = this.startIndex;\n for (let index = 0; index < this.stack.length; index++) {\n this.cbs.onclosetag(this.stack[index], true);\n }\n }\n this.cbs.onend?.();\n }\n /**\n * Resets the parser to a blank state, ready to parse a new HTML document\n */\n reset() {\n this.cbs.onreset?.();\n this.tokenizer.reset();\n this.tagname = \"\";\n this.attribname = \"\";\n this.attribvalue = \"\";\n this.attribs = null;\n this.stack.length = 0;\n this.startIndex = 0;\n this.endIndex = 0;\n this.cbs.onparserinit?.(this);\n this.buffers.length = 0;\n this.foreignContext.length = 0;\n this.foreignContext.unshift(ForeignContext.None);\n this.bufferOffset = 0;\n this.writeIndex = 0;\n this.ended = false;\n }\n /**\n * Resets the parser, then parses a complete document and\n * pushes it to the handler.\n * @param data Document to parse.\n */\n parseComplete(data) {\n this.reset();\n this.end(data);\n }\n getSlice(start, end) {\n if (start === end) {\n return \"\";\n }\n while (start - this.bufferOffset >= this.buffers[0].length) {\n this.shiftBuffer();\n }\n let slice = this.buffers[0].slice(start - this.bufferOffset, end - this.bufferOffset);\n while (end - this.bufferOffset > this.buffers[0].length) {\n this.shiftBuffer();\n slice += this.buffers[0].slice(0, end - this.bufferOffset);\n }\n return slice;\n }\n shiftBuffer() {\n this.bufferOffset += this.buffers[0].length;\n this.writeIndex--;\n this.buffers.shift();\n }\n /**\n * Parses a chunk of data and calls the corresponding callbacks.\n * @param chunk Chunk to parse.\n */\n write(chunk) {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".write() after done!\"));\n return;\n }\n this.buffers.push(chunk);\n if (this.tokenizer.running) {\n this.tokenizer.write(chunk);\n this.writeIndex++;\n }\n }\n /**\n * Parses the end of the buffer and clears the stack, calls onend.\n * @param chunk Optional final chunk to parse.\n */\n end(chunk) {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".end() after done!\"));\n return;\n }\n if (chunk)\n this.write(chunk);\n this.ended = true;\n this.tokenizer.end();\n }\n /**\n * Pauses parsing. The parser won't emit events until `resume` is called.\n */\n pause() {\n this.tokenizer.pause();\n }\n /**\n * Resumes parsing after `pause` was called.\n */\n resume() {\n this.tokenizer.resume();\n while (this.tokenizer.running &&\n this.writeIndex < this.buffers.length) {\n this.tokenizer.write(this.buffers[this.writeIndex++]);\n }\n if (this.ended)\n this.tokenizer.end();\n }\n}\n//# sourceMappingURL=Parser.js.map","import { hasChildren, isTag, } from \"domhandler\";\n/**\n * Search a node and its children for nodes passing a test function. If `node` is not an array, it will be wrapped in one.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param node Node to search. Will be included in the result set if it matches.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nexport function filter(test, node, recurse = true, limit = Number.POSITIVE_INFINITY) {\n return find(test, Array.isArray(node) ? node : [node], recurse, limit);\n}\n/**\n * Search an array of nodes and their children for nodes passing a test function.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nexport function find(test, nodes, recurse, limit) {\n const result = [];\n /** Stack of the arrays we are looking at. */\n const nodeStack = [Array.isArray(nodes) ? nodes : [nodes]];\n /** Stack of the indices within the arrays. */\n const indexStack = [0];\n for (;;) {\n // First, check if the current array has any more elements to look at.\n if (indexStack[0] >= nodeStack[0].length) {\n // If we have no more arrays to look at, we are done.\n if (indexStack.length === 1) {\n return result;\n }\n // Otherwise, remove the current array from the stack.\n nodeStack.shift();\n indexStack.shift();\n // Loop back to the start to continue with the next array.\n continue;\n }\n const element = nodeStack[0][indexStack[0]++];\n if (test(element)) {\n result.push(element);\n if (--limit <= 0)\n return result;\n }\n if (recurse && hasChildren(element) && element.children.length > 0) {\n /*\n * Add the children to the stack. We are depth-first, so this is\n * the next array we look at.\n */\n indexStack.unshift(0);\n nodeStack.unshift(element.children);\n }\n }\n}\n/**\n * Finds one element in a tree that passes a test.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Node or array of nodes to search.\n * @param recurse Also consider child nodes.\n * @returns The first node that passes `test`.\n */\nexport function findOne(test, nodes, recurse = true) {\n const searchedNodes = Array.isArray(nodes) ? nodes : [nodes];\n for (const node of searchedNodes) {\n if (isTag(node) && test(node)) {\n return node;\n }\n if (recurse && hasChildren(node) && node.children.length > 0) {\n const found = findOne(test, node.children, true);\n if (found)\n return found;\n }\n }\n return null;\n}\n/**\n * Checks if a tree of nodes contains at least one node passing a test.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns Whether a tree of nodes contains at least one node passing the test.\n */\nexport function existsOne(test, nodes) {\n return (Array.isArray(nodes) ? nodes : [nodes]).some((node) => (isTag(node) && test(node)) ||\n (hasChildren(node) && existsOne(test, node.children)));\n}\n/**\n * Search an array of nodes and their children for elements passing a test function.\n *\n * Same as `find`, but limited to elements and with less options, leading to reduced complexity.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns All nodes passing `test`.\n */\nexport function findAll(test, nodes) {\n const result = [];\n const nodeStack = [Array.isArray(nodes) ? nodes : [nodes]];\n const indexStack = [0];\n for (;;) {\n if (indexStack[0] >= nodeStack[0].length) {\n if (nodeStack.length === 1) {\n return result;\n }\n // Otherwise, remove the current array from the stack.\n nodeStack.shift();\n indexStack.shift();\n // Loop back to the start to continue with the next array.\n continue;\n }\n const element = nodeStack[0][indexStack[0]++];\n if (isTag(element) && test(element))\n result.push(element);\n if (hasChildren(element) && element.children.length > 0) {\n indexStack.unshift(0);\n nodeStack.unshift(element.children);\n }\n }\n}\n//# sourceMappingURL=querying.js.map","import { isTag, isText } from \"domhandler\";\nimport { filter, findOne } from \"./querying.js\";\n/**\n * A map of functions to check nodes against.\n */\nconst Checks = {\n tag_name(name) {\n if (typeof name === \"function\") {\n return (element) => isTag(element) && name(element.name);\n }\n if (name === \"*\") {\n return isTag;\n }\n return (element) => isTag(element) && element.name === name;\n },\n tag_type(type) {\n if (typeof type === \"function\") {\n return (element) => type(element.type);\n }\n return (element) => element.type === type;\n },\n tag_contains(data) {\n if (typeof data === \"function\") {\n return (element) => isText(element) && data(element.data);\n }\n return (element) => isText(element) && element.data === data;\n },\n};\n/**\n * Returns a function to check whether a node has an attribute with a particular\n * value.\n *\n * @param attrib Attribute to check.\n * @param value Attribute value to look for.\n * @returns A function to check whether the a node has an attribute with a\n * particular value.\n */\nfunction getAttribCheck(attrib, value) {\n if (typeof value === \"function\") {\n return (element) => isTag(element) && value(element.attribs[attrib]);\n }\n return (element) => isTag(element) && element.attribs[attrib] === value;\n}\n/**\n * Returns a function that returns `true` if either of the input functions\n * returns `true` for a node.\n *\n * @param a First function to combine.\n * @param b Second function to combine.\n * @returns A function taking a node and returning `true` if either of the input\n * functions returns `true` for the node.\n */\nfunction combineFuncs(a, b) {\n return (element) => a(element) || b(element);\n}\n/**\n * Returns a function that executes all checks in `options` and returns `true`\n * if any of them match a node.\n *\n * @param options An object describing nodes to look for.\n * @returns A function that executes all checks in `options` and returns `true`\n * if any of them match a node.\n */\nfunction compileTest(options) {\n const funcs = Object.keys(options).map((key) => {\n const value = options[key];\n return Object.hasOwn(Checks, key)\n ? Checks[key](value)\n : getAttribCheck(key, value);\n });\n return funcs.length === 0 ? null : funcs.reduce(combineFuncs);\n}\n/**\n * Checks whether a node matches the description in `options`.\n *\n * @category Legacy Query Functions\n * @param options An object describing nodes to look for.\n * @param node The element to test.\n * @returns Whether the element matches the description in `options`.\n */\nexport function testElement(options, node) {\n const test = compileTest(options);\n return test ? test(node) : true;\n}\n/**\n * Returns all nodes that match `options`.\n *\n * @category Legacy Query Functions\n * @param options An object describing nodes to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes that match `options`.\n */\nexport function getElements(options, nodes, recurse, limit = Number.POSITIVE_INFINITY) {\n const test = compileTest(options);\n return test ? filter(test, nodes, recurse, limit) : [];\n}\n/**\n * Returns the node with the supplied ID.\n *\n * @category Legacy Query Functions\n * @param id The unique ID attribute value to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @returns The node with the supplied ID.\n */\nexport function getElementById(id, nodes, recurse = true) {\n if (!Array.isArray(nodes))\n nodes = [nodes];\n return findOne(getAttribCheck(\"id\", id), nodes, recurse);\n}\n/**\n * Returns all nodes with the supplied `tagName`.\n *\n * @category Legacy Query Functions\n * @param tagName Tag name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `tagName`.\n */\nexport function getElementsByTagName(tagName, nodes, recurse = true, limit = Number.POSITIVE_INFINITY) {\n return filter(Checks[\"tag_name\"](tagName), nodes, recurse, limit);\n}\n/**\n * Returns all nodes with the supplied `className`.\n *\n * @category Legacy Query Functions\n * @param className Class name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `className`.\n */\nexport function getElementsByClassName(className, nodes, recurse = true, limit = Number.POSITIVE_INFINITY) {\n return filter(getAttribCheck(\"class\", className), nodes, recurse, limit);\n}\n/**\n * Returns all nodes with the supplied `type`.\n *\n * @category Legacy Query Functions\n * @param type Element type to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `type`.\n */\nexport function getElementsByTagType(type, nodes, recurse = true, limit = Number.POSITIVE_INFINITY) {\n return filter(Checks[\"tag_type\"](type), nodes, recurse, limit);\n}\n//# sourceMappingURL=legacy.js.map","const xmlCodeMap = new Map([\n [34, \""\"],\n [38, \"&\"],\n [39, \"'\"],\n [60, \"<\"],\n [62, \">\"],\n]);\n// For compatibility with node < 4, we wrap `codePointAt`\n/**\n * Read a code point at a given index.\n * @param input Input string to encode or decode.\n * @param index Current read position in the input string.\n */\nexport const getCodePoint = typeof String.prototype.codePointAt === \"function\"\n ? (input, index) => input.codePointAt(index)\n : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n (c, index) => (c.charCodeAt(index) & 0xfc_00) === 0xd8_00\n ? (c.charCodeAt(index) - 0xd8_00) * 0x4_00 +\n c.charCodeAt(index + 1) -\n 0xdc_00 +\n 0x1_00_00\n : c.charCodeAt(index);\n/**\n * Bitset for ASCII characters that need to be escaped in XML.\n */\nexport const XML_BITSET_VALUE = 0x50_00_00_c4; // 32..63 -> 34 (\"),38 (&),39 ('),60 (<),62 (>)\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities. Uses a fast bitset scan instead of RegExp.\n *\n * If a character has no equivalent entity, a numeric hexadecimal reference\n * (eg. `ü`) will be used.\n * @param input Input string to encode or decode.\n */\nexport function encodeXML(input) {\n let out;\n let last = 0;\n const { length } = input;\n for (let index = 0; index < length; index++) {\n const char = input.charCodeAt(index);\n // Check for ASCII chars that don't need escaping\n if (char < 0x80 &&\n (((XML_BITSET_VALUE >>> char) & 1) === 0 || char >= 64 || char < 32)) {\n continue;\n }\n if (out === undefined)\n out = input.substring(0, index);\n else if (last !== index)\n out += input.substring(last, index);\n if (char < 64) {\n // Known replacement\n out += xmlCodeMap.get(char);\n last = index + 1;\n continue;\n }\n // Non-ASCII: encode as numeric entity (handle surrogate pair)\n const cp = getCodePoint(input, index);\n out += `&#x${cp.toString(16)};`;\n if (cp !== char)\n index++; // Skip trailing surrogate\n last = index + 1;\n }\n if (out === undefined)\n return input;\n if (last < length)\n out += input.substr(last);\n return out;\n}\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `ü`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n * @param data String to escape.\n */\nexport const escape = encodeXML;\n/**\n * Creates a function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n * @param regex Regular expression to match characters to escape.\n * @param map Map of characters to escape to their entities.\n * @returns Function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n */\nfunction getEscaper(regex, map) {\n return function escape(data) {\n let match;\n let lastIndex = 0;\n let result = \"\";\n while ((match = regex.exec(data))) {\n if (lastIndex !== match.index) {\n result += data.substring(lastIndex, match.index);\n }\n // We know that this character will be in the map.\n result += map.get(match[0].charCodeAt(0));\n // Every match will be of length 1\n lastIndex = match.index + 1;\n }\n return result + data.substring(lastIndex);\n };\n}\n/**\n * Encodes all characters not valid in XML documents using XML entities.\n *\n * Note that the output will be character-set dependent.\n * @param data String to escape.\n */\nexport const escapeUTF8 = /* #__PURE__ */ getEscaper(/[\"&'<>]/g, xmlCodeMap);\n/**\n * Encodes all characters that have to be escaped in HTML attributes,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport const escapeAttribute = \n/* #__PURE__ */ getEscaper(/[\"&\\u00A0]/g, new Map([\n [34, \""\"],\n [38, \"&\"],\n [160, \" \"],\n]));\n/**\n * Encodes all characters that have to be escaped in HTML text,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport const escapeText = /* #__PURE__ */ getEscaper(/[&<>\\u00A0]/g, new Map([\n [38, \"&\"],\n [60, \"<\"],\n [62, \">\"],\n [160, \" \"],\n]));\n//# sourceMappingURL=escape.js.map","/**\n * Mixed-case SVG and MathML element names recognized in foreign content.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nexport const elementNames = new Map(\"altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feDropShadow feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath\"\n .split(\" \")\n .map((name) => [name.toLowerCase(), name]));\n/**\n * Mixed-case SVG and MathML attribute names recognized in foreign content.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nexport const attributeNames = new Map(\"definitionURL attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits diffuseConstant edgeMode filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan\"\n .split(\" \")\n .map((name) => [name.toLowerCase(), name]));\n//# sourceMappingURL=foreign-names.js.map","import * as ElementType from \"domelementtype\";\nimport { encodeXML, escapeAttribute, escapeText } from \"entities\";\nimport { attributeNames, elementNames } from \"./foreign-names.js\";\n// ── Constants ────────────────────────────────────────────────────────\n/** Elements whose text content is never entity-encoded. */\nconst unencodedElements = new Set(\"style script xmp iframe noembed noframes plaintext noscript\".split(\" \"));\n/** HTML void elements — they cannot have children. */\nconst voidElements = new Set(\"area base basefont br col command embed frame hr img input isindex keygen link meta param source track wbr\".split(\" \"));\n/** Elements that switch the parser into foreign (XML-like) mode. */\nconst foreignElements = new Set([\"svg\", \"math\"]);\n/**\n * Foreign-mode integration points: children of these elements are parsed\n * as HTML again, not as foreign content.\n */\nconst foreignModeIntegrationPoints = new Set(\"mi mo mn ms mtext annotation-xml foreignObject desc title\".split(\" \"));\n// ── Public API ───────────────────────────────────────────────────────\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed\n * node(s).\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nexport function render(node, options = {}) {\n const nodes = \"length\" in node ? node : [node];\n /*\n * `xmlMode` is threaded as a separate argument through the internal\n * functions so that foreign-mode transitions (svg/mathml ↔ html) can\n * adjust it without copying the options object on every element.\n */\n const xmlMode = options.xmlMode ?? false;\n let output = \"\";\n // eslint-disable-next-line unicorn/no-for-loop\n for (let index = 0; index < nodes.length; index++) {\n output += renderNode(nodes[index], options, xmlMode);\n }\n return output;\n}\nexport default render;\n// ── Internal rendering ───────────────────────────────────────────────\n/**\n * Render an array of child nodes (skips the single-node wrapping in `render`).\n * @param children The child nodes to render.\n * @param options The serialization options.\n * @param xmlMode The XML mode to use.\n */\nfunction renderChildren(children, options, xmlMode) {\n let output = \"\";\n // eslint-disable-next-line unicorn/no-for-loop\n for (let index = 0; index < children.length; index++) {\n output += renderNode(children[index], options, xmlMode);\n }\n return output;\n}\nfunction renderNode(node, options, xmlMode) {\n switch (node.type) {\n case ElementType.Root: {\n return renderChildren(node.children, options, xmlMode);\n }\n case ElementType.Directive: {\n return `<${node.data}>`;\n }\n case ElementType.Comment: {\n return `<!--${node.data}-->`;\n }\n case ElementType.CDATA: {\n return `<![CDATA[${node.children[0].data}]]>`;\n }\n case ElementType.Script:\n case ElementType.Style:\n case ElementType.Tag: {\n return renderTag(node, options, xmlMode);\n }\n case ElementType.Text: {\n const element = node;\n const data = element.data || \"\";\n /*\n * Skip encoding when entities weren't decoded on input, or when\n * inside a raw-text element (script, style, etc.) in HTML mode.\n */\n if ((options.encodeEntities ?? options.decodeEntities) !== false &&\n !(!xmlMode &&\n element.parent &&\n unencodedElements.has(element.parent.name))) {\n // `xmlMode: \"foreign\"` is truthy\n return xmlMode || options.encodeEntities !== \"utf8\"\n ? encodeXML(data)\n : escapeText(data);\n }\n return data;\n }\n }\n}\nfunction renderTag(element, options, xmlMode) {\n if (xmlMode === \"foreign\") {\n // Correct lowercase element names back to their canonical mixed-case form\n element.name = elementNames.get(element.name) ?? element.name;\n // Integration points exit foreign mode: their children are HTML\n if (element.parent &&\n foreignModeIntegrationPoints.has(element.parent.name)) {\n xmlMode = false;\n }\n }\n if (!xmlMode && foreignElements.has(element.name)) {\n xmlMode = \"foreign\";\n }\n const { name, children } = element;\n // Cache the void-element check — used for both self-closing and closing-tag logic\n const isVoid = !xmlMode && voidElements.has(name);\n let tag = `<${name}${formatAttributes(element.attribs, options, xmlMode)}`;\n if (children.length === 0 &&\n (xmlMode\n ? options.selfClosingTags !== false\n : options.selfClosingTags && isVoid)) {\n // XML: `<br/>`, HTML: `<br />`\n tag += xmlMode ? \"/>\" : \" />\";\n }\n else {\n tag += \">\";\n if (children.length > 0) {\n tag += renderChildren(children, options, xmlMode);\n }\n if (!isVoid) {\n tag += `</${name}>`;\n }\n }\n return tag;\n}\n// ── Attribute formatting ─────────────────────────────────────────────\nfunction replaceQuotes(value) {\n return value.replaceAll('\"', \""\");\n}\n/**\n * Serialize an element's attribute map to a string.\n *\n * Returns a string with a leading space before each attribute, or an\n * empty string if there are no attributes. This convention lets the\n * caller unconditionally concatenate the result onto the tag name.\n * @param attributes\n * @param options\n * @param xmlMode\n */\nfunction formatAttributes(attributes, options, xmlMode) {\n if (!attributes)\n return \"\";\n /*\n * Pick the right encoder:\n * - Encoding disabled → only escape double-quotes (for valid attributes)\n * - XML / non-utf8 → full numeric entity encoding (encodeXML)\n * - HTML + utf8 → minimal escaping (escapeAttribute)\n */\n const encode = (options.encodeEntities ?? options.decodeEntities) === false\n ? replaceQuotes\n : xmlMode || options.encodeEntities !== \"utf8\"\n ? encodeXML\n : escapeAttribute;\n const isForeign = xmlMode === \"foreign\";\n const showEmpty = !!(options.emptyAttrs ?? xmlMode);\n let result = \"\";\n for (const key in attributes) {\n if (!Object.hasOwn(attributes, key))\n continue;\n const value = attributes[key];\n const k = isForeign ? (attributeNames.get(key) ?? key) : key;\n result +=\n !showEmpty && (value == null || value === \"\")\n ? ` ${k}`\n : ` ${k}=\"${encode(value == null ? \"\" : String(value))}\"`;\n }\n return result;\n}\n//# sourceMappingURL=index.js.map","import renderHTML from \"dom-serializer\";\nimport { ElementType } from \"domelementtype\";\nimport { hasChildren, isCDATA, isComment, isTag, isText, } from \"domhandler\";\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the outer HTML of.\n * @param options Options for serialization.\n * @returns `node`'s outer HTML.\n */\nexport function getOuterHTML(node, options) {\n return renderHTML(node, options);\n}\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the inner HTML of.\n * @param options Options for serialization.\n * @returns `node`'s inner HTML.\n */\nexport function getInnerHTML(node, options) {\n return hasChildren(node)\n ? node.children.map((node) => getOuterHTML(node, options)).join(\"\")\n : \"\";\n}\n/**\n * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags. Ignores comments.\n *\n * @category Stringify\n * @deprecated Use `textContent` instead.\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n */\nexport function getText(node) {\n if (Array.isArray(node))\n return node.map(getText).join(\"\");\n if (isTag(node))\n return node.name === \"br\" ? \"\\n\" : getText(node.children);\n if (isCDATA(node))\n return getText(node.children);\n if (isText(node))\n return node.data;\n return \"\";\n}\n/**\n * Get a node's text content. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the text content of.\n * @returns `node`'s text content.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}\n */\nexport function textContent(node) {\n if (Array.isArray(node))\n return node.map(textContent).join(\"\");\n if (hasChildren(node) && !isComment(node)) {\n return textContent(node.children);\n }\n if (isText(node))\n return node.data;\n return \"\";\n}\n/**\n * Get a node's inner text, ignoring `<script>` and `<style>` tags. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}\n */\nexport function innerText(node) {\n if (Array.isArray(node))\n return node.map(innerText).join(\"\");\n if (hasChildren(node) && (node.type === ElementType.Tag || isCDATA(node))) {\n return innerText(node.children);\n }\n if (isText(node))\n return node.data;\n return \"\";\n}\n//# sourceMappingURL=stringify.js.map","import { getElementsByTagName } from \"./legacy.js\";\nimport { textContent } from \"./stringify.js\";\n/**\n * Get the feed object from the root of a DOM tree.\n *\n * @category Feeds\n * @param document The DOM to extract the feed from.\n * @returns The feed.\n */\nexport function getFeed(document) {\n const feedRoot = getOneElement(isValidFeed, document);\n return feedRoot\n ? feedRoot.name === \"feed\"\n ? getAtomFeed(feedRoot)\n : getRssFeed(feedRoot)\n : null;\n}\n/**\n * Parse an Atom feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getAtomFeed(feedRoot) {\n const childs = feedRoot.children;\n const feed = {\n type: \"atom\",\n items: getElementsByTagName(\"entry\", childs).map((item) => {\n const { children } = item;\n const entry = { media: getMediaElements(children) };\n addConditionally(entry, \"id\", \"id\", children);\n addConditionally(entry, \"title\", \"title\", children);\n const href = getOneElement(\"link\", children)?.attribs[\"href\"];\n if (href) {\n entry.link = href;\n }\n const description = fetch(\"summary\", children) || fetch(\"content\", children);\n if (description) {\n entry.description = description;\n }\n const pubDate = fetch(\"updated\", children);\n if (pubDate) {\n entry.pubDate = new Date(pubDate);\n }\n return entry;\n }),\n };\n addConditionally(feed, \"id\", \"id\", childs);\n addConditionally(feed, \"title\", \"title\", childs);\n const href = getOneElement(\"link\", childs)?.attribs[\"href\"];\n if (href) {\n feed.link = href;\n }\n addConditionally(feed, \"description\", \"subtitle\", childs);\n const updated = fetch(\"updated\", childs);\n if (updated) {\n feed.updated = new Date(updated);\n }\n addConditionally(feed, \"author\", \"email\", childs, true);\n return feed;\n}\n/**\n * Parse a RSS feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getRssFeed(feedRoot) {\n const childs = getOneElement(\"channel\", feedRoot.children)?.children ?? [];\n const feed = {\n type: feedRoot.name.substr(0, 3),\n id: \"\",\n items: getElementsByTagName(\"item\", feedRoot.children).map((item) => {\n const { children } = item;\n const entry = { media: getMediaElements(children) };\n addConditionally(entry, \"id\", \"guid\", children);\n addConditionally(entry, \"title\", \"title\", children);\n addConditionally(entry, \"link\", \"link\", children);\n addConditionally(entry, \"description\", \"description\", children);\n const pubDate = fetch(\"pubDate\", children) || fetch(\"dc:date\", children);\n if (pubDate)\n entry.pubDate = new Date(pubDate);\n return entry;\n }),\n };\n addConditionally(feed, \"title\", \"title\", childs);\n addConditionally(feed, \"link\", \"link\", childs);\n addConditionally(feed, \"description\", \"description\", childs);\n const updated = fetch(\"lastBuildDate\", childs);\n if (updated) {\n feed.updated = new Date(updated);\n }\n addConditionally(feed, \"author\", \"managingEditor\", childs, true);\n return feed;\n}\nconst MEDIA_KEYS_STRING = [\"url\", \"type\", \"lang\"];\nconst MEDIA_KEYS_INT = [\n \"fileSize\",\n \"bitrate\",\n \"framerate\",\n \"samplingrate\",\n \"channels\",\n \"duration\",\n \"height\",\n \"width\",\n];\n/**\n * Get all media elements of a feed item.\n *\n * @param where Nodes to search in.\n * @returns Media elements.\n */\nfunction getMediaElements(where) {\n return getElementsByTagName(\"media:content\", where).map((element) => {\n const { attribs } = element;\n const media = {\n medium: attribs[\"medium\"],\n isDefault: !!attribs[\"isDefault\"],\n };\n for (const attrib of MEDIA_KEYS_STRING) {\n if (attribs[attrib]) {\n media[attrib] = attribs[attrib];\n }\n }\n for (const attrib of MEDIA_KEYS_INT) {\n if (attribs[attrib]) {\n media[attrib] = Number.parseInt(attribs[attrib], 10);\n }\n }\n if (attribs[\"expression\"]) {\n media.expression = attribs[\"expression\"];\n }\n return media;\n });\n}\n/**\n * Get one element by tag name.\n *\n * @param tagName Tag name to look for\n * @param node Node to search in\n * @returns The element or null\n */\nfunction getOneElement(tagName, node) {\n return getElementsByTagName(tagName, node, true, 1)[0];\n}\n/**\n * Get the text content of an element with a certain tag name.\n *\n * @param tagName Tag name to look for.\n * @param where Node to search in.\n * @param recurse Whether to recurse into child nodes.\n * @returns The text content of the element.\n */\nfunction fetch(tagName, where, recurse = false) {\n return textContent(getElementsByTagName(tagName, where, recurse, 1)).trim();\n}\n/**\n * Adds a property to an object if it has a value.\n *\n * @param object Object to be extended.\n * @param property Property name.\n * @param tagName Tag name that contains the conditionally added property.\n * @param where Element to search for the property.\n * @param recurse Whether to recurse into child nodes.\n */\nfunction addConditionally(object, property, tagName, where, recurse = false) {\n const value = fetch(tagName, where, recurse);\n if (value)\n object[property] = value;\n}\n/**\n * Checks if an element is a feed root node.\n *\n * @param value The name of the element to check.\n * @returns Whether an element is a feed root node.\n */\nfunction isValidFeed(value) {\n return value === \"rss\" || value === \"feed\" || value === \"rdf:RDF\";\n}\n//# sourceMappingURL=feeds.js.map","import { hasChildren } from \"domhandler\";\n/**\n * Given an array of nodes, remove any member that is contained by another\n * member.\n *\n * @category Helpers\n * @param nodes Nodes to filter.\n * @returns Remaining nodes that aren't contained by other nodes.\n */\nexport function removeSubsets(nodes) {\n let index = nodes.length;\n /*\n * Check if each node (or one of its ancestors) is already contained in the\n * array.\n */\n while (--index >= 0) {\n const node = nodes[index];\n /*\n * Remove the node if it is not unique.\n * We are going through the array from the end, so we only\n * have to check nodes that preceed the node under consideration in the array.\n */\n if (index > 0 && nodes.lastIndexOf(node, index - 1) >= 0) {\n nodes.splice(index, 1);\n continue;\n }\n for (let ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n if (nodes.includes(ancestor)) {\n nodes.splice(index, 1);\n break;\n }\n }\n }\n return nodes;\n}\n/**\n * @category Helpers\n * @see {@link http://dom.spec.whatwg.org/#dom-node-comparedocumentposition}\n */\nexport var DocumentPosition;\n(function (DocumentPosition) {\n DocumentPosition[DocumentPosition[\"DISCONNECTED\"] = 1] = \"DISCONNECTED\";\n DocumentPosition[DocumentPosition[\"PRECEDING\"] = 2] = \"PRECEDING\";\n DocumentPosition[DocumentPosition[\"FOLLOWING\"] = 4] = \"FOLLOWING\";\n DocumentPosition[DocumentPosition[\"CONTAINS\"] = 8] = \"CONTAINS\";\n DocumentPosition[DocumentPosition[\"CONTAINED_BY\"] = 16] = \"CONTAINED_BY\";\n})(DocumentPosition || (DocumentPosition = {}));\n/**\n * Compare the position of one node against another node in any other document,\n * returning a bitmask with the values from {@link DocumentPosition}.\n *\n * Document order:\n * > There is an ordering, document order, defined on all the nodes in the\n * > document corresponding to the order in which the first character of the\n * > XML representation of each node occurs in the XML representation of the\n * > document after expansion of general entities. Thus, the document element\n * > node will be the first node. Element nodes occur before their children.\n * > Thus, document order orders element nodes in order of the occurrence of\n * > their start-tag in the XML (after expansion of entities). The attribute\n * > nodes of an element occur after the element and before its children. The\n * > relative order of attribute nodes is implementation-dependent.\n *\n * Source:\n * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n *\n * @category Helpers\n * @param nodeA The first node to use in the comparison\n * @param nodeB The second node to use in the comparison\n * @returns A bitmask describing the input nodes' relative position.\n *\n * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n * a description of these values.\n */\nexport function compareDocumentPosition(nodeA, nodeB) {\n const aParents = [];\n const bParents = [];\n if (nodeA === nodeB) {\n return 0;\n }\n let current = hasChildren(nodeA) ? nodeA : nodeA.parent;\n while (current) {\n aParents.unshift(current);\n current = current.parent;\n }\n current = hasChildren(nodeB) ? nodeB : nodeB.parent;\n while (current) {\n bParents.unshift(current);\n current = current.parent;\n }\n const maxIndex = Math.min(aParents.length, bParents.length);\n let index = 0;\n while (index < maxIndex && aParents[index] === bParents[index]) {\n index++;\n }\n if (index === 0) {\n return DocumentPosition.DISCONNECTED;\n }\n const sharedParent = aParents[index - 1];\n const siblings = sharedParent.children;\n const aSibling = aParents[index];\n const bSibling = bParents[index];\n if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n if (sharedParent === nodeB) {\n return DocumentPosition.FOLLOWING | DocumentPosition.CONTAINED_BY;\n }\n return DocumentPosition.FOLLOWING;\n }\n if (sharedParent === nodeA) {\n return DocumentPosition.PRECEDING | DocumentPosition.CONTAINS;\n }\n return DocumentPosition.PRECEDING;\n}\n/**\n * Sort an array of nodes based on their relative position in the document,\n * removing any duplicate nodes. If the array contains nodes that do not belong\n * to the same document, sort order is unspecified.\n *\n * @category Helpers\n * @param nodes Array of DOM nodes.\n * @returns Collection of unique nodes, sorted in document order.\n */\nexport function uniqueSort(nodes) {\n nodes = nodes.filter((node, index, array) => !array.includes(node, index + 1));\n nodes.sort((a, b) => {\n const relative = compareDocumentPosition(a, b);\n if (relative & DocumentPosition.PRECEDING) {\n return -1;\n }\n if (relative & DocumentPosition.FOLLOWING) {\n return 1;\n }\n return 0;\n });\n return nodes;\n}\n//# sourceMappingURL=helpers.js.map","/**\n * Remove an element from the dom\n *\n * @category Manipulation\n * @param element The element to be removed.\n */\nexport function removeElement(element) {\n if (element.prev)\n element.prev.next = element.next;\n if (element.next)\n element.next.prev = element.prev;\n if (element.parent) {\n const childs = element.parent.children;\n const childsIndex = childs.lastIndexOf(element);\n if (childsIndex !== -1) {\n childs.splice(childsIndex, 1);\n }\n }\n element.next = null;\n element.prev = null;\n element.parent = null;\n}\n/**\n * Replace an element in the dom\n *\n * @category Manipulation\n * @param element The element to be replaced.\n * @param replacement The element to be added\n */\nexport function replaceElement(element, replacement) {\n replacement.prev = element.prev;\n if (replacement.prev) {\n replacement.prev.next = replacement;\n }\n replacement.next = element.next;\n if (replacement.next) {\n replacement.next.prev = replacement;\n }\n replacement.parent = element.parent;\n if (replacement.parent) {\n const { children } = replacement.parent;\n const elementIndex = children.lastIndexOf(element);\n if (elementIndex === -1) {\n return;\n }\n children[elementIndex] = replacement;\n element.parent = null;\n }\n}\n/**\n * Append a child to an element.\n *\n * @category Manipulation\n * @param parent The element to append to.\n * @param child The element to be added as a child.\n */\nexport function appendChild(parent, child) {\n removeElement(child);\n child.next = null;\n child.parent = parent;\n if (parent.children.push(child) > 1) {\n const sibling = parent.children[parent.children.length - 2];\n sibling.next = child;\n child.prev = sibling;\n }\n else {\n child.prev = null;\n }\n}\n/**\n * Append an element after another.\n *\n * @category Manipulation\n * @param element The element to append after.\n * @param next The element be added.\n */\nexport function append(element, next) {\n removeElement(next);\n const { parent } = element;\n const currentNext = element.next;\n next.next = currentNext;\n next.prev = element;\n element.next = next;\n next.parent = parent;\n if (currentNext) {\n currentNext.prev = next;\n if (parent) {\n const childs = parent.children;\n childs.splice(childs.lastIndexOf(currentNext), 0, next);\n }\n }\n else if (parent) {\n parent.children.push(next);\n }\n}\n/**\n * Prepend a child to an element.\n *\n * @category Manipulation\n * @param parent The element to prepend before.\n * @param child The element to be added as a child.\n */\nexport function prependChild(parent, child) {\n removeElement(child);\n child.parent = parent;\n child.prev = null;\n if (parent.children.unshift(child) === 1) {\n child.next = null;\n }\n else {\n const sibling = parent.children[1];\n sibling.prev = child;\n child.next = sibling;\n }\n}\n/**\n * Prepend an element before another.\n *\n * @category Manipulation\n * @param element The element to prepend before.\n * @param previous The element to be added.\n */\nexport function prepend(element, previous) {\n removeElement(previous);\n const { parent } = element;\n if (parent) {\n const childs = parent.children;\n childs.splice(childs.indexOf(element), 0, previous);\n }\n if (element.prev) {\n element.prev.next = previous;\n }\n previous.parent = parent;\n previous.prev = element.prev;\n previous.next = element;\n element.prev = previous;\n}\n//# sourceMappingURL=manipulation.js.map","import { hasChildren, isTag, } from \"domhandler\";\n/**\n * Get a node's children.\n *\n * @category Traversal\n * @param element Node to get the children of.\n * @returns `element`'s children, or an empty array.\n */\nexport function getChildren(element) {\n return hasChildren(element) ? element.children : [];\n}\nexport function getParent(element) {\n return element.parent || null;\n}\n/**\n * Gets an elements siblings, including the element itself.\n *\n * Attempts to get the children through the element's parent first. If we don't\n * have a parent (the element is a root node), we walk the element's `prev` &\n * `next` to get all remaining nodes.\n *\n * @category Traversal\n * @param element Element to get the siblings of.\n * @returns `element`'s siblings, including `element`.\n */\nexport function getSiblings(element) {\n const parent = getParent(element);\n if (parent != null)\n return getChildren(parent);\n const siblings = [element];\n let { prev, next } = element;\n while (prev != null) {\n siblings.unshift(prev);\n ({ prev } = prev);\n }\n while (next != null) {\n siblings.push(next);\n ({ next } = next);\n }\n return siblings;\n}\n/**\n * Gets an attribute from an element.\n *\n * @category Traversal\n * @param element Element to check.\n * @param name Attribute name to retrieve.\n * @returns The element's attribute value, or `undefined`.\n */\nexport function getAttributeValue(element, name) {\n const { attribs } = element;\n return attribs?.[name];\n}\n/**\n * Checks whether an element has an attribute.\n *\n * @category Traversal\n * @param element Element to check.\n * @param name Attribute name to look for.\n * @returns Returns whether `element` has the attribute `name`.\n */\nexport function hasAttrib(element, name) {\n const { attribs } = element;\n return (attribs != null && Object.hasOwn(attribs, name) && attribs[name] != null);\n}\n/**\n * Get the tag name of an element.\n *\n * @category Traversal\n * @param element The element to get the name for.\n * @returns The tag name of `element`.\n */\nexport function getName(element) {\n return element.name;\n}\n/**\n * Returns the next element sibling of a node.\n *\n * @category Traversal\n * @param element The element to get the next sibling of.\n * @returns `element`'s next sibling that is a tag, or `null` if there is no next\n * sibling.\n */\nexport function nextElementSibling(element) {\n let { next } = element;\n while (next !== null && !isTag(next))\n ({ next } = next);\n return next;\n}\n/**\n * Returns the previous element sibling of a node.\n *\n * @category Traversal\n * @param element The element to get the previous sibling of.\n * @returns `element`'s previous sibling that is a tag, or `null` if there is no\n * previous sibling.\n */\n// eslint-disable-next-line unicorn/prevent-abbreviations -- Keep public API name for backwards compatibility.\nexport function prevElementSibling(element) {\n let { prev } = element;\n while (prev !== null && !isTag(prev))\n ({ prev } = prev);\n return prev;\n}\n//# sourceMappingURL=traversal.js.map","import { Parser } from \"./Parser.js\";\nexport { Parser } from \"./Parser.js\";\nimport { DomHandler, } from \"domhandler\";\nexport { DomHandler, \n// Old name for DomHandler\nDomHandler as DefaultHandler, } from \"domhandler\";\n// Helper methods\n/**\n * Parses the data, returns the resulting document.\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n */\nexport function parseDocument(data, options) {\n const handler = new DomHandler(undefined, options);\n new Parser(handler, options).end(data);\n return handler.root;\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n * @param callback A callback that will be called once parsing has been completed, with the resulting document.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nexport function createDocumentStream(callback, options, elementCallback) {\n const handler = new DomHandler((error) => callback(error, handler.root), options, elementCallback);\n return new Parser(handler, options);\n}\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexport * as ElementType from \"domelementtype\";\nexport { default as Tokenizer, QuoteType, } from \"./Tokenizer.js\";\nimport { getFeed } from \"domutils\";\nexport { getFeed } from \"domutils\";\nconst parseFeedDefaultOptions = { xmlMode: true };\n/**\n * Parse a feed.\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nexport function parseFeed(feed, options = parseFeedDefaultOptions) {\n return getFeed(parseDocument(feed, options).children);\n}\nexport * as DomUtils from \"domutils\";\n//# sourceMappingURL=index.js.map","const require_utilities = require(\"./utilities.js\");\nlet domhandler = require(\"domhandler\");\nlet htmlparser2 = require(\"htmlparser2\");\n//#region src/server/html-to-dom.ts\n/**\n* Parses HTML string to DOM nodes in Node.js.\n*\n* This is the same method as `require('htmlparser2').parseDOM`\n*\n* @see https://github.com/fb55/htmlparser2/blob/v9.0.0/src/index.ts#L44-L46\n* @see https://github.com/fb55/domhandler/tree/v5.0.3#readme\n*\n* @param html - HTML markup.\n* @param options - Parser options.\n* @returns - DOM nodes.\n*/\nfunction HTMLDOMParser(html, options) {\n\tif (typeof html !== \"string\") throw new TypeError(\"First argument must be a string.\");\n\tif (!html) return [];\n\tconst handler = new domhandler.DomHandler(void 0, options);\n\tnew htmlparser2.Parser(handler, options).end(html);\n\treturn require_utilities.unsetRootParent(handler.dom);\n}\n//#endregion\nexports.default = HTMLDOMParser;\n\n//# sourceMappingURL=html-to-dom.js.map","//#region src/server/utilities.ts\n/**\n* Sets root parent to null.\n*\n* @param nodes - Nodes.\n* @returns - Nodes.\n*/\nfunction unsetRootParent(nodes) {\n\tlet index = 0;\n\tconst nodesLength = nodes.length;\n\tfor (; index < nodesLength; index++) {\n\t\tconst node = nodes[index];\n\t\tnode.parent = null;\n\t}\n\treturn nodes;\n}\n//#endregion\nexports.unsetRootParent = unsetRootParent;\n\n//# sourceMappingURL=utilities.js.map","// An attribute in which the DOM/SVG standard name is the same as the React prop name (e.g., 'accept').\nvar SAME = 0;\nexports.SAME = SAME;\n\n// An attribute in which the React prop name is the camelcased version of the DOM/SVG standard name (e.g., 'acceptCharset').\nvar CAMELCASE = 1;\nexports.CAMELCASE = CAMELCASE;\n\nexports.possibleStandardNames = {\n accept: 0,\n acceptCharset: 1,\n 'accept-charset': 'acceptCharset',\n accessKey: 1,\n action: 0,\n allowFullScreen: 1,\n alt: 0,\n as: 0,\n async: 0,\n autoCapitalize: 1,\n autoComplete: 1,\n autoCorrect: 1,\n autoFocus: 1,\n autoPlay: 1,\n autoSave: 1,\n capture: 0,\n cellPadding: 1,\n cellSpacing: 1,\n challenge: 0,\n charSet: 1,\n checked: 0,\n children: 0,\n cite: 0,\n class: 'className',\n classID: 1,\n className: 1,\n cols: 0,\n colSpan: 1,\n content: 0,\n contentEditable: 1,\n contextMenu: 1,\n controls: 0,\n controlsList: 1,\n coords: 0,\n crossOrigin: 1,\n dangerouslySetInnerHTML: 1,\n data: 0,\n dateTime: 1,\n default: 0,\n defaultChecked: 1,\n defaultValue: 1,\n defer: 0,\n dir: 0,\n disabled: 0,\n disablePictureInPicture: 1,\n disableRemotePlayback: 1,\n download: 0,\n draggable: 0,\n encType: 1,\n enterKeyHint: 1,\n for: 'htmlFor',\n form: 0,\n formMethod: 1,\n formAction: 1,\n formEncType: 1,\n formNoValidate: 1,\n formTarget: 1,\n frameBorder: 1,\n headers: 0,\n height: 0,\n hidden: 0,\n high: 0,\n href: 0,\n hrefLang: 1,\n htmlFor: 1,\n httpEquiv: 1,\n 'http-equiv': 'httpEquiv',\n icon: 0,\n id: 0,\n innerHTML: 1,\n inputMode: 1,\n integrity: 0,\n is: 0,\n itemID: 1,\n itemProp: 1,\n itemRef: 1,\n itemScope: 1,\n itemType: 1,\n keyParams: 1,\n keyType: 1,\n kind: 0,\n label: 0,\n lang: 0,\n list: 0,\n loop: 0,\n low: 0,\n manifest: 0,\n marginWidth: 1,\n marginHeight: 1,\n max: 0,\n maxLength: 1,\n media: 0,\n mediaGroup: 1,\n method: 0,\n min: 0,\n minLength: 1,\n multiple: 0,\n muted: 0,\n name: 0,\n noModule: 1,\n nonce: 0,\n noValidate: 1,\n open: 0,\n optimum: 0,\n pattern: 0,\n placeholder: 0,\n playsInline: 1,\n poster: 0,\n preload: 0,\n profile: 0,\n radioGroup: 1,\n readOnly: 1,\n referrerPolicy: 1,\n rel: 0,\n required: 0,\n reversed: 0,\n role: 0,\n rows: 0,\n rowSpan: 1,\n sandbox: 0,\n scope: 0,\n scoped: 0,\n scrolling: 0,\n seamless: 0,\n selected: 0,\n shape: 0,\n size: 0,\n sizes: 0,\n span: 0,\n spellCheck: 1,\n src: 0,\n srcDoc: 1,\n srcLang: 1,\n srcSet: 1,\n start: 0,\n step: 0,\n style: 0,\n summary: 0,\n tabIndex: 1,\n target: 0,\n title: 0,\n type: 0,\n useMap: 1,\n value: 0,\n width: 0,\n wmode: 0,\n wrap: 0,\n about: 0,\n accentHeight: 1,\n 'accent-height': 'accentHeight',\n accumulate: 0,\n additive: 0,\n alignmentBaseline: 1,\n 'alignment-baseline': 'alignmentBaseline',\n allowReorder: 1,\n alphabetic: 0,\n amplitude: 0,\n arabicForm: 1,\n 'arabic-form': 'arabicForm',\n ascent: 0,\n attributeName: 1,\n attributeType: 1,\n autoReverse: 1,\n azimuth: 0,\n baseFrequency: 1,\n baselineShift: 1,\n 'baseline-shift': 'baselineShift',\n baseProfile: 1,\n bbox: 0,\n begin: 0,\n bias: 0,\n by: 0,\n calcMode: 1,\n capHeight: 1,\n 'cap-height': 'capHeight',\n clip: 0,\n clipPath: 1,\n 'clip-path': 'clipPath',\n clipPathUnits: 1,\n clipRule: 1,\n 'clip-rule': 'clipRule',\n color: 0,\n colorInterpolation: 1,\n 'color-interpolation': 'colorInterpolation',\n colorInterpolationFilters: 1,\n 'color-interpolation-filters': 'colorInterpolationFilters',\n colorProfile: 1,\n 'color-profile': 'colorProfile',\n colorRendering: 1,\n 'color-rendering': 'colorRendering',\n contentScriptType: 1,\n contentStyleType: 1,\n cursor: 0,\n cx: 0,\n cy: 0,\n d: 0,\n datatype: 0,\n decelerate: 0,\n descent: 0,\n diffuseConstant: 1,\n direction: 0,\n display: 0,\n divisor: 0,\n dominantBaseline: 1,\n 'dominant-baseline': 'dominantBaseline',\n dur: 0,\n dx: 0,\n dy: 0,\n edgeMode: 1,\n elevation: 0,\n enableBackground: 1,\n 'enable-background': 'enableBackground',\n end: 0,\n exponent: 0,\n externalResourcesRequired: 1,\n fill: 0,\n fillOpacity: 1,\n 'fill-opacity': 'fillOpacity',\n fillRule: 1,\n 'fill-rule': 'fillRule',\n filter: 0,\n filterRes: 1,\n filterUnits: 1,\n floodOpacity: 1,\n 'flood-opacity': 'floodOpacity',\n floodColor: 1,\n 'flood-color': 'floodColor',\n focusable: 0,\n fontFamily: 1,\n 'font-family': 'fontFamily',\n fontSize: 1,\n 'font-size': 'fontSize',\n fontSizeAdjust: 1,\n 'font-size-adjust': 'fontSizeAdjust',\n fontStretch: 1,\n 'font-stretch': 'fontStretch',\n fontStyle: 1,\n 'font-style': 'fontStyle',\n fontVariant: 1,\n 'font-variant': 'fontVariant',\n fontWeight: 1,\n 'font-weight': 'fontWeight',\n format: 0,\n from: 0,\n fx: 0,\n fy: 0,\n g1: 0,\n g2: 0,\n glyphName: 1,\n 'glyph-name': 'glyphName',\n glyphOrientationHorizontal: 1,\n 'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n glyphOrientationVertical: 1,\n 'glyph-orientation-vertical': 'glyphOrientationVertical',\n glyphRef: 1,\n gradientTransform: 1,\n gradientUnits: 1,\n hanging: 0,\n horizAdvX: 1,\n 'horiz-adv-x': 'horizAdvX',\n horizOriginX: 1,\n 'horiz-origin-x': 'horizOriginX',\n ideographic: 0,\n imageRendering: 1,\n 'image-rendering': 'imageRendering',\n in2: 0,\n in: 0,\n inlist: 0,\n intercept: 0,\n k1: 0,\n k2: 0,\n k3: 0,\n k4: 0,\n k: 0,\n kernelMatrix: 1,\n kernelUnitLength: 1,\n kerning: 0,\n keyPoints: 1,\n keySplines: 1,\n keyTimes: 1,\n lengthAdjust: 1,\n letterSpacing: 1,\n 'letter-spacing': 'letterSpacing',\n lightingColor: 1,\n 'lighting-color': 'lightingColor',\n limitingConeAngle: 1,\n local: 0,\n markerEnd: 1,\n 'marker-end': 'markerEnd',\n markerHeight: 1,\n markerMid: 1,\n 'marker-mid': 'markerMid',\n markerStart: 1,\n 'marker-start': 'markerStart',\n markerUnits: 1,\n markerWidth: 1,\n mask: 0,\n maskContentUnits: 1,\n maskUnits: 1,\n mathematical: 0,\n mode: 0,\n numOctaves: 1,\n offset: 0,\n opacity: 0,\n operator: 0,\n order: 0,\n orient: 0,\n orientation: 0,\n origin: 0,\n overflow: 0,\n overlinePosition: 1,\n 'overline-position': 'overlinePosition',\n overlineThickness: 1,\n 'overline-thickness': 'overlineThickness',\n paintOrder: 1,\n 'paint-order': 'paintOrder',\n panose1: 0,\n 'panose-1': 'panose1',\n pathLength: 1,\n patternContentUnits: 1,\n patternTransform: 1,\n patternUnits: 1,\n pointerEvents: 1,\n 'pointer-events': 'pointerEvents',\n points: 0,\n pointsAtX: 1,\n pointsAtY: 1,\n pointsAtZ: 1,\n prefix: 0,\n preserveAlpha: 1,\n preserveAspectRatio: 1,\n primitiveUnits: 1,\n property: 0,\n r: 0,\n radius: 0,\n refX: 1,\n refY: 1,\n renderingIntent: 1,\n 'rendering-intent': 'renderingIntent',\n repeatCount: 1,\n repeatDur: 1,\n requiredExtensions: 1,\n requiredFeatures: 1,\n resource: 0,\n restart: 0,\n result: 0,\n results: 0,\n rotate: 0,\n rx: 0,\n ry: 0,\n scale: 0,\n security: 0,\n seed: 0,\n shapeRendering: 1,\n 'shape-rendering': 'shapeRendering',\n slope: 0,\n spacing: 0,\n specularConstant: 1,\n specularExponent: 1,\n speed: 0,\n spreadMethod: 1,\n startOffset: 1,\n stdDeviation: 1,\n stemh: 0,\n stemv: 0,\n stitchTiles: 1,\n stopColor: 1,\n 'stop-color': 'stopColor',\n stopOpacity: 1,\n 'stop-opacity': 'stopOpacity',\n strikethroughPosition: 1,\n 'strikethrough-position': 'strikethroughPosition',\n strikethroughThickness: 1,\n 'strikethrough-thickness': 'strikethroughThickness',\n string: 0,\n stroke: 0,\n strokeDasharray: 1,\n 'stroke-dasharray': 'strokeDasharray',\n strokeDashoffset: 1,\n 'stroke-dashoffset': 'strokeDashoffset',\n strokeLinecap: 1,\n 'stroke-linecap': 'strokeLinecap',\n strokeLinejoin: 1,\n 'stroke-linejoin': 'strokeLinejoin',\n strokeMiterlimit: 1,\n 'stroke-miterlimit': 'strokeMiterlimit',\n strokeWidth: 1,\n 'stroke-width': 'strokeWidth',\n strokeOpacity: 1,\n 'stroke-opacity': 'strokeOpacity',\n suppressContentEditableWarning: 1,\n suppressHydrationWarning: 1,\n surfaceScale: 1,\n systemLanguage: 1,\n tableValues: 1,\n targetX: 1,\n targetY: 1,\n textAnchor: 1,\n 'text-anchor': 'textAnchor',\n textDecoration: 1,\n 'text-decoration': 'textDecoration',\n textLength: 1,\n textRendering: 1,\n 'text-rendering': 'textRendering',\n to: 0,\n transform: 0,\n typeof: 0,\n u1: 0,\n u2: 0,\n underlinePosition: 1,\n 'underline-position': 'underlinePosition',\n underlineThickness: 1,\n 'underline-thickness': 'underlineThickness',\n unicode: 0,\n unicodeBidi: 1,\n 'unicode-bidi': 'unicodeBidi',\n unicodeRange: 1,\n 'unicode-range': 'unicodeRange',\n unitsPerEm: 1,\n 'units-per-em': 'unitsPerEm',\n unselectable: 0,\n vAlphabetic: 1,\n 'v-alphabetic': 'vAlphabetic',\n values: 0,\n vectorEffect: 1,\n 'vector-effect': 'vectorEffect',\n version: 0,\n vertAdvY: 1,\n 'vert-adv-y': 'vertAdvY',\n vertOriginX: 1,\n 'vert-origin-x': 'vertOriginX',\n vertOriginY: 1,\n 'vert-origin-y': 'vertOriginY',\n vHanging: 1,\n 'v-hanging': 'vHanging',\n vIdeographic: 1,\n 'v-ideographic': 'vIdeographic',\n viewBox: 1,\n viewTarget: 1,\n visibility: 0,\n vMathematical: 1,\n 'v-mathematical': 'vMathematical',\n vocab: 0,\n widths: 0,\n wordSpacing: 1,\n 'word-spacing': 'wordSpacing',\n writingMode: 1,\n 'writing-mode': 'writingMode',\n x1: 0,\n x2: 0,\n x: 0,\n xChannelSelector: 1,\n xHeight: 1,\n 'x-height': 'xHeight',\n xlinkActuate: 1,\n 'xlink:actuate': 'xlinkActuate',\n xlinkArcrole: 1,\n 'xlink:arcrole': 'xlinkArcrole',\n xlinkHref: 1,\n 'xlink:href': 'xlinkHref',\n xlinkRole: 1,\n 'xlink:role': 'xlinkRole',\n xlinkShow: 1,\n 'xlink:show': 'xlinkShow',\n xlinkTitle: 1,\n 'xlink:title': 'xlinkTitle',\n xlinkType: 1,\n 'xlink:type': 'xlinkType',\n xmlBase: 1,\n 'xml:base': 'xmlBase',\n xmlLang: 1,\n 'xml:lang': 'xmlLang',\n xmlns: 0,\n 'xml:space': 'xmlSpace',\n xmlnsXlink: 1,\n 'xmlns:xlink': 'xmlnsXlink',\n xmlSpace: 1,\n y1: 0,\n y2: 0,\n y: 0,\n yChannelSelector: 1,\n z: 0,\n zoomAndPan: 1\n};\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = StyleToObject;\nconst inline_style_parser_1 = __importDefault(require(\"inline-style-parser\"));\n/**\n * Parses inline style to object.\n *\n * @param style - Inline style.\n * @param iterator - Iterator.\n * @returns - Style object or null.\n *\n * @example Parsing inline style to object:\n *\n * ```js\n * import parse from 'style-to-object';\n * parse('line-height: 42;'); // { 'line-height': '42' }\n * ```\n */\nfunction StyleToObject(style, iterator) {\n let styleObject = null;\n if (!style || typeof style !== 'string') {\n return styleObject;\n }\n const declarations = (0, inline_style_parser_1.default)(style);\n const hasIterator = typeof iterator === 'function';\n declarations.forEach((declaration) => {\n if (declaration.type !== 'declaration') {\n return;\n }\n const { property, value } = declaration;\n if (hasIterator) {\n iterator(property, value, declaration);\n }\n else if (value) {\n styleObject = styleObject || {};\n styleObject[property] = value;\n }\n });\n return styleObject;\n}\n//# sourceMappingURL=index.js.map","'use strict';\n\n// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nvar COMMENT_REGEX = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nvar NEWLINE_REGEX = /\\n/g;\nvar WHITESPACE_REGEX = /^\\s*/;\n\n// declaration\nvar PROPERTY_REGEX = /^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/;\nvar COLON_REGEX = /^:\\s*/;\nvar VALUE_REGEX = /^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};])+)/;\nvar SEMICOLON_REGEX = /^[;\\s]*/;\n\n// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill\nvar TRIM_REGEX = /^\\s+|\\s+$/g;\n\n// strings\nvar NEWLINE = '\\n';\nvar FORWARD_SLASH = '/';\nvar ASTERISK = '*';\nvar EMPTY_STRING = '';\n\n// types\nvar TYPE_COMMENT = 'comment';\nvar TYPE_DECLARATION = 'declaration';\n\n/**\n * @param {String} style\n * @param {Object} [options]\n * @return {Object[]}\n * @throws {TypeError}\n * @throws {Error}\n */\nfunction index (style, options) {\n if (typeof style !== 'string') {\n throw new TypeError('First argument must be a string');\n }\n\n if (!style) return [];\n\n options = options || {};\n\n /**\n * Positional.\n */\n var lineno = 1;\n var column = 1;\n\n /**\n * Update lineno and column based on `str`.\n *\n * @param {String} str\n */\n function updatePosition(str) {\n var lines = str.match(NEWLINE_REGEX);\n if (lines) lineno += lines.length;\n var i = str.lastIndexOf(NEWLINE);\n column = ~i ? str.length - i : column + str.length;\n }\n\n /**\n * Mark position and patch `node.position`.\n *\n * @return {Function}\n */\n function position() {\n var start = { line: lineno, column: column };\n return function (node) {\n node.position = new Position(start);\n whitespace();\n return node;\n };\n }\n\n /**\n * Store position information for a node.\n *\n * @constructor\n * @property {Object} start\n * @property {Object} end\n * @property {undefined|String} source\n */\n function Position(start) {\n this.start = start;\n this.end = { line: lineno, column: column };\n this.source = options.source;\n }\n\n /**\n * Non-enumerable source string.\n */\n Position.prototype.content = style;\n\n /**\n * Error `msg`.\n *\n * @param {String} msg\n * @throws {Error}\n */\n function error(msg) {\n var err = new Error(\n options.source + ':' + lineno + ':' + column + ': ' + msg\n );\n err.reason = msg;\n err.filename = options.source;\n err.line = lineno;\n err.column = column;\n err.source = style;\n\n if (options.silent) ; else {\n throw err;\n }\n }\n\n /**\n * Match `re` and return captures.\n *\n * @param {RegExp} re\n * @return {undefined|Array}\n */\n function match(re) {\n var m = re.exec(style);\n if (!m) return;\n var str = m[0];\n updatePosition(str);\n style = style.slice(str.length);\n return m;\n }\n\n /**\n * Parse whitespace.\n */\n function whitespace() {\n match(WHITESPACE_REGEX);\n }\n\n /**\n * Parse comments.\n *\n * @param {Object[]} [rules]\n * @return {Object[]}\n */\n function comments(rules) {\n var c;\n rules = rules || [];\n while ((c = comment())) {\n if (c !== false) {\n rules.push(c);\n }\n }\n return rules;\n }\n\n /**\n * Parse comment.\n *\n * @return {Object}\n * @throws {Error}\n */\n function comment() {\n var pos = position();\n if (FORWARD_SLASH != style.charAt(0) || ASTERISK != style.charAt(1)) return;\n\n var i = 2;\n while (\n EMPTY_STRING != style.charAt(i) &&\n (ASTERISK != style.charAt(i) || FORWARD_SLASH != style.charAt(i + 1))\n ) {\n ++i;\n }\n i += 2;\n\n if (EMPTY_STRING === style.charAt(i - 1)) {\n return error('End of comment missing');\n }\n\n var str = style.slice(2, i - 2);\n column += 2;\n updatePosition(str);\n style = style.slice(i);\n column += 2;\n\n return pos({\n type: TYPE_COMMENT,\n comment: str\n });\n }\n\n /**\n * Parse declaration.\n *\n * @return {Object}\n * @throws {Error}\n */\n function declaration() {\n var pos = position();\n\n // prop\n var prop = match(PROPERTY_REGEX);\n if (!prop) return;\n comment();\n\n // :\n if (!match(COLON_REGEX)) return error(\"property missing ':'\");\n\n // val\n var val = match(VALUE_REGEX);\n\n var ret = pos({\n type: TYPE_DECLARATION,\n property: trim(prop[0].replace(COMMENT_REGEX, EMPTY_STRING)),\n value: val\n ? trim(val[0].replace(COMMENT_REGEX, EMPTY_STRING))\n : EMPTY_STRING\n });\n\n // ;\n match(SEMICOLON_REGEX);\n\n return ret;\n }\n\n /**\n * Parse declarations.\n *\n * @return {Object[]}\n */\n function declarations() {\n var decls = [];\n\n comments(decls);\n\n // declarations\n var decl;\n while ((decl = declaration())) {\n if (decl !== false) {\n decls.push(decl);\n comments(decls);\n }\n }\n\n return decls;\n }\n\n whitespace();\n return declarations();\n}\n\n/**\n * Trim `str`.\n *\n * @param {String} str\n * @return {String}\n */\nfunction trim(str) {\n return str ? str.replace(TRIM_REGEX, EMPTY_STRING) : EMPTY_STRING;\n}\n\nmodule.exports = index;\n//# sourceMappingURL=index.js.map\n","//#region \\0rolldown/runtime.js\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __copyProps = (to, from, except, desc) => {\n\tif (from && typeof from === \"object\" || typeof from === \"function\") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {\n\t\tkey = keys[i];\n\t\tif (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n\t\t\tget: ((k) => from[k]).bind(null, key),\n\t\t\tenumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n\t\t});\n\t}\n\treturn to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n\tvalue: mod,\n\tenumerable: true\n}) : target, mod));\n//#endregion\nlet style_to_object = require(\"style-to-object\");\nstyle_to_object = __toESM(style_to_object);\n//#region src/utilities.ts\nconst CUSTOM_PROPERTY_REGEX = /^--[a-zA-Z0-9_-]+$/;\nconst HYPHEN_REGEX = /-([a-z])/g;\nconst NO_HYPHEN_REGEX = /^[^-]+$/;\nconst VENDOR_PREFIX_REGEX = /^-(webkit|moz|ms|o|khtml)-/;\nconst MS_VENDOR_PREFIX_REGEX = /^-(ms)-/;\n/**\n* Checks whether to skip camelCase.\n*/\nconst skipCamelCase = (property) => !property || NO_HYPHEN_REGEX.test(property) || CUSTOM_PROPERTY_REGEX.test(property);\n/**\n* Replacer that capitalizes first character.\n*/\nconst capitalize = (match, character) => character.toUpperCase();\n/**\n* Replacer that removes beginning hyphen of vendor prefix property.\n*/\nconst trimHyphen = (match, prefix) => `${prefix}-`;\n/**\n* CamelCases a CSS property.\n*/\nconst camelCase = (property, options = {}) => {\n\tif (skipCamelCase(property)) return property;\n\tproperty = property.toLowerCase();\n\tif (options.reactCompat) property = property.replace(MS_VENDOR_PREFIX_REGEX, trimHyphen);\n\telse property = property.replace(VENDOR_PREFIX_REGEX, trimHyphen);\n\treturn property.replace(HYPHEN_REGEX, capitalize);\n};\n//#endregion\n//#region src/index.ts\n/**\n* Parses CSS inline style to JavaScript object (camelCased).\n*/\nfunction StyleToJS(style, options) {\n\tconst output = {};\n\tif (!style || typeof style !== \"string\") return output;\n\t(0, style_to_object.default)(style, (property, value) => {\n\t\tif (property && value) output[camelCase(property, options)] = value;\n\t});\n\treturn output;\n}\n//#endregion\nmodule.exports = StyleToJS;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.returnFirstArg = exports.canTextBeChildOfNode = exports.ELEMENTS_WITH_NO_TEXT_CHILDREN = exports.PRESERVE_CUSTOM_ATTRIBUTES = void 0;\nexports.isCustomComponent = isCustomComponent;\nexports.setStyleProp = setStyleProp;\nconst react_1 = require(\"react\");\nconst style_to_js_1 = __importDefault(require(\"style-to-js\"));\nconst RESERVED_SVG_MATHML_ELEMENTS = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n]);\n/**\n * Check if a tag is a custom component.\n *\n * @see {@link https://github.com/facebook/react/blob/v16.6.3/packages/react-dom/src/shared/isCustomComponent.js}\n *\n * @param tagName - Tag name.\n * @param props - Props passed to the element.\n * @returns - Whether the tag is custom component.\n */\nfunction isCustomComponent(tagName, props) {\n if (!tagName.includes('-')) {\n return Boolean(props && typeof props.is === 'string');\n }\n // These are reserved SVG and MathML elements.\n // We don't mind this whitelist too much because we expect it to never grow.\n // The alternative is to track the namespace in a few places which is convoluted.\n // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n if (RESERVED_SVG_MATHML_ELEMENTS.has(tagName)) {\n return false;\n }\n return true;\n}\nconst styleOptions = {\n reactCompat: true,\n};\n/**\n * Sets style prop.\n *\n * @param style - Inline style.\n * @param props - Props object.\n */\nfunction setStyleProp(style, props) {\n if (typeof style !== 'string') {\n return;\n }\n if (!style.trim()) {\n props.style = {};\n return;\n }\n try {\n props.style = (0, style_to_js_1.default)(style, styleOptions);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n }\n catch (error) {\n props.style = {};\n }\n}\n/**\n * @see https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html\n */\nexports.PRESERVE_CUSTOM_ATTRIBUTES = Number(react_1.version.split('.')[0]) >= 16;\n/**\n * @see https://github.com/facebook/react/blob/cae635054e17a6f107a39d328649137b83f25972/packages/react-dom/src/client/validateDOMNesting.js#L213\n */\nexports.ELEMENTS_WITH_NO_TEXT_CHILDREN = new Set([\n 'tr',\n 'tbody',\n 'thead',\n 'tfoot',\n 'colgroup',\n 'table',\n 'head',\n 'html',\n 'frameset',\n]);\n/**\n * Checks if the given node can contain text nodes\n *\n * @param node - Element node.\n * @returns - Whether the node can contain text nodes.\n */\nconst canTextBeChildOfNode = (node) => !exports.ELEMENTS_WITH_NO_TEXT_CHILDREN.has(node.name);\nexports.canTextBeChildOfNode = canTextBeChildOfNode;\n/**\n * Returns the first argument as is.\n *\n * @param arg - The argument to be returned.\n * @returns - The input argument `arg`.\n */\nconst returnFirstArg = (arg) => arg;\nexports.returnFirstArg = returnFirstArg;\n//# sourceMappingURL=utilities.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = attributesToProps;\nconst react_property_1 = require(\"react-property\");\nconst utilities_1 = require(\"./utilities\");\n// https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components\n// https://developer.mozilla.org/docs/Web/HTML/Attributes\nconst UNCONTROLLED_COMPONENT_ATTRIBUTES = ['checked', 'value'];\nconst UNCONTROLLED_COMPONENT_NAMES = ['input', 'select', 'textarea'];\nconst valueOnlyInputs = {\n reset: true,\n submit: true,\n};\n/**\n * Converts HTML/SVG DOM attributes to React props.\n *\n * @param attributes - HTML/SVG DOM attributes.\n * @param nodeName - DOM node name.\n * @returns - React props.\n */\nfunction attributesToProps(attributes = {}, nodeName) {\n const props = {};\n const isInputValueOnly = Boolean(attributes.type && valueOnlyInputs[attributes.type]);\n for (const attributeName in attributes) {\n const attributeValue = attributes[attributeName];\n // ARIA (aria-*) or custom data (data-*) attribute\n if ((0, react_property_1.isCustomAttribute)(attributeName)) {\n props[attributeName] = attributeValue;\n continue;\n }\n // convert HTML/SVG attribute to React prop\n const attributeNameLowerCased = attributeName.toLowerCase();\n let propName = getPropName(attributeNameLowerCased);\n if (propName) {\n const propertyInfo = (0, react_property_1.getPropertyInfo)(propName);\n // convert attribute to uncontrolled component prop (e.g., `value` to `defaultValue`)\n if (UNCONTROLLED_COMPONENT_ATTRIBUTES.includes(propName) &&\n UNCONTROLLED_COMPONENT_NAMES.includes(nodeName) &&\n !isInputValueOnly) {\n propName = getPropName('default' + attributeNameLowerCased);\n }\n props[propName] = attributeValue;\n switch (propertyInfo === null || propertyInfo === void 0 ? void 0 : propertyInfo.type) {\n case react_property_1.BOOLEAN:\n props[propName] = true;\n break;\n case react_property_1.OVERLOADED_BOOLEAN:\n if (attributeValue === '') {\n props[propName] = true;\n }\n break;\n }\n continue;\n }\n // preserve custom attribute if React >=16\n if (utilities_1.PRESERVE_CUSTOM_ATTRIBUTES) {\n props[attributeName] = attributeValue;\n }\n }\n // transform inline style to object\n (0, utilities_1.setStyleProp)(attributes.style, props);\n return props;\n}\n/**\n * Gets prop name from lowercased attribute name.\n *\n * @param attributeName - Lowercased attribute name.\n * @returns - Prop name.\n */\nfunction getPropName(attributeName) {\n return react_property_1.possibleStandardNames[attributeName];\n}\n//# sourceMappingURL=attributes-to-props.js.map","'use strict';\n\n/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n\n\n\n// A reserved attribute.\n// It is handled by React separately and shouldn't be written to the DOM.\nconst RESERVED = 0;\n\n// A simple string attribute.\n// Attributes that aren't in the filter are presumed to have this type.\nconst STRING = 1;\n\n// A string attribute that accepts booleans in React. In HTML, these are called\n// \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n// When true, it should be set to a \"true\" string.\n// When false, it should be set to a \"false\" string.\nconst BOOLEANISH_STRING = 2;\n\n// A real boolean attribute.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\nconst BOOLEAN = 3;\n\n// An attribute that can be used as a flag as well as with a value.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n// For any other value, should be present with that value.\nconst OVERLOADED_BOOLEAN = 4;\n\n// An attribute that must be numeric or parse as a numeric.\n// When falsy, it should be removed.\nconst NUMERIC = 5;\n\n// An attribute that must be positive numeric or parse as a positive numeric.\n// When falsy, it should be removed.\nconst POSITIVE_NUMERIC = 6;\n\nfunction getPropertyInfo(name) {\n return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction PropertyInfoRecord(\n name,\n type,\n mustUseProperty,\n attributeName,\n attributeNamespace,\n sanitizeURL,\n removeEmptyString,\n) {\n this.acceptsBooleans =\n type === BOOLEANISH_STRING ||\n type === BOOLEAN ||\n type === OVERLOADED_BOOLEAN;\n this.attributeName = attributeName;\n this.attributeNamespace = attributeNamespace;\n this.mustUseProperty = mustUseProperty;\n this.propertyName = name;\n this.type = type;\n this.sanitizeURL = sanitizeURL;\n this.removeEmptyString = removeEmptyString;\n}\n\n// When adding attributes to this list, be sure to also add them to\n// the `possibleStandardNames` module to ensure casing and incorrect\n// name warnings.\nconst properties = {};\n\n// These props are reserved by React. They shouldn't be written to the DOM.\nconst reservedProps = [\n 'children',\n 'dangerouslySetInnerHTML',\n // TODO: This prevents the assignment of defaultValue to regular\n // elements (not just inputs). Now that ReactDOMInput assigns to the\n // defaultValue property -- do we need this?\n 'defaultValue',\n 'defaultChecked',\n 'innerHTML',\n 'suppressContentEditableWarning',\n 'suppressHydrationWarning',\n 'style',\n];\n\nreservedProps.forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n RESERVED,\n false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// A few React string attributes have a different name.\n// This is a mapping from React prop names to the attribute names.\n[\n ['acceptCharset', 'accept-charset'],\n ['className', 'class'],\n ['htmlFor', 'for'],\n ['httpEquiv', 'http-equiv'],\n].forEach(([name, attributeName]) => {\n properties[name] = new PropertyInfoRecord(\n name,\n STRING,\n false, // mustUseProperty\n attributeName, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n BOOLEANISH_STRING,\n false, // mustUseProperty\n name.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n// Since these are SVG attributes, their attribute names are case-sensitive.\n[\n 'autoReverse',\n 'externalResourcesRequired',\n 'focusable',\n 'preserveAlpha',\n].forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n BOOLEANISH_STRING,\n false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These are HTML boolean attributes.\n[\n 'allowFullScreen',\n 'async',\n // Note: there is a special case that prevents it from being written to the DOM\n // on the client side because the browsers are inconsistent. Instead we call focus().\n 'autoFocus',\n 'autoPlay',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'disablePictureInPicture',\n 'disableRemotePlayback',\n 'formNoValidate',\n 'hidden',\n 'loop',\n 'noModule',\n 'noValidate',\n 'open',\n 'playsInline',\n 'readOnly',\n 'required',\n 'reversed',\n 'scoped',\n 'seamless',\n // Microdata\n 'itemScope',\n].forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n BOOLEAN,\n false, // mustUseProperty\n name.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These are the few React props that we set as DOM properties\n// rather than attributes. These are all booleans.\n[\n 'checked',\n // Note: `option.selected` is not updated if `select.multiple` is\n // disabled with `removeAttribute`. We have special logic for handling this.\n 'multiple',\n 'muted',\n 'selected',\n\n // NOTE: if you add a camelCased prop to this list,\n // you'll need to set attributeName to name.toLowerCase()\n // instead in the assignment below.\n].forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n BOOLEAN,\n true, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These are HTML attributes that are \"overloaded booleans\": they behave like\n// booleans, but can also accept a string value.\n[\n 'capture',\n 'download',\n\n // NOTE: if you add a camelCased prop to this list,\n // you'll need to set attributeName to name.toLowerCase()\n // instead in the assignment below.\n].forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n OVERLOADED_BOOLEAN,\n false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These are HTML attributes that must be positive numbers.\n[\n 'cols',\n 'rows',\n 'size',\n 'span',\n\n // NOTE: if you add a camelCased prop to this list,\n // you'll need to set attributeName to name.toLowerCase()\n // instead in the assignment below.\n].forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n POSITIVE_NUMERIC,\n false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These are HTML attributes that must be numbers.\n['rowSpan', 'start'].forEach(name => {\n properties[name] = new PropertyInfoRecord(\n name,\n NUMERIC,\n false, // mustUseProperty\n name.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\nconst CAMELIZE = /[\\-\\:]([a-z])/g;\nconst capitalize = token => token[1].toUpperCase();\n\n// This is a list of all SVG attributes that need special casing, namespacing,\n// or boolean value assignment. Regular attributes that just accept strings\n// and have the same names are omitted, just like in the HTML attribute filter.\n// Some of these attributes can be hard to find. This list was created by\n// scraping the MDN documentation.\n[\n 'accent-height',\n 'alignment-baseline',\n 'arabic-form',\n 'baseline-shift',\n 'cap-height',\n 'clip-path',\n 'clip-rule',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'dominant-baseline',\n 'enable-background',\n 'fill-opacity',\n 'fill-rule',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'glyph-name',\n 'glyph-orientation-horizontal',\n 'glyph-orientation-vertical',\n 'horiz-adv-x',\n 'horiz-origin-x',\n 'image-rendering',\n 'letter-spacing',\n 'lighting-color',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'overline-position',\n 'overline-thickness',\n 'paint-order',\n 'panose-1',\n 'pointer-events',\n 'rendering-intent',\n 'shape-rendering',\n 'stop-color',\n 'stop-opacity',\n 'strikethrough-position',\n 'strikethrough-thickness',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'underline-position',\n 'underline-thickness',\n 'unicode-bidi',\n 'unicode-range',\n 'units-per-em',\n 'v-alphabetic',\n 'v-hanging',\n 'v-ideographic',\n 'v-mathematical',\n 'vector-effect',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'word-spacing',\n 'writing-mode',\n 'xmlns:xlink',\n 'x-height',\n\n // NOTE: if you add a camelCased prop to this list,\n // you'll need to set attributeName to name.toLowerCase()\n // instead in the assignment below.\n].forEach(attributeName => {\n const name = attributeName.replace(CAMELIZE, capitalize);\n properties[name] = new PropertyInfoRecord(\n name,\n STRING,\n false, // mustUseProperty\n attributeName,\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// String SVG attributes with the xlink namespace.\n[\n 'xlink:actuate',\n 'xlink:arcrole',\n 'xlink:role',\n 'xlink:show',\n 'xlink:title',\n 'xlink:type',\n\n // NOTE: if you add a camelCased prop to this list,\n // you'll need to set attributeName to name.toLowerCase()\n // instead in the assignment below.\n].forEach(attributeName => {\n const name = attributeName.replace(CAMELIZE, capitalize);\n properties[name] = new PropertyInfoRecord(\n name,\n STRING,\n false, // mustUseProperty\n attributeName,\n 'http://www.w3.org/1999/xlink',\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// String SVG attributes with the xml namespace.\n[\n 'xml:base',\n 'xml:lang',\n 'xml:space',\n\n // NOTE: if you add a camelCased prop to this list,\n // you'll need to set attributeName to name.toLowerCase()\n // instead in the assignment below.\n].forEach(attributeName => {\n const name = attributeName.replace(CAMELIZE, capitalize);\n properties[name] = new PropertyInfoRecord(\n name,\n STRING,\n false, // mustUseProperty\n attributeName,\n 'http://www.w3.org/XML/1998/namespace',\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These attribute exists both in HTML and SVG.\n// The attribute name is case-sensitive in SVG so we can't just use\n// the React name like we do for attributes that exist only in HTML.\n['tabIndex', 'crossOrigin'].forEach(attributeName => {\n properties[attributeName] = new PropertyInfoRecord(\n attributeName,\n STRING,\n false, // mustUseProperty\n attributeName.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false, // removeEmptyString\n );\n});\n\n// These attributes accept URLs. These must not allow javascript: URLS.\n// These will also need to accept Trusted Types object in the future.\nconst xlinkHref = 'xlinkHref';\nproperties[xlinkHref] = new PropertyInfoRecord(\n 'xlinkHref',\n STRING,\n false, // mustUseProperty\n 'xlink:href',\n 'http://www.w3.org/1999/xlink',\n true, // sanitizeURL\n false, // removeEmptyString\n);\n\n['src', 'href', 'action', 'formAction'].forEach(attributeName => {\n properties[attributeName] = new PropertyInfoRecord(\n attributeName,\n STRING,\n false, // mustUseProperty\n attributeName.toLowerCase(), // attributeName\n null, // attributeNamespace\n true, // sanitizeURL\n true, // removeEmptyString\n );\n});\n\n// \nconst {\n CAMELCASE,\n SAME,\n possibleStandardNames: possibleStandardNamesOptimized\n} = require('../lib/possibleStandardNamesOptimized');\n\nconst ATTRIBUTE_NAME_START_CHAR =\n ':A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\n\nconst ATTRIBUTE_NAME_CHAR =\n ATTRIBUTE_NAME_START_CHAR + '\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\n\n/**\n * Checks whether a property name is a custom attribute.\n *\n * @see https://github.com/facebook/react/blob/15-stable/src/renderers/dom/shared/HTMLDOMPropertyConfig.js#L23-L25\n *\n * @type {(attribute: string) => boolean}\n */\nconst isCustomAttribute =\n RegExp.prototype.test.bind(\n // eslint-disable-next-line no-misleading-character-class\n new RegExp('^(data|aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$')\n );\n\n/**\n * @type {Record<string, string>}\n */\nconst possibleStandardNames = Object.keys(\n possibleStandardNamesOptimized\n).reduce((accumulator, standardName) => {\n const propName = possibleStandardNamesOptimized[standardName];\n if (propName === SAME) {\n accumulator[standardName] = standardName;\n } else if (propName === CAMELCASE) {\n accumulator[standardName.toLowerCase()] = standardName;\n } else {\n accumulator[standardName] = propName;\n }\n return accumulator;\n}, {});\n\nexports.BOOLEAN = BOOLEAN;\nexports.BOOLEANISH_STRING = BOOLEANISH_STRING;\nexports.NUMERIC = NUMERIC;\nexports.OVERLOADED_BOOLEAN = OVERLOADED_BOOLEAN;\nexports.POSITIVE_NUMERIC = POSITIVE_NUMERIC;\nexports.RESERVED = RESERVED;\nexports.STRING = STRING;\nexports.getPropertyInfo = getPropertyInfo;\nexports.isCustomAttribute = isCustomAttribute;\nexports.possibleStandardNames = possibleStandardNames;\n","\"use strict\";\n/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = domToReact;\nconst domhandler_1 = require(\"domhandler\");\nconst react_1 = require(\"react\");\nconst attributes_to_props_1 = __importDefault(require(\"./attributes-to-props\"));\nconst utilities_1 = require(\"./utilities\");\nconst React = {\n cloneElement: react_1.cloneElement,\n createElement: react_1.createElement,\n isValidElement: react_1.isValidElement,\n};\n/**\n * Converts DOM nodes to JSX element(s).\n *\n * @param nodes - DOM nodes.\n * @param options - Options.\n * @returns - String or JSX element(s).\n */\nfunction domToReact(nodes, options = {}) {\n var _a, _b, _c, _d, _e;\n const reactElements = [];\n const hasReplace = typeof options.replace === 'function';\n const transform = (_a = options.transform) !== null && _a !== void 0 ? _a : utilities_1.returnFirstArg;\n const { cloneElement, createElement, isValidElement } = (_b = options.library) !== null && _b !== void 0 ? _b : React;\n const nodesLength = nodes.length;\n normalizeDOMNodes(nodes);\n for (let index = 0; index < nodesLength; index++) {\n const node = nodes[index];\n // replace with custom React element (if present)\n if (hasReplace) {\n let replaceElement = (_c = options.replace) === null || _c === void 0 ? void 0 : _c.call(options, node, index);\n if (isValidElement(replaceElement)) {\n // set \"key\" prop for sibling elements\n // https://react.dev/learn/rendering-lists#rules-of-keys\n if (nodesLength > 1) {\n replaceElement = cloneElement(replaceElement, {\n key: (_d = replaceElement.key) !== null && _d !== void 0 ? _d : index,\n });\n }\n reactElements.push(transform(replaceElement, node, index));\n continue;\n }\n }\n if (node.type === 'text') {\n const isWhitespace = !node.data.trim().length;\n // We have a whitespace node that can't be nested in its parent\n // so skip it\n if (isWhitespace &&\n node.parent &&\n !(0, utilities_1.canTextBeChildOfNode)(node.parent)) {\n continue;\n }\n // Trim is enabled and we have a whitespace node\n // so skip it\n if (options.trim && isWhitespace) {\n continue;\n }\n // We have a text node that's not whitespace and it can be nested\n // in its parent so add it to the results\n reactElements.push(transform(node.data, node, index));\n continue;\n }\n const element = node;\n let props = {};\n if (skipAttributesToProps(element)) {\n (0, utilities_1.setStyleProp)(element.attribs.style, element.attribs);\n props = element.attribs;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n }\n else if (element.attribs) {\n props = (0, attributes_to_props_1.default)(element.attribs, element.name);\n }\n let children;\n switch (node.type) {\n case 'script':\n case 'style':\n // prevent text in <script> or <style> from being escaped\n // https://react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html\n if (node.children[0]) {\n props.dangerouslySetInnerHTML = {\n __html: node.children[0].data,\n };\n }\n break;\n case 'tag':\n // setting textarea value in children is an antipattern in React\n // https://react.dev/reference/react-dom/components/textarea#caveats\n if (node.name === 'textarea' && node.children[0]) {\n props.defaultValue = node.children[0].data;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n }\n else if ((_e = node.children) === null || _e === void 0 ? void 0 : _e.length) {\n // continue recursion of creating React elements (if applicable)\n children = domToReact(node.children, options);\n }\n break;\n // skip all other cases (e.g., comment)\n default:\n continue;\n }\n // set \"key\" prop for sibling elements\n // https://react.dev/learn/rendering-lists#rules-of-keys\n if (nodesLength > 1) {\n props.key = index;\n }\n reactElements.push(transform(createElement(node.name, props, children), node, index));\n }\n return reactElements.length === 1 ? reactElements[0] : reactElements;\n}\nfunction normalizeDOMNodes(nodes) {\n for (const node of nodes) {\n if (node.type === 'tag' ||\n node.type === 'script' ||\n node.type === 'style') {\n Object.setPrototypeOf(node, domhandler_1.Element.prototype);\n normalizeDOMNodes(node.children);\n }\n }\n}\n/**\n * Determines whether DOM element attributes should be transformed to props.\n * Web Components should not have their attributes transformed except for `style`.\n *\n * @param node - Element node.\n * @returns - Whether the node attributes should be converted to props.\n */\nfunction skipAttributesToProps(node) {\n return (utilities_1.PRESERVE_CUSTOM_ATTRIBUTES &&\n node.type === 'tag' &&\n (0, utilities_1.isCustomComponent)(node.name, node.attribs));\n}\n//# sourceMappingURL=dom-to-react.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.htmlToDOM = exports.domToReact = exports.attributesToProps = exports.Text = exports.ProcessingInstruction = exports.Element = exports.Comment = void 0;\nexports.default = HTMLReactParser;\nconst html_dom_parser_1 = __importDefault(require(\"html-dom-parser\"));\nexports.htmlToDOM = html_dom_parser_1.default;\nconst attributes_to_props_1 = __importDefault(require(\"./attributes-to-props\"));\nexports.attributesToProps = attributes_to_props_1.default;\nconst dom_to_react_1 = __importDefault(require(\"./dom-to-react\"));\nexports.domToReact = dom_to_react_1.default;\nvar domhandler_1 = require(\"domhandler\");\nObject.defineProperty(exports, \"Comment\", { enumerable: true, get: function () { return domhandler_1.Comment; } });\nObject.defineProperty(exports, \"Element\", { enumerable: true, get: function () { return domhandler_1.Element; } });\nObject.defineProperty(exports, \"ProcessingInstruction\", { enumerable: true, get: function () { return domhandler_1.ProcessingInstruction; } });\nObject.defineProperty(exports, \"Text\", { enumerable: true, get: function () { return domhandler_1.Text; } });\nconst domParserOptions = { lowerCaseAttributeNames: false };\n/**\n * Converts HTML string to React elements.\n *\n * @param html - HTML string.\n * @param options - Parser options.\n * @returns - React element(s), empty array, or string.\n */\nfunction HTMLReactParser(html, options) {\n var _a;\n if (typeof html !== 'string') {\n throw new TypeError('First argument must be a string');\n }\n if (!html) {\n return [];\n }\n const htmlToDOMOptions = Object.assign(Object.assign({}, ((_a = options === null || options === void 0 ? void 0 : options.htmlparser2) !== null && _a !== void 0 ? _a : domParserOptions)), { trustedTypePolicy: options === null || options === void 0 ? void 0 : options.trustedTypePolicy });\n return (0, dom_to_react_1.default)((0, html_dom_parser_1.default)(html, htmlToDOMOptions), options);\n}\n//# sourceMappingURL=index.js.map","Object.defineProperties(exports, {\n\t__esModule: { value: true },\n\t[Symbol.toStringTag]: { value: \"Module\" }\n});\nconst require_html_to_dom = require(\"./server/html-to-dom.js\");\nexports.default = require_html_to_dom.default;\n","import HTMLReactParser from '../lib/index.js';\n\nexport {\n attributesToProps,\n Comment,\n domToReact,\n Element,\n htmlToDOM,\n ProcessingInstruction,\n Text,\n} from '../lib/index.js';\n\nexport default HTMLReactParser.default || HTMLReactParser;\n","import React from 'react';\nimport parse, { type HTMLReactParserOptions, type DOMNode } from 'html-react-parser';\nimport type { RichTextReplacer } from './replacers/types';\nimport './RichText.scss';\n\nexport interface EnhancedRichTextProps {\n content: string;\n /** Array of replacer functions that transform matched DOM nodes into React components. */\n replacers?: RichTextReplacer[];\n darkMode?: boolean;\n className?: string;\n style?: React.CSSProperties;\n maxWidth?: string;\n}\n\n/**\n * Enhanced RichText component that parses HTML and applies replacer transforms.\n *\n * For simple HTML rendering without transforms, use the base `RichText` component.\n *\n * @example\n * ```tsx\n * import { EnhancedRichText } from '@/components/atoms/RichText';\n * import { createVideoReplacer } from '@/components/atoms/RichText/replacers';\n *\n * const videoReplacer = createVideoReplacer({ aspectRatio: '16/9' });\n *\n * <EnhancedRichText content={cmsHtml} replacers={[videoReplacer]} />\n * ```\n */\nexport const EnhancedRichText: React.FC<EnhancedRichTextProps> = ({\n content,\n replacers = [],\n darkMode = false,\n className,\n style,\n}) => {\n const richTextClasses = ['rich-text', className].filter(Boolean).join(' ');\n\n const parserOptions: HTMLReactParserOptions = {\n replace(domNode: DOMNode) {\n for (const replacer of replacers) {\n const result = replacer(domNode);\n if (result !== undefined) {\n return result;\n }\n }\n return undefined;\n },\n };\n\n return (\n <div className={richTextClasses} style={style} data-dark-mode={darkMode ? 'true' : undefined}>\n {parse(content, parserOptions)}\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { Media, MediaProps } from '@/components/atoms/Media';\nimport './VideoPlayer.scss';\n\nconst WISTIA_PLAYER_SCRIPT = 'https://fast.wistia.com/player.js';\n\nlet wistiaScriptLoaded = false;\nlet wistiaScriptLoading = false;\nconst wistiaLoadCallbacks: (() => void)[] = [];\n\nfunction ensureWistiaScript(): Promise<void> {\n if (wistiaScriptLoaded) return Promise.resolve();\n\n return new Promise((resolve) => {\n wistiaLoadCallbacks.push(resolve);\n\n if (wistiaScriptLoading) return;\n wistiaScriptLoading = true;\n\n // Check if script already exists in DOM\n const existing = document.querySelector(`script[src=\"${WISTIA_PLAYER_SCRIPT}\"]`);\n if (existing) {\n wistiaScriptLoaded = true;\n wistiaLoadCallbacks.forEach((cb) => cb());\n wistiaLoadCallbacks.length = 0;\n return;\n }\n\n const script = document.createElement('script');\n script.src = WISTIA_PLAYER_SCRIPT;\n script.async = true;\n script.onload = () => {\n wistiaScriptLoaded = true;\n wistiaLoadCallbacks.forEach((cb) => cb());\n wistiaLoadCallbacks.length = 0;\n };\n document.head.appendChild(script);\n });\n}\n\n/** Extract Wistia video ID from various URL formats */\nfunction extractWistiaId(url: string): string | null {\n const match =\n url.match(/(?:medias|iframe|embed)\\/([a-zA-Z0-9]+)/) ||\n url.match(/wi\\.st\\/medias\\/([a-zA-Z0-9]+)/) ||\n url.match(/wistia\\.com\\/medias\\/([a-zA-Z0-9]+)/);\n return match?.[1] ?? null;\n}\n\nfunction isWistiaUrl(url: string): boolean {\n return /wistia\\.(com|net)/i.test(url) || /wi\\.st/i.test(url);\n}\n\nexport type VideoPlaybackMode = 'inline' | 'popover';\n\nexport interface VideoPlayerProps {\n /** Video source URL (native video file, Wistia, or any provider supported by Media) */\n src: string;\n /** Thumbnail image URL. If omitted, shows the video directly. */\n thumbnail?: string;\n /** Alt text for thumbnail image and video title */\n alt?: string;\n /** Custom play button element/icon. Receives default styling wrapper. */\n playIcon?: React.ReactNode;\n /** Playback mode: 'inline' plays in-place, 'popover' opens Wistia lightbox */\n playbackMode?: VideoPlaybackMode;\n /** Aspect ratio for the player container (e.g. \"16/9\") */\n aspectRatio?: string;\n /** Additional Media props passed to the video when playing inline */\n mediaProps?: Partial<MediaProps>;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/** Molecule that composes Media atom with thumbnail, play button, and playback modes */\nexport const VideoPlayer: React.FC<VideoPlayerProps> = ({\n src,\n thumbnail,\n alt = '',\n playIcon,\n playbackMode = 'inline',\n aspectRatio = '16/9',\n mediaProps,\n darkMode = false,\n className,\n style,\n}) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const wistiaId = isWistiaUrl(src) ? extractWistiaId(src) : null;\n\n const baseClass = 'video-player';\n const classes = [baseClass, isPlaying && `${baseClass}--playing`, className].filter(Boolean).join(' ');\n\n useEffect(() => {\n if (playbackMode !== 'popover' || !wistiaId) return;\n\n ensureWistiaScript().then(() => {\n const mediaScriptSrc = `https://fast.wistia.com/embed/${wistiaId}.js`;\n if (!document.querySelector(`script[src=\"${mediaScriptSrc}\"]`)) {\n const mediaScript = document.createElement('script');\n mediaScript.src = mediaScriptSrc;\n mediaScript.async = true;\n mediaScript.type = 'module';\n document.head.appendChild(mediaScript);\n }\n });\n }, [playbackMode, wistiaId]);\n\n const handlePlay = useCallback(() => {\n if (playbackMode === 'inline') {\n setIsPlaying(true);\n }\n }, [playbackMode]);\n\n const renderPlayIcon = () => {\n if (playIcon) {\n return <div className={`${baseClass}__play-icon`}>{playIcon}</div>;\n }\n\n return (\n <div className={`${baseClass}__play-icon`}>\n <svg viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle\n cx=\"32\"\n cy=\"32\"\n r=\"31\"\n fill=\"var(--video-player-play-icon-bg, rgba(0, 0, 0, 0.6))\"\n stroke=\"var(--video-player-play-icon-border, rgba(255, 255, 255, 0.8))\"\n strokeWidth=\"2\"\n />\n <polygon points=\"26,20 26,44 46,32\" fill=\"var(--video-player-play-icon-color, #fff)\" />\n </svg>\n </div>\n );\n };\n\n const cssVars: React.CSSProperties = {\n ...style,\n };\n\n if (playbackMode === 'popover' && wistiaId) {\n const transparentPng =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\n return (\n <div\n className={classes}\n style={cssVars}\n data-dark-mode={darkMode || undefined}\n ref={(node) => {\n if (!node) return;\n const existing = node.querySelector('wistia-player');\n if (existing) return;\n\n const player = document.createElement('wistia-player');\n player.setAttribute('media-id', wistiaId);\n player.setAttribute('wistia-popover', '');\n player.setAttribute('popover-content', 'html');\n player.setAttribute('poster', transparentPng);\n player.style.display = 'block';\n player.style.width = '100%';\n if (aspectRatio) player.style.aspectRatio = aspectRatio;\n\n const thumbnailEl = node.querySelector(`.${baseClass}__thumbnail-wrapper`);\n if (thumbnailEl) {\n player.appendChild(thumbnailEl);\n }\n\n node.insertBefore(player, node.firstChild);\n }}\n >\n <div className={`${baseClass}__thumbnail-wrapper`} style={{ aspectRatio }}>\n {thumbnail && <Media src={thumbnail} type=\"image\" alt={alt} objectFit=\"cover\" aspectRatio={aspectRatio} />}\n {renderPlayIcon()}\n </div>\n </div>\n );\n }\n\n if (isPlaying) {\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <Media src={src} type=\"video\" alt={alt} autoplay controls aspectRatio={aspectRatio} {...mediaProps} />\n </div>\n );\n }\n\n return (\n <div className={classes} style={cssVars} data-dark-mode={darkMode || undefined}>\n <button\n className={`${baseClass}__thumbnail-wrapper`}\n onClick={handlePlay}\n aria-label={`Play video: ${alt}`}\n type=\"button\"\n style={{ aspectRatio }}\n >\n {thumbnail ? (\n <Media src={thumbnail} type=\"image\" alt={alt} objectFit=\"cover\" aspectRatio={aspectRatio} />\n ) : (\n <div className={`${baseClass}__placeholder`} />\n )}\n {renderPlayIcon()}\n </button>\n </div>\n );\n};\n","import React from 'react';\nimport type { SemanticColorTokens } from '@/themes/core/color-system';\nimport { toKebabCase } from '@/themes/utils/helpers';\nimport './Paragraph.scss';\n\nexport type ParagraphElement = 'p' | 'span' | 'div';\nexport type ColorPalette = 'primary' | 'secondary' | 'accent' | 'tertiary';\nexport type ParagraphWeight = 'light' | 'regular' | 'semibold' | 'bold' | 'black';\nexport type ParagraphSize = '2xl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs';\n\n// Typography variant type — matches Heading variants for consistent styling\nexport type ParagraphVariant = string;\n\n// Color type derives from SemanticColorTokens keys\nexport type ParagraphColor = keyof SemanticColorTokens;\n\nexport interface ParagraphProps {\n /** Paragraph content - supports text and HTML tags (bold, em, strong, etc) */\n children?: React.ReactNode;\n /** HTML element to render (default: 'p') */\n as?: ParagraphElement;\n /** Typography variant — applies the same variant styles as Heading (e.g., 'body', 'bodyBold', 'caption') */\n variant?: ParagraphVariant;\n /** Font weight (maps to --tier1-theme-typography-font-weight-*) */\n weight?: ParagraphWeight;\n /** Font size (maps to --tier1-theme-typography-font-size-*) */\n size?: ParagraphSize;\n /** Color from theme semantic tokens */\n color?: ParagraphColor;\n /** Color palette to apply (background + text) */\n palette?: ColorPalette;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Render HTML string (use with caution - sanitize external content) */\n dangerouslySetInnerHTML?: { __html: string };\n\n id?: string;\n role?: string;\n}\n\n/**\n * Paragraph component for body text\n * Supports text and HTML tags (bold, em, strong, etc)\n * Integrates with RichText component through shared tokens\n */\nexport const Paragraph: React.FC<ParagraphProps> = ({\n children,\n as = 'p',\n variant,\n weight,\n size,\n color,\n palette,\n darkMode = false,\n className,\n style,\n dangerouslySetInnerHTML,\n}) => {\n const Tag = as;\n\n // Apply palette and color styling only\n let finalStyle = style;\n\n if (palette) {\n finalStyle = {\n ...style,\n backgroundColor: `var(--${palette})`,\n color: `var(--${palette}-text)`,\n padding: style?.padding || '0.5rem 1rem',\n borderRadius: style?.borderRadius || '4px',\n };\n } else if (color) {\n finalStyle = {\n ...style,\n color: `var(--${toKebabCase(color as string)})`,\n };\n }\n\n // Note: weight and size are handled via data attributes and CSS variables\n // Don't apply inline styles for these - let the component-scoped tokens handle it\n\n const paragraphClasses = ['paragraph', variant && `paragraph--variant-${variant}`, className]\n .filter(Boolean)\n .join(' ');\n\n const commonProps = {\n className: paragraphClasses,\n style: finalStyle,\n 'data-dark-mode': darkMode ? 'true' : undefined,\n 'data-size': size || undefined,\n 'data-weight': weight || undefined,\n };\n\n if (dangerouslySetInnerHTML) {\n return <Tag {...commonProps} dangerouslySetInnerHTML={dangerouslySetInnerHTML} />;\n }\n\n return <Tag {...commonProps}>{children}</Tag>;\n};\n","import React from 'react';\nimport './BulletList.scss';\n\nexport interface BulletItem {\n /** Bullet point text content */\n text: React.ReactNode;\n /** Custom icon override for this specific item */\n icon?: React.ReactNode;\n}\n\nexport interface BulletListProps {\n /** Array of bullet items */\n items: BulletItem[];\n /** Custom icon for all bullet points (overridden by per-item icon) */\n icon?: React.ReactNode;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * BulletList atom for rendering styled bullet point lists.\n * Uses component-scoped tokens (--bullet-list-*) for theming.\n * RichText inherits these same tokens for `ul > li` rendering.\n */\n\nconst defaultIcon = (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"4\" />\n </svg>\n);\n\nexport const BulletList: React.FC<BulletListProps> = ({ items, icon, darkMode = false, className, style }) => {\n const classes = ['bullet-list', className].filter(Boolean).join(' ');\n\n return (\n <ul className={classes} style={style} role=\"list\" data-dark-mode={darkMode ? 'true' : undefined}>\n {items.map((item, index) => {\n const itemIcon = item.icon ?? icon ?? defaultIcon;\n return (\n <li key={index} className=\"bullet-list__item\">\n <span className=\"bullet-list__icon\" aria-hidden=\"true\">\n {itemIcon}\n </span>\n <span className=\"bullet-list__text\">{item.text}</span>\n </li>\n );\n })}\n </ul>\n );\n};\n","import React from 'react';\nimport { Paragraph } from '../Paragraph/Paragraph';\nimport './Footnote.scss';\n\nexport interface FootnoteItem {\n /** Footnote marker/number (e.g., \"1\", \"2\", \"*\") */\n marker: string;\n /** Footnote content — plain text or HTML string (supports inline links) */\n content: string;\n}\n\nexport interface FootnoteProps {\n /** Array of footnote items with marker and content */\n items: FootnoteItem[];\n /** Label prefix displayed in bold before the footnotes. Defaults to \"Footnotes:\" */\n label?: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Footnote component for supplementary text annotations.\n * Renders a paragraph with a bold label followed by numbered footnote entries.\n * Each footnote displays its marker as a superscript followed by content (supports inline links via HTML).\n */\nexport const Footnote: React.FC<FootnoteProps> = ({\n items,\n label = 'Footnotes:',\n darkMode = false,\n className,\n style,\n}) => {\n const footnoteClasses = ['footnote', className].filter(Boolean).join(' ');\n\n return (\n <Paragraph className={footnoteClasses} style={style} darkMode={darkMode}>\n <strong className=\"footnote__label\">{label}</strong>{' '}\n {items.map((item, index) => (\n <React.Fragment key={index}>\n <sup className=\"footnote__marker\">{item.marker}</sup>\n <span className=\"footnote__text\" dangerouslySetInnerHTML={{ __html: item.content }} />\n {index < items.length - 1 && '\\n'}\n </React.Fragment>\n ))}\n </Paragraph>\n );\n};\n","import React from 'react';\nimport { Paragraph } from '../Paragraph/Paragraph';\nimport './Author.scss';\n\nexport interface AuthorProps {\n /** Author bio/description text (plain text) */\n children?: string;\n /** Author bio as HTML string (supports inline links). Takes precedence over children. */\n html?: string;\n /** Label prefix displayed in bold before the bio. Defaults to \"Author:\" */\n label?: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Author component for attributing content to a person.\n * Renders a paragraph with a bold label prefix followed by the author bio text.\n * Supports plain text or rich HTML content (inline links, bold, italic).\n */\nexport const Author: React.FC<AuthorProps> = ({\n children,\n html,\n label = 'Author:',\n darkMode = false,\n className,\n style,\n}) => {\n const authorClasses = ['author', className].filter(Boolean).join(' ');\n\n if (html) {\n return (\n <Paragraph\n className={authorClasses}\n style={style}\n darkMode={darkMode}\n dangerouslySetInnerHTML={{ __html: `<strong class=\"author__label\">${label}</strong> ${html}` }}\n />\n );\n }\n\n return (\n <Paragraph className={authorClasses} style={style} darkMode={darkMode}>\n <strong className=\"author__label\">{label}</strong> {children}\n </Paragraph>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCircleXmark } from '@fortawesome/pro-duotone-svg-icons';\nimport './FilterPill.scss';\n\nexport type FilterPillStyle = 'navy' | 'blue' | 'white';\n\nexport interface FilterPillProps {\n /** Display label text */\n label: string;\n /** Visual style variant */\n pillStyle?: FilterPillStyle;\n /** Show dismiss (x-mark) badge */\n dismissible?: boolean;\n /** Callback when dismiss is clicked */\n onDismiss?: () => void;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * FilterPill — A small tag/badge for displaying active filters.\n * Supports three style variants (Navy, Blue, White), hover/focus states,\n * and an optional dismissible x-mark icon.\n */\nexport const FilterPill: React.FC<FilterPillProps> = ({\n label,\n pillStyle = 'white',\n dismissible = true,\n onDismiss,\n darkMode = false,\n className,\n}) => {\n const baseClass = 'filter-pill';\n const classes = [baseClass, `${baseClass}--${pillStyle}`, className].filter(Boolean).join(' ');\n\n return (\n <span className={classes} data-dark-mode={darkMode || undefined} role=\"listitem\">\n <span className={`${baseClass}__label`}>{label}</span>\n {dismissible && (\n <button\n type=\"button\"\n className={`${baseClass}__dismiss`}\n onClick={onDismiss}\n aria-label={`Remove ${label} filter`}\n >\n <FontAwesomeIcon icon={faCircleXmark} className={`${baseClass}__dismiss-icon`} />\n </button>\n )}\n </span>\n );\n};\n","import React from 'react';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './AssetMeta.scss';\n\nexport interface AssetMetaProps {\n /** Asset type/category label */\n assetType?: string;\n /** Duration string or duration in minutes (renders as \"12 Mins\") */\n duration?: string | number;\n /** Date or timestamp string */\n date?: string;\n /** Separator between duration and date */\n separator?: string;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * AssetMeta — Reusable metadata block for content assets.\n *\n * Renders the common pattern of:\n * - Asset type/category (bold)\n * - Duration | Date (secondary text)\n *\n */\nexport const AssetMeta: React.FC<AssetMetaProps> = ({\n assetType,\n duration,\n date,\n separator = ' | ',\n darkMode = false,\n className = '',\n}) => {\n const durationText = typeof duration === 'number' ? `${duration} Mins` : duration;\n const metaParts: string[] = [];\n if (durationText) metaParts.push(durationText);\n if (date) metaParts.push(date);\n const metaLine = metaParts.join(separator);\n\n // Don't render if nothing to show\n if (!assetType && !metaLine) return null;\n\n const classes = ['asset-meta', className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n {assetType && (\n <Paragraph className=\"asset-meta__type\" darkMode={darkMode}>\n {assetType}\n </Paragraph>\n )}\n {metaLine && (\n <Paragraph className=\"asset-meta__details\" darkMode={darkMode}>\n {metaLine}\n </Paragraph>\n )}\n </div>\n );\n};\n","import React from 'react';\n\nexport type ObjectFit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n\n/**\n * Image configuration interface extending native img attributes with layout props.\n * Reusable across any component that renders an image (Card, SideBar, PostItem, etc.)\n */\nexport interface ImageProps extends Pick<\n React.ImgHTMLAttributes<HTMLImageElement>,\n 'src' | 'alt' | 'srcSet' | 'sizes' | 'loading' | 'decoding'\n> {\n /** Required image source URL */\n src: string;\n /** How the image fills its container (default: 'cover') */\n objectFit?: ObjectFit;\n /** Object position (e.g. \"center top\") */\n objectPosition?: string;\n /** Aspect ratio (e.g. \"16/9\", \"3/2\") */\n aspectRatio?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/** Atom component for rendering images with layout control */\nexport const Image: React.FC<ImageProps> = ({\n src,\n alt = '',\n objectFit = 'cover',\n objectPosition,\n aspectRatio,\n srcSet,\n sizes,\n loading = 'lazy',\n decoding,\n\n className = '',\n}) => {\n const classes = ['image', className].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n objectFit,\n objectPosition,\n aspectRatio,\n width: '100%',\n height: '100%',\n display: 'block',\n };\n\n return (\n <img\n className={classes}\n src={src}\n alt={alt}\n srcSet={srcSet}\n sizes={sizes}\n loading={loading}\n decoding={decoding}\n style={style}\n />\n );\n};\n","import React, { useState, useCallback, useRef, useEffect, useId } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons';\nimport { RichText } from '@/components/atoms/RichText';\nimport './Accordion.scss';\n\nexport interface AccordionItem {\n /** Unique identifier for the item */\n id: string;\n /** Title displayed in the accordion header */\n title: string;\n /** Rich text HTML content for the expanded panel */\n content: string;\n}\n\nexport interface AccordionProps {\n /** Array of accordion items */\n items: AccordionItem[];\n /** Index of the initially open item (undefined = all closed) */\n defaultOpenIndex?: number;\n /** Allow multiple items open simultaneously */\n allowMultiple?: boolean;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Custom chevron icon (ReactNode) — defaults to built-in SVG chevron */\n chevronIcon?: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n /** Callback when an item is toggled */\n onToggle?: (itemId: string, isOpen: boolean) => void;\n}\n\n/** Default chevron using FontAwesome */\nconst DefaultChevron: React.FC = () => <FontAwesomeIcon icon={faChevronDown} aria-hidden=\"true\" />;\n\n/**\n * Accordion component — expandable/collapsible content panels.\n *\n * By default only one item stays open at a time (single-expand mode).\n * Set `allowMultiple` to allow multiple panels open simultaneously.\n * Content renders via RichText component for HTML support.\n */\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n defaultOpenIndex,\n allowMultiple = false,\n darkMode = false,\n chevronIcon,\n className,\n onToggle,\n}) => {\n const baseId = useId();\n\n // Track open items as a Set of IDs\n const [openItems, setOpenItems] = useState<Set<string>>(() => {\n if (defaultOpenIndex !== undefined && items[defaultOpenIndex]) {\n return new Set([items[defaultOpenIndex].id]);\n }\n return new Set();\n });\n\n const handleToggle = useCallback(\n (itemId: string) => {\n setOpenItems((prev) => {\n const next = new Set(prev);\n const isCurrentlyOpen = next.has(itemId);\n\n if (isCurrentlyOpen) {\n next.delete(itemId);\n } else {\n if (!allowMultiple) {\n next.clear();\n }\n next.add(itemId);\n }\n\n onToggle?.(itemId, !isCurrentlyOpen);\n return next;\n });\n },\n [allowMultiple, onToggle]\n );\n\n const baseClass = 'accordion';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined} role=\"region\">\n {items.map((item, index) => {\n const isOpen = openItems.has(item.id);\n const headerId = `${baseId}-header-${index}`;\n const panelId = `${baseId}-panel-${index}`;\n\n return (\n <AccordionItemPanel\n key={item.id}\n item={item}\n isOpen={isOpen}\n headerId={headerId}\n panelId={panelId}\n darkMode={darkMode}\n chevronIcon={chevronIcon}\n onToggle={handleToggle}\n />\n );\n })}\n </div>\n );\n};\n\n/** Individual accordion item with animated expand/collapse */\ninterface AccordionItemPanelProps {\n item: AccordionItem;\n isOpen: boolean;\n headerId: string;\n panelId: string;\n darkMode: boolean;\n chevronIcon?: React.ReactNode;\n onToggle: (itemId: string) => void;\n}\n\nconst AccordionItemPanel: React.FC<AccordionItemPanelProps> = ({\n item,\n isOpen,\n headerId,\n panelId,\n darkMode,\n chevronIcon,\n onToggle,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentHeight, setContentHeight] = useState<number>(0);\n\n // Measure content height for slide animation\n useEffect(() => {\n if (contentRef.current) {\n setContentHeight(contentRef.current.scrollHeight);\n }\n }, [isOpen, item.content]);\n\n const baseClass = 'accordion';\n\n return (\n <div className={`${baseClass}__item ${isOpen ? `${baseClass}__item--open` : ''}`}>\n <button\n id={headerId}\n className={`${baseClass}__header`}\n onClick={() => onToggle(item.id)}\n aria-expanded={isOpen}\n aria-controls={panelId}\n type=\"button\"\n >\n <span className={`${baseClass}__title`}>{item.title}</span>\n <span className={`${baseClass}__chevron`}>{chevronIcon || <DefaultChevron />}</span>\n </button>\n\n <div\n id={panelId}\n className={`${baseClass}__panel`}\n role=\"region\"\n aria-labelledby={headerId}\n aria-hidden={!isOpen}\n style={{ height: isOpen ? contentHeight : 0 }}\n >\n <div className={`${baseClass}__content`} ref={contentRef}>\n <RichText content={item.content} darkMode={darkMode} />\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { Media } from '@/components/atoms/Media';\nimport { SPARKLE_OVERLAY_PATH, SPARK_SMALL_SPARKS_PATH, SPARK_ICON_LARGE_PATH, SPARK_ICON_SMALL_PATH } from './assets';\nimport './MediaBlock.scss';\n\nexport type MediaBlockVariant = 'default' | 'croppedSpark';\n\nexport interface MediaBlockProps {\n /** Display variant — \"default\" for the standard grid layout, \"croppedSpark\" for sparkle-masked image with decorative sparks */\n variant?: MediaBlockVariant;\n /** Video source URL (mp4, webm, Wistia embed URL, etc.). Not used for static images. */\n src?: string;\n /** Image URL — used as the display image for image-only blocks, or as the video thumbnail when src/wistiaId is set */\n thumbnail?: string;\n /** Alt text for accessibility */\n alt?: string;\n /** Custom play button element (e.g. primax play button PNG) */\n playIcon?: React.ReactNode;\n /** Aspect ratio for the media (e.g. \"16/9\") */\n aspectRatio?: string;\n /** Show the L-shaped mint accent border */\n accentBorder?: boolean;\n /** Show the dark overlay on thumbnail */\n overlay?: boolean;\n /** Show the decorative sparkle overlay */\n sparkle?: boolean;\n /** Source URL for the sparkle overlay image (SVG or PNG) */\n sparkSrc?: string;\n /** Scale the sparkle size from 1 (10%) to 10 (100%) */\n sparkScale?: number;\n /** Mirror decorative elements (L-shape on left, sparkle on right) */\n mirror?: boolean;\n /** Toggle video controls prop */\n controls?: boolean;\n /** Override the L-shaped accent border color (e.g. \"#00FFD2\" or \"var(--color-secondary-200)\") */\n accentColor?: string;\n /** Wistia media ID. Used for inline embed by default, or popover lightbox when popover=true */\n wistiaId?: string;\n /** When true and wistiaId is set, opens the video in a Wistia popover lightbox instead of inline */\n popover?: boolean;\n /** Source URL for the sparkle mask image (used by croppedSpark variant) */\n sparkMaskSrc?: string;\n /** Source URL for the small decorative sparks SVG (used by croppedSpark variant on tablet/mobile) */\n sparkSmallSrc?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/** Detect if a source URL is a video */\nfunction isVideoSource(src: string): boolean {\n const videoExts = /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i;\n const videoProviders = /wistia\\.(com|net)|wi\\.st/i;\n return videoExts.test(src) || videoProviders.test(src);\n}\n\nconst WISTIA_PLAYER_SCRIPT_ID = 'wistia-player-script';\nconst WISTIA_PLAYER_SCRIPT_SRC = 'https://fast.wistia.com/player.js';\n\n/** Load the Wistia player.js script (new Web Component API) */\nfunction loadWistiaPlayerScript(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(WISTIA_PLAYER_SCRIPT_ID)) return;\n const script = document.createElement('script');\n script.id = WISTIA_PLAYER_SCRIPT_ID;\n script.src = WISTIA_PLAYER_SCRIPT_SRC;\n script.async = true;\n document.head.appendChild(script);\n}\n\n/** Load the Wistia media-specific module script */\nfunction loadWistiaMediaModule(mediaId: string): void {\n if (typeof document === 'undefined') return;\n const moduleId = `wistia-module-${mediaId}`;\n if (document.getElementById(moduleId)) return;\n const script = document.createElement('script');\n script.id = moduleId;\n script.src = `https://fast.wistia.com/embed/${mediaId}.js`;\n script.async = true;\n script.type = 'module';\n document.head.appendChild(script);\n}\n\nexport const MediaBlock: React.FC<MediaBlockProps> = ({\n variant = 'default',\n src,\n thumbnail,\n alt = '',\n playIcon,\n aspectRatio = '',\n accentBorder = false,\n overlay = false,\n sparkle = false,\n controls = true,\n accentColor,\n sparkSrc = SPARKLE_OVERLAY_PATH,\n sparkScale,\n mirror = false,\n wistiaId,\n popover = false,\n sparkSmallSrc = SPARK_SMALL_SPARKS_PATH,\n className,\n}) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const videoHandleRef = useRef<any>(null);\n const videoContainerRef = useRef<HTMLDivElement>(null);\n\n // Determine display mode\n const isPopover = !!wistiaId && popover;\n // Wistia inline: wistiaId without popover — build embed URL for the Media atom\n const wistiaInlineSrc = wistiaId && !popover ? `https://fast.wistia.com/medias/${wistiaId}` : undefined;\n const videoSrc = src || wistiaInlineSrc;\n const hasVideo = isPopover || (!!videoSrc && isVideoSource(videoSrc));\n const isImage = !hasVideo && !!thumbnail;\n\n const baseClass = 'media-block';\n const classes = [\n baseClass,\n variant !== 'default' && `${baseClass}--${variant}`,\n accentBorder && `${baseClass}--accent`,\n mirror && `${baseClass}--mirror`,\n hasVideo && `${baseClass}--video`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Load Wistia popover scripts (only needed for popover mode)\n useEffect(() => {\n if (!isPopover || !wistiaId) return;\n loadWistiaPlayerScript();\n loadWistiaMediaModule(wistiaId);\n }, [isPopover, wistiaId]);\n\n // Store the Wistia video handle when Media reports ready\n const handleVideoReady = useCallback((handle: any) => {\n videoHandleRef.current = handle;\n }, []);\n\n // On play click: show video and trigger playback (non-popover mode)\n const handlePlay = useCallback(() => {\n if (!hasVideo || isPopover) return;\n setIsPlaying(true);\n\n // Wistia handle\n if (videoHandleRef.current?.play) {\n videoHandleRef.current.play();\n return;\n }\n\n // Native <video> element — find it in the container\n const videoEl = videoContainerRef.current?.querySelector('video');\n if (videoEl) {\n videoEl.play().catch(() => {});\n }\n }, [hasVideo, isPopover]);\n\n // Render the thumbnail with play button (used for inline video mode)\n const renderThumbnailOverlay = (onClick: () => void) => (\n <button className={`${baseClass}__trigger`} onClick={onClick} aria-label={`Play video: ${alt}`} type=\"button\">\n {thumbnail && <Media src={thumbnail} type=\"image\" alt=\"\" objectFit=\"cover\" aspectRatio={aspectRatio} />}\n {overlay && <div className={`${baseClass}__overlay`} aria-hidden=\"true\" />}\n {playIcon && (\n <div className={`${baseClass}__play-icon`} aria-hidden=\"true\">\n {playIcon}\n </div>\n )}\n </button>\n );\n\n // ── croppedSpark variant: sparkle-masked image with decorative spark icons ──\n if (variant === 'croppedSpark') {\n // Spark mask SVG path (from spark-mask.svg, viewBox 0 0 218 239)\n const sparkPath =\n 'M215.208 122.007C197.838 122.065 179.583 127.759 164.968 135.541C124.822 156.905 112.194 197.875 111.885 236.575C111.856 239.811 106.136 239.806 106.112 236.575C105.798 197.875 93.1749 156.91 53.0289 135.541C38.4141 127.764 20.154 122.065 2.78832 122.007C-0.934274 121.992 -0.924605 116.998 2.78832 116.983C20.1588 116.93 38.4141 111.23 53.0289 103.449C93.1749 82.0848 105.798 41.1197 106.112 2.41994C106.098 0.796987 107.553 0 108.998 0C110.449 0 111.904 0.801817 111.889 2.41994C112.194 41.1197 124.827 82.0848 164.973 103.454C179.587 111.23 197.848 116.93 215.213 116.988C218.936 117.002 218.926 121.997 215.213 122.011L215.208 122.007Z';\n\n return (\n <figure className={classes} role=\"group\" aria-label={alt || 'Media content'}>\n <div className={`${baseClass}__cropped-spark`}>\n {/* Inline SVG sparkle shape — clip image + stroke border */}\n <svg\n className={`${baseClass}__spark-svg`}\n viewBox=\"0 0 218 239\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <clipPath id=\"spark-clip\">\n <path d={sparkPath} />\n </clipPath>\n </defs>\n\n {/* Image clipped to sparkle shape */}\n <foreignObject x=\"0\" y=\"0\" width=\"218\" height=\"239\" clipPath=\"url(#spark-clip)\">\n {thumbnail && (\n <img\n src={thumbnail}\n alt={alt}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n }}\n />\n )}\n </foreignObject>\n\n {/* Solid stroke on the sparkle shape */}\n <path className={`${baseClass}__spark-svg-stroke`} d={sparkPath} fill=\"none\" />\n </svg>\n\n {/* Decorative spark icons (large + small) */}\n <img\n className={`${baseClass}__spark-icon ${baseClass}__spark-icon--large`}\n src={SPARK_ICON_LARGE_PATH}\n alt=\"\"\n aria-hidden=\"true\"\n />\n <img\n className={`${baseClass}__spark-icon ${baseClass}__spark-icon--small`}\n src={SPARK_ICON_SMALL_PATH}\n alt=\"\"\n aria-hidden=\"true\"\n />\n\n {/* Small sparks — visible on tablet/mobile as fallback decoration */}\n <img className={`${baseClass}__spark-small-sparks`} src={sparkSmallSrc} alt=\"\" aria-hidden=\"true\" />\n </div>\n </figure>\n );\n }\n\n return (\n <figure\n className={classes}\n role=\"group\"\n aria-label={alt || 'Media content'}\n style={accentColor ? ({ '--media-block-accent-color': accentColor } as React.CSSProperties) : undefined}\n >\n <div className={`${baseClass}__grid`}>\n {/* Decorative sparkle overlay */}\n {sparkle && (\n <div\n className={`${baseClass}__spark`}\n aria-hidden=\"true\"\n style={sparkScale ? ({ '--media-block-spark-scale': sparkScale / 10 } as React.CSSProperties) : undefined}\n >\n <img src={sparkSrc} alt=\"\" />\n </div>\n )}\n\n {/* Media container */}\n <div className={`${baseClass}__inner`} ref={videoContainerRef}>\n {isImage && thumbnail ? (\n <Media src={thumbnail} type=\"image\" alt={alt} objectFit=\"cover\" aspectRatio={aspectRatio} />\n ) : isPopover ? (\n <>\n {/* Visual thumbnail layer (non-interactive, purely decorative) */}\n <div className={`${baseClass}__popover-thumbnail`} aria-hidden=\"true\">\n {thumbnail && <Media src={thumbnail} type=\"image\" alt=\"\" objectFit=\"cover\" aspectRatio={aspectRatio} />}\n {overlay && <div className={`${baseClass}__overlay`} />}\n {playIcon && <div className={`${baseClass}__play-icon`}>{playIcon}</div>}\n </div>\n\n {/* Transparent Wistia popover player on top — receives the actual click */}\n <div className={`${baseClass}__wistia-popover`}>\n {React.createElement('wistia-player', {\n 'media-id': wistiaId,\n 'wistia-popover': 'true',\n aspect: '1.7777777777777777',\n style: { width: '100%', height: '100%' },\n })}\n </div>\n </>\n ) : videoSrc ? (\n <>\n {/* Video preloads behind the thumbnail */}\n <Media\n src={videoSrc}\n type=\"video\"\n alt={alt}\n controls={controls}\n aspectRatio={aspectRatio}\n onReady={handleVideoReady}\n className={`${baseClass}__video-layer`}\n />\n\n {/* Thumbnail overlay — hides once playing */}\n {!isPlaying && renderThumbnailOverlay(handlePlay)}\n </>\n ) : null}\n </div>\n\n {/* L-shaped accent */}\n {accentBorder && <div className={`${baseClass}__accent-side`} aria-hidden=\"true\" />}\n {accentBorder && <div className={`${baseClass}__accent-bottom`} aria-hidden=\"true\" />}\n </div>\n </figure>\n );\n};\n","export default \"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%22224%22%20height%3D%22224%22%20viewBox%3D%220%200%20224%20224%22%20fill%3D%22none%22%3E%20%20%3Cpath%20d%3D%22M0.87146%208.04027C-2.23028%203.39342%203.61165%20-2.23422%208.22653%200.913946C50.1288%2029.4986%2074.7621%2038.9595%20108.417%2041.2004C144.268%2040.259%20168.419%2032.9657%20207.023%209.04353C211.607%206.20271%20217.138%2011.584%20214.28%2016.1584L207.095%2027.6592L197.353%2044.936C197.233%2045.1482%20197.129%2045.369%20197.042%2045.5965L188.666%2067.367C188.58%2067.5906%20188.51%2067.8202%20188.457%2068.0539L183.062%2091.7796C182.998%2092.0584%20182.959%2092.3422%20182.944%2092.6278L181.818%20114.177C181.804%20114.457%20181.813%20114.738%20181.845%20115.016L184.062%20134.065L189.35%20155.826C189.424%20156.13%20189.526%20156.426%20189.656%20156.711L199.198%20177.743L210.718%20197.93L222.95%20215.579C226.11%20220.138%20220.604%20225.686%20216.023%20222.558L198.236%20210.415L178.309%20198.637L156.966%20189.313C156.722%20189.207%20156.47%20189.12%20156.212%20189.053L134.642%20183.498L115.598%20181.28C115.32%20181.248%20115.039%20181.239%20114.759%20181.253L93.2054%20182.38C92.9265%20182.394%2092.6493%20182.432%2092.3767%20182.493L72.3782%20186.96L52.1128%20193.684C51.8508%20193.771%2051.5964%20193.88%2051.3523%20194.009L30.0474%20205.263L15.9227%20214.159C11.3991%20217.008%206.16338%20211.724%209.05253%20207.225L18.0312%20193.244L26.1703%20177.942L33.03%20160.852L40.0008%20133.277C40.0836%20132.95%2040.133%20132.615%2040.1483%20132.277L41.2088%20108.832C41.2216%20108.549%2041.2104%20108.266%2041.1752%20107.985L37.2945%2076.9864C37.2429%2076.574%2037.14%2076.1696%2036.9884%2075.7827L26.8364%2049.8781C26.7491%2049.6552%2026.6458%2049.4389%2026.5275%2049.2308L15.9527%2030.6342L0.87146%208.04027Z%22%20fill%3D%22url%28%23pattern0_1168_343%29%22%2F%3E%20%20%3Cdefs%3E%20%20%20%20%3Cpattern%20id%3D%22pattern0_1168_343%22%20patternUnits%3D%22userSpaceOnUse%22%20patternTransform%3D%22matrix%284.28304%20-4.28413%204.71404%204.71523%20-101.391%20103.538%29%22%20preserveAspectRatio%3D%22none%22%20viewBox%3D%2215.3594%2022.6016%20201.93%20222.25%22%20width%3D%221%22%20height%3D%221%22%3E%20%20%20%20%20%20%3Cg%20id%3D%22pattern0_1168_343_inner%22%3E%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M74.2117%2026.5152C75.2622%2021.2484%2083.3188%2021.3292%2084.6373%2026.5354C88.6999%2042.5762%2093.807%2052.1527%20102.548%2062.1325C113.95%2072.9426%20123.867%2078.746%20141.357%2083.488C145.376%2084.5776%20145.43%2090.6299%20141.372%2091.5657L132.206%2094.119C131.971%2094.1844%20131.742%2094.2668%20131.519%2094.3656L121.43%2098.844C121.211%2098.9411%20120.999%2099.0539%20120.796%2099.1814L111.064%20105.302C110.822%20105.454%20110.594%20105.626%20110.381%20105.818L102.861%20112.586C102.653%20112.773%20102.461%20112.978%20102.287%20113.198L96.5987%20120.379L91.0265%20129.522C90.8636%20129.79%2090.7262%20130.072%2090.616%20130.365L86.7273%20140.707L83.7306%20151.667C82.8621%20156.457%2075.9966%20156.45%2075.0931%20151.667L72.2727%20140.707L68.1884%20130.297C68.091%20130.049%2067.974%20129.809%2067.8384%20129.579L62.4013%20120.379L56.7134%20113.198C56.5394%20112.978%2056.3471%20112.773%2056.1388%20112.586L48.6112%20105.811C48.4037%20105.624%2048.1808%20105.455%2047.945%20105.306L39.6619%20100.051L30.5137%2095.4636C30.267%2095.3399%2030.0105%2095.2369%2029.7468%2095.1555L18.6851%2091.7424C14.2515%2090.7358%2014.2426%2084.401%2018.6851%2083.4343L26.7938%2080.9596L35.0787%2077.4242L46.8055%2070.4367C47.0955%2070.2638%2047.3673%2070.0621%2047.6167%2069.8345L55.7411%2062.4194C55.9503%2062.2285%2056.1428%2062.0202%2056.3167%2061.7967L65.3661%2050.1658C65.6214%2049.8377%2065.8348%2049.479%2066.0013%2049.0981L71.2473%2037.0973C71.3432%2036.8778%2071.4232%2036.6518%2071.4868%2036.4208L74.2117%2026.5152Z%22%20fill%3D%22%2300FFD2%22%2F%3E%20%20%20%20%20%20%3C%2Fg%3E%20%20%20%20%3C%2Fpattern%3E%3C%2Fdefs%3E%20%20%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22297%22%20height%3D%22189%22%20viewBox%3D%220%200%20297%20189%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M295.475%2068.9159C285.993%2068.9486%20276.028%2072.1653%20268.051%2076.5607C246.136%2088.6283%20239.243%20111.77%20239.074%20133.63C239.058%20135.458%20235.936%20135.455%20235.923%20133.63C235.752%20111.77%20228.861%2088.631%20206.947%2076.5607C198.969%2072.1681%20189.001%2068.9486%20179.522%2068.9159C177.49%2068.9077%20177.495%2066.0865%20179.522%2066.0784C189.004%2066.0483%20198.969%2062.8289%20206.947%2058.4335C228.861%2046.3659%20235.752%2023.2266%20235.923%201.36691C235.915%200.450181%20236.71%200%20237.499%200C238.29%200%20239.085%200.452909%20239.077%201.36691C239.243%2023.2266%20246.139%2046.3659%20268.053%2058.4362C276.031%2062.8289%20285.999%2066.0483%20295.478%2066.0811C297.51%2066.0893%20297.505%2068.9104%20295.478%2068.9186L295.475%2068.9159Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3Cpath%20d%3D%22M66.1416%20151.797C60.8029%20151.816%2055.1924%20153.626%2050.7008%20156.101C38.3624%20162.894%2034.4814%20175.923%2034.3863%20188.229C34.3774%20189.258%2032.6196%20189.256%2032.6122%20188.229C32.5156%20175.923%2028.6361%20162.896%2016.2977%20156.101C11.8061%20153.628%206.19407%20151.816%200.856955%20151.797C-0.287137%20151.792%20-0.284166%20150.204%200.856955%20150.2C6.19556%20150.183%2011.8061%20148.37%2016.2977%20145.896C28.6361%20139.102%2032.5156%20126.076%2032.6122%20113.77C32.6078%20113.253%2033.055%20113%2033.4993%20113C33.945%20113%2034.3922%20113.255%2034.3878%20113.77C34.4814%20126.076%2038.3639%20139.102%2050.7022%20145.897C55.1939%20148.37%2060.8059%20150.183%2066.143%20150.201C67.2871%20150.206%2067.2842%20151.794%2066.143%20151.799L66.1416%20151.797Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22218%22%20height%3D%22239%22%20viewBox%3D%220%200%20218%20239%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M215.208%20122.007C197.838%20122.065%20179.583%20127.759%20164.968%20135.541C124.822%20156.905%20112.194%20197.875%20111.885%20236.575C111.856%20239.811%20106.136%20239.806%20106.112%20236.575C105.798%20197.875%2093.1749%20156.91%2053.0289%20135.541C38.4141%20127.764%2020.154%20122.065%202.78832%20122.007C-0.934274%20121.992%20-0.924605%20116.998%202.78832%20116.983C20.1588%20116.93%2038.4141%20111.23%2053.0289%20103.449C93.1749%2082.0848%20105.798%2041.1197%20106.112%202.41994C106.098%200.796987%20107.553%200%20108.998%200C110.449%200%20111.904%200.801817%20111.889%202.41994C112.194%2041.1197%20124.827%2082.0848%20164.973%20103.454C179.587%20111.23%20197.848%20116.93%20215.213%20116.988C218.936%20117.002%20218.926%20121.997%20215.213%20122.011L215.208%20122.007Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22123%22%20height%3D%22135%22%20viewBox%3D%220%200%20123%20135%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M121.373%2068.9159C111.577%2068.9486%20101.281%2072.1653%2093.0387%2076.5607C70.3971%2088.6283%2063.2753%20111.77%2063.1008%20133.63C63.0844%20135.458%2059.8589%20135.455%2059.8452%20133.63C59.668%20111.77%2052.5489%2088.631%2029.9073%2076.5607C21.6648%2072.1681%2011.3665%2068.9486%201.57256%2068.9159C-0.526913%2068.9077%20-0.521459%2066.0865%201.57256%2066.0784C11.3692%2066.0483%2021.6648%2062.8289%2029.9073%2058.4335C52.5489%2046.3659%2059.668%2023.2266%2059.8452%201.36691C59.837%200.450181%2060.6577%200%2061.473%200C62.291%200%2063.1117%200.452909%2063.1035%201.36691C63.2753%2023.2266%2070.3998%2046.3659%2093.0414%2058.4362C101.284%2062.8289%20111.582%2066.0483%20121.376%2066.0811C123.476%2066.0893%20123.47%2068.9104%20121.376%2068.9186L121.373%2068.9159Z%22%20fill%3D%22%2300FFD2%22%20fill-opacity%3D%220.1%22%2F%3E%3C%2Fsvg%3E\"","import React from 'react';\nimport { Breadcrumb } from '@/components/atoms/Breadcrumb';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem, GridProps } from '@/components/atoms/Grid';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { Media } from '@/components/atoms/Media';\nimport { MediaBlock, MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport { toKebabCase } from '@/themes/utils';\nimport './Banner.scss';\n\ntype CTABannerVariant = 'hero' | 'videoBackground' | 'level2' | 'level2Video' | 'gated' | 'level3';\ntype Alignment = 'left' | 'center' | 'right';\ntype VerticalAlignment = 'top' | 'center' | 'bottom';\n\n/** Banner-specific media props — extends MediaBlockProps with layout constraints */\nexport interface BannerMediaProps extends MediaBlockProps {\n /** Width constraint for column media */\n width?: number | string;\n /** Height constraint for column media */\n height?: number | string;\n}\n\nexport interface BannerI extends DividerProps {\n bannerType: CTABannerVariant;\n gridGap?: GridProps['gap'];\n contentGap?: GridProps['gap'];\n\n // Content\n heading: string;\n headingLevel?: HeadingLevel;\n breadcrumbs?: BreadcrumbItem[];\n /** Button or link — pass `href` to render an <a>, omit it to render a <button> */\n button?: ButtonProps | ButtonLinkProps;\n\n /** Media for column display (level2, gated) or hero background */\n media?: BannerMediaProps;\n /** Background video URL for hero variant (autoplays, muted, no controls) */\n backgroundVideo?: string;\n\n // Overrides\n backgroundImage?: string;\n className?: string;\n align?: Alignment;\n verticalAlign?: VerticalAlignment;\n contentVerticalAlign?: VerticalAlignment;\n mediaVerticalAlign?: VerticalAlignment;\n}\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\n// Banner variant configuration - centralized for scalability\nconst BANNER_CONFIG: Record<CTABannerVariant, { columns: number; darkMode: boolean }> = {\n hero: { columns: 1, darkMode: true },\n videoBackground: { columns: 1, darkMode: true },\n level2: { columns: 2, darkMode: false },\n level2Video: { columns: 2, darkMode: false },\n gated: { columns: 2, darkMode: true },\n level3: { columns: 1, darkMode: true },\n};\n\n// Helper function to map alignment to CSS flexbox values\nconst mapAlignmentToFlex = (alignment: Alignment): string => {\n const alignmentMap: Record<Alignment, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n };\n return alignmentMap[alignment];\n};\n\n// Helper function to map vertical alignment to CSS values\nconst mapVerticalAlignment = (alignment?: VerticalAlignment): 'start' | 'center' | 'end' | undefined => {\n if (!alignment) return undefined;\n\n const verticalMap: Record<VerticalAlignment, 'start' | 'center' | 'end'> = {\n top: 'start',\n center: 'center',\n bottom: 'end',\n };\n return verticalMap[alignment];\n};\n\n/** Render the appropriate media element for column display */\nfunction renderColumnMedia(media: BannerMediaProps, darkMode: boolean) {\n // Destructure Banner-specific layout props; pass the rest straight to MediaBlock\n const { width, height, ...mediaBlockProps } = media;\n return <MediaBlock {...mediaBlockProps} />;\n}\n\nexport const Banner = ({\n children,\n align = 'left',\n verticalAlign = 'center',\n headingLevel = 'h1',\n ...props\n}: BannerI) => {\n const config = BANNER_CONFIG[props.bannerType];\n const hasBackgroundVideo =\n (props.bannerType === 'hero' || props.bannerType === 'videoBackground') && !!props.backgroundVideo;\n\n const BannerClass = [\n 'banner',\n `banner--${toKebabCase(props.bannerType)}`,\n hasBackgroundVideo && 'banner--has-bg-video',\n props.className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const contentStyle: React.CSSProperties = {\n textAlign: align,\n alignItems: mapAlignmentToFlex(align),\n };\n\n const gridAlignItems = mapVerticalAlignment(verticalAlign);\n const contentAlignSelf = mapVerticalAlignment(props.contentVerticalAlign);\n const mediaAlignSelf = mapVerticalAlignment(props.mediaVerticalAlign);\n\n return (\n <>\n <Divider className={BannerClass} verticalAlign={verticalAlign} {...props}>\n {children ? (\n children\n ) : (\n <>\n <Grid\n columns={{\n sm: 1,\n md: 1,\n lg: config.columns > 1 ? '1fr auto' : config.columns,\n }}\n maxColumnWidth={config.columns > 1 ? '630px' : undefined}\n justifyContent=\"center\"\n gap={props?.gridGap || 'sm'}\n alignItems={gridAlignItems}\n >\n {/* Column 1: Content */}\n <GridItem className=\"content\" style={contentAlignSelf ? { alignSelf: contentAlignSelf } : undefined}>\n <Grid columns={1} gap={props?.contentGap === 'none' ? '0' : props?.contentGap}>\n {props?.breadcrumbs && (\n <Breadcrumb items={props.breadcrumbs} separator=\"/\" darkMode={props?.darkMode} />\n )}\n {props?.heading && (\n <GridItem style={contentStyle}>\n <Heading level={headingLevel || 'h5'} variant=\"title\" darkMode={config.darkMode}>\n {props.heading}\n </Heading>\n </GridItem>\n )}\n {props?.button && (\n <GridItem style={contentStyle}>\n {'href' in props.button ? (\n <ButtonLink darkMode={config.darkMode} {...(props.button as ButtonLinkProps)} />\n ) : (\n <Button darkMode={config.darkMode} {...(props.button as ButtonProps)} />\n )}\n </GridItem>\n )}\n </Grid>\n </GridItem>\n\n {/* Column 2: Media (only if multi-column layout) */}\n {config.columns > 1 && props?.media && (\n <GridItem\n className=\"media\"\n colSpan={'auto'}\n style={mediaAlignSelf ? { alignSelf: mediaAlignSelf } : undefined}\n >\n {renderColumnMedia(props.media, config.darkMode)}\n </GridItem>\n )}\n </Grid>\n </>\n )}\n {/* Hero background video — absolutely positioned behind content */}\n {hasBackgroundVideo && (\n <div className=\"banner__bg-video\">\n <Media src={props.backgroundVideo!} type=\"video\" autoplay loop muted controls={false} objectFit=\"cover\" />\n </div>\n )}\n </Divider>\n\n {/* Background media for gated variant on mobile/tablet */}\n {props.bannerType === 'gated' &&\n props?.media &&\n (() => {\n const { width, height, ...mediaBlockProps } = props.media;\n return (\n <div className=\"banner__background-image\">\n <MediaBlock {...mediaBlockProps} overlay={false} />\n </div>\n );\n })()}\n </>\n );\n};\n","import React, { useId } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faXmark } from '@fortawesome/pro-solid-svg-icons';\nimport './TextInput.scss';\nimport { Paragraph } from '../Paragraph';\n\nexport interface TextInputValidation {\n /** Mark field as required */\n required?: boolean;\n /** Minimum character length */\n minLength?: number;\n /** Maximum character length */\n maxLength?: number;\n /** Regex pattern to validate against */\n pattern?: RegExp;\n /** Validate as email format */\n email?: boolean;\n /** Custom error message — overrides the default for any failed rule */\n errorMessage?: string;\n}\n\nexport interface TextInputProps {\n /** Field label (used for accessibility even when visually hidden) */\n label: string;\n /** Input name attribute */\n name: string;\n /** Input type */\n type?: 'text' | 'email' | 'tel' | 'url' | 'password';\n /** Placeholder / hint text */\n placeholder?: string;\n /** Current value (controlled) */\n value?: string;\n /** Change handler */\n onChange?: (value: string) => void;\n /** Blur handler */\n onBlur?: () => void;\n /** Validation rules */\n validation?: TextInputValidation;\n /** Error message to display */\n error?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Visually hide the label (remains accessible to screen readers) */\n hideLabel?: boolean;\n /** Show a clear (x) icon when the input has a value */\n clearable?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n}\n\nexport const TextInput: React.FC<TextInputProps> = ({\n label,\n name,\n type = 'text',\n placeholder,\n value,\n onChange,\n onBlur,\n validation,\n error,\n disabled = false,\n hideLabel = false,\n clearable = false,\n darkMode = false,\n className,\n}) => {\n const id = useId();\n const errorId = `${id}-error`;\n const isRequired = validation?.required;\n const showClear = clearable && !!value;\n\n const classes = ['text-input', error && 'text-input--error', disabled && 'text-input--disabled', className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n <label htmlFor={id} className={`text-input__label ${hideLabel ? 'sr-only' : ''}`}>\n {label}\n {isRequired && (\n <span className=\"text-input__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n <div className=\"text-input__wrapper\">\n <input\n id={id}\n name={name}\n type={type}\n className={`text-input__field ${showClear ? 'text-input__field--clearable' : ''}`}\n placeholder={placeholder}\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n onBlur={onBlur}\n disabled={disabled}\n required={isRequired}\n minLength={validation?.minLength}\n maxLength={validation?.maxLength}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={error ? errorId : undefined}\n />\n {showClear && (\n <button\n type=\"button\"\n className=\"text-input__clear\"\n onClick={() => onChange?.('')}\n aria-label={`Clear ${label}`}\n tabIndex={-1}\n >\n <FontAwesomeIcon icon={faXmark} />\n </button>\n )}\n </div>\n {error && (\n <Paragraph id={errorId} className=\"text-input__error\" role=\"alert\">\n {error}\n </Paragraph>\n )}\n </div>\n );\n};\n","import React, { useId, useRef, useState, useCallback, useEffect } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';\nimport './Dropdown.scss';\n\nexport interface DropdownProps {\n /** Field label */\n label?: string;\n /** Input name attribute */\n name: string;\n /** Placeholder text shown when nothing is selected */\n placeholder?: string;\n /** Whether the dropdown is open */\n isOpen?: boolean;\n /** Called when the dropdown open state changes */\n onToggle?: (isOpen: boolean) => void;\n /** Display value shown in the trigger (e.g. selected items summary) */\n displayValue?: string;\n /** Whether the field is required (shows asterisk on label) */\n required?: boolean;\n /** Error message to display */\n error?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n /** Dropdown panel content (e.g. checkbox list) */\n children?: React.ReactNode;\n}\n\n/**\n * Dropdown atom component providing a trigger button with label,\n * chevron icon, and a collapsible panel for custom content.\n */\nexport const Dropdown: React.FC<DropdownProps> = ({\n label,\n name,\n placeholder = 'Select from below',\n isOpen: controlledOpen,\n onToggle,\n displayValue,\n required,\n error,\n disabled = false,\n darkMode = false,\n className,\n children,\n}) => {\n const id = useId();\n const errorId = `${id}-error`;\n const listboxId = `${id}-listbox`;\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Support both controlled and uncontrolled open state\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n const handleToggle = useCallback(() => {\n if (disabled) return;\n const next = !isOpen;\n setInternalOpen(next);\n onToggle?.(next);\n }, [disabled, isOpen, onToggle]);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setInternalOpen(false);\n onToggle?.(false);\n }\n };\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onToggle]);\n\n // Close on Escape\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n setInternalOpen(false);\n onToggle?.(false);\n }\n },\n [isOpen, onToggle]\n );\n\n const classes = [\n 'dropdown',\n isOpen && 'dropdown--open',\n error && 'dropdown--error',\n disabled && 'dropdown--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={containerRef} className={classes} data-dark-mode={darkMode || undefined} onKeyDown={handleKeyDown}>\n {label && (\n <label htmlFor={id} className=\"dropdown__label\">\n {label}\n {required && (\n <span className=\"dropdown__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n <div className=\"dropdown__wrapper\">\n <button\n id={id}\n type=\"button\"\n className=\"dropdown__trigger\"\n onClick={handleToggle}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={error ? errorId : undefined}\n data-name={name}\n >\n <span className={`dropdown__value ${!displayValue ? 'dropdown__value--placeholder' : ''}`}>\n {displayValue || placeholder}\n </span>\n <span className=\"dropdown__chevron\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={isOpen ? faChevronUp : faChevronDown} />\n </span>\n </button>\n\n {isOpen && (\n <div id={listboxId} className=\"dropdown__panel\" role=\"listbox\" aria-label={label}>\n {children}\n </div>\n )}\n </div>\n\n {error && (\n <p id={errorId} className=\"dropdown__error\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n};\n","import React, { useId } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSquareCheck } from '@fortawesome/pro-solid-svg-icons';\nimport { faSquare } from '@fortawesome/pro-regular-svg-icons';\nimport './Checkbox.scss';\n\nexport interface CheckboxProps {\n /** Checkbox label text */\n label: string;\n /** Input name attribute */\n name: string;\n /** Whether the checkbox is checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n}\n\n/**\n * Checkbox atom component using FontAwesome icons for visual states.\n * Supports default, hover, active (checked), and focused states.\n */\nexport const Checkbox: React.FC<CheckboxProps> = ({\n label,\n name,\n checked = false,\n onChange,\n disabled = false,\n darkMode = false,\n className,\n}) => {\n const id = useId();\n\n const classes = ['checkbox', checked && 'checkbox--checked', disabled && 'checkbox--disabled', className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <label className={classes} data-dark-mode={darkMode || undefined} htmlFor={id}>\n <input\n id={id}\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n className=\"checkbox__input\"\n aria-checked={checked}\n />\n <span className=\"checkbox__icon\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={checked ? faSquareCheck : faSquare} />\n </span>\n <span className=\"checkbox__label\">{label}</span>\n </label>\n );\n};\n","import React, { useState, useCallback } from 'react';\nimport { Dropdown } from '@/components/atoms/Dropdown';\nimport { Checkbox } from '@/components/atoms/Checkbox';\nimport './DropdownSelect.scss';\n\nexport interface DropdownSelectOption {\n /** Unique value for the option */\n value: string;\n /** Display label for the option */\n label: string;\n}\n\nexport interface DropdownSelectValidation {\n /** Mark field as required (at least one selection) */\n required?: boolean;\n /** Minimum number of selections */\n minSelections?: number;\n /** Maximum number of selections */\n maxSelections?: number;\n /** Custom error message */\n errorMessage?: string;\n}\n\nexport interface DropdownSelectProps {\n /** Field label */\n label?: string;\n /** Input name attribute */\n name: string;\n /** Placeholder text when nothing is selected */\n placeholder?: string;\n /** Available options */\n options: DropdownSelectOption[];\n /** Currently selected values (controlled) */\n value?: string[];\n /** Change handler with selected values */\n onChange?: (values: string[]) => void;\n /** Blur handler (when dropdown closes) */\n onBlur?: () => void;\n /** Validation rules */\n validation?: DropdownSelectValidation;\n /** Error message to display */\n error?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n}\n\n/**\n * DropdownSelect molecule combining a Dropdown trigger with a\n * checkbox list panel. Supports multi-select with validation.\n */\nexport const DropdownSelect: React.FC<DropdownSelectProps> = ({\n label,\n name,\n placeholder = 'Select from below',\n options,\n value: controlledValue,\n onChange,\n onBlur,\n validation,\n error,\n disabled = false,\n darkMode = false,\n className,\n}) => {\n const [internalValue, setInternalValue] = useState<string[]>([]);\n const selectedValues = controlledValue !== undefined ? controlledValue : internalValue;\n\n const handleToggleOption = useCallback(\n (optionValue: string, checked: boolean) => {\n const next = checked ? [...selectedValues, optionValue] : selectedValues.filter((v) => v !== optionValue);\n\n setInternalValue(next);\n onChange?.(next);\n },\n [selectedValues, onChange]\n );\n\n const handleDropdownClose = useCallback(\n (isOpen: boolean) => {\n if (!isOpen) {\n onBlur?.();\n }\n },\n [onBlur]\n );\n\n // No display value — always show placeholder regardless of selection\n const displayValue = '';\n\n const classes = ['dropdown-select', className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n <Dropdown\n label={label}\n name={name}\n placeholder={placeholder}\n displayValue={displayValue}\n onToggle={handleDropdownClose}\n required={validation?.required}\n error={error}\n disabled={disabled}\n darkMode={darkMode}\n >\n <div className=\"dropdown-select__options\" role=\"group\" aria-label={label}>\n {options.map((option) => (\n <div\n key={option.value}\n className=\"dropdown-select__option\"\n role=\"option\"\n aria-selected={selectedValues.includes(option.value)}\n >\n <Checkbox\n label={option.label}\n name={`${name}-${option.value}`}\n checked={selectedValues.includes(option.value)}\n onChange={(checked) => handleToggleOption(option.value, checked)}\n disabled={disabled}\n darkMode={darkMode}\n />\n </div>\n ))}\n </div>\n </Dropdown>\n </div>\n );\n};\n","import React, { useState, useCallback, useRef } from 'react';\nimport { Button } from '@/components/atoms/Button';\nimport { Grid, GridProps, GridItem, GridItemProps } from '@/components/atoms/Grid';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { TextInput, TextInputValidation } from '@/components/atoms/TextInput';\nimport {\n DropdownSelect,\n DropdownSelectOption,\n DropdownSelectValidation,\n} from '@/components/molecules/primax/DropdownSelect';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './Form.scss';\n\nexport interface FormField {\n /** Unique field name (used as form data key) */\n name: string;\n /** Field label */\n label: string;\n /** Input type — includes 'dropdown-select' for multi-select dropdown */\n type?: 'text' | 'email' | 'tel' | 'url' | 'dropdown-select';\n /** Placeholder text */\n placeholder?: string;\n /** Visually hide the label (remains accessible to screen readers) */\n hideLabel?: boolean;\n /** Show a clear (x) icon when the input has a value */\n clearable?: boolean;\n /** Column span — number or responsive object { sm, md, lg } */\n colSpan?: GridItemProps['colSpan'];\n /** Validation rules (for text inputs) */\n validation?: TextInputValidation;\n /** Options for dropdown-select type */\n options?: DropdownSelectOption[];\n /** Validation rules for dropdown-select type */\n dropdownValidation?: DropdownSelectValidation;\n}\n\nexport interface FormProps {\n /** Form heading */\n heading?: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Heading visual variant */\n headingVariant?: string;\n /** Form field configuration */\n fields: FormField[];\n /** Grid columns — number, string, or responsive object { sm, md, lg } */\n columns?: GridProps['columns'];\n /** Grid gap — string or responsive object { sm, md, lg } */\n gap?: GridProps['gap'];\n /** Grid row gap — string or responsive object { sm, md, lg } */\n rowGap?: GridProps['rowGap'];\n /** Grid column gap — string or responsive object { sm, md, lg } */\n columnGap?: GridProps['columnGap'];\n /** Submit button label */\n submitLabel?: string;\n /** When provided, the submit button is placed inside the fields grid as a GridItem */\n submitColSpan?: GridItemProps['colSpan'];\n /** Loading state — disables button and shows spinner */\n loading?: boolean;\n /** Disclaimer text (supports HTML for links) */\n disclaimer?: string;\n /** Called with collected form data on valid submission */\n onSubmit?: (data: Record<string, string>) => void;\n /** Async or cross-field validation escape hatch. Return error map or null. */\n onValidate?: (data: Record<string, string>) => Record<string, string> | null | Promise<Record<string, string> | null>;\n /** Called when validation fails with the error map */\n onError?: (errors: Record<string, string>) => void;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional class */\n className?: string;\n /** Children rendered after the form fields and before the submit button */\n children?: React.ReactNode;\n}\n\n/** Email regex — simple but covers common cases */\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nexport function validateField(value: string, field: FormField): string | undefined {\n // Handle dropdown-select validation\n if (field.type === 'dropdown-select') {\n const v = field.dropdownValidation;\n if (!v) return undefined;\n const custom = v.errorMessage;\n const selections = value ? value.split(',') : [];\n\n if (v.required && selections.length === 0) {\n return custom ?? 'Please select at least one option.';\n }\n if (v.minSelections && selections.length < v.minSelections) {\n return custom ?? `Please select at least ${v.minSelections} option(s).`;\n }\n if (v.maxSelections && selections.length > v.maxSelections) {\n return custom ?? `Please select no more than ${v.maxSelections} option(s).`;\n }\n return undefined;\n }\n\n // Handle text input validation\n const v = field.validation;\n if (!v) return undefined;\n const custom = v.errorMessage;\n\n if (v.required && !value.trim()) {\n return custom ?? `This field is required.`;\n }\n if (v.email && value.trim() && !EMAIL_RE.test(value.trim())) {\n return custom ?? 'Please enter a valid email address.';\n }\n if (v.minLength && value.trim().length < v.minLength) {\n return custom ?? `Must be at least ${v.minLength} characters.`;\n }\n if (v.maxLength && value.trim().length > v.maxLength) {\n return custom ?? `Must be no more than ${v.maxLength} characters.`;\n }\n if (v.pattern && !v.pattern.test(value.trim())) {\n return custom ?? `${field.label} is not valid.`;\n }\n return undefined;\n}\n\nexport const Form: React.FC<FormProps> = ({\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n fields,\n columns = { sm: 1, md: 2, lg: 3 },\n gap,\n rowGap,\n columnGap,\n submitLabel = 'Submit',\n submitColSpan,\n loading = false,\n disclaimer,\n onSubmit,\n onValidate,\n onError,\n darkMode = false,\n className,\n children,\n}) => {\n const formRef = useRef<HTMLFormElement>(null);\n\n const [values, setValues] = useState<Record<string, string>>(() =>\n Object.fromEntries(fields.map((f) => [f.name, '']))\n );\n const [dropdownValues, setDropdownValues] = useState<Record<string, string[]>>(() =>\n Object.fromEntries(fields.filter((f) => f.type === 'dropdown-select').map((f) => [f.name, []]))\n );\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n const handleChange = useCallback((name: string, value: string) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n // Clear error on change\n setErrors((prev) => {\n if (!prev[name]) return prev;\n const next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const handleDropdownChange = useCallback((name: string, selected: string[]) => {\n setDropdownValues((prev) => ({ ...prev, [name]: selected }));\n // Store as comma-separated in values for form submission\n setValues((prev) => ({ ...prev, [name]: selected.join(',') }));\n // Clear error on change\n setErrors((prev) => {\n if (!prev[name]) return prev;\n const next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const handleBlur = useCallback(\n (field: FormField) => {\n setTouched((prev) => ({ ...prev, [field.name]: true }));\n const err = validateField(values[field.name] ?? '', field);\n if (err) {\n setErrors((prev) => ({ ...prev, [field.name]: err }));\n }\n },\n [values]\n );\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Run built-in validation\n const fieldErrors: Record<string, string> = {};\n fields.forEach((field) => {\n const err = validateField(values[field.name] ?? '', field);\n if (err) fieldErrors[field.name] = err;\n });\n\n // Run custom validation if provided\n if (onValidate) {\n const custom = await onValidate(values);\n if (custom) Object.assign(fieldErrors, custom);\n }\n\n if (Object.keys(fieldErrors).length > 0) {\n setErrors(fieldErrors);\n setTouched(Object.fromEntries(fields.map((f) => [f.name, true])));\n onError?.(fieldErrors);\n return;\n }\n\n onSubmit?.(values);\n },\n [fields, values, onSubmit, onValidate, onError]\n );\n\n const hasErrors = Object.keys(errors).length > 0;\n\n const classes = ['primax-form', className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} data-dark-mode={darkMode || undefined}>\n {heading && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode} className=\"primax-form__heading\">\n {heading}\n </Heading>\n )}\n\n <form ref={formRef} className=\"primax-form__form\" onSubmit={handleSubmit} noValidate>\n <Grid columns={columns} gap={gap} className=\"primax-form__fields\" rowGap={rowGap} columnGap={columnGap}>\n {fields.map((field) => (\n <GridItem key={field.name} colSpan={field.colSpan}>\n {field.type === 'dropdown-select' ? (\n <DropdownSelect\n name={field.name}\n label={field.label}\n placeholder={field.placeholder}\n options={field.options ?? []}\n value={dropdownValues[field.name] ?? []}\n onChange={(selected) => handleDropdownChange(field.name, selected)}\n onBlur={() => handleBlur(field)}\n validation={field.dropdownValidation}\n error={touched[field.name] ? errors[field.name] : undefined}\n darkMode={darkMode}\n />\n ) : (\n <TextInput\n name={field.name}\n label={field.label}\n type={field.type ?? 'text'}\n placeholder={field.placeholder}\n value={values[field.name] ?? ''}\n onChange={(v) => handleChange(field.name, v)}\n onBlur={() => handleBlur(field)}\n validation={field.validation}\n error={touched[field.name] ? errors[field.name] : undefined}\n hideLabel={field.hideLabel}\n clearable={field.clearable}\n darkMode={darkMode}\n />\n )}\n </GridItem>\n ))}\n\n {submitColSpan && (\n <GridItem colSpan={submitColSpan} className=\"primax-form__submit-grid-item\">\n <Button\n buttonType=\"general\"\n size=\"md\"\n darkMode={darkMode}\n disabled={loading || hasErrors}\n className=\"primax-form__submit\"\n onClick={() => formRef.current?.requestSubmit()}\n >\n {loading ? 'Submitting' : submitLabel}\n </Button>\n </GridItem>\n )}\n </Grid>\n\n {children}\n\n {!submitColSpan && (\n <Button\n buttonType=\"general\"\n size=\"md\"\n darkMode={darkMode}\n disabled={loading || hasErrors}\n className=\"primax-form__submit\"\n onClick={() => formRef.current?.requestSubmit()}\n >\n {loading ? 'Submitting' : submitLabel}\n </Button>\n )}\n\n {disclaimer && (\n <Paragraph\n className=\"primax-form__disclaimer\"\n darkMode={darkMode}\n dangerouslySetInnerHTML={{ __html: disclaimer }}\n />\n )}\n </form>\n </div>\n );\n};\n","import React from 'react';\nimport { Form, FormField } from '@/components/molecules/primax/Form';\nimport { Container } from '@/components/atoms/Container';\nimport { Divider } from '@/components/atoms/Divider';\nimport { HeadingLevel } from '@/components/atoms/Heading';\nimport { GridProps, GridItemProps } from '@/components/atoms/Grid';\nimport './Subscribe.scss';\n\nexport type SubscribeField = FormField;\n\nexport type SubscribeVariant = 'divider-dark' | 'divider-light' | 'divider-white' | 'dark' | 'light' | 'white';\n\nexport interface SubscribeProps {\n /** Section heading */\n heading: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Heading visual variant */\n headingVariant?: string;\n /** Form field configuration */\n fields: SubscribeField[];\n /** Grid columns — number, string, or responsive object { sm, md, lg } */\n columns?: GridProps['columns'];\n /** Grid gap — string or responsive object { sm, md, lg } */\n gap?: GridProps['gap'];\n /** Grid row gap — string or responsive object { sm, md, lg } */\n rowGap?: GridProps['rowGap'];\n /** Grid column gap — string or responsive object { sm, md, lg } */\n columnGap?: GridProps['columnGap'];\n /** Submit button label */\n submitLabel?: string;\n /** When provided, the submit button is placed inside the fields grid as a GridItem */\n submitColSpan?: GridItemProps['colSpan'];\n /** Loading state — disables button and shows spinner */\n loading?: boolean;\n /** Disclaimer text (supports HTML for links) */\n disclaimer?: string;\n /** Called with collected form data on valid submission */\n onSubmit?: (data: Record<string, string>) => void;\n /** Async or cross-field validation escape hatch. Return error map or null. */\n onValidate?: (data: Record<string, string>) => Record<string, string> | null | Promise<Record<string, string> | null>;\n /** Called when validation fails with the error map */\n onError?: (errors: Record<string, string>) => void;\n /** Dark mode */\n darkMode?: boolean;\n /** Container and background variant. */\n variant?: SubscribeVariant;\n /** Additional class */\n className?: string;\n}\n\nconst VARIANT_CONFIG: Record<\n SubscribeVariant,\n { useDivider: boolean; backgroundColor: string; isDark: boolean; backgroundPattern: 'sparks' | 'none' }\n> = {\n 'divider-dark': {\n useDivider: true,\n backgroundColor: 'var(--color-primary-950)',\n isDark: true,\n backgroundPattern: 'none',\n },\n 'divider-light': {\n useDivider: true,\n backgroundColor: 'var(--color-neutral-75)',\n isDark: false,\n backgroundPattern: 'none',\n },\n 'divider-white': {\n useDivider: true,\n backgroundColor: 'var(--color-neutral-00)',\n isDark: false,\n backgroundPattern: 'none',\n },\n dark: {\n useDivider: false,\n backgroundColor: 'var(--color-primary-950)',\n isDark: true,\n backgroundPattern: 'none',\n },\n light: {\n useDivider: false,\n backgroundColor: 'var(--color-neutral-75)',\n isDark: false,\n backgroundPattern: 'none',\n },\n white: {\n useDivider: false,\n backgroundColor: 'var(--color-neutral-00)',\n isDark: false,\n backgroundPattern: 'none',\n },\n};\n\nexport const Subscribe: React.FC<SubscribeProps> = ({\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n fields,\n columns = { sm: 1, md: 2, lg: 3 },\n gap,\n rowGap,\n columnGap,\n submitLabel = 'Submit',\n submitColSpan,\n loading = false,\n disclaimer,\n onSubmit,\n onValidate,\n onError,\n darkMode,\n variant,\n className,\n}) => {\n const config = variant ? VARIANT_CONFIG[variant] : null;\n const resolvedDarkMode = config ? config.isDark : (darkMode ?? false);\n\n const classes = [className].filter(Boolean).join(' ');\n\n const formContent = (\n <Form\n heading={heading}\n headingLevel={headingLevel}\n headingVariant={headingVariant}\n fields={fields}\n columns={columns}\n gap={gap}\n rowGap={rowGap}\n columnGap={columnGap}\n submitLabel={submitLabel}\n submitColSpan={submitColSpan}\n loading={loading}\n disclaimer={disclaimer}\n onSubmit={onSubmit}\n onValidate={onValidate}\n onError={onError}\n darkMode={resolvedDarkMode}\n />\n );\n\n if (config?.useDivider) {\n return (\n <Divider\n className={classes}\n backgroundColor={config.backgroundColor}\n backgroundPattern={config.backgroundPattern}\n shapeDivider=\"both\"\n darkMode={resolvedDarkMode}\n >\n <Container className=\"subscribe subscribe--no-padding\">{formContent}</Container>\n </Divider>\n );\n }\n\n return (\n <section\n className={`subscribe ${classes}`}\n data-dark-mode={resolvedDarkMode || undefined}\n aria-label={heading}\n style={config ? { backgroundColor: config.backgroundColor } : undefined}\n >\n <Container>{formContent}</Container>\n </section>\n );\n};\n","import React from 'react';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport './TwoColumn.scss';\n\nexport type TwoColumnVariation = 'left-first' | 'right-first';\n\nexport interface TwoColumnRow {\n /** Content for the left column */\n left: React.ReactNode;\n /** Content for the right column */\n right: React.ReactNode;\n /** Column order on desktop — stacks vertically on mobile */\n variation?: TwoColumnVariation;\n /** Vertical alignment of columns */\n verticalAlign?: 'top' | 'center' | 'bottom';\n}\n\nexport interface TwoColumnProps extends DividerProps {\n /** Content for the left column (single-row shorthand) */\n left?: React.ReactNode;\n /** Content for the right column (single-row shorthand) */\n right?: React.ReactNode;\n /** Column order on desktop — stacks vertically on mobile (single-row shorthand) */\n variation?: TwoColumnVariation;\n /** Vertical alignment of columns (single-row shorthand, also default for rows) */\n verticalAlign?: 'top' | 'center' | 'bottom';\n /** Multiple rows of two-column content */\n rows?: TwoColumnRow[];\n /** Gap between columns — responsive object or single value */\n gap?: string | { xs?: string; sm?: string; md?: string; lg?: string };\n /** Additional class name */\n className?: string;\n}\n\nconst verticalAlignMap: Record<string, 'start' | 'center' | 'end'> = {\n top: 'start',\n center: 'center',\n bottom: 'end',\n};\n\nexport const TwoColumn: React.FC<TwoColumnProps> = ({\n left,\n right,\n rows,\n variation = 'left-first',\n verticalAlign = 'top',\n gap,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n children: _children,\n ...rest\n}) => {\n const baseClass = 'primax-two-column';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n // Build the list of rows: use `rows` prop if provided, otherwise fall back to single left/right\n const resolvedRows: TwoColumnRow[] = rows ?? [{ left, right, variation, verticalAlign }];\n\n return (\n <Divider\n backgroundColor={backgroundColor}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {resolvedRows.map((row, index) => {\n const rowVariation = row.variation ?? variation;\n const rowAlign = row.verticalAlign ?? verticalAlign;\n const isReversed = rowVariation === 'right-first';\n\n return (\n <Grid\n key={index}\n columns={{ sm: 1, md: 1, lg: 2 }}\n maxColumnWidth=\"630px\"\n justifyContent=\"center\"\n alignItems={verticalAlignMap[rowAlign]}\n className={`${baseClass}__grid`}\n gap={gap}\n >\n <GridItem\n className={`${baseClass}__col ${baseClass}__col--left`}\n style={isReversed ? { order: 2 } : undefined}\n >\n {row.left}\n </GridItem>\n <GridItem\n className={`${baseClass}__col ${baseClass}__col--right`}\n style={isReversed ? { order: 1 } : undefined}\n >\n {row.right}\n </GridItem>\n </Grid>\n );\n })}\n </Divider>\n );\n};\n","import React from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { Image } from '@/components/atoms/Image';\nimport type { ImageProps } from '@/components/atoms/Image';\nimport './Card.scss';\n\nexport type PrimaxCardVariant = 'icon' | 'image' | 'profile';\nexport type PrimaxCardButtonVariant = 'general' | 'link';\n\nexport interface PrimaxCardProps {\n /** Card layout variant */\n variant?: PrimaxCardVariant;\n /** SVG icon element (for icon variant) */\n icon?: React.ReactNode;\n /** Image configuration (for image/profile variants) — renders via Media atom */\n image?: ImageProps;\n /** Card title */\n title: string;\n /** HTML element for the title. Defaults to 'p' for image variant, 'h4' for others.\n * Use 'p' or 'span' when cards are repeated in lists to avoid heading hierarchy issues. */\n titleAs?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';\n /** Card description text */\n description?: string;\n /** Optional metadata slot (e.g. asset type, duration) */\n metadata?: React.ReactNode;\n /** Text alignment */\n textAlign?: 'left' | 'center';\n /** Visual button props — purely decorative, the card itself is the link */\n button?: Omit<ButtonProps, 'buttonType'>;\n /** Button style: solid primary or text link */\n buttonVariant?: PrimaxCardButtonVariant;\n /** Card destination URL */\n href: string;\n /** Link target */\n target?: '_blank' | '_self';\n /** Dark mode */\n darkMode?: boolean;\n /** Enable/disable hover animation - overrides theme default */\n animated?: boolean;\n /** Additional class */\n className?: string;\n /** Children rendered after description, before button */\n children?: React.ReactNode;\n /** Accessible label */\n 'aria-label'?: string;\n}\n\nexport const Card: React.FC<PrimaxCardProps> = ({\n variant = 'icon',\n icon,\n image,\n title,\n titleAs,\n description,\n metadata,\n textAlign,\n button,\n buttonVariant = 'general',\n href,\n target = '_self',\n darkMode = false,\n animated,\n className,\n children,\n 'aria-label': ariaLabel,\n}) => {\n const align = textAlign ?? (variant === 'image' ? 'left' : 'center');\n\n // Default to 'p' for image (insight) variant to avoid heading hierarchy issues\n // when many cards are rendered in a list. Other variants default to 'h4'.\n const resolvedTitleAs = titleAs ?? (variant === 'image' ? 'p' : 'h4');\n\n const cardClasses = ['primax-card', `primax-card--${variant}`, `primax-card--align-${align}`, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n className={cardClasses}\n data-dark-mode={darkMode || undefined}\n data-animated={animated !== undefined ? (animated ? 'true' : 'false') : undefined}\n aria-label={ariaLabel || title}\n >\n {(variant === 'image' || variant === 'profile') && image && (\n <div className=\"primax-card__image-wrapper\">\n <Image\n src={image.src}\n alt={image.alt ?? ''}\n objectFit={image.objectFit ?? 'cover'}\n objectPosition={image.objectPosition}\n aspectRatio={image.aspectRatio}\n srcSet={image.srcSet}\n sizes={image.sizes}\n loading={image.loading ?? 'lazy'}\n />\n </div>\n )}\n\n <div className=\"primax-card__content\">\n {variant === 'icon' && icon && (\n <div className=\"primax-card__icon\" aria-hidden=\"true\">\n {icon}\n </div>\n )}\n\n {metadata && <div className=\"primax-card__metadata\">{metadata}</div>}\n\n <div className=\"primax-card__text\">\n {resolvedTitleAs === 'p' || resolvedTitleAs === 'span' ? (\n <Paragraph as={resolvedTitleAs} weight=\"bold\" className=\"primax-card__title\" darkMode={darkMode}>\n {title}\n </Paragraph>\n ) : (\n <Heading\n level={resolvedTitleAs}\n variant=\"componentTitle\"\n className=\"primax-card__title\"\n darkMode={darkMode}\n >\n {title}\n </Heading>\n )}\n\n {description && (\n <Paragraph className=\"primax-card__description\" darkMode={darkMode}>\n {description}\n </Paragraph>\n )}\n </div>\n\n {button && buttonVariant === 'link' && (\n <div className=\"primax-card__action primax-card__action--link\" aria-hidden=\"true\">\n <Button {...button} buttonType=\"link\" darkMode={darkMode} />\n </div>\n )}\n\n {children}\n </div>\n\n {button && buttonVariant !== 'link' && (\n <div className=\"primax-card__action primax-card__action--button\" aria-hidden=\"true\">\n <Button {...button} buttonType=\"general\" darkMode={darkMode} />\n </div>\n )}\n </a>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { IconName, IconPrefix } from '@fortawesome/fontawesome-svg-core';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport './IconListItem.scss';\n\nexport interface IconListItemProps {\n /** FontAwesome icon name (e.g. \"credit-card\", \"chart-line\") — renders with 'fal' (light) prefix by default */\n icon: string;\n /** FontAwesome icon prefix (default: 'fal' for light) */\n iconPrefix?: IconPrefix;\n /** Title text */\n title?: string;\n /** Description text */\n description?: string;\n /** Button link config — renders when provided. Uses ButtonLinkProps. */\n button?: ButtonLinkProps;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\nexport const IconListItem: React.FC<IconListItemProps> = ({\n icon,\n iconPrefix = 'fal',\n title,\n description,\n button,\n darkMode = false,\n className,\n}) => {\n const baseClass = 'icon-list-item';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n return (\n <li className={classes} data-dark-mode={darkMode || undefined}>\n <div className={`${baseClass}__icon-block`}>\n <FontAwesomeIcon icon={[iconPrefix, icon as IconName]} className={`${baseClass}__icon`} aria-hidden=\"true\" />\n </div>\n\n <div className={`${baseClass}__content`}>\n <div className={`${baseClass}__text-content`}>\n {title && (\n <Heading level=\"h3\" variant=\"componentTitle\" darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n )}\n\n {description && (\n <Paragraph darkMode={darkMode} className={`${baseClass}__description`}>\n {description}\n </Paragraph>\n )}\n </div>\n\n {button && (\n <div className={`${baseClass}__link-wrap`}>\n <ButtonLink\n buttonType=\"link\"\n size=\"md\"\n darkMode={darkMode}\n {...button}\n className={`${baseClass}__link${button.className ? ` ${button.className}` : ''}`}\n />\n </div>\n )}\n </div>\n </li>\n );\n};\n","import React from 'react';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Container } from '@/components/atoms/Container';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport type { GridProps } from '@/components/atoms/Grid/Grid';\nimport { ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { IconListItem } from '@/components/molecules/primax/IconListItem';\nimport './IconBulletList.scss';\n\nexport type IconBulletListBackground = 'white' | 'light' | 'dark';\n\nexport interface IconBulletListItem {\n /** FontAwesome icon name */\n icon: string;\n /** Title text */\n title?: string;\n /** Description text */\n description?: string;\n /** Button link config — renders when provided. Uses ButtonLinkProps. */\n button?: ButtonLinkProps;\n}\n\nexport interface IconBulletListProps extends Omit<DividerProps, 'children'> {\n /** Section title displayed above the list */\n title?: string;\n /** Array of list items */\n items: IconBulletListItem[];\n /** Grid columns config */\n columns?: GridProps['columns'];\n /** Grid gap config */\n gap?: GridProps['gap'];\n /** Background style preset */\n background?: IconBulletListBackground;\n}\n\n/** Map background option to Divider backgroundColor */\nfunction getBackgroundColor(background: IconBulletListBackground): string {\n switch (background) {\n case 'white':\n return 'var(--color-neutral-00)';\n case 'light':\n return 'var(--background-color)';\n case 'dark':\n return 'var(--dark-background-color)';\n }\n}\n\n/**\n * IconBulletList — A grid of IconListItems with an optional section title,\n * wrapped in a Divider for background/shape control.\n */\nexport const IconBulletList: React.FC<IconBulletListProps> = ({\n title,\n items,\n columns = { sm: 1, md: 1, lg: 2 },\n gap = { sm: '1.875rem', md: '1.875rem', lg: '1.875rem 3.75rem' },\n background = 'white',\n darkMode: darkModeProp,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n ...rest\n}) => {\n const baseClass = 'icon-bullet-list';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n // Derive dark mode from the background preset so consumers don't need to\n // redundantly pass both `background=\"dark\"` and/or `darkMode={true}`. An explicit\n // `darkMode` prop still takes priority, allowing opt-out when needed.\n const darkMode = darkModeProp ?? background === 'dark';\n const resolvedBg = backgroundColor ?? getBackgroundColor(background);\n\n return (\n <Divider\n backgroundColor={resolvedBg}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {title && (\n <Heading level=\"h2\" variant=\"sectionDivider\" darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n )}\n\n <Container>\n <Grid columns={columns} gap={gap} className={`${baseClass}__grid`}>\n {items.map((item, index) => (\n <GridItem key={index}>\n <IconListItem\n icon={item.icon}\n title={item.title}\n description={item.description}\n button={item.button}\n darkMode={darkMode}\n />\n </GridItem>\n ))}\n </Grid>\n </Container>\n </Divider>\n );\n};\n","import React from 'react';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport { MediaBlock, MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport './OverflowMediaSection.scss';\n\nexport type OverflowMediaPosition = 'left' | 'right';\nexport type OverflowMediaStackBreakpoint = 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface OverflowMediaSectionProps extends DividerProps {\n /** Content rendered opposite the media block */\n children: React.ReactNode;\n /** Header content rendered above the two-column layout (full-width, centered) */\n header?: React.ReactNode;\n /** Media block props (thumbnail, accentBorder, sparkle, etc.) */\n media: MediaBlockProps;\n /** Which side the media appears on (default: 'left') */\n mediaPosition?: OverflowMediaPosition;\n /** Breakpoint at which the layout stacks to single column */\n stackAt?: OverflowMediaStackBreakpoint;\n}\n\n/**\n * OverflowMediaSection — A two-column layout where the media block\n * is allowed to overflow its container and gets clipped at the section boundary.\n * On resize, the media gracefully clips rather than shrinking.\n *\n * Supports an optional `header` slot that renders above the grid, spanning full width.\n *\n * Used by AccordionWithMedia and IconBulletSection.\n */\nexport const OverflowMediaSection: React.FC<OverflowMediaSectionProps> = ({\n children,\n header,\n media,\n mediaPosition = 'left',\n stackAt,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n ...rest\n}) => {\n const baseClass = 'overflow-media-section';\n const classes = [baseClass, `${baseClass}--media-${mediaPosition}`, `${baseClass}--stack-${stackAt}`, className]\n .filter(Boolean)\n .join(' ');\n\n const shouldMirror = media.mirror ?? mediaPosition === 'right';\n const isReversed = mediaPosition === 'right';\n\n const mediaColumn = (\n <div className={`${baseClass}__media`}>\n <MediaBlock {...media} mirror={shouldMirror} />\n </div>\n );\n\n const contentColumn = <div className={`${baseClass}__content`}>{children}</div>;\n\n return (\n <Divider\n backgroundColor={backgroundColor}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {header && <div className={`${baseClass}__header`}>{header}</div>}\n\n <Grid\n columns={{ sm: 1, md: 1, lg: 2 }}\n maxColumnWidth=\"630px\"\n justifyContent=\"center\"\n alignItems=\"center\"\n className={`${baseClass}__grid`}\n >\n <GridItem className={`${baseClass}__col ${baseClass}__col--left`}>\n {isReversed ? contentColumn : mediaColumn}\n </GridItem>\n <GridItem className={`${baseClass}__col ${baseClass}__col--right`}>\n {isReversed ? mediaColumn : contentColumn}\n </GridItem>\n </Grid>\n </Divider>\n );\n};\n","import React from 'react';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { DividerProps } from '@/components/atoms/Divider';\nimport { MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport { OverflowMediaSection } from '@/components/molecules/primax/OverflowMediaSection';\nimport type { OverflowMediaStackBreakpoint } from '@/components/molecules/primax/OverflowMediaSection';\nimport { IconListItem } from '@/components/molecules/primax/IconListItem';\nimport { IconBulletListItem } from '@/components/molecules/primax/IconBulletList';\nimport './IconBulletSection.scss';\n\nexport type IconBulletSectionBackground = 'white' | 'light' | 'dark' | 'divider';\nexport type IconBulletSectionMediaPosition = 'left' | 'right';\n\nexport interface IconBulletSectionProps extends DividerProps {\n /** Section title displayed above the list */\n title?: string;\n /** Heading level (default: 'h2') */\n headingLevel?: HeadingProps['level'];\n /** Heading variant (default: 'sectionDivider') */\n headingVariant?: HeadingProps['variant'];\n /** Array of list items */\n items: IconBulletListItem[];\n /** Media block props (image/video) */\n media: MediaBlockProps;\n /** Position of the media block relative to the list */\n mediaPosition?: IconBulletSectionMediaPosition;\n /** Breakpoint at which the layout stacks to single column (default: 'lg') */\n stackAt?: OverflowMediaStackBreakpoint;\n /** Background style — controls divider wrapper background */\n background?: IconBulletSectionBackground;\n /** Dark mode styling — cascades to children */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/** Map background option to Divider backgroundColor */\nfunction getBackgroundColor(background: IconBulletSectionBackground): string | undefined {\n switch (background) {\n case 'white':\n return 'var(--color-neutral-00)';\n case 'light':\n return 'var(--background-color)';\n case 'dark':\n return 'var(--dark-background-color)';\n case 'divider':\n return undefined;\n default:\n return undefined;\n }\n}\n\nexport const IconBulletSection: React.FC<IconBulletSectionProps> = ({\n title,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n items,\n media,\n mediaPosition = 'left',\n stackAt = 'xl',\n background = 'white',\n darkMode: darkModeProp,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n ...rest\n}) => {\n const baseClass = 'icon-bullet-section';\n\n // Derive dark mode from the background preset so consumers don't need to\n // redundantly pass both `background=\"dark\"` and/or `darkMode={true}`. An explicit\n // `darkMode` prop still takes priority, allowing opt-out when needed.\n const darkMode = darkModeProp ?? background === 'dark';\n\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n const resolvedBg = backgroundColor ?? getBackgroundColor(background);\n const resolvedShape = shapeDivider ?? (background === 'divider' ? 'both' : 'none');\n\n const titleElement = title ? (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n ) : undefined;\n\n return (\n <OverflowMediaSection\n header={titleElement}\n media={media}\n mediaPosition={mediaPosition}\n stackAt={stackAt}\n backgroundColor={resolvedBg}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={resolvedShape}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n <ul className={`${baseClass}__list`} role=\"list\">\n {items.map((item, index) => (\n <IconListItem\n key={index}\n icon={item.icon}\n title={item.title}\n description={item.description}\n button={item.button}\n darkMode={darkMode}\n />\n ))}\n </ul>\n </OverflowMediaSection>\n );\n};\n","import React from 'react';\nimport { AssetMeta } from '@/components/molecules/AssetMeta';\nimport './PostItem.scss';\n\n/** Link properties for post navigation — extends native anchor attributes */\nexport interface ItemLink extends React.AnchorHTMLAttributes<HTMLAnchorElement> {}\n\nexport interface PostItemData {\n /** Post title */\n title: string;\n /** Asset type label (e.g. \"Webinar\", \"Podcast\", \"Article\") */\n assetType: string;\n /** Duration (e.g. \"12 Mins\") */\n duration?: string;\n /** Date string (e.g. \"01-15-25\") */\n date: string;\n /** Post image URL */\n imageUrl: string;\n /** Image alt text */\n imageAlt?: string;\n /** Link configuration for the post */\n link: ItemLink;\n /** Whether this post is featured (vertical layout with large image) */\n isFeatured?: boolean;\n}\n\nexport interface PostItemProps extends PostItemData {\n /** Additional class name */\n className?: string;\n}\n\n/**\n * PostItem component for the PostFeed section.\n * Renders in two modes:\n * - Featured (vertical): large image on top, metadata + clickable title below\n * - Regular (horizontal): metadata + clickable title on left, small thumbnail on right\n */\nexport const PostItem: React.FC<PostItemProps> = ({\n title,\n assetType,\n duration,\n date,\n imageUrl,\n imageAlt = '',\n link,\n isFeatured = false,\n className,\n}) => {\n const rootClasses = ['post-item', isFeatured ? 'post-item--featured' : 'post-item--regular', className]\n .filter(Boolean)\n .join(' ');\n\n const { href, target = '_self', rel } = link;\n const resolvedRel = rel ?? (target === '_blank' ? 'noopener noreferrer' : undefined);\n\n return (\n <article className={rootClasses}>\n {/* Featured: image on top */}\n {isFeatured && (\n <a\n href={href}\n target={target}\n rel={resolvedRel}\n className=\"post-item__image-link post-item__image-link--featured\"\n aria-label={title}\n >\n <img src={imageUrl} alt={imageAlt} className=\"post-item__image\" loading=\"lazy\" />\n </a>\n )}\n\n <div className=\"post-item__body\">\n <AssetMeta assetType={assetType} duration={duration} date={date} className=\"post-item__meta\" />\n\n <a href={href} target={target} rel={resolvedRel} className=\"post-item__title-link\">\n {title}\n </a>\n </div>\n\n {/* Regular: thumbnail on right */}\n {!isFeatured && (\n <a\n href={href}\n target={target}\n rel={resolvedRel}\n className=\"post-item__image-link post-item__image-link--thumbnail\"\n aria-label={title}\n >\n <img src={imageUrl} alt={imageAlt} className=\"post-item__image\" loading=\"lazy\" />\n </a>\n )}\n </article>\n );\n};\n","import React from 'react';\nimport { Accordion as BaseAccordion, AccordionItem } from '@/components/molecules/Accordion';\nimport { OverflowMediaSection } from '@/components/molecules/primax/OverflowMediaSection';\nimport type { OverflowMediaStackBreakpoint } from '@/components/molecules/primax/OverflowMediaSection';\nimport { MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { DividerProps } from '@/components/atoms/Divider';\nimport { Divider } from '@/components/atoms/Divider';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport { RichText } from '@/components/atoms/RichText';\nimport './Accordion.scss';\n\nexport type PrimaxAccordionLayout = 'mediaRight' | 'mediaLeft' | 'fullWidth' | 'contentRight' | 'contentLeft';\nexport type PrimaxAccordionVariant = 'white' | 'grey' | 'greyAngled';\n\nexport interface PrimaxAccordionProps extends DividerProps {\n layout?: PrimaxAccordionLayout;\n variant?: PrimaxAccordionVariant;\n heading?: string;\n headingLevel?: HeadingProps['level'];\n headingVariant?: HeadingProps['variant'];\n items: AccordionItem[];\n defaultOpenIndex?: number;\n allowMultiple?: boolean;\n mediaProps?: Omit<MediaBlockProps, 'className'>;\n stackAt?: OverflowMediaStackBreakpoint;\n content?: string;\n chevronIcon?: React.ReactNode;\n onToggle?: (itemId: string, isOpen: boolean) => void;\n className?: string;\n}\n\nconst variantConfig = {\n white: { backgroundColor: 'var(--color-neutral-00)', shapeDivider: 'none' as const },\n grey: { backgroundColor: 'var(--color-neutral-50)', shapeDivider: 'none' as const },\n greyAngled: { backgroundColor: 'var(--color-neutral-50)', shapeDivider: 'both' as const },\n};\n\nexport const Accordion = ({\n layout = 'mediaRight',\n variant = 'white',\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n items,\n defaultOpenIndex,\n allowMultiple = false,\n mediaProps = {},\n stackAt = 'lg',\n content,\n chevronIcon,\n onToggle,\n className,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider,\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n ...rest\n}: PrimaxAccordionProps) => {\n if (layout === 'mediaRight' || layout === 'mediaLeft') {\n const mediaPosition = layout === 'mediaRight' ? 'right' : 'left';\n const baseClass = 'primax-accordion';\n const classes = [baseClass, `${baseClass}--media-${mediaPosition}`, className].filter(Boolean).join(' ');\n const resolvedBg = backgroundColor ?? variantConfig[variant].backgroundColor;\n const resolvedShape = shapeDivider ?? variantConfig[variant].shapeDivider;\n\n return (\n <OverflowMediaSection\n media={mediaProps}\n mediaPosition={mediaPosition}\n stackAt={stackAt}\n backgroundColor={resolvedBg}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={resolvedShape}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n >\n {heading && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode}>\n {heading}\n </Heading>\n )}\n <BaseAccordion\n items={items}\n defaultOpenIndex={defaultOpenIndex}\n allowMultiple={allowMultiple}\n darkMode={darkMode}\n chevronIcon={chevronIcon}\n onToggle={onToggle}\n />\n </OverflowMediaSection>\n );\n }\n\n const baseClass = 'primax-accordion-without-media';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n const accordionColumn = (\n <div className={`${baseClass}__accordion-col`}>\n {heading && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode}>\n {heading}\n </Heading>\n )}\n <BaseAccordion\n items={items}\n defaultOpenIndex={defaultOpenIndex}\n allowMultiple={allowMultiple}\n darkMode={darkMode}\n chevronIcon={chevronIcon}\n onToggle={onToggle}\n />\n </div>\n );\n\n const contentColumn = content ? (\n <div className={`${baseClass}__content-col`}>\n <RichText content={content} darkMode={darkMode} />\n </div>\n ) : null;\n\n const renderGrid = () => {\n if (layout === 'contentRight') {\n return (\n <Grid columns={{ sm: 1, lg: 2 }} gap=\"var(--accordion-without-media-col-gap)\" alignItems=\"start\">\n <GridItem>{accordionColumn}</GridItem>\n <GridItem>{contentColumn}</GridItem>\n </Grid>\n );\n }\n if (layout === 'contentLeft') {\n return (\n <Grid columns={{ sm: 1, lg: 2 }} gap=\"var(--accordion-without-media-col-gap)\" alignItems=\"start\">\n <GridItem>{contentColumn}</GridItem>\n <GridItem>{accordionColumn}</GridItem>\n </Grid>\n );\n }\n return accordionColumn;\n };\n\n return (\n <Divider shapeDivider=\"none\" darkMode={darkMode} className={classes}>\n {renderGrid()}\n </Divider>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faLinkedin, faSquareFacebook, faXTwitter } from '@fortawesome/free-brands-svg-icons';\nimport type { IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport './Footer.scss';\nimport { Paragraph } from '@/components/atoms/Paragraph';\n\n/** Supported social platform keys */\nexport type SocialPlatform = 'linkedin' | 'twitter' | 'facebook';\n\nexport const socialIconRegistry: Record<SocialPlatform, IconDefinition> = {\n linkedin: faLinkedin,\n twitter: faXTwitter,\n facebook: faSquareFacebook,\n};\n\nexport interface FooterLogo {\n /** Logo image source for light backgrounds */\n light: string;\n /** Logo image source for dark backgrounds */\n dark: string;\n /** Alt text for the logo */\n alt?: string;\n /** Logo width */\n width?: number;\n /** Logo height */\n height?: number;\n}\n\nexport interface FooterSocialLink {\n /** Social platform key — resolves to the corresponding FontAwesome brand icon */\n platform: SocialPlatform;\n /** URL for the social link */\n href: string;\n /** Accessible label (defaults to platform name) */\n ariaLabel?: string;\n}\n\nexport interface FooterLink {\n /** Link display text */\n label: string;\n /** Link URL */\n href?: string;\n /** Whether the link opens in a new tab */\n external?: boolean;\n}\n\nexport interface FooterLinkGroup {\n /** Optional group heading (e.g., \"Follow Us\") */\n heading?: string;\n /** Links in this group */\n links: FooterLink[];\n /** Social icons rendered after heading */\n socialLinks?: FooterSocialLink[];\n}\n\nexport interface FooterProps {\n /** Logo configuration with light/dark variants */\n logo?: FooterLogo;\n /** Groups of navigation links */\n linkGroups?: FooterLinkGroup[];\n /** Legal/copyright text (supports HTML) */\n legalText?: string;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /** Test ID */\n}\n\nexport const Footer: React.FC<FooterProps> = ({\n logo,\n linkGroups = [],\n legalText,\n darkMode = false,\n className = '',\n style,\n}) => {\n const classes = ['primax-footer', className].filter(Boolean).join(' ');\n const logoSrc = logo ? (darkMode ? logo.dark : logo.light) : undefined;\n\n return (\n <footer className={classes} data-dark-mode={darkMode || undefined} style={style} role=\"contentinfo\">\n {/* Logo */}\n {logo && logoSrc && (\n <div className=\"primax-footer__logo\">\n <img src={logoSrc} alt={logo.alt || 'Logo'} width={logo.width} height={logo.height} />\n </div>\n )}\n\n {/* Link Groups */}\n {linkGroups.length > 0 && (\n <nav className=\"primax-footer__nav\" aria-label=\"Footer navigation\">\n {linkGroups.map((group, groupIndex) => (\n <div key={groupIndex} className=\"primax-footer__link-group\">\n {group.heading && <span className=\"primax-footer__group-heading\">{group.heading}</span>}\n {group.socialLinks && group.socialLinks.length > 0 && (\n <div className=\"primax-footer__social\">\n {group.socialLinks.map((social, socialIndex) => {\n const iconDef = socialIconRegistry[social.platform];\n return (\n <a\n key={socialIndex}\n href={social.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"primax-footer__social-link\"\n aria-label={social.ariaLabel || social.platform}\n >\n <FontAwesomeIcon icon={iconDef} />\n </a>\n );\n })}\n </div>\n )}\n {group.links.map((link, linkIndex) => (\n <a\n key={linkIndex}\n href={link.href || '#'}\n className=\"primax-footer__link\"\n target={link.external ? '_blank' : undefined}\n rel={link.external ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n ))}\n </nav>\n )}\n\n {/* Legal Text */}\n {legalText && (\n <Paragraph\n darkMode={darkMode || undefined}\n className=\"primax-footer__legal\"\n dangerouslySetInnerHTML={{ __html: legalText }}\n />\n )}\n </footer>\n );\n};\n","import React from 'react';\nimport { HeaderNavGroup as HeaderNavGroupType } from './HeaderNav';\n\nexport interface HeaderNavGroupProps {\n /** Nav group data */\n group: HeaderNavGroupType;\n /** CSS class prefix for styling */\n classPrefix?: string;\n}\n\n/** Renders a navigation group with optional heading and link list */\nexport const HeaderNavGroup: React.FC<HeaderNavGroupProps> = ({ group, classPrefix = 'primax-header' }) => {\n return (\n <div className={`${classPrefix}__group`}>\n {group.heading && (\n <a\n href={group.links[0]?.href || '#'}\n className={`${classPrefix}__group-heading`}\n target={group.links[0]?.target}\n rel={group.links[0]?.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {group.heading}\n </a>\n )}\n <ul className={`${classPrefix}__group-links`}>\n {group.links.map((link, linkIndex) => (\n <li key={linkIndex}>\n <a\n href={link.href}\n className={`${classPrefix}__group-link`}\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n );\n};\n","import React from 'react';\nimport { Form, FormField } from '@/components/molecules/primax/Form/Form';\nimport { Grid, GridItem } from '@/components/atoms/Grid/Grid';\nimport { Media, MediaProps } from '@/components/atoms/Media/Media';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faMagnifyingGlass } from '@fortawesome/pro-light-svg-icons';\nimport { HeaderNavItem } from './HeaderNav';\nimport { HeaderNavGroup } from './HeaderNavGroup';\n\nexport interface HeaderOverlayProps {\n /** The active nav item to display */\n navItem: HeaderNavItem;\n /** Whether search is enabled */\n showSearch: boolean;\n /** Whether search form is open */\n searchOpen: boolean;\n /** Whether search is in closing animation */\n searchClosing: boolean;\n /** Ref for the search form wrapper (click-outside detection) */\n searchFormRef: React.RefObject<HTMLDivElement | null>;\n /** Toggle search open/close */\n onToggleSearch: () => void;\n /** Search field configuration */\n searchFields: FormField[];\n /** Search submit button label */\n searchSubmitLabel: string;\n /** Search submit handler */\n onSearch?: (data: Record<string, string>) => void;\n /** Mouse enter handler for the overlay */\n onMouseEnter: () => void;\n /** Mouse leave handler for the overlay */\n onMouseLeave: () => void;\n}\n\n/** Desktop dropdown overlay with search, nav groups, and side content */\nexport const HeaderOverlay: React.FC<HeaderOverlayProps> = ({\n navItem,\n showSearch,\n searchOpen,\n searchClosing,\n searchFormRef,\n onToggleSearch,\n searchFields,\n searchSubmitLabel,\n onSearch,\n onMouseEnter,\n onMouseLeave,\n}) => {\n return (\n <div\n className=\"primax-header__overlay\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n role=\"region\"\n aria-label={`${navItem.label} submenu`}\n >\n {/* Search section */}\n {showSearch && (\n <div className=\"primax-header__overlay-search\">\n {!searchOpen ? (\n <button\n type=\"button\"\n className=\"primax-header__search-toggle\"\n onClick={onToggleSearch}\n aria-label=\"Open search\"\n aria-expanded={searchOpen}\n >\n <FontAwesomeIcon icon={faMagnifyingGlass} />\n </button>\n ) : (\n <div\n className={`primax-header__search-form ${searchClosing ? 'primax-header__search-form--closing' : ''}`}\n ref={searchFormRef}\n >\n <Form\n fields={searchFields}\n columns={1}\n gap=\"0\"\n submitLabel={searchSubmitLabel}\n onSubmit={onSearch}\n darkMode={false}\n className=\"primax-header__search-form-inner\"\n />\n </div>\n )}\n </div>\n )}\n\n {/* Nav content */}\n <div className=\"primax-header__overlay-content\">\n <div className=\"primax-header__overlay-nav\">\n <Grid columns={{ sm: 1, md: 2, lg: 2 }} gap=\"1.88rem\" columnGap=\"3.75rem\" className=\"primax-header__nav-grid\">\n {navItem.groups!.map((group, groupIndex) => (\n <GridItem key={groupIndex}>\n <HeaderNavGroup group={group} />\n </GridItem>\n ))}\n </Grid>\n </div>\n\n {(navItem.sideContent || navItem.featuredImage) && (\n <div className=\"primax-header__overlay-side\">\n {navItem.sideContent ? (\n <Media type=\"image\" {...navItem.sideContent} className=\"primax-header__featured-image\" />\n ) : navItem.featuredImage ? (\n <div className=\"primax-header__featured-image\">\n <img src={navItem.featuredImage.src} alt={navItem.featuredImage.alt} />\n </div>\n ) : null}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';\nimport { ButtonProps } from '@/components/atoms/Button/Button';\nimport { ButtonLinkProps } from '@/components/atoms/ButtonLink/ButtonLink';\nimport { Form, FormField } from '@/components/molecules/primax/Form/Form';\nimport { HeaderNavItem } from './HeaderNav';\n\nexport interface HeaderMobileNavProps {\n /** Whether the mobile nav is open */\n isOpen: boolean;\n /** Navigation items */\n navItems: HeaderNavItem[];\n /** CTA configuration */\n cta?: ButtonProps | ButtonLinkProps;\n /** Currently expanded top-level items */\n expandedItems: number[];\n /** Currently expanded group keys */\n expandedGroups: string[];\n /** Toggle a top-level item */\n onToggleItem: (index: number) => void;\n /** Toggle a group */\n onToggleGroup: (key: string) => void;\n /** Search field configuration */\n searchFields: FormField[];\n /** Search submit button label */\n searchSubmitLabel: string;\n /** Search submit handler */\n onSearch?: (data: Record<string, string>) => void;\n}\n\n/** Mobile accordion navigation rendered below the main nav bar */\nexport const HeaderMobileNav: React.FC<HeaderMobileNavProps> = ({\n isOpen,\n navItems,\n cta,\n expandedItems,\n expandedGroups,\n onToggleItem,\n onToggleGroup,\n searchFields,\n searchSubmitLabel,\n onSearch,\n}) => {\n return (\n <div\n id=\"primax-header-mobile-nav\"\n className={`primax-header__mobile-nav-wrapper ${isOpen ? 'primax-header__mobile-nav-wrapper--open' : ''}`}\n aria-hidden={!isOpen}\n >\n <nav className=\"primax-header__mobile-nav\" aria-label=\"Mobile navigation\">\n {navItems.map((item, index) => {\n const isExpanded = expandedItems.includes(index);\n const hasChildren = !!item.groups;\n\n return (\n <div key={index} className=\"primax-header__mobile-item\">\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"primax-header__mobile-item-btn\"\n onClick={() => onToggleItem(index)}\n aria-expanded={isExpanded}\n >\n <span>{item.label}</span>\n <FontAwesomeIcon\n icon={isExpanded ? faChevronUp : faChevronDown}\n className=\"primax-header__mobile-chevron\"\n />\n </button>\n ) : (\n <a\n href={item.href || '#'}\n className=\"primax-header__mobile-item-btn\"\n target={item.target}\n rel={item.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n <span>{item.label}</span>\n </a>\n )}\n\n {hasChildren && isExpanded && (\n <div className=\"primax-header__mobile-submenu\">\n {item.groups!.map((group, groupIndex) => {\n const groupKey = `${index}-${groupIndex}`;\n const isGroupExpanded = expandedGroups.includes(groupKey);\n\n return (\n <div key={groupIndex} className=\"primax-header__mobile-group\">\n {group.heading ? (\n <>\n <button\n type=\"button\"\n className=\"primax-header__mobile-group-btn\"\n onClick={() => onToggleGroup(groupKey)}\n aria-expanded={isGroupExpanded}\n >\n <span>{group.heading}</span>\n <FontAwesomeIcon\n icon={isGroupExpanded ? faChevronUp : faChevronDown}\n className=\"primax-header__mobile-chevron\"\n />\n </button>\n\n {isGroupExpanded && (\n <ul className=\"primax-header__mobile-group-links\">\n {group.links.map((link, linkIndex) => (\n <li key={linkIndex}>\n <a\n href={link.href}\n className=\"primax-header__mobile-sublink\"\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n )}\n </>\n ) : (\n <ul className=\"primax-header__mobile-group-links\">\n {group.links.map((link, linkIndex) => (\n <li key={linkIndex}>\n <a\n href={link.href}\n className=\"primax-header__mobile-sublink\"\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n\n {/* CTA in mobile */}\n {cta && (\n <div className=\"primax-header__mobile-item\">\n {'href' in cta ? (\n <a href={(cta as ButtonLinkProps).href} className=\"primax-header__mobile-item-btn\">\n <span>{(cta as ButtonLinkProps).label || 'Contact Us'}</span>\n </a>\n ) : (\n <button type=\"button\" className=\"primax-header__mobile-item-btn\" onClick={(cta as ButtonProps).onClick}>\n <span>{(cta as ButtonProps).label || 'Contact Us'}</span>\n </button>\n )}\n </div>\n )}\n </nav>\n\n {/* Mobile search */}\n <div className=\"primax-header__mobile-search\">\n <Form\n fields={searchFields}\n columns={1}\n gap=\"0\"\n submitLabel={searchSubmitLabel}\n onSubmit={onSearch}\n darkMode={false}\n className=\"primax-header__mobile-search-form\"\n />\n </div>\n </div>\n );\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink/ButtonLink';\nimport { MediaProps } from '@/components/atoms/Media/Media';\nimport { FormField } from '@/components/molecules/primax/Form/Form';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faBars, faXmark } from '@fortawesome/free-solid-svg-icons';\nimport { HeaderOverlay } from './HeaderOverlay';\nimport { HeaderMobileNav } from './HeaderMobileNav';\nimport './HeaderNav.scss';\n\nexport interface HeaderNavLink {\n /** Display text */\n label: string;\n /** Link URL */\n href: string;\n /** Link target (e.g. '_blank') */\n target?: string;\n}\n\nexport interface HeaderNavGroup {\n /** Category heading (optional — renders links directly if omitted) */\n heading?: string;\n /** Sub-links within this group */\n links: HeaderNavLink[];\n}\n\nexport interface HeaderNavItem extends Omit<HeaderNavLink, 'href'> {\n /** Direct link URL (renders as <a>, dropdown triggered by hover) */\n href?: string;\n /** Dropdown content groups (if present, renders a mega-menu on hover) */\n groups?: HeaderNavGroup[];\n /** Optional featured image for the dropdown */\n featuredImage?: {\n src: string;\n alt: string;\n };\n /** Media displayed on the right side of the dropdown (uses Media atom). Defaults to type 'image' if not specified. */\n sideContent?: MediaProps;\n}\n\nexport interface HeaderNavProps {\n /** Logo configuration */\n logo?: {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n href?: string;\n };\n /** Top-level navigation items */\n navItems?: HeaderNavItem[];\n /** CTA button or link — pass `href` to render a ButtonLink */\n cta?: ButtonProps | ButtonLinkProps;\n /** Show search functionality in the dropdown overlay */\n showSearch?: boolean;\n /** Search form field configuration (uses Form component) */\n searchFields?: FormField[];\n /** Submit button label for the search form */\n searchSubmitLabel?: string;\n /** Search submit handler — receives form data keyed by field name */\n onSearch?: (data: Record<string, string>) => void;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_SEARCH_FIELDS: FormField[] = [\n {\n name: 'search',\n label: 'Search',\n type: 'text',\n placeholder: 'Search',\n hideLabel: true,\n clearable: true,\n },\n];\n\nexport const HeaderNav: React.FC<HeaderNavProps> = ({\n logo,\n navItems = [],\n cta,\n showSearch = true,\n searchFields,\n searchSubmitLabel = 'SEARCH',\n onSearch,\n darkMode = false,\n className = '',\n}) => {\n // Desktop dropdown state\n const [activeDropdown, setActiveDropdown] = useState<number | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const headerRef = useRef<HTMLElement>(null);\n\n // Search state\n const [searchOpen, setSearchOpen] = useState(false);\n const [searchClosing, setSearchClosing] = useState(false);\n const searchFormRef = useRef<HTMLDivElement>(null);\n\n // Mobile state\n const [mobileOpen, setMobileOpen] = useState(false);\n const [mobileExpandedItems, setMobileExpandedItems] = useState<number[]>([]);\n const [mobileExpandedGroups, setMobileExpandedGroups] = useState<string[]>([]);\n\n // Reset mobile expanded state when closing\n useEffect(() => {\n if (!mobileOpen) {\n setMobileExpandedItems([]);\n setMobileExpandedGroups([]);\n }\n }, [mobileOpen]);\n\n // Global escape key handler\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (mobileOpen) setMobileOpen(false);\n if (searchOpen) setSearchOpen(false);\n if (activeDropdown !== null) setActiveDropdown(null);\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [mobileOpen, searchOpen, activeDropdown]);\n\n const closeSearch = useCallback(() => {\n setSearchClosing(true);\n setTimeout(() => {\n setSearchOpen(false);\n setSearchClosing(false);\n }, 300);\n }, []);\n\n // Close search on click outside\n useEffect(() => {\n if (!searchOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (searchFormRef.current && !searchFormRef.current.contains(e.target as Node)) {\n closeSearch();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [searchOpen, closeSearch]);\n\n const toggleSearch = useCallback(() => {\n if (searchOpen) {\n closeSearch();\n } else {\n setSearchOpen(true);\n }\n }, [searchOpen, closeSearch]);\n\n const handleNavEnter = useCallback((index: number) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setActiveDropdown(index);\n }, []);\n\n const handleNavLeave = useCallback(() => {\n if (searchOpen) return;\n timeoutRef.current = setTimeout(() => setActiveDropdown(null), 150);\n }, [searchOpen]);\n\n const handleDropdownEnter = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleDropdownLeave = useCallback(() => {\n if (searchOpen) return;\n timeoutRef.current = setTimeout(() => setActiveDropdown(null), 150);\n }, [searchOpen]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent, index: number) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setActiveDropdown(activeDropdown === index ? null : index);\n }\n if (event.key === 'Escape') {\n setActiveDropdown(null);\n }\n },\n [activeDropdown]\n );\n\n const toggleMobileItem = useCallback((index: number) => {\n setMobileExpandedItems((prev) => (prev.includes(index) ? [] : [index]));\n setMobileExpandedGroups([]);\n }, []);\n\n const toggleMobileGroup = useCallback((key: string) => {\n setMobileExpandedGroups((prev) => (prev.includes(key) ? [] : [key]));\n }, []);\n\n const resolvedSearchFields = searchFields || DEFAULT_SEARCH_FIELDS;\n const classes = ['primax-header', className].filter(Boolean).join(' ');\n\n return (\n <header ref={headerRef} className={classes} data-dark-mode={darkMode || undefined}>\n {/* Top navigation bar */}\n <div className=\"primax-header__top-nav\">\n <nav className=\"primax-header__nav\" aria-label=\"Main navigation\">\n {/* Logo */}\n {logo && (\n <div className=\"primax-header__logo\">\n {logo.href ? (\n <a href={logo.href} aria-label={logo.alt || 'Home'}>\n <img src={logo.src} alt={logo.alt || 'Logo'} width={logo.width || 200} height={logo.height || 63} />\n </a>\n ) : (\n <img src={logo.src} alt={logo.alt || 'Logo'} width={logo.width || 200} height={logo.height || 63} />\n )}\n </div>\n )}\n\n {/* Desktop nav items + CTA */}\n <div className=\"primax-header__right\">\n {navItems.map((item, index) => (\n <div\n key={index}\n className={`primax-header__nav-item ${activeDropdown === index ? 'primax-header__nav-item--active' : ''}`}\n onMouseEnter={() => item.groups && handleNavEnter(index)}\n onMouseLeave={handleNavLeave}\n >\n <span className=\"primax-header__nav-item-bg\" aria-hidden=\"true\" />\n\n {item.href ? (\n <a\n href={item.href}\n className=\"primax-header__nav-link\"\n target={item.target}\n rel={item.target === '_blank' ? 'noopener noreferrer' : undefined}\n aria-haspopup={item.groups ? 'true' : undefined}\n aria-expanded={item.groups ? activeDropdown === index : undefined}\n onKeyDown={(e) => item.groups && handleKeyDown(e, index)}\n >\n {item.label}\n </a>\n ) : (\n <button\n type=\"button\"\n className=\"primax-header__nav-link\"\n aria-expanded={item.groups ? activeDropdown === index : undefined}\n aria-haspopup={item.groups ? 'true' : undefined}\n onKeyDown={(e) => item.groups && handleKeyDown(e, index)}\n >\n {item.label}\n </button>\n )}\n </div>\n ))}\n\n {cta && (\n <div className=\"primax-header__cta\">\n {'href' in cta ? (\n <ButtonLink darkMode={darkMode} {...(cta as ButtonLinkProps)} />\n ) : (\n <Button darkMode={darkMode} {...(cta as ButtonProps)} />\n )}\n </div>\n )}\n </div>\n\n {/* Mobile hamburger */}\n <button\n type=\"button\"\n className=\"primax-header__hamburger\"\n onClick={() => setMobileOpen((prev) => !prev)}\n aria-label={mobileOpen ? 'Close menu' : 'Open menu'}\n aria-expanded={mobileOpen}\n aria-controls=\"primax-header-mobile-nav\"\n >\n <FontAwesomeIcon icon={mobileOpen ? faXmark : faBars} />\n </button>\n </nav>\n </div>\n\n {/* Desktop dropdown overlay */}\n {activeDropdown !== null && navItems[activeDropdown]?.groups && (\n <HeaderOverlay\n navItem={navItems[activeDropdown]}\n showSearch={showSearch}\n searchOpen={searchOpen}\n searchClosing={searchClosing}\n searchFormRef={searchFormRef}\n onToggleSearch={toggleSearch}\n searchFields={resolvedSearchFields}\n searchSubmitLabel={searchSubmitLabel}\n onSearch={onSearch}\n onMouseEnter={handleDropdownEnter}\n onMouseLeave={handleDropdownLeave}\n />\n )}\n\n {/* Mobile nav */}\n <HeaderMobileNav\n isOpen={mobileOpen}\n navItems={navItems}\n cta={cta}\n expandedItems={mobileExpandedItems}\n expandedGroups={mobileExpandedGroups}\n onToggleItem={toggleMobileItem}\n onToggleGroup={toggleMobileGroup}\n searchFields={resolvedSearchFields}\n searchSubmitLabel={searchSubmitLabel}\n onSearch={onSearch}\n />\n </header>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, ButtonProps } from '@/components/atoms/Button/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink/ButtonLink';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Media } from '@/components/atoms/Media';\nimport { AssetMeta } from '@/components/molecules/AssetMeta';\nimport { TextLink } from '@/components/atoms/TextLink';\nimport { socialIconRegistry, type SocialPlatform } from '@/components/molecules/primax/Footer';\nimport './SideBar.scss';\n\nexport interface SideBarSocialLink {\n /** Social platform key — uses the same platforms as the Footer */\n platform: SocialPlatform;\n /** URL for the social link */\n href: string;\n /** Accessible label (defaults to platform name) */\n ariaLabel?: string;\n}\n\nexport interface SideBarAsset {\n /** Asset category label (e.g., \"Article\", \"Webinar\") */\n category: string;\n /** Reading/viewing duration (e.g., \"12 Mins\") */\n duration?: string;\n /** Date string (e.g., \"01-15-25\") */\n date?: string;\n /** Asset title */\n title: string;\n /** Link configuration for the asset */\n link?: React.AnchorHTMLAttributes<HTMLAnchorElement>;\n /** Whether the title is visible */\n showTitle?: boolean;\n}\n\nexport interface SideBarCTA {\n /** CTA heading text */\n title: string;\n /** CTA button or link — pass `href` to render a ButtonLink */\n button: ButtonProps | ButtonLinkProps;\n}\n\nexport interface SideBarProps {\n /** Hero image source URL */\n imageSrc?: string;\n /** Hero image alt text */\n imageAlt?: string;\n /** Social sharing links */\n socialLinks?: SideBarSocialLink[];\n /** Recommended next assets */\n assets?: SideBarAsset[];\n /** CTA section configuration */\n cta?: SideBarCTA;\n /** Enable sticky positioning so the sidebar follows the viewport on scroll. Disabled by default. */\n sticky?: boolean;\n /** Top offset for sticky positioning (e.g., '80px' to clear a fixed header). Defaults to '0'. */\n stickyTop?: string;\n /** Additional CSS class */\n className?: string;\n}\n\nexport const SideBar: React.FC<SideBarProps> = ({\n imageSrc,\n imageAlt = '',\n socialLinks = [],\n assets = [],\n cta,\n sticky = false,\n stickyTop = '0',\n className = '',\n}) => {\n const classes = ['primax-sidebar', sticky && 'primax-sidebar--sticky', className].filter(Boolean).join(' ');\n\n return (\n <aside className={classes} aria-label=\"Sidebar\">\n {/* Hero Image */}\n {imageSrc && (\n <div className=\"primax-sidebar__image\">\n <Media src={imageSrc} alt={imageAlt} objectFit=\"cover\" loading=\"lazy\" />\n </div>\n )}\n\n {/* Content Area */}\n <div className=\"primax-sidebar__content\">\n <div className=\"primax-sidebar__inner\">\n {/* Share This Section */}\n {socialLinks.length > 0 && (\n <div className=\"primax-sidebar__socials-wrap\">\n <Heading level=\"h4\" variant=\"componentTitle\" className=\"primax-sidebar__section-title\">\n Share This\n </Heading>\n <div className=\"primax-sidebar__social-icons\" role=\"list\" aria-label=\"Social sharing links\">\n {socialLinks.map((social, index) => {\n const iconDef = socialIconRegistry[social.platform];\n return (\n <a\n key={index}\n href={social.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"primax-sidebar__social-link\"\n role=\"listitem\"\n aria-label={social.ariaLabel || `Share on ${social.platform}`}\n >\n <FontAwesomeIcon icon={iconDef} />\n </a>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Recommended Next Section */}\n {assets.length > 0 && (\n <>\n <Heading level=\"h4\" variant=\"componentTitle\" className=\"primax-sidebar__section-title\">\n Recommended Next\n </Heading>\n <div className=\"primax-sidebar__list\">\n {assets.map((asset, index) => {\n const { href, target, ...linkRest } = asset.link || {};\n const linkType = target === '_blank' ? 'external' : 'in-text';\n\n return (\n <React.Fragment key={index}>\n <article className=\"primax-sidebar__asset\">\n <AssetMeta\n assetType={asset.category}\n duration={asset.duration}\n date={asset.date}\n className=\"primax-sidebar__asset-meta\"\n />\n {asset.showTitle !== false && (\n <TextLink\n label={asset.title}\n href={href}\n linkType={linkType}\n disabled={!href}\n className=\"primax-sidebar__asset-title\"\n {...linkRest}\n />\n )}\n </article>\n {index < assets.length - 1 && <hr className=\"primax-sidebar__divider\" />}\n </React.Fragment>\n );\n })}\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* CTA Section */}\n {cta && (\n <div className=\"primax-sidebar__cta\">\n <div className=\"primax-sidebar__cta-inner\">\n <Heading level=\"h4\" variant=\"componentTitle\" darkMode className=\"primax-sidebar__cta-title\">\n {cta.title}\n </Heading>\n {'href' in cta.button ? (\n <ButtonLink darkMode {...(cta.button as ButtonLinkProps)} />\n ) : (\n <Button darkMode {...(cta.button as ButtonProps)} />\n )}\n </div>\n </div>\n )}\n </aside>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faLinkedin, faXTwitter, faSquareFacebook, faInstagram } from '@fortawesome/free-brands-svg-icons';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './Footer.scss';\n\nexport interface FooterLink {\n label: string;\n href: string;\n target?: '_blank' | '_self';\n}\n\nexport interface FooterSocialLink {\n platform: 'linkedin' | 'twitter' | 'facebook' | 'instagram';\n href: string;\n ariaLabel: string;\n}\n\nexport interface FooterProps {\n /** Navigation columns — each inner array is one column of links */\n linkColumns?: FooterLink[][];\n /** Social media icon links */\n socialLinks?: FooterSocialLink[];\n /** Copyright content — accepts a plain string or JSX */\n copyrightText?: React.ReactNode;\n /** Logo node rendered below the content row */\n logo?: React.ReactNode;\n className?: string;\n}\n\nconst socialIconMap: Record<FooterSocialLink['platform'], IconDefinition> = {\n linkedin: faLinkedin,\n twitter: faXTwitter,\n facebook: faSquareFacebook,\n instagram: faInstagram,\n};\n\nexport const Footer = ({ linkColumns = [], socialLinks = [], copyrightText, logo, className }: FooterProps) => {\n return (\n <footer className={`footer${className ? ` ${className}` : ''}`}>\n {(linkColumns.length > 0 || socialLinks.length > 0) && (\n <div className=\"footer__top-row\">\n {linkColumns.map((column, colIndex) => (\n <nav\n key={colIndex}\n aria-label={`Footer navigation ${colIndex + 1}`}\n className={`footer__nav-column${colIndex === 0 ? ' footer__nav-column--first' : ''}`}\n >\n <ul className=\"footer__nav-list\">\n {column.map((link) => (\n <li key={link.href}>\n <a\n href={link.href}\n target={link.target ?? '_self'}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n className=\"footer__nav-link\"\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n ))}\n\n {socialLinks.length > 0 && (\n <div className=\"footer__social\">\n <span className=\"footer__social-label\">Follow Us</span>\n <div className=\"footer__social-icons\">\n {socialLinks.map((social) => (\n <a\n key={social.platform}\n href={social.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"footer__social-link\"\n aria-label={social.ariaLabel}\n >\n <FontAwesomeIcon icon={socialIconMap[social.platform]} />\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {copyrightText && (\n <div className=\"footer__copyright-bar\">\n <Paragraph className=\"footer__copyright\">{copyrightText}</Paragraph>\n </div>\n )}\n\n {logo && <div className=\"footer__logo\">{logo}</div>}\n </footer>\n );\n};\n","import React from 'react';\nimport { Icon } from '@/components/atoms/Icon';\nimport './TestimonialCard.scss';\n\nexport interface TestimonialCardProps {\n quote: string;\n name: string;\n position: string;\n company: string;\n variant?: 'standalone' | 'slider';\n imageSrc?: string;\n}\n\nconst QuoteMarkSvg = (\n <svg viewBox=\"0 0 60 47\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0 29.4312C0 22.8242 2.20233 16.9179 6.607 11.7124C11.0117 6.50689 16.8679 2.60275 24.1756 0L26.8785 6.30668C24.8764 7.30774 22.674 8.90944 20.2715 11.1118C17.969 13.3141 15.8168 15.8168 13.8146 18.6197L21.1724 23.575C23.4749 25.1767 25.0265 26.9285 25.8274 28.8305C26.6282 30.6325 27.0286 32.5845 27.0286 34.6868C27.0286 38.0904 25.7273 40.9934 23.1245 43.396C20.5217 45.7985 17.6187 46.9998 14.4153 46.9998C11.9126 46.9998 9.8104 46.4993 8.10859 45.4982C6.40679 44.4971 4.95525 43.5461 3.75398 42.6452C2.4526 40.6431 1.50159 38.4908 0.900955 36.1883C0.300318 33.8859 0 31.6335 0 29.4312ZM32.7347 29.4312C32.7347 22.8242 34.937 16.9179 39.3417 11.7124C43.7464 6.50689 49.6026 2.60275 56.9103 0L59.6132 6.30668C57.6111 7.30774 55.4087 8.90944 53.0062 11.1118C50.7037 13.3141 48.5514 15.8168 46.5493 18.6197L53.9071 23.575C56.2096 25.1767 57.7612 26.9285 58.5621 28.8305C59.3629 30.6325 59.7633 32.5845 59.7633 34.6868C59.7633 38.0904 58.462 40.9934 55.8592 43.396C53.2564 45.7985 50.3534 46.9998 47.15 46.9998C44.6473 46.9998 42.5451 46.4993 40.8433 45.4982C39.1415 44.4971 37.6899 43.5461 36.4887 42.6452C35.1873 40.6431 34.2363 38.4908 33.6356 36.1883C33.035 33.8859 32.7347 31.6335 32.7347 29.4312Z\" />\n </svg>\n);\n\nconst SliderCard = ({ quote, name, position, company }: TestimonialCardProps) => {\n const initials = name\n .split(' ')\n .map((w) => w[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n const role = [position, company].filter(Boolean).join(', ');\n return (\n <article className=\"testimonial-card testimonial-card--slider\">\n <div className=\"testimonial-card__text-content\">\n <div className=\"testimonial-card__quote-wrapper\" aria-hidden=\"true\">\n <Icon svg={QuoteMarkSvg} decorative fill=\"var(--testimonial-card-slider-quote-mark-color)\" strokeWidth={0} />\n </div>\n <p className=\"testimonial-card__quote\">{quote}</p>\n </div>\n <div className=\"testimonial-card__footer\">\n <div className=\"testimonial-card__author\">\n {initials && (\n <div className=\"testimonial-card__avatar\" aria-hidden=\"true\">\n <span className=\"testimonial-card__initials\">{initials}</span>\n </div>\n )}\n <div className=\"testimonial-card__name-column\">\n <span className=\"testimonial-card__name\">{name}</span>\n <span className=\"testimonial-card__role\">{role}</span>\n </div>\n </div>\n </div>\n </article>\n );\n};\n\nconst StandaloneCard = ({ quote, name, position, company, imageSrc }: TestimonialCardProps) => {\n const imageAlt = [`Portrait of ${name}`, position, `of ${company}`].join(', ');\n return (\n <div className=\"testimonial-card testimonial-card--standalone\">\n <div className=\"testimonial-card__content-wrapper\">\n {imageSrc && (\n <div className=\"testimonial-card__image\">\n <img src={imageSrc} alt={imageAlt} />\n </div>\n )}\n <div className=\"testimonial-card__bottom-content\">\n <div className=\"testimonial-card__quote-mark-wrapper\" aria-hidden=\"true\">\n <Icon\n svg={QuoteMarkSvg}\n decorative\n fill=\"var(--testimonial-card-standalone-quote-mark-color)\"\n strokeWidth={0}\n />\n </div>\n <div className=\"testimonial-card__text-content\">\n <p className=\"testimonial-card__quote\">{quote}</p>\n <div className=\"testimonial-card__attribution\">\n <div className=\"testimonial-card__name-title-row\">\n <span className=\"testimonial-card__author-name\">{name}</span>\n {position && (\n <>\n <span className=\"testimonial-card__sep\" aria-hidden=\"true\">\n |\n </span>\n <span className=\"testimonial-card__author-title\">{position}</span>\n </>\n )}\n </div>\n <div className=\"testimonial-card__company\">{company}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const TestimonialCard = ({ variant = 'slider', ...props }: TestimonialCardProps) => {\n return variant === 'standalone' ? <StandaloneCard {...props} /> : <SliderCard {...props} />;\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport './DataDial.scss';\n\nexport interface DataDialProps {\n value: number;\n unit?: string;\n progressColor?: string;\n trackColor?: string;\n backgroundColor?: string;\n valueColor?: string;\n ringWidth?: number;\n darkMode?: boolean;\n disableAnimation?: boolean;\n className?: string;\n}\n\nconst SVG_CENTER = 82;\nconst DEFAULT_RING_WIDTH = 27;\nconst ANIMATION_DURATION = 1000;\n\nexport const DataDial = ({\n value,\n unit = '%',\n progressColor,\n trackColor,\n backgroundColor,\n valueColor,\n ringWidth = DEFAULT_RING_WIDTH,\n darkMode,\n disableAnimation = false,\n className,\n}: DataDialProps) => {\n const clamped = Math.min(100, Math.max(0, value));\n const radius = SVG_CENTER - ringWidth / 2;\n const circumference = 2 * Math.PI * radius;\n const innerRadius = radius - ringWidth / 2;\n\n const prefersReducedMotion =\n typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const skipAnimation = disableAnimation || prefersReducedMotion;\n\n const [animatedValue, setAnimatedValue] = useState(skipAnimation ? clamped : 0);\n const containerRef = useRef<HTMLDivElement>(null);\n const hasAnimated = useRef(false);\n const rafRef = useRef<number>(0);\n\n useEffect(() => {\n if (skipAnimation) {\n setAnimatedValue(clamped);\n return;\n }\n\n const el = containerRef.current;\n if (!el) return;\n\n const runAnimation = () => {\n if (hasAnimated.current) return;\n hasAnimated.current = true;\n\n const start = performance.now();\n const tick = (now: number) => {\n const elapsed = now - start;\n const progress = Math.min(elapsed / ANIMATION_DURATION, 1);\n const eased = 1 - Math.pow(1 - progress, 3);\n setAnimatedValue(eased * clamped);\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(tick);\n }\n };\n rafRef.current = requestAnimationFrame(tick);\n };\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) runAnimation();\n },\n { threshold: 0.1 }\n );\n\n observer.observe(el);\n return () => {\n observer.disconnect();\n cancelAnimationFrame(rafRef.current);\n };\n }, [clamped, skipAnimation]);\n\n const offset = circumference - (animatedValue / 100) * circumference;\n\n const style = {\n ...(progressColor && { '--data-dial-ring-progress': progressColor }),\n ...(trackColor && { '--data-dial-ring-track': trackColor }),\n ...(backgroundColor && { '--data-dial-ring-bg': backgroundColor }),\n ...(valueColor && { '--data-dial-text': valueColor }),\n } as React.CSSProperties;\n\n return (\n <div\n ref={containerRef}\n role=\"meter\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${clamped}${unit}`}\n className={`data-dial${darkMode ? ' data-dial--dark' : ''}${className ? ` ${className}` : ''}`}\n style={Object.keys(style).length ? style : undefined}\n >\n <div className=\"data-dial__ring-container\">\n <svg className=\"data-dial__svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 164 164\" aria-hidden=\"true\">\n <circle className=\"data-dial__ring-bg\" cx=\"82\" cy=\"82\" r={innerRadius} />\n <circle className=\"data-dial__track\" cx=\"82\" cy=\"82\" r={radius} strokeWidth={ringWidth} fill=\"none\" />\n <circle\n className=\"data-dial__progress\"\n cx=\"82\"\n cy=\"82\"\n r={radius}\n strokeWidth={ringWidth}\n fill=\"none\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n />\n </svg>\n <div className=\"data-dial__center\" aria-hidden=\"true\">\n <div className=\"data-dial__value-row\">\n <span className=\"data-dial__value\" aria-hidden=\"true\">\n {Math.round(animatedValue)}\n </span>\n {unit && (\n <div className=\"data-dial__unit-wrap\">\n <span className=\"data-dial__unit\">{unit}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faArrowUp, faArrowDown } from '@fortawesome/free-solid-svg-icons';\nimport './StatPill.scss';\n\nexport interface StatPillProps {\n stat: string;\n label?: string;\n direction?: 'up' | 'down';\n darkMode?: boolean;\n className?: string;\n}\n\nexport const StatPill = ({ stat, label, direction = 'up', darkMode, className }: StatPillProps) => (\n <div className={`stat-pill${darkMode ? ' stat-pill--dark' : ''}${className ? ` ${className}` : ''}`}>\n <FontAwesomeIcon\n icon={direction === 'down' ? faArrowDown : faArrowUp}\n className=\"stat-pill__arrow\"\n aria-hidden=\"true\"\n />\n <span className=\"stat-pill__sign\">{direction === 'down' ? '−' : '+'}</span>\n <span className=\"stat-pill__stat\">{stat}</span>\n <span className=\"stat-pill__pct\">%</span>\n {label && (\n <>\n <span className=\"stat-pill__spacer\" aria-hidden=\"true\" />\n <span className=\"stat-pill__suffix\">{label}</span>\n </>\n )}\n </div>\n);\n","import React from 'react';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { DataDial } from '@/components/atoms/DataDial';\nimport { StatPill } from '@/components/atoms/StatPill';\nimport './PercentDialCard.scss';\n\nexport interface PercentDialCardProps {\n value: number;\n title: string;\n body?: string;\n stat?: string;\n label?: string;\n direction?: 'up' | 'down';\n darkMode?: boolean;\n className?: string;\n}\n\nexport const PercentDialCard = ({\n value,\n title,\n body,\n stat,\n label,\n direction = 'up',\n darkMode,\n className,\n}: PercentDialCardProps) => (\n <div className={`percent-dial-card${darkMode ? ' percent-dial-card--dark' : ''}${className ? ` ${className}` : ''}`}>\n <DataDial value={value} darkMode={darkMode} />\n <Paragraph\n className=\"percent-dial-card__label\"\n weight=\"bold\"\n size=\"md\"\n style={{ color: 'var(--percent-dial-card-label)' }}\n >\n {title}\n </Paragraph>\n {body && (\n <Paragraph className=\"percent-dial-card__body\" size=\"md\" style={{ color: 'var(--percent-dial-card-text)' }}>\n {body}\n </Paragraph>\n )}\n {stat && <StatPill stat={stat} label={label} direction={direction} darkMode={darkMode} />}\n </div>\n);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAREAAAGPCAYAAAB7+OS9AAA5nUlEQVR4AezBa5CeV2Eg6KffbnW35cuxLfmGL0i+yhcdG0JsAoYY4gQiCJOBQJyE2Uwmk61VcXa3aqu2an76J7/2x+yp8W5VsjOGhElCAhkyKE64JYCJIVzsYwM2yJZsy/gmyTq2bt2S+lvXfCpeya1rf7ra53nGBoOBmOoE/g8sNvTlksM3NUckphrwv2Hc0F+WHH7kEGKq5+N/xZihPys5/FRzRGKq1+D3DA3wf5ccNjuEmOoN+JihPfiPJYeqOSIx1dtxp6Ht+L9KDrs7Q9disaEZfEdzxEoOFQ/p3eLwIsYMPY+1mqOxFs8bGkN0eLfoPVRyqJqj8R3MGFqMa72qMxT1Hik5zGqO1g/0ro6pnunQbtb7fslhoDliJYcBvq93s0OIqZ6Jq/V+oDkqJYdZPKIXvaqLqY7jKr2iOWolh6ex2VCHqxxETPVCnGdoDg9rFuJhzBk6L6Z6oYO7Cp2hzSWHpzULUfSuiqmOd7gciwztwNOahfqJ3pUObpnehpLDds1RKzlsxwa9ZQ7uSr2faBbqKewwtAiXd7hC78mSw5xmodbrXeHgluk9oRnFE3rLHNwVeus1C1JyGOBJvSs6XKC3QTOKp/XOi6lOOLCles9oRvGM3lIHEFOdwHl6GzSj2KB3QYelehs1C1Zy2IadhsawxGvEVDss0duoGcVGvSUx1c58SzBmaGfJYatmFBv1lnY4R2+zZlSb9IL5zsS4oT3YohnFFuwxNI4zzXeO3mbNqDbrndNhUm9GM6oZvUnzTerNlhwGmgUrOQwwqzdpvim9nZpRzehNdlikN6MZ1azepPkm9WY0x8KM3qT5JvVmNaOa0VvUaY6nSfNNaY6nKfNNao6bTtM0zQg6TdM0I+g0TdOMoNM0TTOCTtM0zQg6TdM0I+g0TdOMoNM0TTOCTtM0zQg6TdM0I+g0TdOMoNM0TTOCTtM0zQg6TdM0I+g0TdOMoNM0TTOCTtM0zQg6TdM0I+g0TdOMoNM0TTOCTtM0zQg6TdM0I+g0TdOMoNM0TTOCTtM0zQg6TdM0I+g0TdOMoNM0TTOCTtM0zQg6TdM0I+g0TdOMoNM0TTOCTnOi7dIcawOHtltz3HSaE21Wb5HmWJjRGzPfrN6EZlSL9PZ0mhNtVm9ScyzM6E2Zb0ZvSjOqSb3ZTnOibcPA0KKY6lmaUe3UO8t8W/XO1YzqXL2tneaEKjnsxha9pZpRbdZbYr5NemfHVKc0o1iqt6nTnAwb9S7WjGqT3oVeo+SwE1v1LtGM4hK9jZ3mZHha70rNqH6md3lMtTPfBr1lmlEs13u605wM6/XeHFOd0IziOcwYmsSl5ntC7xrNgsRUL0AwNMCTneZk2IAdhqZwnWbBSg5zWK93o/ke17s0pnq+ZiFW6m0oOezsNCdcyWEOj+i9RTOqR/Ruiql29lFy2IRn9G7RHJWYaoeb9YpXdZqTpehdHVO9WDOKxzBr6CzcaL6H9N4WU53UHI0bEAztwSNe1WlOipLD09ig9y7NgpUcZvGQ3u0x1TH7exA7DC3GrZojElPt8Mt6Pyg57PCqTnMyfV3vxpjqMs0ovoU5Qxch2kfJYRbf1ntXTPVszZF4Gy4wNIdv2avTnEw/xVN6H4ipTmgWpOTwEh7S+7WY6pT9PYBthqbwPs0hxVTPxnv1flBy2GyvTnPSlBwG+CLmDF2AX9OM4iuYMXQmPmAfJYed+Ae9m2Kqt2gOKKba4cOYNrQdX7aPTnNSlRyex7f0bo2prtQsSMlhK76qF2Oqb7G/gif0PhBTvVhzIHdgud59JYcd9tFpTgVfwwa934ypXqVZqO9grd4HY6rL7VVyGOBz2GpoET4eUz1P83Mx1V/Eu/UeLDkUr9FpTrqSwx58FlsNjeO3Y6pXao5ayWGAz+MVQ+O4K6Z6sb1KDlvx19hj6Cz8m5jq+Rox1bdild5zWOMAOs0poeRQ8aeYMTSJ34up3qQ5aiWHbfgzzBiawv8UU73IXiWHdfg8BobOxx/GVC/xBhVTHYup/jI+hDFDL+FPSw6zDqDTnDJKDs/hM5gxNI7fiqmuiqlOaI5KyeE5/FfsMrQYvx9TvcheJYdH8EUMDJ2JP4ypvs0bTEz1DPw23qNX8emSw1YH0WlOKSWHJ/GfsVXvVvxRTPUKzVEpOazHZ7DL0GL8fkz1InuVHL6Lv8IeQxP4YEz192Kq53kDiKneiNVYofcC/qTksNkhjF9063+4Q++bq1dN79Ys2D1rZm7CUkNrV6+a3uAorV41vfWeNTM/xOU4x9BZeMs9a2aW3LNmZuPqVdPbNUdk9arpLfesmXkeN6DDItx4z5qZtatXTW/zqtWrpl+8Z83MelyJaUNL8LZ71sxM3rNm5vnVq6Z3eZ2JqV5xz5qZf4XbMaX3I/x5yWGbwxhb+Yktd+t9suSwU7NgMdW7sMLQfSWHByxQTHUc78UvodMb4DE8iJ+WHPZoDiumeh0+hnFD23FvyeF5e8VUz8C/wgr7242H8CA2lBwGTlMx1Ulcj7fizfa3C18qOXzHERpb+Yktd+t9suSwU7NgMdW7sMLQfSWHB4wopnoJPoDLzLcD6/AEfoZNJYcZzQHFVK/DxzBuaDvuLTk8bx8x1euwCsF8W/AE1uF5bCo57HGKiqmegaW4HMuwDJPmexT3lRy2OApjKz+x5W69T5YcdmoWLKZ6F1YYuq/k8IBjIKY6huvwbrzJoW3HDGacGgaYwQx2YjM24mclh5ecYDHV6/AxjBvajntLDs/bR0x1EW7B7QgOboCtmMUup45pTGPaoa3FN0oOT1qAsZWf2HK33idLDjs1CxZTvQsrDN1XcnjAMRZTfTNuwQ2YcnrbgnV4BOtKDnNOgJjqdfgYxg1tx6dKDs95jZjqOK7DzbgGndPfVjyMB0sOzxvB2MpPbLlb75Mlh52aBYup3oUVhu4rOTzgOImpTuByLMcVWIqznL624rv4Tslhu+MspnodPoZxQzP4ryWH9Q4ipnoG3owrcSmWYNqpr2Ij1mMdflZymHMMjK38xJa79T5ZctipWbCY6l1YYei+ksMDTqCY6jTOwiQmnRo6TGIaZ2EJLsQl6Mw3i+/gGyWHGcdRTPU6fAzjhvbg70oO33WEYqpn4kxMYsKpYwazeLnksMtxMrbyE1vu1vtkyWGnZsFiqndhhaH7Sg4PaA4opjqJZbgJKzBpf6/gvpLDDx1HMdVl+B1M6f0Qa0oO2zSHNH7Rrf/hDr1vrl41vVuzYPesmbkJSw2tXb1qeoPmgFavmt6zetX0ptWrpn98z5qZb2MbLsC0oSnceM+amXPvWTPzxOpV03scB6tXTW+5Z83MWlyDaUMX4hfuWTMze8+amWdXr5oeaA6o0zSngJLDbMnhAfxHfAmzerfgj2Kq5zpOSg7P4f/BY3rTWIX/PaZ6a0x1UjNPp2lOISWHPSWH+5HxuN4F+MOY6kWOk5LDDvw5/hu26QWswv8ZU/2tmOoNMdUzNf/DhOZ1I6Y6jvNxJqYxic7JN4dZ7MQ2bC457HEIJYeXY6p/infhPRjD2fh3MdVPlxw2OA5KDgP8IKb6KH4Zv4BFhhbhJtzkVTHVjXgRm7EVs9jj1LAbs5hBRS05DBwHYys/seVuvU+WHHZqFiymehdWGLqv5PCA4ySmehauxHJcgfPQOfXN4SU8hXV4ouSw1UHEVG/EhzFuaAafLjlscJzFVBfjNrwF5zh97caLeBLr8UTJYdYxMLbyE1vu1vtkyWGnZsFiqndhhaH7Sg4POIZiquO4HrfgKow5/Q3wOB7Ej0sOe7xGTPVK/A4WGZrBp0sOG5wAMdUxLMONWIalTm+78Ch+UHJ4wgjGVn5iy916nyw57NQsWEz1LqwwdF/J4QHHQEx1Am/FOxEc3Cy2YAdmscfJN45JnIFzMengKu7H90sOu+0jprocv4tFhmbw6ZLDBidYTPUsXISlCFiMSXRODROYwjTOx7iDexb/hMdKDgNHaWzlJ7bcrffJksNOzYLFVO/CCkP3lRweMKKY6tX4AM4z30asxTo8W3J42SkupnoOLsFyXI2l5nsJXyw5rLWPmOpy/C4WGZrBfyk5PKs5oJhqh3NxGZbjGpxlvqfwxZLD847C2MpPbLlb75Mlh52aBYup3oUVhu4rOTxggWKqU/ggVtrfbvwAD5YcnnGai6leilvwFkzY38P47yWHGXvFVJfjd7HI0HbcW3J4XnNYMdUOV+KtuB5jenP4Or5ecphzBMYvuvU/3KH3zdWrpndrFuyeNTM3YamhtatXTW+wADHVi/H7WKa3B/+Mz5Ycfrh61fQrXgdWr5p+ZfWq6Z/es2bme4YuRWfoItx4z5qZJ1evmt7qVatXTW+5Z83MBtyIcSzCjfesmVm7etX0Ns0hrV41PVi9anrz6lXTP7xnzcyPcAYuMjSGZbjinjUzT6xeNT3rMDrNKSemeiX+AOfrrcN/Kjl8qeSwzetQyWFbyeFL+E9Yp3c+/iCmepW9Sg7r8BnsMrQYvx9TvUhzxEoOL5Yc/hr/BRv1luPfxVTPdxid5pQSU12B38OUoTl8GZ8qOWzyBlBy2IRP4cuYMzSF342prrBXyWEd/hx7DC3G78dUL9AclZLDevy/+L7eefj3MdWLHEKnOWXEVJfjoxg3NINPlxy+WXIYeAMpOQxKDt/EpzFjaBwfjakut1fJ4XH8JfYYWoyPx1TP0RyVksOuksMX8N8xMLQYH4+pnucgOs0pIaZ6Ie7CuKHt+M8lh3XewEoO6/Cfsd3QOO6KqV5or5LDY/hLzBkK+J2Y6oTmqJUcvovPYo+hs/HxmOq0A+g0J11MdRIfxZShGXy65PCcRsnhOXwaM4am8NGY6qS9Sg6P4Qt6l+DXNAtScvgRPq+3BB9yAJ3mVPB+XGBogM+WHJ7V/FzJ4Vl8FgNDF+D99lFyeBDf0Ls1pnq1ZkFKDo/gy3o3xFTf5jU6zUkVU70Cb9X7p5LDWs08JYe1+Ce9t8ZUr7C/r+FpvVUx1QnNQt2Pn+j9akz1LPvoNCdNTLXDB/U24OuaQ/k6Nuh9MKba2avkMIe/wR5D5+M2zYKUHAb4G2wzNIVfs49OczLdgAsNzeGLJYc5zUGVHObwRcwZuhA32EfJYRO+pffOmOoizYKUHLbjS3orY6oX2KvTnBQx1TH8st4PSg7Pag6r5PAsfqD3yzHVMfv7BnYaWoy3aEbxEJ4zNIbb7dVpTpbluMDQHO7XHI37MWfoAiy3j5LDLL6j94uaBSs5DPCPeitjqmd6Vac5WW7We7TksFlzxEoOm/Go3s3m+xcMDF0QU71YM4rHsNlQh5Ve1WlOuJjqBK7Xe1CzEA/qXR9TnbCPksMreELvRs2ClRwGeEgvelWnORkux6Sh7VirWYi12G5oEpeb70d6yzWjeljvkpjqGZ3mZFiut77kMKc5aiWHOazXW26+dXpviqlOahas5LAZmw2NYXmnORku01unGcU6vcu8RslhM14x1OEizajW613aaU6GJXrPaUbxnN4SB/ai3hLNqJ7TW9ppTqiY6iIEvY2aUWzUCzHVRebbpHe+ZlQb9ZZ0mhPtTL3ZksMOzYKVHHZgVu9M823Tm9KMquqd1WlOtEm9Wc2xMKs3ab4ZvSnNqGb0JjvNiTapt1tzLOzWmzTfQG9KM6rdel2nOdEmNMfThEMb0xxTnaZpmhF0mqZpRtBpmqYZQadpmmYEnaZpmhF0mqZpRtBpmqYZQadpmmYEnaZpmhF0mqZpRtBpmqYZQadpmmYEnaZpmhF0mqZpRtBpmqYZQadpmmYEnaZpmhF0mqZpRtBpmqYZQadpmmYEnaZpmhF0mqZpRtBpmqYZQadpmmYEnaZpmhF0mqZpRtBpmqYZQadpmmYEnaZpmhF0mqZpRtBpmqYZQadpmmYEneZ4mnFouzXH2ozmhOqwS29KM6opvVnzjevNao6FKb1ZzQnVYUZvWjOqab1Z803pzWpGElPtMKU3qzmhOlS9JZpRna+3xXzn6r2iGdW56AztxlbNCdVho95SzYLFVM/BlKE5bDbfEr3NmlEt1dtUchhoTqgOL+pdrhnFZXovlRz2mO8SvY2aUV2u94LmhOuwXu/NMdVOs1BX6q3zGjHVaVyi97RmVMv1ntSccB1+hhlDk1iuOWox1TFcq7fefFdizNCWksMWzYLFVM/GpXrrNCdcV3KYw0/1btYsxHKcY2g31ppvpd5azagixgy9WHLYpDnhOkMP6V0fU12sOVq/oPdYyWGnfcRUF+NavaJZsJjqGN6iVzQnRWfocbxiaBHerjliMdXzcYPeg+a7DeOGtuBpzShuwFJDc3hIc1J0XlVymMP9erfGVM/UHKn3YMzQc1hrHzHVadyq988lh4FmQWKqHd6tV0oOL2tOik7ve9huaBq/qjmsmOoyrNT7ZslhYH/vwRmGtuP7mlHchosMDfANzUnT2avksAtf0bslpnql5qBiqpP4oN5T+KF9xFQvxi/q/VPJYZdmQWKq5+MOvX8pOWzSnDSd/X0fG/Q+HFM9S3Mwq7DU0By+WHIY2CumOonfQmfoefyLZkFiqhP4KKYMbcNXNSdVZx8lhwH+G3YZOgu/HVNdpNlPTPU23KL39ZLD8/aKqY7hg1hqaA5/W3KY0xy1mOoYPohL9L5QctipOak6r1FyeBFf1LscH42pjmv+h5jqSvy63jp83f5+BVHvayWHDZqF+lXcovetksNjmpOucwAlhwfxgN61uCumusgbXEz1Lfiw3mb8Vclhzl4x1dtxu95P8E3NUYupjsVU34936D2Or2hOCZ2D+3s8rHcN/m1M9RxvQDHVLqb6XvwrjBl6BZ8uOWyzV0z1dtyptwGfLTkMNEclpjqJ38Lb9Z7BX5Qc9mhOCZ2DKDkM8Dd4SO9S/C8x1Wu9gcRUz8a/wbv1Ku4tObxkr5jq7bhT7wV8puSwS3NUYqqX4H/GjXpP409LDrOaU8aEQyg57Imp/g224R2GFuN3Y6o/wn0lh5e9TsVUO9yK92BK73n8WcnhZXvFVG/HnXov4N6Sw3bNEYupTuEO3IZO7zH8Vclhl+aUMuEwSg4D/ENM9Wf4ECYN3YBrY6rfxT+XHKrXiZjqOG7G7Tjf/h7EmpLDrL1iqrfjTr0XcG/JYZvmiMRUp3Er3o7FenP4Ku4vOQw0p5wJR6jk8EhM9Wf4DSw3NIG349aY6uN4EI+XHHY6zcRUO7wJK3ETzrS/bbiv5PCwfcRUb8edei/g3pLDNs0hxVQnsAwR12OR/b2IL5QcntacsiYchZLDZtwbU12JOxEMdbgG12AQU30Gz2AjNmMHZrHbyTeGKUwhYAkuxpsxbb49+B6+WnLYaR8x1dtxp94LuLfksM1JFFNdhEkscmroMIUzELAUl+AKTJhvJ76BB0oOezSntAkLUHJ4OKb6I6zE7ViqN4bLcJnT2yy+j2+VHF72GjHVt+NOvRdwb8lhmxMkptrhTViGS3E+lmDC6WkrHsB3Sg6zmtPChAUqOezBg3gwpnoZbsa1CE5fu7AeBY+WHHY5gJjq7bhT7wXcW3LY5jiLqY5hGVbiRkw5vW3H4yh4vOQwpzmtTDgGSg4bsAFfjKmejytwIZYgYAqTGHdq2IlZ7MBGbMQzeKbksMdBxFTH8D68Xe8F3Fty2OY4iql2WInbcYHDm8OsU8MAM5jBVmzERjyN50sOA81pa8IxVnLYjM1eZ2KqZ+Ff4yq9F3BvyWGb4yimejV+HUvMN4Mn8SSexya8UnLYrWlOgAnNYcVUb8Kv40y9p/CZksNOx0lM9Qz8Bm6wvz14FA/h8ZLDHk1zkkxoDiqmegXei2X29wOsKTnscpzEVK/Ab+EcvT34Lr5Vcqia5hQwodlPTHURrsMv4s32N4MvlhyK4yimejM+hHG9tfi7ksMmTXMKmfAGF1MdxxJcgeW4BpPmexj/UHJ4xXEUU/0lvE9vN/6u5PA9TXMKmnAcxFSX4AIsxTmYwpRTxxQmsRjnYszB/QRfLzlscJzFVG/HnXov489KDs87hJhqhwuxBEtxNiYx6dQxi1m8go3YhBdKDnOa09qEYyCmuggrcC2W4yynt214GD8oOTzvBIip3o479V7Ep0sOLzuAmOoZuBFXYzmmnH5mYqrrsBY/LDns0Jx2JowgproU78CNmHL62onnsB7r8VTJYc4JElO9HXfqvYB7Sw7bvEZM9XK8A9di3OltCiuwAr8eU/0JvlVyeFpz2piwADHV8/EruAFj5tuDF/AiXsIOzGDg1DCLWcxgc8lhm5Mkpno77tR7AfeWHLbZR0z1cvwKljmwWTyHTXgJM5hx6pjCFM7DElyMSb1xXI/rY6rr8ZWSw9OaU96EoxBTncC78E5M2N92PILH8FTJYZfmkGKqt+NOvRdwb8lhm71iqotxJ95qvi0oWItnSg57nCZiquO4FFcj4ly9ZfjDmOr38eWSw3bNKWvCEYqpLsVHcZH9PYev47GSwx7NEYmp3o479V7AvSWHbfaKqS7DR3C2/a3F/Vhfchg4DZUc9uApPBVT/RqW4Z24Wu+tuCam+tclh/WaU9KEIxBTvR7/GpN6L+G+ksNjmqMSU70dd+q9gHtLDtvsFVN9J+7EmN4z+LuSwwavIyWHAdZhXUz1Mvw6LjV0Nn4/pvrlksP9mlPOhMOIqb4NH8CYoQHuxz+VHHZpjkpM9XbcqfcC7i05bPOqmOoY3oe36+3GP+BfSg4Dr2Mlhw0x1T/G2/A+TGAMvxpTPQf3lRwGmlPGhEOIqb4d79fbjr8uOTyuOWox1bfiTr0XcG/JYZtXxVTH8CG8RW8T/rLk8Lw3iJLDAP8SU30KH8MSQ7dhMqb6hZLDQHNK6BxETHUl3q/3Ev645PC45qjFVK/Db+i9gHtLDtv03ou36D2NPy45PO8NqOTwPP4YT+m9Be/VnDI6BxBTvRS/qbcJf1Jy2Kw5ajHV8/ERjBl6CZ8qOWyzV0z1FrxL7wl8quSwwxtYyWEHPo0n9N4VU71Fc0rovEZM9Qx8FOOGXsGnSw5bNUctpjqOj2LS0Hb8aclhq71iqkuxSu9n+IuSwy6NksMu/AV+pveBmOoFmpOuM9+v41xDe/DnJYctmoV6Jy7R+1zJYZO9YqodPoJJQ1vxmZLDjObnSg4z+Ay2GlqED8dUO81J1dlHTHUZot6XSg7PaBYkpnou3qV3f8lhrf39Ii4xNMDnSg5bNfOUHLbicxgYugS/qDmpOnvFVMewSu8pfFszivdikaGKf7SPmOpivFfveyWHJzQHVXJ4At/Te29MdbHmpOn0VuBCQ3P4YslhoFmQmOp5uEnv70sOu+zvVkwZ2oavaI7EV7DN0BRu1Zw0nd679UrJ4XnNKH4JnaHn8WP7iKlO4u1695ccdmgOq+SwA/frvT2mOqU5KTqviqm+CZcYGuB+zYLFVMexUu+bJYeB/d2IaUPb8V3N0fguthuaxg2ak6IzFPWeKDm8qBnFNTjD0E782Hw36z1YcpjVHLGSwywe1LtZc1J0hm7Ue0gzqmv1flRy2G0fMdUz8Wa9hzQL8ZDem2OqZ2pOuC6muhRnG5rDY5pRLdd71HzLMWZoU8nhec1RKzk8j02GxrBcc8J1WK73TMlhRrNgMdWA8wwN8JT5lumt04ziCb1lmhOuw8V6T2pGtVRvY8lhp/ku1luvGcWTehdrTrgOS/Re1Ixqqd4mB7ZU70XNKF7UW6o54Tqcp7dJM6qgt8lrxFTPwLTeJs0oNulNx1QXa06oDlN6WzWjmtSbMd+03s6Sw27NgpUcdmOn3pTmhOowrTejGdWk3qz5pvRmNMfCjN6U5oTq7G+gGdWkQ5vSG2iOhYHelOaE6jQn2pjmeBrTnFCdpmmaEXSapmlG0GmaphlBp2maZgSdpmmaEXSapmlG0GmaphlBp2maZgSdpmmaEXSapmlG0GmaphlBp2maZgSdpmmaEXSapmlG0GmaphlBp2maZgSdpmmaEXSapmlG0GmaphlBp2maZgSdpmmaEXSapmlG0GmaphlBp2maZgSdpmmaEXSapmlG0GmaphlBp2maZgSdpmmaEXSapmlG0GmaphlBpzme5sw3pzme5sw3pzluOvvrNKPq9GbNN6vXaY6FTm/WfLN6nWZUnX102Kk3pRnVpN5O8+3Um9IcC1N6O823U29SM6opvZ0dduqdrRnVOXoz5tupNxVTndQsWEx1ElN6O823U+8czajO1tvRYbPeEs2CxVTHca7eZq9RctiJ7XpLNKNYore95LDTfJv1zo2pjmtGsUTvpQ4b9S7UjGIpOkOzJYfqwDbqXagZxYV6Gx1AyeFlzBrqsFQzigv1NnZ4Tu/NmlG8We85B/es3jLNKJbpPevgntVbphnFMr1nOzyhd0lMdbFmoZbrrXNw6/Su1IziSr11Dm6d3pWaBYmpLsbFeuu6ksMWbDE0hus1Ry2mOo1r9NY5uCcxZyjEVC/THLWY6mUIhubwpINbp3dVTHVasxA3YMzQSyWHLZ2hh/Vu0SzEDZgw9AqedBAlhx14XO9mzULcrPd4yWGHg3sKLxuawI2ahbhZ7xGv6gwVvctjqm/SHLGY6hhu1Sslh4FDe0jv5pjqGZojFlM9AzfrPeQQSg4DFL3bYqpjmiMWU70Ul+s95FWdV5UcXsR6vXdrjsZ1uNjQHL7n8B7FVkOTuE1zNG7DpKGteNThfR9zhi7EdZqj8S699SWHjV7V6X1Tb0VM9QrNYcVUx/FevR+VHDY7jJLDbnxL75diqmdrDiumejZ+Se9bJYfdDqPksBmP6P1KTHVcc1gx1SuwQu/r9ursVXJYi6f1PhBT7TSH83ZcaGgO/+TIfRfbDE3hfZoj8T5MGdqG7zpy38CcoQvwS5pDiql2+KDe0yWHJ+zV2d8aDAxdhDs0BxVTvQjv0ftOyeFFR6jkMIu/17sppnqT5qBiqjfhJr2/LznMOkIlhxfxbb07YqoXaQ7lvbjQ0By+aB+dfZQcnsV39N4VU71KM09MdRIfxYShV/A1R+9hrNf7UEx1iWaemOr5+A299XjY0ftHvGxoAh+NqU5p5ompXoPb9b5TcnjOPjrzfRkvGBrDx2KqF2l+LqY6jt/GUkMD/HXJYcZRKjkM8DlsNzSJ34upnqn5uZjqmfg4pgxtx+dKDgNHqeQwg7/CnKGl+O2Y6rjm52KqF+O39J7Dl71G5zVKDrvwl5g1NIWPx1SXaMRUx/GvcZXe10oO6y1QyeFlfB4DQ+fj4zHVxRox1cX4OM43NMDnSw4vW6CSw1P4qt6V+HBMdVwjproU/wZThmbw2ZLDbq/ROYCSw0b8BfYYOht/GFO91BtYTHUR7sJNeg/iG0ZUcvgp7tO7BH8QUw3ewGKqAX+AS/TuKzn81Ojuxw/0bsTvxFQnvYHFVC/Dv8OZhvbgL0oOmxxA5yBKDo/j8xgYWox/G1O9xRtQTHUJ/hDX6D2GL5QcBo6BksO38XW9C/BHMdUrvQHFVK/EH+ECva+XHL7tGCg5DPC3eFTvavz7mOpSb0Ax1bfi32KxoQE+V3J4wkGMDQYDhxJTvR4fwYRewX0lh+1e52KqY3gL3o9JvYfwhZLDHsdYTPWd+FW9Ab6Jr5ccdnmdi6kuwrtxO8b0vlRyuN8xFlPt8CHcojeLv8f3Sw4Dr3Mx1TPxfqzU24W/Kjk85hDGBoOBw4mpvhkfxVl6O/A1fK/ksMfrUEz1Mrwfl9nfN/DVksPAcRJTjfgNLNJ7Cf+AR0sOA68zMdUxrMCv4Ty9XfjbkkNxnMRUx3AH3o0xvQ24r+SwwetQTHUcv4D3YlrvFfxlyeFphzE2GAwciZjqWfgIlttfxQN4sOSww2kuptrhSvwSrrK/7fh8yeGnToCY6oX4KC6wvxdwP35UctjlNBdTXYQb8E5caH8v4rMlhxecADHVq/BhnGl/6/AtPF5ymHOai6kuxs14B862v8fxuZLDNkdgbDAYOFIx1TG8FXfiDPvbg5/iMawrOWxxmoipTuIKXI0bcbb5HsI/lBy2OYFiqhN4F96JCfubwY+xFutKDtucJmKqZ2I5rsb1mLK/3bgf3yg57HYCxVTPxJ14i/m24hE8gfUlh1mniZjqubgS1+IajNvfdnwF3y85DByhscFg4GjFVBfj3fgFLHJgW7ERmzCDGcw4+SYwhUmci6U4D50DW4evlRyechLFVM/HHbgJnQPbgk3YjBnMYtbJN4lJTOF8LMG5DmwOj+AfSw6bnUQx1ctxB65yYHN4CRtRMYNZ7HLyTWMS01iCpTjTgc3ie/h6yWGHozQ2GAwsVEx1MW7DzTjX68cuPIpvlxw2OIXEVM/HbViJxV4/tuNhfLvksNkpJKZ6GW7F9Vjk9eMlPITvlBy2W6CxwWBgVDHVMVyB67AMl2DM6eVlrMcT+HHJYcYpLKY6jqtwDZZjqdPPRqzDWqwtOexxCoupTmIFrsJynOP0MsCzWIfH8HTJYWBEY4PBwLEWU53CElyAczCJKUw6+fZgBrPYhk3YVHKoTmMx1TNwAZbgHExiEoucfLswi1m8jE14seSww2kspnoOlmAJzsIkJjHh5JvBLGZRsREbSw6zjrGxwWCgaZpmoTpN0zQj6DRN04yg0zRNM4IJx0FM9RxcgKU4F5OYxCLNG9FuzGIWL2MTNmJzyWHgNBRT7XAhlmApzsA0JtE5+XZhFrOo2IgXSw7VMTbhGIipjuMaXIvlOE/THN62mOo6rMWPSw4zTmEx1bNxE67CFZh0mompbsF6PIaflhx2G9HYYDCwUDHVgHdgJRZrmoXbhUfxrZLDs04RMdUxXItbcSXGvH7swMN4oOSw2QKNDQYDRyumGvAeRHTmG2AjNmITdmIWs5o3oglMYQrnYSkuwIQDW4uvlByedRLFVFfgDlzswGbwPDbhZezELPY4+SYxiWkswRJcgDHzzeERfLXksMVRGhsMBo5UTHUcb8cdWGR/M/gRHsOTJYcdmuYgYqqLcDmuxkqcbX8DfBdfKTnsdALFVM/Hr+Ma872Ih7EWz5Uc5pwmYqrTWIZrcCOm7W8XvoFvlRx2O0Jjg8HAkYipnoffwqX29yLuxw9LDrs0zVGKqXa4Gu/AMvur+KuSw9NOgJhqxAcxqTfAD3F/yeFZrwMx1QncgHfhAvt7Fp8tOWx2BMYGg4HDialeg49gWu8VfAkPlxwGmuYYiKkux/txkd4c/r7k8G3HSUy1wwfwC/b3E9xXctjsdSimOobr8X6cozeDvy45/MRhjA0GA4cSU70ZH8K43nfwlZLDjKY5xmKqHW7DnRjX+ya+UnIYOIZiqovwMVyjtw1/W3J41BtATHUS78Xb9Qb4QsnhBw5h/O6773YwMdW34jfRGdqJvy45/PPqVdN7NM1xsHrV9GD1qukN96yZWYsrcYahK7B49arpnzpGYqqL8Hu4Su9JfKrk8DNvEKtXTe9ZvWp67T1rZp7F1ViEMay4Z83MttWrpn/mIDoHEVO9Hr+h9zL+v5LDjzXNCVBy+Bn+GD/TuzWmeodjIKba4SNYplfwqZLDK96ASg6P4U9Q9VbFVG90EJ0DiKlejI9gzNAW/EnJ4QVNcwKVHLbhv+BJvTtiqjcZ3Z1YofddfL7ksMcbWMlhI/4Emw2N4cMx1Tc5gM5rxFSn8DFMGNqOT5ccqqY5CUoOs/iveF7vQzHVJRYopnod3qH3Q6wpOQw0Sg4v40+xzdA4PhpTnfYanfneh/MNzeHPSw6bNM1JVHLYiT/DdkOT+HBMdcxRiqkuxm/qPYvPlxzmND9XctiMP8ecofPwfq/R2UdM9XK8Ve+rJYenNM0poOTwMj6vdyl+wdG7E2cYmsFnSw67NfOUHJ7Gl/VuialeYR+dvWKqY1il9wzu1zSnkJLDT/F9vTtjqtOOUEz1TXir3pdKDps1h/LP2KD3gZjqmL06vWtxiaEBvlhyGGiaU8+XscPQNG5z5N6t9wy+pzmkksMA/x1zhi7Cdfbq9N6l98OSw880zSmo5LAd9+vdFlOddBgx1YuwQu8rJYeB5rBKDs/x/7cH9016lXWCgK/nJOnuhMANSQMB0ST4FgMe0ImDqzOMo+OiHXesHUdnynW3dmb/StX5EHyIU5UPMCProuKWqy3L1jCD+L6A5iYoiCSAEXlJgEMIydMhfTa1T8o7TSeQ9EMwTX7X5SHFzU6oHFc33ZW4RnGvEM5vP8MRI2uw1Rv7sGJfbtMe4Wx8H72Rq+um2+C4ysgNisdzm54Rwnkst2kOv1DUXkfddCtwveJnwlnJbXoOexU3Oq4ycr1ilxCWh18oNtdNd5HT24iLjMzhYWEpdim2Oq6qm24dLjHS41dCWAZym57GC0YG2Oj0rlU8mts0JyzFw5g3cknddNMVNiueym06IoTl4zHFtU5vk2KPsCS5TUM8pdhUYYPicSEsL08ornQKddMNsEHxhDCOxxUbKkwrnhPC8vKcYtqpJaw0cgzPC+PYr5iusE5xQAjLywHF6rrpVltsneKF3KZ5YRz7FZdVmFQcFMIyktt0FEcUkxabVLwsjOtlxWSFKcWcEJafOcWUxSYVQ2FcQ8VUZaF5ISw/84pJi00qemFcvZNUQnh7GVhsIJwzlRBCGEMlhBDGUAkhhDFUQghhDJUQQhhDJYQQxlAJIYQxVEIIYQyVEEIYQyWEEMZQCSGEMVRCCGEMlRBCGEMlhBDGUAkhhDFUQghhDJUQQhhDJYQQxlAJIYQxVEIIYQyVEEIYQyWEEMZQCSGEMVRCCGEMlRBCGEMlhBDGUAkhhDFUQghhDJUQQhhDJYQQxlAJIYQxVEJ4++uFc6ayUCWE5WfO6xsqBsK4KiepcEQxIYTlZ04xYbEjiklhXBOKIxWOKC4RwvIzp5iy2FCxVhjXxYphhRcU64Ww/LyoWGex5xXr6qarhHGsVzxf4TnF5UJYfg4opi32Eo4aqbBeGMfliv0VnlZsEsLy86ziGq+R29TjacUmYRybFE9X2Ku4qm661UJYXn6L3silddNdarG9imuFJambbgpXK/ZWuU0v4EUjA2wVwjKS23QEv1e832KPK95TN92EsBQfwMBIl9v0fGVkt+IGISw/Dytqiz2Ol42swlZhKW5Q7HZcZWSX4l11010lhOXlQcU76qbb4CS5TfN4UHGTcFbqptuATYrsuMpxuU3P4UnFzUJYRnKbXsDjij+z2APojVxVN917hLPxZ4p9uU3POK5SfF+xpW66dwphefmBYmvddFc4SW7Tc/iV4q/qpquEN1Q33TtwneIeJ1ROyG36DfYZGWB73XSVEJaPx/C0kQqftdj30RvZgI8Ir6tuugG2Y2Dk9/iNEyoLzaI3sgE3C2GZyG3qcadic910H3KS3KancZ/iU3XTTQuv589xtZEe381t6p1QOUlu01O4T/EXddNdK4RlIrfpcexWfLZuumkL3Y1DRibwpbrpVgmL1E23CX+peCC3aZ+TVBb7P3jOyABfqpvuCiEsH9/DQSMT+Lu66VY7IbfpMO5Ab+QKfKFuukr4g7rppvElDIzsx//2GpXXyG2aw9dx1MgUvlI33TohLAO5TYfwLfRGLseX66Zb5YTcpsdwr2IL/rpuukpQN91l+C9YY+Qovp7bNOc1KqeQ2/QsbscxI5fgv9VNd5UQloHcpj24S/FOfLluulWKf8VDihvxxbrpVrqA1U13Jf4Rlxjp8Y3cpmecQuU0cpsexbfRG7kI/1A33QeFsAzkNv0YP1ZsxpfrplvluNymHndgj+ID+K910yUXoLrptuIfcbHi27lNjziNFbfeeqvT2TEz9czO2eF+bEGFFdi6c3aYds4On9wxM/WqEM5jO2eHe7AWVxu5DO/cOTv85Y6ZqfkdM1P9ztnhblyOy41cght3zg5f2jEz9awLQN10Uztnh5/Fp7HSyDHckduUvY5B3/feSN10m/BFXKQ4hH/BL3Kb5oVwnqqbboDt2KbYi9tym446rm66Cv8eH7XQXtyZ2/SMt6G66SrU+DQuUhzGN3KbHvMGBn3fOxN1012Mv8VGC72AHyHnNg2FcB6qm26A7dimeBRfy2065oS66T6Az2PKQg/jx3gyt6m3zNVNN4EP4uNYZ6En8Y3cppecgUHf985U3XQVtuFTmLTQq3gYv8ae3KaXhXAeqZtugO3YpngEt+c2HXNC3XSX4DPYarEX8CD2YF9u06uWibrp1mIT3o8tWGWhIf4NP81tmneGBn3fO1t1063FJ3AjVjq1F7EfL+AVDDEvXKjmMIfDOIAut6n3FqubboDt2KZ4BLfnNh1zkrrprsUncY1TexX7sR8vYYih80OFSazBpZjGZU7tGH6Oe3KbDjpLg77vLVXddBfjJtyAi4Vw5l7FU3gce/FEbtO8t0DddANsxzbFI7g9t+mY16ibbjNuwnuxwtvHy9iFn+Q2HbREg77vjatuugGuxfuwGVcI4ewcxG7cl9t0wDlWN90Af4MPKvbif+Q2HXEKddOtwVZci81Ybfl5Dnvxa+zJbZo3pkHf995sddOtxhVYj4RJTGIgXKgmMYGLsQ4rnVqPX+Le3KannUN101X4j/ig4vf4Wm5T53XUTTfAOkxjPdZgAhPODz2GGKLDATyX2/SKN9mg73shvJXqphtgHTbiWrwPExbqcR/uzm067Bypm67CZ/ERxWH8z9ymR4Q3NOj7Xgh/THXTTWALPoqrLfQyvpXb9JhzqG66T+ATFtqNu3KbXhJOa9D3vRDOF3XTvRufxgZFj3vxr7lNvXOkbroP4POYUszhZ/hpbtNBYZEVt956qxDOFztmpl7YOTt8AIewESswwEZM75wdPrJjZqp3DuyYmdq/c3a4G1fiMiMr8C786c7Z4eU7Z4ev7pwddjtmpnrh/xv0fe+tUDfdBCrnh2FuU+9trm66SQz88fW5TUNnqW669fgiNigew9dym446h+qmux634GKLzeFJPIH9OIBDOJrbNOcCM+j73pulbrpVeCc24gqsQ8KU889RvIID2I99eDy36SXLSN10q7ER78J6TGMtJp1/hngZ+3EAT+KJ3KbDTqNuupX4Aj6g2IvbcpuOOofqpluBD+FjWGd56THEEB0O4Fk8gadzm+a9SQZ93xtH3XSr8H7cgM1YaXl7Dg8i5za96DxUN91qXI8a12Bg+eqxDxm7c5sOe4266Sp8Dh9W7MVtuU1HnWN10w2wGTW2YMrydgSPYhf25DbNG8Og73tLUTfdGtyEmzDl7afHI/hBbtM+54G66S7Dx/EhrPD2cww/xw9zm15wkrrpBtiObYq9uC236ai3SN10FTZgE67ENC7DJFZYfg7ih3ggt2nOEgz6vnc26qZbgY/hzzFhsUPYi304gOdxGMPcpmPOA3XTTWESl2AaG7AJVzq1X+N7uU0v+COom241Pok/QWWxF7EHv8d+vIjDmMttmvdHVjddhQmsxqWYxlW4FpdabB734+7cpsNOqJtugO3YptiL23Kbjvojq5tuBVY5P1SYxBpchmlcg41YZbFXcDfuz23qnYVB3/fOVN1078JfY9pCh/EgduGp3KbeMlQ33VpcjxuxwUKv4h78MLdp3lukbrrrMIOLLNRhF3Ju037LVN1006hxA5KFDmE2t+khJ9RNN8B2bFPsxW25TUeF11U33Qpswo3YglUW+h2+ndv0jDM06PveG6mbboCP45OoFC/jB3ggt2nO20jddJvxF9hkob34Zm7Ty86huulW4TP4Ews9h+/jodymeW8TddNVuA4343IL3Y87c5uOOq5uugG2Y5tiL27LbToqnJG66dbgJtyEKcWrmM1tesAZGPR97/XUTbcCX8BWxTx+jHtym+a8jdVN937MICkO4p9zm55xDtRNdxH+E65WDHE3/m9u07y3qbrpKnwEn8Sk4il8NbfpkOPqphtgO7Yp9uK23Kajwhmrm24N/gofwkBxP76b2zTvdQz6vnc6ddNN4e+xSfE8bs9tetoFom66CczgRsUQt+U2PeFNVDfdpfjPWK94At/IbTroAlE33cX4W2xUHMA/5Ta96Li66QbYjm2KPfhqbtMx4azUTbcJX8DFiofxjdymV53GiltvvdWp1E23Al/GZsXD+Ofcps4FZMfM1LEdM1MP75wddngvKqzE1p2zwz07ZqYOehPUTXcR/gHrFT/Ct3Kbhi4gO2am5nbODjNW4Z1G1uB9O2eHu3fMTB3dMTNl5+zwUazF1UYuw/TO2eGvdsxMCWdux8zUiztnh7vwDlxqZBpX7Jwd/nLHzFTvFCqnUDfdAF/AZsX9uD23aegCldv0c/x3HDUyia/UTXeZMdVNN4GvYJ3iztymu3Kb5l2Acpvmc5vuwp2KdfhK3XQTjstt6vFd3K+4Dp8Wzlpu0yv4Jzyk2ILPOY3KqX0cWxUP5Db9r9ymeRe43Kbf4Ks4ZmQN/q5uupXG8zlcpfhebtNPBLlNP8H3FFfhc07IberxXfxK8bG66bYIZy236Ri+iYcUH66bbptTqLxG3XTvwicVD+M7wh/kNj2Obyo24DOWqG66D6NW3Jvb9FPhD3Kbfop7FXXddB92Qm7TPL6JfYrP1013iXDWcpvmcQf2Kj5TN90Gr1E5Sd10K/AfUBl5Ht/KbZoXFsht+iV+oNhWN90mZ6luuotxi+Ix3C2cyt14THFL3XQXOyG36VV8HUeMrMYtwpLkNh3D1/GSkZX4fN10lZNUFvp3uNzIPL6e2zQUTudu7FPM1E23wtm5BZNGDuGO3KZeWCS3qccdOGRkErc4SW5Th+8orqubbrOwJLlNr+Cb6I1chW1OUjmhbrrVuFnxk9ym3wunlds0j+9g3sgV+JAzVDfd1bhecVdu0yHhtHKbDuEuxfV1013tJLlNu7FH8SlhyXKbnsD9ir+sm27CCZXiJkwYeRn3CG8ot+lp3Kf4WN10lTNzs+JJZOFMZDypuNlid6I3ck3ddJuFcfwLXjGyGn/qhMpxddOtxEcVP8ptGgpn6l4cM7IOW72BuunWY4vintymXnhDuU097lFsqZtuvZPkNj2LRxQfFZYst+kwfqb4aN10KxxXGXk/powcwX3CGcttOohdihu8sRsVT+U2PSacsdymx/CU4kaL/VDx3rrp1gjj+AnmjKzFexxXGakVu3Ob5oSz9YDi3XXTrXUaddMNUCseEJbiAUVdN93ASXKbfovnjVS4Tliy3KYj+KXiBsdVddOtxLWKXcJZy23ahwNGKrzH6V2BZOQYHhKW4iEcM5JwhcUeVLxbGNcuxXvqpqsqXINVRg5jn7BUjyo2Ob3Nit/mNh0Wzlpu02H8VrHZYo8pNtZNNxDG8QSGRiZwTYWNisdzm3phqfYoNjm9jYq9wjj2KjZa7Hc4amQ1poUly22axxOKjRWmFfuEcfxOkeqmW+XUphX7hHHsU0x7jdymY3hWMS2M67eKyytMKw4IS5bbdAhHjAyw3mvUTVdhneKAMI4DinV101UWO6BYL4xrv2K6wiWKA8K4DigusdharDByDJ0wjg7HjKzAWou9qFgrjOt5RaowoRgK4xoqJiw2oRjmNvXCkuU29RgqJiw2VEwI4zqimKiwSjEnjGtOMWGxCcWc8GaYU0xY7JhiQhjXULGqEs6lCYtNCOfShNe3UnhTVUIIYQyVEEIYQyWEEMZQCSGEMVRCCGEMlRBCGEMlhBDGUAkhhDFUQghhDJUQQhhDJYQQxlAJIYQxVEIIYQyVEEIYQyWEEMZQCSGEMVRCCGEM/w+FPL2jkK5yeQAAAABJRU5ErkJggg==\"","import React from 'react';\nimport { Container } from '@/components/atoms/Container';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { PercentDialCard } from '../../PercentDialCard';\nimport type { PercentDialCardProps } from '../../PercentDialCard';\nimport bgPattern from '@assets/testimonial-standalone-bg.png';\nimport './PercentDialCards.scss';\n\nexport type { PercentDialCardProps };\n\nexport interface PercentDialCardsProps {\n eyebrow?: string;\n title: string;\n description?: string;\n dials: PercentDialCardProps[];\n backgroundImage?: string;\n darkMode?: boolean;\n className?: string;\n}\n\nexport const PercentDialCards = ({\n eyebrow,\n title,\n description,\n dials,\n backgroundImage,\n darkMode,\n className,\n}: PercentDialCardsProps) => {\n const patternUrl = backgroundImage ?? (darkMode ? bgPattern : undefined);\n const sectionStyle = patternUrl\n ? ({ '--percent-dial-cards-bg-image': `url(${patternUrl})` } as React.CSSProperties)\n : undefined;\n\n return (\n <section\n className={`percent-dial-cards${darkMode ? ' percent-dial-cards--dark' : ''}${className ? ` ${className}` : ''}`}\n style={sectionStyle}\n >\n <Container>\n <div className=\"percent-dial-cards__header\">\n {eyebrow && (\n <Paragraph\n className=\"percent-dial-cards__eyebrow\"\n weight=\"bold\"\n size=\"md\"\n style={{ color: 'var(--percent-dial-cards-text)' }}\n >\n {eyebrow.toUpperCase()}\n </Paragraph>\n )}\n <Heading\n level=\"h2\"\n className=\"percent-dial-cards__heading\"\n style={{ color: 'var(--percent-dial-cards-text)' }}\n >\n {title}\n </Heading>\n {description && (\n <Paragraph\n className=\"percent-dial-cards__description\"\n size=\"md\"\n style={{ color: 'var(--percent-dial-cards-subheading)' }}\n >\n {description}\n </Paragraph>\n )}\n </div>\n\n <div className=\"percent-dial-cards__grid\">\n {dials.map((dial, index) => (\n <PercentDialCard key={index} {...dial} darkMode={darkMode} />\n ))}\n </div>\n </Container>\n </section>\n );\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons';\nimport './Pagination.scss';\n\nexport interface PaginationProps {\n totalPages: number;\n currentPage: number;\n onPrev: () => void;\n onNext: () => void;\n onPageSelect: (index: number) => void;\n className?: string;\n}\n\nexport const Pagination = ({ totalPages, currentPage, onPrev, onNext, onPageSelect, className }: PaginationProps) => (\n <div className={`pagination${className ? ` ${className}` : ''}`}>\n {currentPage > 0 ? (\n <button className=\"pagination__arrow\" onClick={onPrev} aria-label=\"Previous page\">\n <FontAwesomeIcon icon={faChevronLeft} aria-hidden=\"true\" />\n </button>\n ) : (\n <span className=\"pagination__arrow-placeholder\" aria-hidden=\"true\" />\n )}\n\n {Array.from({ length: totalPages }, (_, i) => (\n <button\n key={i}\n className={`pagination__dot${i === currentPage ? ' pagination__dot--active' : ''}`}\n onClick={() => onPageSelect(i)}\n aria-label={`Go to page ${i + 1}`}\n aria-current={i === currentPage ? 'page' : undefined}\n >\n <span className=\"pagination__dot-indicator\" />\n </button>\n ))}\n\n {currentPage < totalPages - 1 ? (\n <button className=\"pagination__arrow\" onClick={onNext} aria-label=\"Next page\">\n <FontAwesomeIcon icon={faChevronRight} aria-hidden=\"true\" />\n </button>\n ) : (\n <span className=\"pagination__arrow-placeholder\" aria-hidden=\"true\" />\n )}\n </div>\n);\n","import React, { useState, useRef, useLayoutEffect } from 'react';\nimport { Pagination } from '../../atoms/Pagination';\nimport './Carousel.scss';\n\nexport interface CarouselVisibleCardsType {\n desktop?: number;\n tablet?: number;\n mobile?: number;\n}\n\nexport type CarouselShowPeekType = number | { desktop?: number; tablet?: number; mobile?: number };\n\nexport interface CarouselProps {\n children?: React.ReactNode;\n visibleCards?: CarouselVisibleCardsType;\n gap?: string;\n\n showPeek?: CarouselShowPeekType;\n showFader?: boolean;\n className?: string;\n}\n\nconst parseGapPx = (gapStr?: string): number => {\n if (!gapStr) return 40;\n const val = parseFloat(gapStr);\n if (gapStr.includes('rem')) return val * 16;\n return val;\n};\n\nconst deriveBreakpoint = (width: number): 'mobile' | 'tablet' | 'desktop' => {\n if (width < 768) return 'mobile';\n if (width < 992) return 'tablet';\n return 'desktop';\n};\n\nexport const Carousel = ({\n children,\n visibleCards = {},\n gap,\n showPeek = 0,\n showFader = false,\n className,\n}: CarouselProps) => {\n const { desktop = 3, tablet = 2, mobile = 1 } = visibleCards;\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const [viewportWidth, setViewportWidth] = useState(0);\n\n useLayoutEffect(() => {\n const el = viewportRef.current;\n if (!el) return;\n const update = () => setViewportWidth(el.offsetWidth);\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const breakpoint = deriveBreakpoint(viewportWidth);\n const isMobile = breakpoint === 'mobile';\n const visibleCount = isMobile ? mobile : breakpoint === 'tablet' ? tablet : desktop;\n\n const resolvedPeek = typeof showPeek === 'object' ? (showPeek[breakpoint] ?? 0) : (showPeek ?? 0);\n\n const cards = React.Children.toArray(children);\n const totalPages = Math.max(1, cards.length - visibleCount + 1);\n\n const [currentPage, setCurrentPage] = useState(0);\n const clampedPage = Math.min(currentPage, totalPages - 1);\n\n const handlePrev = () => setCurrentPage((p) => Math.max(0, p - 1));\n const handleNext = () => setCurrentPage((p) => Math.min(totalPages - 1, p + 1));\n\n let trackStyle: React.CSSProperties;\n\n if (isMobile) {\n const peekPx = resolvedPeek && viewportWidth > 0 ? Math.round(viewportWidth * resolvedPeek) : 0;\n const gapPx = peekPx > 0 ? parseGapPx(gap) : 0;\n const slotWidth = Math.max(0, viewportWidth - 2 * peekPx - 2 * gapPx);\n trackStyle = {\n '--carousel-slot-width': `${slotWidth}px`,\n '--carousel-peek-px': `${peekPx}px`,\n '--carousel-gap-px': `${gapPx}px`,\n '--carousel-active-index': String(clampedPage),\n ...(gap ? { '--carousel-gap': gap } : {}),\n } as React.CSSProperties;\n } else {\n const effectiveGap = gap ?? '2.5rem';\n const gapPx = parseGapPx(effectiveGap);\n const cssVisibleCount = visibleCount + resolvedPeek;\n const slotPx = viewportWidth > 0 ? (viewportWidth - (cssVisibleCount - 1) * gapPx) / cssVisibleCount : 0;\n trackStyle = {\n '--carousel-slot-width': `${slotPx}px`,\n '--carousel-visible-count': String(cssVisibleCount),\n '--carousel-current-step': String(clampedPage),\n '--carousel-gap': effectiveGap,\n } as React.CSSProperties;\n }\n\n const carouselClass = [\n 'carousel',\n showFader ? 'carousel--fader' : '',\n isMobile ? 'carousel--mobile' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={carouselClass}>\n <div className=\"carousel__viewport\" ref={viewportRef}>\n <div className=\"carousel__track\" style={trackStyle}>\n {cards.map((card, i) => (\n <div key={i} className=\"carousel__item\">\n {card}\n </div>\n ))}\n </div>\n </div>\n <Pagination\n totalPages={totalPages}\n currentPage={clampedPage}\n onPrev={handlePrev}\n onNext={handleNext}\n onPageSelect={setCurrentPage}\n />\n </div>\n );\n};\n","/**\n * Advisors Plus color system\n * Primary (Royalblue), Secondary (Medium Purple), and Accent (Coral) color scheme\n */\n\nimport { ColorSystem } from '../../core/color-system';\n\nexport const advisorsPlusColorSystem: ColorSystem = {\n // ============================================================================\n // TIER 1: BASE COLORS\n // ============================================================================\n primitives: {\n // Accent (Carnation) - Primary Accent\n 'color-accent-50': '#FFECEB',\n 'color-accent-100': '#FFDFDE',\n 'color-accent-200': '#FFCDCB',\n 'color-accent-300': '#FDB0AF',\n 'color-accent-400': '#FD787C',\n 'color-accent-500': '#F6525F',\n 'color-accent-600': '#C52A3E',\n 'color-accent-700': '#A50B2B',\n 'color-accent-800': '#7F041E',\n 'color-accent-900': '#5C0112',\n 'color-accent-950': '#390209',\n\n // Medium Purple - Secondary\n 'color-secondary-50': '#F6F5FF',\n 'color-secondary-100': '#EBEAFF',\n 'color-secondary-200': '#DBD9FF',\n 'color-secondary-300': '#C3BFFE',\n 'color-secondary-400': '#A298FB',\n 'color-secondary-500': '#8978F0',\n 'color-secondary-600': '#6B59C8',\n 'color-secondary-700': '#5643A9',\n 'color-secondary-800': '#413282',\n 'color-secondary-900': '#2C215E',\n 'color-secondary-950': '#1A0D43',\n\n // Royalblue - Primary\n 'color-primary-50': '#D6E9FC',\n 'color-primary-100': '#B4D0FA',\n 'color-primary-200': '#92B7F7',\n 'color-primary-300': '#719DF5',\n 'color-primary-400': '#4F84F2',\n 'color-primary-500': '#2D6BF0',\n 'color-primary-600': '#265AD1',\n 'color-primary-700': '#1E49B3',\n 'color-primary-800': '#173794',\n 'color-primary-900': '#0F2676',\n 'color-primary-950': '#081557',\n\n // Neutral\n 'color-neutral-00': '#FFFFFF',\n 'color-neutral-50': '#FAFAFA',\n 'color-neutral-100': '#F5F5F5',\n 'color-neutral-200': '#E5E5E5',\n 'color-neutral-300': '#D4D4D4',\n 'color-neutral-400': '#A1A1A1',\n 'color-neutral-500': '#737373',\n 'color-neutral-600': '#525252',\n 'color-neutral-700': '#404040',\n 'color-neutral-800': '#262626',\n 'color-neutral-900': '#171717',\n 'color-neutral-950': '#0A0A0A',\n 'color-neutral-1000': '#000000',\n\n // Success - Green\n 'color-success-50': '#E3FFF1',\n 'color-success-100': '#C3FEE0',\n 'color-success-200': '#7AFBC2',\n 'color-success-300': '#5BE5AB',\n 'color-success-400': '#10B981',\n 'color-success-500': '#039F6D',\n 'color-success-600': '#09835A',\n 'color-success-700': '#056947',\n 'color-success-800': '#015035',\n 'color-success-900': '#043724',\n 'color-success-950': '#012114',\n\n // Warning - Amber\n 'color-warning-50': '#FFF4DB',\n 'color-warning-100': '#FFE9CB',\n 'color-warning-200': '#FED6AA',\n 'color-warning-300': '#FEB761',\n 'color-warning-400': '#F59E0B',\n 'color-warning-500': '#B87501',\n 'color-warning-600': '#986106',\n 'color-warning-700': '#7A4D03',\n 'color-warning-800': '#5E3901',\n 'color-warning-900': '#412703',\n 'color-warning-950': '#281601',\n\n // Error - Pink\n 'color-error-50': '#FFECE7',\n 'color-error-100': '#FFDFD9',\n 'color-error-200': '#FFCDC6',\n 'color-error-300': '#FDB1AA',\n 'color-error-400': '#FD7A72',\n 'color-error-500': '#EF4444',\n 'color-error-600': '#C8252B',\n 'color-error-700': '#A4111C',\n 'color-error-800': '#7F0813',\n 'color-error-900': '#5B030A',\n 'color-error-950': '#3A0003',\n\n // Info - Sky\n 'color-info-50': '#E2FEFF',\n 'color-info-100': '#D3F6FF',\n 'color-info-200': '#A4EBFE',\n 'color-info-300': '#52DBF9',\n 'color-info-400': '#06B6D4',\n 'color-info-500': '#0C96AF',\n 'color-info-600': '#0F7C90',\n 'color-info-700': '#086374',\n 'color-info-800': '#034B58',\n 'color-info-900': '#01343E',\n 'color-info-950': '#011F25',\n\n // Red - Danger\n 'color-red-500': '#EF4444',\n 'color-red-700': '#A4111C',\n\n // Emerald - Success\n 'color-emerald-500': '#039F6D',\n 'color-emerald-600': '#09835A',\n 'color-emerald-700': '#056947',\n\n // Amber - Warning\n 'color-amber-600': '#B87501',\n 'color-amber-700': '#986106',\n 'color-amber-800': '#7A4D03',\n\n // Teal - Info\n 'color-teal-500': '#0C96AF',\n 'color-teal-600': '#0F7C90',\n 'color-teal-700': '#086374',\n\n // Base\n 'color-white': '#FFFFFF',\n 'color-black': '#000000',\n 'color-transparent': 'transparent',\n\n // Link-specific\n 'color-link-focus': '#4F84F2',\n 'color-link-focus-external': '#719DF5',\n 'color-link-focus-dark': '#92B7F7',\n 'color-link-navy': '#081557',\n 'color-link-hover': '#173794',\n 'color-link-visited': '#6B59C8',\n 'color-link-visited-dark': '#EBEAFF',\n },\n\n semantic: {\n // ============================================================================\n // TIER 1: COLOR TOKENS\n // ============================================================================\n\n // Background colors\n 'tier1-theme-color-background-default-primary-default': 'var(--color-primary-950)',\n 'tier1-theme-color-background-default-primary-hover': 'var(--color-primary-900)',\n 'tier1-theme-color-background-default-primary-active': 'var(--color-primary-900)',\n 'tier1-theme-color-background-default-secondary-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-secondary-hover': 'var(--color-neutral-200)',\n 'tier1-theme-color-background-default-tertiary-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-background-default-tertiary-hover': 'var(--color-neutral-200)',\n 'tier1-theme-color-background-accent-primary-default': 'var(--color-accent-500)',\n 'tier1-theme-color-background-accent-primary-hover': 'var(--color-accent-700)',\n 'tier1-theme-color-background-accent-primary-active': 'var(--color-accent-700)',\n 'tier1-theme-color-background-default-inverse-default': 'var(--color-primary-900)',\n 'tier1-theme-color-background-utility-overlay-default': 'rgba(0, 0, 0, 0.5)',\n\n // Content (text) colors\n 'tier1-theme-color-content-title-primary-default': 'var(--color-primary-950)',\n 'tier1-theme-color-content-default-primary-default': 'var(--color-primary-950)',\n 'tier1-theme-color-content-default-secondary-default': 'var(--color-neutral-700)',\n 'tier1-theme-color-content-default-tertiary-default': 'var(--color-neutral-600)',\n 'tier1-theme-color-content-default-inverse-default': 'var(--color-white)',\n 'tier1-theme-color-content-disabled-subtle-default': 'var(--color-neutral-400)',\n 'tier1-theme-color-content-accent-primary-default': 'var(--color-accent-500)',\n 'tier1-theme-color-content-default-link-default': 'var(--color-primary-500)',\n 'tier1-theme-color-content-default-link-hover': 'var(--color-primary-950)',\n\n // Border colors\n 'tier1-theme-color-border-default-subtle-default': 'var(--color-neutral-100)',\n 'tier1-theme-color-border-default-default-default': 'var(--color-neutral-200)',\n 'tier1-theme-color-border-default-strong-default': 'var(--color-neutral-300)',\n 'tier1-theme-color-border-focus-primary-focus': 'var(--color-primary-500)',\n 'tier1-theme-color-border-default-white-default': 'var(--color-white)',\n\n // State colors\n 'tier1-theme-color-background-utility-success-default': 'var(--color-success-50)',\n 'tier1-theme-color-content-utility-success-default': 'var(--color-success-500)',\n 'tier1-theme-color-content-utility-success-hover': 'var(--color-success-600)',\n 'tier1-theme-color-background-utility-warning-default': 'var(--color-warning-50)',\n 'tier1-theme-color-content-utility-warning-default': 'var(--color-warning-500)',\n 'tier1-theme-color-content-utility-warning-hover': 'var(--color-warning-600)',\n 'tier1-theme-color-background-utility-error-default': 'var(--color-error-50)',\n 'tier1-theme-color-content-utility-error-default': 'var(--color-error-500)',\n 'tier1-theme-color-content-utility-error-hover': 'var(--color-error-600)',\n 'tier1-theme-color-background-utility-info-default': 'var(--color-info-50)',\n 'tier1-theme-color-content-utility-info-default': 'var(--color-info-500)',\n 'tier1-theme-color-content-utility-info-hover': 'var(--color-info-600)',\n\n // Action link colors\n 'color-action-link-default': 'var(--color-primary-500)',\n 'color-action-link-hover': 'var(--color-primary-600)',\n 'color-action-link-active': 'var(--color-primary-700)',\n 'color-action-link-visited': 'var(--color-secondary-400)',\n 'color-action-link-disabled': 'var(--color-neutral-400)',\n\n // Link focus ring and text\n 'color-link-focus-ring': 'var(--color-link-focus)',\n 'color-link-focus-ring-external': 'var(--color-link-focus-external)',\n 'color-link-focus-ring-dark': 'var(--color-link-focus-dark)',\n 'color-link-text-focus': 'var(--color-link-navy)',\n 'color-link-text-visited': 'var(--color-link-visited)',\n 'color-link-text-dark': 'var(--color-white)',\n 'color-link-text-visited-dark': 'var(--color-link-visited-dark)',\n 'color-link-text-disabled-dark': 'rgba(255, 255, 255, 0.4)',\n\n // Interactive colors\n 'tier1-theme-color-background-default-interactive-default': 'var(--color-accent-500)',\n 'tier1-theme-color-background-default-interactive-hover': 'var(--color-accent-600)',\n 'tier1-theme-color-background-default-interactive-active': 'var(--color-accent-700)',\n 'tier1-theme-color-background-default-interactive-disabled': 'var(--color-neutral-300)',\n\n // ============================================================================\n // TIER 2: SEMANTIC COLOR TOKENS\n // ============================================================================\n\n // Action — primary\n primary: 'var(--color-primary-500)',\n primaryHover: 'var(--color-primary-600)',\n primaryActive: 'var(--color-primary-700)',\n primaryText: 'var(--color-white)',\n primaryDisabled: 'var(--color-neutral-100)',\n\n // Action — secondary\n secondary: 'var(--color-secondary-500)',\n secondaryHover: 'var(--color-secondary-700)',\n secondaryActive: 'var(--color-secondary-700)',\n secondaryText: 'var(--color-white)',\n\n // Action — accent (tertiary/CTA)\n accent: 'var(--color-accent-500)',\n accentHover: 'var(--color-accent-700)',\n accentActive: 'var(--color-accent-700)',\n accentText: 'var(--color-white)',\n\n // Action — danger\n danger: 'var(--color-error-500)',\n dangerHover: 'var(--color-error-700)',\n dangerActive: 'var(--color-error-700)',\n\n // Action — tertiary/ghost\n tertiary: 'var(--color-neutral-200)',\n tertiaryHover: 'var(--color-neutral-300)',\n tertiaryActive: 'var(--color-neutral-400)',\n tertiaryText: 'var(--color-primary-950)',\n\n // Text\n textPrimary: 'var(--color-neutral-900)',\n textSecondary: 'var(--color-neutral-700)',\n textTertiary: 'var(--color-neutral-500)',\n textInverse: 'var(--color-white)',\n textDisabled: 'var(--color-neutral-400)',\n textOnBrand: 'var(--color-neutral-50)',\n textNav: 'var(--color-primary-950)',\n textSubheading: 'var(--color-primary-950)',\n\n // Action link\n textLink: 'var(--color-primary-500)',\n textLinkHover: 'var(--color-primary-600)',\n textLinkActive: 'var(--color-primary-700)',\n textLinkVisited: 'var(--color-secondary-600)',\n linkFocusRing: 'var(--color-primary-400)',\n linkFocusText: 'var(--color-primary-950)',\n\n // Backgrounds\n bgPrimary: 'var(--color-primary-950)',\n bgSecondary: 'var(--color-neutral-100)',\n bgTertiary: 'var(--color-neutral-100)',\n bgInverse: 'var(--color-primary-900)',\n bgOverlay: 'rgba(0, 0, 0, 0.5)',\n\n // Surface & border\n sectionBg: 'var(--color-neutral-00)',\n surfaceSubtle: 'var(--color-neutral-100)',\n borderDivider: 'var(--color-neutral-200)',\n borderDefault: 'var(--color-neutral-200)',\n borderSubtle: 'var(--color-neutral-100)',\n borderStrong: 'var(--color-neutral-300)',\n borderFocus: 'var(--color-primary-500)',\n borderWhite: 'var(--color-white)',\n\n // Feedback — success\n successMain: 'var(--color-success-500)',\n successMainHover: 'var(--color-success-600)',\n successMainActive: 'var(--color-success-700)',\n successText: 'var(--color-success-700)',\n successTextOnTint: 'var(--color-success-700)',\n stateSuccess: 'var(--color-success-500)',\n stateSuccessHover: 'var(--color-success-600)',\n stateSuccessBg: 'var(--color-success-50)',\n\n // Feedback — warning\n warningMain: 'var(--color-warning-500)',\n warningMainHover: 'var(--color-warning-600)',\n warningMainActive: 'var(--color-warning-700)',\n warningText: 'var(--color-warning-700)',\n stateWarning: 'var(--color-warning-500)',\n stateWarningHover: 'var(--color-warning-600)',\n stateWarningBg: 'var(--color-warning-50)',\n\n // Feedback — error/danger state\n stateError: 'var(--color-error-500)',\n stateErrorHover: 'var(--color-error-600)',\n stateErrorBg: 'var(--color-error-50)',\n\n // Feedback — info\n infoMain: 'var(--color-info-500)',\n infoMainHover: 'var(--color-info-600)',\n infoMainActive: 'var(--color-info-700)',\n infoText: 'var(--color-info-700)',\n stateInfo: 'var(--color-info-500)',\n stateInfoHover: 'var(--color-info-600)',\n stateInfoBg: 'var(--color-info-50)',\n\n // Action — breadcrumb\n breadcrumbDefault: 'var(--color-primary-950)',\n breadcrumbHover: 'var(--color-primary-800)',\n breadcrumbActive: 'var(--color-primary-700)',\n breadcrumbFocusRing: 'var(--color-primary-400)',\n breadcrumbCurrent: 'var(--color-primary-950)',\n\n // Dial\n dialCardGradientStart: '#D6E9FC7F',\n dialCardGradientEnd: 'var(--color-neutral-00)',\n dialCardOverlay: '#00000000',\n dialCardStroke: 'var(--color-neutral-300)',\n dialRingTrack: 'var(--color-neutral-300)',\n dialRingProgress: 'var(--color-primary-700)',\n\n // Interactive (CTA / accent-driven)\n interactivePrimary: 'var(--color-accent-500)',\n interactivePrimaryHover: 'var(--color-accent-600)',\n interactivePrimaryActive: 'var(--color-accent-700)',\n interactiveSecondary: 'var(--color-neutral-200)',\n interactiveSecondaryHover: 'var(--color-neutral-300)',\n interactiveSecondaryActive: 'var(--color-neutral-400)',\n interactiveDisabled: 'var(--color-neutral-300)',\n\n // ============================================================================\n // TIER 3: COMPONENT COLOR TOKENS\n // ============================================================================\n\n // Button component tokens\n // Primary - Royal Blue\n 'tier3-theme-button-general-background-default': 'var(--color-primary-500)',\n 'tier3-theme-button-general-background-hover': 'var(--color-primary-600)',\n 'tier3-theme-button-general-background-active': 'var(--color-primary-700)',\n 'tier3-theme-button-general-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-general-content-default': 'var(--color-white)',\n 'tier3-theme-button-general-content-hover': 'var(--color-white)',\n 'tier3-theme-button-general-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-general-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-general-border-hover': 'var(--color-primary-600)',\n 'tier3-theme-button-general-border-disabled': 'var(--color-neutral-200)',\n\n 'tier3-theme-button-cta-background-default': 'var(--tier1-theme-color-background-accent-primary-default)',\n 'tier3-theme-button-cta-background-hover': 'var(--tier1-theme-color-background-accent-primary-hover)',\n 'tier3-theme-button-cta-background-active': 'var(--tier1-theme-color-background-accent-primary-active)',\n 'tier3-theme-button-cta-content-default': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-cta-content-hover': 'var(--tier1-theme-color-content-default-inverse-default)',\n 'tier3-theme-button-cta-border-default': 'var(--tier1-theme-color-border-default-white-default)',\n 'tier3-theme-button-cta-border-hover': 'var(--color-secondary-600)',\n\n // Secondary - Medium Purple\n 'tier3-theme-button-secondary-background-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-background-hover': 'var(--color-secondary-600)',\n 'tier3-theme-button-secondary-background-active': 'var(--color-secondary-700)',\n 'tier3-theme-button-secondary-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-secondary-content-default': 'var(--color-white)',\n 'tier3-theme-button-secondary-content-hover': 'var(--color-white)',\n 'tier3-theme-button-secondary-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-secondary-border-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-border-hover': 'var(--color-secondary-600)',\n 'tier3-theme-button-secondary-border-disabled': 'var(--color-neutral-200)',\n\n // Primary Ghost\n 'tier3-theme-button-ghost-background-default': 'transparent',\n 'tier3-theme-button-ghost-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-ghost-background-active': 'var(--color-primary-700)',\n 'tier3-theme-button-ghost-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-ghost-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-ghost-border-hover': 'var(--color-primary-500)',\n\n // Secondary Ghost\n 'tier3-theme-button-secondary-ghost-background-default': 'transparent',\n 'tier3-theme-button-secondary-ghost-background-hover': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-ghost-background-active': 'var(--color-secondary-700)',\n 'tier3-theme-button-secondary-ghost-content-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-secondary-ghost-border-default': 'var(--color-secondary-400)',\n 'tier3-theme-button-secondary-ghost-border-hover': 'var(--color-secondary-400)',\n\n // Danger Ghost\n 'tier3-theme-button-danger-ghost-background-default': 'transparent',\n 'tier3-theme-button-danger-ghost-background-hover': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-ghost-background-active': 'var(--color-accent-700)',\n 'tier3-theme-button-danger-ghost-content-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-danger-ghost-border-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-ghost-border-hover': 'var(--color-accent-500)',\n\n // Success Ghost\n 'tier3-theme-button-success-ghost-background-default': 'transparent',\n 'tier3-theme-button-success-ghost-background-hover': 'var(--color-success-500)',\n 'tier3-theme-button-success-ghost-background-active': 'var(--color-success-700)',\n 'tier3-theme-button-success-ghost-content-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-success-ghost-border-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-ghost-border-hover': 'var(--color-success-500)',\n\n // Warning Ghost\n 'tier3-theme-button-warning-ghost-background-default': 'transparent',\n 'tier3-theme-button-warning-ghost-background-hover': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-ghost-background-active': 'var(--color-warning-700)',\n 'tier3-theme-button-warning-ghost-content-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-ghost-content-hover': 'var(--color-neutral-900)',\n 'tier3-theme-button-warning-ghost-border-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-ghost-border-hover': 'var(--color-warning-500)',\n\n // Info Ghost\n 'tier3-theme-button-info-ghost-background-default': 'transparent',\n 'tier3-theme-button-info-ghost-background-hover': 'var(--color-info-500)',\n 'tier3-theme-button-info-ghost-background-active': 'var(--color-info-700)',\n 'tier3-theme-button-info-ghost-content-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-ghost-content-hover': 'var(--color-white)',\n 'tier3-theme-button-info-ghost-border-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-ghost-border-hover': 'var(--color-info-500)',\n\n // Social Media\n 'tier3-theme-button-twitter-background-default': 'transparent',\n 'tier3-theme-button-twitter-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-background-active': 'var(--color-primary-950)',\n 'tier3-theme-button-twitter-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-content-hover': 'var(--color-white)',\n 'tier3-theme-button-twitter-content-active': 'var(--color-white)',\n 'tier3-theme-button-twitter-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-border-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-twitter-border-active': 'var(--color-primary-950)',\n\n 'tier3-theme-button-linkedin-background-default': 'transparent',\n 'tier3-theme-button-linkedin-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-background-active': 'var(--color-primary-950)',\n 'tier3-theme-button-linkedin-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-content-hover': 'var(--color-white)',\n 'tier3-theme-button-linkedin-content-active': 'var(--color-white)',\n 'tier3-theme-button-linkedin-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-border-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-linkedin-border-active': 'var(--color-primary-950)',\n\n 'tier3-theme-button-facebook-background-default': 'transparent',\n 'tier3-theme-button-facebook-background-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-background-active': 'var(--color-primary-950)',\n 'tier3-theme-button-facebook-content-default': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-content-hover': 'var(--color-white)',\n 'tier3-theme-button-facebook-content-active': 'var(--color-white)',\n 'tier3-theme-button-facebook-border-default': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-border-hover': 'var(--color-primary-500)',\n 'tier3-theme-button-facebook-border-active': 'var(--color-primary-950)',\n\n // Danger - Accent (Coral)\n 'tier3-theme-button-danger-background-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-background-hover': 'var(--color-accent-600)',\n 'tier3-theme-button-danger-background-active': 'var(--color-accent-700)',\n 'tier3-theme-button-danger-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-danger-content-default': 'var(--color-white)',\n 'tier3-theme-button-danger-content-hover': 'var(--color-white)',\n 'tier3-theme-button-danger-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-danger-border-default': 'var(--color-accent-500)',\n 'tier3-theme-button-danger-border-hover': 'var(--color-accent-600)',\n 'tier3-theme-button-danger-border-disabled': 'var(--color-neutral-200)',\n\n // Success — Green\n 'tier3-theme-button-success-background-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-background-hover': 'var(--color-success-600)',\n 'tier3-theme-button-success-background-active': 'var(--color-success-700)',\n 'tier3-theme-button-success-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-success-content-default': 'var(--color-white)',\n 'tier3-theme-button-success-content-hover': 'var(--color-white)',\n 'tier3-theme-button-success-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-success-border-default': 'var(--color-success-500)',\n 'tier3-theme-button-success-border-hover': 'var(--color-success-600)',\n 'tier3-theme-button-success-border-disabled': 'var(--color-neutral-200)',\n\n // Warning — Amber\n 'tier3-theme-button-warning-background-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-background-hover': 'var(--color-warning-600)',\n 'tier3-theme-button-warning-background-active': 'var(--color-warning-700)',\n 'tier3-theme-button-warning-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-warning-content-default': 'var(--color-neutral-900)',\n 'tier3-theme-button-warning-content-hover': 'var(--color-neutral-900)',\n 'tier3-theme-button-warning-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-warning-border-default': 'var(--color-warning-500)',\n 'tier3-theme-button-warning-border-hover': 'var(--color-warning-600)',\n 'tier3-theme-button-warning-border-disabled': 'var(--color-neutral-200)',\n\n // Info — Sky blue\n 'tier3-theme-button-info-background-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-background-hover': 'var(--color-info-600)',\n 'tier3-theme-button-info-background-active': 'var(--color-info-700)',\n 'tier3-theme-button-info-background-disabled': 'var(--color-neutral-200)',\n 'tier3-theme-button-info-content-default': 'var(--color-white)',\n 'tier3-theme-button-info-content-hover': 'var(--color-white)',\n 'tier3-theme-button-info-content-disabled': 'var(--color-neutral-400)',\n 'tier3-theme-button-info-border-default': 'var(--color-info-500)',\n 'tier3-theme-button-info-border-hover': 'var(--color-info-600)',\n 'tier3-theme-button-info-border-disabled': 'var(--color-neutral-200)',\n },\n};\n","/**\n * Advisors Plus theme configuration\n * Midnight blue and violet color scheme for financial advisory brand\n */\n\nimport { ThemeConfig } from '../core/types';\nimport { defaultTheme } from './default';\nimport { advisorsPlusColorSystem } from './color-systems/advisors-plus-colors';\nimport testimonialBg from '@assets/testimonial-standalone-bg.png';\n\nexport const advisorsPlusTheme: ThemeConfig = {\n ...defaultTheme,\n name: 'advisors-plus',\n fontImportUrl: [\n 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap',\n 'https://fonts.googleapis.com/css2?family=Source+Serif+4:opsz,wght@8..60,300;8..60,400;8..60,600;8..60,700;8..60,900&display=swap',\n ],\n\n // Three-tier color system\n colors: {\n primitives: advisorsPlusColorSystem.primitives,\n semantic: advisorsPlusColorSystem.semantic,\n },\n\n colorPalettes: [\n { name: 'Primary', bg: 'primary', text: 'primaryText' },\n { name: 'Secondary', bg: 'secondary', text: 'secondaryText' },\n { name: 'Accent', bg: 'accent', text: 'accentText' },\n { name: 'Tertiary', bg: 'tertiary', text: 'tertiaryText' },\n ],\n\n typography: {\n ...defaultTheme.typography,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontFamilyHeading: \"'Source Serif 4', Georgia, serif\",\n variants: {\n title: {\n fontSize: '3.125rem',\n fontWeight: '700',\n lineHeight: '1.2',\n mobile: { fontSize: '2rem' },\n },\n sectionTitle: {\n fontSize: '2.3125rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '0',\n mobile: { fontSize: '1.75rem' },\n },\n iconsData: {\n fontSize: '1.75rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n subTitle: {\n fontSize: '1.3125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n pageTitle: {\n fontSize: '1.3125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n buttonText: {\n fontSize: '1rem',\n fontWeight: '700',\n lineHeight: '1.5625',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n textLink: {\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.5625',\n textDecoration: 'underline',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodyLrg: {\n fontSize: '1.3125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodyLrgBold: {\n fontSize: '1.3125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n body: {\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodyBold: {\n fontSize: '1rem',\n fontWeight: '700',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n bodySmall: {\n fontSize: '0.875rem',\n fontWeight: '400',\n lineHeight: '1.6',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n iconDataPct: {\n fontSize: '1.375rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '-0.06em',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n iconDataNumber: {\n fontSize: '2.75rem',\n fontWeight: '700',\n lineHeight: '1.2',\n letterSpacing: '-0.06em',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n },\n },\n },\n\n components: {\n ...defaultTheme.components,\n cta: {\n ...defaultTheme.components.cta,\n },\n },\n\n // Inherit component tokens from default theme\n componentTokens: {\n ...defaultTheme.componentTokens,\n\n icon: {\n ...defaultTheme.componentTokens?.icon,\n sizes: {\n xs: { size: '16px' },\n sm: { size: '21px' },\n md: { size: '28px' },\n lg: { size: '37px' },\n xl: { size: '50px' },\n '2xl': { size: '67px' },\n '3xl': { size: '89px' },\n },\n },\n\n // Advisors Plus button overrides — pill shape, spacing, all variants\n button: {\n ...defaultTheme.componentTokens?.button,\n borderRadius: 'var(--border-radius-full, 9999px)',\n padding: 'var(--space-5, 12px) var(--space-8, 24px)',\n gap: 'var(--space-3, 4px)',\n fontFamily: 'var(--body-b2-font_family, Inter)',\n fontSize: 'var(--body-b2-font_size, 16px)',\n fontStyle: 'normal',\n fontWeight: 'var(--body-b2-font_weight, 400)',\n lineHeight: 'normal',\n letterSpacing: 'var(--body-b2-letter_spacing, 0)',\n shadow: 'none',\n focusOutline: '2px solid var(--color-primary-500)',\n focusOutlinePrimary: '2px solid var(--color-primary-500)',\n focusOutlinePrimaryGhost: '2px solid var(--color-primary-500)',\n focusOutlineSecondary: '2px solid var(--color-secondary-400)',\n focusOutlineSecondaryGhost: '2px solid var(--color-secondary-400)',\n focusOutlineDanger: '2px solid var(--color-red-500)',\n focusOutlineDangerGhost: '2px solid var(--color-red-500)',\n focusOutlineSuccess: '2px solid var(--color-emerald-500)',\n focusOutlineSuccessGhost: '2px solid var(--color-emerald-500)',\n focusOutlineWarning: '2px solid var(--color-amber-600)',\n focusOutlineWarningGhost: '2px solid var(--color-amber-600)',\n focusOutlineInfo: '2px solid var(--color-teal-500)',\n focusOutlineInfoGhost: '2px solid var(--color-teal-500)',\n focusOutlineOffset: '4px',\n transition: 'background-color 225ms ease-in-out, color 225ms ease-in-out, border-color 225ms ease-in-out',\n sizes: {\n md: {\n fontSize: '16px',\n lineHeight: 'normal',\n padding: '12px 24px',\n faWidth: '20px',\n },\n lg: {\n fontSize: '21px',\n lineHeight: 'normal',\n padding: '16px 24px',\n faWidth: '24px',\n },\n },\n variants: {\n primary: {\n bg: 'var(--button-primary-bg, var(--color-primary-500))',\n bgHover: 'var(--button-primary-bg-hover, var(--color-primary-600))',\n bgActive: 'var(--button-primary-bg-active, var(--color-primary-700))',\n bgDisabled: 'var(--button-primary-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-primary-text, var(--color-neutral-50))',\n textHover: 'var(--button-primary-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-primary-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-primary-border, var(--color-primary-500))',\n borderHover: 'var(--button-primary-border-hover, var(--color-primary-600))',\n borderDisabled: 'var(--button-primary-border-disabled, var(--color-neutral-100))',\n },\n primaryGhost: {\n bg: 'var(--button-primary-ghost-bg, transparent)',\n bgHover: 'var(--button-primary-ghost-bg-hover, var(--color-primary-600))',\n bgActive: 'var(--button-primary-ghost-bg-active, var(--color-primary-700))',\n bgDisabled: 'var(--button-primary-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-primary-ghost-text, var(--color-primary-500))',\n textHover: 'var(--button-primary-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-primary-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-primary-ghost-border, var(--color-primary-500))',\n borderHover: 'var(--button-primary-ghost-border-hover, var(--color-primary-600))',\n borderDisabled: 'var(--button-primary-ghost-border-disabled, var(--color-neutral-100))',\n },\n secondary: {\n bg: 'var(--button-secondary-bg, var(--color-secondary-400))',\n bgHover: 'var(--button-secondary-bg-hover, var(--color-secondary-700))',\n bgActive: 'var(--button-secondary-bg-active, var(--color-secondary-700))',\n bgDisabled: 'var(--button-secondary-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-secondary-text, var(--color-neutral-50))',\n textHover: 'var(--button-secondary-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-secondary-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-secondary-border, var(--color-secondary-400))',\n borderHover: 'var(--button-secondary-border-hover, var(--color-secondary-700))',\n borderDisabled: 'var(--button-secondary-border-disabled, var(--color-neutral-100))',\n },\n secondaryGhost: {\n bg: 'var(--button-secondary-ghost-bg, transparent)',\n bgHover: 'var(--button-secondary-ghost-bg-hover, var(--color-secondary-700))',\n bgActive: 'var(--button-secondary-ghost-bg-active, var(--color-secondary-700))',\n bgDisabled: 'var(--button-secondary-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-secondary-ghost-text, var(--color-secondary-400))',\n textHover: 'var(--button-secondary-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-secondary-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-secondary-ghost-border, var(--color-secondary-400))',\n borderHover: 'var(--button-secondary-ghost-border-hover, var(--color-secondary-700))',\n borderDisabled: 'var(--button-secondary-ghost-border-disabled, var(--color-neutral-100))',\n },\n danger: {\n bg: 'var(--button-danger-bg, var(--color-red-500))',\n bgHover: 'var(--button-danger-bg-hover, var(--color-red-700))',\n bgActive: 'var(--button-danger-bg-active, var(--color-red-700))',\n bgDisabled: 'var(--button-danger-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-danger-text, var(--color-neutral-50))',\n textHover: 'var(--button-danger-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-danger-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-danger-border, var(--color-red-500))',\n borderHover: 'var(--button-danger-border-hover, var(--color-red-700))',\n borderDisabled: 'var(--button-danger-border-disabled, var(--color-neutral-100))',\n },\n dangerGhost: {\n bg: 'var(--button-danger-ghost-bg, transparent)',\n bgHover: 'var(--button-danger-ghost-bg-hover, var(--color-red-700))',\n bgActive: 'var(--button-danger-ghost-bg-active, var(--color-red-700))',\n bgDisabled: 'var(--button-danger-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-danger-ghost-text, var(--color-red-500))',\n textHover: 'var(--button-danger-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-danger-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-danger-ghost-border, var(--color-red-500))',\n borderHover: 'var(--button-danger-ghost-border-hover, var(--color-red-700))',\n borderDisabled: 'var(--button-danger-ghost-border-disabled, var(--color-neutral-100))',\n },\n success: {\n bg: 'var(--button-success-bg, var(--color-emerald-500))',\n bgHover: 'var(--button-success-bg-hover, var(--color-emerald-600))',\n bgActive: 'var(--button-success-bg-active, var(--color-emerald-700))',\n bgDisabled: 'var(--button-success-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-success-text, var(--color-neutral-50))',\n textHover: 'var(--button-success-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-success-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-success-border, var(--color-emerald-500))',\n borderHover: 'var(--button-success-border-hover, var(--color-emerald-600))',\n borderDisabled: 'var(--button-success-border-disabled, var(--color-neutral-100))',\n },\n successGhost: {\n bg: 'var(--button-success-ghost-bg, transparent)',\n bgHover: 'var(--button-success-ghost-bg-hover, var(--color-emerald-600))',\n bgActive: 'var(--button-success-ghost-bg-active, var(--color-emerald-700))',\n bgDisabled: 'var(--button-success-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-success-ghost-text, var(--color-emerald-500))',\n textHover: 'var(--button-success-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-success-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-success-ghost-border, var(--color-emerald-500))',\n borderHover: 'var(--button-success-ghost-border-hover, var(--color-emerald-600))',\n borderDisabled: 'var(--button-success-ghost-border-disabled, var(--color-neutral-100))',\n },\n warning: {\n bg: 'var(--button-warning-bg, var(--color-amber-600))',\n bgHover: 'var(--button-warning-bg-hover, var(--color-amber-700))',\n bgActive: 'var(--button-warning-bg-active, var(--color-amber-800))',\n bgDisabled: 'var(--button-warning-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-warning-text, var(--color-neutral-50))',\n textHover: 'var(--button-warning-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-warning-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-warning-border, var(--color-amber-600))',\n borderHover: 'var(--button-warning-border-hover, var(--color-amber-700))',\n borderDisabled: 'var(--button-warning-border-disabled, var(--color-neutral-100))',\n },\n warningGhost: {\n bg: 'var(--button-warning-ghost-bg, transparent)',\n bgHover: 'var(--button-warning-ghost-bg-hover, var(--color-amber-700))',\n bgActive: 'var(--button-warning-ghost-bg-active, var(--color-amber-800))',\n bgDisabled: 'var(--button-warning-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-warning-ghost-text, var(--color-amber-600))',\n textHover: 'var(--button-warning-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-warning-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-warning-ghost-border, var(--color-amber-600))',\n borderHover: 'var(--button-warning-ghost-border-hover, var(--color-amber-700))',\n borderDisabled: 'var(--button-warning-ghost-border-disabled, var(--color-neutral-100))',\n },\n info: {\n bg: 'var(--button-info-bg, var(--color-teal-500))',\n bgHover: 'var(--button-info-bg-hover, var(--color-teal-600))',\n bgActive: 'var(--button-info-bg-active, var(--color-teal-700))',\n bgDisabled: 'var(--button-info-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-info-text, var(--color-neutral-50))',\n textHover: 'var(--button-info-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-info-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-info-border, var(--color-teal-500))',\n borderHover: 'var(--button-info-border-hover, var(--color-teal-600))',\n borderDisabled: 'var(--button-info-border-disabled, var(--color-neutral-100))',\n },\n infoGhost: {\n bg: 'var(--button-info-ghost-bg, transparent)',\n bgHover: 'var(--button-info-ghost-bg-hover, var(--color-teal-600))',\n bgActive: 'var(--button-info-ghost-bg-active, var(--color-teal-700))',\n bgDisabled: 'var(--button-info-ghost-bg-disabled, var(--color-neutral-100))',\n text: 'var(--button-info-ghost-text, var(--color-teal-500))',\n textHover: 'var(--button-info-ghost-text-hover, var(--color-neutral-50))',\n textDisabled: 'var(--button-info-ghost-text-disabled, var(--color-neutral-400))',\n border: 'var(--button-info-ghost-border, var(--color-teal-500))',\n borderHover: 'var(--button-info-ghost-border-hover, var(--color-teal-600))',\n borderDisabled: 'var(--button-info-ghost-border-disabled, var(--color-neutral-100))',\n },\n },\n },\n\n textLink: {\n ...defaultTheme.componentTokens?.textLink,\n color: 'var(--color-primary-500)',\n colorHover: 'var(--color-primary-600)',\n colorActive: 'var(--color-primary-700)',\n colorFocus: 'var(--color-link-text-focus)',\n colorVisited: 'var(--color-link-text-visited)',\n fontSize: '16px',\n fontWeight: '400',\n textDecoration: 'none',\n textDecorationHover: 'underline',\n textDecorationFocus: 'none',\n focusOutline: '3px solid var(--color-link-focus-ring)',\n focusOutlineOffset: '3px',\n dark: {\n color: 'var(--color-link-text-dark)',\n colorHover: 'var(--color-link-text-dark)',\n colorActive: 'var(--color-link-text-dark)',\n colorFocus: 'var(--color-link-text-dark)',\n colorVisited: 'var(--color-link-text-visited-dark)',\n textDecoration: 'underline',\n textDecorationHover: 'none',\n focusOutline: '3px solid var(--color-link-focus-ring-dark)',\n },\n variants: {\n external: {\n fontSize: '14px',\n fontWeight: '700',\n },\n },\n },\n\n footer: {\n bg: 'var(--color-primary-800)',\n text: 'var(--color-white)',\n borderTop: '1px solid rgba(255, 255, 255, 0.15)',\n paddingVertical: '48px',\n paddingHorizontal: '16px',\n gap: '30px',\n columnGap: '10px',\n socialGap: '15px',\n socialIconSize: '50px',\n socialIconFontSize: '30px',\n socialIconBorder: '1px solid var(--footer-text)',\n socialIconBorderRadius: '10px',\n socialIconPadding: '10px',\n fontFamily: \"var(--tier1-theme-typography-font-family, 'Inter', sans-serif)\",\n linkFontSize: 'var(--body-b1-font_size, 21px)',\n linkFontWeight: 'var(--body-b1-font_weight, 400)',\n linkLineHeight: '1.333',\n linkHoverOpacity: '0.75',\n copyrightFontSize: 'var(--body-b2-font_size, 16px)',\n copyrightFontWeight: 'var(--body-b2-font_weight, 400)',\n copyrightLineHeight: 'var(--body-b2-line_height, 1.6)',\n },\n\n breadcrumb: {\n fontFamily: \"var(--tier1-theme-typography-font-family, 'Inter', sans-serif)\",\n fontSize: '0.75rem',\n fontWeight: '700',\n letterSpacing: '0.02rem',\n gap: '0.25rem',\n linkColor: 'var(--color-link-navy)',\n linkHoverColor: 'var(--color-link-hover)',\n linkActiveColor: 'var(--color-primary-700)',\n linkActiveFontWeight: '700',\n textDecorationHover: 'underline',\n textDecorationActive: 'underline',\n textDecorationFocus: 'none',\n focusColor: 'var(--color-link-focus)',\n lastItemColor: 'var(--color-link-navy)',\n lastItemFontWeight: '700',\n separatorColor: 'var(--color-link-navy)',\n dark: {\n linkColor: 'var(--color-white)',\n linkHoverColor: 'var(--color-white)',\n linkActiveColor: 'var(--color-link-focus-dark)',\n focusColor: 'var(--color-link-focus-dark)',\n lastItemColor: 'var(--color-white)',\n separatorColor: 'var(--color-white)',\n },\n },\n heading: {\n ...defaultTheme.componentTokens?.heading,\n margin: '0',\n padding: '0',\n color: 'var(--color-text-primary)',\n fontFamily: \"'Source Serif 4', Georgia, serif\",\n\n h1FontSize: 'var(--tier1-theme-typography-font-size-2xl, 4.5rem)',\n h1FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h1LineHeight: '1.2',\n h1LetterSpacing: 'normal',\n\n h2FontSize: 'var(--tier1-theme-typography-font-size-xl, 4.1875rem)',\n h2FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h2LineHeight: '1.2',\n h2LetterSpacing: 'normal',\n\n h3FontSize: 'var(--tier1-theme-typography-font-size-lg, 3.125rem)',\n h3FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h3LineHeight: '1.2',\n h3LetterSpacing: 'normal',\n\n h4FontSize: 'var(--tier1-theme-typography-font-size-md, 2.3125rem)',\n h4FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 600)',\n h4LineHeight: '1.2',\n\n h5FontSize: 'var(--tier1-theme-typography-font-size-sm, 1.75rem)',\n h5FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 600)',\n h5LineHeight: '1.2',\n\n h6FontSize: 'var(--tier1-theme-typography-font-size-xs, 1.3125rem)',\n h6FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 600)',\n h6LineHeight: '1.2',\n\n titleFontSize: '3.125rem',\n titleFontWeight: '700',\n titleLineHeight: '1.2',\n titleColor: 'var(--color-text-primary)',\n\n sectionTitleFontSize: '2.3125rem',\n sectionTitleFontWeight: '700',\n sectionTitleLineHeight: '1.2',\n sectionTitleLetterSpacing: '0',\n\n iconsDataFontSize: '1.75rem',\n iconsDataFontWeight: '700',\n iconsDataLineHeight: '1.6',\n iconsDataFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n iconDataNumberFontSize: '2.75rem',\n iconDataNumberFontWeight: '700',\n iconDataNumberLineHeight: '1.2',\n iconDataNumberLetterSpacing: '-0.06em',\n iconDataNumberFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n iconDataPctFontSize: '1.375rem',\n iconDataPctFontWeight: '700',\n iconDataPctLineHeight: '1.2',\n iconDataPctLetterSpacing: '-0.06em',\n iconDataPctFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n subTitleFontSize: '1.3125rem',\n subTitleFontWeight: '400',\n subTitleLineHeight: '1.6',\n subTitleFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n pageTitleFontSize: '1.3125rem',\n pageTitleFontWeight: '700',\n pageTitleLineHeight: '1.6',\n pageTitleLetterSpacing: '0',\n pageTitleTextTransform: 'none',\n pageTitleColor: 'var(--color-text-primary)',\n pageTitleFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n buttonTextFontSize: '1rem',\n buttonTextFontWeight: '700',\n buttonTextLineHeight: '1.5625',\n buttonTextFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n textLinkFontSize: '1rem',\n textLinkFontWeight: '400',\n textLinkLineHeight: '1.5625',\n textLinkTextDecoration: 'underline',\n textLinkFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n bodyLrgFontSize: '1.3125rem',\n bodyLrgFontWeight: '400',\n bodyLrgLineHeight: '1.6',\n bodyLrgFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n bodyLrgBoldFontSize: '1.3125rem',\n bodyLrgBoldFontWeight: '700',\n bodyLrgBoldLineHeight: '1.6',\n bodyLrgBoldFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n bodyFontSize: '1rem',\n bodyFontWeight: '400',\n bodyFontFamily: 'var(--tier1-theme-typography-font-family)',\n bodyLineHeight: '1.6',\n\n bodyBoldFontSize: '1rem',\n bodyBoldFontWeight: '700',\n bodyBoldFontFamily: 'var(--tier1-theme-typography-font-family)',\n bodyBoldLineHeight: '1.6',\n\n bodySmallFontSize: '0.875rem',\n bodySmallFontWeight: '400',\n bodySmallFontFamily: 'var(--tier1-theme-typography-font-family)',\n bodySmallLineHeight: '1.6',\n\n dark: {\n color: 'var(--tier1-theme-color-content-default-inverse-default)',\n },\n },\n\n advisorsTeamCard: {\n width: '19.875rem',\n height: '20.5rem',\n borderRadius: '1.25rem 1.25rem 0 0',\n overlayBg: 'rgba(8, 21, 87, 0.7)',\n overlayBlur: 'blur(15px)',\n overlayHeight: '4.5rem',\n overlayPadding: '1.25rem',\n nameColor: 'var(--color-white)',\n companyColor: 'var(--color-neutral-300)',\n textGap: '-0.3125rem',\n hoverTranslateY: '-0.625rem',\n shadowHover: '0 8px 24px rgba(8, 21, 87, 0.25)',\n focusRingColor: 'var(--color-primary-300)',\n focusRingWidth: '0.625rem',\n },\n\n // Override paragraph tokens for Advisors Plus specific sizes\n paragraph: {\n // Size variants for Advisors Plus (lg, md, sm)\n sizes: {\n lg: {\n fontSize: '21px',\n lineHeight: '1.5',\n },\n md: {\n fontSize: '16px',\n lineHeight: '1.5',\n },\n sm: {\n fontSize: '14px',\n lineHeight: '1.5',\n },\n },\n },\n testimonialCard: {\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n standaloneBg: 'var(--color-primary-950)',\n standaloneBackgroundImage: `url(${testimonialBg})`,\n standaloneMaxHeight: '35rem',\n standaloneCardBg: 'rgba(255, 255, 255, 0.1)',\n standaloneCardBorder: '2px solid rgba(255, 255, 255, 0.25)',\n standaloneCardBorderRadius: '1.25rem',\n standaloneCardBackdropFilter: 'blur(5px)',\n standaloneTextColor: 'var(--color-white)',\n standaloneQuoteMarkColor: 'var(--color-accent-500)',\n standaloneImageBorderRadius: '0 0 1.25rem 1.25rem',\n standaloneImageBorder: '1px solid rgba(255, 255, 255, 0.25)',\n quoteFont: \"var(--tier1-theme-typography-font-family-heading, 'Source Serif 4', Georgia, serif)\",\n quoteFontSize: '1.75rem',\n quoteLineHeight: '2.125rem',\n quoteFontWeight: '400',\n attributionFontSize: '1.3125rem',\n attributionLineHeight: '160%',\n attributionFontWeight: '700',\n sliderBg: 'var(--color-neutral-50)',\n sliderBorder: '1px solid var(--color-neutral-300)',\n sliderBorderRadius: '1.25rem',\n sliderPadding: '2rem',\n sliderGap: '2.5rem',\n sliderWidth: '23rem',\n sliderHeight: '22.5rem',\n sliderSeparatorColor: '#C6C6C6',\n sliderQuoteMarkColor: 'var(--color-primary-600)',\n sliderQuoteTextColor: 'var(--color-neutral-900)',\n sliderQuoteFontSize: '0.9375rem',\n sliderQuoteLineHeight: '1.625rem',\n sliderAvatarBg: 'var(--color-primary-950)',\n sliderAvatarSize: '3rem',\n sliderAvatarBorderRadius: '1.5rem',\n sliderAvatarTextColor: 'var(--color-white)',\n sliderAvatarFontSize: '1rem',\n sliderAuthorNameColor: 'var(--color-primary-950)',\n sliderAuthorNameSize: '0.9375rem',\n sliderAuthorRoleColor: 'var(--color-neutral-500)',\n sliderAuthorRoleSize: '0.8125rem',\n },\n\n percentDialCard: {\n bg: 'linear-gradient(0deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 100%), linear-gradient(180deg, rgba(214, 233, 252, 0.5) 0%, var(--color-neutral-00, #fff) 49.5%)',\n stroke: 'var(--color-neutral-300)',\n label: 'var(--color-action-link-default, var(--color-primary-500))',\n text: 'var(--color-primary-950)',\n },\n\n percentDialCards: {\n text: 'var(--color-primary-950)',\n subheading: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-00)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n headingFontSize: '1.75rem',\n headingFontWeight: '700',\n headingLineHeight: '1.6',\n },\n\n pagination: {\n dotColor: 'var(--color-primary-950)',\n arrowColor: 'var(--color-primary-950)',\n arrowDisabledColor: 'var(--color-neutral-400)',\n },\n\n carousel: {\n gap: '2.5rem',\n transitionDuration: '300ms',\n transitionEasing: 'ease-out',\n faderColor: 'var(--color-white)',\n },\n },\n};\n","/**\n * Primax color system\n * Brilliant Blue, Neon Mint, and Electric Berry color scheme\n */\n\nimport { ColorSystem } from '../../core/color-system';\n\nexport const primaxColorSystem: ColorSystem = {\n // ============================================================================\n // TIER 1: BASE COLORS\n // ============================================================================\n primitives: {\n // Primary (Blue scale)\n 'color-primary-50': '#E0FAFF',\n 'color-primary-100': '#D1F0FF',\n 'color-primary-200': '#BEDFFF',\n 'color-primary-300': '#A6C8FF',\n 'color-primary-400': '#78A7FB',\n 'color-primary-500': '#3B7EFD',\n 'color-primary-600': '#0061FF', // Key color\n 'color-primary-700': '#1944CE',\n 'color-primary-800': '#203399',\n 'color-primary-900': '#1B2369',\n 'color-primary-950': '#0D0942', // Key color (Navy)\n\n // Secondary (Mint/Teal scale)\n 'color-secondary-50': '#DBFFF6',\n 'color-secondary-100': '#BEFFEB',\n 'color-secondary-200': '#00FFD2', // Key color\n 'color-secondary-300': '#2EE6BF',\n 'color-secondary-400': '#06C3A0',\n 'color-secondary-500': '#1A9C80',\n 'color-secondary-600': '#05816A',\n 'color-secondary-700': '#026754',\n 'color-secondary-800': '#084E3F',\n 'color-secondary-900': '#03372B',\n 'color-secondary-950': '#012119',\n\n // Accent (Pink/Magenta scale)\n 'color-accent-50': '#FFE7EE',\n 'color-accent-100': '#FFDAE2',\n 'color-accent-200': '#FFC7D0',\n 'color-accent-300': '#FEAEB9',\n 'color-accent-400': '#FE748F',\n 'color-accent-500': '#FE0066', // Key color\n 'color-accent-600': '#C91452',\n 'color-accent-700': '#A20D40',\n 'color-accent-800': '#7D062F',\n 'color-accent-900': '#5A011F',\n 'color-accent-950': '#380211',\n\n // Neutral (Gray scale)\n 'color-neutral-00': '#FFFFFF',\n 'color-neutral-50': '#FAFAFA',\n 'color-neutral-75': '#F7F7F7',\n 'color-neutral-100': '#E7EFFD',\n 'color-neutral-200': '#D6DEEE',\n 'color-neutral-250': '#D9D9D9',\n 'color-neutral-300': '#BFC8D8',\n 'color-neutral-400': '#A0A8B8',\n 'color-neutral-500': '#7F8696',\n 'color-neutral-600': '#6B7280', // Key color\n 'color-neutral-700': '#525865',\n 'color-neutral-800': '#3D424D',\n 'color-neutral-850': '#3D3D3D',\n 'color-neutral-900': '#2A2E35',\n 'color-neutral-950': '#171B21',\n 'color-neutral-1000': '#000000',\n\n // Success (Teal scale)\n 'color-success-50': '#E3FFFA',\n 'color-success-100': '#BBFEF2',\n 'color-success-200': '#79F8E4',\n 'color-success-300': '#5AE1CE',\n 'color-success-400': '#14B8A6', // Key color\n 'color-success-500': '#1B9A8B',\n 'color-success-600': '#068073',\n 'color-success-700': '#03675C',\n 'color-success-800': '#004E45',\n 'color-success-900': '#033630',\n 'color-success-950': '#01201C',\n\n // Warning (Yellow scale)\n 'color-warning-50': '#FFF7DA',\n 'color-warning-100': '#FEEDC7',\n 'color-warning-200': '#FED987',\n 'color-warning-300': '#EAB308', // Key color\n 'color-warning-400': '#D19F03',\n 'color-warning-500': '#A68015',\n 'color-warning-600': '#8B6904',\n 'color-warning-700': '#6F5301',\n 'color-warning-800': '#543F06',\n 'color-warning-900': '#3B2B02',\n 'color-warning-950': '#241900',\n\n // Error (Red scale)\n 'color-error-50': '#FFECE7',\n 'color-error-100': '#FFDFD9',\n 'color-error-200': '#FFCDC6',\n 'color-error-300': '#FDB1AA',\n 'color-error-400': '#FD7A72',\n 'color-error-500': '#EF4444', // Key color\n 'color-error-600': '#C8252B',\n 'color-error-700': '#A4111C',\n 'color-error-800': '#7F0813',\n 'color-error-900': '#5B030A',\n 'color-error-950': '#3A0003',\n\n // Info (Cyan scale)\n 'color-info-50': '#E2FDFF',\n 'color-info-100': '#D3F4FF',\n 'color-info-200': '#BEE4FD',\n 'color-info-300': '#89D1FE',\n 'color-info-400': '#0EA5E9', // Key color\n 'color-info-500': '#0D90CC',\n 'color-info-600': '#0F77A8',\n 'color-info-700': '#095F88',\n 'color-info-800': '#044868',\n 'color-info-900': '#01324A',\n 'color-info-950': '#011D2D',\n\n // Base\n 'color-white': '#FFFFFF',\n 'color-black': '#000000',\n 'color-transparent': 'transparent',\n },\n\n // ============================================================================\n // TIER 2: SEMANTIC COLOR TOKENS\n // ============================================================================\n semantic: {\n // ============================================================================\n // LIGHT BACKGROUND SEMANTIC TOKENS\n // ============================================================================\n\n // Surface colors (light backgrounds)\n 'color-surface-canvas': 'var(--color-neutral-00)',\n 'color-surface-default': 'var(--color-neutral-50)',\n 'color-surface-subtle': 'var(--color-neutral-100)',\n 'color-surface-raised': 'var(--color-neutral-50)',\n 'color-surface-sunken': 'var(--color-neutral-200)',\n 'color-surface-inverse': 'var(--color-neutral-900)',\n 'color-surface-icons': 'var(--color-accent-500)',\n\n // Text colors (light backgrounds)\n 'color-text-primary': 'var(--color-primary-950)',\n 'color-text-secondary': 'var(--color-neutral-800)',\n 'color-text-tertiary': 'var(--color-neutral-500)',\n 'color-text-caption': 'var(--color-neutral-600)',\n 'color-text-disabled': 'var(--color-neutral-400)',\n 'color-text-on-brand': 'var(--color-neutral-00)',\n 'color-text-inverse': 'var(--color-primary-950)',\n 'color-text-forground': 'var(--color-neutral-00)',\n\n // Link colors (light backgrounds)\n 'color-text-link-default': 'var(--color-primary-600)',\n 'color-text-link-hover': 'var(--color-primary-700)',\n 'color-text-link-active': 'var(--color-primary-800)',\n 'color-text-link-visited': 'var(--color-primary-500)',\n\n // Border colors (light backgrounds)\n 'color-border-default': 'var(--color-primary-600)',\n 'color-border-subtle': 'var(--color-neutral-100)',\n 'color-border-strong': 'var(--color-primary-950)',\n 'color-border-focus-ring': 'var(--color-primary-600)',\n 'color-border-ghost': 'var(--color-primary-950)',\n\n // Action colors (light backgrounds)\n 'color-action-primary-default': 'var(--color-primary-600)',\n 'color-action-primary-foreground': 'var(--color-neutral-00)',\n 'color-action-primary-hover': 'var(--color-secondary-200)',\n 'color-action-primary-inverse': 'var(--color-primary-950)',\n 'color-action-primary-active': 'var(--color-primary-600)',\n 'color-action-primary-disabled': 'var(--color-neutral-500)',\n\n 'color-action-secondary-default': 'var(--color-primary-600)',\n 'color-action-secondary-foreground': 'var(--color-primary-600)',\n 'color-action-secondary-hover': 'var(--color-primary-950)',\n\n 'color-action-danger-default': 'var(--color-error-600)',\n 'color-action-danger-foreground': 'var(--color-error-500)',\n 'color-action-danger-hover': 'var(--color-error-700)',\n\n 'color-action-ghost-foreground': 'var(--color-primary-600)',\n 'color-action-ghost-hover-fg': 'var(--color-primary-950)',\n 'color-action-ghost-focus': 'var(--color-primary-600)',\n\n // Feedback colors (light backgrounds)\n 'color-feedback-success-background': 'var(--color-success-50)',\n 'color-feedback-success-foreground': 'var(--color-success-50)',\n 'color-feedback-success-border': 'var(--color-success-300)',\n 'color-feedback-success-text': 'var(--color-success-700)',\n\n 'color-feedback-error-background': 'var(--color-error-50)',\n 'color-feedback-error-foreground': 'var(--color-error-50)',\n 'color-feedback-error-border': 'var(--color-error-300)',\n 'color-feedback-error-text': 'var(--color-error-700)',\n\n 'color-feedback-warning-background': 'var(--color-warning-50)',\n 'color-feedback-warning-foreground': 'var(--color-warning-50)',\n 'color-feedback-warning-border': 'var(--color-warning-300)',\n 'color-feedback-warning-text': 'var(--color-warning-700)',\n\n 'color-feedback-info-background': 'var(--color-info-50)',\n 'color-feedback-info-foreground': 'var(--color-info-50)',\n 'color-feedback-info-border': 'var(--color-info-300)',\n 'color-feedback-info-text': 'var(--color-info-700)',\n\n // Overlay and state colors (light backgrounds)\n 'color-overlay-scrim': 'var(--color-neutral-900)',\n 'color-state-hover': 'var(--color-neutral-900)',\n 'color-state-active': 'var(--color-neutral-900)',\n\n // ============================================================================\n // DARK BACKGROUND SEMANTIC TOKENS\n // ============================================================================\n\n // Surface colors (dark backgrounds)\n 'color-surface-canvas-dark': 'var(--color-primary-950)',\n 'color-surface-default-dark': 'var(--color-neutral-900)',\n 'color-surface-subtle-dark': 'var(--color-neutral-800)',\n 'color-surface-raised-dark': 'var(--color-neutral-700)',\n 'color-surface-sunken-dark': 'var(--color-neutral-950)',\n 'color-surface-inverse-dark': 'var(--color-neutral-50)',\n 'color-surface-icons-dark': 'var(--color-accent-500)',\n\n // Text colors (dark backgrounds)\n 'color-text-primary-dark': 'var(--color-neutral-50)',\n 'color-text-secondary-dark': 'var(--color-neutral-200)',\n 'color-text-tertiary-dark': 'var(--color-neutral-400)',\n 'color-text-caption-dark': 'var(--color-neutral-300)',\n 'color-text-disabled-dark': 'var(--color-neutral-600)',\n 'color-text-on-brand-dark': 'var(--color-primary-950)',\n 'color-text-inverse-dark': 'var(--color-primary-950)',\n 'color-text-forground-dark': 'var(--color-neutral-1000)',\n\n // Link colors (dark backgrounds)\n 'color-text-link-default-dark': 'var(--color-primary-400)',\n 'color-text-link-hover-dark': 'var(--color-primary-300)',\n 'color-text-link-active-dark': 'var(--color-primary-200)',\n 'color-text-link-visited-dark': 'var(--color-primary-500)',\n\n // Border colors (dark backgrounds)\n 'color-border-default-dark': 'var(--color-neutral-00)',\n 'color-border-subtle-dark': 'var(--color-neutral-900)',\n 'color-border-strong-dark': 'var(--color-primary-950)',\n 'color-border-focus-ring-dark': 'var(--color-primary-600)',\n 'color-border-ghost-dark': 'var(--color-secondary-200)',\n\n // Action colors (dark backgrounds)\n 'color-action-primary-default-dark': 'var(--color-primary-600)',\n 'color-action-primary-foreground-dark': 'var(--color-neutral-00)',\n 'color-action-primary-hover-dark': 'var(--color-secondary-200)',\n 'color-action-primary-inverse-dark': 'var(--color-secondary-200)',\n 'color-action-primary-active-dark': 'var(--color-primary-600)',\n 'color-action-primary-disabled-dark': 'var(--color-neutral-500)',\n\n 'color-action-secondary-default-dark': 'var(--color-secondary-200)',\n 'color-action-secondary-foreground-dark': 'var(--color-neutral-00)',\n 'color-action-secondary-hover-dark': 'var(--color-neutral-00)',\n\n 'color-action-danger-default-dark': 'var(--color-error-600)',\n 'color-action-danger-foreground-dark': 'var(--color-error-500)',\n 'color-action-danger-hover-dark': 'var(--color-error-600)',\n 'color-action-danger-border-hover-dark': 'var(--color-error-400)',\n\n 'color-action-ghost-foreground-dark': 'var(--color-primary-950)',\n 'color-action-ghost-hover-fg-dark': 'var(--color-secondary-200)',\n 'color-action-ghost-focus-dark': 'var(--color-neutral-00)',\n\n // Feedback colors (dark backgrounds)\n 'color-feedback-success-background-dark': 'var(--color-success-950)',\n 'color-feedback-success-foreground-dark': 'var(--color-success-950)',\n 'color-feedback-success-border-dark': 'var(--color-success-700)',\n 'color-feedback-success-text-dark': 'var(--color-success-400)',\n\n 'color-feedback-error-background-dark': 'var(--color-error-950)',\n 'color-feedback-error-foreground-dark': 'var(--color-error-950)',\n 'color-feedback-error-border-dark': 'var(--color-error-700)',\n 'color-feedback-error-text-dark': 'var(--color-error-400)',\n\n 'color-feedback-warning-background-dark': 'var(--color-warning-950)',\n 'color-feedback-warning-foreground-dark': 'var(--color-warning-950)',\n 'color-feedback-warning-border-dark': 'var(--color-warning-700)',\n 'color-feedback-warning-text-dark': 'var(--color-warning-400)',\n\n 'color-feedback-info-background-dark': 'var(--color-info-950)',\n 'color-feedback-info-foreground-dark': 'var(--color-info-950)',\n 'color-feedback-info-border-dark': 'var(--color-info-700)',\n 'color-feedback-info-text-dark': 'var(--color-info-400)',\n\n // Overlay and state colors (dark backgrounds)\n 'color-overlay-scrim-dark': 'var(--color-neutral-950)',\n 'color-state-hover-dark': 'var(--color-neutral-50)',\n 'color-state-active-dark': 'var(--color-neutral-50)',\n\n // ============================================================================\n // LEGACY TIER 1 SEMANTIC TOKENS (mapped to new semantic structure)\n // ============================================================================\n\n // Background colors - mapped to new surface tokens\n 'tier1-theme-color-background-default-primary-default': 'var(--color-surface-canvas)', // Was Navy, now canvas\n 'tier1-theme-color-background-default-primary-hover': 'var(--color-primary-900)',\n 'tier1-theme-color-background-default-primary-active': 'var(--color-primary-800)',\n 'tier1-theme-color-background-default-secondary-default': 'var(--color-surface-default)', // Mapped to surface-default\n 'tier1-theme-color-background-default-secondary-hover': 'var(--color-surface-subtle)', // Mapped to surface-subtle\n 'tier1-theme-color-background-default-tertiary-default': 'var(--color-surface-subtle)', // Mapped to surface-subtle\n 'tier1-theme-color-background-default-tertiary-hover': 'var(--color-surface-sunken)', // Mapped to surface-sunken\n 'tier1-theme-color-background-accent-primary-default': 'var(--color-accent-500)', // Pink\n 'tier1-theme-color-background-accent-primary-hover': 'var(--color-accent-600)',\n 'tier1-theme-color-background-accent-primary-active': 'var(--color-accent-700)',\n 'tier1-theme-color-background-accent-secondary-default': 'var(--color-secondary-200)', // Mint\n 'tier1-theme-color-background-accent-secondary-hover': 'var(--color-secondary-300)',\n 'tier1-theme-color-background-accent-secondary-active': 'var(--color-secondary-400)',\n 'tier1-theme-color-background-default-inverse-default': 'var(--color-surface-inverse)', // Mapped to surface-inverse\n 'tier1-theme-color-background-utility-overlay-default': 'var(--color-overlay-scrim)', // Mapped to overlay-scrim\n\n // Content (text) colors - mapped to new text tokens\n 'tier1-theme-color-content-title-primary-default': 'var(--color-text-primary)', // Mapped to text-primary\n 'tier1-theme-color-content-default-primary-default': 'var(--color-text-primary)', // Mapped to text-primary\n 'tier1-theme-color-content-default-secondary-default': 'var(--color-text-secondary)', // Mapped to text-secondary\n 'tier1-theme-color-content-default-tertiary-default': 'var(--color-text-tertiary)', // Mapped to text-tertiary\n 'tier1-theme-color-content-default-inverse-default': 'var(--color-text-on-brand)', // Mapped to text-on-brand\n 'tier1-theme-color-content-disabled-subtle-default': 'var(--color-text-disabled)', // Mapped to text-disabled\n 'tier1-theme-color-content-accent-primary-default': 'var(--color-accent-500)', // Pink\n 'tier1-theme-color-content-accent-secondary-default': 'var(--color-secondary-200)', // Mint\n 'tier1-theme-color-content-default-link-default': 'var(--color-text-link-default)', // Mapped to text-link-default\n 'tier1-theme-color-content-default-link-hover': 'var(--color-text-link-hover)', // Mapped to text-link-hover\n\n // Border colors - mapped to new border tokens\n 'tier1-theme-color-border-default-subtle-default': 'var(--color-border-subtle)', // Mapped to border-subtle\n 'tier1-theme-color-border-default-default-default': 'var(--color-border-default)', // Mapped to border-default\n 'tier1-theme-color-border-default-strong-default': 'var(--color-border-strong)', // Mapped to border-strong\n 'tier1-theme-color-border-focus-primary-focus': 'var(--color-border-focus-ring)', // Mapped to border-focus-ring\n\n // State colors - mapped to new feedback tokens\n 'tier1-theme-color-background-utility-success-default': 'var(--color-feedback-success-background)',\n 'tier1-theme-color-content-utility-success-default': 'var(--color-feedback-success-text)',\n 'tier1-theme-color-content-utility-success-hover': 'var(--color-success-600)',\n 'tier1-theme-color-background-utility-warning-default': 'var(--color-feedback-warning-background)',\n 'tier1-theme-color-content-utility-warning-default': 'var(--color-feedback-warning-text)',\n 'tier1-theme-color-content-utility-warning-hover': 'var(--color-warning-600)',\n 'tier1-theme-color-background-utility-error-default': 'var(--color-feedback-error-background)',\n 'tier1-theme-color-content-utility-error-default': 'var(--color-feedback-error-text)',\n 'tier1-theme-color-content-utility-error-hover': 'var(--color-error-600)',\n 'tier1-theme-color-background-utility-info-default': 'var(--color-feedback-info-background)',\n 'tier1-theme-color-content-utility-info-default': 'var(--color-feedback-info-text)',\n 'tier1-theme-color-content-utility-info-hover': 'var(--color-info-500)',\n\n // Interactive colors - mapped to new action tokens\n 'tier1-theme-color-background-default-interactive-default': 'var(--color-action-primary-default)',\n 'tier1-theme-color-background-default-interactive-hover': 'var(--color-primary-700)',\n 'tier1-theme-color-background-default-interactive-active': 'var(--color-action-primary-active)',\n 'tier1-theme-color-background-default-interactive-disabled': 'var(--color-action-primary-disabled)',\n\n // Legacy semantic tokens for backward compatibility\n textBreadcrumbSeparator: 'var(--color-neutral-850)',\n textBreadcrumbLast: 'var(--color-primary-600)',\n textBreadcrumbHover: 'var(--color-primary-600)',\n textBreadcrumbActive: 'var(--color-secondary-100)',\n textBreadcrumb: 'var(--color-neutral-700)',\n containerStrokeColor: 'var(--color-neutral-250)',\n bodyTextColor: 'var(--color-neutral-850)',\n backgroundColor: 'var(--color-neutral-75)',\n darkBackgroundColor: 'var(--color-primary-950)',\n primary: 'var(--color-action-primary-default)', // Mapped to action-primary-default\n primaryHover: 'var(--color-primary-700)',\n primaryActive: 'var(--color-action-primary-active)',\n primaryText: 'var(--color-action-primary-foreground)', // Mapped to action-primary-foreground\n secondary: 'var(--color-action-secondary-default)', // Mapped to action-secondary-default\n secondaryHover: 'var(--color-primary-700)',\n secondaryActive: 'var(--color-primary-800)',\n secondaryText: 'var(--color-text-on-brand)', // Mapped to text-on-brand\n accent: 'var(--color-accent-500)',\n accentHover: 'var(--color-accent-600)',\n accentActive: 'var(--color-accent-700)',\n accentText: 'var(--color-text-on-brand)', // Mapped to text-on-brand\n tertiary: 'var(--color-secondary-200)',\n tertiaryHover: 'var(--color-secondary-300)',\n tertiaryActive: 'var(--color-secondary-400)',\n tertiaryText: 'var(--color-text-primary)', // Mapped to text-primary\n textPrimary: 'var(--color-text-primary)', // Mapped to text-primary\n textSecondary: 'var(--color-text-secondary)', // Mapped to text-secondary\n textTertiary: 'var(--color-text-tertiary)', // Mapped to text-tertiary\n textInverse: 'var(--color-text-inverse)', // Mapped to text-inverse\n textDisabled: 'var(--color-text-disabled)', // Mapped to text-disabled\n textLink: 'var(--color-text-link-default)', // Mapped to text-link-default\n textLinkHover: 'var(--color-text-link-hover)', // Mapped to text-link-hover\n bgPrimary: 'var(--color-surface-canvas)', // Mapped to surface-canvas\n bgSecondary: 'var(--color-surface-default)', // Mapped to surface-default\n bgTertiary: 'var(--color-surface-subtle)', // Mapped to surface-subtle\n bgInverse: 'var(--color-surface-inverse)', // Mapped to surface-inverse\n bgOverlay: 'var(--color-overlay-scrim)', // Mapped to overlay-scrim\n borderDefault: 'var(--color-border-default)', // Mapped to border-default\n borderSubtle: 'var(--color-border-subtle)', // Mapped to border-subtle\n borderStrong: 'var(--color-border-strong)', // Mapped to border-strong\n borderFocus: 'var(--color-border-focus-ring)', // Mapped to border-focus-ring\n stateSuccess: 'var(--color-feedback-success-text)', // Mapped to feedback-success-text\n stateSuccessHover: 'var(--color-success-600)',\n stateSuccessBg: 'var(--color-feedback-success-background)', // Mapped to feedback-success-background\n stateWarning: 'var(--color-feedback-warning-text)', // Mapped to feedback-warning-text\n stateWarningHover: 'var(--color-warning-600)',\n stateWarningBg: 'var(--color-feedback-warning-background)', // Mapped to feedback-warning-background\n stateError: 'var(--color-feedback-error-text)', // Mapped to feedback-error-text\n stateErrorHover: 'var(--color-error-600)',\n stateErrorBg: 'var(--color-feedback-error-background)', // Mapped to feedback-error-background\n stateInfo: 'var(--color-feedback-info-text)', // Mapped to feedback-info-text\n stateInfoHover: 'var(--color-info-500)',\n stateInfoBg: 'var(--color-feedback-info-background)', // Mapped to feedback-info-background\n interactivePrimary: 'var(--color-action-primary-default)', // Mapped to action-primary-default\n interactivePrimaryHover: 'var(--color-action-primary-hover)',\n interactivePrimaryHoverForeground: 'var(--color-text-inverse)',\n interactivePrimaryActive: 'var(--color-action-primary-active)', // Mapped to action-primary-active\n interactiveSecondary: 'var(--color-neutral-200)',\n interactiveSecondaryHover: 'var(--color-neutral-300)',\n interactiveSecondaryActive: 'var(--color-neutral-400)',\n interactiveDisabled: 'var(--color-action-primary-disabled)', // Mapped to action-primary-disabled\n },\n};\n","/**\n * Primax theme configuration\n * Blue and orange color scheme for Primax brand\n */\n\nimport { ThemeConfig } from '../core/types';\nimport { defaultTheme } from './default';\nimport { primaxColorSystem } from './color-systems/primax-colors';\nimport sparkPattern from '@assets/spark-pattern.png';\nimport primaxLogoDark from '@assets/primax-logo-dark.svg';\nimport primaxLogoLight from '@assets/primax-logo-light.svg';\n\n/** Primax footer logo configuration */\nexport const primaxFooterLogo = {\n light: primaxLogoDark,\n dark: primaxLogoLight,\n alt: 'Primax',\n width: 200,\n height: 63,\n};\n\nexport const primaxTheme: ThemeConfig = {\n ...defaultTheme,\n name: 'primax',\n fontImportUrl: ['https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap'],\n\n colors: {\n primitives: primaxColorSystem.primitives,\n semantic: primaxColorSystem.semantic,\n },\n\n colorPalettes: [\n { name: 'Primary', bg: 'primary', text: 'primaryText' },\n { name: 'Secondary', bg: 'secondary', text: 'secondaryText' },\n { name: 'Accent', bg: 'accent', text: 'accentText' },\n { name: 'Tertiary', bg: 'tertiary', text: 'tertiaryText' },\n ],\n\n typography: {\n ...defaultTheme.typography,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontFamilyHeading: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n\n variants: {\n title: {\n fontSize: '3.5rem',\n fontWeight: '700',\n lineHeight: '1.2',\n mobile: {\n fontSize: '2.25rem',\n },\n },\n sectionDivider: {\n fontSize: '2.5rem',\n fontWeight: '700',\n lineHeight: '1.2',\n mobile: {\n fontSize: '1.75rem',\n },\n },\n subtitle: {\n fontSize: '1.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n mobile: {\n fontSize: '1.375rem',\n },\n },\n componentTitle: {\n fontSize: '1.5rem',\n fontWeight: '700',\n lineHeight: '1.3',\n mobile: {\n fontSize: '1.25rem',\n },\n },\n body: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n },\n bodyBold: {\n fontSize: '1.125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n bodySmall: {\n fontSize: '1.125rem',\n fontWeight: '700',\n lineHeight: '1.6',\n },\n },\n },\n\n components: {\n ...defaultTheme.components,\n cta: {\n ...defaultTheme.components.cta,\n },\n },\n\n componentTokens: {\n playButton: {\n color: 'var(--icon-fill-accent)',\n shadowOpacity: '0.4',\n shadowOpacityHover: '1',\n shadowOpacityActive: '0.4',\n\n colorHover: 'var(--icon-fill-accent)',\n colorFocus: 'var(--icon-fill-accent)',\n colorActive: '#1944CE',\n\n dark: {\n color: 'var(--icon-fill-accent)',\n colorHover: 'var(--icon-fill-accent)',\n colorFocus: 'var(--icon-fill-accent)',\n colorActive: '#1944CE',\n },\n },\n\n breadcrumb: {\n gap: 'var(--tier1-theme-spacing-sm, 0.5rem)',\n fontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 0.875rem)',\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n fontWeight: 'var(--paragraph-font-weight, 400)',\n fontWeightHover: 'var(--paragraph-strong-font-weight, 700)',\n linkColor: 'var(--text-breadcrumb)',\n linkHoverColor: 'var(--text-breadcrumb-hover)',\n linkActiveFontWeight: 'var(--paragraph-strong-font-weight)',\n linkActiveColor: 'var(--text-breadcrumb)',\n lastItemColor: 'var(--text-breadcrumb)',\n lastItemFontWeight: 'var(--paragraph-strong-font-weight, 700)',\n\n separatorColor: 'var(--text-breadcrumb-separator)',\n\n focusColor: 'var(--tier1-theme-color-border-focus-default-default)',\n\n dark: {\n lastItemColor: 'var(--color-neutral-00)',\n linkColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n linkHoverColor: 'var(--breadcrumb-text-color)',\n linkActiveColor: 'var(--text-breadcrumb-active)',\n textColor: 'var(--color-secondary-200)',\n separatorColor: 'var(--color-neutral-00)',\n },\n },\n halfColumn: {\n gap: '7.62rem',\n },\n\n primaxCta: {\n gap: '3.75rem',\n padding: '0',\n headingMaxWidth: '53.75rem',\n formWidth: '39.375rem',\n lg: {\n formWidth: '100%',\n },\n tablet: {\n gap: '1.875rem',\n padding: '0',\n },\n mobile: {\n gap: '1.875rem',\n padding: '0',\n },\n },\n\n banner: {\n contentGapY: '0.9375rem',\n xl: {\n mediaBlockImagePadding: '0 1.875rem',\n mediaBlockImageOffset: '-6.25rem',\n },\n md: {\n mediaBlockImageOffset: '-4.9375rem',\n },\n sm: {\n mediaBlockImageOffset: '-3.4375rem',\n },\n },\n divider: {\n sparkPatternUrl: `url(${sparkPattern})`,\n lg: {\n height: 'auto',\n },\n md: {\n height: 'auto',\n padding: '32px',\n },\n sm: {\n height: 'auto',\n padding: '16px',\n },\n },\n\n mediaBlock: {\n width: '33.75rem',\n height: '31.25rem',\n\n borderRadius: '0 0 0 2rem',\n borderRadiusMirror: '2rem 0 2rem 0',\n\n videoBorderRadius: '0 2rem 0 2rem',\n videoBorderRadiusMirror: '2rem 0 2rem 0',\n videoAccentColor: 'var(--color-secondary-200)',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n\n overlayBg: 'rgba(0, 0, 0, 0.3)',\n\n accentColor: 'var(--color-action-primary-default)',\n accentThickness: '0.625rem',\n accentGap: '0',\n accentSideRow: '6',\n accentSideSpan: '7',\n accentBottomCol: '4',\n accentBottomSpan: '6',\n playIconBg: 'transparent',\n playIconWidth: '9.375rem',\n playIconHeight: 'auto',\n playIconPaddingLeft: '1.5rem',\n playIconImageWidth: '9.375rem',\n playIconImageHeight: '11rem',\n\n sparkRow: '4',\n sparkRowSpan: '6',\n sparkCol: '1',\n sparkColSpan: '4',\n sparkWidth: '58%',\n sparkHeight: '80%',\n sparkRotate: '0deg',\n sparkColMirror: '7',\n sparkTranslateMirrorX: '125%',\n\n croppedSparkWidth: '42.8125rem',\n croppedSparkHeight: '40.8125rem',\n croppedSparkMaskRotate: '-15deg',\n croppedSparkMaskOffsetY: '15%',\n croppedSparkMaskOffsetX: '-10%',\n croppedSparkSvgScale: '1.3',\n croppedSparkStrokeColor: 'var(--color-secondary-200)',\n croppedSparkStrokeWidth: '3px',\n croppedSparkIconLgWidth: '13.625rem',\n croppedSparkIconLgTop: '4%',\n croppedSparkIconLgRight: '2%',\n croppedSparkIconSmWidth: '7.6875rem',\n croppedSparkIconSmTop: '34.6%',\n croppedSparkIconSmLeft: '10%',\n croppedSparkSmallSparksWidth: '18.5625rem',\n croppedSparkSmallSparksTop: '40%',\n croppedSparkSmallSparksRight: '10%',\n mobile: {\n videoHeight: '25rem',\n height: '25rem',\n maxWidth: '27.5rem',\n maxHeight: '100%',\n accentThickness: '0.5rem',\n playIconWidth: '7.8125rem',\n playIconHeight: '7.8125rem',\n playIconImageWidth: '5.625rem',\n playIconImageHeight: '6.625rem',\n croppedSparkSmallSparksTop: '30%',\n croppedSparkSmallSparksRight: '10%',\n },\n\n tablet: {\n videoHeight: '43rem',\n height: '43.75rem',\n maxWidth: '100%',\n maxHeight: '100%',\n accentThickness: '0.9375rem',\n },\n },\n\n icon: {\n size: '1.5rem',\n\n fillPrimary: 'var(--color-primary-600)',\n strokePrimary: 'var(--color-primary-600)',\n strokeWidthPrimary: '0',\n\n fillSecondary: 'var(--color-secondary-200)',\n strokeSecondary: 'var(--color-secondary-200)',\n strokeWidthSecondary: '0',\n\n fillAccent: 'var(--color-accent-500)',\n strokeAccent: 'var(--color-accent-500)',\n strokeWidthAccent: '0',\n\n fillSuccess: 'var(--color-success-500)',\n strokeSuccess: 'var(--color-success-500)',\n strokeWidthSuccess: '0',\n\n fillWarning: 'var(--color-warning-500)',\n strokeWarning: 'var(--color-warning-500)',\n strokeWidthWarning: '0',\n\n fillError: 'var(--color-error-500)',\n strokeError: 'var(--color-error-500)',\n strokeWidthError: '0',\n\n sizes: {\n xs: {\n size: '0.75rem',\n },\n sm: {\n size: '1rem',\n },\n md: {\n size: '1.5rem',\n },\n lg: {\n size: '2rem',\n },\n xl: {\n size: '4.375rem',\n },\n },\n },\n\n button: {\n borderWidth: '2px',\n padding: '1rem 1.5rem',\n fontSize: '1rem',\n fontWeight: '600',\n lineHeight: '1.375rem',\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n shadow: 'none',\n\n gap: '0.3125rem',\n\n faWidth: '0.875rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n hoverAnimation: 'button-spring-up 0.3s ease-out forwards',\n hoverOutAnimation: 'button-spring-down 0.3s ease-out forwards',\n\n sizes: {\n sm: {\n padding: '0.75rem 1rem',\n fontSize: '0.875rem',\n lineHeight: '1.125rem',\n faWidth: '0.75rem',\n },\n md: {\n padding: '1rem 1.5rem',\n fontSize: '1rem',\n lineHeight: '1.375rem',\n faWidth: '0.8125rem',\n },\n lg: {\n padding: '1.25rem 1.875rem',\n fontSize: '1.125rem',\n lineHeight: '1.5rem',\n faWidth: '0.875rem',\n },\n },\n\n variants: {\n general: {\n bg: 'var(--color-primary-600)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-primary-600)',\n bgHover: 'var(--color-secondary-200)',\n textHover: 'var(--color-primary-950)',\n borderHover: 'var(--color-primary-950)',\n bgActive: 'var(--color-primary-700)',\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n\n bgDisabled: 'var(--color-neutral-500)',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'var(--color-neutral-500)',\n\n dark: {\n bg: 'var(--color-primary-600)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-primary-600)',\n bgHover: 'var(--color-secondary-200)',\n textHover: 'var(--color-primary-950)',\n borderHover: 'var(--color-primary-950)',\n bgActive: 'var(--color-primary-700)',\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n },\n },\n secondary: {\n bg: 'transparent',\n border: 'var(--color-primary-600)',\n text: 'var(--color-primary-600)',\n\n textActive: 'var(--color-primary-600)',\n bgActive: 'transparent',\n\n bgHover: 'transparent',\n textHover: 'var(--color-primary-950)',\n borderHover: 'var(--color-primary-950)',\n\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n\n bgDisabled: 'transparent',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'var(--color-neutral-300)',\n\n dark: {\n bg: 'transparent',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-neutral-00)',\n\n bgHover: 'transparent',\n textHover: 'var(--color-secondary-200)',\n borderHover: 'var(--color-secondary-200)',\n\n borderActive: 'var(--color-primary-300)',\n textActive: 'var(--color-primary-300)',\n bgActive: 'transparent',\n\n bgFocus: 'var(--color-primary-600)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-primary-600)',\n },\n },\n link: {\n bg: 'transparent',\n text: 'var(--color-primary-600)',\n border: 'transparent',\n fontSize: '1.125rem',\n fontWeight: '700',\n padding: '0.25rem 0.5rem',\n focusOutline: 'none',\n focusOutlineOffset: '0',\n\n bgHover: 'transparent',\n textHover: 'var(--color-primary-950)',\n borderHover: 'transparent',\n\n bgActive: 'transparent',\n textActive: 'var(--color-primary-950)',\n borderActive: 'transparent',\n\n bgFocus: 'transparent',\n textFocus: 'var(--color-primary-600)',\n borderFocus: 'transparent',\n\n bgDisabled: 'transparent',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'transparent',\n\n sizes: {\n sm: {\n fontSize: '0.875rem',\n },\n md: {\n fontSize: '1rem',\n },\n lg: {\n fontSize: '1.125rem',\n },\n },\n\n dark: {\n bg: 'transparent',\n text: 'var(--color-neutral-00)',\n border: 'transparent',\n\n bgHover: 'transparent',\n textHover: 'var(--color-secondary-200)',\n borderHover: 'transparent',\n\n bgActive: 'transparent',\n textActive: 'var(--color-secondary-200)',\n borderActive: 'transparent',\n\n bgFocus: 'transparent',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'transparent',\n },\n },\n danger: {\n bg: 'var(--color-action-danger-default)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-action-danger-default)',\n focusOutline: '0.125rem solid var(--color-action-danger-default)',\n focusOutlineOffset: '0.125rem',\n\n bgHover: 'var(--color-action-danger-hover)',\n textHover: 'var(--color-neutral-00)',\n borderHover: 'var(--color-error-900)',\n\n bgActive: 'var(--color-error-700)',\n textActive: 'var(--color-neutral-00)',\n borderActive: 'var(--color-error-700)',\n\n bgFocus: 'var(--color-action-danger-default)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-action-danger-default)',\n\n bgDisabled: 'var(--color-neutral-500)',\n textDisabled: 'var(--color-neutral-300)',\n borderDisabled: 'var(--color-neutral-500)',\n\n dark: {\n bg: 'var(--color-action-danger-default-dark)',\n text: 'var(--color-neutral-00)',\n border: 'var(--color-action-danger-default-dark)',\n focusOutline: '0.125rem solid var(--color-action-danger-default-dark)',\n\n bgHover: 'var(--color-action-danger-hover-dark)',\n textHover: 'var(--color-neutral-00)',\n borderHover: 'var(--color-action-danger-border-hover-dark)',\n\n bgActive: 'var(--color-error-700)',\n textActive: 'var(--color-neutral-00)',\n borderActive: 'var(--color-error-700)',\n\n bgFocus: 'var(--color-action-danger-default-dark)',\n textFocus: 'var(--color-neutral-00)',\n borderFocus: 'var(--color-action-danger-default-dark)',\n },\n },\n },\n },\n textLink: {\n color: 'var(--color-primary-600)',\n fontSize: '1.125rem',\n fontWeight: '700',\n textDecoration: 'none',\n\n colorActive: 'var(--color-primary-700)',\n colorHover: 'var(--color-primary-950)',\n colorFocus: 'var(--color-primary-600)',\n\n textDecorationFocus: 'underline',\n textDecorationStyleFocus: 'solid',\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n dark: {\n color: 'var(--color-secondary-200)',\n colorHover: 'var(--color-neutral-00)',\n colorFocus: 'var(--color-secondary-200)',\n colorActive: 'var(--color-secondary-100)',\n },\n },\n heading: {\n margin: '0',\n padding: '0',\n color: 'var(--color-text-primary)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n\n h1FontSize: 'var(--tier1-theme-typography-font-size-2xl, 2.5rem)',\n h1FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h1LineHeight: 'var(--tier1-theme-typography-h1-desktop-line-height, 1.2)',\n h1LetterSpacing: 'normal',\n\n h2FontSize: 'var(--tier1-theme-typography-font-size-xl, 2rem)',\n h2FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h2LineHeight: 'var(--tier1-theme-typography-h2-desktop-line-height, 1.3)',\n h2LetterSpacing: 'normal',\n\n h3FontSize: 'var(--tier1-theme-typography-font-size-lg, 1.75rem)',\n h3FontWeight: 'var(--tier1-theme-typography-font-weight-bold, 700)',\n h3LineHeight: 'var(--tier1-theme-typography-h3-desktop-line-height, 1.4)',\n h3LetterSpacing: 'normal',\n\n h4FontSize: 'var(--tier1-theme-typography-font-size-md, 1.5rem)',\n h4FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h4LineHeight: 'var(--tier1-theme-typography-h4-desktop-line-height, 1.4)',\n\n h5FontSize: 'var(--tier1-theme-typography-font-size-sm, 1.25rem)',\n h5FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h5LineHeight: 'var(--tier1-theme-typography-h5-desktop-line-height, 1.5)',\n\n h6FontSize: 'var(--tier1-theme-typography-font-size-xs, 1rem)',\n h6FontWeight: 'var(--tier1-theme-typography-font-weight-semibold, 700)',\n h6LineHeight: 'var(--tier1-theme-typography-h6-desktop-line-height, 1.5)',\n\n titleFontSize: '3.5rem',\n titleFontWeight: '700',\n titleLineHeight: '1.2',\n titleColor: 'var(--color-text-primary)',\n\n sectionDividerFontSize: '2.5rem',\n sectionDividerFontWeight: '700',\n sectionDividerLineHeight: '1.2',\n sectionDividerColor: 'var(--color-text-primary)',\n\n subtitleFontSize: '1.75rem',\n subtitleFontWeight: '400',\n subtitleLineHeight: '1.4',\n subtitleColor: 'var(--color-text-primary)',\n\n componentTitleFontSize: '1.5rem',\n componentTitleFontWeight: '700',\n componentTitleLineHeight: '1.3',\n componentTitleColor: 'var(--color-text-primary)',\n\n bodyFontSize: '1.125rem',\n bodyFontWeight: '400',\n bodyLineHeight: '1.6',\n bodyColor: 'var(--color-text-secondary)',\n\n bodyBoldFontSize: '1.125rem',\n bodyBoldFontWeight: '700',\n bodyBoldLineHeight: '1.6',\n bodyBoldColor: 'var(--color-text-secondary)',\n\n bodySmallFontSize: '1.125rem',\n bodySmallFontWeight: '700',\n bodySmallLineHeight: '1.6',\n bodySmallColor: 'var(--color-text-secondary)',\n\n dark: {\n color: 'var(--color-neutral-00)',\n },\n\n mobile: {\n titleFontSize: '2.25rem',\n sectionDividerFontSize: '1.75rem',\n subtitleFontSize: '1.375rem',\n componentTitleFontSize: '1.25rem',\n },\n },\n card: {\n bg: '#fff',\n border: '1px solid var(--color-neutral-200)',\n borderRadius: '0',\n shadow: 'var(--tier1-theme-shadow-md)',\n padding: 'var(--tier1-theme-spacing-xl)',\n maxWidth: '25rem',\n height: '21.5625rem',\n\n focusOutline: '0.125rem solid var(--tier1-theme-color-border-focus-primary-focus)',\n focusOutlineOffset: '0.125rem',\n\n borderActive: '0.125rem solid var(--tier1-theme-color-background-default-interactive-default)',\n\n imageWrapperBorderRadius:\n 'var(--tier1-theme-border-radius-lg, 1.25rem) var(--tier1-theme-border-radius-lg, 1.25rem) 0 0',\n imageAspectRatio: '3/2',\n\n md: {\n imageAspectRatio: '16/9',\n },\n },\n\n grid: {\n gapXs: '0.9375rem',\n gapSm: '1.875rem',\n gapMd: '3.75rem',\n gapLg: '4.5rem',\n gapXl: '9rem',\n\n gap: '3.75rem',\n\n tablet: {\n gap: '2rem',\n\n gapSm: '0.9375rem',\n gapMd: '2rem',\n gapLg: '3rem',\n gapXl: '5rem',\n },\n mobile: {\n gap: '1rem',\n\n gapSm: '0.3125rem',\n gapMd: '1rem',\n gapLg: '1.5rem',\n gapXl: '4rem',\n },\n },\n\n header: {\n bg: 'var(--tier1-theme-color-background-default-secondary-default)',\n border: '1px solid var(--tier1-theme-color-border-default-subtle-default)',\n height: '4rem',\n padding: 'var(--tier1-theme-spacing-md) var(--tier1-theme-spacing-lg)',\n\n titleColor: 'var(--tier1-theme-color-content-default-primary-default)',\n titleFontSize: 'var(--tier1-theme-typography-h5-desktop-font-size, 1.25rem)',\n titleFontWeight: 'var(--tier1-theme-typography-h1-desktop-font-weight, 700)',\n titleMargin: '0.375rem 0 0.375rem var(--tier1-theme-spacing-sm, 0.625rem)',\n\n welcomeColor: 'var(--tier1-theme-color-content-default-secondary-default)',\n welcomeFontSize: 'var(--tier1-theme-typography-body-small-desktop-font-size, 0.875rem)',\n welcomeMargin: 'var(--tier1-theme-spacing-sm, 0.625rem)',\n\n buttonSpacing: 'var(--tier1-theme-spacing-sm, 0.625rem)',\n },\n\n cta: {\n height: '31.25rem',\n\n contentBg: 'var(--tier1-theme-color-background-default-primary-default)',\n contentMaxWidth: '47.8125rem',\n contentBorderRadius: '0 0 12.5rem',\n contentPadding: 'var(--tier1-theme-spacing-xxl) var(--tier1-theme-spacing-xl) 0 var(--tier1-theme-spacing-xxl)',\n\n titleColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n titleFontSize: '3.4375rem',\n titleLineHeight: '4.0625rem',\n titleFontWeight: '900',\n titleMargin: '0 0 1rem',\n titleFontFamily: 'var(--tier1-theme-typography-font-family-heading, var(--tier1-theme-typography-font-family))',\n\n descriptionColor: 'var(--tier1-theme-color-content-default-inverse-default)',\n descriptionFontSize: '1.5rem',\n descriptionLineHeight: '2rem',\n descriptionFontWeight: '100',\n descriptionMargin: '0 0 1.875rem 0',\n descriptionFontFamily: 'var(--tier1-theme-typography-font-family)',\n\n md: {\n height: '28.125rem',\n titleFontSize: '2.5rem',\n titleLineHeight: '1.2',\n descriptionFontSize: '1.125rem',\n descriptionLineHeight: '1.6',\n },\n },\n\n richText: {\n color: 'var(--color-text-primary)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n lineHeight: '1.6',\n\n headingMarginBottom: 'var(--tier1-theme-spacing-md, 1rem)',\n\n paragraphFontSize: '1.125rem',\n paragraphFontWeight: '400',\n paragraphLineHeight: '1.6',\n paragraphMarginBottom: 'var(--tier1-theme-spacing-md, 1rem)',\n paragraphColor: 'var(--color-text-secondary)',\n\n listMargin: 'var(--tier1-theme-spacing-md, 1rem) 0',\n listPaddingLeft: '1rem',\n listItemFontSize: '1.125rem',\n listItemLineHeight: '1.6',\n listItemMarginBottom: 'var(--tier1-theme-spacing-sm, 0.5rem)',\n listItemColor: 'var(--color-text-secondary)',\n ulListStyleType: 'none',\n olListStyleType: 'decimal',\n\n strongFontWeight: '700',\n\n codeFontSize: '0.875em',\n codeBg: 'var(--color-neutral-100)',\n codePadding: '0.125rem 0.25rem',\n\n preFontSize: '0.875rem',\n preBg: 'var(--color-neutral-100)',\n prePadding: 'var(--tier1-theme-spacing-md, 1rem)',\n\n blockquoteMargin: 'var(--tier1-theme-spacing-md, 1rem) 0',\n blockquotePadding: 'var(--tier1-theme-spacing-sm, 0.5rem) var(--tier1-theme-spacing-md, 1rem)',\n blockquoteBorderLeft: '0.25rem solid var(--color-primary-600)',\n blockquoteColor: 'var(--color-text-secondary)',\n\n hrBorder: '1px solid var(--color-neutral-200)',\n hrMargin: 'var(--tier1-theme-spacing-lg, 1.5rem) 0',\n\n mobile: {\n paragraphFontSize: '1rem',\n paragraphLineHeight: '1.6',\n listItemFontSize: '1rem',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n paragraphColor: 'var(--color-neutral-00)',\n listItemColor: 'var(--color-neutral-00)',\n blockquoteColor: 'var(--color-neutral-00)',\n codeBg: 'var(--color-neutral-800)',\n preBg: 'var(--color-neutral-800)',\n hrBorder: '1px solid var(--color-neutral-700)',\n },\n },\n\n paragraph: {\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.6',\n color: 'var(--color-text-secondary)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n letterSpacing: 'normal',\n\n strongFontWeight: '700',\n\n mobile: {\n fontSize: '1rem',\n lineHeight: '1.6',\n },\n\n tablet: {\n fontSize: '1.125rem',\n lineHeight: '1.6',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n },\n },\n\n blockquote: {\n margin: 'var(--tier1-theme-spacing-md, 1rem) 0',\n padding: '0 0 0 var(--tier1-theme-spacing-lg, 1.5rem)',\n borderLeft: 'none',\n bg: 'transparent',\n borderRadius: '0',\n fontStyle: 'normal',\n\n borderPrimaryWidth: '10px',\n borderSecondaryWidth: '5px',\n borderColorPrimary: 'var(--color-primary-950)',\n borderColorSecondary: 'var(--color-secondary-200)',\n\n fontSize: 'var(--heading-subtitle-font-size, 1.75rem)',\n fontWeight: 'var(--heading-subtitle-font-weight, 400)',\n lineHeight: 'var(--heading-subtitle-line-height, 1.4)',\n color: 'var(--color-primary-950)',\n\n citationMarginTop: 'var(--tier1-theme-spacing-md, 1rem)',\n citationFontSize: '1rem',\n citationFontWeight: '600',\n citationColor: 'var(--color-text-secondary)',\n citationPrefix: '\"— \"',\n\n mobile: {\n fontSize: 'var(--heading-subtitle-font-size-mobile, 1.375rem)',\n lineHeight: '1.3',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n citationColor: 'var(--color-neutral-00)',\n borderColorPrimary: 'var(--color-secondary-200)',\n borderColorSecondary: 'var(--color-neutral-00)',\n },\n },\n\n footnote: {\n labelFontWeight: '700',\n markerFontSize: '0.75em',\n markerFontWeight: '700',\n labelColor: 'var(--color-primary-950)',\n dark: {\n labelFontWeight: '700',\n },\n },\n\n author: {\n labelFontWeight: '700',\n labelColor: 'var(--color-primary-950)',\n },\n\n twoColumn: {\n gap: '3.75rem',\n rowGap: '7.625rem',\n leftColSparkIconSmallLeft: '0%',\n leftColSparkIconLargeRight: '20%',\n rightColSparkIconSmallLeft: '0%',\n rightColSparkIconLargeRight: '20%',\n tablet: {\n gap: '1.875rem',\n },\n mobile: {\n gap: '1rem',\n },\n },\n\n videoSection: {\n padding: '0.5rem 3.75rem',\n gap: '3.75rem',\n alignItems: 'center',\n contentPadding: '5.625rem',\n contentGap: '1.875rem',\n textGap: '0.625rem',\n\n tablet: {\n padding: '0.5rem 3.75rem',\n gap: '1.875rem',\n },\n mobile: {\n padding: '0.5rem 1.875rem',\n },\n },\n\n primaxCard: {\n hoverAnimation: 'spring-up 0.3s ease-out forwards',\n hoverOutAnimation: 'spring-down 0.3s ease-out forwards',\n\n bg: '#fff',\n border: '2px solid var(--color-neutral-200)',\n focusBorder: '2px solid var(--color-primary-600)',\n focusOutline: '0px solid var(--color-primary-600)',\n focusOutlineOffset: '0',\n shadowFocus: 'none',\n shadowActive: 'none',\n textGap: '0.625rem',\n maxWidth: '400px',\n\n titleFontSize: 'var(--heading-body-bold-font-size)',\n titleFontWeight: 'var(--heading-body-bold-font-weight)',\n titleLineHeight: 'var(--heading-body-bold-line-height)',\n titleColor: 'var(--heading-color)',\n\n iconPadding: '3.75rem',\n iconContentGap: '0.625rem',\n iconSize: '4.375rem',\n iconActionLinkPadding: '0 3.75rem',\n\n imageHeight: '15.625rem',\n imageContentPadding: '1.875rem',\n imageContentGap: '1.875rem',\n imageActionLinkPadding: '0 1.875rem',\n\n profileImageAspect: '1 / 1',\n profileContentPadding: '1.875rem',\n profileContentGap: '1.875rem',\n profileDescriptionMaxWidth: '17.5rem',\n profileActionLinkPadding: '0 1.875rem',\n\n dark: {\n bg: 'var(--color-neutral-900)',\n border: '2px solid var(--color-neutral-700)',\n },\n },\n\n bulletList: {\n gap: '0.625rem',\n itemGap: '0.9375rem',\n itemAlign: 'center',\n\n iconSize: '1.125rem',\n iconColor: 'var(--color-accent-500)',\n iconContent: '\"\\\\e5d6\"',\n iconFontFamily: \"'Font Awesome 7 Pro'\",\n iconFontWeight: '900',\n\n fontSize: 'var(--paragraph-font-size, 1.125rem)',\n fontWeight: 'var(--paragraph-font-weight, 400)',\n lineHeight: 'var(--paragraph-line-height, 1.6)',\n color: 'var(--paragraph-color, var(--color-text-secondary))',\n fontFamily: 'var(--paragraph-font-family, inherit)',\n letterSpacing: 'var(--paragraph-letter-spacing, normal)',\n\n mobile: {\n fontSize: 'var(--paragraph-font-size-mobile, 1rem)',\n },\n\n dark: {\n color: 'var(--color-neutral-00)',\n iconColor: 'var(--color-accent-500)',\n },\n },\n\n modal: {\n overlayBg: 'rgba(0, 0, 0, 0.8)',\n\n bodyMaxWidth: '31.875rem',\n\n contentBg: 'var(--color-neutral-00)',\n contentBorder: '1px solid var(--color-neutral-200)',\n contentPadding: '3.75rem',\n borderRadius: '0',\n shadow: 'var(--tier1-theme-shadow-lg)',\n maxWidth: '39.375rem',\n width: '100%',\n\n closeButtonTop: '0.9375rem',\n closeButtonRight: '0.9375rem',\n closeButtonSize: 'auto',\n closeButtonBorderRadius: '50%',\n closeButtonBg: 'transparent',\n closeButtonColor: 'var(--color-primary-950)',\n closeButtonColorHover: 'var(--color-primary-950)',\n closeButtonFontSize: '1.3125rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n borderRadiusMobile: '1.5rem 1.5rem 0 0',\n contentPaddingMobile: '1.5rem',\n dragIndicatorBg: 'var(--color-neutral-300)',\n\n sizes: {\n sm: {\n maxWidth: '39.375rem',\n contentPadding: '3.75rem',\n },\n md: {\n maxWidth: '39.375rem',\n contentPadding: '3.75rem',\n },\n lg: {\n maxWidth: '39.375rem',\n contentPadding: '3.75rem',\n },\n },\n\n mobile: {\n contentPadding: '1.5rem',\n maxWidth: '100%',\n borderRadius: '1.5rem 1.5rem 0 0',\n dragHandleBorderRadius: '0',\n dragHandleBorderBottom: 'none',\n dragHandleMarginBottom: '0',\n },\n dark: {\n contentBg: 'var(--color-neutral-900)',\n contentBorder: '1px solid var(--color-neutral-700)',\n dragIndicatorBg: 'var(--color-neutral-600)',\n },\n },\n checkbox: {\n iconSize: '1.5rem',\n borderColor: 'var(--color-primary-950)',\n borderColorHover: 'var(--color-primary-600)',\n checkedColor: 'var(--color-primary-600)',\n checkedColorHover: 'var(--color-primary-700)',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.333',\n labelColor: 'var(--color-neutral-700)',\n gap: '0.625rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '0.125rem',\n\n dark: {\n borderColor: 'var(--color-neutral-00)',\n borderColorHover: 'var(--color-secondary-200)',\n checkedColor: 'var(--color-secondary-200)',\n labelColor: 'var(--color-neutral-00)',\n },\n },\n\n dropdown: {\n labelFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n labelFontSize: '1.125rem',\n labelFontWeight: '700',\n labelLineHeight: '1.333',\n labelColor: 'var(--color-primary-950)',\n labelGap: '0.5rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.333',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-50)',\n borderWidth: '1px',\n borderColor: 'var(--color-neutral-300)',\n borderRadius: '0',\n padding: '1rem',\n placeholderColor: 'var(--color-neutral-700)',\n borderColorFocus: 'var(--color-primary-600)',\n\n chevronSize: '1rem',\n chevronColor: 'var(--color-primary-950)',\n\n panelBg: 'var(--color-neutral-00)',\n panelBorderColor: 'var(--color-neutral-300)',\n panelMaxHeight: '15rem',\n panelPadding: '0.5rem 0',\n\n errorFontSize: '0.875rem',\n errorFontWeight: '400',\n errorColor: 'var(--color-error-500)',\n errorTextAlign: 'right',\n\n dark: {\n labelColor: 'var(--color-neutral-00)',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-00)',\n borderColor: 'var(--color-neutral-300)',\n placeholderColor: 'var(--color-neutral-500)',\n chevronColor: 'var(--color-primary-950)',\n panelBg: 'var(--color-neutral-00)',\n panelBorderColor: 'var(--color-neutral-300)',\n errorColor: 'var(--color-error-300)',\n },\n },\n\n dropdownSelect: {\n optionPadding: '0.5rem 1rem',\n optionBgHover: 'transparent',\n\n dark: {\n optionBgHover: 'var(--color-neutral-100)',\n },\n },\n\n textInput: {\n labelFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n labelFontSize: '1.125rem',\n labelFontWeight: '700',\n labelLineHeight: '1.333',\n labelColor: 'var(--color-primary-950)',\n labelGap: '0.5rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.333',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-50)',\n borderWidth: '1px',\n borderColor: 'var(--color-neutral-300)',\n borderRadius: '0',\n padding: '1rem',\n placeholderColor: 'var(--color-neutral-500)',\n borderColorFocus: 'var(--color-primary-600)',\n\n errorFontWeight: '400',\n errorColor: 'var(--color-error-500)',\n errorTextAlign: 'right',\n\n dark: {\n labelColor: 'var(--color-neutral-00)',\n color: 'var(--color-primary-950)',\n bg: 'var(--color-neutral-00)',\n borderColor: 'var(--color-neutral-300)',\n placeholderColor: 'var(--color-neutral-500)',\n errorColor: 'var(--color-error-300)',\n },\n },\n\n form: {\n gap: '2rem',\n formGap: '1.875rem',\n fieldsRowGap: '1.75rem',\n\n disclaimerFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n disclaimerFontSize: '1rem',\n disclaimerFontWeight: '700',\n disclaimerLineHeight: '1.5',\n\n dark: {\n disclaimerLinkColor: 'var(--color-secondary-200)',\n },\n },\n\n subscribe: {\n bg: 'var(--background-color)',\n inputBg: 'var(--color-neutral-00)',\n\n gap: '2rem',\n padding: '3.75rem',\n formGap: '1.875rem',\n fieldsGap: '3.75rem',\n\n disclaimerFontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n disclaimerFontSize: '1rem',\n disclaimerFontWeight: '700',\n disclaimerLineHeight: '1.5',\n\n tablet: {\n padding: '3.75rem 2rem',\n fieldsGap: '3.75rem',\n },\n mobile: {\n padding: '2rem 1rem',\n fieldsGap: '2rem',\n },\n\n dark: {\n bg: 'transparent',\n disclaimerColor: 'var(--color-neutral-00)',\n disclaimerLinkColor: 'var(--color-secondary-200)',\n },\n },\n\n primaxHeader: {\n bg: 'var(--color-neutral-00)',\n borderBottom: '1px solid var(--color-neutral-250)',\n padding: '0 3.75rem',\n navHeight: '8.125rem',\n logoWidth: '12.5rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family)',\n navFontSize: 'var(--tier1-theme-typography-body-bold-desktop-font-size)',\n navFontWeight: 'var(--tier1-theme-typography-body-bold-desktop-font-weight)',\n navLineHeight: 'var(--tier1-theme-typography-body-bold-desktop-line-height)',\n navLinkPadding: '3.3125rem 0.9375rem',\n\n navItemBgActive: 'var(--color-primary-950)',\n navLinkColor: 'var(--color-primary-950)',\n navLinkColorActive: 'var(--color-secondary-200)',\n navLinkColorHover: 'var(--color-neutral-00)',\n navLinkTextDecorationHover: 'underline',\n navLinkTextDecorationActive: 'none',\n\n ctaPaddingLeft: '1rem',\n\n overlayBg: 'var(--color-primary-950)',\n overlayPadding: '3.75rem 3rem',\n overlayGap: '3.75rem',\n overlayMaxWidth: '100%',\n overlaySideWidth: '25rem',\n\n groupGap: '0.625rem',\n groupHeadingFontSize: '1.125rem',\n groupHeadingColor: 'var(--color-neutral-00)',\n groupHeadingColorHover: 'var(--color-secondary-200)',\n groupHeadingColorActive: 'var(--color-neutral-00)',\n groupHeadingColorFocus: 'var(--color-neutral-00)',\n groupHeadingOutlineWidth: '0rem',\n groupHeadingOutlineOffset: '0.125rem',\n groupLinkGap: '0.625rem',\n groupLinkFontSize: '1.125rem',\n groupLinkColor: 'var(--color-neutral-00)',\n groupLinkColorHover: 'var(--color-neutral-00)',\n groupLinkColorActive: 'var(--color-secondary-200)',\n groupLinkColorFocus: 'var(--color-secondary-200)',\n groupLinkOutlineWidth: '0rem',\n groupLinkOutlineOffset: '0.125rem',\n\n mobileBg: '#ffffff',\n mobileBorder: '#e5e5e5',\n mobileItemPadding: '1rem',\n mobileItemFontSize: '1.125rem',\n mobileGroupBorder: '#e5e5e5',\n mobileGroupPadding: '1rem',\n mobileGroupFontSize: '1.125rem',\n mobileSearchPadding: '0.5rem',\n mobileSublinkBg: '#ffffff',\n mobileSublinkFontSize: '1.125rem',\n mobileSublinkPadding: '1rem',\n\n //Hamburger\n hamburgerColor: 'var(--color-primary-950)',\n\n featuredImageMaxWidth: '25rem',\n featuredImageBorderRadius: '0',\n\n focusColor: 'var(--color-primary-600)',\n\n tablet: {\n padding: '0rem 1rem',\n overlayPadding: '2rem 1.875rem',\n },\n mobile: {\n padding: '2rem 1rem',\n mobileItemColor: 'var(--color-neutral-00)',\n navLinkColor: 'var(--color-primary-950)',\n mobileItemBackground: 'var(--color-primary-950)',\n mobileSublinkBgAlt: 'var(--color-neutral-100)',\n mobileSublinkColorHover: 'var(--color-primary-950)',\n overlaySearchHeight: '4.5rem',\n overlaySearchPadding: '0rem 0rem 2rem',\n },\n\n dark: {\n bg: 'var(--color-primary-950)',\n hamburgerColor: 'var(--color-neutral-00)',\n navLinkColor: 'var(--color-neutral-00)',\n navItemBgActive: 'var(--color-neutral-00)',\n navLinkColorActive: 'var(--color-primary-950)',\n },\n },\n alertBanner: {\n bg: 'var(--color-primary-950)',\n\n borderStyle: 'solid',\n borderColor: 'var(--color-secondary-200)',\n borderTopWidth: '2px',\n borderBottomWidth: '2px',\n\n padding: '1.13rem 2rem',\n contentPadding: '0rem',\n contentGap: '0.5rem',\n textGap: '1rem',\n\n dismissColor: 'var(--color-secondary-200)',\n dismissColorHover: 'var(--color-secondary-200)',\n dismissColorActive: 'var(--color-secondary-100)',\n dismissSize: '1.125rem',\n dismissPadding: '0.125rem',\n\n focusOutline: '0.125rem solid var(--color-secondary-200)',\n focusOutlineOffset: '0.12rem',\n\n mobile: {\n padding: '0.75rem 1rem',\n textWrapMaxWidth: '343px',\n },\n },\n\n iconListItem: {\n gap: '0.9375rem',\n width: '100%',\n maxWidth: '60rem',\n\n iconBlockWidth: '7.69rem',\n iconBlockHeight: '7.69rem',\n iconBlockBg: 'var(--color-primary-950)',\n iconColor: 'var(--color-secondary-200)',\n iconSize: '3rem',\n\n contentGap: '0.3125rem',\n textGap: '0.25rem',\n linkPaddingTop: '0.3125rem',\n\n dark: {\n iconBlockBg: 'var(--color-primary-800)',\n iconColor: 'var(--color-secondary-200)',\n },\n tablet: {\n iconBlockWidth: '7.69rem',\n iconBlockHeight: '7.69rem',\n maxWidth: '100%',\n },\n },\n\n iconBulletList: {\n gap: '3.75rem',\n padding: '3.75rem',\n\n dividerContentPadding: '0rem',\n\n itemsRowGap: '1.875rem',\n itemsColGap: '3.75rem',\n },\n\n iconBulletSection: {\n gap: '3.75rem',\n padding: '3.75rem 0',\n dividerPadding: '3.75rem',\n\n contentGap: '3.75rem',\n mediaWidth: '53.75rem',\n listGap: '1.875rem',\n\n tablet: {\n contentGap: '2.5rem',\n },\n },\n\n accordion: {\n borderColor: 'var(--color-neutral-200)',\n\n itemPadding: '1rem 0',\n headerBgHover: 'transparent',\n\n titleFontFamily: 'var(--tier1-theme-typography-font-family)',\n titleFontSize: 'var(--heading-body-bold-font-size)',\n titleFontWeight: 'var(--heading-body-bold-font-weight)',\n titleLineHeight: 'var(--heading-body-bold-line-height)',\n titleColor: 'var(--color-primary-950)',\n\n chevronSize: '1.3125rem',\n chevronColor: 'var(--color-primary-950)',\n\n animationDuration: '0.3s',\n\n contentPadding: '0 0 1rem',\n\n focusOutline: '0.125rem solid var(--color-primary-600)',\n focusOutlineOffset: '-0.125rem',\n\n dark: {\n titleColor: 'var(--color-neutral-00)',\n chevronColor: 'var(--color-neutral-00)',\n borderColor: 'rgba(255, 255, 255, 0.2)',\n },\n },\n\n accordionSection: {\n contentGap: '2rem',\n contentMaxWidth: '100%',\n gap: '9.5625rem',\n mediaRadius: '0 2rem 0 2rem',\n\n tablet: {\n gap: '3.75rem',\n },\n mobile: {\n gap: '2.5rem',\n },\n },\n\n postFeed: {\n padding: '3.75rem 0',\n sectionGap: '2.5rem',\n gap: '3.75rem',\n postGap: '1.875rem',\n\n featuredContentGap: '0.9375rem',\n featuredImageAspect: '3/2',\n\n regularGap: '1.25rem',\n bodyGap: '0.3125rem',\n thumbnailWidth: '11.25rem',\n thumbnailAspect: '3/2',\n\n titleColor: 'var(--color-primary-950)',\n titleFontSize: 'var(--heading-body-bold-font-size)',\n titleFontWeight: 'var(--heading-body-bold-font-weight)',\n titleLineHeight: 'var(--heading-body-bold-line-height)',\n titleColorHover: 'var(--color-primary-600)',\n titleColorActive: 'var(--color-primary-700)',\n\n assetTypeColor: 'var(--color-primary-950)',\n metaColor: 'var(--paragraph-color)',\n metaFontSize: 'var(--paragraph-font-size)',\n metaLineHeight: 'var(--paragraph-line-height)',\n\n dividerColor: 'var(--color-neutral-200)',\n dividerHeight: '1px',\n\n loadMoreGap: '2.5rem',\n\n tablet: {\n padding: '2rem 2rem',\n gap: '1.875rem',\n postGap: '1.875rem',\n },\n mobile: {\n padding: '2rem 1rem',\n gap: '1.5rem',\n postGap: '1.25rem',\n sectionGap: '1.5rem',\n thumbnailWidth: '7.5rem',\n loadMoreGap: '1.875rem',\n },\n },\n\n footer: {\n gap: '1.88rem',\n padding: '3.75rem',\n bg: 'var(--background-color)',\n navMaxWidth: '63.75rem',\n\n logoWidth: '12.5rem',\n\n navGap: '2rem',\n linkGap: '0.75rem',\n\n fontFamily: 'var(--tier1-theme-typography-font-family, sans-serif)',\n headingFontSize: '1.125rem',\n headingFontWeight: '700',\n headingColor: 'var(--color-primary-950)',\n\n linkFontSize: '1.125rem',\n linkFontWeight: '700',\n linkColor: 'var(--color-primary-950)',\n linkColorHover: 'var(--color-primary-600)',\n linkColorActive: 'var(--color-primary-700)',\n\n socialIconSize: '1.562rem', //25px\n\n legalFontSize: '1rem',\n legalFontWeight: '700',\n legalColor: 'var(--bodyTextColor)',\n legalColorDark: 'var(--color-neutral-00)',\n\n focusOutlineWidth: '0px',\n focusOutlineColor: 'var(--color-primary-950)',\n\n tablet: {\n padding: '3.75rem 2rem',\n gap: '1.88rem',\n },\n mobile: {\n padding: '3.75rem 2rem',\n gap: '1.88rem',\n },\n\n dark: {\n bg: 'var(--color-primary-950)',\n linkColor: 'var(--color-neutral-00)',\n headingColor: 'var(--color-neutral-00)',\n linkColorHover: 'var(--color-secondary-200)',\n legalColor: 'var(--color-neutral-300)',\n legalLinkColor: 'var(--color-secondary-200)',\n focusOutlineColor: 'var(--color-neutral-00)',\n },\n },\n overflowMediaSection: {\n mediaBlockBorderRadiusLeft: '0 2rem 0 2rem',\n mediaBlockBorderRadiusRight: '2rem 0 2rem 0',\n },\n\n filterSection: {\n inputBg: 'var(--color-neutral-00)',\n },\n assetMeta: {\n typeColor: 'var(--color-primary-950)',\n detailsColor: 'var(--color-neutral-700)',\n\n dark: {\n typeColor: 'var(--color-neutral-00)',\n detailsColor: 'var(--color-neutral-200)',\n },\n },\n\n sidebar: {\n width: '25.25rem',\n imageHeight: '14.125rem',\n contentPadding: '1.875rem',\n contentBg: 'var(--color-neutral-50)',\n innerGap: '1rem',\n sectionTitleColor: 'var(--color-primary-950)',\n assetTitleColor: 'var(--color-primary-950)',\n socialsGap: '1rem',\n socialIconsGap: '1rem',\n socialIconSize: '1.5625rem',\n socialIconColor: 'var(--color-primary-950)',\n socialIconColorHover: 'var(--color-primary-600)',\n assetGap: '1rem',\n dividerColor: '#D4D4D4',\n ctaPadding: '2rem',\n ctaBg: 'var(--color-primary-950)',\n ctaGap: '1rem',\n ctaTitleColor: 'var(--color-neutral-00)',\n stickyTop: '1rem',\n tablet: {\n width: '100%',\n },\n mobile: {\n width: '100%',\n },\n },\n\n individualPost: {\n videoPlayIconSize: '8rem',\n },\n },\n};\n","export default \"data:image/svg+xml,%3Csvg%20width%3D%22200%22%20height%3D%2263%22%20viewBox%3D%220%200%20200%2063%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url%28%23clip0_1256_11767%29%22%3E%3Cpath%20d%3D%22M73.8374%2015.5151H61.7612V50.2152H73.8374V15.5151Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M67.7967%200C64.2156%200%2061.3169%202.91112%2061.3169%206.49567C61.3169%2010.0802%2064.2209%2012.9913%2067.7967%2012.9913C71.3724%2012.9913%2074.2764%2010.0855%2074.2764%206.49567C74.2764%202.90582%2071.3724%200%2067.7967%200Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M54.8533%2015.4995H54.1551C53.0813%2015.4995%2051.9546%2015.8548%2051.0501%2016.3373C48.5692%2017.663%2047.7864%2020.2029%2047.7652%2022.605C47.7652%2022.8065%2047.4108%2022.8065%2047.4055%2022.605C47.3844%2020.2029%2046.6068%2017.663%2044.1207%2016.3373C43.2162%2015.8548%2042.0895%2015.5048%2041.0157%2015.4995H36.0752V50.2102H48.1514V33.8199C48.1514%2030.4634%2050.6163%2027.7432%2053.9646%2027.7432V27.7273C55.6362%2027.7326%2057.1384%2028.4166%2058.2386%2029.5089C58.2439%2029.5142%2058.2545%2029.5248%2058.2598%2029.5301C58.2968%2029.5673%2058.3444%2029.6044%2058.3815%2029.6468C58.4132%2029.6733%2058.4502%2029.6945%2058.4873%2029.721V16.0139C58.4873%2016.0139%2056.8951%2015.5207%2054.8533%2015.5048H54.848L54.8533%2015.4995Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M114.969%2015.1069C110.352%2015.1069%20106.49%2018.3308%20105.485%2022.6577V22.5941C105.485%2022.5941%20105.485%2022.6047%20105.485%2022.61C105.485%2022.8115%20105.131%2022.8115%20105.125%2022.61C105.125%2022.5835%20105.125%2022.5623%20105.125%2022.5358H105.12C104.951%2018.4051%20101.566%2015.1016%2097.4027%2015.1016C93.2397%2015.1016%2089.8544%2018.3998%2089.6851%2022.5358H89.6746C89.6746%2022.5358%2089.6746%2022.5835%2089.6746%2022.61C89.6746%2022.8115%2089.3202%2022.8115%2089.3149%2022.61C89.2937%2020.208%2088.5161%2017.668%2086.03%2016.3424C85.1308%2015.8598%2084.0094%2015.5099%2082.9409%2015.5046H77.2334V50.2153H89.3043L89.3096%2050.21V29.8746C89.3096%2028.6072%2090.0766%2027.4142%2091.2773%2027.0324C93.0176%2026.4756%2094.7684%2027.7959%2094.7684%2029.5034V50.2153H95.07H95.3926L106.633%2050.2206H106.85V29.6147C106.85%2028.1936%20108.241%2026.9051%20109.664%2026.9104C111.113%2026.9157%20112.462%2028.0452%20112.462%2029.5087V50.2206L112.859%2050.2259H124.538V24.8901C124.538%2019.4921%20120.365%2015.1175%20114.98%2015.1175L114.969%2015.1069Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M190.092%2028.9575C191.759%2028.9522%20193.509%2028.406%20194.911%2027.653C198.762%2025.5956%20199.973%2021.6558%20200%2017.9334V15.4995H188.098V16.2313C188.098%2019.959%20185.083%2022.9815%20181.365%2022.9815C177.646%2022.9815%20174.631%2019.959%20174.631%2016.2313V15.4995H136.234C134.842%2015.5048%20133.383%2015.9661%20132.214%2016.5865C128.992%2018.3046%20127.977%2021.6081%20127.955%2024.7207C127.955%2024.7313%20127.95%2024.7419%20127.95%2024.7525V24.7631H140.248L143.861%2024.7684C145.014%2024.7684%20145.945%2025.7017%20145.945%2026.8576C145.945%2026.8576%20145.945%2026.8576%20145.945%2026.8629C145.94%2028.0136%20145.009%2028.9416%20143.861%2028.9416H142.962C142.93%2028.9416%20142.904%2028.9469%20142.872%2028.9469H137.276C135.456%2028.9522%20133.541%2029.5514%20132.013%2030.368C129.685%2031.6088%20128.241%2033.4806%20127.411%2035.5963C126.374%2038.2264%20126.416%2041.2011%20127.516%2043.81C128.098%2045.1834%20128.945%2046.4507%20130.14%2047.4953C130.145%2047.5006%20130.151%2047.5059%20130.161%2047.5112C130.336%2047.665%20130.521%2047.8135%20130.717%2047.9566C130.722%2047.9566%20130.727%2047.9672%20130.732%2047.9672C131.129%2048.2642%20131.558%2048.5346%20132.018%2048.7838C133.536%2049.5951%20135.435%2050.189%20137.239%2050.2049H145.448C146.564%2050.1996%20147.739%2049.8284%20148.68%2049.33C151.277%2047.946%20152.092%2045.2841%20152.113%2042.776C152.113%2042.67%20152.208%2042.6169%20152.298%2042.6169C152.393%2042.6169%20152.489%2042.67%20152.483%2042.776C152.504%2045.2894%20153.319%2047.946%20155.916%2049.33C156.858%2049.8337%20158.032%2050.1996%20159.148%2050.2049H162.327H171.113H171.748H174.647V42.1397C174.647%2038.412%20177.662%2035.3895%20181.38%2035.3895C185.099%2035.3895%20188.114%2038.412%20188.114%2042.1397V50.2049H193.991H200.016V40.4535C199.984%2036.7311%20198.773%2032.7912%20194.927%2030.7338C193.525%2029.9862%20191.774%2029.4347%20190.108%2029.4294C189.754%2029.4294%20189.754%2028.9469%20190.108%2028.9469L190.092%2028.9575ZM145.718%2039.8543C145.374%2041.4026%20144.131%2042.6487%20142.592%2042.9881C139.529%2043.6668%20136.863%2040.9943%20137.545%2037.9241C137.889%2036.3811%20139.132%2035.1297%20140.677%2034.7903C143.734%2034.1116%20146.4%2036.7841%20145.723%2039.8543H145.718ZM172.912%2029.4294C171.246%2029.4347%20169.495%2029.9809%20168.093%2030.7338C164.242%2032.7912%20163.031%2036.7311%20163.004%2040.4535C163.004%2040.7663%20162.454%2040.7663%20162.449%2040.4535C162.417%2036.7311%20161.211%2032.7912%20157.36%2030.7338C155.959%2029.9862%20154.208%2029.4347%20152.541%2029.4294C152.187%2029.4294%20152.187%2028.9469%20152.541%2028.9469C154.208%2028.9416%20155.959%2028.3954%20157.36%2027.6424C161.211%2025.585%20162.422%2021.6452%20162.449%2017.9228C162.449%2017.769%20162.586%2017.6895%20162.724%2017.6895C162.862%2017.6895%20163.004%2017.769%20162.999%2017.9228C163.031%2021.6452%20164.237%2025.585%20168.088%2027.6424C169.489%2028.3901%20171.24%2028.9416%20172.906%2028.9469C173.261%2028.9469%20173.261%2029.4294%20172.906%2029.4294H172.912Z%22%20fill%3D%22%230D0942%22%2F%3E%3Cpath%20d%3D%22M16.6094%2015.3511C16.3449%2015.3564%2016.0592%2015.3564%2015.7842%2015.3723H0V63.0001H12.1185V49.6535L12.9437%2049.855C14.155%2050.1466%2015.3875%2050.2951%2016.6094%2050.2951C21.4758%2050.2951%2025.5964%2048.5346%2028.5321%2045.2046C31.2669%2042.1026%2032.8643%2037.6962%2033.0336%2032.8019C33.224%2027.2819%2031.7958%2022.78%2028.913%2019.784C26.0936%2016.857%2021.9519%2015.367%2016.6094%2015.3564V15.3511ZM20.7617%2033.7192C20.2169%2036.1849%2018.2756%2038.1257%2015.8212%2038.6718C15.3134%2038.7832%2014.8109%2038.8415%2014.3137%2038.8415C13.7424%2038.8415%2013.1817%2038.7673%2012.6263%2038.6241L12.1291%2038.4915V25.9191L12.6316%2025.7919C12.6951%2025.776%2012.7532%2025.76%2012.8167%2025.7494C15.0807%2025.251%2017.3869%2025.9138%2018.995%2027.5258C20.603%2029.1378%2021.2642%2031.455%2020.767%2033.7245L20.7617%2033.7192Z%22%20fill%3D%22%230D0942%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22clip0_1256_11767%22%3E%3Crect%20width%3D%22200%22%20height%3D%2263%22%20fill%3D%22white%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20width%3D%22200%22%20height%3D%2263%22%20viewBox%3D%220%200%20200%2063%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url%28%23clip0_1119_2843%29%22%3E%3Cpath%20d%3D%22M73.8376%2015.5151H61.7614V50.2152H73.8376V15.5151Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M67.7969%200C64.2158%200%2061.3171%202.91112%2061.3171%206.49567C61.3171%2010.0802%2064.2211%2012.9913%2067.7969%2012.9913C71.3726%2012.9913%2074.2766%2010.0855%2074.2766%206.49567C74.2766%202.90582%2071.3726%200%2067.7969%200Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M54.8532%2015.4995H54.155C53.0812%2015.4995%2051.9545%2015.8548%2051.05%2016.3373C48.5692%2017.663%2047.7863%2020.2029%2047.7651%2022.605C47.7651%2022.8065%2047.4107%2022.8065%2047.4054%2022.605C47.3843%2020.2029%2046.6067%2017.663%2044.1206%2016.3373C43.2161%2015.8548%2042.0894%2015.5048%2041.0156%2015.4995H36.0751V50.2102H48.1513V33.8199C48.1513%2030.4634%2050.6162%2027.7432%2053.9646%2027.7432V27.7273C55.6361%2027.7326%2057.1383%2028.4166%2058.2386%2029.5089C58.2439%2029.5142%2058.2544%2029.5248%2058.2597%2029.5301C58.2967%2029.5673%2058.3444%2029.6044%2058.3814%2029.6468C58.4131%2029.6733%2058.4501%2029.6945%2058.4872%2029.721V16.0139C58.4872%2016.0139%2056.895%2015.5207%2054.8532%2015.5048H54.8479L54.8532%2015.4995Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M114.97%2015.1069C110.352%2015.1069%20106.49%2018.3308%20105.485%2022.6577V22.5941C105.485%2022.5941%20105.485%2022.6047%20105.485%2022.61C105.485%2022.8115%20105.131%2022.8115%20105.126%2022.61C105.126%2022.5835%20105.126%2022.5623%20105.126%2022.5358H105.12C104.951%2018.4051%20101.566%2015.1016%2097.4028%2015.1016C93.2399%2015.1016%2089.8545%2018.3998%2089.6853%2022.5358H89.6747C89.6747%2022.5358%2089.6747%2022.5835%2089.6747%2022.61C89.6747%2022.8115%2089.3203%2022.8115%2089.315%2022.61C89.2938%2020.208%2088.5163%2017.668%2086.0301%2016.3424C85.1309%2015.8598%2084.0095%2015.5099%2082.941%2015.5046H77.2335V50.2153H89.3044L89.3097%2050.21V29.8746C89.3097%2028.6072%2090.0767%2027.4142%2091.2774%2027.0324C93.0177%2026.4756%2094.7686%2027.7959%2094.7686%2029.5034V50.2153H95.0701H95.3927L106.633%2050.2206H106.85V29.6147C106.85%2028.1936%20108.241%2026.9051%20109.664%2026.9104C111.113%2026.9157%20112.462%2028.0452%20112.462%2029.5087V50.2206L112.859%2050.2259H124.538V24.8901C124.538%2019.4921%20120.365%2015.1175%20114.98%2015.1175L114.97%2015.1069Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M190.093%2028.9575C191.759%2028.9522%20193.51%2028.406%20194.911%2027.653C198.762%2025.5956%20199.974%2021.6558%20200%2017.9334V15.4995H188.098V16.2313C188.098%2019.959%20185.083%2022.9815%20181.365%2022.9815C177.646%2022.9815%20174.631%2019.959%20174.631%2016.2313V15.4995H136.234C134.843%2015.5048%20133.383%2015.9661%20132.214%2016.5865C128.992%2018.3046%20127.977%2021.6081%20127.956%2024.7207C127.956%2024.7313%20127.95%2024.7419%20127.95%2024.7525V24.7631H140.249L143.861%2024.7684C145.015%2024.7684%20145.946%2025.7017%20145.946%2026.8576C145.946%2026.8576%20145.946%2026.8576%20145.946%2026.8629C145.94%2028.0136%20145.009%2028.9416%20143.861%2028.9416H142.962C142.93%2028.9416%20142.904%2028.9469%20142.872%2028.9469H137.276C135.456%2028.9522%20133.541%2029.5514%20132.013%2030.368C129.685%2031.6088%20128.241%2033.4806%20127.411%2035.5963C126.374%2038.2264%20126.416%2041.2011%20127.517%2043.81C128.098%2045.1834%20128.945%2046.4507%20130.14%2047.4953C130.145%2047.5006%20130.151%2047.5059%20130.161%2047.5112C130.336%2047.665%20130.521%2047.8135%20130.717%2047.9566C130.722%2047.9566%20130.727%2047.9672%20130.733%2047.9672C131.129%2048.2642%20131.558%2048.5346%20132.018%2048.7838C133.536%2049.5951%20135.435%2050.189%20137.239%2050.2049H145.448C146.564%2050.1996%20147.739%2049.8284%20148.68%2049.33C151.277%2047.946%20152.092%2045.2841%20152.113%2042.776C152.113%2042.67%20152.208%2042.6169%20152.298%2042.6169C152.394%2042.6169%20152.489%2042.67%20152.483%2042.776C152.505%2045.2894%20153.319%2047.946%20155.916%2049.33C156.858%2049.8337%20158.032%2050.1996%20159.148%2050.2049H162.327H171.113H171.748H174.647V42.1397C174.647%2038.412%20177.662%2035.3895%20181.381%2035.3895C185.099%2035.3895%20188.114%2038.412%20188.114%2042.1397V50.2049H193.991H200.016V40.4535C199.984%2036.7311%20198.773%2032.7912%20194.927%2030.7338C193.526%2029.9862%20191.775%2029.4347%20190.108%2029.4294C189.754%2029.4294%20189.754%2028.9469%20190.108%2028.9469L190.093%2028.9575ZM145.718%2039.8543C145.374%2041.4026%20144.131%2042.6487%20142.592%2042.9881C139.529%2043.6668%20136.863%2040.9943%20137.546%2037.9241C137.889%2036.3811%20139.133%2035.1297%20140.677%2034.7903C143.734%2034.1116%20146.4%2036.7841%20145.723%2039.8543H145.718ZM172.912%2029.4294C171.246%2029.4347%20169.495%2029.9809%20168.093%2030.7338C164.242%2032.7912%20163.031%2036.7311%20163.005%2040.4535C163.005%2040.7663%20162.454%2040.7663%20162.449%2040.4535C162.417%2036.7311%20161.211%2032.7912%20157.36%2030.7338C155.959%2029.9862%20154.208%2029.4347%20152.542%2029.4294C152.187%2029.4294%20152.187%2028.9469%20152.542%2028.9469C154.208%2028.9416%20155.959%2028.3954%20157.36%2027.6424C161.211%2025.585%20162.423%2021.6452%20162.449%2017.9228C162.449%2017.769%20162.587%2017.6895%20162.724%2017.6895C162.862%2017.6895%20163.004%2017.769%20162.999%2017.9228C163.031%2021.6452%20164.237%2025.585%20168.088%2027.6424C169.49%2028.3901%20171.24%2028.9416%20172.907%2028.9469C173.261%2028.9469%20173.261%2029.4294%20172.907%2029.4294H172.912Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M16.6094%2015.3511C16.3449%2015.3564%2016.0592%2015.3564%2015.7842%2015.3723H0V63.0001H12.1185V49.6535L12.9437%2049.855C14.155%2050.1466%2015.3875%2050.2951%2016.6094%2050.2951C21.4758%2050.2951%2025.5964%2048.5346%2028.5321%2045.2046C31.2669%2042.1026%2032.8643%2037.6962%2033.0336%2032.8019C33.224%2027.2819%2031.7958%2022.78%2028.913%2019.784C26.0936%2016.857%2021.9519%2015.367%2016.6094%2015.3564V15.3511ZM20.7617%2033.7192C20.2169%2036.1849%2018.2756%2038.1257%2015.8212%2038.6718C15.3134%2038.7832%2014.8109%2038.8415%2014.3137%2038.8415C13.7424%2038.8415%2013.1817%2038.7673%2012.6263%2038.6241L12.1291%2038.4915V25.9191L12.6316%2025.7919C12.6951%2025.776%2012.7532%2025.76%2012.8167%2025.7494C15.0807%2025.251%2017.3869%2025.9138%2018.995%2027.5258C20.603%2029.1378%2021.2642%2031.455%2020.767%2033.7245L20.7617%2033.7192Z%22%20fill%3D%22white%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22clip0_1119_2843%22%3E%3Crect%20width%3D%22200%22%20height%3D%2263%22%20fill%3D%22white%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E\"","/**\n * React hook for accessing color tokens programmatically\n * Useful when you need to use colors in JavaScript/TypeScript\n */\n\nimport { useTheme } from '../core/client-provider';\nimport type { ColorPrimitives } from '../core/color-system';\n\nexport interface ColorTokens {\n // Primitives\n primitives: Record<string, string>;\n // Semantic tokens\n semantic: Record<string, string>;\n}\n\n/**\n * Hook to access color tokens from the current theme\n * Returns resolved CSS variable values\n */\nexport function useColorTokens(): ColorTokens {\n const { currentTheme } = useTheme();\n\n // Helper to get computed CSS variable value\n const getCSSVar = (varName: string): string => {\n if (typeof window === 'undefined') return '';\n return getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n };\n\n // Convert color system to resolved values\n const primitives: Record<string, string> = {};\n const semantic: Record<string, string> = {};\n\n // Resolve primitives\n Object.keys(currentTheme.colors.primitives).forEach((key) => {\n const cssVar = `--color-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`;\n primitives[key] = getCSSVar(cssVar) || currentTheme.colors.primitives[key as keyof ColorPrimitives];\n });\n\n // Resolve semantic tokens (no prefix)\n Object.keys(currentTheme.colors.semantic).forEach((key) => {\n const cssVar = `--${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`;\n semantic[key] = getCSSVar(cssVar);\n });\n\n return { primitives, semantic };\n}\n\n/**\n * Hook to get a specific color token value\n * @param level - The color system level ('primitives' or 'semantic')\n * @param tokenName - The name of the token\n * @returns The resolved color value\n */\nexport function useColorToken(level: 'primitives' | 'semantic', tokenName: string): string {\n const tokens = useColorTokens();\n return tokens[level][tokenName] || '';\n}\n\n/**\n * Hook to get CSS variable name for a color token\n * Useful for inline styles\n */\nexport function useColorVar(level: 'primitives' | 'semantic', tokenName: string): string {\n const cssKey = tokenName.replace(/([A-Z])/g, '-$1').toLowerCase();\n if (level === 'primitives') {\n return `var(--color-${cssKey})`;\n }\n // Semantic tokens have no prefix\n return `var(--${cssKey})`;\n}\n","import React from 'react';\nimport './TeamCard.scss';\n\nexport interface AdvisorsTeamCardProps {\n name: string;\n title: string;\n company: string;\n imageUrl: string;\n imageAlt?: string;\n href?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\nexport const AdvisorsTeamCard = ({\n name,\n title,\n company,\n imageUrl,\n imageAlt,\n href,\n className,\n 'aria-label': ariaLabel,\n}: AdvisorsTeamCardProps) => {\n const Tag = href ? 'a' : 'div';\n const interactiveProps = href ? { href, 'aria-label': ariaLabel } : { 'aria-label': ariaLabel };\n const resolvedAlt = imageAlt ?? `${name}, ${title}`;\n\n return (\n <Tag className={`advisors-team-card${className ? ` ${className}` : ''}`} {...interactiveProps}>\n <div className=\"advisors-team-card__portrait\">\n <img className=\"advisors-team-card__photo\" src={imageUrl} alt={resolvedAlt} />\n <div className=\"advisors-team-card__overlay\">\n <div className=\"advisors-team-card__text\">\n <p className=\"advisors-team-card__name\">\n {name}, {title}\n </p>\n <p className=\"advisors-team-card__company\">{company}</p>\n </div>\n </div>\n </div>\n </Tag>\n );\n};\n","import React, { useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCircleXmark as faCircleXmarkSolid } from '@fortawesome/pro-solid-svg-icons';\nimport { faCircleXmark as faCircleXmarkRegular } from '@fortawesome/pro-regular-svg-icons';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport './AlertBanner.scss';\n\nexport interface AlertBannerProps {\n /** The alert message as an HTML string (supports links, bold, etc.) */\n message: string;\n /** Whether the banner can be dismissed */\n dismissible?: boolean;\n /** Callback when the banner is dismissed */\n onDismiss?: () => void;\n /** Dark mode styling (default: true since banner has dark background) */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Accessible label for the dismiss button */\n dismissAriaLabel?: string;\n}\n\n/**\n * AlertBanner - A full-width notification banner for important announcements.\n * Displays a single line of rich text content with an optional dismiss button.\n */\nexport const AlertBanner: React.FC<AlertBannerProps> = ({\n message,\n dismissible = true,\n onDismiss,\n darkMode = true,\n className = '',\n dismissAriaLabel = 'Dismiss alert',\n}) => {\n const [isVisible, setIsVisible] = useState(true);\n\n const handleDismiss = () => {\n setIsVisible(false);\n onDismiss?.();\n };\n\n if (!isVisible) return null;\n\n return (\n <div className={`alert-banner ${className}`} data-dark-mode={darkMode} role=\"alert\" aria-live=\"polite\">\n <div className=\"alert-banner__content\">\n <div className=\"alert-banner__text-wrap\">\n <Paragraph\n as=\"p\"\n darkMode={darkMode}\n className=\"alert-banner__message\"\n dangerouslySetInnerHTML={{ __html: message }}\n />\n {dismissible && (\n <button\n className=\"alert-banner__dismiss\"\n onClick={handleDismiss}\n aria-label={dismissAriaLabel}\n type=\"button\"\n >\n <span className=\"alert-banner__dismiss-icon alert-banner__dismiss-icon--default\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={faCircleXmarkSolid} />\n </span>\n <span className=\"alert-banner__dismiss-icon alert-banner__dismiss-icon--hover\" aria-hidden=\"true\">\n <FontAwesomeIcon icon={faCircleXmarkRegular} />\n </span>\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { Divider, DividerProps } from '@/components/atoms/Divider';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { Subscribe, SubscribeField } from '@/components/molecules/primax/Subscribe';\nimport { GridProps } from '@/components/atoms/Grid';\nimport './CTA.scss';\nimport { Container } from '@/components/atoms/Container';\n\ntype CTAVariant = 'small' | 'large';\ntype CTAAlignment = 'left' | 'center' | 'right';\n\nexport interface PrimaxCTAProps extends Omit<DividerProps, 'children'> {\n /** CTA variant - small (heading + button) or large (heading + subscribe form) */\n variant?: CTAVariant;\n /** Content alignment - left, center, or right */\n alignment?: CTAAlignment;\n /** CTA heading text */\n heading: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Button or link props for the small variant — pass `href` to render a ButtonLink */\n button?: ButtonProps | ButtonLinkProps;\n\n /* --- Subscribe form props (large variant) --- */\n /** Form heading displayed above the fields (large variant) */\n formHeading?: string;\n /** Form heading semantic level (large variant) */\n formHeadingLevel?: HeadingLevel;\n /** Form heading visual variant (large variant) */\n formHeadingVariant?: string;\n /** Form field configuration (large variant) */\n fields?: SubscribeField[];\n /** Grid columns for form fields (large variant) */\n columns?: GridProps['columns'];\n /** Grid gap for form fields (large variant) */\n gap?: GridProps['gap'];\n /** Grid row gap for form fields (large variant) */\n rowGap?: GridProps['rowGap'];\n /** Grid column gap for form fields (large variant) */\n columnGap?: GridProps['columnGap'];\n /** Submit button label (large variant) */\n submitLabel?: string;\n /** Loading state for form submission (large variant) */\n loading?: boolean;\n /** Disclaimer text below the form (large variant, supports HTML) */\n disclaimer?: string;\n /** Called with collected form data on valid submission (large variant) */\n onSubmit?: (data: Record<string, string>) => void;\n /** Async or cross-field validation (large variant) */\n onValidate?: (data: Record<string, string>) => Record<string, string> | null | Promise<Record<string, string> | null>;\n /** Called when validation fails (large variant) */\n onError?: (errors: Record<string, string>) => void;\n\n /** Fallback: custom content slot (overrides Subscribe when provided in large variant) */\n children?: React.ReactNode;\n /** Make the inner container full-width (no max-width constraint) */\n fluid?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nexport const BannerCTA: React.FC<PrimaxCTAProps> = ({\n variant = 'small',\n alignment = 'left',\n heading,\n headingLevel = 'h1',\n button,\n // Subscribe form props\n formHeading,\n formHeadingLevel,\n formHeadingVariant,\n fields,\n columns,\n gap,\n rowGap,\n columnGap,\n submitLabel,\n loading,\n disclaimer,\n onSubmit,\n onValidate,\n onError,\n // Layout\n children,\n fluid = false,\n className,\n backgroundColor = 'var(--color-primary-950)',\n backgroundPattern = 'sparks',\n shapeDivider = 'top',\n darkMode = true,\n ...dividerProps\n}) => {\n const ctaClass = ['primax-cta', `primax-cta--${variant}`, `primax-cta--${alignment}`, className]\n .filter(Boolean)\n .join(' ');\n\n const renderLargeContent = () => {\n // If children are provided, use them as a custom override\n if (children) {\n return <div className=\"primax-cta__form\">{children}</div>;\n }\n\n // Otherwise render the Subscribe component from props\n if (fields && fields.length > 0) {\n return (\n <div className=\"primax-cta__form\">\n <Subscribe\n heading={formHeading || heading}\n headingLevel={formHeadingLevel || 'h2'}\n headingVariant={formHeadingVariant}\n fields={fields}\n columns={columns}\n gap={gap}\n rowGap={rowGap}\n columnGap={columnGap}\n submitLabel={submitLabel}\n loading={loading}\n disclaimer={disclaimer}\n onSubmit={onSubmit}\n onValidate={onValidate}\n onError={onError}\n darkMode={darkMode}\n />\n </div>\n );\n }\n\n return null;\n };\n\n return (\n <Divider\n className={ctaClass}\n backgroundColor={backgroundColor}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n darkMode={darkMode}\n {...dividerProps}\n >\n <Container fluid={fluid} className=\"primax-cta__inner container\">\n <Heading level={headingLevel} variant=\"title\" darkMode={darkMode} className=\"primax-cta__heading\">\n {heading}\n </Heading>\n\n {variant === 'small' &&\n button &&\n ('href' in button ? (\n <ButtonLink\n buttonType={button.buttonType || 'general'}\n size={button.size || 'lg'}\n darkMode={darkMode}\n {...(button as ButtonLinkProps)}\n >\n {button.children || button.label}\n </ButtonLink>\n ) : (\n <Button\n buttonType={button.buttonType || 'general'}\n size={button.size || 'lg'}\n darkMode={darkMode}\n {...(button as ButtonProps)}\n >\n {button.children || button.label}\n </Button>\n ))}\n\n {variant === 'large' && renderLargeContent()}\n </Container>\n </Divider>\n );\n};\n","import React from 'react';\nimport './Blockquote.scss';\n\nexport interface BlockquoteProps {\n /** Quote text content */\n children: React.ReactNode;\n /** Optional citation source (renders as <cite>) */\n citation?: string;\n /** Dark mode - applies dark mode styling for use on dark backgrounds */\n darkMode?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Blockquote component for quoted content\n * Renders a styled blockquote with optional citation\n * Integrates with RichText component through shared tokens\n */\nexport const Blockquote: React.FC<BlockquoteProps> = ({ children, citation, darkMode = false, className, style }) => {\n const quoteClasses = ['blockquote', className].filter(Boolean).join(' ');\n\n return (\n <blockquote className={quoteClasses} style={style} data-dark-mode={darkMode ? 'true' : undefined}>\n <div className=\"blockquote__content\">{children}</div>\n {citation && <cite className=\"blockquote__citation\">{citation}</cite>}\n </blockquote>\n );\n};\n","import React from 'react';\nimport { BackgroundMedia } from '../../atoms/BackgroundMedia';\nimport { Button } from '../../atoms/Button/Button';\nimport { ButtonLink } from '../../atoms/ButtonLink';\nimport { Heading, HeadingLevel } from '../../atoms/Heading';\nimport './CTA.scss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faAnglesRight } from '@fortawesome/free-solid-svg-icons';\n\nexport interface CTAProps {\n /** Video URL for background */\n videoUrl?: string;\n /** Image URL for background */\n imageUrl?: string;\n /** CSS gradient overlay */\n gradient?: string;\n /** Background color */\n bgColor?: string;\n /** CTA title */\n title: string;\n /** Heading level */\n headingLevel?: HeadingLevel;\n /** CTA description */\n description?: string;\n /** Button text */\n buttonText: string;\n /** Button link */\n link?: string;\n /** External link flag */\n externalLink?: boolean;\n /** Link target */\n target?: '_blank' | '_self';\n /** Custom CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/** CTA component with background media and content */\nexport const CTA: React.FC<CTAProps> = ({\n videoUrl,\n imageUrl,\n gradient,\n bgColor,\n title,\n headingLevel = 'h2',\n description,\n buttonText,\n link,\n externalLink,\n target = '_self',\n className,\n style,\n}) => {\n const ctaClasses = ['cta', className].filter(Boolean).join(' ');\n\n return (\n <div className={ctaClasses} style={style}>\n <BackgroundMedia videoUrl={videoUrl} imageUrl={imageUrl} gradient={gradient} bgColor={bgColor} />\n <div className=\"cta__content\">\n <Heading level={headingLevel} className=\"cta__title\">\n {title}\n </Heading>\n {description && <p className=\"cta__description\">{description}</p>}\n {link ? (\n <ButtonLink\n buttonType=\"cta\"\n label={buttonText}\n href={link}\n target={externalLink ? target : '_self'}\n icon={<FontAwesomeIcon icon={faAnglesRight} />}\n />\n ) : (\n <Button\n buttonType=\"cta\"\n label={buttonText}\n onClick={() => {}}\n icon={<FontAwesomeIcon icon={faAnglesRight} />}\n />\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport '../../molecules/Card/Card.scss';\n\nexport interface CardProps {\n children: React.ReactNode;\n maxWidth?: number | string;\n height?: number | string;\n width?: number | string;\n padding?: string;\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n href?: string;\n target?: '_blank' | '_self' | '_parent' | '_top';\n imageUrl?: string;\n imageAlt?: string;\n className?: string;\n style?: React.CSSProperties;\n aspectRatio?: string;\n borderRadius?: string;\n hoverEffect?: boolean;\n 'aria-label'?: string;\n 'data-testid'?: string;\n}\n\nexport const Card: React.FC<CardProps> = ({\n children,\n maxWidth = '',\n padding = '30px',\n onClick,\n href,\n target = '_self',\n imageUrl,\n imageAlt = '',\n className = '',\n style,\n aspectRatio = '3/2',\n borderRadius = '',\n hoverEffect = true,\n 'aria-label': ariaLabel,\n 'data-testid': testId,\n}) => {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if ((event.key === 'Enter' || event.key === ' ') && onClick) {\n event.preventDefault();\n onClick(event as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n const handleLinkClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (onClick) {\n onClick(event as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n const wrapperStyle: React.CSSProperties = {\n maxWidth,\n ...style,\n };\n\n const cardStyle: React.CSSProperties = {\n borderRadius,\n };\n\n const imageWrapperStyle: React.CSSProperties = {\n aspectRatio,\n borderRadius: `${borderRadius} ${borderRadius} 0 0`,\n };\n\n const bodyStyle: React.CSSProperties = {\n padding,\n };\n\n const cardClasses = ['card', hoverEffect && 'card--hover-effect', className].filter(Boolean).join(' ');\n\n const cardContent = (\n <div className={cardClasses} style={cardStyle} data-testid={testId}>\n {imageUrl && (\n <div className=\"card__image-wrapper\" style={imageWrapperStyle}>\n <div className=\"card__image-container\">\n <img src={imageUrl} alt={imageAlt} className=\"card__image\" loading=\"lazy\" />\n </div>\n </div>\n )}\n <div className=\"card__body\" style={bodyStyle}>\n {children}\n </div>\n </div>\n );\n\n if (href) {\n return (\n <div className=\"card-wrapper\" style={wrapperStyle}>\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n onClick={handleLinkClick}\n className=\"card__link\"\n style={{ borderRadius }}\n aria-label={ariaLabel}\n >\n {cardContent}\n </a>\n </div>\n );\n }\n\n if (onClick) {\n return (\n <div className=\"card-wrapper\" style={wrapperStyle}>\n <div\n className={cardClasses}\n style={cardStyle}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={ariaLabel}\n data-testid={testId}\n >\n {imageUrl && (\n <div className=\"card__image-wrapper\" style={imageWrapperStyle}>\n <div className=\"card__image-container\">\n <img src={imageUrl} alt={imageAlt} className=\"card__image\" loading=\"lazy\" />\n </div>\n </div>\n )}\n <div className=\"card__body\" style={bodyStyle}>\n {children}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"card-wrapper\" style={wrapperStyle}>\n {cardContent}\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { Button } from '@/components/atoms/Button';\nimport { TextInput } from '@/components/atoms/TextInput';\nimport { TextLink } from '@/components/atoms/TextLink';\nimport { FilterPill as FilterPillAtom } from '@/components/atoms/FilterPill';\nimport type { FilterPillStyle } from '@/components/atoms/FilterPill';\nimport { AssetMeta } from '@/components/molecules/AssetMeta';\nimport { DropdownSelect, DropdownSelectOption } from '@/components/molecules/primax/DropdownSelect';\nimport { PrimaxCard } from '@/components/molecules/primax/Card';\nimport type { ImageProps } from '@/components/atoms/Image';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport './FilterSection.scss';\nimport { Container } from '@/components/atoms/Container';\n\nexport interface FilterPillData {\n /** Unique identifier for the pill */\n id: string;\n /** Display label */\n label: string;\n /** Visual style variant (default: 'white') */\n pillStyle?: FilterPillStyle;\n}\n\nexport interface FilterDropdownConfig {\n /** Field name for the dropdown */\n name: string;\n /** Placeholder text */\n placeholder?: string;\n /** Available options */\n options: DropdownSelectOption[];\n /** Currently selected values (controlled) */\n value?: string[];\n}\n\nexport interface FilterResultCard {\n /** Unique identifier */\n id: string;\n /** Image configuration — renders via Image atom in PrimaxCard */\n image?: ImageProps;\n /** Asset type label (e.g. \"Article\", \"Video\") */\n assetType?: string;\n /** Duration in minutes */\n durationMinutes?: number;\n /** Timestamp string (e.g. \"01-30-45\") */\n timestamp?: string;\n /** Card title */\n title: string;\n /** Card destination URL */\n href: string;\n /** Button label text */\n buttonLabel?: string;\n}\n\nexport interface FilterSectionProps {\n /** Section title displayed above filters */\n title?: string;\n /** Heading level (default: 'h2') */\n headingLevel?: HeadingProps['level'];\n /** Heading variant (default: 'sectionDivider') */\n headingVariant?: HeadingProps['variant'];\n /** Filter dropdown configurations (including current selected values) */\n dropdowns?: FilterDropdownConfig[];\n /** Active filter pills (derived from selections by consumer) */\n activePills?: FilterPillData[];\n /** Search input placeholder */\n searchPlaceholder?: string;\n /** Current search input value (controlled) */\n searchValue?: string;\n /** Search button label */\n searchButtonLabel?: string;\n /** Result cards to display */\n results?: FilterResultCard[];\n /** Whether results section is visible (default: true) */\n showResults?: boolean;\n /** Number of columns for results grid */\n resultsColumns?: number;\n /** Number of results visible initially (default: 6) */\n initialCount?: number;\n /** Number of results to reveal per \"Load More\" click (default: 3) */\n loadMoreCount?: number;\n /** Load more button label (default: 'Load More') */\n loadMoreLabel?: string;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Callback when a dropdown selection changes */\n onDropdownChange?: (name: string, values: string[]) => void;\n /** Callback when search input value changes */\n onSearchChange?: (value: string) => void;\n /** Callback when search is submitted (button click or Enter) */\n onSearchSubmit?: () => void;\n /** Callback when a filter pill is dismissed */\n onPillDismiss?: (id: string) => void;\n /** Callback when \"Clear\" link is clicked */\n onClearAll?: () => void;\n}\n\n/**\n * FilterSection — A controlled, presentational molecule that composes:\n * - A section heading\n * - Filter dropdowns (multi-select)\n * - A search input with submit button\n * - Active filter pills (dismissible)\n * - A results grid of insight cards\n *\n * The component does NOT manage filter state internally.\n * The consuming page/container owns the state, handles filtering logic,\n * and passes everything via props. This follows atomic design principles\n * where molecules are presentational and pages orchestrate data flow.\n */\nexport const FilterSection: React.FC<FilterSectionProps> = ({\n title = 'Want More? Explore All Resources',\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n dropdowns = [],\n activePills = [],\n searchPlaceholder = 'Search',\n searchValue = '',\n searchButtonLabel = 'SEARCH',\n results = [],\n showResults = true,\n resultsColumns = 3,\n initialCount = 6,\n loadMoreCount = 3,\n loadMoreLabel = 'Load More',\n darkMode = false,\n className,\n onDropdownChange,\n onSearchChange,\n onSearchSubmit,\n onPillDismiss,\n onClearAll,\n}) => {\n const baseClass = 'filter-section';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n const [visibleCount, setVisibleCount] = useState(initialCount);\n\n // Reset visible count when results change (e.g. new filter applied)\n useEffect(() => {\n setVisibleCount(initialCount);\n }, [results, initialCount]);\n\n const visibleResults = results.slice(0, visibleCount);\n const hasMore = visibleCount < results.length;\n\n const handleLoadMore = (): void => {\n setVisibleCount((prev) => prev + loadMoreCount);\n };\n\n const handleSearchKeyDown = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter') {\n onSearchSubmit?.();\n }\n };\n\n return (\n <Container as=\"section\" className={classes} data-dark-mode={darkMode || undefined} aria-label={title}>\n {/* Title */}\n {title && (\n <Heading level={headingLevel} variant={headingVariant} darkMode={darkMode} className={`${baseClass}__title`}>\n {title}\n </Heading>\n )}\n\n {/* Filters area */}\n <div className={`${baseClass}__filters`}>\n {/* Active pills row */}\n {activePills.length > 0 && (\n <div className={`${baseClass}__pills-row`}>\n <ul className={`${baseClass}__pills`} role=\"list\" aria-label=\"Active filters\">\n {activePills.map((pill) => (\n <FilterPillAtom\n key={pill.id}\n label={pill.label}\n pillStyle={pill.pillStyle ?? 'white'}\n dismissible\n onDismiss={() => onPillDismiss?.(pill.id)}\n darkMode={darkMode}\n />\n ))}\n </ul>\n <span\n className={`${baseClass}__clear-link`}\n onClick={(e) => {\n e.preventDefault();\n onClearAll?.();\n }}\n aria-label=\"Clear all filters\"\n >\n <TextLink label=\"Clear\" darkMode={darkMode} href=\"#\" />\n </span>\n </div>\n )}\n\n {/* Dropdowns + Search row */}\n <div className={`${baseClass}__controls`}>\n {dropdowns.map((dropdown) => (\n <DropdownSelect\n key={dropdown.name}\n name={dropdown.name}\n placeholder={dropdown.placeholder ?? 'Select from below'}\n options={dropdown.options}\n value={dropdown.value}\n onChange={(values) => onDropdownChange?.(dropdown.name, values)}\n darkMode={darkMode}\n className={`${baseClass}__dropdown`}\n />\n ))}\n\n {/* Search input with button */}\n <div\n className={`${baseClass}__search`}\n onKeyDown={handleSearchKeyDown}\n role=\"search\"\n aria-label=\"Filter resources\"\n >\n <TextInput\n label=\"Search\"\n name=\"filter-search\"\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={(value) => onSearchChange?.(value)}\n hideLabel\n clearable\n darkMode={darkMode}\n className={`${baseClass}__search-input`}\n />\n <Button\n buttonType=\"general\"\n label={searchButtonLabel}\n darkMode={darkMode}\n onClick={onSearchSubmit}\n className={`${baseClass}__search-button`}\n />\n </div>\n </div>\n </div>\n\n {/* Results grid */}\n {showResults && visibleResults.length > 0 && (\n <Grid\n columns={{ sm: 1, md: 2, lg: resultsColumns }}\n gap=\"3.75rem\"\n alignItems=\"stretch\"\n className={`${baseClass}__results`}\n >\n {visibleResults.map((card) => (\n <GridItem key={card.id}>\n <PrimaxCard\n variant=\"image\"\n image={card.image}\n title={card.title}\n titleAs=\"p\"\n metadata={\n card.assetType || card.durationMinutes || card.timestamp ? (\n <AssetMeta\n assetType={card.assetType}\n duration={card.durationMinutes}\n date={card.timestamp}\n darkMode={darkMode}\n />\n ) : undefined\n }\n button={{ label: card.buttonLabel ?? 'submit' }}\n buttonVariant=\"general\"\n href={card.href}\n darkMode={darkMode}\n />\n </GridItem>\n ))}\n </Grid>\n )}\n\n {/* Empty state */}\n {showResults && results.length === 0 && (\n <Heading level=\"h3\" variant=\"sectionDivider\" darkMode={darkMode} className={`${baseClass}__empty`}>\n No results found\n </Heading>\n )}\n\n {/* Load More button */}\n {showResults && hasMore && (\n <div className={`${baseClass}__load-more`}>\n <Button\n buttonType=\"secondary\"\n label={loadMoreLabel}\n icon=\"sparkle\"\n iconPosition=\"trailing\"\n darkMode={darkMode}\n onClick={handleLoadMore}\n />\n </div>\n )}\n </Container>\n );\n};\n","import React from 'react';\nimport { TwoColumn, TwoColumnRow } from '../TwoColumn';\nimport { MediaBlock, MediaBlockProps } from '../MediaBlock';\nimport { Heading, HeadingProps } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { BulletList, BulletItem } from '@/components/atoms/BulletList';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { ButtonLink, ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { RichText } from '@/components/atoms/RichText';\nimport { DividerProps } from '@/components/atoms/Divider';\nimport './HalfColumn.scss';\n\nexport type HalfColumnVariant = 'sparkle' | 'video' | 'media';\n\nexport type HalfColumnMediaPosition = 'left' | 'right';\n\n/** Content configuration for the text side of a HalfColumn */\nexport interface HalfColumnContentProps {\n /** Rich text HTML content (renders via RichText component, takes priority over individual props) */\n richText?: string;\n /** Heading text */\n heading?: string;\n /** Heading level (default: 'h2') */\n headingLevel?: HeadingProps['level'];\n /** Heading variant (default: 'sectionDivider') */\n headingVariant?: HeadingProps['variant'];\n /** Paragraph text */\n paragraph?: string;\n /** Bullet list items */\n bulletItems?: BulletItem[];\n /** Custom icon for bullet list items */\n bulletIcon?: React.ReactNode;\n /** Button or link — pass `href` to render a ButtonLink, omit it to render a Button */\n button?: ButtonProps | ButtonLinkProps;\n}\n\nexport interface HalfColumnRow extends HalfColumnContentProps {\n /** Text/content side — rendered opposite the media (overrides prop-based content) */\n content?: React.ReactNode;\n /** Override the variant for this specific row */\n variant?: HalfColumnVariant;\n /** Override media props for this specific row */\n mediaProps?: Omit<MediaBlockProps, 'className'>;\n /** Which side the media appears on */\n mediaPosition?: HalfColumnMediaPosition;\n /** Vertical alignment of columns */\n verticalAlign?: 'top' | 'center' | 'bottom';\n}\n\nexport interface HalfColumnProps extends DividerProps, HalfColumnContentProps {\n /** Visual variant controlling the media block style */\n variant?: HalfColumnVariant;\n /** Props passed directly to MediaBlock (thumbnail, src, wistiaId, accentBorder, sparkle, etc.) */\n mediaProps?: Omit<MediaBlockProps, 'className'>;\n\n /* --- Layout --- */\n /** Which side the media appears on (single-row shorthand) */\n mediaPosition?: HalfColumnMediaPosition;\n /** Text/content for the non-media column (overrides prop-based content) */\n content?: React.ReactNode;\n /** Multiple rows of half-column content */\n rows?: HalfColumnRow[];\n /** Gap between columns */\n gap?: string | { xs?: string; sm?: string; md?: string; lg?: string };\n /** Additional class name */\n className?: string;\n}\n\n/**\n * HalfColumn — a pre-configured two-column layout with built-in media variants.\n *\n * Supports two content modes:\n * 1. **Prop-based** (recommended): Pass `heading`, `paragraph`, `bulletItems`, and `buttonLabel`\n * directly as props for a streamlined API.\n * 2. **RichText**: Pass an HTML string via `richText` for CMS-driven content.\n * 3. **Custom content**: Pass a `content` ReactNode for full control over the text column.\n *\n * Media is configured via `mediaProps` which accepts all MediaBlock props directly.\n *\n * Variants:\n * - `sparkle` — cropped spark media block (no video)\n * - `video` — video player with accent border, sparkle & overlay\n * - `media` — static image with accent border & sparkle\n */\nexport const HalfColumn: React.FC<HalfColumnProps> = ({\n variant = 'media',\n mediaProps = {},\n mediaPosition = 'right',\n content,\n rows,\n gap,\n className,\n richText,\n heading,\n headingLevel = 'h2',\n headingVariant = 'sectionDivider',\n paragraph,\n bulletItems,\n bulletIcon,\n button,\n backgroundColor,\n backgroundImage,\n backgroundPattern,\n shapeDivider = 'none',\n shapeColor,\n padding,\n height,\n overflow,\n darkMode = false,\n ...rest\n}) => {\n /** Build the text content from props when no explicit `content` node is provided */\n const buildContent = (contentProps: HalfColumnContentProps, isDark: boolean): React.ReactNode => {\n const {\n richText: rt,\n heading: h,\n headingLevel: hl,\n headingVariant: hv,\n paragraph: p,\n bulletItems: bi,\n bulletIcon: bIcon,\n button: btn,\n } = contentProps;\n\n const renderButton = () => {\n if (!btn) return null;\n if ('href' in btn) {\n return (\n <div>\n <ButtonLink darkMode={isDark} {...(btn as ButtonLinkProps)}>\n {btn.children || btn.label}\n </ButtonLink>\n </div>\n );\n }\n return (\n <div>\n <Button darkMode={isDark} {...(btn as ButtonProps)}>\n {btn.children || btn.label}\n </Button>\n </div>\n );\n };\n\n // RichText takes priority over individual props\n if (rt) {\n return (\n <div className=\"primax-half-column__content\">\n <RichText content={rt} darkMode={isDark} />\n {renderButton()}\n </div>\n );\n }\n\n if (!h && !p && !bi && !btn) return null;\n\n return (\n <div className=\"primax-half-column__content\">\n {h && (\n <Heading level={hl || 'h2'} variant={hv || 'sectionDivider'} darkMode={isDark}>\n {h}\n </Heading>\n )}\n {p && <Paragraph darkMode={isDark}>{p}</Paragraph>}\n {bi && bi.length > 0 && <BulletList items={bi} icon={bIcon} darkMode={isDark} />}\n {renderButton()}\n </div>\n );\n };\n\n const buildMedia = (\n position: HalfColumnMediaPosition,\n rowVariant?: HalfColumnVariant,\n rowMediaProps?: Omit<MediaBlockProps, 'className'>\n ) => {\n const v = rowVariant ?? variant;\n const resolvedMediaProps = rowMediaProps ?? mediaProps;\n const shouldMirror = resolvedMediaProps.mirror ?? position === 'right';\n\n switch (v) {\n case 'sparkle':\n return (\n <MediaBlock\n variant=\"croppedSpark\"\n thumbnail={resolvedMediaProps.thumbnail}\n alt={resolvedMediaProps.alt || ''}\n />\n );\n case 'video':\n return <MediaBlock {...resolvedMediaProps} mirror={shouldMirror} />;\n case 'media':\n default:\n return <MediaBlock {...resolvedMediaProps} mirror={shouldMirror} />;\n }\n };\n\n // Wrap media in a marker div so CSS can identify and reorder it on mobile\n const wrapMedia = (mediaNode: React.ReactNode) => <div className=\"primax-half-column__media\">{mediaNode}</div>;\n\n // Resolve content for a row: explicit content node takes priority, then prop-based content\n const resolveRowContent = (row: HalfColumnRow): React.ReactNode => {\n if (row.content) return row.content;\n return buildContent(row, darkMode);\n };\n\n // Resolve top-level content: explicit content node takes priority, then prop-based content\n const resolveTopLevelContent = (): React.ReactNode => {\n if (content) return content;\n return buildContent(\n { richText, heading, headingLevel, headingVariant, paragraph, bulletItems, bulletIcon, button },\n darkMode\n );\n };\n\n // Build TwoColumn rows\n const resolvedRows: TwoColumnRow[] = rows\n ? rows.map((row) => {\n const pos = row.mediaPosition ?? mediaPosition;\n const media = wrapMedia(buildMedia(pos, row.variant, row.mediaProps));\n const rowContent = resolveRowContent(row);\n return {\n left: pos === 'left' ? media : rowContent,\n right: pos === 'right' ? media : rowContent,\n verticalAlign: row.verticalAlign,\n };\n })\n : (() => {\n const media = wrapMedia(buildMedia(mediaPosition));\n const topContent = resolveTopLevelContent();\n return [\n {\n left: mediaPosition === 'left' ? media : topContent,\n right: mediaPosition === 'right' ? media : topContent,\n verticalAlign: 'center' as const,\n },\n ];\n })();\n\n const baseClass = 'primax-half-column';\n const classes = [baseClass, className].filter(Boolean).join(' ');\n\n return (\n <TwoColumn\n rows={resolvedRows}\n gap={gap}\n backgroundColor={backgroundColor}\n backgroundImage={backgroundImage}\n backgroundPattern={backgroundPattern}\n shapeDivider={shapeDivider}\n shapeColor={shapeColor}\n padding={padding}\n height={height}\n overflow={overflow}\n darkMode={darkMode}\n className={classes}\n {...rest}\n />\n );\n};\n","import React from 'react';\nimport { Button } from '../../atoms/Button/Button';\nimport './Header.scss';\n\ntype User = {\n name: string;\n};\n\nexport interface HeaderProps {\n user?: User;\n onLogin?: () => void;\n onLogout?: () => void;\n onCreateAccount?: () => void;\n}\n\nexport const Header = ({ user, onLogin, onLogout, onCreateAccount }: HeaderProps) => (\n <header>\n <div className=\"storybook-header\">\n <div>\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill=\"none\" fillRule=\"evenodd\">\n <path d=\"M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z\" fill=\"#FFF\" />\n <path d=\"M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z\" fill=\"#555AB9\" />\n <path d=\"M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z\" fill=\"#91BAF8\" />\n </g>\n </svg>\n <h1>Acme</h1>\n </div>\n <div>\n {user ? (\n <>\n <span className=\"welcome\">\n Welcome, <b>{user.name}</b>!\n </span>\n <Button buttonType=\"secondary\" onClick={onLogout} label=\"Log out\" />\n </>\n ) : (\n <>\n <Button buttonType=\"secondary\" onClick={onLogin} label=\"Log in\" />\n <Button buttonType=\"cta\" onClick={onCreateAccount} label=\"Sign up\" />\n </>\n )}\n </div>\n </div>\n </header>\n);\n","import React from 'react';\nimport { Container } from '@/components/atoms/Container';\nimport { Grid, GridItem } from '@/components/atoms/Grid';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { BulletList } from '@/components/atoms/BulletList';\nimport type { BulletListProps } from '@/components/atoms/BulletList';\nimport { ButtonLink } from '@/components/atoms/ButtonLink';\nimport type { ButtonLinkProps } from '@/components/atoms/ButtonLink';\nimport { RichText } from '@/components/atoms/RichText';\nimport { EnhancedRichText } from '@/components/atoms/RichText';\nimport type { RichTextProps } from '@/components/atoms/RichText';\nimport type { RichTextReplacer } from '@/components/atoms/RichText';\nimport { Footnote } from '@/components/atoms/Footnote';\nimport type { FootnoteProps } from '@/components/atoms/Footnote';\nimport { Author } from '@/components/atoms/Author';\nimport type { AuthorProps } from '@/components/atoms/Author';\nimport { Subscribe } from '@/components/molecules/primax/Subscribe';\nimport type { SubscribeProps } from '@/components/molecules/primax/Subscribe';\nimport { SideBar } from '@/components/molecules/primax/SideBar';\nimport type { SideBarProps } from '@/components/molecules/primax/SideBar';\nimport './IndividualPost.scss';\n\nexport interface IndividualPostMeta {\n /** ISO 8601 date for the <time> datetime attribute (e.g., \"2025-01-15\") */\n dateTime?: string;\n /** Formatted display string for time/date (e.g., \"5 Mins | 01-15-25\") */\n published?: string;\n /** Author byline name */\n authorName?: string;\n /** Author byline title */\n authorTitle?: string;\n}\n\nexport interface IndividualPostProps {\n title: string;\n meta?: IndividualPostMeta;\n summary?: string;\n bulletList?: BulletListProps & {\n title?: string;\n };\n primaryButton?: ButtonLinkProps;\n firstBodyContent?: RichTextProps;\n secondBodyContent?: RichTextProps;\n subscribe?: SubscribeProps;\n footnotes?: FootnoteProps;\n author?: AuthorProps;\n about?: {\n heading?: string;\n content: string;\n };\n sidebar?: SideBarProps;\n replacers?: RichTextReplacer[];\n beforeContent?: React.ReactNode;\n afterContent?: React.ReactNode;\n className?: string;\n}\n\nexport const IndividualPost: React.FC<IndividualPostProps> = ({\n title,\n meta,\n summary,\n bulletList,\n primaryButton,\n firstBodyContent,\n secondBodyContent,\n subscribe,\n footnotes,\n author,\n about,\n sidebar,\n replacers,\n beforeContent,\n afterContent,\n className,\n}) => {\n const classes = ['individual-post', className].filter(Boolean).join(' ');\n\n const renderBody = (props: RichTextProps, extraClass: string) => {\n const bodyClassName = `${extraClass} ${props.className ?? ''}`;\n if (replacers && replacers.length > 0) {\n return <EnhancedRichText {...props} replacers={replacers} className={bodyClassName} />;\n }\n return <RichText {...props} className={bodyClassName} />;\n };\n\n return (\n <Container className={classes} as=\"article\">\n {beforeContent}\n <Grid columns={{ sm: 1, md: 1, lg: sidebar ? '1fr 25rem' : 1 }} gap=\"lg\" className=\"individual-post__grid\">\n <GridItem className=\"individual-post__main\" gap=\"1.88rem\" style={{ display: 'inline-grid' }}>\n <header className=\"individual-post__header\">\n <Heading level=\"h1\" variant=\"sectionDivider\">\n {title}\n </Heading>\n\n {meta && (\n <p className=\"individual-post__meta paragraph\">\n {meta.published && (\n <time className=\"individual-post__time\" dateTime={meta.dateTime}>\n {meta.published}\n </time>\n )}\n {meta.authorName && (\n <span className=\"individual-post__byline\">\n By: {meta.authorName}\n {meta.authorTitle && `, ${meta.authorTitle}`}\n </span>\n )}\n </p>\n )}\n </header>\n\n {summary && (\n <div className=\"individual-post__summary\">\n <Heading level=\"h2\" variant=\"componentTitle\" className=\"individual-post__summary-heading\">\n Summary\n </Heading>\n <Paragraph>{summary}</Paragraph>\n </div>\n )}\n\n {bulletList && (\n <div className=\"individual-post__bullets\">\n {bulletList.title && (\n <Paragraph weight=\"bold\" className=\"individual-post__bullets-title\">\n {bulletList.title}\n </Paragraph>\n )}\n <BulletList items={bulletList.items} icon={bulletList.icon} darkMode={bulletList.darkMode} />\n </div>\n )}\n\n {primaryButton && (\n <div className=\"individual-post__primary-action\">\n <ButtonLink {...primaryButton} />\n </div>\n )}\n\n {firstBodyContent && renderBody(firstBodyContent, 'individual-post__body')}\n\n {subscribe && <Subscribe {...subscribe} />}\n\n {secondBodyContent && renderBody(secondBodyContent, 'individual-post__body')}\n\n {footnotes && <Footnote {...footnotes} />}\n\n {author && <Author {...author} />}\n\n {about && (\n <div className=\"individual-post__about\">\n <Heading level=\"h4\" variant=\"sectionDivider\">\n {about.heading ?? 'About Primax'}\n </Heading>\n <Paragraph>{about.content}</Paragraph>\n </div>\n )}\n\n {afterContent}\n </GridItem>\n\n {sidebar && (\n <GridItem className=\"individual-post__sidebar\">\n <SideBar {...sidebar} />\n </GridItem>\n )}\n </Grid>\n </Container>\n );\n};\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faXmark } from '@fortawesome/free-solid-svg-icons';\nimport './Modal.scss';\n\nexport interface ModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback when the modal should close */\n onClose: () => void;\n /** Child elements rendered inside the modal content area */\n children: React.ReactNode;\n /** Additional CSS class name for the content area */\n className?: string;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Accessible label for the modal */\n ariaLabel?: string;\n /** Whether clicking the overlay closes the modal */\n closeOnOverlayClick?: boolean;\n /** Whether pressing Escape closes the modal */\n closeOnEscape?: boolean;\n /** Force bottom sheet layout regardless of device pointer type (useful for previews/Storybook) */\n forceBottomSheet?: boolean;\n /** Show close (X) button in the top-right corner of the modal */\n showCloseButton?: boolean;\n}\n\n/** Threshold in px — if dragged past this, dismiss the sheet */\nconst DISMISS_THRESHOLD = 150;\n/** Velocity threshold — fast swipe dismisses even if distance is short */\nconst VELOCITY_THRESHOLD = 0.5;\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n children,\n className = '',\n darkMode = false,\n size = 'md',\n ariaLabel,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n forceBottomSheet = false,\n showCloseButton = true,\n}) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Touch gesture state\n const [dragY, setDragY] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n const touchStartRef = useRef<{ y: number; time: number } | null>(null);\n\n const handleClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n /** Animate out then close */\n const dismissSheet = useCallback(() => {\n setIsClosing(true);\n // Wait for the slide-out animation to finish\n const timer = setTimeout(() => {\n setIsClosing(false);\n setDragY(0);\n handleClose();\n }, 300);\n return () => clearTimeout(timer);\n }, [handleClose]);\n\n // Sync open state with the native dialog element\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (isOpen && !dialog.open) {\n previousFocusRef.current = document.activeElement as HTMLElement;\n dialog.showModal();\n setIsClosing(false);\n setDragY(0);\n } else if (!isOpen && dialog.open) {\n dialog.close();\n previousFocusRef.current?.focus();\n }\n }, [isOpen]);\n\n // Handle native dialog close event (e.g. Escape key)\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (e: Event) => {\n if (!closeOnEscape) {\n e.preventDefault();\n return;\n }\n handleClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [closeOnEscape, handleClose]);\n\n // Touch gesture handlers for mobile bottom sheet\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n const touch = e.touches[0];\n touchStartRef.current = { y: touch.clientY, time: Date.now() };\n setIsDragging(true);\n }, []);\n\n const handleTouchMove = useCallback((e: React.TouchEvent) => {\n if (!touchStartRef.current) return;\n const touch = e.touches[0];\n const deltaY = touch.clientY - touchStartRef.current.y;\n // Only allow dragging downward\n if (deltaY > 0) {\n setDragY(deltaY);\n }\n }, []);\n\n const handleTouchEnd = useCallback(() => {\n if (!touchStartRef.current) return;\n\n const elapsed = (Date.now() - touchStartRef.current.time) / 1000; // seconds\n const velocity = dragY / elapsed; // px/s\n\n // Dismiss if dragged past threshold or fast swipe\n if (dragY > DISMISS_THRESHOLD || velocity > VELOCITY_THRESHOLD * 1000) {\n dismissSheet();\n } else {\n // Snap back\n setDragY(0);\n }\n\n setIsDragging(false);\n touchStartRef.current = null;\n }, [dragY, dismissSheet]);\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDialogElement>) => {\n if (closeOnOverlayClick && e.target === dialogRef.current) {\n handleClose();\n }\n };\n\n if (!isOpen) return null;\n\n const contentStyle: React.CSSProperties =\n dragY > 0\n ? {\n transform: `translateY(${dragY}px)`,\n transition: isDragging ? 'none' : undefined,\n }\n : {};\n\n return (\n <dialog\n ref={dialogRef}\n className={`modal ${isClosing ? 'modal--closing' : ''} ${className}`}\n data-dark-mode={darkMode || undefined}\n data-size={size}\n data-bottom-sheet={forceBottomSheet || undefined}\n aria-label={ariaLabel}\n onClick={handleOverlayClick}\n >\n <div ref={contentRef} className=\"modal__content\" style={contentStyle}>\n {/* Close button — visible only on desktop modal (hidden on bottom sheet) */}\n {showCloseButton && (\n <button className=\"modal__close-button\" onClick={handleClose} aria-label=\"Close modal\" type=\"button\">\n <FontAwesomeIcon icon={faXmark} />\n </button>\n )}\n {/* Drag handle — visible only on mobile via CSS */}\n <div\n className=\"modal__drag-handle\"\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n aria-hidden=\"true\"\n >\n <div className=\"modal__drag-indicator\" />\n </div>\n <div className=\"modal__body\">{children}</div>\n </div>\n </dialog>\n );\n};\n","import React from 'react';\nimport './PlayButton.scss';\n\nexport interface PlayButtonProps {\n /** Custom icon element to render inside the play button wrapper.\n * When omitted, nothing renders — pass a tenant-specific icon\n * (e.g. primax PlayIcon) or any React node. */\n icon?: React.ReactNode;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Themeable play button wrapper.\n * Colors are driven by CSS custom properties so themes can override\n * default, hover, focus, and active states.\n *\n * Pass any SVG or React node as `icon` — the wrapper handles\n * sizing, positioning, and state-based color transitions.\n */\nexport const PlayButton: React.FC<PlayButtonProps> = ({ icon, darkMode = false, size, className, style }) => {\n const classes = ['play-button', className].filter(Boolean).join(' ');\n\n return (\n <span\n className={classes}\n style={style}\n data-dark-mode={darkMode || undefined}\n data-size={size || undefined}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n );\n};\n","import React from 'react';\n\n/**\n * Primax-branded play button SVG icon (matches public/play-button.svg).\n * Renders inline so fill colors can be controlled via CSS custom properties.\n *\n * Uses two class names for targeted theming:\n * - `.play-button__shadow` — the semi-transparent background triangle\n * - `.play-button__shape` — the outlined foreground triangle\n */\nexport const PlayIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 150 176\" aria-hidden=\"true\" {...props}>\n {/* Shadow / background layer */}\n <g className=\"play-button__shadow\">\n <path d=\"M0,175.6V.6l150,87.5L0,175.6Z\" />\n </g>\n {/* Foreground outlined play triangle */}\n <path\n className=\"play-button__shape\"\n d=\"M18.8,11.6l112.7,65.7,18.6,10.9-18.6,10.9L18.8,164.7,0,175.6V.6l18.8,10.9ZM18.8,143l94-54.8L18.8,33.3v109.7Z\"\n />\n </svg>\n);\n","import React, { useState } from 'react';\nimport { Button } from '@/components/atoms/Button';\nimport { Container } from '@/components/atoms/Container';\nimport { Heading } from '@/components/atoms/Heading';\nimport { PostItem, PostItemData } from './PostItem';\nimport './PostFeed.scss';\n\nexport interface PostFeedProps {\n /** Section title */\n title: string;\n /** Full array of posts — component manages visibility internally */\n posts: PostItemData[];\n /** Number of posts visible initially (including featured). Default: 4 */\n initialCount?: number;\n /** Number of posts to reveal per \"Load More\" click. Default: 4 */\n loadMoreCount?: number;\n /** Load more button label */\n loadMoreLabel?: string;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * PostFeed section component.\n * Renders all posts in a single grid, showing `initialCount` initially\n * and revealing more on each \"Load More\" click.\n *\n * Layout:\n * - Desktop: Two columns — featured post left (spans rows), regular posts right (horizontal layout, border dividers via CSS)\n * - Tablet: Featured full-width, regular posts in two-column grid (vertical layout)\n * - Mobile: Single column, vertical layout for all\n */\nexport const PostFeed: React.FC<PostFeedProps> = ({\n title,\n posts,\n initialCount = 4,\n loadMoreCount = 4,\n loadMoreLabel = 'Load More',\n className,\n}) => {\n const [visibleCount, setVisibleCount] = useState(initialCount);\n\n const featuredPost = posts.find((post) => post.isFeatured);\n const regularPosts = posts.filter((post) => !post.isFeatured);\n\n // Featured counts as 1 toward visible count\n const visibleRegularCount = featuredPost ? visibleCount - 1 : visibleCount;\n const visibleRegularPosts = regularPosts.slice(0, visibleRegularCount);\n\n // Tablet: if regular posts are odd, show one extra to fill the 2-column grid evenly\n const tabletExtraCount = visibleRegularCount % 2 !== 0 ? 1 : 0;\n const tabletExtraPosts =\n tabletExtraCount > 0 ? regularPosts.slice(visibleRegularCount, visibleRegularCount + tabletExtraCount) : [];\n\n const allVisiblePosts = [...(featuredPost ? [featuredPost] : []), ...visibleRegularPosts];\n\n const hasMore = visibleRegularPosts.length + tabletExtraPosts.length < regularPosts.length;\n\n const handleLoadMore = () => {\n setVisibleCount((prev) => prev + loadMoreCount);\n };\n\n const rootClasses = ['post-feed', className].filter(Boolean).join(' ');\n\n return (\n <section className={rootClasses} aria-label={title}>\n <Container>\n <Heading level=\"h3\" variant=\"sectionDivider\" className=\"post-feed__title\">\n {title}\n </Heading>\n\n <div className=\"post-feed__grid\">\n {allVisiblePosts.map((post) => (\n <div\n key={post.link.href}\n className={[\n 'post-feed__item',\n post.isFeatured ? 'post-feed__item--featured' : 'post-feed__item--regular',\n ].join(' ')}\n >\n <PostItem {...post} />\n </div>\n ))}\n\n {/* Extra posts visible only on tablet to fill the grid */}\n {tabletExtraPosts.map((post) => (\n <div key={post.link.href} className=\"post-feed__item post-feed__item--regular post-feed__item--tablet-only\">\n <PostItem {...post} />\n </div>\n ))}\n </div>\n\n {hasMore && (\n <div className=\"post-feed__load-more\">\n <Button\n buttonType=\"secondary\"\n label={loadMoreLabel}\n icon=\"sparkle\"\n iconPosition=\"trailing\"\n onClick={handleLoadMore}\n />\n </div>\n )}\n </Container>\n </section>\n );\n};\n","import React, { useState } from 'react';\nimport { Button } from '@/components/atoms/Button';\nimport { Heading } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { Form } from '@/components/molecules/primax/Form';\nimport type { FormField } from '@/components/molecules/primax/Form';\nimport './SearchResults.scss';\n\n/** A single search result item */\nexport interface SearchResultItem {\n /** Category label (e.g., \"Product\", \"Blog\", \"White Paper\") */\n category: string;\n /** Result title */\n title: string;\n /** Result description/excerpt */\n description: string;\n /** Optional link URL */\n href?: string;\n}\n\nexport interface SearchResultsProps {\n /** Initial search query to display in the input */\n query?: string;\n /** List of search result items */\n results?: SearchResultItem[];\n /** Number of results visible initially. Default: all */\n initialCount?: number;\n /** Number of results to reveal per \"Load More\" click. Default: same as initialCount */\n loadMoreCount?: number;\n /** Load more button label */\n loadMoreLabel?: string;\n /** Callback when search is submitted */\n onSearch?: (query: string) => void;\n /** Callback when \"Load More\" is clicked */\n onLoadMore?: () => void;\n /** Callback when a result item is clicked */\n onResultClick?: (item: SearchResultItem, index: number) => void;\n /** Loading state */\n loading?: boolean;\n /** Dark mode */\n darkMode?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\nexport const SearchResults: React.FC<SearchResultsProps> = ({\n query = '',\n results = [],\n initialCount,\n loadMoreCount,\n loadMoreLabel = 'LOAD MORE',\n onSearch,\n onLoadMore,\n onResultClick,\n loading = false,\n darkMode = false,\n className,\n}) => {\n const [visibleCount, setVisibleCount] = useState(initialCount ?? results.length);\n\n const visibleResults = initialCount ? results.slice(0, visibleCount) : results;\n const hasMore = visibleResults.length < results.length;\n const resultCount = results.length;\n const classes = ['primax-search-results', className].filter(Boolean).join(' ');\n\n const handleLoadMore = () => {\n const increment = loadMoreCount ?? initialCount ?? results.length;\n setVisibleCount((prev) => Math.min(prev + increment, results.length));\n onLoadMore?.();\n };\n\n const searchFields: FormField[] = [\n {\n name: 'search',\n label: 'Search',\n type: 'text',\n placeholder: 'Search',\n hideLabel: true,\n },\n ];\n\n const handleFormSubmit = (data: Record<string, string>) => {\n onSearch?.(data.search ?? '');\n };\n\n return (\n <section className={classes} data-dark-mode={darkMode || undefined} aria-label=\"Search results\">\n {/* Results Heading */}\n {resultCount > 0 && (\n <Heading level=\"h2\" variant=\"sectionDivider\" className=\"primax-search-results__heading\">\n {resultCount} search result{resultCount !== 1 ? 's' : ''} for “{query}”\n </Heading>\n )}\n\n {/* Search Bar */}\n <Form\n fields={searchFields}\n columns=\"1fr auto\"\n submitLabel=\"SEARCH\"\n submitColSpan=\"auto\"\n loading={loading}\n onSubmit={handleFormSubmit}\n darkMode={darkMode}\n className=\"primax-search-results__search-bar\"\n />\n\n {/* Results List */}\n {visibleResults.length > 0 && (\n <div className=\"primax-search-results__list\" role=\"list\">\n {visibleResults.map((item, index) => (\n <div key={index} className=\"primax-search-results__item\" role=\"listitem\">\n <Paragraph className=\"primax-search-results__category\" weight=\"bold\">\n {item.category}\n </Paragraph>\n {item.href ? (\n <a\n href={item.href}\n className=\"primax-search-results__title-link\"\n onClick={(e) => {\n if (onResultClick) {\n e.preventDefault();\n onResultClick(item, index);\n }\n }}\n >\n <Paragraph className=\"primax-search-results__title\" variant=\"bodyBold\">\n {item.title}\n </Paragraph>\n </a>\n ) : (\n <Paragraph className=\"primax-search-results__title\" variant=\"bodyBold\">\n {item.title}\n </Paragraph>\n )}\n <Paragraph className=\"primax-search-results__description\" variant=\"body\">\n {item.description}\n </Paragraph>\n <div className=\"primax-search-results__divider\" aria-hidden=\"true\" />\n </div>\n ))}\n </div>\n )}\n\n {/* Load More Button */}\n {hasMore && (\n <div className=\"primax-search-results__load-more\">\n <Button buttonType=\"secondary\" label={loadMoreLabel} onClick={handleLoadMore} disabled={loading} />\n </div>\n )}\n </section>\n );\n};\n","import React from 'react';\nimport { Button, ButtonProps } from '@/components/atoms/Button';\nimport { BulletList, BulletItem } from '@/components/atoms/BulletList';\nimport { Heading, HeadingLevel } from '@/components/atoms/Heading';\nimport { Paragraph } from '@/components/atoms/Paragraph';\nimport { MediaBlock, MediaBlockProps } from '@/components/molecules/primax/MediaBlock';\nimport './VideoSection.scss';\n\nexport type VideoSectionVariation = 'media-first' | 'content-first';\n\nexport interface VideoSectionProps {\n /** Layout variation: media on left or right */\n variation?: VideoSectionVariation;\n /** Section heading text */\n heading: string;\n /** Heading semantic level */\n headingLevel?: HeadingLevel;\n /** Description text below the heading */\n description?: string;\n /** List of bullet items rendered via BulletList atom */\n bulletPoints?: BulletItem[];\n /** Shared icon for all bullet points (can be overridden per-item) */\n bulletIcon?: React.ReactNode;\n /** Button props */\n button?: ButtonProps;\n /** Media block props (video/image with accent border, sparkle, etc.) */\n media: MediaBlockProps;\n /** Dark mode styling */\n darkMode?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nexport const VideoSection: React.FC<VideoSectionProps> = ({\n variation = 'media-first',\n heading,\n headingLevel = 'h2',\n description,\n bulletPoints,\n bulletIcon,\n button,\n media,\n darkMode = false,\n className,\n}) => {\n const baseClass = 'primax-video-section';\n const classes = [baseClass, `${baseClass}--${variation}`, className].filter(Boolean).join(' ');\n\n const contentBlock = (\n <div className={`${baseClass}__content`}>\n <div className={`${baseClass}__text-content`}>\n <Heading level={headingLevel} variant=\"sectionDivider\" darkMode={darkMode} className={`${baseClass}__heading`}>\n {heading}\n </Heading>\n\n {description && (\n <Paragraph className={`${baseClass}__description`} darkMode={darkMode}>\n {description}\n </Paragraph>\n )}\n\n {bulletPoints && bulletPoints.length > 0 && (\n <BulletList items={bulletPoints} icon={bulletIcon} darkMode={darkMode} />\n )}\n </div>\n\n {button && (\n <Button buttonType={button.buttonType || 'general'} size={button.size || 'lg'} darkMode={darkMode} {...button}>\n {button.children || button.label}\n </Button>\n )}\n </div>\n );\n\n const mediaBlock = (\n <div className={`${baseClass}__media`}>\n <MediaBlock {...media} />\n </div>\n );\n\n return (\n <section className={classes} data-dark-mode={darkMode || undefined}>\n <div className={`${baseClass}__inner`}>\n {variation === 'media-first' ? (\n <>\n {mediaBlock}\n {contentBlock}\n </>\n ) : (\n <>\n {contentBlock}\n {mediaBlock}\n </>\n )}\n </div>\n </section>\n );\n};\n","import React from 'react';\nimport { Element } from 'html-react-parser';\nimport { VideoPlayer } from '@/components/molecules/VideoPlayer';\nimport type { VideoPlayerProps } from '@/components/molecules/VideoPlayer';\nimport type { DOMNode } from 'html-react-parser';\nimport type { RichTextReplacer } from './types';\n\nexport interface VideoReplacerOptions {\n /** Default playback mode for replaced videos */\n playbackMode?: VideoPlayerProps['playbackMode'];\n /** Default aspect ratio */\n aspectRatio?: string;\n /** Custom play icon element */\n playIcon?: React.ReactNode;\n /** Additional props passed to every VideoPlayer instance */\n videoPlayerProps?: Partial<VideoPlayerProps>;\n}\n\n/**\n * Creates a replacer that transforms `<video>` elements into VideoPlayer components.\n * Extracts src from `<source>` children or the video element's `src` attribute,\n * and uses the `poster` attribute as thumbnail.\n */\nexport function createVideoReplacer(options: VideoReplacerOptions = {}): RichTextReplacer {\n const { playbackMode = 'inline', aspectRatio = '16/9', playIcon, videoPlayerProps } = options;\n\n return (domNode: DOMNode): React.ReactElement | undefined => {\n if (!(domNode instanceof Element) || domNode.name !== 'video') {\n return undefined;\n }\n\n // Extract video src — check <source> children first, then video's own src attribute\n let src = domNode.attribs?.src || '';\n\n if (!src && domNode.children) {\n for (const child of domNode.children) {\n if (child instanceof Element && child.name === 'source' && child.attribs?.src) {\n src = child.attribs.src;\n break;\n }\n }\n }\n\n if (!src) return undefined;\n\n const poster = domNode.attribs?.poster || undefined;\n const alt = domNode.attribs?.title || domNode.attribs?.['aria-label'] || '';\n\n return (\n <VideoPlayer\n src={src}\n thumbnail={poster}\n alt={alt}\n playbackMode={playbackMode}\n aspectRatio={aspectRatio}\n playIcon={playIcon}\n {...videoPlayerProps}\n />\n );\n };\n}\n"],"names":["iconRegistry","faArrowRight","faCirclePlaySolid","play","faPlay","download","faDownload","resolveIcon","icon","iconDef","jsx","FontAwesomeIcon","defaultButtonIcons","video","regular","faCirclePlayRegular","hover","subscribe","faEnvelopeRegular","faEnvelopeSolid","cta","faAnglesRight","twitter","faXTwitter","linkedin","faLinkedin","facebook","faSquareFacebook","getButtonIcon","buttonType","customIcon","customHoverIcon","themeName","faSparkle","faSparkles","defaultColorSystem","primitives","semantic","primary","primaryHover","primaryActive","primaryText","secondary","secondaryHover","secondaryActive","secondaryText","accent","accentHover","accentActive","accentText","tertiary","tertiaryHover","tertiaryActive","tertiaryText","textPrimary","textSecondary","textAccent","textTertiary","textInverse","textDisabled","textLink","textLinkHover","bgPrimary","bgSecondary","bgTertiary","bgInverse","bgOverlay","borderDefault","borderSubtle","borderStrong","borderFocus","stateSuccess","stateSuccessHover","stateSuccessBg","stateWarning","stateWarningHover","stateWarningBg","stateError","stateErrorHover","stateErrorBg","stateInfo","stateInfoHover","stateInfoBg","interactivePrimary","interactivePrimaryHover","interactivePrimaryActive","interactiveSecondary","interactiveSecondaryHover","interactiveSecondaryActive","interactiveDisabled","defaultTheme","name","fontImportUrl","colors","colorPalettes","bg","text","spacing","xs","sm","md","lg","xl","xxl","borderRadius","shadows","breakpoints","typography","fontFamily","fontFamilyHeading","fontFamilyMono","fontSizeXs","fontSizeSm","fontSizeMd","fontSizeLg","fontSizeXl","fontSize2xl","fontWeightLight","fontWeightRegular","fontWeightSemibold","fontWeightBold","fontWeightBlack","lineHeightTight","lineHeightSnug","lineHeightNormal","lineHeightRelaxed","lineHeightLoose","letterSpacingTighter","letterSpacingTight","letterSpacingNormal","letterSpacingWide","letterSpacingWider","letterSpacingWidest","variants","display","fontSize","fontWeight","lineHeight","letterSpacing","mobile","tablet","bodyDefault","bodyLarge","bodySmall","lead","caption","textTransform","overline","pageTitle","sectionTitle","title","subtitle","body","textlink","textDecoration","bodyBold","bodyBoldLarge","components","card","background","border","shadow","padding","header","borderBottom","height","titleFontWeight","titleFontSize","titleLineHeight","descriptionLineHeight","descriptionFontWeight","descriptionFontSize","descriptionMargin","componentTokens","button","borderWidth","focusOutline","focusOutlineOffset","disabledOpacity","hoverAnimation","general","bgHover","bgActive","textHover","borderHover","secondaryDarkMode","maxWidth","borderActive","imageWrapperBorderRadius","imageAspectRatio","grid","gapXs","gapSm","gapMd","gapLg","gapXl","gapXxl","titleColor","titleMargin","welcomeColor","welcomeFontSize","welcomeMargin","buttonSpacing","contentBg","contentMaxWidth","contentBorderRadius","contentPadding","titleFontFamily","descriptionColor","descriptionFontFamily","size","fillPrimary","strokePrimary","strokeWidthPrimary","fillSecondary","strokeSecondary","strokeWidthSecondary","fillAccent","strokeAccent","strokeWidthAccent","fillSuccess","strokeSuccess","strokeWidthSuccess","fillWarning","strokeWarning","strokeWidthWarning","fillError","strokeError","strokeWidthError","sizes","heading","margin","color","h1FontSize","h1FontWeight","h1LineHeight","h1LetterSpacing","h2FontSize","h2FontWeight","h2LineHeight","h2LetterSpacing","h3FontSize","h3FontWeight","h3LineHeight","h3LetterSpacing","h4FontSize","h4FontWeight","h4LineHeight","h5FontSize","h5FontWeight","h5LineHeight","h6FontSize","h6FontWeight","h6LineHeight","displayFontSize","displayFontWeight","displayLineHeight","displayLetterSpacing","bodyDefaultFontSize","bodyDefaultFontWeight","bodyDefaultLineHeight","bodyDefaultLetterSpacing","bodyDefaultFontFamily","leadFontSize","leadFontWeight","leadLineHeight","leadLetterSpacing","captionFontSize","captionFontWeight","captionLineHeight","captionLetterSpacing","captionTextTransform","overlineFontSize","overlineFontWeight","overlineLineHeight","overlineLetterSpacing","overlineTextTransform","pageTitleFontSize","pageTitleFontWeight","pageTitleLineHeight","pageTitleLetterSpacing","pageTitleTextTransform","pageTitleColor","sectionTitleFontSize","sectionTitleFontWeight","sectionTitleLineHeight","sectionTitleLetterSpacing","titleLetterSpacing","subtitleFontSize","subtitleFontWeight","subtitleLineHeight","bodyFontSize","bodyFontWeight","bodyLineHeight","textlinkFontSize","textlinkFontWeight","textlinkLineHeight","textlinkFontFamily","textlinkTextDecoration","textlinkTextTransform","bodyBoldFontSize","bodyBoldFontWeight","bodyBoldLineHeight","bodyBoldFontFamily","bodyLargeFontSize","bodyLargeFontWeight","bodyLargeLineHeight","bodyLargeFontFamily","bodyBoldLargeFontSize","bodyBoldLargeFontWeight","bodyBoldLargeLineHeight","bodyBoldLargeFontFamily","bodySmallFontSize","bodySmallFontWeight","bodySmallLineHeight","bodySmallFontFamily","dark","colorHover","colorFocus","textDecorationFocus","textDecorationStyleFocus","colorActive","colorVisited","richText","headingMarginBottom","paragraphFontSize","paragraphFontWeight","paragraphLineHeight","paragraphMarginBottom","paragraphColor","listMargin","listPaddingLeft","listItemFontSize","listItemLineHeight","listItemMarginBottom","listItemColor","ulListStyleType","olListStyleType","strongFontWeight","codeFontSize","codeBg","codePadding","preFontSize","preBg","prePadding","blockquoteMargin","blockquotePadding","blockquoteBorderLeft","blockquoteColor","hrBorder","hrMargin","blockquote","borderLeft","fontStyle","borderPrimaryWidth","borderSecondaryWidth","borderColorPrimary","borderColorSecondary","citationMarginTop","citationFontSize","citationFontWeight","citationColor","citationPrefix","footnote","labelFontWeight","markerFontSize","markerFontWeight","author","media","objectFit","objectPosition","aspectRatio","videoPlayer","thumbnailBg","placeholderBg","playIconSize","playIconBg","playIconBorder","playIconColor","paragraph","modal","overlayBg","contentBorder","width","closeButtonTop","closeButtonRight","closeButtonSize","closeButtonBorderRadius","closeButtonBg","closeButtonColor","closeButtonBgHover","closeButtonColorHover","closeButtonFontSize","dataDial","ringBg","ringTrack","ringProgress","valueFontSize","percentFontSize","statPill","paddingY","paddingX","toKebabCase","str","test","toLowerCase","replace","objectToCSSVars","obj","prefix","Object","entries","filter","value","map","key","cssKey","startsWith","generateThemeCSS","theme","selector","css","colorSystem","sections","push","legacyVars","oldVar","newKey","Boolean","join","generateColorSystemCSS","typographyCSS","typographyBase","forEach","variantName","variantStyles","desktopStyles","prop","propKey","variantKey","length","generateTypographyCSS","vars","darkSections","sizeSections","breakpointKeys","darkSelector","componentName","componentProps","componentPrefix","camelToKebab","propValue","includes","cssVarName","sizeName","sizeProps","sizeSelector","variantProps","variantKebab","match","baseProp","state","breakpoint","breakpointProps","values","sizeSection","hasDarkContent","hasSizeContent","keys","result","generateComponentTokensCSS","ThemeContext","createContext","useTheme","context","useContext","Error","ThemeProvider","children","initialTheme","initialThemeName","useEffect","style","document","getElementById","createElement","id","fontImport","Array","isArray","url","textContent","head","contains","appendChild","applyThemeCSS","documentElement","setAttribute","currentTheme","Provider","Button","palette","label","hoverIcon","iconPosition","className","disabled","darkMode","animated","onClick","props","buttonClass","iconConfig","resolvedIconPosition","paletteStyle","backgroundColor","borderColor","iconNode","jsxs","Fragment","type","ButtonLink","href","target","rel","TextLink","linkType","ariaLabel","ariaDescribedBy","testId","isExternal","typeClass","resolvedIcon","event","preventDefault","onKeyDown","BackgroundMedia","videoUrl","imageUrl","gradient","bgColor","baseClasses","autoPlay","muted","loop","playsInline","src","backgroundStyle","backgroundImage","WISTIA_SCRIPT_ID","Media","alt","autoplay","controls","loading","srcSet","providers","onLoad","onError","onReady","videoRef","useRef","wistiaDivRef","isClient","setIsClient","useState","isWistiaReady","setIsWistiaReady","resolvedType","isWistiaId","detectMediaType","resolvedMuted","wistiaId","extractWistiaId","isWistia","script","async","window","_wq","current","catch","baseClass","classes","cssVars","wistiaOptions","ref","visibility","providerResult","options","provider","embedUrl","buildEmbedUrl","providerName","resolveCustomProvider","allow","allowFullScreen","onLoadedData","Breadcrumb","items","separator","item","index","isLast","Divider","backgroundPattern","shapeDivider","shapeColor","verticalAlign","overflow","dividerClasses","Container","fluid","as","Tag","Heading","level","variant","weight","finalStyle","headingClasses","Grid","columns","gap","rowGap","columnGap","minColumnWidth","maxColumnWidth","alignItems","justifyItems","justifyContent","columnAlign","fullWidth","gridClass","gridStyles","toString","gridTemplateColumns","gapMap","GridItem","colSpan","rowSpan","colStart","rowStart","itemStyles","gridColumn","gridRow","gridColumnStart","gridRowStart","Icon","svg","fill","stroke","strokeWidth","decorative","customStyles","role","RichText","content","richTextClasses","dangerouslySetInnerHTML","__html","ElementType","isTag","element","Script","Style","Root","Text","Directive","Comment","CDATA","Doctype","Node","parent","prev","next","startIndex","endIndex","parentNode","this","previousSibling","previous","nextSibling","cloneNode","recursive","DataNode","data","constructor","super","nodeValue","nodeType","ProcessingInstruction","NodeWithChildren","firstChild","lastChild","childNodes","Document","Element","attribs","tagName","attributes","namespace","node","isTagRaw","isCDATA","isText","isComment","isDirective","isDocument","hasChildren","hasOwn","cloneChildren","clone","child","instruction","sourceCodeLocation","childs","defaultOptions","withStartIndices","withEndIndices","xmlMode","DomHandler","dom","root","callback","elementCB","done","tagStack","lastNode","parser","undefined","onparserinit","onreset","onend","handleCallback","onerror","error","onclosetag","pop","onopentag","addNode","ontext","oncomment","oncommentend","oncdatastart","oncdataend","onprocessinginstruction","decodeMap","Map","decodeBase64","input","binary","atob","evenLength","out","Uint16Array","outIndex","lo","charCodeAt","hi","htmlDecodeTree","xmlDecodeTree","BinTrieFlags","CharCodes","isNumber","code","ZERO","NINE","isHexadecimalCharacter","UPPER_A","UPPER_F","LOWER_A","LOWER_F","isEntityInAttributeInvalidEnd","EQUALS","UPPER_Z","LOWER_Z","isAsciiAlphaNumeric","EntityDecoderState","DecodingMode","State","QuoteType","EntityDecoder","decodeTree","emitCodePoint","errors","EntityStart","consumed","treeIndex","excess","decodeMode","Strict","runConsumed","startEntity","write","offset","NUM","NumericStart","stateNumericStart","NamedEntity","stateNamedEntity","NumericDecimal","stateNumericDecimal","NumericHex","stateNumericHex","LOWER_X","char","emitNumericEntity","digit","lastCp","expectedLength","absenceOfDigitsInNumericCharacterReference","SEMI","codePoint","get","missingSemicolonAfterCharacterReference","validateNumericCharacterReference","valueLength","VALUE_LENGTH","FLAG13","runLength","BRANCH_LENGTH","firstChar","JUMP_TABLE","emitNotTerminatedNamedEntity","charIndexInPacked","packedWord","expectedChar","emitNamedEntityData","determineBranch","Math","max","Attribute","end","nodeIndex","branchCount","jumpOffset","packedKeySlots","mid","midKey","isWhitespace","c","Space","NewLine","Tab","FormFeed","CarriageReturn","isEndOfTagSection","Slash","Gt","Sequences","Empty","Uint8Array","Cdata","CdataEnd","CommentEnd","IframeEnd","NoembedEnd","NoframesEnd","Plaintext","ScriptEnd","StyleEnd","TitleEnd","TextareaEnd","XmpEnd","specialStartSequences","Tokenizer","cbs","buffer","sectionStart","entityStart","baseState","isSpecial","running","decodeEntities","recognizeSelfClosing","entityDecoder","cp","reset","currentSequence","sequenceIndex","chunk","parse","finish","pause","resume","stateText","Lt","fastForwardTo","BeforeTagName","Amp","enterTagBody","InPlainText","InSpecialTag","stateSpecialStartSequence","lower","InTagName","stateInTagName","stateCDATASequence","InCommentLike","InDeclaration","stateInDeclaration","InSpecialComment","stateInSpecialComment","emitComment","stateInCommentLike","Number","Dash","oncdata","isTagStartChar","LowerA","LowerZ","UpperA","UpperZ","isASCIIAlpha","stateInSpecialTag","endOfText","actualIndex","stateInClosingTagName","stateBeforeTagName","ExclamationMark","BeforeDeclaration","Questionmark","InProcessingInstruction","special","isInForeignContext","SpecialStartSequence","BeforeClosingTagName","onopentagname","BeforeAttributeName","stateBeforeAttributeName","stateBeforeClosingTagName","InClosingTagName","AfterClosingTagName","stateAfterClosingTagName","onopentagend","InSelfClosingTag","InAttributeName","stateInSelfClosingTag","onselfclosingtag","stateInAttributeName","Eq","onattribname","AfterAttributeName","stateAfterAttributeName","BeforeAttributeValue","onattribend","NoValue","stateBeforeAttributeValue","DoubleQuote","InAttributeValueDq","SingleQuote","InAttributeValueSq","InAttributeValueNq","stateInAttributeValueNoQuotes","handleInAttributeValue","quote","onattribdata","Double","Single","stateInAttributeValueDoubleQuotes","stateInAttributeValueSingleQuotes","Unquoted","stateBeforeDeclaration","OpeningSquareBracket","CDATASequence","BeforeComment","DeclarationSequence","stateDeclarationSequence","ondeclaration","stateInProcessingInstruction","stateBeforeComment","InEntity","Legacy","stateInEntity","indexInBuffer","cleanup","shouldContinue","handleTrailingData","handleTrailingCommentLikeData","cdataStart","min","handleTrailingMarkupDeclaration","onattribentity","ontextentity","fromCodePoint","String","formTags","Set","pTag","headingTags","tableSectionTags","ddtTags","rtpTags","openImpliesClose","DOCUMENT_TYPE","voidElements","foreignContextElements","htmlIntegrationElements","svgTagNameAdjustments","ForeignContext","reNameEnd","Parser","openTagStart","tagname","attribname","attribvalue","stack","foreignContext","lowerCaseTagNames","lowerCaseAttributeNames","htmlMode","tokenizer","buffers","bufferOffset","writeIndex","ended","lowerCaseTags","None","start","getSlice","isVoidElement","has","readTagName","Svg","adjusted","emitOpenTag","impliesClose","popElement","unshift","MathML","endOpenTag","isImplied","pos","indexOf","closeCurrentTag","implied","shift","isOpenImplied","onattribute","getInstructionName","search","substr","slice","recognizeCDATA","parseComplete","shiftBuffer","recurse","limit","POSITIVE_INFINITY","find","nodes","nodeStack","indexStack","findOne","searchedNodes","found","Checks","tag_name","tag_type","tag_contains","getAttribCheck","attrib","combineFuncs","a","b","compileTest","funcs","reduce","getElementsByTagName","xmlCodeMap","getCodePoint","prototype","codePointAt","encodeXML","last","substring","getEscaper","regex","lastIndex","exec","escapeAttribute","escapeText","elementNames","split","attributeNames","unencodedElements","foreignElements","foreignModeIntegrationPoints","renderChildren","output","renderNode","ElementType.Root","ElementType.Directive","ElementType.Comment","ElementType.CDATA","ElementType.Script","ElementType.Style","ElementType.Tag","isVoid","tag","encode","encodeEntities","replaceQuotes","isForeign","showEmpty","emptyAttrs","k","formatAttributes","selfClosingTags","renderTag","ElementType.Text","replaceAll","getOuterHTML","renderHTML","getFeed","feedRoot","getOneElement","isValidFeed","feed","entry","getMediaElements","addConditionally","link","description","fetch","pubDate","Date","updated","getAtomFeed","getRssFeed","MEDIA_KEYS_STRING","MEDIA_KEYS_INT","where","medium","isDefault","parseInt","expression","trim","object","property","DocumentPosition","compareDocumentPosition","nodeA","nodeB","aParents","bParents","maxIndex","DISCONNECTED","sharedParent","siblings","aSibling","bSibling","FOLLOWING","CONTAINED_BY","PRECEDING","CONTAINS","removeElement","childsIndex","lastIndexOf","splice","getChildren","getParent","currentNext","sibling","existsOne","some","getText","innerText","ancestor","replacement","elementIndex","array","sort","relative","parseDocument","handler","parseFeedDefaultOptions","elementCallback","require_utilities","utilities","unsetRootParent","nodesLength","domhandler","require$$1","htmlparser2","require$$2","htmlToDom","default","html","TypeError","possibleStandardNamesOptimized","SAME","CAMELCASE","possibleStandardNames","accept","acceptCharset","accessKey","action","autoCapitalize","autoComplete","autoCorrect","autoFocus","autoSave","capture","cellPadding","cellSpacing","challenge","charSet","checked","cite","class","classID","cols","contentEditable","contextMenu","controlsList","coords","crossOrigin","dateTime","defaultChecked","defaultValue","defer","dir","disablePictureInPicture","disableRemotePlayback","draggable","encType","enterKeyHint","for","form","formMethod","formAction","formEncType","formNoValidate","formTarget","frameBorder","headers","hidden","high","hrefLang","htmlFor","httpEquiv","innerHTML","inputMode","integrity","is","itemID","itemProp","itemRef","itemScope","itemType","keyParams","keyType","kind","lang","list","low","manifest","marginWidth","marginHeight","maxLength","mediaGroup","method","minLength","multiple","noModule","nonce","noValidate","open","optimum","pattern","placeholder","poster","preload","profile","radioGroup","readOnly","referrerPolicy","required","reversed","rows","sandbox","scope","scoped","scrolling","seamless","selected","shape","span","spellCheck","srcDoc","srcLang","step","summary","tabIndex","useMap","wmode","wrap","about","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","datatype","decelerate","descent","diffuseConstant","direction","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","exponent","externalResourcesRequired","fillOpacity","fillRule","filterRes","filterUnits","floodOpacity","floodColor","focusable","fontSizeAdjust","fontStretch","fontVariant","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","ideographic","imageRendering","in2","in","inlist","intercept","k1","k2","k3","k4","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","opacity","operator","order","orient","orientation","origin","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","points","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","resource","restart","results","rotate","rx","ry","scale","security","seed","shapeRendering","slope","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","suppressContentEditableWarning","suppressHydrationWarning","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textLength","textRendering","to","transform","typeof","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","unselectable","vAlphabetic","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewBox","viewTarget","vMathematical","vocab","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","__importDefault","mod","__esModule","defineProperty","cjs","iterator","styleObject","declarations","inline_style_parser_1","hasIterator","declaration","COMMENT_REGEX","NEWLINE_REGEX","WHITESPACE_REGEX","PROPERTY_REGEX","COLON_REGEX","VALUE_REGEX","SEMICOLON_REGEX","TRIM_REGEX","EMPTY_STRING","lineno","column","updatePosition","lines","i","position","line","Position","whitespace","source","msg","err","reason","filename","silent","re","m","comments","rules","comment","charAt","val","ret","decl","decls","require$$0","__create","create","__defProp","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","hasOwnProperty","style_to_object","except","desc","n","call","bind","enumerable","__copyProps","CUSTOM_PROPERTY_REGEX","HYPHEN_REGEX","NO_HYPHEN_REGEX","VENDOR_PREFIX_REGEX","MS_VENDOR_PREFIX_REGEX","capitalize","character","toUpperCase","trimHyphen","camelCase","skipCamelCase","reactCompat","dist","exports","returnFirstArg","canTextBeChildOfNode","ELEMENTS_WITH_NO_TEXT_CHILDREN","PRESERVE_CUSTOM_ATTRIBUTES","isCustomComponent","RESERVED_SVG_MATHML_ELEMENTS","setStyleProp","style_to_js_1","styleOptions","react_1","arg","attributesToProps_1","nodeName","isInputValueOnly","valueOnlyInputs","attributeValue","react_property_1","isCustomAttribute","attributeNameLowerCased","propName","getPropName","propertyInfo","getPropertyInfo","UNCONTROLLED_COMPONENT_ATTRIBUTES","UNCONTROLLED_COMPONENT_NAMES","BOOLEAN","OVERLOADED_BOOLEAN","utilities_1","PropertyInfoRecord","mustUseProperty","attributeNamespace","sanitizeURL","removeEmptyString","acceptsBooleans","propertyName","properties","CAMELIZE","token","RegExp","accumulator","standardName","lib","BOOLEANISH_STRING","NUMERIC","POSITIVE_NUMERIC","RESERVED","STRING","submit","domToReact_1","domToReact","_a","_b","_c","_d","_e","reactElements","hasReplace","cloneElement","isValidElement","library","React","normalizeDOMNodes","replaceElement","skipAttributesToProps","attributes_to_props_1","domhandler_1","require$$3","setPrototypeOf","htmlToDOM","attributesToProps","htmlToDOMOptions","assign","domParserOptions","trustedTypePolicy","dom_to_react_1","html_dom_parser_1","defineProperties","Symbol","toStringTag","require_html_to_dom","HTMLReactParser","EnhancedRichText","replacers","parserOptions","domNode","replacer","WISTIA_PLAYER_SCRIPT","wistiaScriptLoaded","wistiaScriptLoading","wistiaLoadCallbacks","VideoPlayer","thumbnail","playIcon","playbackMode","mediaProps","isPlaying","setIsPlaying","Promise","resolve","querySelector","cb","onload","then","mediaScriptSrc","mediaScript","handlePlay","useCallback","renderPlayIcon","transparentPng","player","thumbnailEl","insertBefore","Paragraph","commonProps","defaultIcon","BulletList","itemIcon","Footnote","footnoteClasses","marker","Author","authorClasses","FilterPill","pillStyle","dismissible","onDismiss","faCircleXmark","AssetMeta","assetType","duration","date","durationText","metaParts","metaLine","Image","decoding","DefaultChevron","faChevronDown","Accordion","defaultOpenIndex","allowMultiple","chevronIcon","onToggle","baseId","useId","openItems","setOpenItems","handleToggle","itemId","isCurrentlyOpen","delete","clear","add","isOpen","headerId","panelId","AccordionItemPanel","contentRef","contentHeight","setContentHeight","scrollHeight","WISTIA_PLAYER_SCRIPT_ID","MediaBlock","accentBorder","overlay","sparkle","accentColor","sparkSrc","sparkScale","mirror","popover","sparkSmallSrc","videoHandleRef","videoContainerRef","isPopover","videoSrc","hasVideo","isVideoSource","isImage","loadWistiaPlayerScript","mediaId","moduleId","loadWistiaMediaModule","handleVideoReady","handle","videoEl","sparkPath","aspect","BANNER_CONFIG","hero","videoBackground","level2","level2Video","gated","level3","mapVerticalAlignment","alignment","top","center","bottom","renderColumnMedia","mediaBlockProps","TextInput","onChange","onBlur","validation","hideLabel","clearable","errorId","isRequired","showClear","e","faXmark","Dropdown","controlledOpen","displayValue","listboxId","containerRef","internalOpen","setInternalOpen","handleClickOutside","addEventListener","removeEventListener","handleKeyDown","faChevronUp","Checkbox","faSquareCheck","faSquare","DropdownSelect","controlledValue","internalValue","setInternalValue","selectedValues","handleToggleOption","optionValue","v","handleDropdownClose","option","EMAIL_RE","validateField","field","dropdownValidation","custom","errorMessage","selections","minSelections","maxSelections","email","Form","headingLevel","headingVariant","fields","submitLabel","submitColSpan","disclaimer","onSubmit","onValidate","formRef","setValues","fromEntries","f","dropdownValues","setDropdownValues","setErrors","touched","setTouched","handleChange","handleDropdownChange","handleBlur","handleSubmit","fieldErrors","hasErrors","requestSubmit","VARIANT_CONFIG","useDivider","isDark","light","white","Subscribe","config","resolvedDarkMode","formContent","verticalAlignMap","TwoColumn","left","right","variation","_children","rest","resolvedRows","row","rowVariation","rowAlign","isReversed","Card","image","titleAs","metadata","textAlign","buttonVariant","resolvedTitleAs","cardClasses","IconListItem","iconPrefix","OverflowMediaSection","mediaPosition","stackAt","shouldMirror","mediaColumn","contentColumn","PostItem","imageAlt","isFeatured","rootClasses","resolvedRel","variantConfig","grey","greyAngled","socialIconRegistry","HeaderNavGroup","group","classPrefix","links","linkIndex","HeaderOverlay","navItem","showSearch","searchOpen","searchClosing","searchFormRef","onToggleSearch","searchFields","searchSubmitLabel","onSearch","onMouseEnter","onMouseLeave","faMagnifyingGlass","groups","groupIndex","sideContent","featuredImage","HeaderMobileNav","navItems","expandedItems","expandedGroups","onToggleItem","onToggleGroup","isExpanded","groupKey","isGroupExpanded","DEFAULT_SEARCH_FIELDS","SideBar","imageSrc","socialLinks","assets","sticky","stickyTop","social","platform","asset","linkRest","category","showTitle","socialIconMap","instagram","faInstagram","QuoteMarkSvg","SliderCard","company","initials","w","StandaloneCard","DataDial","unit","progressColor","trackColor","valueColor","ringWidth","disableAnimation","clamped","circumference","PI","innerRadius","prefersReducedMotion","matchMedia","matches","skipAnimation","animatedValue","setAnimatedValue","hasAnimated","rafRef","el","observer","IntersectionObserver","isIntersecting","performance","now","tick","elapsed","progress","eased","pow","requestAnimationFrame","runAnimation","threshold","observe","disconnect","cancelAnimationFrame","round","StatPill","stat","faArrowDown","faArrowUp","PercentDialCard","testimonialBg","Pagination","totalPages","currentPage","onPrev","onNext","onPageSelect","faChevronLeft","_","faChevronRight","parseGapPx","gapStr","parseFloat","advisorsPlusColorSystem","primaryDisabled","danger","dangerHover","dangerActive","textOnBrand","textNav","textSubheading","textLinkActive","textLinkVisited","linkFocusRing","linkFocusText","sectionBg","surfaceSubtle","borderDivider","borderWhite","successMain","successMainHover","successMainActive","successText","successTextOnTint","warningMain","warningMainHover","warningMainActive","warningText","infoMain","infoMainHover","infoMainActive","infoText","breadcrumbDefault","breadcrumbHover","breadcrumbActive","breadcrumbFocusRing","breadcrumbCurrent","dialCardGradientStart","dialCardGradientEnd","dialCardOverlay","dialCardStroke","dialRingTrack","dialRingProgress","advisorsPlusTheme","iconsData","subTitle","buttonText","bodyLrg","bodyLrgBold","iconDataPct","iconDataNumber","focusOutlinePrimary","focusOutlinePrimaryGhost","focusOutlineSecondary","focusOutlineSecondaryGhost","focusOutlineDanger","focusOutlineDangerGhost","focusOutlineSuccess","focusOutlineSuccessGhost","focusOutlineWarning","focusOutlineWarningGhost","focusOutlineInfo","focusOutlineInfoGhost","transition","faWidth","bgDisabled","borderDisabled","primaryGhost","secondaryGhost","dangerGhost","success","successGhost","warning","warningGhost","info","infoGhost","textDecorationHover","external","footer","borderTop","paddingVertical","paddingHorizontal","socialGap","socialIconSize","socialIconFontSize","socialIconBorder","socialIconBorderRadius","socialIconPadding","linkFontSize","linkFontWeight","linkLineHeight","linkHoverOpacity","copyrightFontSize","copyrightFontWeight","copyrightLineHeight","breadcrumb","linkColor","linkHoverColor","linkActiveColor","linkActiveFontWeight","textDecorationActive","focusColor","lastItemColor","lastItemFontWeight","separatorColor","iconsDataFontSize","iconsDataFontWeight","iconsDataLineHeight","iconsDataFontFamily","iconDataNumberFontSize","iconDataNumberFontWeight","iconDataNumberLineHeight","iconDataNumberLetterSpacing","iconDataNumberFontFamily","iconDataPctFontSize","iconDataPctFontWeight","iconDataPctLineHeight","iconDataPctLetterSpacing","iconDataPctFontFamily","subTitleFontSize","subTitleFontWeight","subTitleLineHeight","subTitleFontFamily","pageTitleFontFamily","buttonTextFontSize","buttonTextFontWeight","buttonTextLineHeight","buttonTextFontFamily","textLinkFontSize","textLinkFontWeight","textLinkLineHeight","textLinkTextDecoration","textLinkFontFamily","bodyLrgFontSize","bodyLrgFontWeight","bodyLrgLineHeight","bodyLrgFontFamily","bodyLrgBoldFontSize","bodyLrgBoldFontWeight","bodyLrgBoldLineHeight","bodyLrgBoldFontFamily","bodyFontFamily","advisorsTeamCard","overlayBlur","overlayHeight","overlayPadding","nameColor","companyColor","textGap","hoverTranslateY","shadowHover","focusRingColor","focusRingWidth","testimonialCard","standaloneBg","standaloneBackgroundImage","standaloneMaxHeight","standaloneCardBg","standaloneCardBorder","standaloneCardBorderRadius","standaloneCardBackdropFilter","standaloneTextColor","standaloneQuoteMarkColor","standaloneImageBorderRadius","standaloneImageBorder","quoteFont","quoteFontSize","quoteLineHeight","quoteFontWeight","attributionFontSize","attributionLineHeight","attributionFontWeight","sliderBg","sliderBorder","sliderBorderRadius","sliderPadding","sliderGap","sliderWidth","sliderHeight","sliderSeparatorColor","sliderQuoteMarkColor","sliderQuoteTextColor","sliderQuoteFontSize","sliderQuoteLineHeight","sliderAvatarBg","sliderAvatarSize","sliderAvatarBorderRadius","sliderAvatarTextColor","sliderAvatarFontSize","sliderAuthorNameColor","sliderAuthorNameSize","sliderAuthorRoleColor","sliderAuthorRoleSize","percentDialCard","percentDialCards","subheading","headingFontSize","headingFontWeight","headingLineHeight","pagination","dotColor","arrowColor","arrowDisabledColor","carousel","transitionDuration","transitionEasing","faderColor","primaxColorSystem","textBreadcrumbSeparator","textBreadcrumbLast","textBreadcrumbHover","textBreadcrumbActive","textBreadcrumb","containerStrokeColor","bodyTextColor","darkBackgroundColor","interactivePrimaryHoverForeground","primaxFooterLogo","primaxTheme","sectionDivider","componentTitle","playButton","shadowOpacity","shadowOpacityHover","shadowOpacityActive","fontWeightHover","textColor","halfColumn","primaxCta","headingMaxWidth","formWidth","banner","contentGapY","mediaBlockImagePadding","mediaBlockImageOffset","divider","sparkPatternUrl","mediaBlock","borderRadiusMirror","videoBorderRadius","videoBorderRadiusMirror","videoAccentColor","accentThickness","accentGap","accentSideRow","accentSideSpan","accentBottomCol","accentBottomSpan","playIconWidth","playIconHeight","playIconPaddingLeft","playIconImageWidth","playIconImageHeight","sparkRow","sparkRowSpan","sparkCol","sparkColSpan","sparkWidth","sparkHeight","sparkRotate","sparkColMirror","sparkTranslateMirrorX","croppedSparkWidth","croppedSparkHeight","croppedSparkMaskRotate","croppedSparkMaskOffsetY","croppedSparkMaskOffsetX","croppedSparkSvgScale","croppedSparkStrokeColor","croppedSparkStrokeWidth","croppedSparkIconLgWidth","croppedSparkIconLgTop","croppedSparkIconLgRight","croppedSparkIconSmWidth","croppedSparkIconSmTop","croppedSparkIconSmLeft","croppedSparkSmallSparksWidth","croppedSparkSmallSparksTop","croppedSparkSmallSparksRight","videoHeight","maxHeight","hoverOutAnimation","bgFocus","textFocus","textActive","sectionDividerFontSize","sectionDividerFontWeight","sectionDividerLineHeight","sectionDividerColor","subtitleColor","componentTitleFontSize","componentTitleFontWeight","componentTitleLineHeight","componentTitleColor","bodyColor","bodyBoldColor","bodySmallColor","labelColor","twoColumn","leftColSparkIconSmallLeft","leftColSparkIconLargeRight","rightColSparkIconSmallLeft","rightColSparkIconLargeRight","videoSection","contentGap","primaxCard","focusBorder","shadowFocus","shadowActive","iconPadding","iconContentGap","iconSize","iconActionLinkPadding","imageHeight","imageContentPadding","imageContentGap","imageActionLinkPadding","profileImageAspect","profileContentPadding","profileContentGap","profileDescriptionMaxWidth","profileActionLinkPadding","bulletList","itemGap","itemAlign","iconColor","iconContent","iconFontFamily","iconFontWeight","bodyMaxWidth","borderRadiusMobile","contentPaddingMobile","dragIndicatorBg","dragHandleBorderRadius","dragHandleBorderBottom","dragHandleMarginBottom","checkbox","borderColorHover","checkedColor","checkedColorHover","dropdown","labelFontFamily","labelFontSize","labelLineHeight","labelGap","placeholderColor","borderColorFocus","chevronSize","chevronColor","panelBg","panelBorderColor","panelMaxHeight","panelPadding","errorFontSize","errorFontWeight","errorColor","errorTextAlign","dropdownSelect","optionPadding","optionBgHover","textInput","formGap","fieldsRowGap","disclaimerFontFamily","disclaimerFontSize","disclaimerFontWeight","disclaimerLineHeight","disclaimerLinkColor","inputBg","fieldsGap","disclaimerColor","primaxHeader","navHeight","logoWidth","navFontSize","navFontWeight","navLineHeight","navLinkPadding","navItemBgActive","navLinkColor","navLinkColorActive","navLinkColorHover","navLinkTextDecorationHover","navLinkTextDecorationActive","ctaPaddingLeft","overlayGap","overlayMaxWidth","overlaySideWidth","groupGap","groupHeadingFontSize","groupHeadingColor","groupHeadingColorHover","groupHeadingColorActive","groupHeadingColorFocus","groupHeadingOutlineWidth","groupHeadingOutlineOffset","groupLinkGap","groupLinkFontSize","groupLinkColor","groupLinkColorHover","groupLinkColorActive","groupLinkColorFocus","groupLinkOutlineWidth","groupLinkOutlineOffset","mobileBg","mobileBorder","mobileItemPadding","mobileItemFontSize","mobileGroupBorder","mobileGroupPadding","mobileGroupFontSize","mobileSearchPadding","mobileSublinkBg","mobileSublinkFontSize","mobileSublinkPadding","hamburgerColor","featuredImageMaxWidth","featuredImageBorderRadius","mobileItemColor","mobileItemBackground","mobileSublinkBgAlt","mobileSublinkColorHover","overlaySearchHeight","overlaySearchPadding","alertBanner","borderStyle","borderTopWidth","borderBottomWidth","dismissColor","dismissColorHover","dismissColorActive","dismissSize","dismissPadding","textWrapMaxWidth","iconListItem","iconBlockWidth","iconBlockHeight","iconBlockBg","linkPaddingTop","iconBulletList","dividerContentPadding","itemsRowGap","itemsColGap","iconBulletSection","dividerPadding","mediaWidth","listGap","accordion","itemPadding","headerBgHover","animationDuration","accordionSection","mediaRadius","postFeed","sectionGap","postGap","featuredContentGap","featuredImageAspect","regularGap","bodyGap","thumbnailWidth","thumbnailAspect","titleColorHover","titleColorActive","assetTypeColor","metaColor","metaFontSize","metaLineHeight","dividerColor","dividerHeight","loadMoreGap","navMaxWidth","navGap","linkGap","headingColor","linkColorHover","linkColorActive","legalFontSize","legalFontWeight","legalColor","legalColorDark","focusOutlineWidth","focusOutlineColor","legalLinkColor","overflowMediaSection","mediaBlockBorderRadiusLeft","mediaBlockBorderRadiusRight","filterSection","assetMeta","typeColor","detailsColor","sidebar","innerGap","sectionTitleColor","assetTitleColor","socialsGap","socialIconsGap","socialIconColor","socialIconColorHover","assetGap","ctaPadding","ctaBg","ctaGap","ctaTitleColor","individualPost","videoPlayIconSize","useColorTokens","getCSSVar","varName","getComputedStyle","getPropertyValue","cssVar","linkColumns","copyrightText","logo","colIndex","interactiveProps","resolvedAlt","message","dismissAriaLabel","isVisible","setIsVisible","faCircleXmarkSolid","faCircleXmarkRegular","align","bannerType","hasBackgroundVideo","backgroundVideo","BannerClass","contentStyle","gridAlignItems","contentAlignSelf","contentVerticalAlign","mediaAlignSelf","mediaVerticalAlign","gridGap","alignSelf","breadcrumbs","formHeading","formHeadingLevel","formHeadingVariant","dividerProps","ctaClass","citation","quoteClasses","externalLink","ctaClasses","hoverEffect","handleLinkClick","wrapperStyle","cardStyle","imageWrapperStyle","bodyStyle","cardContent","visibleCards","showPeek","showFader","desktop","viewportRef","viewportWidth","setViewportWidth","useLayoutEffect","update","offsetWidth","ro","ResizeObserver","isMobile","visibleCount","resolvedPeek","cards","Children","toArray","setCurrentPage","clampedPage","trackStyle","peekPx","gapPx","effectiveGap","cssVisibleCount","carouselClass","p","dropdowns","activePills","searchPlaceholder","searchValue","searchButtonLabel","showResults","resultsColumns","initialCount","loadMoreCount","loadMoreLabel","onDropdownChange","onSearchChange","onSearchSubmit","onPillDismiss","onClearAll","setVisibleCount","visibleResults","hasMore","pill","FilterPillAtom","PrimaxCard","durationMinutes","timestamp","buttonLabel","linkGroups","legalText","logoSrc","socialIndex","bulletItems","bulletIcon","buildContent","contentProps","rt","h","hl","hv","bi","bIcon","btn","renderButton","buildMedia","rowVariant","rowMediaProps","resolvedMediaProps","wrapMedia","mediaNode","rowContent","resolveRowContent","topContent","user","onLogin","onLogout","onCreateAccount","darkModeProp","resolvedBg","getBackgroundColor","resolvedShape","titleElement","meta","primaryButton","firstBodyContent","secondBodyContent","footnotes","beforeContent","afterContent","renderBody","extraClass","bodyClassName","published","authorName","authorTitle","onClose","closeOnOverlayClick","closeOnEscape","forceBottomSheet","showCloseButton","dialogRef","previousFocusRef","dragY","setDragY","isDragging","setIsDragging","isClosing","setIsClosing","touchStartRef","handleClose","dismissSheet","timer","setTimeout","clearTimeout","dialog","activeElement","showModal","close","focus","handleCancel","handleTouchStart","touch","touches","clientY","time","handleTouchMove","deltaY","handleTouchEnd","VELOCITY_THRESHOLD","onTouchStart","onTouchMove","onTouchEnd","eyebrow","dials","patternUrl","bgPattern","sectionStyle","dial","posts","featuredPost","post","regularPosts","visibleRegularCount","visibleRegularPosts","tabletExtraCount","tabletExtraPosts","allVisiblePosts","layout","BaseAccordion","accordionColumn","activeDropdown","setActiveDropdown","timeoutRef","headerRef","setSearchOpen","setSearchClosing","mobileOpen","setMobileOpen","mobileExpandedItems","setMobileExpandedItems","mobileExpandedGroups","setMobileExpandedGroups","handleEscape","closeSearch","toggleSearch","handleNavEnter","handleNavLeave","handleDropdownEnter","handleDropdownLeave","toggleMobileItem","toggleMobileGroup","resolvedSearchFields","faBars","query","onLoadMore","onResultClick","resultCount","increment","bulletPoints","contentBlock","existingStyle","remove","videoPlayerProps","tokenName"],"mappings":"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GAuNrB,EACAA,EACA,MACA,GACA,KAKJ,CAAC,UAAW,SAASsV,QAAQtV,IAC3BghD,EAAWhhD,GAAQ,IAAIygD,EACrBzgD,EAtOY,GAwOZ,EACAA,EAAK0T,cACL,MACA,GACA,KAIJ,MAAMutC,EAAW,iBACX7C,EAAa8C,GAASA,EAAM,GAAG5C,cAOrC,CACE,gBACA,qBACA,cACA,iBACA,aACA,YACA,YACA,sBACA,8BACA,gBACA,kBACA,oBACA,oBACA,eACA,YACA,cACA,gBACA,cACA,YACA,mBACA,eACA,aACA,eACA,cACA,aACA,+BACA,6BACA,cACA,iBACA,kBACA,iBACA,iBACA,aACA,aACA,eACA,oBACA,qBACA,cACA,WACA,iBACA,mBACA,kBACA,aACA,eACA,yBACA,0BACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,cACA,kBACA,iBACA,qBACA,sBACA,eACA,gBACA,eACA,eACA,YACA,gBACA,iBACA,gBACA,aACA,gBACA,gBACA,eACA,eACA,cACA,YAKAhpC,QAAQ22B,IACR,MAAMjsC,EAAOisC,EAAct4B,QAAQstC,EAAU7C,GAC7C4C,EAAWhhD,GAAQ,IAAIygD,EACrBzgD,EA9VW,GAgWX,EACAisC,EACA,MACA,GACA,KAKJ,CACE,gBACA,gBACA,aACA,aACA,cACA,cAKA32B,QAAQ22B,IACR,MAAMjsC,EAAOisC,EAAct4B,QAAQstC,EAAU7C,GAC7C4C,EAAWhhD,GAAQ,IAAIygD,EACrBzgD,EAvXW,GAyXX,EACAisC,EACA,gCACA,GACA,KAKJ,CACE,WACA,WACA,aAKA32B,QAAQ22B,IACR,MAAMjsC,EAAOisC,EAAct4B,QAAQstC,EAAU7C,GAC7C4C,EAAWhhD,GAAQ,IAAIygD,EACrBzgD,EA7YW,GA+YX,EACAisC,EACA,wCACA,GACA,KAOJ,CAAC,WAAY,eAAe32B,QAAQ22B,IAClC+U,EAAW/U,GAAiB,IAAIwU,EAC9BxU,EA5ZW,GA8ZX,EACAA,EAAcv4B,cACd,MACA,GACA,KAOJstC,EAAoB,UAAI,IAAIP,EAC1B,YA1aa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","x_google_ignoreList":[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53]}
|