@wix/web5-core 1.63.32 → 1.63.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/dist/cjs/component/componentDefinitions/FeatureCardsSectionDefinition.js +13 -2
  2. package/dist/cjs/component/componentDefinitions/FeatureCardsSectionDefinition.js.map +1 -1
  3. package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js +6 -2
  4. package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js.map +1 -1
  5. package/dist/cjs/component/componentDefinitions/parse-utils.js +61 -18
  6. package/dist/cjs/component/componentDefinitions/parse-utils.js.map +1 -1
  7. package/dist/cjs/image/imageSlotTypes.js.map +1 -1
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/esm/component/componentDefinitions/FeatureCardsSectionDefinition.js +14 -3
  10. package/dist/esm/component/componentDefinitions/FeatureCardsSectionDefinition.js.map +1 -1
  11. package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js +8 -4
  12. package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js.map +1 -1
  13. package/dist/esm/component/componentDefinitions/parse-utils.js +60 -18
  14. package/dist/esm/component/componentDefinitions/parse-utils.js.map +1 -1
  15. package/dist/esm/image/imageSlotTypes.js.map +1 -1
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/types/component/componentDefinitions/FeatureCardsSectionDefinition.d.ts.map +1 -1
  18. package/dist/types/component/componentDefinitions/HeroSectionDefinition.d.ts.map +1 -1
  19. package/dist/types/component/componentDefinitions/parse-utils.d.ts +41 -17
  20. package/dist/types/component/componentDefinitions/parse-utils.d.ts.map +1 -1
  21. package/dist/types/image/imageSlotTypes.d.ts +19 -0
  22. package/dist/types/image/imageSlotTypes.d.ts.map +1 -1
  23. package/dist/types/index.d.ts +1 -1
  24. package/dist/types/index.d.ts.map +1 -1
  25. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"names":["_clients","require","exports","CLIENT_IDS","EXPERIMENT_IDS","_FeatureToggleContext","createFeatureToggleReader","FeatureToggleProvider","useFeatureToggles","useFeatureToggle","_parts","getPartsByType","getPartByRole","getAllByRole","getHeading","getImages","getLinks","extractContent","extractContentMarkdown","deriveRole","_sectionDefinition","DROP_SECTION","_diagnosticTypes","DIAGNOSTIC_TYPES","_imageSearchFilterTypes","buildImageSearchFilter","_imageSearchFilters","ImageSearchFilterToken","backgroundFilter","_componentDefinitions","HeroSectionDefinition","HeroEntitySectionDefinition","KpiSectionDefinition","MetricsSectionDefinition","FeatureCardsSectionDefinition","EntitySectionDefinition","EntityCollectionSectionDefinition","ComparisonSectionDefinition","TextBlockSectionDefinition","CtaBannerSectionDefinition","CalloutSectionDefinition","NextStepsSectionDefinition","FeatureSection9PlusDefinition","ListItemsSectionDefinition","SkipNodesSectionDefinition","HtmlCommentSectionDefinition","SearchSectionDefinition","ErrorSectionDefinition","FallbackSectionDefinition","createSdkRegistry","_registry","ComponentRegistry","_patternValidator","validatePattern","validatePatternSyntax","validatePatternWithBlocks","_markdownBlocks","convertToBlockElements","convertToBlockElementsWithMapping","_linkTypes","Web5UrlType","isWeb5AskUrl","isWeb5EntityUrl","isWeb5ImageUrl","isWeb5IconUrl","isWeb5ActionUrl","isWeb5SearchUrl","isWeb5Url","isNavigableUrl","isValidLinkUrl","isLegacyUrl","_entityLinkParser","parseWeb5Url","isValidWeb5Url","validateLinkUrl","isEntityLink","parseEntityLink","extractProtocol","extractLinkMetadata","_web5LinkValidator","findInvalidWeb5Links","_nodeMatchers","hasImage","isHtmlComment","_match","matchMarkdown","matchAllSections","nodesToParts","_ComponentDependenciesContext","ComponentDependenciesProvider","useComponentDependencies","_UserQueryContext","UserQueryProvider","useUserQuery","_ChipsContext","ChipsProvider","useChips","_entity","defaultExtractor","enrichEntitiesFromPayload","entityHref","normalizeEntityItem","toCatalogPath","entityPayloadFromItems","mergeEntityData","fetchEntityListData","listEntityItems","LIST_ITEMS_ENDPOINT","getEntityExtractor","registerEntityExtractor","transformToSolutionEntityData","transformToBlogPostEntityData","transformToGenericEntityData","toMatchedOptions","formatMoney","readCurrencyCode","formatPriceField","formatProductPriceLabel","isProductFamilyEntityType","isDocumentFamilyEntityType","PLATFORM_ENTITY_TYPES","resolveEntityTypeConfig","_callout","CALLOUT_KINDS","CALLOUT_SEMANTICS","_useWeb5Link","useWeb5Link","_useConversation","useConversation","_useDebugImageContext","useDebugImageContext","_useResolvedImageSources","useResolvedImageSources","_useImageSlot","useImageSlot","_ImageSlotContext","ImageSlotProvider","useImageSlotCollector","_composeSemantic","composeSemantic","_useResolveGenericEntityData","useResolveGenericEntityData","_useEntityTransforms","useEntityTransforms","_useMarkdownUtils","useMarkdownUtils","_useResolveShopifyEntityData","useResolveShopifyEntityData","_useResolveSearchSpringEntityData","useResolveSearchSpringEntityData","_searchspring","fetchProductsByHandles","fetchProductsByHandlesMap","transformSSProductToEntityItemData","_cart","addToCart","_shopify","ShopifyStorefrontClient","resolveShopifyConfig","resolveShopifyEntity","transformShopifyProduct","transformShopifyCollection","transformShopifyArticle","transformShopifyEntityToItemData","PRODUCT_BY_HANDLE_QUERY","COLLECTION_BY_HANDLE_QUERY","ARTICLE_BY_HANDLE_QUERY","_utils","cn","_imageUtils","normalizeImageUrl","getResizedImageUrl","_imageBackdrop","analyzeBackdrop","computeContentBBox","buildProbeUrl","loadImagePixels","loadBackdropAnalysis","_parseUtils","stripMarkdown","_colorUtils","rgbToHsl","hslToRgb","ensureMinLightness","toRgb","deriveDarkColor","deriveDarkGradient","deriveLightColor","_analyticsEvents","pushEvent","pushPromptSubmit","pushLinkClick","pushError","pushExit","pushEntityFiltered","hasAnalyticsConsent","_privacy","UNKNOWN_CONSENT","HOST_CONSENT_GLOBAL","transmit","mayTransmit","unlockOnUserAction","isUserEngaged","mayPersistIdentity","getConsentSnapshot","getGateView","subscribeToConsent","installConsentProvider","getInstalledProviderName","setConsentBufferLimit","getConsentGateStats","resetConsentGateForTests","detectConsentProvider","initConsentGate","CONSENT_OVERRIDE_KEY","CONSENT_OVERRIDE_QUERY_PARAM","getConsentOverride","setConsentOverride","createShopifyConsentProvider","isShopifyHost","createOneTrustConsentProvider","isOneTrustHost","createHostSuppliedConsentProvider","hasHostSuppliedConsent","publishHostConsent","_errors","ERROR_MARKDOWN","getErrorTypeFromStatus","createErrorMarkdown","STREAMING_TIMEOUT_MS","DEFAULT_ERROR_TEMPLATES","resolveErrorTemplate","_navigationStack","getForwardStack","setForwardStack","clearForwardStack","pushToForwardStack","popFromForwardStack","_UserQuery","UserQuery","_productBackHandoff","PRODUCT_BACK_SESSION_KEY","writeProductBackHandoff","readProductBackHandoff","_PromptEntryEmptyState","PromptEntryEmptyState","_SearchSection","SearchSection","_FeedbackBar","FeedbackBar","_Disclaimer","Disclaimer","_BottomContainer","BottomContainer","_MarkdownText","MarkdownText","_CalloutBlock","CalloutBlock","_OptimizedImage","OptimizedImage","_SectionSkeleton","SectionSkeleton","_SmartIcon","SmartIcon","_Loader","Loader","_PlacementLoader","PlacementLoader","_UnifiedLink","UnifiedLink","detectLinkType","LinkType","_table","Table","TableHeader","TableBody","TableFooter","TableHead","TableRow","TableCell","TableCaption","_userQueryEvent","WEB5_USER_QUERY_EVENT","_answerUpdatedEvent","WEB5_ANSWER_UPDATED_EVENT","_answerSettledEvent","WEB5_ANSWER_SETTLED_EVENT","_redirectEvent","WEB5_REDIRECT_EVENT","_loadClientBundle","loadClientBundle","_clientBundleOverride","getClientBundleOverride","isTrustedBundleHost","_clientBundleUrl","TEMPLATES_CDN_BASE","TEMPLATES_MANIFEST_URL","getTemplateOverride","isTemplatePickerRequested","isValidTemplateId","resolveClientBundleUrl","_mergeClientConfig","mergeClientConfig","_applyThemeOverrides","applyThemeOverrides","THEME_OVERRIDE_TOKENS","_tokenContract","THEME_TOKEN_CONTRACT","BRAND_TOKENS","EDITABLE_TOKENS","TOKEN_NAME_PATTERN","bucketOf","hostAliasFor","_themeDebug","isThemeDebugEnabled","THEME_DEBUG_KEY","THEME_DEBUG_QUERY_PARAM","_colorFormat","hexToHslTriplet","hslTripletToHex","isHslTriplet","_PlacementResponseRenderer","PlacementResponseRenderer","PlacementSmoothHeight","_buildPlacementDependencies","buildPlacementDependencies","_PlacementPayloadContext","PlacementPayloadProvider","usePlacementPayload","_unifiedMarkdownParser","UnifiedMarkdownParser","parseMarkdownToAst","parseAstToMarkdown","_markdownPreprocessor","escapeWeb5Links","fixMalformedLinks","trimTrailingWhitespace","normalizeIconUrls","decodeLinkText","preprocessMarkdown","_componentTracking","ComponentTracking","_contentKeywordMatcher","findKeywordsInContent","getContextualImageFilename","_intentExtractor","extractIntentFromMarkdown","getIntentFromMarkdown","_propsExtractor","createPageSection","generateSectionId","generateId","findImageInNode","findImageInChildren","_diagnosticsCollector","DiagnosticsCollector","_refreshPrompts","REFRESH_PROMPTS_UNTIL_KEY","REFRESH_PROMPTS_WINDOW_MS","getRefreshPromptsExpiry","shouldRefreshPrompts","enableRefreshPrompts","disableRefreshPrompts","_backendEnvironment","BACKEND_ENVIRONMENT_KEY","BACKEND_ENVIRONMENT_QUERY_PARAM","DEFAULT_BACKEND_ENVIRONMENT","getBackendEnvironment","setBackendEnvironment","usesStagingBackend","_simulation","isSimulationTraffic","_matchDebug","MATCH_DEBUG_KEY","MATCH_DEBUG_QUERY_PARAM","isMatchDebugEnabled","setMatchDebug","resetMatchDebugCache","logMatchDebug","_wixAuthFetch","createWixAuthFetch","_sessionManager","getOrCreateSessionId","getSessionId","getChatId","startNewChatId","setChatId","resetChatIdForTests","_componentParser","parseMarkdownToComponents","tryParseComponent","mergeSectionsWithStableReferences","_hostScope","WEB5_ROOT_ID","WEB5_ROOT_CLASS","WEB5_SCOPES","WEB5_SCOPE","WEB5_GLOBAL_TOKENS"],"sources":["../../src/index.ts"],"sourcesContent":["// Client IDs and experiment IDs\nexport { CLIENT_IDS, EXPERIMENT_IDS } from './clients';\n\nexport {\n type EmbedFeatureToggleResult,\n type FeatureToggleReader,\n createFeatureToggleReader,\n FeatureToggleProvider,\n useFeatureToggles,\n useFeatureToggle,\n} from './featureToggles/FeatureToggleContext';\n\n// Dev-only chrome injection contract for client packages\nexport type { DevEnvironment } from './client/devEnvironment';\n\n// Part types and helpers\nexport {\n type PartType,\n type Part,\n type HeadingPart,\n type ImagePart,\n type LinkPart,\n type ListPart,\n type ListItemPart,\n type KpiItemPart,\n type CardPart,\n type IconPart,\n type CalloutPart,\n type EntityPart,\n getPartsByType,\n getPartByRole,\n getAllByRole,\n getHeading,\n getImages,\n getLinks,\n extractContent,\n extractContentMarkdown,\n deriveRole,\n} from './parts/parts';\n\n// Component types\nexport type {\n BaseCompProps,\n SlotCompProps,\n SectionCompProps,\n SectionCompPropsWithSlot,\n TextCompProps,\n ButtonCompProps,\n ImageCompProps,\n BadgeCompProps,\n HeroButton,\n KpiItemCompProps,\n FeatureItemCompProps,\n FeatureCardCompProps,\n EntityItemData,\n EntityItem,\n GenericEntityData,\n GenericEntityCompProps,\n ComparisonRow,\n ComparisonColumn,\n AiNarrativeCompProps,\n HeroCompProps,\n HeroEntityCompProps,\n KpiCompProps,\n MetricsCompProps,\n MetricsItemCompProps,\n FeatureCardsCompProps,\n EntityCompProps,\n ComparisonCompProps,\n TextBlockCompProps,\n Component,\n BaseComponent,\n SlotComponent,\n SectionComponent,\n TextComponent,\n ButtonComponent,\n ImageComponent,\n BadgeComponent,\n KpiItemComponent,\n MetricsItemComponent,\n FeatureItemComponent,\n FeatureCardComponent,\n GenericEntityComponent,\n AiNarrativeComponent,\n ComparisonSectionComponent,\n TextBlockSectionComponent,\n HeroSectionComponent,\n HeroEntitySectionComponent,\n KpiSectionComponent,\n MetricsSectionComponent,\n FeatureCardsSectionComponent,\n EntitySectionComponent,\n PropsOf,\n SectionFixture,\n CtaBannerCompProps,\n CtaBannerSectionComponent,\n CalloutCompProps,\n CalloutSectionComponent,\n NextStepsCompProps,\n NextStepsSectionComponent,\n FeatureSection9PlusCompProps,\n FeatureSection9PlusSectionComponent,\n ListItemsSectionCompProps,\n ListItemsSectionComponent,\n ErrorCompProps,\n ErrorSectionComponent,\n NullCompProps,\n NullSectionComponent,\n SolutionEntityCompProps,\n SolutionEntitySectionComponent,\n SolutionEntityData,\n BlogEntityCompProps,\n BlogEntitySectionComponent,\n BlogEntityData,\n GeneralTextCompProps,\n GeneralTextSectionComponent,\n PersonalizedNarrativeCompProps,\n PersonalizedNarrativeSectionComponent,\n} from './component/types';\n\n// Section definition\nexport type {\n SectionDefinition,\n ParseContext,\n ContextualImageResult,\n DropSection,\n} from './component/section-definition';\nexport { DROP_SECTION } from './component/section-definition';\n\n// Diagnostic types\nexport { DIAGNOSTIC_TYPES } from './component/diagnosticTypes';\nexport type { DiagnosticType } from './component/diagnosticTypes';\n\n// Image search filters\nexport {\n buildImageSearchFilter,\n type ImageSearchFilterString,\n} from './image/imageSearchFilterTypes';\nexport {\n ImageSearchFilterToken,\n backgroundFilter,\n} from './image/imageSearchFilters';\nexport type {\n ContextualImageAsset,\n ImageSourceInput,\n ResolvedImageSource,\n ResolvedImageSourceKind,\n} from './image/contextualImageTypes';\n\n// Section definition classes + createSdkRegistry\nexport {\n HeroSectionDefinition,\n HeroEntitySectionDefinition,\n KpiSectionDefinition,\n MetricsSectionDefinition,\n FeatureCardsSectionDefinition,\n EntitySectionDefinition,\n EntityCollectionSectionDefinition,\n ComparisonSectionDefinition,\n TextBlockSectionDefinition,\n CtaBannerSectionDefinition,\n CalloutSectionDefinition,\n NextStepsSectionDefinition,\n FeatureSection9PlusDefinition,\n ListItemsSectionDefinition,\n SkipNodesSectionDefinition,\n HtmlCommentSectionDefinition,\n SearchSectionDefinition,\n ErrorSectionDefinition,\n FallbackSectionDefinition,\n createSdkRegistry,\n} from './component/componentDefinitions';\n\n// Registry\nexport { ComponentRegistry } from './registry';\nexport type {\n SlotOptions,\n SectionOptions,\n SectionRegistration,\n SlotNode,\n SlotIntentNode,\n SectionIntentNode,\n SectionNode,\n SlotVariant,\n SectionVariant,\n RegistryCatalog,\n ActionResult,\n ActionHandler,\n} from './registry';\n\n// Pattern validator\nexport {\n validatePattern,\n validatePatternSyntax,\n validatePatternWithBlocks,\n type PatternValidationResult,\n type BlockElement,\n type EnrichedBlockElement,\n type LinkMetadata,\n type LinkAttribute,\n} from './patternValidator';\n\n// Markdown blocks\nexport {\n convertToBlockElements,\n convertToBlockElementsWithMapping,\n type BlockElementsWithMapping,\n} from './markdownBlocks';\n\n// Link types, enum & guards\nexport {\n Web5UrlType,\n type Web5AskUrl,\n type Web5EntityUrl,\n type Web5ImageUrl,\n type Web5IconUrl,\n type Web5ActionUrl,\n type Web5SearchUrl,\n type Web5Url,\n type HttpsUrl,\n type HttpUrl,\n type MailtoUrl,\n type RelativeUrl,\n type NavigableUrl,\n type ValidLinkUrl,\n type AnyKnownUrl,\n type LegacyUrl,\n isWeb5AskUrl,\n isWeb5EntityUrl,\n isWeb5ImageUrl,\n isWeb5IconUrl,\n isWeb5ActionUrl,\n isWeb5SearchUrl,\n isWeb5Url,\n isNavigableUrl,\n isValidLinkUrl,\n isLegacyUrl,\n} from './types/link-types';\n\n// Entity/URL parsing\nexport {\n parseWeb5Url,\n isValidWeb5Url,\n validateLinkUrl,\n type Web5UrlParsed,\n type Web5AskParsed,\n type Web5EntityParsed,\n type Web5ImageParsed,\n type Web5IconParsed,\n type Web5ActionParsed,\n type Web5SearchParsed,\n isEntityLink,\n parseEntityLink,\n extractProtocol,\n extractLinkMetadata,\n} from './utils/entityLinkParser';\n\n// Web5 link validation\nexport {\n findInvalidWeb5Links,\n type InvalidWeb5Link,\n} from './utils/web5LinkValidator';\n\n// Node matchers\nexport { hasImage, isHtmlComment } from './utils/nodeMatchers';\n\n// Match API\nexport {\n matchMarkdown,\n type MarkdownMatchResult,\n matchAllSections,\n type MatchAllSectionsResult,\n nodesToParts,\n} from './match';\n\n// ---------------------------------------------------------------------------\n// DI Infrastructure (moved from @wix/w5-client-circana)\n// ---------------------------------------------------------------------------\n\n// DI context and provider\nexport {\n ComponentDependenciesProvider,\n useComponentDependencies,\n type ComponentDependenciesProviderProps,\n} from './context/ComponentDependenciesContext';\n\n// Raw user query for the current response page\nexport {\n UserQueryProvider,\n useUserQuery,\n type UserQueryProviderProps,\n} from './context/UserQueryContext';\n\n// Chips context (suggestion chips shared between SearchSection and error states)\nexport {\n ChipsProvider,\n useChips,\n type SuggestionChip,\n} from './context/ChipsContext';\n\n// DI types\nexport type {\n ComponentDependencies,\n Web5LinkApi,\n ConversationApi,\n SendMessageTrackingOptions,\n SendMessageOptions,\n ComparisonSubmitPayload,\n ComparisonSelectedProduct,\n ProductComparisonSelectionState,\n ProductComparisonApi,\n EntityTransforms,\n MarkdownUtils,\n ResolveGenericEntityDataOptions,\n} from './types/dependencies';\nexport type {\n ApiPayloadItem,\n EntityTypeConfig,\n EntityConfig,\n EntityExtractionContext,\n} from './types/entity';\nexport {\n defaultExtractor,\n enrichEntitiesFromPayload,\n entityHref,\n normalizeEntityItem,\n toCatalogPath,\n entityPayloadFromItems,\n mergeEntityData,\n fetchEntityListData,\n listEntityItems,\n LIST_ITEMS_ENDPOINT,\n getEntityExtractor,\n registerEntityExtractor,\n transformToSolutionEntityData,\n transformToBlogPostEntityData,\n transformToGenericEntityData,\n toMatchedOptions,\n formatMoney,\n readCurrencyCode,\n formatPriceField,\n formatProductPriceLabel,\n isProductFamilyEntityType,\n isDocumentFamilyEntityType,\n PLATFORM_ENTITY_TYPES,\n resolveEntityTypeConfig,\n} from './entity';\nexport type {\n EntityExtractor,\n FetchEntityListDataOptions,\n ListEntityItemsOptions,\n MatchedOption,\n ProductPriceFields,\n} from './entity';\nexport {\n CALLOUT_KINDS,\n CALLOUT_SEMANTICS,\n type CalloutKind,\n type CalloutSemantic,\n type Callout,\n} from './types/callout';\n\n// Wrapper hooks\nexport { useWeb5Link } from './hooks/useWeb5Link';\nexport { useConversation } from './hooks/useConversation';\nexport { useDebugImageContext } from './hooks/useDebugImageContext';\nexport { useResolvedImageSources } from './hooks/useResolvedImageSources';\n\n// Image slots (ADR 0222/0223/0225): a section declares the holes in its layout\n// and a per-section collector resolves them as one set. Replaces the per-image\n// `useResolvedImageSources` path above, which is kept until its callers move.\nexport { useImageSlot } from './hooks/useImageSlot';\nexport type {\n UseImageSlotOptions,\n ResolvedImage,\n} from './hooks/useImageSlot';\nexport {\n ImageSlotProvider,\n useImageSlotCollector,\n} from './context/ImageSlotContext';\nexport type {\n ImageSlotCollector,\n ImageSlotProviderProps,\n} from './context/ImageSlotContext';\nexport { composeSemantic } from './image/composeSemantic';\nexport type { ComposeSemanticInput } from './image/composeSemantic';\nexport type {\n ImageSlotKind,\n ImageMatchQuality,\n ImageBackground,\n ImageSlotRequest,\n ImagePalette,\n ImageStatGrid,\n ImageVisualMetadata,\n ResolvedImageSlot,\n ResolveImageSetResponse,\n ResolveImageSetPort,\n SlotState,\n ImageSubject,\n} from './image/imageSlotTypes';\nexport { useResolveGenericEntityData } from './hooks/useResolveGenericEntityData';\nexport { useEntityTransforms } from './hooks/useEntityTransforms';\nexport { useMarkdownUtils } from './hooks/useMarkdownUtils';\nexport { useResolveShopifyEntityData } from './hooks/useResolveShopifyEntityData';\nexport { useResolveSearchSpringEntityData } from './hooks/useResolveSearchSpringEntityData';\n\n// SearchSpring\nexport {\n fetchProductsByHandles,\n fetchProductsByHandlesMap,\n transformSSProductToEntityItemData,\n} from './services/searchspring';\nexport type {\n SearchSpringConfig,\n SSProduct,\n SSSearchResponse,\n SSSizeData,\n} from './services/searchspring';\n\n// Shopify Storefront API\n// Cart actions\nexport { addToCart } from './services/cart';\n\nexport {\n ShopifyStorefrontClient,\n resolveShopifyConfig,\n resolveShopifyEntity,\n transformShopifyProduct,\n transformShopifyCollection,\n transformShopifyArticle,\n transformShopifyEntityToItemData,\n PRODUCT_BY_HANDLE_QUERY,\n COLLECTION_BY_HANDLE_QUERY,\n ARTICLE_BY_HANDLE_QUERY,\n} from './services/shopify';\nexport type {\n ShopifyStorefrontConfig,\n ShopifyProduct,\n ShopifyCollection,\n ShopifyArticle,\n ShopifyImage,\n ShopifyMoneyV2,\n} from './services/shopify';\n\n// Utilities\nexport { cn } from './lib/utils';\nexport { normalizeImageUrl, getResizedImageUrl } from './utils/image-utils';\nexport {\n analyzeBackdrop,\n computeContentBBox,\n buildProbeUrl,\n loadImagePixels,\n loadBackdropAnalysis,\n type BackdropAnalysis,\n type ContentBBox,\n type ImagePixels,\n} from './utils/imageBackdrop';\nexport { stripMarkdown } from './component/componentDefinitions/parse-utils';\n\n// Color utilities\nexport {\n type RGB,\n rgbToHsl,\n hslToRgb,\n ensureMinLightness,\n toRgb,\n deriveDarkColor,\n deriveDarkGradient,\n deriveLightColor,\n} from './color/colorUtils';\n\n// Analytics\nexport {\n pushEvent,\n pushPromptSubmit,\n pushLinkClick,\n pushError,\n pushExit,\n pushEntityFiltered,\n hasAnalyticsConsent,\n type EntityFilteredReason,\n} from './utils/analyticsEvents';\n\n// Consent gate (DL #218)\nexport {\n type ConsentState,\n type ConsentPurpose,\n type GatedPurpose,\n type ConsentSnapshot,\n type ConsentProvider,\n type GateView,\n type HostConsentInput,\n UNKNOWN_CONSENT,\n HOST_CONSENT_GLOBAL,\n transmit,\n mayTransmit,\n unlockOnUserAction,\n isUserEngaged,\n mayPersistIdentity,\n getConsentSnapshot,\n getGateView,\n subscribeToConsent,\n installConsentProvider,\n getInstalledProviderName,\n setConsentBufferLimit,\n getConsentGateStats,\n resetConsentGateForTests,\n detectConsentProvider,\n initConsentGate,\n CONSENT_OVERRIDE_KEY,\n CONSENT_OVERRIDE_QUERY_PARAM,\n getConsentOverride,\n setConsentOverride,\n createShopifyConsentProvider,\n isShopifyHost,\n createOneTrustConsentProvider,\n isOneTrustHost,\n createHostSuppliedConsentProvider,\n hasHostSuppliedConsent,\n publishHostConsent,\n} from './privacy';\n\n// Error handling types and utilities\nexport {\n type ConversationErrorType,\n ERROR_MARKDOWN,\n getErrorTypeFromStatus,\n createErrorMarkdown,\n STREAMING_TIMEOUT_MS,\n type ErrorActionType,\n type ErrorIconType,\n type ErrorTemplateButton,\n type ErrorTemplate,\n type ErrorTemplateOverrides,\n DEFAULT_ERROR_TEMPLATES,\n resolveErrorTemplate,\n} from './errors';\n\n// Navigation utilities\nexport {\n getForwardStack,\n setForwardStack,\n clearForwardStack,\n pushToForwardStack,\n popFromForwardStack,\n} from './utils/navigationStack';\n\n// UI components\nexport {\n UserQuery,\n type UserQueryProps,\n type ProductBackContext,\n} from './components/ui/UserQuery';\nexport {\n PRODUCT_BACK_SESSION_KEY,\n writeProductBackHandoff,\n readProductBackHandoff,\n type ProductBackHandoff,\n} from './utils/productBackHandoff';\nexport {\n PromptEntryEmptyState,\n type PromptEntryEmptyStateProps,\n} from './components/ui/PromptEntryEmptyState';\nexport {\n SearchSection,\n type SearchSectionProps,\n type SearchSectionHandle,\n type ScrollChip,\n} from './components/ui/SearchSection';\nexport {\n FeedbackBar,\n type FeedbackBarProps,\n type FeedbackCategoryOption,\n type FeedbackSentiment,\n type FeedbackSubmitInput,\n} from './components/ui/FeedbackBar';\nexport { Disclaimer, type DisclaimerProps } from './components/ui/Disclaimer';\nexport {\n BottomContainer,\n type BottomContainerProps,\n} from './components/ui/BottomContainer';\nexport { MarkdownText } from './components/ui/MarkdownText';\nexport {\n CalloutBlock,\n type CalloutBlockProps,\n} from './components/ui/CalloutBlock';\nexport {\n OptimizedImage,\n type OptimizedImageProps,\n} from './components/ui/OptimizedImage';\nexport {\n SectionSkeleton,\n type SectionSkeletonProps,\n} from './components/ui/SectionSkeleton';\nexport { SmartIcon, type SmartIconProps } from './components/ui/SmartIcon';\nexport { Loader, type LoaderProps } from './components/ui/Loader';\nexport {\n PlacementLoader,\n type PlacementLoaderProps,\n} from './components/ui/PlacementLoader';\nexport {\n UnifiedLink,\n detectLinkType,\n type UnifiedLinkProps,\n LinkType,\n type LinkVariant,\n} from './components/ui/UnifiedLink';\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from './components/ui/table';\n\n// Placement (DL #088, DL #102 behavior declarations)\nexport type {\n PlacementBehaviorConfig,\n PlacementConfig,\n PlacementPrompts,\n} from './types/placement';\n\n// Cross-bundle user-query broadcast event (DL #097 D2)\nexport {\n WEB5_USER_QUERY_EVENT,\n type Web5UserQueryEventDetail,\n type Web5UserQueryEvent,\n} from './types/userQueryEvent';\n\n// Cross-bundle answer-updated broadcast event (B2B-4121)\nexport {\n WEB5_ANSWER_UPDATED_EVENT,\n type Web5AnswerUpdatedEventDetail,\n type Web5AnswerUpdatedEvent,\n} from './types/answerUpdatedEvent';\nexport {\n WEB5_ANSWER_SETTLED_EVENT,\n type Web5AnswerSettledStatus,\n type Web5AnswerSettledEventDetail,\n type Web5AnswerSettledEvent,\n} from './types/answerSettledEvent';\n\n// Cross-bundle redirect broadcast event (DL #098 D3)\nexport {\n WEB5_REDIRECT_EVENT,\n type Web5RedirectEventDetail,\n type Web5RedirectEvent,\n type Web5RedirectReason,\n} from './types/redirectEvent';\n// `placementFilter` was removed — hero/next-steps exclusion is the prompt's job\n// and placement-specific designs belong as `{ placement: true }` registry\n// variants (resolved automatically via `resolveSection(type, { placement: true })`).\n\n// Client bundle loader (DL #088 D3.3)\nexport { loadClientBundle } from './client/loadClientBundle';\n\n// `?clientBundleUrl=` dev override — shared by `web50-server-ui` and\n// `embed-placement` so the trusted-host gate can't drift between them.\nexport {\n getClientBundleOverride,\n isTrustedBundleHost,\n} from './client/clientBundleOverride';\n\n// Client-UMD URL resolution (DL #094 per-msid, DL #129 per-template) and the\n// universal bundle←backend config merge (DL #129 Q3/Q7) — shared by\n// `web50-server-ui` and `embed-placement`, the two client-bundle load sites.\nexport {\n TEMPLATES_CDN_BASE,\n TEMPLATES_MANIFEST_URL,\n getTemplateOverride,\n isTemplatePickerRequested,\n isValidTemplateId,\n resolveClientBundleUrl,\n} from './client/clientBundleUrl';\nexport {\n mergeClientConfig,\n type DeepPartial,\n} from './client/mergeClientConfig';\nexport {\n applyThemeOverrides,\n THEME_OVERRIDE_TOKENS,\n type ThemeOverrideKey,\n type ThemeOverrides,\n} from './client/applyThemeOverrides';\nexport {\n THEME_TOKEN_CONTRACT,\n BRAND_TOKENS,\n EDITABLE_TOKENS,\n TOKEN_NAME_PATTERN,\n bucketOf,\n hostAliasFor,\n type TokenBucket,\n type TokenContractEntry,\n type TokenType,\n} from './theme/tokenContract';\nexport {\n isThemeDebugEnabled,\n THEME_DEBUG_KEY,\n THEME_DEBUG_QUERY_PARAM,\n type AppliedToken,\n type ThemeOverrideSource,\n} from './client/themeDebug';\nexport {\n hexToHslTriplet,\n hslTripletToHex,\n isHslTriplet,\n} from './theme/colorFormat';\n\n// Placement renderer + DI helper (DL #088 D3.2, D3.4)\nexport {\n PlacementResponseRenderer,\n PlacementSmoothHeight,\n type PlacementResponseRendererProps,\n type PlacementSection,\n type PlacementVariant,\n} from './components/placement/PlacementResponseRenderer';\nexport {\n buildPlacementDependencies,\n type BuildPlacementDependenciesOptions,\n} from './components/placement/buildPlacementDependencies';\nexport {\n PlacementPayloadProvider,\n usePlacementPayload,\n type PlacementPayloadContextValue,\n} from './components/placement/PlacementPayloadContext';\n\n// Markdown parsing utilities — lifted from web50-server-ui (DL #088 B9.1)\nexport {\n UnifiedMarkdownParser,\n parseMarkdownToAst,\n parseAstToMarkdown,\n} from './utils/unifiedMarkdownParser';\nexport {\n escapeWeb5Links,\n fixMalformedLinks,\n trimTrailingWhitespace,\n normalizeIconUrls,\n decodeLinkText,\n preprocessMarkdown,\n type PreprocessorDiagnostic,\n type PreprocessResult,\n} from './utils/markdownPreprocessor';\nexport {\n ComponentTracking,\n type ComponentNodeRange,\n} from './utils/componentTracking';\nexport {\n findKeywordsInContent,\n getContextualImageFilename,\n} from './utils/contentKeywordMatcher';\nexport {\n extractIntentFromMarkdown,\n getIntentFromMarkdown,\n type IntentInfo,\n type IntentExtractionOptions,\n type ResponseState,\n} from './utils/intentExtractor';\nexport type { PageSection } from './types/page-section';\nexport {\n createPageSection,\n generateSectionId,\n generateId,\n findImageInNode,\n findImageInChildren,\n type Product,\n type ComparisonProduct,\n type ProductComparisonSectionProps,\n} from './utils/propsExtractor';\nexport {\n DiagnosticsCollector,\n type DiagnosticEntry,\n} from './utils/diagnosticsCollector';\nexport {\n REFRESH_PROMPTS_UNTIL_KEY,\n REFRESH_PROMPTS_WINDOW_MS,\n getRefreshPromptsExpiry,\n shouldRefreshPrompts,\n enableRefreshPrompts,\n disableRefreshPrompts,\n} from './utils/refreshPrompts';\nexport {\n type BackendEnvironment,\n BACKEND_ENVIRONMENT_KEY,\n BACKEND_ENVIRONMENT_QUERY_PARAM,\n DEFAULT_BACKEND_ENVIRONMENT,\n getBackendEnvironment,\n setBackendEnvironment,\n usesStagingBackend,\n} from './utils/backendEnvironment';\nexport { isSimulationTraffic } from './utils/simulation';\nexport {\n MATCH_DEBUG_KEY,\n MATCH_DEBUG_QUERY_PARAM,\n isMatchDebugEnabled,\n setMatchDebug,\n resetMatchDebugCache,\n logMatchDebug,\n} from './utils/matchDebug';\nexport { createWixAuthFetch } from './client/wixAuthFetch';\nexport {\n getOrCreateSessionId,\n getSessionId,\n getChatId,\n startNewChatId,\n setChatId,\n resetChatIdForTests,\n} from './utils/sessionManager';\n\n// Component parser orchestrator — lifted from web50-server-ui (DL #088 B9.5)\nexport {\n parseMarkdownToComponents,\n tryParseComponent,\n mergeSectionsWithStableReferences,\n type ParseMarkdownOptions,\n type ParseMarkdownResult,\n type ComponentMatch,\n type ParserContext,\n} from './component/componentParser';\nexport type {\n ParserClientConfig,\n EnrichEntityProps,\n} from './component/parser-types';\n\n// Host-mount scope contract — shared by web50-server-ui (which stamps the\n// class and mounts), embed-placement (which mounts the same bundle elsewhere),\n// and the client CDN build (which compiles every selector against it).\nexport {\n WEB5_ROOT_ID,\n WEB5_ROOT_CLASS,\n WEB5_SCOPES,\n WEB5_SCOPE,\n WEB5_GLOBAL_TOKENS,\n type HostFitConfig,\n} from './hostScope';\n"],"mappings":";;;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AAAuDC,OAAA,CAAAC,UAAA,GAAAH,QAAA,CAAAG,UAAA;AAAAD,OAAA,CAAAE,cAAA,GAAAJ,QAAA,CAAAI,cAAA;AAEvD,IAAAC,qBAAA,GAAAJ,OAAA;AAO+CC,OAAA,CAAAI,yBAAA,GAAAD,qBAAA,CAAAC,yBAAA;AAAAJ,OAAA,CAAAK,qBAAA,GAAAF,qBAAA,CAAAE,qBAAA;AAAAL,OAAA,CAAAM,iBAAA,GAAAH,qBAAA,CAAAG,iBAAA;AAAAN,OAAA,CAAAO,gBAAA,GAAAJ,qBAAA,CAAAI,gBAAA;AAM/C,IAAAC,MAAA,GAAAT,OAAA;AAsBuBC,OAAA,CAAAS,cAAA,GAAAD,MAAA,CAAAC,cAAA;AAAAT,OAAA,CAAAU,aAAA,GAAAF,MAAA,CAAAE,aAAA;AAAAV,OAAA,CAAAW,YAAA,GAAAH,MAAA,CAAAG,YAAA;AAAAX,OAAA,CAAAY,UAAA,GAAAJ,MAAA,CAAAI,UAAA;AAAAZ,OAAA,CAAAa,SAAA,GAAAL,MAAA,CAAAK,SAAA;AAAAb,OAAA,CAAAc,QAAA,GAAAN,MAAA,CAAAM,QAAA;AAAAd,OAAA,CAAAe,cAAA,GAAAP,MAAA,CAAAO,cAAA;AAAAf,OAAA,CAAAgB,sBAAA,GAAAR,MAAA,CAAAQ,sBAAA;AAAAhB,OAAA,CAAAiB,UAAA,GAAAT,MAAA,CAAAS,UAAA;AAyFvB,IAAAC,kBAAA,GAAAnB,OAAA;AAA8DC,OAAA,CAAAmB,YAAA,GAAAD,kBAAA,CAAAC,YAAA;AAG9D,IAAAC,gBAAA,GAAArB,OAAA;AAA+DC,OAAA,CAAAqB,gBAAA,GAAAD,gBAAA,CAAAC,gBAAA;AAI/D,IAAAC,uBAAA,GAAAvB,OAAA;AAGwCC,OAAA,CAAAuB,sBAAA,GAAAD,uBAAA,CAAAC,sBAAA;AACxC,IAAAC,mBAAA,GAAAzB,OAAA;AAGoCC,OAAA,CAAAyB,sBAAA,GAAAD,mBAAA,CAAAC,sBAAA;AAAAzB,OAAA,CAAA0B,gBAAA,GAAAF,mBAAA,CAAAE,gBAAA;AASpC,IAAAC,qBAAA,GAAA5B,OAAA;AAqB0CC,OAAA,CAAA4B,qBAAA,GAAAD,qBAAA,CAAAC,qBAAA;AAAA5B,OAAA,CAAA6B,2BAAA,GAAAF,qBAAA,CAAAE,2BAAA;AAAA7B,OAAA,CAAA8B,oBAAA,GAAAH,qBAAA,CAAAG,oBAAA;AAAA9B,OAAA,CAAA+B,wBAAA,GAAAJ,qBAAA,CAAAI,wBAAA;AAAA/B,OAAA,CAAAgC,6BAAA,GAAAL,qBAAA,CAAAK,6BAAA;AAAAhC,OAAA,CAAAiC,uBAAA,GAAAN,qBAAA,CAAAM,uBAAA;AAAAjC,OAAA,CAAAkC,iCAAA,GAAAP,qBAAA,CAAAO,iCAAA;AAAAlC,OAAA,CAAAmC,2BAAA,GAAAR,qBAAA,CAAAQ,2BAAA;AAAAnC,OAAA,CAAAoC,0BAAA,GAAAT,qBAAA,CAAAS,0BAAA;AAAApC,OAAA,CAAAqC,0BAAA,GAAAV,qBAAA,CAAAU,0BAAA;AAAArC,OAAA,CAAAsC,wBAAA,GAAAX,qBAAA,CAAAW,wBAAA;AAAAtC,OAAA,CAAAuC,0BAAA,GAAAZ,qBAAA,CAAAY,0BAAA;AAAAvC,OAAA,CAAAwC,6BAAA,GAAAb,qBAAA,CAAAa,6BAAA;AAAAxC,OAAA,CAAAyC,0BAAA,GAAAd,qBAAA,CAAAc,0BAAA;AAAAzC,OAAA,CAAA0C,0BAAA,GAAAf,qBAAA,CAAAe,0BAAA;AAAA1C,OAAA,CAAA2C,4BAAA,GAAAhB,qBAAA,CAAAgB,4BAAA;AAAA3C,OAAA,CAAA4C,uBAAA,GAAAjB,qBAAA,CAAAiB,uBAAA;AAAA5C,OAAA,CAAA6C,sBAAA,GAAAlB,qBAAA,CAAAkB,sBAAA;AAAA7C,OAAA,CAAA8C,yBAAA,GAAAnB,qBAAA,CAAAmB,yBAAA;AAAA9C,OAAA,CAAA+C,iBAAA,GAAApB,qBAAA,CAAAoB,iBAAA;AAG1C,IAAAC,SAAA,GAAAjD,OAAA;AAA+CC,OAAA,CAAAiD,iBAAA,GAAAD,SAAA,CAAAC,iBAAA;AAiB/C,IAAAC,iBAAA,GAAAnD,OAAA;AAS4BC,OAAA,CAAAmD,eAAA,GAAAD,iBAAA,CAAAC,eAAA;AAAAnD,OAAA,CAAAoD,qBAAA,GAAAF,iBAAA,CAAAE,qBAAA;AAAApD,OAAA,CAAAqD,yBAAA,GAAAH,iBAAA,CAAAG,yBAAA;AAG5B,IAAAC,eAAA,GAAAvD,OAAA;AAI0BC,OAAA,CAAAuD,sBAAA,GAAAD,eAAA,CAAAC,sBAAA;AAAAvD,OAAA,CAAAwD,iCAAA,GAAAF,eAAA,CAAAE,iCAAA;AAG1B,IAAAC,UAAA,GAAA1D,OAAA;AA2B4BC,OAAA,CAAA0D,WAAA,GAAAD,UAAA,CAAAC,WAAA;AAAA1D,OAAA,CAAA2D,YAAA,GAAAF,UAAA,CAAAE,YAAA;AAAA3D,OAAA,CAAA4D,eAAA,GAAAH,UAAA,CAAAG,eAAA;AAAA5D,OAAA,CAAA6D,cAAA,GAAAJ,UAAA,CAAAI,cAAA;AAAA7D,OAAA,CAAA8D,aAAA,GAAAL,UAAA,CAAAK,aAAA;AAAA9D,OAAA,CAAA+D,eAAA,GAAAN,UAAA,CAAAM,eAAA;AAAA/D,OAAA,CAAAgE,eAAA,GAAAP,UAAA,CAAAO,eAAA;AAAAhE,OAAA,CAAAiE,SAAA,GAAAR,UAAA,CAAAQ,SAAA;AAAAjE,OAAA,CAAAkE,cAAA,GAAAT,UAAA,CAAAS,cAAA;AAAAlE,OAAA,CAAAmE,cAAA,GAAAV,UAAA,CAAAU,cAAA;AAAAnE,OAAA,CAAAoE,WAAA,GAAAX,UAAA,CAAAW,WAAA;AAG5B,IAAAC,iBAAA,GAAAtE,OAAA;AAekCC,OAAA,CAAAsE,YAAA,GAAAD,iBAAA,CAAAC,YAAA;AAAAtE,OAAA,CAAAuE,cAAA,GAAAF,iBAAA,CAAAE,cAAA;AAAAvE,OAAA,CAAAwE,eAAA,GAAAH,iBAAA,CAAAG,eAAA;AAAAxE,OAAA,CAAAyE,YAAA,GAAAJ,iBAAA,CAAAI,YAAA;AAAAzE,OAAA,CAAA0E,eAAA,GAAAL,iBAAA,CAAAK,eAAA;AAAA1E,OAAA,CAAA2E,eAAA,GAAAN,iBAAA,CAAAM,eAAA;AAAA3E,OAAA,CAAA4E,mBAAA,GAAAP,iBAAA,CAAAO,mBAAA;AAGlC,IAAAC,kBAAA,GAAA9E,OAAA;AAGmCC,OAAA,CAAA8E,oBAAA,GAAAD,kBAAA,CAAAC,oBAAA;AAGnC,IAAAC,aAAA,GAAAhF,OAAA;AAA+DC,OAAA,CAAAgF,QAAA,GAAAD,aAAA,CAAAC,QAAA;AAAAhF,OAAA,CAAAiF,aAAA,GAAAF,aAAA,CAAAE,aAAA;AAG/D,IAAAC,MAAA,GAAAnF,OAAA;AAMiBC,OAAA,CAAAmF,aAAA,GAAAD,MAAA,CAAAC,aAAA;AAAAnF,OAAA,CAAAoF,gBAAA,GAAAF,MAAA,CAAAE,gBAAA;AAAApF,OAAA,CAAAqF,YAAA,GAAAH,MAAA,CAAAG,YAAA;AAOjB,IAAAC,6BAAA,GAAAvF,OAAA;AAIgDC,OAAA,CAAAuF,6BAAA,GAAAD,6BAAA,CAAAC,6BAAA;AAAAvF,OAAA,CAAAwF,wBAAA,GAAAF,6BAAA,CAAAE,wBAAA;AAGhD,IAAAC,iBAAA,GAAA1F,OAAA;AAIoCC,OAAA,CAAA0F,iBAAA,GAAAD,iBAAA,CAAAC,iBAAA;AAAA1F,OAAA,CAAA2F,YAAA,GAAAF,iBAAA,CAAAE,YAAA;AAGpC,IAAAC,aAAA,GAAA7F,OAAA;AAIgCC,OAAA,CAAA6F,aAAA,GAAAD,aAAA,CAAAC,aAAA;AAAA7F,OAAA,CAAA8F,QAAA,GAAAF,aAAA,CAAAE,QAAA;AAuBhC,IAAAC,OAAA,GAAAhG,OAAA;AAyBkBC,OAAA,CAAAgG,gBAAA,GAAAD,OAAA,CAAAC,gBAAA;AAAAhG,OAAA,CAAAiG,yBAAA,GAAAF,OAAA,CAAAE,yBAAA;AAAAjG,OAAA,CAAAkG,UAAA,GAAAH,OAAA,CAAAG,UAAA;AAAAlG,OAAA,CAAAmG,mBAAA,GAAAJ,OAAA,CAAAI,mBAAA;AAAAnG,OAAA,CAAAoG,aAAA,GAAAL,OAAA,CAAAK,aAAA;AAAApG,OAAA,CAAAqG,sBAAA,GAAAN,OAAA,CAAAM,sBAAA;AAAArG,OAAA,CAAAsG,eAAA,GAAAP,OAAA,CAAAO,eAAA;AAAAtG,OAAA,CAAAuG,mBAAA,GAAAR,OAAA,CAAAQ,mBAAA;AAAAvG,OAAA,CAAAwG,eAAA,GAAAT,OAAA,CAAAS,eAAA;AAAAxG,OAAA,CAAAyG,mBAAA,GAAAV,OAAA,CAAAU,mBAAA;AAAAzG,OAAA,CAAA0G,kBAAA,GAAAX,OAAA,CAAAW,kBAAA;AAAA1G,OAAA,CAAA2G,uBAAA,GAAAZ,OAAA,CAAAY,uBAAA;AAAA3G,OAAA,CAAA4G,6BAAA,GAAAb,OAAA,CAAAa,6BAAA;AAAA5G,OAAA,CAAA6G,6BAAA,GAAAd,OAAA,CAAAc,6BAAA;AAAA7G,OAAA,CAAA8G,4BAAA,GAAAf,OAAA,CAAAe,4BAAA;AAAA9G,OAAA,CAAA+G,gBAAA,GAAAhB,OAAA,CAAAgB,gBAAA;AAAA/G,OAAA,CAAAgH,WAAA,GAAAjB,OAAA,CAAAiB,WAAA;AAAAhH,OAAA,CAAAiH,gBAAA,GAAAlB,OAAA,CAAAkB,gBAAA;AAAAjH,OAAA,CAAAkH,gBAAA,GAAAnB,OAAA,CAAAmB,gBAAA;AAAAlH,OAAA,CAAAmH,uBAAA,GAAApB,OAAA,CAAAoB,uBAAA;AAAAnH,OAAA,CAAAoH,yBAAA,GAAArB,OAAA,CAAAqB,yBAAA;AAAApH,OAAA,CAAAqH,0BAAA,GAAAtB,OAAA,CAAAsB,0BAAA;AAAArH,OAAA,CAAAsH,qBAAA,GAAAvB,OAAA,CAAAuB,qBAAA;AAAAtH,OAAA,CAAAuH,uBAAA,GAAAxB,OAAA,CAAAwB,uBAAA;AAQlB,IAAAC,QAAA,GAAAzH,OAAA;AAMyBC,OAAA,CAAAyH,aAAA,GAAAD,QAAA,CAAAC,aAAA;AAAAzH,OAAA,CAAA0H,iBAAA,GAAAF,QAAA,CAAAE,iBAAA;AAGzB,IAAAC,YAAA,GAAA5H,OAAA;AAAkDC,OAAA,CAAA4H,WAAA,GAAAD,YAAA,CAAAC,WAAA;AAClD,IAAAC,gBAAA,GAAA9H,OAAA;AAA0DC,OAAA,CAAA8H,eAAA,GAAAD,gBAAA,CAAAC,eAAA;AAC1D,IAAAC,qBAAA,GAAAhI,OAAA;AAAoEC,OAAA,CAAAgI,oBAAA,GAAAD,qBAAA,CAAAC,oBAAA;AACpE,IAAAC,wBAAA,GAAAlI,OAAA;AAA0EC,OAAA,CAAAkI,uBAAA,GAAAD,wBAAA,CAAAC,uBAAA;AAK1E,IAAAC,aAAA,GAAApI,OAAA;AAAoDC,OAAA,CAAAoI,YAAA,GAAAD,aAAA,CAAAC,YAAA;AAKpD,IAAAC,iBAAA,GAAAtI,OAAA;AAGoCC,OAAA,CAAAsI,iBAAA,GAAAD,iBAAA,CAAAC,iBAAA;AAAAtI,OAAA,CAAAuI,qBAAA,GAAAF,iBAAA,CAAAE,qBAAA;AAKpC,IAAAC,gBAAA,GAAAzI,OAAA;AAA0DC,OAAA,CAAAyI,eAAA,GAAAD,gBAAA,CAAAC,eAAA;AAgB1D,IAAAC,4BAAA,GAAA3I,OAAA;AAAkFC,OAAA,CAAA2I,2BAAA,GAAAD,4BAAA,CAAAC,2BAAA;AAClF,IAAAC,oBAAA,GAAA7I,OAAA;AAAkEC,OAAA,CAAA6I,mBAAA,GAAAD,oBAAA,CAAAC,mBAAA;AAClE,IAAAC,iBAAA,GAAA/I,OAAA;AAA4DC,OAAA,CAAA+I,gBAAA,GAAAD,iBAAA,CAAAC,gBAAA;AAC5D,IAAAC,4BAAA,GAAAjJ,OAAA;AAAkFC,OAAA,CAAAiJ,2BAAA,GAAAD,4BAAA,CAAAC,2BAAA;AAClF,IAAAC,iCAAA,GAAAnJ,OAAA;AAA4FC,OAAA,CAAAmJ,gCAAA,GAAAD,iCAAA,CAAAC,gCAAA;AAG5F,IAAAC,aAAA,GAAArJ,OAAA;AAIiCC,OAAA,CAAAqJ,sBAAA,GAAAD,aAAA,CAAAC,sBAAA;AAAArJ,OAAA,CAAAsJ,yBAAA,GAAAF,aAAA,CAAAE,yBAAA;AAAAtJ,OAAA,CAAAuJ,kCAAA,GAAAH,aAAA,CAAAG,kCAAA;AAUjC,IAAAC,KAAA,GAAAzJ,OAAA;AAA4CC,OAAA,CAAAyJ,SAAA,GAAAD,KAAA,CAAAC,SAAA;AAE5C,IAAAC,QAAA,GAAA3J,OAAA;AAW4BC,OAAA,CAAA2J,uBAAA,GAAAD,QAAA,CAAAC,uBAAA;AAAA3J,OAAA,CAAA4J,oBAAA,GAAAF,QAAA,CAAAE,oBAAA;AAAA5J,OAAA,CAAA6J,oBAAA,GAAAH,QAAA,CAAAG,oBAAA;AAAA7J,OAAA,CAAA8J,uBAAA,GAAAJ,QAAA,CAAAI,uBAAA;AAAA9J,OAAA,CAAA+J,0BAAA,GAAAL,QAAA,CAAAK,0BAAA;AAAA/J,OAAA,CAAAgK,uBAAA,GAAAN,QAAA,CAAAM,uBAAA;AAAAhK,OAAA,CAAAiK,gCAAA,GAAAP,QAAA,CAAAO,gCAAA;AAAAjK,OAAA,CAAAkK,uBAAA,GAAAR,QAAA,CAAAQ,uBAAA;AAAAlK,OAAA,CAAAmK,0BAAA,GAAAT,QAAA,CAAAS,0BAAA;AAAAnK,OAAA,CAAAoK,uBAAA,GAAAV,QAAA,CAAAU,uBAAA;AAW5B,IAAAC,MAAA,GAAAtK,OAAA;AAAiCC,OAAA,CAAAsK,EAAA,GAAAD,MAAA,CAAAC,EAAA;AACjC,IAAAC,WAAA,GAAAxK,OAAA;AAA4EC,OAAA,CAAAwK,iBAAA,GAAAD,WAAA,CAAAC,iBAAA;AAAAxK,OAAA,CAAAyK,kBAAA,GAAAF,WAAA,CAAAE,kBAAA;AAC5E,IAAAC,cAAA,GAAA3K,OAAA;AAS+BC,OAAA,CAAA2K,eAAA,GAAAD,cAAA,CAAAC,eAAA;AAAA3K,OAAA,CAAA4K,kBAAA,GAAAF,cAAA,CAAAE,kBAAA;AAAA5K,OAAA,CAAA6K,aAAA,GAAAH,cAAA,CAAAG,aAAA;AAAA7K,OAAA,CAAA8K,eAAA,GAAAJ,cAAA,CAAAI,eAAA;AAAA9K,OAAA,CAAA+K,oBAAA,GAAAL,cAAA,CAAAK,oBAAA;AAC/B,IAAAC,WAAA,GAAAjL,OAAA;AAA6EC,OAAA,CAAAiL,aAAA,GAAAD,WAAA,CAAAC,aAAA;AAG7E,IAAAC,WAAA,GAAAnL,OAAA;AAS4BC,OAAA,CAAAmL,QAAA,GAAAD,WAAA,CAAAC,QAAA;AAAAnL,OAAA,CAAAoL,QAAA,GAAAF,WAAA,CAAAE,QAAA;AAAApL,OAAA,CAAAqL,kBAAA,GAAAH,WAAA,CAAAG,kBAAA;AAAArL,OAAA,CAAAsL,KAAA,GAAAJ,WAAA,CAAAI,KAAA;AAAAtL,OAAA,CAAAuL,eAAA,GAAAL,WAAA,CAAAK,eAAA;AAAAvL,OAAA,CAAAwL,kBAAA,GAAAN,WAAA,CAAAM,kBAAA;AAAAxL,OAAA,CAAAyL,gBAAA,GAAAP,WAAA,CAAAO,gBAAA;AAG5B,IAAAC,gBAAA,GAAA3L,OAAA;AASiCC,OAAA,CAAA2L,SAAA,GAAAD,gBAAA,CAAAC,SAAA;AAAA3L,OAAA,CAAA4L,gBAAA,GAAAF,gBAAA,CAAAE,gBAAA;AAAA5L,OAAA,CAAA6L,aAAA,GAAAH,gBAAA,CAAAG,aAAA;AAAA7L,OAAA,CAAA8L,SAAA,GAAAJ,gBAAA,CAAAI,SAAA;AAAA9L,OAAA,CAAA+L,QAAA,GAAAL,gBAAA,CAAAK,QAAA;AAAA/L,OAAA,CAAAgM,kBAAA,GAAAN,gBAAA,CAAAM,kBAAA;AAAAhM,OAAA,CAAAiM,mBAAA,GAAAP,gBAAA,CAAAO,mBAAA;AAGjC,IAAAC,QAAA,GAAAnM,OAAA;AAoCmBC,OAAA,CAAAmM,eAAA,GAAAD,QAAA,CAAAC,eAAA;AAAAnM,OAAA,CAAAoM,mBAAA,GAAAF,QAAA,CAAAE,mBAAA;AAAApM,OAAA,CAAAqM,QAAA,GAAAH,QAAA,CAAAG,QAAA;AAAArM,OAAA,CAAAsM,WAAA,GAAAJ,QAAA,CAAAI,WAAA;AAAAtM,OAAA,CAAAuM,kBAAA,GAAAL,QAAA,CAAAK,kBAAA;AAAAvM,OAAA,CAAAwM,aAAA,GAAAN,QAAA,CAAAM,aAAA;AAAAxM,OAAA,CAAAyM,kBAAA,GAAAP,QAAA,CAAAO,kBAAA;AAAAzM,OAAA,CAAA0M,kBAAA,GAAAR,QAAA,CAAAQ,kBAAA;AAAA1M,OAAA,CAAA2M,WAAA,GAAAT,QAAA,CAAAS,WAAA;AAAA3M,OAAA,CAAA4M,kBAAA,GAAAV,QAAA,CAAAU,kBAAA;AAAA5M,OAAA,CAAA6M,sBAAA,GAAAX,QAAA,CAAAW,sBAAA;AAAA7M,OAAA,CAAA8M,wBAAA,GAAAZ,QAAA,CAAAY,wBAAA;AAAA9M,OAAA,CAAA+M,qBAAA,GAAAb,QAAA,CAAAa,qBAAA;AAAA/M,OAAA,CAAAgN,mBAAA,GAAAd,QAAA,CAAAc,mBAAA;AAAAhN,OAAA,CAAAiN,wBAAA,GAAAf,QAAA,CAAAe,wBAAA;AAAAjN,OAAA,CAAAkN,qBAAA,GAAAhB,QAAA,CAAAgB,qBAAA;AAAAlN,OAAA,CAAAmN,eAAA,GAAAjB,QAAA,CAAAiB,eAAA;AAAAnN,OAAA,CAAAoN,oBAAA,GAAAlB,QAAA,CAAAkB,oBAAA;AAAApN,OAAA,CAAAqN,4BAAA,GAAAnB,QAAA,CAAAmB,4BAAA;AAAArN,OAAA,CAAAsN,kBAAA,GAAApB,QAAA,CAAAoB,kBAAA;AAAAtN,OAAA,CAAAuN,kBAAA,GAAArB,QAAA,CAAAqB,kBAAA;AAAAvN,OAAA,CAAAwN,4BAAA,GAAAtB,QAAA,CAAAsB,4BAAA;AAAAxN,OAAA,CAAAyN,aAAA,GAAAvB,QAAA,CAAAuB,aAAA;AAAAzN,OAAA,CAAA0N,6BAAA,GAAAxB,QAAA,CAAAwB,6BAAA;AAAA1N,OAAA,CAAA2N,cAAA,GAAAzB,QAAA,CAAAyB,cAAA;AAAA3N,OAAA,CAAA4N,iCAAA,GAAA1B,QAAA,CAAA0B,iCAAA;AAAA5N,OAAA,CAAA6N,sBAAA,GAAA3B,QAAA,CAAA2B,sBAAA;AAAA7N,OAAA,CAAA8N,kBAAA,GAAA5B,QAAA,CAAA4B,kBAAA;AAGnB,IAAAC,OAAA,GAAAhO,OAAA;AAakBC,OAAA,CAAAgO,cAAA,GAAAD,OAAA,CAAAC,cAAA;AAAAhO,OAAA,CAAAiO,sBAAA,GAAAF,OAAA,CAAAE,sBAAA;AAAAjO,OAAA,CAAAkO,mBAAA,GAAAH,OAAA,CAAAG,mBAAA;AAAAlO,OAAA,CAAAmO,oBAAA,GAAAJ,OAAA,CAAAI,oBAAA;AAAAnO,OAAA,CAAAoO,uBAAA,GAAAL,OAAA,CAAAK,uBAAA;AAAApO,OAAA,CAAAqO,oBAAA,GAAAN,OAAA,CAAAM,oBAAA;AAGlB,IAAAC,gBAAA,GAAAvO,OAAA;AAMiCC,OAAA,CAAAuO,eAAA,GAAAD,gBAAA,CAAAC,eAAA;AAAAvO,OAAA,CAAAwO,eAAA,GAAAF,gBAAA,CAAAE,eAAA;AAAAxO,OAAA,CAAAyO,iBAAA,GAAAH,gBAAA,CAAAG,iBAAA;AAAAzO,OAAA,CAAA0O,kBAAA,GAAAJ,gBAAA,CAAAI,kBAAA;AAAA1O,OAAA,CAAA2O,mBAAA,GAAAL,gBAAA,CAAAK,mBAAA;AAGjC,IAAAC,UAAA,GAAA7O,OAAA;AAImCC,OAAA,CAAA6O,SAAA,GAAAD,UAAA,CAAAC,SAAA;AACnC,IAAAC,mBAAA,GAAA/O,OAAA;AAKoCC,OAAA,CAAA+O,wBAAA,GAAAD,mBAAA,CAAAC,wBAAA;AAAA/O,OAAA,CAAAgP,uBAAA,GAAAF,mBAAA,CAAAE,uBAAA;AAAAhP,OAAA,CAAAiP,sBAAA,GAAAH,mBAAA,CAAAG,sBAAA;AACpC,IAAAC,sBAAA,GAAAnP,OAAA;AAG+CC,OAAA,CAAAmP,qBAAA,GAAAD,sBAAA,CAAAC,qBAAA;AAC/C,IAAAC,cAAA,GAAArP,OAAA;AAKuCC,OAAA,CAAAqP,aAAA,GAAAD,cAAA,CAAAC,aAAA;AACvC,IAAAC,YAAA,GAAAvP,OAAA;AAMqCC,OAAA,CAAAuP,WAAA,GAAAD,YAAA,CAAAC,WAAA;AACrC,IAAAC,WAAA,GAAAzP,OAAA;AAA8EC,OAAA,CAAAyP,UAAA,GAAAD,WAAA,CAAAC,UAAA;AAC9E,IAAAC,gBAAA,GAAA3P,OAAA;AAGyCC,OAAA,CAAA2P,eAAA,GAAAD,gBAAA,CAAAC,eAAA;AACzC,IAAAC,aAAA,GAAA7P,OAAA;AAA4DC,OAAA,CAAA6P,YAAA,GAAAD,aAAA,CAAAC,YAAA;AAC5D,IAAAC,aAAA,GAAA/P,OAAA;AAGsCC,OAAA,CAAA+P,YAAA,GAAAD,aAAA,CAAAC,YAAA;AACtC,IAAAC,eAAA,GAAAjQ,OAAA;AAGwCC,OAAA,CAAAiQ,cAAA,GAAAD,eAAA,CAAAC,cAAA;AACxC,IAAAC,gBAAA,GAAAnQ,OAAA;AAGyCC,OAAA,CAAAmQ,eAAA,GAAAD,gBAAA,CAAAC,eAAA;AACzC,IAAAC,UAAA,GAAArQ,OAAA;AAA2EC,OAAA,CAAAqQ,SAAA,GAAAD,UAAA,CAAAC,SAAA;AAC3E,IAAAC,OAAA,GAAAvQ,OAAA;AAAkEC,OAAA,CAAAuQ,MAAA,GAAAD,OAAA,CAAAC,MAAA;AAClE,IAAAC,gBAAA,GAAAzQ,OAAA;AAGyCC,OAAA,CAAAyQ,eAAA,GAAAD,gBAAA,CAAAC,eAAA;AACzC,IAAAC,YAAA,GAAA3Q,OAAA;AAMqCC,OAAA,CAAA2Q,WAAA,GAAAD,YAAA,CAAAC,WAAA;AAAA3Q,OAAA,CAAA4Q,cAAA,GAAAF,YAAA,CAAAE,cAAA;AAAA5Q,OAAA,CAAA6Q,QAAA,GAAAH,YAAA,CAAAG,QAAA;AACrC,IAAAC,MAAA,GAAA/Q,OAAA;AAS+BC,OAAA,CAAA+Q,KAAA,GAAAD,MAAA,CAAAC,KAAA;AAAA/Q,OAAA,CAAAgR,WAAA,GAAAF,MAAA,CAAAE,WAAA;AAAAhR,OAAA,CAAAiR,SAAA,GAAAH,MAAA,CAAAG,SAAA;AAAAjR,OAAA,CAAAkR,WAAA,GAAAJ,MAAA,CAAAI,WAAA;AAAAlR,OAAA,CAAAmR,SAAA,GAAAL,MAAA,CAAAK,SAAA;AAAAnR,OAAA,CAAAoR,QAAA,GAAAN,MAAA,CAAAM,QAAA;AAAApR,OAAA,CAAAqR,SAAA,GAAAP,MAAA,CAAAO,SAAA;AAAArR,OAAA,CAAAsR,YAAA,GAAAR,MAAA,CAAAQ,YAAA;AAU/B,IAAAC,eAAA,GAAAxR,OAAA;AAIgCC,OAAA,CAAAwR,qBAAA,GAAAD,eAAA,CAAAC,qBAAA;AAGhC,IAAAC,mBAAA,GAAA1R,OAAA;AAIoCC,OAAA,CAAA0R,yBAAA,GAAAD,mBAAA,CAAAC,yBAAA;AACpC,IAAAC,mBAAA,GAAA5R,OAAA;AAKoCC,OAAA,CAAA4R,yBAAA,GAAAD,mBAAA,CAAAC,yBAAA;AAGpC,IAAAC,cAAA,GAAA9R,OAAA;AAK+BC,OAAA,CAAA8R,mBAAA,GAAAD,cAAA,CAAAC,mBAAA;AAM/B,IAAAC,iBAAA,GAAAhS,OAAA;AAA6DC,OAAA,CAAAgS,gBAAA,GAAAD,iBAAA,CAAAC,gBAAA;AAI7D,IAAAC,qBAAA,GAAAlS,OAAA;AAGuCC,OAAA,CAAAkS,uBAAA,GAAAD,qBAAA,CAAAC,uBAAA;AAAAlS,OAAA,CAAAmS,mBAAA,GAAAF,qBAAA,CAAAE,mBAAA;AAKvC,IAAAC,gBAAA,GAAArS,OAAA;AAOkCC,OAAA,CAAAqS,kBAAA,GAAAD,gBAAA,CAAAC,kBAAA;AAAArS,OAAA,CAAAsS,sBAAA,GAAAF,gBAAA,CAAAE,sBAAA;AAAAtS,OAAA,CAAAuS,mBAAA,GAAAH,gBAAA,CAAAG,mBAAA;AAAAvS,OAAA,CAAAwS,yBAAA,GAAAJ,gBAAA,CAAAI,yBAAA;AAAAxS,OAAA,CAAAyS,iBAAA,GAAAL,gBAAA,CAAAK,iBAAA;AAAAzS,OAAA,CAAA0S,sBAAA,GAAAN,gBAAA,CAAAM,sBAAA;AAClC,IAAAC,kBAAA,GAAA5S,OAAA;AAGoCC,OAAA,CAAA4S,iBAAA,GAAAD,kBAAA,CAAAC,iBAAA;AACpC,IAAAC,oBAAA,GAAA9S,OAAA;AAKsCC,OAAA,CAAA8S,mBAAA,GAAAD,oBAAA,CAAAC,mBAAA;AAAA9S,OAAA,CAAA+S,qBAAA,GAAAF,oBAAA,CAAAE,qBAAA;AACtC,IAAAC,cAAA,GAAAjT,OAAA;AAU+BC,OAAA,CAAAiT,oBAAA,GAAAD,cAAA,CAAAC,oBAAA;AAAAjT,OAAA,CAAAkT,YAAA,GAAAF,cAAA,CAAAE,YAAA;AAAAlT,OAAA,CAAAmT,eAAA,GAAAH,cAAA,CAAAG,eAAA;AAAAnT,OAAA,CAAAoT,kBAAA,GAAAJ,cAAA,CAAAI,kBAAA;AAAApT,OAAA,CAAAqT,QAAA,GAAAL,cAAA,CAAAK,QAAA;AAAArT,OAAA,CAAAsT,YAAA,GAAAN,cAAA,CAAAM,YAAA;AAC/B,IAAAC,WAAA,GAAAxT,OAAA;AAM6BC,OAAA,CAAAwT,mBAAA,GAAAD,WAAA,CAAAC,mBAAA;AAAAxT,OAAA,CAAAyT,eAAA,GAAAF,WAAA,CAAAE,eAAA;AAAAzT,OAAA,CAAA0T,uBAAA,GAAAH,WAAA,CAAAG,uBAAA;AAC7B,IAAAC,YAAA,GAAA5T,OAAA;AAI6BC,OAAA,CAAA4T,eAAA,GAAAD,YAAA,CAAAC,eAAA;AAAA5T,OAAA,CAAA6T,eAAA,GAAAF,YAAA,CAAAE,eAAA;AAAA7T,OAAA,CAAA8T,YAAA,GAAAH,YAAA,CAAAG,YAAA;AAG7B,IAAAC,0BAAA,GAAAhU,OAAA;AAM0DC,OAAA,CAAAgU,yBAAA,GAAAD,0BAAA,CAAAC,yBAAA;AAAAhU,OAAA,CAAAiU,qBAAA,GAAAF,0BAAA,CAAAE,qBAAA;AAC1D,IAAAC,2BAAA,GAAAnU,OAAA;AAG2DC,OAAA,CAAAmU,0BAAA,GAAAD,2BAAA,CAAAC,0BAAA;AAC3D,IAAAC,wBAAA,GAAArU,OAAA;AAIwDC,OAAA,CAAAqU,wBAAA,GAAAD,wBAAA,CAAAC,wBAAA;AAAArU,OAAA,CAAAsU,mBAAA,GAAAF,wBAAA,CAAAE,mBAAA;AAGxD,IAAAC,sBAAA,GAAAxU,OAAA;AAIuCC,OAAA,CAAAwU,qBAAA,GAAAD,sBAAA,CAAAC,qBAAA;AAAAxU,OAAA,CAAAyU,kBAAA,GAAAF,sBAAA,CAAAE,kBAAA;AAAAzU,OAAA,CAAA0U,kBAAA,GAAAH,sBAAA,CAAAG,kBAAA;AACvC,IAAAC,qBAAA,GAAA5U,OAAA;AASsCC,OAAA,CAAA4U,eAAA,GAAAD,qBAAA,CAAAC,eAAA;AAAA5U,OAAA,CAAA6U,iBAAA,GAAAF,qBAAA,CAAAE,iBAAA;AAAA7U,OAAA,CAAA8U,sBAAA,GAAAH,qBAAA,CAAAG,sBAAA;AAAA9U,OAAA,CAAA+U,iBAAA,GAAAJ,qBAAA,CAAAI,iBAAA;AAAA/U,OAAA,CAAAgV,cAAA,GAAAL,qBAAA,CAAAK,cAAA;AAAAhV,OAAA,CAAAiV,kBAAA,GAAAN,qBAAA,CAAAM,kBAAA;AACtC,IAAAC,kBAAA,GAAAnV,OAAA;AAGmCC,OAAA,CAAAmV,iBAAA,GAAAD,kBAAA,CAAAC,iBAAA;AACnC,IAAAC,sBAAA,GAAArV,OAAA;AAGuCC,OAAA,CAAAqV,qBAAA,GAAAD,sBAAA,CAAAC,qBAAA;AAAArV,OAAA,CAAAsV,0BAAA,GAAAF,sBAAA,CAAAE,0BAAA;AACvC,IAAAC,gBAAA,GAAAxV,OAAA;AAMiCC,OAAA,CAAAwV,yBAAA,GAAAD,gBAAA,CAAAC,yBAAA;AAAAxV,OAAA,CAAAyV,qBAAA,GAAAF,gBAAA,CAAAE,qBAAA;AAEjC,IAAAC,eAAA,GAAA3V,OAAA;AASgCC,OAAA,CAAA2V,iBAAA,GAAAD,eAAA,CAAAC,iBAAA;AAAA3V,OAAA,CAAA4V,iBAAA,GAAAF,eAAA,CAAAE,iBAAA;AAAA5V,OAAA,CAAA6V,UAAA,GAAAH,eAAA,CAAAG,UAAA;AAAA7V,OAAA,CAAA8V,eAAA,GAAAJ,eAAA,CAAAI,eAAA;AAAA9V,OAAA,CAAA+V,mBAAA,GAAAL,eAAA,CAAAK,mBAAA;AAChC,IAAAC,qBAAA,GAAAjW,OAAA;AAGsCC,OAAA,CAAAiW,oBAAA,GAAAD,qBAAA,CAAAC,oBAAA;AACtC,IAAAC,eAAA,GAAAnW,OAAA;AAOgCC,OAAA,CAAAmW,yBAAA,GAAAD,eAAA,CAAAC,yBAAA;AAAAnW,OAAA,CAAAoW,yBAAA,GAAAF,eAAA,CAAAE,yBAAA;AAAApW,OAAA,CAAAqW,uBAAA,GAAAH,eAAA,CAAAG,uBAAA;AAAArW,OAAA,CAAAsW,oBAAA,GAAAJ,eAAA,CAAAI,oBAAA;AAAAtW,OAAA,CAAAuW,oBAAA,GAAAL,eAAA,CAAAK,oBAAA;AAAAvW,OAAA,CAAAwW,qBAAA,GAAAN,eAAA,CAAAM,qBAAA;AAChC,IAAAC,mBAAA,GAAA1W,OAAA;AAQoCC,OAAA,CAAA0W,uBAAA,GAAAD,mBAAA,CAAAC,uBAAA;AAAA1W,OAAA,CAAA2W,+BAAA,GAAAF,mBAAA,CAAAE,+BAAA;AAAA3W,OAAA,CAAA4W,2BAAA,GAAAH,mBAAA,CAAAG,2BAAA;AAAA5W,OAAA,CAAA6W,qBAAA,GAAAJ,mBAAA,CAAAI,qBAAA;AAAA7W,OAAA,CAAA8W,qBAAA,GAAAL,mBAAA,CAAAK,qBAAA;AAAA9W,OAAA,CAAA+W,kBAAA,GAAAN,mBAAA,CAAAM,kBAAA;AACpC,IAAAC,WAAA,GAAAjX,OAAA;AAAyDC,OAAA,CAAAiX,mBAAA,GAAAD,WAAA,CAAAC,mBAAA;AACzD,IAAAC,WAAA,GAAAnX,OAAA;AAO4BC,OAAA,CAAAmX,eAAA,GAAAD,WAAA,CAAAC,eAAA;AAAAnX,OAAA,CAAAoX,uBAAA,GAAAF,WAAA,CAAAE,uBAAA;AAAApX,OAAA,CAAAqX,mBAAA,GAAAH,WAAA,CAAAG,mBAAA;AAAArX,OAAA,CAAAsX,aAAA,GAAAJ,WAAA,CAAAI,aAAA;AAAAtX,OAAA,CAAAuX,oBAAA,GAAAL,WAAA,CAAAK,oBAAA;AAAAvX,OAAA,CAAAwX,aAAA,GAAAN,WAAA,CAAAM,aAAA;AAC5B,IAAAC,aAAA,GAAA1X,OAAA;AAA2DC,OAAA,CAAA0X,kBAAA,GAAAD,aAAA,CAAAC,kBAAA;AAC3D,IAAAC,eAAA,GAAA5X,OAAA;AAOgCC,OAAA,CAAA4X,oBAAA,GAAAD,eAAA,CAAAC,oBAAA;AAAA5X,OAAA,CAAA6X,YAAA,GAAAF,eAAA,CAAAE,YAAA;AAAA7X,OAAA,CAAA8X,SAAA,GAAAH,eAAA,CAAAG,SAAA;AAAA9X,OAAA,CAAA+X,cAAA,GAAAJ,eAAA,CAAAI,cAAA;AAAA/X,OAAA,CAAAgY,SAAA,GAAAL,eAAA,CAAAK,SAAA;AAAAhY,OAAA,CAAAiY,mBAAA,GAAAN,eAAA,CAAAM,mBAAA;AAGhC,IAAAC,gBAAA,GAAAnY,OAAA;AAQqCC,OAAA,CAAAmY,yBAAA,GAAAD,gBAAA,CAAAC,yBAAA;AAAAnY,OAAA,CAAAoY,iBAAA,GAAAF,gBAAA,CAAAE,iBAAA;AAAApY,OAAA,CAAAqY,iCAAA,GAAAH,gBAAA,CAAAG,iCAAA;AASrC,IAAAC,UAAA,GAAAvY,OAAA;AAOqBC,OAAA,CAAAuY,YAAA,GAAAD,UAAA,CAAAC,YAAA;AAAAvY,OAAA,CAAAwY,eAAA,GAAAF,UAAA,CAAAE,eAAA;AAAAxY,OAAA,CAAAyY,WAAA,GAAAH,UAAA,CAAAG,WAAA;AAAAzY,OAAA,CAAA0Y,UAAA,GAAAJ,UAAA,CAAAI,UAAA;AAAA1Y,OAAA,CAAA2Y,kBAAA,GAAAL,UAAA,CAAAK,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_clients","require","exports","CLIENT_IDS","EXPERIMENT_IDS","_FeatureToggleContext","createFeatureToggleReader","FeatureToggleProvider","useFeatureToggles","useFeatureToggle","_parts","getPartsByType","getPartByRole","getAllByRole","getHeading","getImages","getLinks","extractContent","extractContentMarkdown","deriveRole","_sectionDefinition","DROP_SECTION","_diagnosticTypes","DIAGNOSTIC_TYPES","_imageSearchFilterTypes","buildImageSearchFilter","_imageSearchFilters","ImageSearchFilterToken","backgroundFilter","_componentDefinitions","HeroSectionDefinition","HeroEntitySectionDefinition","KpiSectionDefinition","MetricsSectionDefinition","FeatureCardsSectionDefinition","EntitySectionDefinition","EntityCollectionSectionDefinition","ComparisonSectionDefinition","TextBlockSectionDefinition","CtaBannerSectionDefinition","CalloutSectionDefinition","NextStepsSectionDefinition","FeatureSection9PlusDefinition","ListItemsSectionDefinition","SkipNodesSectionDefinition","HtmlCommentSectionDefinition","SearchSectionDefinition","ErrorSectionDefinition","FallbackSectionDefinition","createSdkRegistry","_registry","ComponentRegistry","_patternValidator","validatePattern","validatePatternSyntax","validatePatternWithBlocks","_markdownBlocks","convertToBlockElements","convertToBlockElementsWithMapping","_linkTypes","Web5UrlType","isWeb5AskUrl","isWeb5EntityUrl","isWeb5ImageUrl","isWeb5IconUrl","isWeb5ActionUrl","isWeb5SearchUrl","isWeb5Url","isNavigableUrl","isValidLinkUrl","isLegacyUrl","_entityLinkParser","parseWeb5Url","isValidWeb5Url","validateLinkUrl","isEntityLink","parseEntityLink","extractProtocol","extractLinkMetadata","_web5LinkValidator","findInvalidWeb5Links","_nodeMatchers","hasImage","isHtmlComment","_match","matchMarkdown","matchAllSections","nodesToParts","_ComponentDependenciesContext","ComponentDependenciesProvider","useComponentDependencies","_UserQueryContext","UserQueryProvider","useUserQuery","_ChipsContext","ChipsProvider","useChips","_entity","defaultExtractor","enrichEntitiesFromPayload","entityHref","normalizeEntityItem","toCatalogPath","entityPayloadFromItems","mergeEntityData","fetchEntityListData","listEntityItems","LIST_ITEMS_ENDPOINT","getEntityExtractor","registerEntityExtractor","transformToSolutionEntityData","transformToBlogPostEntityData","transformToGenericEntityData","toMatchedOptions","formatMoney","readCurrencyCode","formatPriceField","formatProductPriceLabel","isProductFamilyEntityType","isDocumentFamilyEntityType","PLATFORM_ENTITY_TYPES","resolveEntityTypeConfig","_callout","CALLOUT_KINDS","CALLOUT_SEMANTICS","_useWeb5Link","useWeb5Link","_useConversation","useConversation","_useDebugImageContext","useDebugImageContext","_useResolvedImageSources","useResolvedImageSources","_useImageSlot","useImageSlot","_ImageSlotContext","ImageSlotProvider","useImageSlotCollector","_composeSemantic","composeSemantic","_useResolveGenericEntityData","useResolveGenericEntityData","_useEntityTransforms","useEntityTransforms","_useMarkdownUtils","useMarkdownUtils","_useResolveShopifyEntityData","useResolveShopifyEntityData","_useResolveSearchSpringEntityData","useResolveSearchSpringEntityData","_searchspring","fetchProductsByHandles","fetchProductsByHandlesMap","transformSSProductToEntityItemData","_cart","addToCart","_shopify","ShopifyStorefrontClient","resolveShopifyConfig","resolveShopifyEntity","transformShopifyProduct","transformShopifyCollection","transformShopifyArticle","transformShopifyEntityToItemData","PRODUCT_BY_HANDLE_QUERY","COLLECTION_BY_HANDLE_QUERY","ARTICLE_BY_HANDLE_QUERY","_utils","cn","_imageUtils","normalizeImageUrl","getResizedImageUrl","_imageBackdrop","analyzeBackdrop","computeContentBBox","buildProbeUrl","loadImagePixels","loadBackdropAnalysis","_parseUtils","stripMarkdown","_colorUtils","rgbToHsl","hslToRgb","ensureMinLightness","toRgb","deriveDarkColor","deriveDarkGradient","deriveLightColor","_analyticsEvents","pushEvent","pushPromptSubmit","pushLinkClick","pushError","pushExit","pushEntityFiltered","hasAnalyticsConsent","_privacy","UNKNOWN_CONSENT","HOST_CONSENT_GLOBAL","transmit","mayTransmit","unlockOnUserAction","isUserEngaged","mayPersistIdentity","getConsentSnapshot","getGateView","subscribeToConsent","installConsentProvider","getInstalledProviderName","setConsentBufferLimit","getConsentGateStats","resetConsentGateForTests","detectConsentProvider","initConsentGate","CONSENT_OVERRIDE_KEY","CONSENT_OVERRIDE_QUERY_PARAM","getConsentOverride","setConsentOverride","createShopifyConsentProvider","isShopifyHost","createOneTrustConsentProvider","isOneTrustHost","createHostSuppliedConsentProvider","hasHostSuppliedConsent","publishHostConsent","_errors","ERROR_MARKDOWN","getErrorTypeFromStatus","createErrorMarkdown","STREAMING_TIMEOUT_MS","DEFAULT_ERROR_TEMPLATES","resolveErrorTemplate","_navigationStack","getForwardStack","setForwardStack","clearForwardStack","pushToForwardStack","popFromForwardStack","_UserQuery","UserQuery","_productBackHandoff","PRODUCT_BACK_SESSION_KEY","writeProductBackHandoff","readProductBackHandoff","_PromptEntryEmptyState","PromptEntryEmptyState","_SearchSection","SearchSection","_FeedbackBar","FeedbackBar","_Disclaimer","Disclaimer","_BottomContainer","BottomContainer","_MarkdownText","MarkdownText","_CalloutBlock","CalloutBlock","_OptimizedImage","OptimizedImage","_SectionSkeleton","SectionSkeleton","_SmartIcon","SmartIcon","_Loader","Loader","_PlacementLoader","PlacementLoader","_UnifiedLink","UnifiedLink","detectLinkType","LinkType","_table","Table","TableHeader","TableBody","TableFooter","TableHead","TableRow","TableCell","TableCaption","_userQueryEvent","WEB5_USER_QUERY_EVENT","_answerUpdatedEvent","WEB5_ANSWER_UPDATED_EVENT","_answerSettledEvent","WEB5_ANSWER_SETTLED_EVENT","_redirectEvent","WEB5_REDIRECT_EVENT","_loadClientBundle","loadClientBundle","_clientBundleOverride","getClientBundleOverride","isTrustedBundleHost","_clientBundleUrl","TEMPLATES_CDN_BASE","TEMPLATES_MANIFEST_URL","getTemplateOverride","isTemplatePickerRequested","isValidTemplateId","resolveClientBundleUrl","_mergeClientConfig","mergeClientConfig","_applyThemeOverrides","applyThemeOverrides","THEME_OVERRIDE_TOKENS","_tokenContract","THEME_TOKEN_CONTRACT","BRAND_TOKENS","EDITABLE_TOKENS","TOKEN_NAME_PATTERN","bucketOf","hostAliasFor","_themeDebug","isThemeDebugEnabled","THEME_DEBUG_KEY","THEME_DEBUG_QUERY_PARAM","_colorFormat","hexToHslTriplet","hslTripletToHex","isHslTriplet","_PlacementResponseRenderer","PlacementResponseRenderer","PlacementSmoothHeight","_buildPlacementDependencies","buildPlacementDependencies","_PlacementPayloadContext","PlacementPayloadProvider","usePlacementPayload","_unifiedMarkdownParser","UnifiedMarkdownParser","parseMarkdownToAst","parseAstToMarkdown","_markdownPreprocessor","escapeWeb5Links","fixMalformedLinks","trimTrailingWhitespace","normalizeIconUrls","decodeLinkText","preprocessMarkdown","_componentTracking","ComponentTracking","_contentKeywordMatcher","findKeywordsInContent","getContextualImageFilename","_intentExtractor","extractIntentFromMarkdown","getIntentFromMarkdown","_propsExtractor","createPageSection","generateSectionId","generateId","findImageInNode","findImageInChildren","_diagnosticsCollector","DiagnosticsCollector","_refreshPrompts","REFRESH_PROMPTS_UNTIL_KEY","REFRESH_PROMPTS_WINDOW_MS","getRefreshPromptsExpiry","shouldRefreshPrompts","enableRefreshPrompts","disableRefreshPrompts","_backendEnvironment","BACKEND_ENVIRONMENT_KEY","BACKEND_ENVIRONMENT_QUERY_PARAM","DEFAULT_BACKEND_ENVIRONMENT","getBackendEnvironment","setBackendEnvironment","usesStagingBackend","_simulation","isSimulationTraffic","_matchDebug","MATCH_DEBUG_KEY","MATCH_DEBUG_QUERY_PARAM","isMatchDebugEnabled","setMatchDebug","resetMatchDebugCache","logMatchDebug","_wixAuthFetch","createWixAuthFetch","_sessionManager","getOrCreateSessionId","getSessionId","getChatId","startNewChatId","setChatId","resetChatIdForTests","_componentParser","parseMarkdownToComponents","tryParseComponent","mergeSectionsWithStableReferences","_hostScope","WEB5_ROOT_ID","WEB5_ROOT_CLASS","WEB5_SCOPES","WEB5_SCOPE","WEB5_GLOBAL_TOKENS"],"sources":["../../src/index.ts"],"sourcesContent":["// Client IDs and experiment IDs\nexport { CLIENT_IDS, EXPERIMENT_IDS } from './clients';\n\nexport {\n type EmbedFeatureToggleResult,\n type FeatureToggleReader,\n createFeatureToggleReader,\n FeatureToggleProvider,\n useFeatureToggles,\n useFeatureToggle,\n} from './featureToggles/FeatureToggleContext';\n\n// Dev-only chrome injection contract for client packages\nexport type { DevEnvironment } from './client/devEnvironment';\n\n// Part types and helpers\nexport {\n type PartType,\n type Part,\n type HeadingPart,\n type ImagePart,\n type LinkPart,\n type ListPart,\n type ListItemPart,\n type KpiItemPart,\n type CardPart,\n type IconPart,\n type CalloutPart,\n type EntityPart,\n getPartsByType,\n getPartByRole,\n getAllByRole,\n getHeading,\n getImages,\n getLinks,\n extractContent,\n extractContentMarkdown,\n deriveRole,\n} from './parts/parts';\n\n// Component types\nexport type {\n BaseCompProps,\n SlotCompProps,\n SectionCompProps,\n SectionCompPropsWithSlot,\n TextCompProps,\n ButtonCompProps,\n ImageCompProps,\n BadgeCompProps,\n HeroButton,\n KpiItemCompProps,\n FeatureItemCompProps,\n FeatureCardCompProps,\n EntityItemData,\n EntityItem,\n GenericEntityData,\n GenericEntityCompProps,\n ComparisonRow,\n ComparisonColumn,\n AiNarrativeCompProps,\n HeroCompProps,\n HeroEntityCompProps,\n KpiCompProps,\n MetricsCompProps,\n MetricsItemCompProps,\n FeatureCardsCompProps,\n EntityCompProps,\n ComparisonCompProps,\n TextBlockCompProps,\n Component,\n BaseComponent,\n SlotComponent,\n SectionComponent,\n TextComponent,\n ButtonComponent,\n ImageComponent,\n BadgeComponent,\n KpiItemComponent,\n MetricsItemComponent,\n FeatureItemComponent,\n FeatureCardComponent,\n GenericEntityComponent,\n AiNarrativeComponent,\n ComparisonSectionComponent,\n TextBlockSectionComponent,\n HeroSectionComponent,\n HeroEntitySectionComponent,\n KpiSectionComponent,\n MetricsSectionComponent,\n FeatureCardsSectionComponent,\n EntitySectionComponent,\n PropsOf,\n SectionFixture,\n CtaBannerCompProps,\n CtaBannerSectionComponent,\n CalloutCompProps,\n CalloutSectionComponent,\n NextStepsCompProps,\n NextStepsSectionComponent,\n FeatureSection9PlusCompProps,\n FeatureSection9PlusSectionComponent,\n ListItemsSectionCompProps,\n ListItemsSectionComponent,\n ErrorCompProps,\n ErrorSectionComponent,\n NullCompProps,\n NullSectionComponent,\n SolutionEntityCompProps,\n SolutionEntitySectionComponent,\n SolutionEntityData,\n BlogEntityCompProps,\n BlogEntitySectionComponent,\n BlogEntityData,\n GeneralTextCompProps,\n GeneralTextSectionComponent,\n PersonalizedNarrativeCompProps,\n PersonalizedNarrativeSectionComponent,\n} from './component/types';\n\n// Section definition\nexport type {\n SectionDefinition,\n ParseContext,\n ContextualImageResult,\n DropSection,\n} from './component/section-definition';\nexport { DROP_SECTION } from './component/section-definition';\n\n// Diagnostic types\nexport { DIAGNOSTIC_TYPES } from './component/diagnosticTypes';\nexport type { DiagnosticType } from './component/diagnosticTypes';\n\n// Image search filters\nexport {\n buildImageSearchFilter,\n type ImageSearchFilterString,\n} from './image/imageSearchFilterTypes';\nexport {\n ImageSearchFilterToken,\n backgroundFilter,\n} from './image/imageSearchFilters';\nexport type {\n ContextualImageAsset,\n ImageSourceInput,\n ResolvedImageSource,\n ResolvedImageSourceKind,\n} from './image/contextualImageTypes';\n\n// Section definition classes + createSdkRegistry\nexport {\n HeroSectionDefinition,\n HeroEntitySectionDefinition,\n KpiSectionDefinition,\n MetricsSectionDefinition,\n FeatureCardsSectionDefinition,\n EntitySectionDefinition,\n EntityCollectionSectionDefinition,\n ComparisonSectionDefinition,\n TextBlockSectionDefinition,\n CtaBannerSectionDefinition,\n CalloutSectionDefinition,\n NextStepsSectionDefinition,\n FeatureSection9PlusDefinition,\n ListItemsSectionDefinition,\n SkipNodesSectionDefinition,\n HtmlCommentSectionDefinition,\n SearchSectionDefinition,\n ErrorSectionDefinition,\n FallbackSectionDefinition,\n createSdkRegistry,\n} from './component/componentDefinitions';\n\n// Registry\nexport { ComponentRegistry } from './registry';\nexport type {\n SlotOptions,\n SectionOptions,\n SectionRegistration,\n SlotNode,\n SlotIntentNode,\n SectionIntentNode,\n SectionNode,\n SlotVariant,\n SectionVariant,\n RegistryCatalog,\n ActionResult,\n ActionHandler,\n} from './registry';\n\n// Pattern validator\nexport {\n validatePattern,\n validatePatternSyntax,\n validatePatternWithBlocks,\n type PatternValidationResult,\n type BlockElement,\n type EnrichedBlockElement,\n type LinkMetadata,\n type LinkAttribute,\n} from './patternValidator';\n\n// Markdown blocks\nexport {\n convertToBlockElements,\n convertToBlockElementsWithMapping,\n type BlockElementsWithMapping,\n} from './markdownBlocks';\n\n// Link types, enum & guards\nexport {\n Web5UrlType,\n type Web5AskUrl,\n type Web5EntityUrl,\n type Web5ImageUrl,\n type Web5IconUrl,\n type Web5ActionUrl,\n type Web5SearchUrl,\n type Web5Url,\n type HttpsUrl,\n type HttpUrl,\n type MailtoUrl,\n type RelativeUrl,\n type NavigableUrl,\n type ValidLinkUrl,\n type AnyKnownUrl,\n type LegacyUrl,\n isWeb5AskUrl,\n isWeb5EntityUrl,\n isWeb5ImageUrl,\n isWeb5IconUrl,\n isWeb5ActionUrl,\n isWeb5SearchUrl,\n isWeb5Url,\n isNavigableUrl,\n isValidLinkUrl,\n isLegacyUrl,\n} from './types/link-types';\n\n// Entity/URL parsing\nexport {\n parseWeb5Url,\n isValidWeb5Url,\n validateLinkUrl,\n type Web5UrlParsed,\n type Web5AskParsed,\n type Web5EntityParsed,\n type Web5ImageParsed,\n type Web5IconParsed,\n type Web5ActionParsed,\n type Web5SearchParsed,\n isEntityLink,\n parseEntityLink,\n extractProtocol,\n extractLinkMetadata,\n} from './utils/entityLinkParser';\n\n// Web5 link validation\nexport {\n findInvalidWeb5Links,\n type InvalidWeb5Link,\n} from './utils/web5LinkValidator';\n\n// Node matchers\nexport { hasImage, isHtmlComment } from './utils/nodeMatchers';\n\n// Match API\nexport {\n matchMarkdown,\n type MarkdownMatchResult,\n matchAllSections,\n type MatchAllSectionsResult,\n nodesToParts,\n} from './match';\n\n// ---------------------------------------------------------------------------\n// DI Infrastructure (moved from @wix/w5-client-circana)\n// ---------------------------------------------------------------------------\n\n// DI context and provider\nexport {\n ComponentDependenciesProvider,\n useComponentDependencies,\n type ComponentDependenciesProviderProps,\n} from './context/ComponentDependenciesContext';\n\n// Raw user query for the current response page\nexport {\n UserQueryProvider,\n useUserQuery,\n type UserQueryProviderProps,\n} from './context/UserQueryContext';\n\n// Chips context (suggestion chips shared between SearchSection and error states)\nexport {\n ChipsProvider,\n useChips,\n type SuggestionChip,\n} from './context/ChipsContext';\n\n// DI types\nexport type {\n ComponentDependencies,\n Web5LinkApi,\n ConversationApi,\n SendMessageTrackingOptions,\n SendMessageOptions,\n ComparisonSubmitPayload,\n ComparisonSelectedProduct,\n ProductComparisonSelectionState,\n ProductComparisonApi,\n EntityTransforms,\n MarkdownUtils,\n ResolveGenericEntityDataOptions,\n} from './types/dependencies';\nexport type {\n ApiPayloadItem,\n EntityTypeConfig,\n EntityConfig,\n EntityExtractionContext,\n} from './types/entity';\nexport {\n defaultExtractor,\n enrichEntitiesFromPayload,\n entityHref,\n normalizeEntityItem,\n toCatalogPath,\n entityPayloadFromItems,\n mergeEntityData,\n fetchEntityListData,\n listEntityItems,\n LIST_ITEMS_ENDPOINT,\n getEntityExtractor,\n registerEntityExtractor,\n transformToSolutionEntityData,\n transformToBlogPostEntityData,\n transformToGenericEntityData,\n toMatchedOptions,\n formatMoney,\n readCurrencyCode,\n formatPriceField,\n formatProductPriceLabel,\n isProductFamilyEntityType,\n isDocumentFamilyEntityType,\n PLATFORM_ENTITY_TYPES,\n resolveEntityTypeConfig,\n} from './entity';\nexport type {\n EntityExtractor,\n FetchEntityListDataOptions,\n ListEntityItemsOptions,\n MatchedOption,\n ProductPriceFields,\n} from './entity';\nexport {\n CALLOUT_KINDS,\n CALLOUT_SEMANTICS,\n type CalloutKind,\n type CalloutSemantic,\n type Callout,\n} from './types/callout';\n\n// Wrapper hooks\nexport { useWeb5Link } from './hooks/useWeb5Link';\nexport { useConversation } from './hooks/useConversation';\nexport { useDebugImageContext } from './hooks/useDebugImageContext';\nexport { useResolvedImageSources } from './hooks/useResolvedImageSources';\n\n// Image slots (ADR 0222/0223/0225): a section declares the holes in its layout\n// and a per-section collector resolves them as one set. Replaces the per-image\n// `useResolvedImageSources` path above, which is kept until its callers move.\nexport { useImageSlot } from './hooks/useImageSlot';\nexport type {\n UseImageSlotOptions,\n ResolvedImage,\n} from './hooks/useImageSlot';\nexport {\n ImageSlotProvider,\n useImageSlotCollector,\n} from './context/ImageSlotContext';\nexport type {\n ImageSlotCollector,\n ImageSlotProviderProps,\n} from './context/ImageSlotContext';\nexport { composeSemantic } from './image/composeSemantic';\nexport type { ComposeSemanticInput } from './image/composeSemantic';\nexport type {\n ImageSlotKind,\n ImageMatchQuality,\n ImageKind,\n ImageBackground,\n ImageSlotRequest,\n ImagePalette,\n ImageStatGrid,\n ImageVisualMetadata,\n ResolvedImageSlot,\n ResolveImageSetResponse,\n ResolveImageSetPort,\n SlotState,\n ImageSubject,\n} from './image/imageSlotTypes';\nexport { useResolveGenericEntityData } from './hooks/useResolveGenericEntityData';\nexport { useEntityTransforms } from './hooks/useEntityTransforms';\nexport { useMarkdownUtils } from './hooks/useMarkdownUtils';\nexport { useResolveShopifyEntityData } from './hooks/useResolveShopifyEntityData';\nexport { useResolveSearchSpringEntityData } from './hooks/useResolveSearchSpringEntityData';\n\n// SearchSpring\nexport {\n fetchProductsByHandles,\n fetchProductsByHandlesMap,\n transformSSProductToEntityItemData,\n} from './services/searchspring';\nexport type {\n SearchSpringConfig,\n SSProduct,\n SSSearchResponse,\n SSSizeData,\n} from './services/searchspring';\n\n// Shopify Storefront API\n// Cart actions\nexport { addToCart } from './services/cart';\n\nexport {\n ShopifyStorefrontClient,\n resolveShopifyConfig,\n resolveShopifyEntity,\n transformShopifyProduct,\n transformShopifyCollection,\n transformShopifyArticle,\n transformShopifyEntityToItemData,\n PRODUCT_BY_HANDLE_QUERY,\n COLLECTION_BY_HANDLE_QUERY,\n ARTICLE_BY_HANDLE_QUERY,\n} from './services/shopify';\nexport type {\n ShopifyStorefrontConfig,\n ShopifyProduct,\n ShopifyCollection,\n ShopifyArticle,\n ShopifyImage,\n ShopifyMoneyV2,\n} from './services/shopify';\n\n// Utilities\nexport { cn } from './lib/utils';\nexport { normalizeImageUrl, getResizedImageUrl } from './utils/image-utils';\nexport {\n analyzeBackdrop,\n computeContentBBox,\n buildProbeUrl,\n loadImagePixels,\n loadBackdropAnalysis,\n type BackdropAnalysis,\n type ContentBBox,\n type ImagePixels,\n} from './utils/imageBackdrop';\nexport { stripMarkdown } from './component/componentDefinitions/parse-utils';\n\n// Color utilities\nexport {\n type RGB,\n rgbToHsl,\n hslToRgb,\n ensureMinLightness,\n toRgb,\n deriveDarkColor,\n deriveDarkGradient,\n deriveLightColor,\n} from './color/colorUtils';\n\n// Analytics\nexport {\n pushEvent,\n pushPromptSubmit,\n pushLinkClick,\n pushError,\n pushExit,\n pushEntityFiltered,\n hasAnalyticsConsent,\n type EntityFilteredReason,\n} from './utils/analyticsEvents';\n\n// Consent gate (DL #218)\nexport {\n type ConsentState,\n type ConsentPurpose,\n type GatedPurpose,\n type ConsentSnapshot,\n type ConsentProvider,\n type GateView,\n type HostConsentInput,\n UNKNOWN_CONSENT,\n HOST_CONSENT_GLOBAL,\n transmit,\n mayTransmit,\n unlockOnUserAction,\n isUserEngaged,\n mayPersistIdentity,\n getConsentSnapshot,\n getGateView,\n subscribeToConsent,\n installConsentProvider,\n getInstalledProviderName,\n setConsentBufferLimit,\n getConsentGateStats,\n resetConsentGateForTests,\n detectConsentProvider,\n initConsentGate,\n CONSENT_OVERRIDE_KEY,\n CONSENT_OVERRIDE_QUERY_PARAM,\n getConsentOverride,\n setConsentOverride,\n createShopifyConsentProvider,\n isShopifyHost,\n createOneTrustConsentProvider,\n isOneTrustHost,\n createHostSuppliedConsentProvider,\n hasHostSuppliedConsent,\n publishHostConsent,\n} from './privacy';\n\n// Error handling types and utilities\nexport {\n type ConversationErrorType,\n ERROR_MARKDOWN,\n getErrorTypeFromStatus,\n createErrorMarkdown,\n STREAMING_TIMEOUT_MS,\n type ErrorActionType,\n type ErrorIconType,\n type ErrorTemplateButton,\n type ErrorTemplate,\n type ErrorTemplateOverrides,\n DEFAULT_ERROR_TEMPLATES,\n resolveErrorTemplate,\n} from './errors';\n\n// Navigation utilities\nexport {\n getForwardStack,\n setForwardStack,\n clearForwardStack,\n pushToForwardStack,\n popFromForwardStack,\n} from './utils/navigationStack';\n\n// UI components\nexport {\n UserQuery,\n type UserQueryProps,\n type ProductBackContext,\n} from './components/ui/UserQuery';\nexport {\n PRODUCT_BACK_SESSION_KEY,\n writeProductBackHandoff,\n readProductBackHandoff,\n type ProductBackHandoff,\n} from './utils/productBackHandoff';\nexport {\n PromptEntryEmptyState,\n type PromptEntryEmptyStateProps,\n} from './components/ui/PromptEntryEmptyState';\nexport {\n SearchSection,\n type SearchSectionProps,\n type SearchSectionHandle,\n type ScrollChip,\n} from './components/ui/SearchSection';\nexport {\n FeedbackBar,\n type FeedbackBarProps,\n type FeedbackCategoryOption,\n type FeedbackSentiment,\n type FeedbackSubmitInput,\n} from './components/ui/FeedbackBar';\nexport { Disclaimer, type DisclaimerProps } from './components/ui/Disclaimer';\nexport {\n BottomContainer,\n type BottomContainerProps,\n} from './components/ui/BottomContainer';\nexport { MarkdownText } from './components/ui/MarkdownText';\nexport {\n CalloutBlock,\n type CalloutBlockProps,\n} from './components/ui/CalloutBlock';\nexport {\n OptimizedImage,\n type OptimizedImageProps,\n} from './components/ui/OptimizedImage';\nexport {\n SectionSkeleton,\n type SectionSkeletonProps,\n} from './components/ui/SectionSkeleton';\nexport { SmartIcon, type SmartIconProps } from './components/ui/SmartIcon';\nexport { Loader, type LoaderProps } from './components/ui/Loader';\nexport {\n PlacementLoader,\n type PlacementLoaderProps,\n} from './components/ui/PlacementLoader';\nexport {\n UnifiedLink,\n detectLinkType,\n type UnifiedLinkProps,\n LinkType,\n type LinkVariant,\n} from './components/ui/UnifiedLink';\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from './components/ui/table';\n\n// Placement (DL #088, DL #102 behavior declarations)\nexport type {\n PlacementBehaviorConfig,\n PlacementConfig,\n PlacementPrompts,\n} from './types/placement';\n\n// Cross-bundle user-query broadcast event (DL #097 D2)\nexport {\n WEB5_USER_QUERY_EVENT,\n type Web5UserQueryEventDetail,\n type Web5UserQueryEvent,\n} from './types/userQueryEvent';\n\n// Cross-bundle answer-updated broadcast event (B2B-4121)\nexport {\n WEB5_ANSWER_UPDATED_EVENT,\n type Web5AnswerUpdatedEventDetail,\n type Web5AnswerUpdatedEvent,\n} from './types/answerUpdatedEvent';\nexport {\n WEB5_ANSWER_SETTLED_EVENT,\n type Web5AnswerSettledStatus,\n type Web5AnswerSettledEventDetail,\n type Web5AnswerSettledEvent,\n} from './types/answerSettledEvent';\n\n// Cross-bundle redirect broadcast event (DL #098 D3)\nexport {\n WEB5_REDIRECT_EVENT,\n type Web5RedirectEventDetail,\n type Web5RedirectEvent,\n type Web5RedirectReason,\n} from './types/redirectEvent';\n// `placementFilter` was removed — hero/next-steps exclusion is the prompt's job\n// and placement-specific designs belong as `{ placement: true }` registry\n// variants (resolved automatically via `resolveSection(type, { placement: true })`).\n\n// Client bundle loader (DL #088 D3.3)\nexport { loadClientBundle } from './client/loadClientBundle';\n\n// `?clientBundleUrl=` dev override — shared by `web50-server-ui` and\n// `embed-placement` so the trusted-host gate can't drift between them.\nexport {\n getClientBundleOverride,\n isTrustedBundleHost,\n} from './client/clientBundleOverride';\n\n// Client-UMD URL resolution (DL #094 per-msid, DL #129 per-template) and the\n// universal bundle←backend config merge (DL #129 Q3/Q7) — shared by\n// `web50-server-ui` and `embed-placement`, the two client-bundle load sites.\nexport {\n TEMPLATES_CDN_BASE,\n TEMPLATES_MANIFEST_URL,\n getTemplateOverride,\n isTemplatePickerRequested,\n isValidTemplateId,\n resolveClientBundleUrl,\n} from './client/clientBundleUrl';\nexport {\n mergeClientConfig,\n type DeepPartial,\n} from './client/mergeClientConfig';\nexport {\n applyThemeOverrides,\n THEME_OVERRIDE_TOKENS,\n type ThemeOverrideKey,\n type ThemeOverrides,\n} from './client/applyThemeOverrides';\nexport {\n THEME_TOKEN_CONTRACT,\n BRAND_TOKENS,\n EDITABLE_TOKENS,\n TOKEN_NAME_PATTERN,\n bucketOf,\n hostAliasFor,\n type TokenBucket,\n type TokenContractEntry,\n type TokenType,\n} from './theme/tokenContract';\nexport {\n isThemeDebugEnabled,\n THEME_DEBUG_KEY,\n THEME_DEBUG_QUERY_PARAM,\n type AppliedToken,\n type ThemeOverrideSource,\n} from './client/themeDebug';\nexport {\n hexToHslTriplet,\n hslTripletToHex,\n isHslTriplet,\n} from './theme/colorFormat';\n\n// Placement renderer + DI helper (DL #088 D3.2, D3.4)\nexport {\n PlacementResponseRenderer,\n PlacementSmoothHeight,\n type PlacementResponseRendererProps,\n type PlacementSection,\n type PlacementVariant,\n} from './components/placement/PlacementResponseRenderer';\nexport {\n buildPlacementDependencies,\n type BuildPlacementDependenciesOptions,\n} from './components/placement/buildPlacementDependencies';\nexport {\n PlacementPayloadProvider,\n usePlacementPayload,\n type PlacementPayloadContextValue,\n} from './components/placement/PlacementPayloadContext';\n\n// Markdown parsing utilities — lifted from web50-server-ui (DL #088 B9.1)\nexport {\n UnifiedMarkdownParser,\n parseMarkdownToAst,\n parseAstToMarkdown,\n} from './utils/unifiedMarkdownParser';\nexport {\n escapeWeb5Links,\n fixMalformedLinks,\n trimTrailingWhitespace,\n normalizeIconUrls,\n decodeLinkText,\n preprocessMarkdown,\n type PreprocessorDiagnostic,\n type PreprocessResult,\n} from './utils/markdownPreprocessor';\nexport {\n ComponentTracking,\n type ComponentNodeRange,\n} from './utils/componentTracking';\nexport {\n findKeywordsInContent,\n getContextualImageFilename,\n} from './utils/contentKeywordMatcher';\nexport {\n extractIntentFromMarkdown,\n getIntentFromMarkdown,\n type IntentInfo,\n type IntentExtractionOptions,\n type ResponseState,\n} from './utils/intentExtractor';\nexport type { PageSection } from './types/page-section';\nexport {\n createPageSection,\n generateSectionId,\n generateId,\n findImageInNode,\n findImageInChildren,\n type Product,\n type ComparisonProduct,\n type ProductComparisonSectionProps,\n} from './utils/propsExtractor';\nexport {\n DiagnosticsCollector,\n type DiagnosticEntry,\n} from './utils/diagnosticsCollector';\nexport {\n REFRESH_PROMPTS_UNTIL_KEY,\n REFRESH_PROMPTS_WINDOW_MS,\n getRefreshPromptsExpiry,\n shouldRefreshPrompts,\n enableRefreshPrompts,\n disableRefreshPrompts,\n} from './utils/refreshPrompts';\nexport {\n type BackendEnvironment,\n BACKEND_ENVIRONMENT_KEY,\n BACKEND_ENVIRONMENT_QUERY_PARAM,\n DEFAULT_BACKEND_ENVIRONMENT,\n getBackendEnvironment,\n setBackendEnvironment,\n usesStagingBackend,\n} from './utils/backendEnvironment';\nexport { isSimulationTraffic } from './utils/simulation';\nexport {\n MATCH_DEBUG_KEY,\n MATCH_DEBUG_QUERY_PARAM,\n isMatchDebugEnabled,\n setMatchDebug,\n resetMatchDebugCache,\n logMatchDebug,\n} from './utils/matchDebug';\nexport { createWixAuthFetch } from './client/wixAuthFetch';\nexport {\n getOrCreateSessionId,\n getSessionId,\n getChatId,\n startNewChatId,\n setChatId,\n resetChatIdForTests,\n} from './utils/sessionManager';\n\n// Component parser orchestrator — lifted from web50-server-ui (DL #088 B9.5)\nexport {\n parseMarkdownToComponents,\n tryParseComponent,\n mergeSectionsWithStableReferences,\n type ParseMarkdownOptions,\n type ParseMarkdownResult,\n type ComponentMatch,\n type ParserContext,\n} from './component/componentParser';\nexport type {\n ParserClientConfig,\n EnrichEntityProps,\n} from './component/parser-types';\n\n// Host-mount scope contract — shared by web50-server-ui (which stamps the\n// class and mounts), embed-placement (which mounts the same bundle elsewhere),\n// and the client CDN build (which compiles every selector against it).\nexport {\n WEB5_ROOT_ID,\n WEB5_ROOT_CLASS,\n WEB5_SCOPES,\n WEB5_SCOPE,\n WEB5_GLOBAL_TOKENS,\n type HostFitConfig,\n} from './hostScope';\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import { headingMarkdown, bodyText, calloutFromParts, firstImageSrc, firstLink, stripMarkdown } from './parse-utils.js';
2
+ import { headingMarkdown, proseBodyMarkdown, calloutFromParts, firstImageSrc, firstLink, stripMarkdown } from './parse-utils.js';
3
3
  export class FeatureCardsSectionDefinition {
4
4
  constructor() {
5
5
  _defineProperty(this, "sectionType", 'featureCards');
@@ -81,10 +81,21 @@ Description B.`,
81
81
  for (const group of groups) {
82
82
  const title = headingMarkdown(group, 2) || headingMarkdown(group, 3) || '';
83
83
  let imageUrl = firstImageSrc(group);
84
- const description = bodyText(group) || '';
84
+ // Both `FeatureCardsSection` renderers put this through `MarkdownText`,
85
+ // so a link inside a sentence has to survive: `bodyText` kept only text
86
+ // parts and joined them with a blank line, so `Email support@shop.example
87
+ // anytime` arrived as "Email\n\nanytime" — address gone, sentence split
88
+ // at the gap (GFM autolinks a bare email into a `link` node, so this
89
+ // needed no author). `proseBodyMarkdown` rather than `bodyMarkdown`
90
+ // because a links-only paragraph is the card's own CTA, read below into
91
+ // `linkText` / `linkHref`; keeping it here would render it twice.
92
+ const description = proseBodyMarkdown(group) || '';
85
93
  let imageFromText;
86
94
  if (!imageUrl && context != null && context.getContextualImage) {
87
- const contentParts = [stripMarkdown(title), description];
95
+ // Strip before keyword matching, as the title already is: the matcher
96
+ // scans for whole words, and a raw `](web5://ask/hydration)` would let
97
+ // a url slug pick the card's image.
98
+ const contentParts = [stripMarkdown(title), stripMarkdown(description)];
88
99
  const result = context.getContextualImage(contentParts);
89
100
  if (result) {
90
101
  imageUrl = result.filename;
@@ -1 +1 @@
1
- {"version":3,"names":["headingMarkdown","bodyText","calloutFromParts","firstImageSrc","firstLink","stripMarkdown","FeatureCardsSectionDefinition","constructor","_defineProperty","cards","title","description","markdown","expected","callout","text","kind","parse","parts","context","groups","current","part","type","some","p","push","length","group","imageUrl","imageFromText","getContextualImage","contentParts","result","filename","isFromText","undefined","link","linkText","linkHref","href"],"sources":["../../../../src/component/componentDefinitions/FeatureCardsSectionDefinition.ts"],"sourcesContent":["import type { Part } from '../../parts/parts';\nimport {\n headingMarkdown,\n bodyText,\n calloutFromParts,\n firstImageSrc,\n firstLink,\n stripMarkdown,\n} from './parse-utils';\nimport type {\n FeatureCardCompProps,\n FeatureCardsCompProps,\n FeatureCardsSectionComponent,\n SectionFixture,\n} from '../types';\nimport type { SectionDefinition, ParseContext } from '../section-definition';\n\nexport class FeatureCardsSectionDefinition\n implements SectionDefinition<FeatureCardsSectionComponent>\n{\n sectionType = 'featureCards' as const;\n patterns = [\n '(html_comment[section^=\"information\"] > h2 > image? > t+ > link? > callout?)[2-]',\n ];\n\n defaults: FeatureCardsCompProps = {\n cards: [\n {\n title: 'Feature 1',\n description: 'Description of feature 1',\n },\n ],\n };\n\n fixtures: SectionFixture<FeatureCardsCompProps>[] = [\n {\n markdown: `<!-- section: information, reason: first card -->\n## Fast\n\nLightning quick performance\n\n> [!TIP] Speed is everything.\n\n<!-- section: information, reason: second card -->\n## Secure\n\nEnterprise-grade security\n\n> [!NOTE] Built with best practices.`,\n expected: {\n cards: [\n {\n title: 'Fast',\n description: 'Lightning quick performance',\n callout: { text: 'Speed is everything.', kind: 'TIP' },\n },\n {\n title: 'Secure',\n description: 'Enterprise-grade security',\n callout: { text: 'Built with best practices.', kind: 'NOTE' },\n },\n ],\n },\n },\n {\n markdown: `## Feature A\n\nFirst paragraph.\n\nSecond paragraph with more detail.\n\n## Feature B\n\nDescription B.`,\n expected: {\n cards: [\n {\n title: 'Feature A',\n description:\n 'First paragraph.\\n\\nSecond paragraph with more detail.',\n },\n { title: 'Feature B', description: 'Description B.' },\n ],\n },\n },\n ];\n\n parse(parts: Part[], context?: ParseContext): FeatureCardsCompProps {\n // Split flat parts into groups by heading boundaries\n const groups: Part[][] = [];\n let current: Part[] = [];\n\n for (const part of parts) {\n if (\n part.type === 'heading' &&\n current.some((p) => p.type === 'heading')\n ) {\n groups.push(current);\n current = [part];\n } else {\n current.push(part);\n }\n }\n if (current.length > 0 && current.some((p) => p.type === 'heading')) {\n groups.push(current);\n }\n\n const cards: FeatureCardCompProps[] = [];\n for (const group of groups) {\n const title =\n headingMarkdown(group, 2) || headingMarkdown(group, 3) || '';\n let imageUrl = firstImageSrc(group);\n const description = bodyText(group) || '';\n\n let imageFromText: boolean | undefined;\n if (!imageUrl && context?.getContextualImage) {\n const contentParts = [stripMarkdown(title), description];\n const result = context.getContextualImage(contentParts);\n if (result) {\n imageUrl = result.filename;\n imageFromText = result.isFromText || undefined;\n }\n }\n const link = firstLink(group);\n const linkText = link?.text || undefined;\n const linkHref = link?.href || undefined;\n const callout = calloutFromParts(group);\n\n cards.push({\n title,\n description,\n imageUrl,\n imageFromText,\n linkText,\n linkHref,\n callout,\n });\n }\n\n return { cards };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["headingMarkdown","proseBodyMarkdown","calloutFromParts","firstImageSrc","firstLink","stripMarkdown","FeatureCardsSectionDefinition","constructor","_defineProperty","cards","title","description","markdown","expected","callout","text","kind","parse","parts","context","groups","current","part","type","some","p","push","length","group","imageUrl","imageFromText","getContextualImage","contentParts","result","filename","isFromText","undefined","link","linkText","linkHref","href"],"sources":["../../../../src/component/componentDefinitions/FeatureCardsSectionDefinition.ts"],"sourcesContent":["import type { Part } from '../../parts/parts';\nimport {\n headingMarkdown,\n proseBodyMarkdown,\n calloutFromParts,\n firstImageSrc,\n firstLink,\n stripMarkdown,\n} from './parse-utils';\nimport type {\n FeatureCardCompProps,\n FeatureCardsCompProps,\n FeatureCardsSectionComponent,\n SectionFixture,\n} from '../types';\nimport type { SectionDefinition, ParseContext } from '../section-definition';\n\nexport class FeatureCardsSectionDefinition\n implements SectionDefinition<FeatureCardsSectionComponent>\n{\n sectionType = 'featureCards' as const;\n patterns = [\n '(html_comment[section^=\"information\"] > h2 > image? > t+ > link? > callout?)[2-]',\n ];\n\n defaults: FeatureCardsCompProps = {\n cards: [\n {\n title: 'Feature 1',\n description: 'Description of feature 1',\n },\n ],\n };\n\n fixtures: SectionFixture<FeatureCardsCompProps>[] = [\n {\n markdown: `<!-- section: information, reason: first card -->\n## Fast\n\nLightning quick performance\n\n> [!TIP] Speed is everything.\n\n<!-- section: information, reason: second card -->\n## Secure\n\nEnterprise-grade security\n\n> [!NOTE] Built with best practices.`,\n expected: {\n cards: [\n {\n title: 'Fast',\n description: 'Lightning quick performance',\n callout: { text: 'Speed is everything.', kind: 'TIP' },\n },\n {\n title: 'Secure',\n description: 'Enterprise-grade security',\n callout: { text: 'Built with best practices.', kind: 'NOTE' },\n },\n ],\n },\n },\n {\n markdown: `## Feature A\n\nFirst paragraph.\n\nSecond paragraph with more detail.\n\n## Feature B\n\nDescription B.`,\n expected: {\n cards: [\n {\n title: 'Feature A',\n description:\n 'First paragraph.\\n\\nSecond paragraph with more detail.',\n },\n { title: 'Feature B', description: 'Description B.' },\n ],\n },\n },\n ];\n\n parse(parts: Part[], context?: ParseContext): FeatureCardsCompProps {\n // Split flat parts into groups by heading boundaries\n const groups: Part[][] = [];\n let current: Part[] = [];\n\n for (const part of parts) {\n if (\n part.type === 'heading' &&\n current.some((p) => p.type === 'heading')\n ) {\n groups.push(current);\n current = [part];\n } else {\n current.push(part);\n }\n }\n if (current.length > 0 && current.some((p) => p.type === 'heading')) {\n groups.push(current);\n }\n\n const cards: FeatureCardCompProps[] = [];\n for (const group of groups) {\n const title =\n headingMarkdown(group, 2) || headingMarkdown(group, 3) || '';\n let imageUrl = firstImageSrc(group);\n // Both `FeatureCardsSection` renderers put this through `MarkdownText`,\n // so a link inside a sentence has to survive: `bodyText` kept only text\n // parts and joined them with a blank line, so `Email support@shop.example\n // anytime` arrived as \"Email\\n\\nanytime\" — address gone, sentence split\n // at the gap (GFM autolinks a bare email into a `link` node, so this\n // needed no author). `proseBodyMarkdown` rather than `bodyMarkdown`\n // because a links-only paragraph is the card's own CTA, read below into\n // `linkText` / `linkHref`; keeping it here would render it twice.\n const description = proseBodyMarkdown(group) || '';\n\n let imageFromText: boolean | undefined;\n if (!imageUrl && context?.getContextualImage) {\n // Strip before keyword matching, as the title already is: the matcher\n // scans for whole words, and a raw `](web5://ask/hydration)` would let\n // a url slug pick the card's image.\n const contentParts = [stripMarkdown(title), stripMarkdown(description)];\n const result = context.getContextualImage(contentParts);\n if (result) {\n imageUrl = result.filename;\n imageFromText = result.isFromText || undefined;\n }\n }\n const link = firstLink(group);\n const linkText = link?.text || undefined;\n const linkHref = link?.href || undefined;\n const callout = calloutFromParts(group);\n\n cards.push({\n title,\n description,\n imageUrl,\n imageFromText,\n linkText,\n linkHref,\n callout,\n });\n }\n\n return { cards };\n }\n}\n"],"mappings":";AACA,SACEA,eAAe,EACfC,iBAAiB,EACjBC,gBAAgB,EAChBC,aAAa,EACbC,SAAS,EACTC,aAAa,QACR,eAAe;AAStB,OAAO,MAAMC,6BAA6B,CAE1C;EAAAC,YAAA;IAAAC,eAAA,sBACgB,cAAc;IAAAA,eAAA,mBACjB,CACT,kFAAkF,CACnF;IAAAA,eAAA,mBAEiC;MAChCC,KAAK,EAAE,CACL;QACEC,KAAK,EAAE,WAAW;QAClBC,WAAW,EAAE;MACf,CAAC;IAEL,CAAC;IAAAH,eAAA,mBAEmD,CAClD;MACEI,QAAQ,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;MAC/BC,QAAQ,EAAE;QACRJ,KAAK,EAAE,CACL;UACEC,KAAK,EAAE,MAAM;UACbC,WAAW,EAAE,6BAA6B;UAC1CG,OAAO,EAAE;YAAEC,IAAI,EAAE,sBAAsB;YAAEC,IAAI,EAAE;UAAM;QACvD,CAAC,EACD;UACEN,KAAK,EAAE,QAAQ;UACfC,WAAW,EAAE,2BAA2B;UACxCG,OAAO,EAAE;YAAEC,IAAI,EAAE,4BAA4B;YAAEC,IAAI,EAAE;UAAO;QAC9D,CAAC;MAEL;IACF,CAAC,EACD;MACEJ,QAAQ,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;MACTC,QAAQ,EAAE;QACRJ,KAAK,EAAE,CACL;UACEC,KAAK,EAAE,WAAW;UAClBC,WAAW,EACT;QACJ,CAAC,EACD;UAAED,KAAK,EAAE,WAAW;UAAEC,WAAW,EAAE;QAAiB,CAAC;MAEzD;IACF,CAAC,CACF;EAAA;EAEDM,KAAKA,CAACC,KAAa,EAAEC,OAAsB,EAAyB;IAClE;IACA,MAAMC,MAAgB,GAAG,EAAE;IAC3B,IAAIC,OAAe,GAAG,EAAE;IAExB,KAAK,MAAMC,IAAI,IAAIJ,KAAK,EAAE;MACxB,IACEI,IAAI,CAACC,IAAI,KAAK,SAAS,IACvBF,OAAO,CAACG,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACF,IAAI,KAAK,SAAS,CAAC,EACzC;QACAH,MAAM,CAACM,IAAI,CAACL,OAAO,CAAC;QACpBA,OAAO,GAAG,CAACC,IAAI,CAAC;MAClB,CAAC,MAAM;QACLD,OAAO,CAACK,IAAI,CAACJ,IAAI,CAAC;MACpB;IACF;IACA,IAAID,OAAO,CAACM,MAAM,GAAG,CAAC,IAAIN,OAAO,CAACG,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACF,IAAI,KAAK,SAAS,CAAC,EAAE;MACnEH,MAAM,CAACM,IAAI,CAACL,OAAO,CAAC;IACtB;IAEA,MAAMZ,KAA6B,GAAG,EAAE;IACxC,KAAK,MAAMmB,KAAK,IAAIR,MAAM,EAAE;MAC1B,MAAMV,KAAK,GACTV,eAAe,CAAC4B,KAAK,EAAE,CAAC,CAAC,IAAI5B,eAAe,CAAC4B,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE;MAC9D,IAAIC,QAAQ,GAAG1B,aAAa,CAACyB,KAAK,CAAC;MACnC;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,MAAMjB,WAAW,GAAGV,iBAAiB,CAAC2B,KAAK,CAAC,IAAI,EAAE;MAElD,IAAIE,aAAkC;MACtC,IAAI,CAACD,QAAQ,IAAIV,OAAO,YAAPA,OAAO,CAAEY,kBAAkB,EAAE;QAC5C;QACA;QACA;QACA,MAAMC,YAAY,GAAG,CAAC3B,aAAa,CAACK,KAAK,CAAC,EAAEL,aAAa,CAACM,WAAW,CAAC,CAAC;QACvE,MAAMsB,MAAM,GAAGd,OAAO,CAACY,kBAAkB,CAACC,YAAY,CAAC;QACvD,IAAIC,MAAM,EAAE;UACVJ,QAAQ,GAAGI,MAAM,CAACC,QAAQ;UAC1BJ,aAAa,GAAGG,MAAM,CAACE,UAAU,IAAIC,SAAS;QAChD;MACF;MACA,MAAMC,IAAI,GAAGjC,SAAS,CAACwB,KAAK,CAAC;MAC7B,MAAMU,QAAQ,GAAG,CAAAD,IAAI,oBAAJA,IAAI,CAAEtB,IAAI,KAAIqB,SAAS;MACxC,MAAMG,QAAQ,GAAG,CAAAF,IAAI,oBAAJA,IAAI,CAAEG,IAAI,KAAIJ,SAAS;MACxC,MAAMtB,OAAO,GAAGZ,gBAAgB,CAAC0B,KAAK,CAAC;MAEvCnB,KAAK,CAACiB,IAAI,CAAC;QACThB,KAAK;QACLC,WAAW;QACXkB,QAAQ;QACRC,aAAa;QACbQ,QAAQ;QACRC,QAAQ;QACRzB;MACF,CAAC,CAAC;IACJ;IAEA,OAAO;MAAEL;IAAM,CAAC;EAClB;AACF","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import { headingText, headingMarkdown, proseBodyMarkdown, firstImageSrc, parseCalloutTag, extractListItemText } from './parse-utils.js';
3
- import { getPartsByType, getLinks } from '../../parts/parts.js';
2
+ import { headingText, headingMarkdown, proseBodyMarkdown, firstImageSrc, parseCalloutTag, extractListItemText, standaloneLinks } from './parse-utils.js';
3
+ import { getPartsByType } from '../../parts/parts.js';
4
4
  export class HeroSectionDefinition {
5
5
  constructor() {
6
6
  _defineProperty(this, "sectionType", 'hero');
@@ -87,9 +87,13 @@ Get started today with our amazing features.
87
87
  }
88
88
  }
89
89
 
90
- // Start with top-level links as buttons
90
+ // Start with the hero's own button row. NOT every top-level link: a link
91
+ // inside a prose paragraph is a top-level part too, so `getLinks` handed
92
+ // `Email support@shop.example` the `btn-0` / primary slot and pushed the
93
+ // real call to action down to secondary. `standaloneLinks` keeps only a
94
+ // link that stands alone as its own block, which is the row the hero means.
91
95
  let buttonIndex = 0;
92
- const buttons = getLinks(parts).map((l, i) => {
96
+ const buttons = standaloneLinks(parts).map((l, i) => {
93
97
  var _l$content;
94
98
  return {
95
99
  id: `btn-${i}`,
@@ -1 +1 @@
1
- {"version":3,"names":["headingText","headingMarkdown","proseBodyMarkdown","firstImageSrc","parseCalloutTag","extractListItemText","getPartsByType","getLinks","HeroSectionDefinition","constructor","_defineProperty","headline","content","buttons","id","text","variant","markdown","expected","onClick","image","parse","parts","lists","list","item","_list$meta","meta","items","_item$meta","itemParts","nestedImage","buttonIndex","map","l","i","_l$content","trim","href","length","trailingList","filteredItems","_list$meta2","_item$meta2","hasImage","some","p","type","push","allItemsAreLinks","listLinks","_item$meta3","_itemLinkParts$0$cont","itemLinkParts","filter","allText","linkTexts","_l$content2","join","link","isFirstButton","lines","_item$meta4","h1Index","findIndex","_p$meta","level","blockquotes","leadingQuote","bq","_bq$meta","_bq$content","bqIndex","indexOf","raw","undefined","badge"],"sources":["../../../../src/component/componentDefinitions/HeroSectionDefinition.ts"],"sourcesContent":["import {\n headingText,\n headingMarkdown,\n proseBodyMarkdown,\n firstImageSrc,\n parseCalloutTag,\n extractListItemText,\n} from './parse-utils';\nimport type { Part, ListPart, LinkPart, ListItemPart } from '../../parts/parts';\nimport { getPartsByType, getLinks } from '../../parts/parts';\nimport type {\n HeroButton,\n HeroCompProps,\n HeroSectionComponent,\n SectionFixture,\n} from '../types';\nimport type { SectionDefinition } from '../section-definition';\n\nexport class HeroSectionDefinition\n implements SectionDefinition<HeroSectionComponent>\n{\n sectionType = 'hero' as const;\n singleInstance = true;\n patterns = [\n // Canonical hero shape: section descriptor, then the leading ECHO callout\n // (optional in the grammar — the orchestrator always emits it, but a missing\n // ECHO must not stop the hero from rendering), then an optional h3 badge,\n // then the h1. The callout and badge are independent slots so a hero can\n // carry both. The second `html_comment?` keeps the legacy ordering\n // (callout before the descriptor) matching for pages saved before this change.\n 'html_comment? > callout? > html_comment? > h3? > h1 > (image | t | link)* > list?',\n ];\n\n defaults: HeroCompProps = {\n headline: 'Build something amazing',\n content: 'Your platform for data-driven decisions.',\n buttons: [{ id: 'btn-0', text: 'Get started', variant: 'primary' }],\n };\n\n fixtures: SectionFixture<HeroCompProps>[] = [\n {\n markdown:\n '# Welcome\\n\\nBuild amazing things.\\n\\n[Get Started](/) [Learn More](/about)',\n expected: {\n headline: 'Welcome',\n content: 'Build amazing things.',\n buttons: [\n {\n id: 'btn-0',\n text: 'Get Started',\n variant: 'primary',\n onClick: '/',\n },\n {\n id: 'btn-1',\n text: 'Learn More',\n variant: 'secondary',\n onClick: '/about',\n },\n ],\n },\n },\n {\n markdown: `<!-- Hero Section -->\n\n# Welcome to Our Platform\n\n![Hero Image](hero.jpg)\n\nGet started today with our amazing features.\n\n[Get Started](/signup) [Learn More](/about)`,\n expected: {\n headline: 'Welcome to Our Platform',\n content: 'Get started today with our amazing features.',\n buttons: [\n {\n id: 'btn-0',\n text: 'Get Started',\n variant: 'primary',\n onClick: '/signup',\n },\n {\n id: 'btn-1',\n text: 'Learn More',\n variant: 'secondary',\n onClick: '/about',\n },\n ],\n image: 'hero.jpg',\n },\n },\n ];\n\n parse(parts: Part[]): HeroCompProps {\n let image = firstImageSrc(parts);\n const lists = getPartsByType<ListPart>(parts, 'list');\n\n if (!image) {\n for (const list of lists) {\n for (const item of list.meta?.items ?? []) {\n const itemParts = (item.meta?.parts ?? []) as Part[];\n const nestedImage = firstImageSrc(itemParts);\n if (nestedImage) {\n image = nestedImage;\n break;\n }\n }\n if (image) {\n break;\n }\n }\n }\n\n // Start with top-level links as buttons\n let buttonIndex = 0;\n const buttons: HeroButton[] = getLinks(parts).map(\n (l, i): HeroButton => ({\n id: `btn-${i}`,\n text: l.content?.trim() || 'Learn more',\n variant: i === 0 ? 'primary' : 'secondary',\n onClick: l.meta.href,\n }),\n );\n buttonIndex = buttons.length;\n\n // Process lists: filter out image-only items, then check if remaining\n // items are all link-only. If so, convert to buttons; otherwise keep as trailingList.\n let trailingList: string | undefined;\n if (lists.length > 0) {\n for (const list of lists) {\n // Filter out image-only items\n const filteredItems: ListItemPart[] = [];\n for (const item of list.meta?.items ?? []) {\n const itemParts = (item.meta?.parts ?? []) as Part[];\n const hasImage = itemParts.some((p) => p.type === 'image');\n if (hasImage) {\n continue;\n }\n filteredItems.push(item);\n }\n\n if (filteredItems.length === 0) {\n continue;\n }\n\n // Check if ALL remaining items contain only links (no other text)\n let allItemsAreLinks = true;\n const listLinks: { text: string; href: string }[] = [];\n\n for (const item of filteredItems) {\n const itemParts = (item.meta?.parts ?? []) as Part[];\n const itemLinkParts = itemParts.filter(\n (p): p is LinkPart => p.type === 'link',\n );\n\n if (itemLinkParts.length === 0) {\n allItemsAreLinks = false;\n break;\n }\n\n // Check if the item text is entirely link text (no extra content)\n const allText = extractListItemText(item).trim();\n const linkTexts = itemLinkParts\n .map((l) => l.content?.trim() || '')\n .join(' ')\n .trim();\n\n if (allText !== linkTexts) {\n allItemsAreLinks = false;\n break;\n }\n\n listLinks.push({\n text: itemLinkParts[0].content?.trim() || 'Learn more',\n href: itemLinkParts[0].meta.href,\n });\n }\n\n if (allItemsAreLinks && listLinks.length > 0) {\n // Convert link-only list items to buttons\n for (const link of listLinks) {\n const isFirstButton = buttons.length === 0;\n buttons.push({\n id: `btn-${buttonIndex++}`,\n text: link.text,\n variant: isFirstButton ? 'primary' : 'secondary',\n onClick: link.href,\n });\n }\n } else {\n // Keep as trailing list markdown\n const lines: string[] = [];\n for (const item of filteredItems) {\n const text =\n (item.meta?.markdown as string) || extractListItemText(item);\n if (text) {\n lines.push(`- ${text}`);\n }\n }\n if (lines.length > 0) {\n trailingList = lines.join('\\n');\n }\n }\n }\n }\n\n // The hero claims the leading callout before the h1 — the ECHO the\n // orchestrator emits as the hero's opening line, right after the section\n // descriptor. A trailing blockquote is not part of the hero pattern, so it\n // falls through to a downstream callout section instead.\n const h1Index = parts.findIndex(\n (p) => p.type === 'heading' && (p.meta as { level: number })?.level === 1,\n );\n const blockquotes = getPartsByType<Part>(parts, 'callout');\n let leadingQuote: string | undefined;\n\n for (const bq of blockquotes) {\n const bqIndex = parts.indexOf(bq);\n if (h1Index >= 0 && bqIndex > h1Index) {\n continue;\n }\n const raw = (bq.meta?.markdown as string)?.trim() || bq.content?.trim();\n if (!raw) {\n continue;\n }\n leadingQuote = parseCalloutTag(raw).text || undefined;\n }\n\n return {\n // Markdown-preserving (not headingText): the hero title now carries the\n // bold+italic hook the ECHO callout used to own, so the FE needs the\n // formatting, not just the plain text. See FeatureComparisonHero.tsx.\n headline: headingMarkdown(parts, 1),\n badge: headingText(parts, 3) || undefined,\n content: proseBodyMarkdown(parts) || undefined,\n buttons: buttons.length > 0 ? buttons : undefined,\n image,\n trailingList,\n leadingQuote,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["headingText","headingMarkdown","proseBodyMarkdown","firstImageSrc","parseCalloutTag","extractListItemText","standaloneLinks","getPartsByType","HeroSectionDefinition","constructor","_defineProperty","headline","content","buttons","id","text","variant","markdown","expected","onClick","image","parse","parts","lists","list","item","_list$meta","meta","items","_item$meta","itemParts","nestedImage","buttonIndex","map","l","i","_l$content","trim","href","length","trailingList","filteredItems","_list$meta2","_item$meta2","hasImage","some","p","type","push","allItemsAreLinks","listLinks","_item$meta3","_itemLinkParts$0$cont","itemLinkParts","filter","allText","linkTexts","_l$content2","join","link","isFirstButton","lines","_item$meta4","h1Index","findIndex","_p$meta","level","blockquotes","leadingQuote","bq","_bq$meta","_bq$content","bqIndex","indexOf","raw","undefined","badge"],"sources":["../../../../src/component/componentDefinitions/HeroSectionDefinition.ts"],"sourcesContent":["import {\n headingText,\n headingMarkdown,\n proseBodyMarkdown,\n firstImageSrc,\n parseCalloutTag,\n extractListItemText,\n standaloneLinks,\n} from './parse-utils';\nimport type { Part, ListPart, LinkPart, ListItemPart } from '../../parts/parts';\nimport { getPartsByType } from '../../parts/parts';\nimport type {\n HeroButton,\n HeroCompProps,\n HeroSectionComponent,\n SectionFixture,\n} from '../types';\nimport type { SectionDefinition } from '../section-definition';\n\nexport class HeroSectionDefinition\n implements SectionDefinition<HeroSectionComponent>\n{\n sectionType = 'hero' as const;\n singleInstance = true;\n patterns = [\n // Canonical hero shape: section descriptor, then the leading ECHO callout\n // (optional in the grammar — the orchestrator always emits it, but a missing\n // ECHO must not stop the hero from rendering), then an optional h3 badge,\n // then the h1. The callout and badge are independent slots so a hero can\n // carry both. The second `html_comment?` keeps the legacy ordering\n // (callout before the descriptor) matching for pages saved before this change.\n 'html_comment? > callout? > html_comment? > h3? > h1 > (image | t | link)* > list?',\n ];\n\n defaults: HeroCompProps = {\n headline: 'Build something amazing',\n content: 'Your platform for data-driven decisions.',\n buttons: [{ id: 'btn-0', text: 'Get started', variant: 'primary' }],\n };\n\n fixtures: SectionFixture<HeroCompProps>[] = [\n {\n markdown:\n '# Welcome\\n\\nBuild amazing things.\\n\\n[Get Started](/) [Learn More](/about)',\n expected: {\n headline: 'Welcome',\n content: 'Build amazing things.',\n buttons: [\n {\n id: 'btn-0',\n text: 'Get Started',\n variant: 'primary',\n onClick: '/',\n },\n {\n id: 'btn-1',\n text: 'Learn More',\n variant: 'secondary',\n onClick: '/about',\n },\n ],\n },\n },\n {\n markdown: `<!-- Hero Section -->\n\n# Welcome to Our Platform\n\n![Hero Image](hero.jpg)\n\nGet started today with our amazing features.\n\n[Get Started](/signup) [Learn More](/about)`,\n expected: {\n headline: 'Welcome to Our Platform',\n content: 'Get started today with our amazing features.',\n buttons: [\n {\n id: 'btn-0',\n text: 'Get Started',\n variant: 'primary',\n onClick: '/signup',\n },\n {\n id: 'btn-1',\n text: 'Learn More',\n variant: 'secondary',\n onClick: '/about',\n },\n ],\n image: 'hero.jpg',\n },\n },\n ];\n\n parse(parts: Part[]): HeroCompProps {\n let image = firstImageSrc(parts);\n const lists = getPartsByType<ListPart>(parts, 'list');\n\n if (!image) {\n for (const list of lists) {\n for (const item of list.meta?.items ?? []) {\n const itemParts = (item.meta?.parts ?? []) as Part[];\n const nestedImage = firstImageSrc(itemParts);\n if (nestedImage) {\n image = nestedImage;\n break;\n }\n }\n if (image) {\n break;\n }\n }\n }\n\n // Start with the hero's own button row. NOT every top-level link: a link\n // inside a prose paragraph is a top-level part too, so `getLinks` handed\n // `Email support@shop.example` the `btn-0` / primary slot and pushed the\n // real call to action down to secondary. `standaloneLinks` keeps only a\n // link that stands alone as its own block, which is the row the hero means.\n let buttonIndex = 0;\n const buttons: HeroButton[] = standaloneLinks(parts).map(\n (l, i): HeroButton => ({\n id: `btn-${i}`,\n text: l.content?.trim() || 'Learn more',\n variant: i === 0 ? 'primary' : 'secondary',\n onClick: l.meta.href,\n }),\n );\n buttonIndex = buttons.length;\n\n // Process lists: filter out image-only items, then check if remaining\n // items are all link-only. If so, convert to buttons; otherwise keep as trailingList.\n let trailingList: string | undefined;\n if (lists.length > 0) {\n for (const list of lists) {\n // Filter out image-only items\n const filteredItems: ListItemPart[] = [];\n for (const item of list.meta?.items ?? []) {\n const itemParts = (item.meta?.parts ?? []) as Part[];\n const hasImage = itemParts.some((p) => p.type === 'image');\n if (hasImage) {\n continue;\n }\n filteredItems.push(item);\n }\n\n if (filteredItems.length === 0) {\n continue;\n }\n\n // Check if ALL remaining items contain only links (no other text)\n let allItemsAreLinks = true;\n const listLinks: { text: string; href: string }[] = [];\n\n for (const item of filteredItems) {\n const itemParts = (item.meta?.parts ?? []) as Part[];\n const itemLinkParts = itemParts.filter(\n (p): p is LinkPart => p.type === 'link',\n );\n\n if (itemLinkParts.length === 0) {\n allItemsAreLinks = false;\n break;\n }\n\n // Check if the item text is entirely link text (no extra content)\n const allText = extractListItemText(item).trim();\n const linkTexts = itemLinkParts\n .map((l) => l.content?.trim() || '')\n .join(' ')\n .trim();\n\n if (allText !== linkTexts) {\n allItemsAreLinks = false;\n break;\n }\n\n listLinks.push({\n text: itemLinkParts[0].content?.trim() || 'Learn more',\n href: itemLinkParts[0].meta.href,\n });\n }\n\n if (allItemsAreLinks && listLinks.length > 0) {\n // Convert link-only list items to buttons\n for (const link of listLinks) {\n const isFirstButton = buttons.length === 0;\n buttons.push({\n id: `btn-${buttonIndex++}`,\n text: link.text,\n variant: isFirstButton ? 'primary' : 'secondary',\n onClick: link.href,\n });\n }\n } else {\n // Keep as trailing list markdown\n const lines: string[] = [];\n for (const item of filteredItems) {\n const text =\n (item.meta?.markdown as string) || extractListItemText(item);\n if (text) {\n lines.push(`- ${text}`);\n }\n }\n if (lines.length > 0) {\n trailingList = lines.join('\\n');\n }\n }\n }\n }\n\n // The hero claims the leading callout before the h1 — the ECHO the\n // orchestrator emits as the hero's opening line, right after the section\n // descriptor. A trailing blockquote is not part of the hero pattern, so it\n // falls through to a downstream callout section instead.\n const h1Index = parts.findIndex(\n (p) => p.type === 'heading' && (p.meta as { level: number })?.level === 1,\n );\n const blockquotes = getPartsByType<Part>(parts, 'callout');\n let leadingQuote: string | undefined;\n\n for (const bq of blockquotes) {\n const bqIndex = parts.indexOf(bq);\n if (h1Index >= 0 && bqIndex > h1Index) {\n continue;\n }\n const raw = (bq.meta?.markdown as string)?.trim() || bq.content?.trim();\n if (!raw) {\n continue;\n }\n leadingQuote = parseCalloutTag(raw).text || undefined;\n }\n\n return {\n // Markdown-preserving (not headingText): the hero title now carries the\n // bold+italic hook the ECHO callout used to own, so the FE needs the\n // formatting, not just the plain text. See FeatureComparisonHero.tsx.\n headline: headingMarkdown(parts, 1),\n badge: headingText(parts, 3) || undefined,\n content: proseBodyMarkdown(parts) || undefined,\n buttons: buttons.length > 0 ? buttons : undefined,\n image,\n trailingList,\n leadingQuote,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -60,6 +60,37 @@ function inlineParagraphs(parts) {
60
60
  }
61
61
  return paragraphs;
62
62
  }
63
+
64
+ /**
65
+ * A paragraph that is nothing but links — the hero's button row under the h1,
66
+ * the CTA after a comparison table. This is the one shape a section is entitled
67
+ * to spend on a control instead of printing as copy, and its complement — a
68
+ * link sharing its paragraph with a sentence — is body copy and nothing else.
69
+ *
70
+ * A blank part does not disqualify it. A hard line break between two links
71
+ * (`[A](/a)··\n[B](/b)`) leaves an empty `t` part behind, and an empty part is
72
+ * not a sentence; without this the row is BOTH a button and a line of body
73
+ * copy, which is the duplication the rule exists to prevent.
74
+ */
75
+ function isLinkRow(paragraph) {
76
+ return paragraph.some(part => part.type === 'link') && paragraph.every(part => part.type === 'link' || markdownOrText(part) === '');
77
+ }
78
+
79
+ /**
80
+ * The links a section is entitled to render as its own control — a hero button
81
+ * row, a CTA — as opposed to a link that is part of a sentence.
82
+ *
83
+ * The exact complement of what {@link proseBodyMarkdown} keeps, and that is the
84
+ * point: between the two, every top-level link reaches the page exactly once.
85
+ * `getLinks` is the wrong tool for a control slot — it takes EVERY top-level
86
+ * link part, and a link inside a prose paragraph is a top-level part, so
87
+ * `Email support@shop.example` (GFM autolinks a bare address, no author needed)
88
+ * arrived as the hero's first and therefore PRIMARY button, displacing the real
89
+ * call to action into the secondary slot and printing the address twice.
90
+ */
91
+ export function standaloneLinks(parts) {
92
+ return inlineParagraphs(parts).filter(isLinkRow).flat().filter(part => part.type === 'link');
93
+ }
63
94
  function paragraphsToMarkdown(paragraphs) {
64
95
  return paragraphs.map(inlinePartsToMarkdown).map(paragraph => paragraph.trim()).filter(Boolean).join('\n\n');
65
96
  }
@@ -85,16 +116,17 @@ function paragraphsToMarkdown(paragraphs) {
85
116
  * wrong for a section that already spends its links elsewhere — see
86
117
  * {@link proseBodyMarkdown}.
87
118
  *
88
- * Kept separate from `bodyText` deliberately, but not for the reason this
89
- * comment used to give. Of the four callers still on `bodyText`:
90
- * `ErrorSectionDefinition` and `CtaBannerSectionDefinition` do hand their
91
- * result to a consumer that renders it raw (`ErrorSection` prints the copy in
92
- * a `<p>`, `CtaBannerSection` the same), so markdown there would show a
93
- * visitor a literal `[label](url)`. `FeatureCardsSectionDefinition` does NOT
94
- * both `FeatureCardsSection` renderers in this repo put `card.description`
95
- * through `MarkdownText`, so it loses inline links exactly like the sections
96
- * fixed here; it is left alone only because its callers were not verified end
97
- * to end. `FeatureSection9PlusDefinition` has no registered renderer at all.
119
+ * Kept separate from `bodyText` deliberately. Of the three callers still on
120
+ * `bodyText`: `ErrorSectionDefinition` and `CtaBannerSectionDefinition` do
121
+ * hand their result to a consumer that renders it raw (`ErrorSection` prints
122
+ * the copy in a `<p>`, `CtaBannerSection` the same), so markdown there would
123
+ * show a visitor a literal `[label](url)`. `FeatureSection9PlusDefinition` is
124
+ * the odd one out: it has no registered renderer in either client bundle
125
+ * (`createSdkRegistry` registers the definition with no component, and only
126
+ * `createTestRegistry` gives it a stub), so its `description` reaches nothing
127
+ * and there is no consumer to decide against. `FeatureCardsSectionDefinition`
128
+ * used to be listed here as affected-but-unfixed; it now uses
129
+ * {@link proseBodyMarkdown}.
98
130
  */
99
131
  export function bodyMarkdown(parts) {
100
132
  return paragraphsToMarkdown(inlineParagraphs(parts));
@@ -108,11 +140,14 @@ export function bodyMarkdown(parts) {
108
140
  * sentence survives instead of being deleted with its label — but it drops the
109
141
  * two shapes those sections have already claimed, so nothing renders twice:
110
142
  *
111
- * - A paragraph that is nothing but links. `[Get started](/) [Learn more](/x)`
112
- * under a hero h1 is the button row `HeroSectionDefinition` turns into
113
- * `buttons`; the trailing link after a comparison table is its `ctaText` /
114
- * `ctaHref`. Whole-paragraph is the right test because a link that is part
115
- * of a sentence always shares its paragraph with the text around it.
143
+ * - A paragraph that is nothing but links {@link isLinkRow}.
144
+ * `[Get started](/) [Learn more](/x)` under a hero h1 is the button row
145
+ * `HeroSectionDefinition` turns into `buttons`; the trailing link after a
146
+ * comparison table is its `ctaText` / `ctaHref`. Whole-paragraph is the right
147
+ * test because a link that is part of a sentence always shares its paragraph
148
+ * with the text around it. `HeroSectionDefinition` reads the same predicate
149
+ * from the other side via {@link standaloneLinks}, so the two partition the
150
+ * links rather than each deciding for itself.
116
151
  * - Everything from the first `web5://entity/…` link onward, which is item
117
152
  * copy rather than section copy — `HeroEntitySectionDefinition` reads those
118
153
  * links (and the text after each) into `items`. Same cut
@@ -127,7 +162,7 @@ export function proseBodyMarkdown(parts) {
127
162
  return p.type === 'link' && isEntityHref((_meta = p.meta) == null ? void 0 : _meta.href);
128
163
  });
129
164
  const sectionParts = firstEntityLinkIndex >= 0 ? parts.slice(0, firstEntityLinkIndex) : parts;
130
- return paragraphsToMarkdown(inlineParagraphs(sectionParts).filter(paragraph => !paragraph.every(part => part.type === 'link')));
165
+ return paragraphsToMarkdown(inlineParagraphs(sectionParts).filter(paragraph => !isLinkRow(paragraph)));
131
166
  }
132
167
 
133
168
  /**
@@ -145,9 +180,16 @@ export function entitySectionBodyText(parts) {
145
180
  return sectionParts.filter(p => p.type === 'text' || p.type === 'richText').map(markdownOrText).filter(Boolean).join('\n\n');
146
181
  }
147
182
 
148
- /** Build HeroButton[] from link parts — aligned to HeroSection1Button shape */
183
+ /**
184
+ * Build HeroButton[] from link parts — aligned to HeroSection1Button shape.
185
+ *
186
+ * `standaloneLinks`, not `getLinks`, for the reason spelled out there: a link
187
+ * in a sentence is body copy, not a button. Currently uncalled — kept on the
188
+ * same rule as `HeroSectionDefinition` so wiring it up cannot reintroduce the
189
+ * bug.
190
+ */
149
191
  export function linksToHeroButtons(parts) {
150
- let links = getLinks(parts);
192
+ let links = standaloneLinks(parts);
151
193
  if (!links.length) {
152
194
  const lists = getPartsByType(parts, 'list');
153
195
  links = lists.flatMap(l => {