@wix/web5-core 1.56.1 → 1.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/client/wixAuthFetch.js +2 -2
- package/dist/cjs/client/wixAuthFetch.js.map +1 -1
- package/dist/cjs/component/componentDefinitions/HeroEntitySectionDefinition.js +20 -15
- package/dist/cjs/component/componentDefinitions/HeroEntitySectionDefinition.js.map +1 -1
- package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js +12 -4
- package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js.map +1 -1
- package/dist/cjs/component/componentDefinitions/listItemsSectionDefinition.js +24 -29
- package/dist/cjs/component/componentDefinitions/listItemsSectionDefinition.js.map +1 -1
- package/dist/cjs/component/componentParser.js +8 -1
- package/dist/cjs/component/componentParser.js.map +1 -1
- package/dist/cjs/component/types.js.map +1 -1
- package/dist/cjs/components/placement/PlacementResponseRenderer.css +0 -4
- package/dist/cjs/components/placement/PlacementResponseRenderer.js +11 -33
- package/dist/cjs/components/placement/PlacementResponseRenderer.js.map +1 -1
- package/dist/cjs/components/placement/buildPlacementDependencies.js.map +1 -1
- package/dist/cjs/components/ui/OptimizedImage.js +59 -14
- package/dist/cjs/components/ui/OptimizedImage.js.map +1 -1
- package/dist/cjs/components/ui/SectionSkeleton.css +19 -0
- package/dist/cjs/components/ui/SectionSkeleton.js +8 -4
- package/dist/cjs/components/ui/SectionSkeleton.js.map +1 -1
- package/dist/cjs/components/ui/UserQuery.css +72 -0
- package/dist/cjs/components/ui/UserQuery.js +131 -37
- package/dist/cjs/components/ui/UserQuery.js.map +1 -1
- package/dist/cjs/context/UserQueryContext.js +34 -0
- package/dist/cjs/context/UserQueryContext.js.map +1 -0
- package/dist/cjs/entity/defaultExtractor.js +9 -2
- package/dist/cjs/entity/defaultExtractor.js.map +1 -1
- package/dist/cjs/entity/fetchEntityListData.js +13 -26
- package/dist/cjs/entity/fetchEntityListData.js.map +1 -1
- package/dist/cjs/entity/index.js +5 -1
- package/dist/cjs/entity/index.js.map +1 -1
- package/dist/cjs/entity/listEntityItems.js +90 -0
- package/dist/cjs/entity/listEntityItems.js.map +1 -0
- package/dist/cjs/hostScope.js +63 -0
- package/dist/cjs/hostScope.js.map +1 -0
- package/dist/cjs/index.js +38 -13
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/patternValidator/validator.test.js +61 -61
- package/dist/cjs/patternValidator/validator.test.js.map +1 -1
- package/dist/cjs/registry/ComponentRegistry.js +22 -2
- package/dist/cjs/registry/ComponentRegistry.js.map +1 -1
- package/dist/cjs/registry/index.js +1 -3
- package/dist/cjs/registry/index.js.map +1 -1
- package/dist/cjs/registry/types.js.map +1 -1
- package/dist/cjs/styles/base-utilities.css +35 -0
- package/dist/cjs/styles/components.css +1 -0
- package/dist/cjs/styles/host-reset.css +81 -0
- package/dist/cjs/styles/tailwind-theme.css +6 -6
- package/dist/cjs/utils/backendEnvironment.js +78 -0
- package/dist/cjs/utils/backendEnvironment.js.map +1 -0
- package/dist/cjs/utils/entityLinkParser.js +3 -1
- package/dist/cjs/utils/entityLinkParser.js.map +1 -1
- package/dist/cjs/utils/imageBackdrop.js +269 -0
- package/dist/cjs/utils/imageBackdrop.js.map +1 -0
- package/dist/cjs/utils/intentExtractor.js +20 -9
- package/dist/cjs/utils/intentExtractor.js.map +1 -1
- package/dist/cjs/utils/productBackHandoff.js +106 -0
- package/dist/cjs/utils/productBackHandoff.js.map +1 -0
- package/dist/cjs/utils/refreshPrompts.js +72 -0
- package/dist/cjs/utils/refreshPrompts.js.map +1 -0
- package/dist/esm/client/wixAuthFetch.js +2 -2
- package/dist/esm/client/wixAuthFetch.js.map +1 -1
- package/dist/esm/component/componentDefinitions/HeroEntitySectionDefinition.js +20 -15
- package/dist/esm/component/componentDefinitions/HeroEntitySectionDefinition.js.map +1 -1
- package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js +12 -4
- package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js.map +1 -1
- package/dist/esm/component/componentDefinitions/listItemsSectionDefinition.js +25 -30
- package/dist/esm/component/componentDefinitions/listItemsSectionDefinition.js.map +1 -1
- package/dist/esm/component/componentParser.js +8 -1
- package/dist/esm/component/componentParser.js.map +1 -1
- package/dist/esm/component/types.js.map +1 -1
- package/dist/esm/components/placement/PlacementResponseRenderer.css +0 -4
- package/dist/esm/components/placement/PlacementResponseRenderer.js +1 -16
- package/dist/esm/components/placement/PlacementResponseRenderer.js.map +1 -1
- package/dist/esm/components/placement/buildPlacementDependencies.js.map +1 -1
- package/dist/esm/components/ui/OptimizedImage.js +50 -5
- package/dist/esm/components/ui/OptimizedImage.js.map +1 -1
- package/dist/esm/components/ui/SectionSkeleton.css +19 -0
- package/dist/esm/components/ui/SectionSkeleton.js +5 -1
- package/dist/esm/components/ui/SectionSkeleton.js.map +1 -1
- package/dist/esm/components/ui/UserQuery.css +72 -0
- package/dist/esm/components/ui/UserQuery.js +52 -6
- package/dist/esm/components/ui/UserQuery.js.map +1 -1
- package/dist/esm/context/UserQueryContext.js +21 -0
- package/dist/esm/context/UserQueryContext.js.map +1 -0
- package/dist/esm/entity/defaultExtractor.js +9 -2
- package/dist/esm/entity/defaultExtractor.js.map +1 -1
- package/dist/esm/entity/fetchEntityListData.js +14 -26
- package/dist/esm/entity/fetchEntityListData.js.map +1 -1
- package/dist/esm/entity/index.js +1 -0
- package/dist/esm/entity/index.js.map +1 -1
- package/dist/esm/entity/listEntityItems.js +85 -0
- package/dist/esm/entity/listEntityItems.js.map +1 -0
- package/dist/esm/hostScope.js +59 -0
- package/dist/esm/hostScope.js.map +1 -0
- package/dist/esm/index.js +13 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/patternValidator/validator.test.js +61 -61
- package/dist/esm/patternValidator/validator.test.js.map +1 -1
- package/dist/esm/registry/ComponentRegistry.js +22 -2
- package/dist/esm/registry/ComponentRegistry.js.map +1 -1
- package/dist/esm/registry/index.js +0 -1
- package/dist/esm/registry/index.js.map +1 -1
- package/dist/esm/registry/types.js.map +1 -1
- package/dist/esm/styles/base-utilities.css +35 -0
- package/dist/esm/styles/components.css +1 -0
- package/dist/esm/styles/host-reset.css +81 -0
- package/dist/esm/styles/tailwind-theme.css +6 -6
- package/dist/esm/utils/backendEnvironment.js +71 -0
- package/dist/esm/utils/backendEnvironment.js.map +1 -0
- package/dist/esm/utils/entityLinkParser.js +3 -1
- package/dist/esm/utils/entityLinkParser.js.map +1 -1
- package/dist/esm/utils/imageBackdrop.js +262 -0
- package/dist/esm/utils/imageBackdrop.js.map +1 -0
- package/dist/esm/utils/intentExtractor.js +21 -12
- package/dist/esm/utils/intentExtractor.js.map +1 -1
- package/dist/esm/utils/productBackHandoff.js +100 -0
- package/dist/esm/utils/productBackHandoff.js.map +1 -0
- package/dist/esm/utils/refreshPrompts.js +67 -0
- package/dist/esm/utils/refreshPrompts.js.map +1 -0
- package/dist/types/component/componentDefinitions/HeroEntitySectionDefinition.d.ts.map +1 -1
- package/dist/types/component/componentDefinitions/HeroSectionDefinition.d.ts.map +1 -1
- package/dist/types/component/componentDefinitions/listItemsSectionDefinition.d.ts +2 -2
- package/dist/types/component/componentDefinitions/listItemsSectionDefinition.d.ts.map +1 -1
- package/dist/types/component/componentParser.d.ts.map +1 -1
- package/dist/types/component/types.d.ts +1 -5
- package/dist/types/component/types.d.ts.map +1 -1
- package/dist/types/components/placement/PlacementResponseRenderer.d.ts +1 -1
- package/dist/types/components/placement/PlacementResponseRenderer.d.ts.map +1 -1
- package/dist/types/components/placement/buildPlacementDependencies.d.ts +1 -2
- package/dist/types/components/placement/buildPlacementDependencies.d.ts.map +1 -1
- package/dist/types/components/ui/OptimizedImage.d.ts +9 -0
- package/dist/types/components/ui/OptimizedImage.d.ts.map +1 -1
- package/dist/types/components/ui/SectionSkeleton.d.ts.map +1 -1
- package/dist/types/components/ui/UserQuery.d.ts +21 -0
- package/dist/types/components/ui/UserQuery.d.ts.map +1 -1
- package/dist/types/context/UserQueryContext.d.ts +12 -0
- package/dist/types/context/UserQueryContext.d.ts.map +1 -0
- package/dist/types/entity/defaultExtractor.d.ts.map +1 -1
- package/dist/types/entity/fetchEntityListData.d.ts +0 -2
- package/dist/types/entity/fetchEntityListData.d.ts.map +1 -1
- package/dist/types/entity/index.d.ts +1 -0
- package/dist/types/entity/index.d.ts.map +1 -1
- package/dist/types/entity/listEntityItems.d.ts +40 -0
- package/dist/types/entity/listEntityItems.d.ts.map +1 -0
- package/dist/types/hostScope.d.ts +83 -0
- package/dist/types/hostScope.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/registry/ComponentRegistry.d.ts +8 -0
- package/dist/types/registry/ComponentRegistry.d.ts.map +1 -1
- package/dist/types/registry/index.d.ts +0 -1
- package/dist/types/registry/index.d.ts.map +1 -1
- package/dist/types/registry/types.d.ts +5 -6
- package/dist/types/registry/types.d.ts.map +1 -1
- package/dist/types/utils/backendEnvironment.d.ts +30 -0
- package/dist/types/utils/backendEnvironment.d.ts.map +1 -0
- package/dist/types/utils/entityLinkParser.d.ts.map +1 -1
- package/dist/types/utils/imageBackdrop.d.ts +102 -0
- package/dist/types/utils/imageBackdrop.d.ts.map +1 -0
- package/dist/types/utils/intentExtractor.d.ts +21 -4
- package/dist/types/utils/intentExtractor.d.ts.map +1 -1
- package/dist/types/utils/productBackHandoff.d.ts +43 -0
- package/dist/types/utils/productBackHandoff.d.ts.map +1 -0
- package/dist/types/utils/refreshPrompts.d.ts +32 -0
- package/dist/types/utils/refreshPrompts.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/components/placement/PlacementResponseRenderer.css +0 -4
- package/src/components/ui/SectionSkeleton.css +19 -0
- package/src/components/ui/UserQuery.css +72 -0
- package/src/styles/base-utilities.css +35 -0
- package/src/styles/components.css +1 -0
- package/src/styles/host-reset.css +81 -0
- package/src/styles/tailwind-theme.css +6 -6
- package/dist/cjs/registry/Intent.js +0 -19
- package/dist/cjs/registry/Intent.js.map +0 -1
- package/dist/cjs/utils/conversationApi.js +0 -52
- package/dist/cjs/utils/conversationApi.js.map +0 -1
- package/dist/cjs/utils/conversationMode.js +0 -23
- package/dist/cjs/utils/conversationMode.js.map +0 -1
- package/dist/esm/registry/Intent.js +0 -15
- package/dist/esm/registry/Intent.js.map +0 -1
- package/dist/esm/utils/conversationApi.js +0 -45
- package/dist/esm/utils/conversationApi.js.map +0 -1
- package/dist/esm/utils/conversationMode.js +0 -18
- package/dist/esm/utils/conversationMode.js.map +0 -1
- package/dist/types/registry/Intent.d.ts +0 -12
- package/dist/types/registry/Intent.d.ts.map +0 -1
- package/dist/types/utils/conversationApi.d.ts +0 -26
- package/dist/types/utils/conversationApi.d.ts.map +0 -1
- package/dist/types/utils/conversationMode.d.ts +0 -16
- package/dist/types/utils/conversationMode.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_imageUtils","_linkTypes","_ComponentDependenciesContext","_useResolvedImageSources","_jsxFileName","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","lowResFallbackCache","Map","OptimizedImage","exports","memo","props","alt","className","quality","format","progressive","placeholderColor","objectFit","layout","onLoad","onError","onClick","clickable","imageFromText","disableResize","imageMode","fallbackOnLowRes","lowResThreshold","isResolvedMode","unresolvedSource","filename","preResolvedUrl","resolvedUrl","filter","undefined","sourceIdentifier","deps","useComponentDependencies","isLoaded","setIsLoaded","useState","isError","setIsError","imageUrl","setImageUrl","isFallback","setIsFallback","isDebugImageEnabled","useDebugImageContext","dimensions","setDimensions","containerRef","useRef","observerRef","isContextualImage","useMemo","isWeb5ImageUrl","contextualImageKey","rawKey","slice","length","decodeURIComponent","trim","resolutionInputs","src","images","resolvedSources","loading","isResolutionLoading","useResolvedImageSources","resolvedSource","useEffect","logContextualImage","url","contextualTerm","imageEventType","isImageResolved","isFallbackImage","contextualImageFallback","fallbacks","fallbackImages","Math","floor","random","effectiveFilename","sourceCacheKey","normalizeImageUrl","hasResolvedSourceDimensions","width","height","isLowResResolvedAsset","cachedFallbackUrl","showDynamicBadge","container","current","updateDimensions","rect","getBoundingClientRect","ceil","window","ResizeObserver","observe","handleResize","addEventListener","disconnect","removeEventListener","normalizedUrl","isExternalNonWixUrl","startsWith","includes","imageFilename","match","replace","dpr","devicePixelRatio","optimizedUrl","getResizedImageUrl","handleImageLoad","img","currentTarget","naturalWidth","naturalHeight","originalImageUrl","currentSrc","console","warn","fallbackImageUrl","handleImageError","error","source","Error","isTransparentPlaceholder","placeholderStyles","background","animation","backgroundSize","handleKeyDown","key","preventDefault","createElement","Fragment","ref","Boolean","join","style","minHeight","onKeyDown","tabIndex","role","__self","__source","fileName","lineNumber","columnNumber","fill","stroke","viewBox","focusable","strokeLinecap","strokeLinejoin","strokeWidth","d","maxWidth","display","position","inset"],"sources":["../../../../src/components/ui/OptimizedImage.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, memo, useMemo } from 'react';\nimport { getResizedImageUrl, normalizeImageUrl } from '../../utils/image-utils';\nimport { isWeb5ImageUrl } from '../../types/link-types';\nimport { useComponentDependencies } from '../../context/ComponentDependenciesContext';\nimport type { ImageSearchFilterString } from '../../image/imageSearchFilterTypes';\nimport { useResolvedImageSources } from '../../hooks/useResolvedImageSources';\n\nconst lowResFallbackCache = new Map<string, string>();\n\ninterface OptimizedImageBaseProps {\n /** Accessible alternative text for the rendered image. */\n alt: string;\n /** Additional CSS classes applied to the outer image container. */\n className?: string;\n /** Preferred output quality for resized Wix media URLs. */\n quality?: number;\n /** Requested output format for future image delivery customization. */\n format?: 'auto' | 'webp' | 'jpg' | 'png';\n /** Enables progressive loading behavior when supported by the delivery layer. */\n progressive?: boolean;\n /** Placeholder background color shown before the image loads. */\n placeholderColor?: string;\n /** CSS object-fit behavior applied to the rendered `<img>`. */\n objectFit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';\n /** Layout strategy for the image container. */\n layout?: 'fill' | 'intrinsic';\n /** Called after the final rendered image successfully loads. */\n onLoad?: () => void;\n /** Called when the final rendered image fails to load. */\n onError?: (error: Error) => void;\n /** Click handler for interactive image surfaces. */\n onClick?: () => void;\n /** Makes the image container keyboard-focusable and clickable. */\n clickable?: boolean;\n /** Marks the source as originating from text-driven image generation for BI logging. */\n imageFromText?: boolean;\n /** Skips Wix fitted delivery URL rewriting and uses the normalized original URL directly. */\n disableResize?: boolean;\n /** CDN resize mode. 'fill' crops to exact container dimensions (sharp at slot size).\n * 'fit' (default) preserves aspect ratio. */\n imageMode?: 'fit' | 'fill';\n /** Full URL to a fallback image used when the primary image is considered low resolution. */\n fallbackOnLowRes?: string;\n /** Minimum acceptable width or height before low-resolution fallback is triggered. */\n lowResThreshold?: number;\n}\n\ninterface OptimizedImageWithFilenameProps {\n /** Image source to render. Supports full URLs and `web5://image/...` contextual image tokens. */\n filename: string;\n /** Optional contextual search filter used only when resolving a `web5://image/...` source. */\n filter?: ImageSearchFilterString;\n /** Mutually exclusive with `filename`; provide this only when the image URL is already resolved. */\n resolvedUrl?: never;\n}\n\ninterface OptimizedImageWithResolvedUrlProps {\n /** Already-resolved image URL. When provided, OptimizedImage skips all source resolution. */\n resolvedUrl: string;\n /** Mutually exclusive with `resolvedUrl`; use `filename` when the source still needs resolving. */\n filename?: never;\n /** Not applicable for already-resolved image URLs. */\n filter?: never;\n}\n\nexport type OptimizedImageProps = OptimizedImageBaseProps &\n (OptimizedImageWithFilenameProps | OptimizedImageWithResolvedUrlProps);\n\nexport const OptimizedImage: React.FC<OptimizedImageProps> = memo((props) => {\n const {\n alt,\n className = '',\n quality = 85,\n format = 'auto',\n progressive = true,\n placeholderColor = '#f3f4f6',\n objectFit = 'contain',\n layout = 'fill',\n onLoad,\n onError,\n onClick,\n clickable = false,\n imageFromText = false,\n disableResize = false,\n imageMode = 'fit',\n fallbackOnLowRes,\n lowResThreshold = 550,\n } = props;\n void format;\n void progressive;\n\n const isResolvedMode = 'resolvedUrl' in props;\n const unresolvedSource = 'filename' in props ? props.filename ?? '' : '';\n const preResolvedUrl = 'resolvedUrl' in props ? props.resolvedUrl : '';\n const filter = 'filename' in props ? props.filter : undefined;\n const sourceIdentifier = isResolvedMode ? preResolvedUrl : unresolvedSource;\n\n const deps = useComponentDependencies();\n const [isLoaded, setIsLoaded] = useState(false);\n const [isError, setIsError] = useState(false);\n const [imageUrl, setImageUrl] = useState<string>('');\n const [isFallback, setIsFallback] = useState(false);\n const isDebugImageEnabled = deps.useDebugImageContext();\n const [dimensions, setDimensions] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const isContextualImage = useMemo(\n () =>\n !isResolvedMode &&\n !!(unresolvedSource && isWeb5ImageUrl(unresolvedSource)),\n [isResolvedMode, unresolvedSource],\n );\n\n const contextualImageKey = useMemo(() => {\n if (!isContextualImage) {\n return '';\n }\n const rawKey = unresolvedSource.slice('web5://image/'.length);\n try {\n return decodeURIComponent(rawKey).trim();\n } catch {\n return rawKey.trim();\n }\n }, [isContextualImage, unresolvedSource]);\n const resolutionInputs = useMemo(\n () =>\n isResolvedMode || !unresolvedSource\n ? []\n : [\n {\n src: unresolvedSource,\n filter,\n },\n ],\n [filter, isResolvedMode, unresolvedSource],\n );\n const { images: resolvedSources, loading: isResolutionLoading } =\n useResolvedImageSources(resolutionInputs);\n const resolvedSource = useMemo(\n () => (!isResolvedMode ? resolvedSources?.[0] ?? null : null),\n [isResolvedMode, resolvedSources],\n );\n\n useEffect(() => {\n if (\n !isContextualImage ||\n isResolvedMode ||\n isResolutionLoading ||\n resolvedSources === null\n ) {\n return;\n }\n\n deps.logContextualImage?.({\n imageUrl: resolvedSource?.url ?? '',\n contextualTerm: contextualImageKey,\n imageEventType: imageFromText\n ? 'web5_image_link_from_text'\n : 'web5_image_link',\n isImageResolved: !!resolvedSource?.url,\n isFallbackImage: false,\n });\n }, [\n contextualImageKey,\n deps,\n imageFromText,\n isContextualImage,\n isResolvedMode,\n isResolutionLoading,\n resolvedSource?.url,\n resolvedSources,\n ]);\n\n // When imageFromText contextual image resolution returns empty, use a random fallback\n const contextualImageFallback = useMemo(() => {\n if (\n !imageFromText ||\n !isContextualImage ||\n isResolutionLoading ||\n resolvedSources === null ||\n resolvedSource?.url\n ) {\n return '';\n }\n const fallbacks = deps.fallbackImages;\n if (!fallbacks || fallbacks.length === 0) {\n return '';\n }\n return fallbacks[Math.floor(Math.random() * fallbacks.length)];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n imageFromText,\n isContextualImage,\n isResolutionLoading,\n resolvedSources,\n resolvedSource?.url,\n deps.fallbackImages,\n ]);\n\n // Log when a fallback image is used for an unresolved contextual image\n useEffect(() => {\n if (!contextualImageFallback) {\n return;\n }\n deps.logContextualImage?.({\n imageUrl: contextualImageFallback,\n contextualTerm: contextualImageKey,\n imageEventType: 'web5_image_fallback',\n isImageResolved: false,\n isFallbackImage: true,\n });\n }, [contextualImageFallback, contextualImageKey, deps]);\n\n const effectiveFilename = isResolvedMode\n ? preResolvedUrl\n : resolvedSource?.url || contextualImageFallback;\n const sourceCacheKey = useMemo(\n () =>\n effectiveFilename ? normalizeImageUrl(effectiveFilename).trim() : '',\n [effectiveFilename],\n );\n const hasResolvedSourceDimensions =\n typeof resolvedSource?.width === 'number' &&\n typeof resolvedSource?.height === 'number';\n const isLowResResolvedAsset =\n hasResolvedSourceDimensions &&\n (resolvedSource.width! < lowResThreshold ||\n resolvedSource.height! < lowResThreshold);\n const cachedFallbackUrl = useMemo(\n () => (sourceCacheKey ? lowResFallbackCache.get(sourceCacheKey) ?? '' : ''),\n [sourceCacheKey],\n );\n const showDynamicBadge = isContextualImage && isDebugImageEnabled;\n\n useEffect(() => {\n setIsLoaded(false);\n setIsError(false);\n setIsFallback(false);\n setImageUrl('');\n }, [sourceCacheKey, fallbackOnLowRes]);\n\n useEffect(() => {\n if (!sourceCacheKey || !fallbackOnLowRes) {\n return;\n }\n\n if (isLowResResolvedAsset) {\n lowResFallbackCache.set(sourceCacheKey, fallbackOnLowRes);\n setIsFallback(true);\n setImageUrl(fallbackOnLowRes);\n return;\n }\n\n if (!cachedFallbackUrl) {\n return;\n }\n\n setIsFallback(true);\n setImageUrl(cachedFallbackUrl);\n }, [\n cachedFallbackUrl,\n fallbackOnLowRes,\n isLowResResolvedAsset,\n sourceCacheKey,\n ]);\n\n // For fill layout, measure container so we can request a resized Wix image.\n useEffect(() => {\n if (layout === 'intrinsic' || disableResize) {\n return;\n }\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const updateDimensions = () => {\n const rect = container.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n setDimensions({\n width: Math.ceil(rect.width),\n height: Math.ceil(rect.height),\n });\n }\n };\n\n updateDimensions();\n\n if ('ResizeObserver' in window) {\n observerRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n observerRef.current.observe(container);\n }\n\n const handleResize = () => updateDimensions();\n window.addEventListener('resize', handleResize);\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n window.removeEventListener('resize', handleResize);\n };\n }, [disableResize, layout]);\n\n // Intrinsic layout: use normalized URL without resize logic.\n useEffect(() => {\n if (layout !== 'intrinsic') {\n return;\n }\n if (\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n const normalizedUrl = normalizeImageUrl(effectiveFilename);\n setImageUrl(normalizedUrl);\n }, [\n cachedFallbackUrl,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n ]);\n\n // External non-Wix URLs skip resizing; use them immediately.\n useEffect(() => {\n if (layout === 'intrinsic') {\n return;\n }\n if (\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n const normalizedUrl = normalizeImageUrl(effectiveFilename);\n const isExternalNonWixUrl =\n (normalizedUrl.startsWith('http://') ||\n normalizedUrl.startsWith('https://')) &&\n !normalizedUrl.includes('static.wixstatic.com');\n\n if (isExternalNonWixUrl) {\n setImageUrl(normalizedUrl);\n }\n }, [\n cachedFallbackUrl,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n ]);\n\n // Explicit opt-out: use original normalized URL even in fill layouts.\n useEffect(() => {\n if (layout === 'intrinsic') {\n return;\n }\n if (\n !disableResize ||\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n setImageUrl(normalizeImageUrl(effectiveFilename));\n }, [\n cachedFallbackUrl,\n disableResize,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n ]);\n\n // Wix/local URLs: wait for dimensions, then build a resized URL.\n useEffect(() => {\n if (layout === 'intrinsic') {\n return;\n }\n if (disableResize) {\n return;\n }\n if (\n !dimensions ||\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n const normalizedUrl = normalizeImageUrl(effectiveFilename);\n const isExternalNonWixUrl =\n (normalizedUrl.startsWith('http://') ||\n normalizedUrl.startsWith('https://')) &&\n !normalizedUrl.includes('static.wixstatic.com');\n\n if (isExternalNonWixUrl) {\n return;\n }\n\n let imageFilename = effectiveFilename;\n if (normalizedUrl.includes('static.wixstatic.com')) {\n const match = normalizedUrl.match(/media\\/([^/?]+)/);\n if (match && match[1]) {\n imageFilename = match[1];\n } else {\n setImageUrl(normalizedUrl);\n return;\n }\n } else if (\n normalizedUrl.startsWith('https://static.wixstatic.com/media/')\n ) {\n imageFilename = normalizedUrl.replace(\n 'https://static.wixstatic.com/media/',\n '',\n );\n }\n\n const dpr = window.devicePixelRatio ?? 1;\n const optimizedUrl = getResizedImageUrl(\n imageFilename,\n dimensions.width * dpr,\n dimensions.height * dpr,\n { quality, imageMode },\n );\n setImageUrl(optimizedUrl);\n }, [\n dimensions,\n cachedFallbackUrl,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n disableResize,\n quality,\n imageMode,\n ]);\n\n const handleImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n\n if (\n fallbackOnLowRes &&\n !isFallback &&\n !hasResolvedSourceDimensions &&\n (img.naturalWidth < lowResThreshold ||\n img.naturalHeight < lowResThreshold)\n ) {\n const originalImageUrl =\n img.currentSrc || imageUrl || effectiveFilename || sourceIdentifier;\n\n if (sourceCacheKey) {\n lowResFallbackCache.set(sourceCacheKey, fallbackOnLowRes);\n }\n\n setIsFallback(true);\n setImageUrl(fallbackOnLowRes);\n setIsLoaded(false);\n\n console.warn('OptimizedImage applied a low-res fallback image.', {\n originalImageUrl,\n fallbackImageUrl: fallbackOnLowRes,\n naturalWidth: img.naturalWidth,\n naturalHeight: img.naturalHeight,\n lowResThreshold,\n });\n\n deps.logContextualImage?.({\n imageUrl: fallbackOnLowRes,\n contextualTerm: contextualImageKey,\n imageEventType: 'web5_image_fallback',\n isImageResolved: true,\n isFallbackImage: true,\n });\n return;\n }\n\n setIsLoaded(true);\n onLoad?.();\n };\n\n const handleImageError = () => {\n setIsError(true);\n console.error('Failed to load image:', {\n source: sourceIdentifier,\n imageUrl,\n alt,\n });\n onError?.(new Error(`Failed to load image: ${sourceIdentifier}`));\n };\n\n const isTransparentPlaceholder = placeholderColor === 'transparent';\n const placeholderStyles = isTransparentPlaceholder\n ? {\n background: 'transparent',\n animation: 'none',\n }\n : {\n background: `linear-gradient(90deg, ${placeholderColor} 0%, #e5e7eb 50%, ${placeholderColor} 100%)`,\n backgroundSize: '200% 100%',\n animation: 'shimmer 2s infinite ease-in-out',\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <>\n <span\n ref={containerRef}\n className={[\n 'block',\n layout === 'intrinsic' ? '' : 'relative overflow-hidden',\n showDynamicBadge ? 'relative' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={layout === 'intrinsic' ? undefined : { minHeight: '1px' }}\n onClick={clickable ? onClick : undefined}\n onKeyDown={clickable ? handleKeyDown : undefined}\n tabIndex={clickable ? 0 : undefined}\n role={clickable ? 'button' : undefined}\n aria-label={clickable ? alt : undefined}\n >\n {showDynamicBadge && (\n <span className=\"absolute left-2 top-2 z-10 rounded bg-blue-600/90 px-2 py-1 text-[10px] font-semibold tracking-wide text-white shadow block\">\n {contextualImageKey}\n </span>\n )}\n {!isLoaded && !isError && sourceIdentifier && (\n <span\n className=\"absolute inset-0 rounded block\"\n style={placeholderStyles}\n role=\"status\"\n aria-label=\"Loading image\"\n />\n )}\n\n {isError && (\n <span\n className=\"absolute inset-0 flex items-center justify-center bg-gray-100 text-gray-500 rounded block\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <span className=\"text-center p-4 block\">\n <svg\n className=\"w-8 h-8 mx-auto mb-2 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n <span className=\"text-xs block\">Failed to load image</span>\n </span>\n </span>\n )}\n\n {imageUrl && !isError && (\n <img\n src={imageUrl}\n alt={alt}\n className={`${\n layout === 'intrinsic'\n ? 'w-full h-auto'\n : 'absolute inset-0 w-full h-full'\n } transition-opacity duration-300 ${\n isLoaded ? 'opacity-100' : 'opacity-0'\n } ${\n objectFit === 'contain'\n ? 'object-contain'\n : objectFit === 'cover'\n ? 'object-cover'\n : objectFit === 'fill'\n ? 'object-fill'\n : objectFit === 'none'\n ? 'object-none'\n : objectFit === 'scale-down'\n ? 'object-scale-down'\n : ''\n }`}\n style={\n layout === 'intrinsic'\n ? {\n width: '100%',\n height: 'auto',\n maxWidth: '100%',\n display: 'block',\n }\n : {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n objectFit,\n maxWidth: '100%',\n display: 'block',\n }\n }\n onLoad={handleImageLoad}\n onError={handleImageError}\n loading={imageUrl.startsWith('data:') ? 'eager' : 'lazy'}\n />\n )}\n </span>\n </>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_imageUtils","_imageBackdrop","_linkTypes","_ComponentDependenciesContext","_useResolvedImageSources","_jsxFileName","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","lowResFallbackCache","Map","OptimizedImage","exports","memo","props","alt","className","quality","format","progressive","placeholderColor","objectFit","layout","onLoad","onError","onClick","clickable","imageFromText","disableResize","imageMode","adaptiveBackdrop","fallbackOnLowRes","lowResThreshold","isResolvedMode","unresolvedSource","filename","preResolvedUrl","resolvedUrl","filter","undefined","sourceIdentifier","deps","useComponentDependencies","isLoaded","setIsLoaded","useState","isError","setIsError","imageUrl","setImageUrl","isFallback","setIsFallback","backdrop","setBackdrop","isDebugImageEnabled","useDebugImageContext","dimensions","setDimensions","containerRef","useRef","observerRef","isContextualImage","useMemo","isWeb5ImageUrl","contextualImageKey","rawKey","slice","length","decodeURIComponent","trim","resolutionInputs","src","images","resolvedSources","loading","isResolutionLoading","useResolvedImageSources","resolvedSource","useEffect","logContextualImage","url","contextualTerm","imageEventType","isImageResolved","isFallbackImage","contextualImageFallback","fallbacks","fallbackImages","Math","floor","random","effectiveFilename","sourceCacheKey","normalizeImageUrl","hasResolvedSourceDimensions","width","height","isLowResResolvedAsset","cachedFallbackUrl","showDynamicBadge","adaptiveActive","adaptiveResolved","effectiveObjectFit","hasBackdrop","effectiveImageMode","adaptiveBackgroundColor","backgroundColor","token","aborted","loadBackdropAnalysis","then","result","container","current","updateDimensions","rect","getBoundingClientRect","ceil","window","ResizeObserver","observe","handleResize","addEventListener","disconnect","removeEventListener","normalizedUrl","isExternalNonWixUrl","startsWith","includes","imageFilename","match","replace","dpr","devicePixelRatio","optimizedUrl","getResizedImageUrl","handleImageLoad","img","currentTarget","naturalWidth","naturalHeight","originalImageUrl","currentSrc","console","warn","fallbackImageUrl","handleImageError","error","source","Error","isTransparentPlaceholder","placeholderStyles","background","animation","backgroundSize","handleKeyDown","key","preventDefault","createElement","Fragment","ref","Boolean","join","style","minHeight","onKeyDown","tabIndex","role","__self","__source","fileName","lineNumber","columnNumber","fill","stroke","viewBox","focusable","strokeLinecap","strokeLinejoin","strokeWidth","d","maxWidth","display","position","inset"],"sources":["../../../../src/components/ui/OptimizedImage.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, memo, useMemo } from 'react';\nimport { getResizedImageUrl, normalizeImageUrl } from '../../utils/image-utils';\nimport {\n loadBackdropAnalysis,\n type BackdropAnalysis,\n} from '../../utils/imageBackdrop';\nimport { isWeb5ImageUrl } from '../../types/link-types';\nimport { useComponentDependencies } from '../../context/ComponentDependenciesContext';\nimport type { ImageSearchFilterString } from '../../image/imageSearchFilterTypes';\nimport { useResolvedImageSources } from '../../hooks/useResolvedImageSources';\n\nconst lowResFallbackCache = new Map<string, string>();\n\ninterface OptimizedImageBaseProps {\n /** Accessible alternative text for the rendered image. */\n alt: string;\n /** Additional CSS classes applied to the outer image container. */\n className?: string;\n /** Preferred output quality for resized Wix media URLs. */\n quality?: number;\n /** Requested output format for future image delivery customization. */\n format?: 'auto' | 'webp' | 'jpg' | 'png';\n /** Enables progressive loading behavior when supported by the delivery layer. */\n progressive?: boolean;\n /** Placeholder background color shown before the image loads. */\n placeholderColor?: string;\n /** CSS object-fit behavior applied to the rendered `<img>`. */\n objectFit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';\n /** Layout strategy for the image container. */\n layout?: 'fill' | 'intrinsic';\n /** Called after the final rendered image successfully loads. */\n onLoad?: () => void;\n /** Called when the final rendered image fails to load. */\n onError?: (error: Error) => void;\n /** Click handler for interactive image surfaces. */\n onClick?: () => void;\n /** Makes the image container keyboard-focusable and clickable. */\n clickable?: boolean;\n /** Marks the source as originating from text-driven image generation for BI logging. */\n imageFromText?: boolean;\n /** Skips Wix fitted delivery URL rewriting and uses the normalized original URL directly. */\n disableResize?: boolean;\n /** CDN resize mode. 'fill' crops to exact container dimensions (sharp at slot size).\n * 'fit' (default) preserves aspect ratio. */\n imageMode?: 'fit' | 'fill';\n /**\n * Auto-pick `objectFit`/`imageMode` per image by sniffing its edges on a\n * canvas (see `imageBackdrop.ts`). Images shot on a seamless backdrop are\n * rendered `contain` with the slot painted that backdrop colour (the subject\n * is never cropped, the letterbox is invisible); full-bleed scenes fall back\n * to `cover`. Overrides `objectFit`/`imageMode` once analysis resolves; until\n * then, and on any probe/CORS failure, the passed `objectFit`/`imageMode`\n * apply. No effect for `layout=\"intrinsic\"`. */\n adaptiveBackdrop?: boolean;\n /** Full URL to a fallback image used when the primary image is considered low resolution. */\n fallbackOnLowRes?: string;\n /** Minimum acceptable width or height before low-resolution fallback is triggered. */\n lowResThreshold?: number;\n}\n\ninterface OptimizedImageWithFilenameProps {\n /** Image source to render. Supports full URLs and `web5://image/...` contextual image tokens. */\n filename: string;\n /** Optional contextual search filter used only when resolving a `web5://image/...` source. */\n filter?: ImageSearchFilterString;\n /** Mutually exclusive with `filename`; provide this only when the image URL is already resolved. */\n resolvedUrl?: never;\n}\n\ninterface OptimizedImageWithResolvedUrlProps {\n /** Already-resolved image URL. When provided, OptimizedImage skips all source resolution. */\n resolvedUrl: string;\n /** Mutually exclusive with `resolvedUrl`; use `filename` when the source still needs resolving. */\n filename?: never;\n /** Not applicable for already-resolved image URLs. */\n filter?: never;\n}\n\nexport type OptimizedImageProps = OptimizedImageBaseProps &\n (OptimizedImageWithFilenameProps | OptimizedImageWithResolvedUrlProps);\n\nexport const OptimizedImage: React.FC<OptimizedImageProps> = memo((props) => {\n const {\n alt,\n className = '',\n quality = 85,\n format = 'auto',\n progressive = true,\n placeholderColor = '#f3f4f6',\n objectFit = 'contain',\n layout = 'fill',\n onLoad,\n onError,\n onClick,\n clickable = false,\n imageFromText = false,\n disableResize = false,\n imageMode = 'fit',\n adaptiveBackdrop = false,\n fallbackOnLowRes,\n lowResThreshold = 550,\n } = props;\n void format;\n void progressive;\n\n const isResolvedMode = 'resolvedUrl' in props;\n const unresolvedSource = 'filename' in props ? props.filename ?? '' : '';\n const preResolvedUrl = 'resolvedUrl' in props ? props.resolvedUrl : '';\n const filter = 'filename' in props ? props.filter : undefined;\n const sourceIdentifier = isResolvedMode ? preResolvedUrl : unresolvedSource;\n\n const deps = useComponentDependencies();\n const [isLoaded, setIsLoaded] = useState(false);\n const [isError, setIsError] = useState(false);\n const [imageUrl, setImageUrl] = useState<string>('');\n const [isFallback, setIsFallback] = useState(false);\n // null = adaptive analysis pending (only meaningful when adaptiveBackdrop).\n const [backdrop, setBackdrop] = useState<BackdropAnalysis | null>(null);\n const isDebugImageEnabled = deps.useDebugImageContext();\n const [dimensions, setDimensions] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const isContextualImage = useMemo(\n () =>\n !isResolvedMode &&\n !!(unresolvedSource && isWeb5ImageUrl(unresolvedSource)),\n [isResolvedMode, unresolvedSource],\n );\n\n const contextualImageKey = useMemo(() => {\n if (!isContextualImage) {\n return '';\n }\n const rawKey = unresolvedSource.slice('web5://image/'.length);\n try {\n return decodeURIComponent(rawKey).trim();\n } catch {\n return rawKey.trim();\n }\n }, [isContextualImage, unresolvedSource]);\n const resolutionInputs = useMemo(\n () =>\n isResolvedMode || !unresolvedSource\n ? []\n : [\n {\n src: unresolvedSource,\n filter,\n },\n ],\n [filter, isResolvedMode, unresolvedSource],\n );\n const { images: resolvedSources, loading: isResolutionLoading } =\n useResolvedImageSources(resolutionInputs);\n const resolvedSource = useMemo(\n () => (!isResolvedMode ? resolvedSources?.[0] ?? null : null),\n [isResolvedMode, resolvedSources],\n );\n\n useEffect(() => {\n if (\n !isContextualImage ||\n isResolvedMode ||\n isResolutionLoading ||\n resolvedSources === null\n ) {\n return;\n }\n\n deps.logContextualImage?.({\n imageUrl: resolvedSource?.url ?? '',\n contextualTerm: contextualImageKey,\n imageEventType: imageFromText\n ? 'web5_image_link_from_text'\n : 'web5_image_link',\n isImageResolved: !!resolvedSource?.url,\n isFallbackImage: false,\n });\n }, [\n contextualImageKey,\n deps,\n imageFromText,\n isContextualImage,\n isResolvedMode,\n isResolutionLoading,\n resolvedSource?.url,\n resolvedSources,\n ]);\n\n // When imageFromText contextual image resolution returns empty, use a random fallback\n const contextualImageFallback = useMemo(() => {\n if (\n !imageFromText ||\n !isContextualImage ||\n isResolutionLoading ||\n resolvedSources === null ||\n resolvedSource?.url\n ) {\n return '';\n }\n const fallbacks = deps.fallbackImages;\n if (!fallbacks || fallbacks.length === 0) {\n return '';\n }\n return fallbacks[Math.floor(Math.random() * fallbacks.length)];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n imageFromText,\n isContextualImage,\n isResolutionLoading,\n resolvedSources,\n resolvedSource?.url,\n deps.fallbackImages,\n ]);\n\n // Log when a fallback image is used for an unresolved contextual image\n useEffect(() => {\n if (!contextualImageFallback) {\n return;\n }\n deps.logContextualImage?.({\n imageUrl: contextualImageFallback,\n contextualTerm: contextualImageKey,\n imageEventType: 'web5_image_fallback',\n isImageResolved: false,\n isFallbackImage: true,\n });\n }, [contextualImageFallback, contextualImageKey, deps]);\n\n const effectiveFilename = isResolvedMode\n ? preResolvedUrl\n : resolvedSource?.url || contextualImageFallback;\n const sourceCacheKey = useMemo(\n () =>\n effectiveFilename ? normalizeImageUrl(effectiveFilename).trim() : '',\n [effectiveFilename],\n );\n const hasResolvedSourceDimensions =\n typeof resolvedSource?.width === 'number' &&\n typeof resolvedSource?.height === 'number';\n const isLowResResolvedAsset =\n hasResolvedSourceDimensions &&\n (resolvedSource.width! < lowResThreshold ||\n resolvedSource.height! < lowResThreshold);\n const cachedFallbackUrl = useMemo(\n () => (sourceCacheKey ? lowResFallbackCache.get(sourceCacheKey) ?? '' : ''),\n [sourceCacheKey],\n );\n const showDynamicBadge = isContextualImage && isDebugImageEnabled;\n\n // Adaptive fit: probe the resolved image's edges, then map to fit/object-fit.\n // Until analysis resolves (`backdrop === null`) the displayed URL is held back\n // so we never fetch with the wrong mode and flash a re-crop. On a backdrop we\n // render `contain` (whole subject visible) and paint the slot its colour; on a\n // busy scene we `cover`. Failures resolve to `hasBackdrop: false` → `cover`.\n const adaptiveActive = adaptiveBackdrop && layout !== 'intrinsic';\n const adaptiveResolved = !adaptiveActive || backdrop !== null;\n const effectiveObjectFit = adaptiveActive\n ? backdrop?.hasBackdrop\n ? 'contain'\n : 'cover'\n : objectFit;\n const effectiveImageMode = adaptiveActive\n ? backdrop?.hasBackdrop\n ? 'fit'\n : 'fill'\n : imageMode;\n const adaptiveBackgroundColor =\n adaptiveActive && backdrop?.hasBackdrop\n ? backdrop.backgroundColor\n : undefined;\n\n useEffect(() => {\n if (!adaptiveActive) {\n return;\n }\n setBackdrop(null);\n if (\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n // No analyzable primary source → behave like a busy scene (cover).\n setBackdrop({ hasBackdrop: false });\n return;\n }\n const token = { aborted: false };\n loadBackdropAnalysis(effectiveFilename, token).then((result) => {\n if (!token.aborted) {\n setBackdrop(result);\n }\n });\n return () => {\n token.aborted = true;\n };\n }, [\n adaptiveActive,\n effectiveFilename,\n isFallback,\n cachedFallbackUrl,\n isLowResResolvedAsset,\n fallbackOnLowRes,\n ]);\n\n useEffect(() => {\n setIsLoaded(false);\n setIsError(false);\n setIsFallback(false);\n setImageUrl('');\n }, [sourceCacheKey, fallbackOnLowRes]);\n\n useEffect(() => {\n if (!sourceCacheKey || !fallbackOnLowRes) {\n return;\n }\n\n if (isLowResResolvedAsset) {\n lowResFallbackCache.set(sourceCacheKey, fallbackOnLowRes);\n setIsFallback(true);\n setImageUrl(fallbackOnLowRes);\n return;\n }\n\n if (!cachedFallbackUrl) {\n return;\n }\n\n setIsFallback(true);\n setImageUrl(cachedFallbackUrl);\n }, [\n cachedFallbackUrl,\n fallbackOnLowRes,\n isLowResResolvedAsset,\n sourceCacheKey,\n ]);\n\n // For fill layout, measure container so we can request a resized Wix image.\n useEffect(() => {\n if (layout === 'intrinsic' || disableResize) {\n return;\n }\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const updateDimensions = () => {\n const rect = container.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n setDimensions({\n width: Math.ceil(rect.width),\n height: Math.ceil(rect.height),\n });\n }\n };\n\n updateDimensions();\n\n if ('ResizeObserver' in window) {\n observerRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n observerRef.current.observe(container);\n }\n\n const handleResize = () => updateDimensions();\n window.addEventListener('resize', handleResize);\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n window.removeEventListener('resize', handleResize);\n };\n }, [disableResize, layout]);\n\n // Intrinsic layout: use normalized URL without resize logic.\n useEffect(() => {\n if (layout !== 'intrinsic') {\n return;\n }\n if (\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n const normalizedUrl = normalizeImageUrl(effectiveFilename);\n setImageUrl(normalizedUrl);\n }, [\n cachedFallbackUrl,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n ]);\n\n // External non-Wix URLs skip resizing; use them immediately.\n useEffect(() => {\n if (layout === 'intrinsic') {\n return;\n }\n if (\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n const normalizedUrl = normalizeImageUrl(effectiveFilename);\n const isExternalNonWixUrl =\n (normalizedUrl.startsWith('http://') ||\n normalizedUrl.startsWith('https://')) &&\n !normalizedUrl.includes('static.wixstatic.com');\n\n if (isExternalNonWixUrl) {\n setImageUrl(normalizedUrl);\n }\n }, [\n cachedFallbackUrl,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n ]);\n\n // Explicit opt-out: use original normalized URL even in fill layouts.\n useEffect(() => {\n if (layout === 'intrinsic') {\n return;\n }\n if (\n !disableResize ||\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n setImageUrl(normalizeImageUrl(effectiveFilename));\n }, [\n cachedFallbackUrl,\n disableResize,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n ]);\n\n // Wix/local URLs: wait for dimensions, then build a resized URL.\n useEffect(() => {\n if (layout === 'intrinsic') {\n return;\n }\n if (disableResize) {\n return;\n }\n // Hold the fetch until adaptive analysis picks fit vs fill, so we request\n // the right CDN mode once instead of fetching twice and re-cropping.\n if (!adaptiveResolved) {\n return;\n }\n if (\n !dimensions ||\n !effectiveFilename ||\n isFallback ||\n cachedFallbackUrl ||\n (isLowResResolvedAsset && fallbackOnLowRes)\n ) {\n return;\n }\n\n const normalizedUrl = normalizeImageUrl(effectiveFilename);\n const isExternalNonWixUrl =\n (normalizedUrl.startsWith('http://') ||\n normalizedUrl.startsWith('https://')) &&\n !normalizedUrl.includes('static.wixstatic.com');\n\n if (isExternalNonWixUrl) {\n return;\n }\n\n let imageFilename = effectiveFilename;\n if (normalizedUrl.includes('static.wixstatic.com')) {\n const match = normalizedUrl.match(/media\\/([^/?]+)/);\n if (match && match[1]) {\n imageFilename = match[1];\n } else {\n setImageUrl(normalizedUrl);\n return;\n }\n } else if (\n normalizedUrl.startsWith('https://static.wixstatic.com/media/')\n ) {\n imageFilename = normalizedUrl.replace(\n 'https://static.wixstatic.com/media/',\n '',\n );\n }\n\n const dpr = window.devicePixelRatio ?? 1;\n const optimizedUrl = getResizedImageUrl(\n imageFilename,\n dimensions.width * dpr,\n dimensions.height * dpr,\n { quality, imageMode: effectiveImageMode },\n );\n setImageUrl(optimizedUrl);\n }, [\n dimensions,\n cachedFallbackUrl,\n effectiveFilename,\n isFallback,\n isLowResResolvedAsset,\n layout,\n disableResize,\n quality,\n effectiveImageMode,\n adaptiveResolved,\n ]);\n\n const handleImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n\n if (\n fallbackOnLowRes &&\n !isFallback &&\n !hasResolvedSourceDimensions &&\n (img.naturalWidth < lowResThreshold ||\n img.naturalHeight < lowResThreshold)\n ) {\n const originalImageUrl =\n img.currentSrc || imageUrl || effectiveFilename || sourceIdentifier;\n\n if (sourceCacheKey) {\n lowResFallbackCache.set(sourceCacheKey, fallbackOnLowRes);\n }\n\n setIsFallback(true);\n setImageUrl(fallbackOnLowRes);\n setIsLoaded(false);\n\n console.warn('OptimizedImage applied a low-res fallback image.', {\n originalImageUrl,\n fallbackImageUrl: fallbackOnLowRes,\n naturalWidth: img.naturalWidth,\n naturalHeight: img.naturalHeight,\n lowResThreshold,\n });\n\n deps.logContextualImage?.({\n imageUrl: fallbackOnLowRes,\n contextualTerm: contextualImageKey,\n imageEventType: 'web5_image_fallback',\n isImageResolved: true,\n isFallbackImage: true,\n });\n return;\n }\n\n setIsLoaded(true);\n onLoad?.();\n };\n\n const handleImageError = () => {\n setIsError(true);\n console.error('Failed to load image:', {\n source: sourceIdentifier,\n imageUrl,\n alt,\n });\n onError?.(new Error(`Failed to load image: ${sourceIdentifier}`));\n };\n\n const isTransparentPlaceholder = placeholderColor === 'transparent';\n const placeholderStyles = isTransparentPlaceholder\n ? {\n background: 'transparent',\n animation: 'none',\n }\n : {\n background: `linear-gradient(90deg, ${placeholderColor} 0%, #e5e7eb 50%, ${placeholderColor} 100%)`,\n backgroundSize: '200% 100%',\n animation: 'shimmer 2s infinite ease-in-out',\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <>\n <span\n ref={containerRef}\n className={[\n 'block',\n layout === 'intrinsic' ? '' : 'relative overflow-hidden',\n showDynamicBadge ? 'relative' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={\n layout === 'intrinsic'\n ? undefined\n : { minHeight: '1px', backgroundColor: adaptiveBackgroundColor }\n }\n onClick={clickable ? onClick : undefined}\n onKeyDown={clickable ? handleKeyDown : undefined}\n tabIndex={clickable ? 0 : undefined}\n role={clickable ? 'button' : undefined}\n aria-label={clickable ? alt : undefined}\n >\n {showDynamicBadge && (\n <span className=\"absolute left-2 top-2 z-10 rounded bg-blue-600/90 px-2 py-1 text-[10px] font-semibold tracking-wide text-white shadow block\">\n {contextualImageKey}\n </span>\n )}\n {!isLoaded && !isError && sourceIdentifier && (\n <span\n className=\"absolute inset-0 rounded block\"\n style={placeholderStyles}\n role=\"status\"\n aria-label=\"Loading image\"\n />\n )}\n\n {isError && (\n <span\n className=\"absolute inset-0 flex items-center justify-center bg-gray-100 text-gray-500 rounded block\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <span className=\"text-center p-4 block\">\n <svg\n className=\"w-8 h-8 mx-auto mb-2 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n <span className=\"text-xs block\">Failed to load image</span>\n </span>\n </span>\n )}\n\n {imageUrl && !isError && (\n <img\n src={imageUrl}\n alt={alt}\n className={`${\n layout === 'intrinsic'\n ? 'w-full h-auto'\n : 'absolute inset-0 w-full h-full'\n } transition-opacity duration-300 ${\n isLoaded ? 'opacity-100' : 'opacity-0'\n } ${\n effectiveObjectFit === 'contain'\n ? 'object-contain'\n : effectiveObjectFit === 'cover'\n ? 'object-cover'\n : effectiveObjectFit === 'fill'\n ? 'object-fill'\n : effectiveObjectFit === 'none'\n ? 'object-none'\n : effectiveObjectFit === 'scale-down'\n ? 'object-scale-down'\n : ''\n }`}\n style={\n layout === 'intrinsic'\n ? {\n width: '100%',\n height: 'auto',\n maxWidth: '100%',\n display: 'block',\n }\n : {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n objectFit: effectiveObjectFit,\n maxWidth: '100%',\n display: 'block',\n }\n }\n onLoad={handleImageLoad}\n onError={handleImageError}\n loading={imageUrl.startsWith('data:') ? 'eager' : 'lazy'}\n />\n )}\n </span>\n </>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,25 @@
|
|
|
9
9
|
pointer-events: none;
|
|
10
10
|
user-select: none;
|
|
11
11
|
padding-block: 4rem;
|
|
12
|
+
/* `min-height` (per-shape, below) includes the block padding so the reserved
|
|
13
|
+
space matches the eventual section regardless of the consuming app's reset. */
|
|
14
|
+
box-sizing: border-box;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Per-section-type height reservation (DL #114 C) — approximate the eventual
|
|
18
|
+
section so the skeleton→content swap causes near-zero layout shift below it.
|
|
19
|
+
Erring slightly tall is preferable (content settles up, not down). */
|
|
20
|
+
.w5-skeleton--cards {
|
|
21
|
+
min-height: 28rem;
|
|
22
|
+
}
|
|
23
|
+
.w5-skeleton--tiles {
|
|
24
|
+
min-height: 14rem;
|
|
25
|
+
}
|
|
26
|
+
.w5-skeleton--rows {
|
|
27
|
+
min-height: 18rem;
|
|
28
|
+
}
|
|
29
|
+
.w5-skeleton--lines {
|
|
30
|
+
min-height: 10rem;
|
|
12
31
|
}
|
|
13
32
|
|
|
14
33
|
@media (min-width: 64rem) {
|
|
@@ -150,7 +150,11 @@ const SectionSkeleton = ({
|
|
|
150
150
|
const Shape = SHAPES[shape];
|
|
151
151
|
const label = (semantic || sectionType || 'content').replace(/[-_]/g, ' ');
|
|
152
152
|
return /*#__PURE__*/_react.default.createElement("section", {
|
|
153
|
-
|
|
153
|
+
// `w5-skeleton--<shape>` reserves a realistic min-height per section type so
|
|
154
|
+
// the skeleton→content swap doesn't reflow the sections below it; the
|
|
155
|
+
// `w5-skeleton-expand` class unfolds it from the top when it first appears
|
|
156
|
+
// (both DL #114 C; the expand rule lives in base-utilities.css).
|
|
157
|
+
className: `w5-skeleton w5-skeleton--${shape} w5-skeleton-expand ${className}`.trim(),
|
|
154
158
|
role: "status",
|
|
155
159
|
"aria-busy": "true",
|
|
156
160
|
"aria-label": `Loading ${label} section`,
|
|
@@ -165,7 +169,7 @@ const SectionSkeleton = ({
|
|
|
165
169
|
__self: void 0,
|
|
166
170
|
__source: {
|
|
167
171
|
fileName: _jsxFileName,
|
|
168
|
-
lineNumber:
|
|
172
|
+
lineNumber: 111,
|
|
169
173
|
columnNumber: 7
|
|
170
174
|
}
|
|
171
175
|
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
@@ -174,14 +178,14 @@ const SectionSkeleton = ({
|
|
|
174
178
|
__self: void 0,
|
|
175
179
|
__source: {
|
|
176
180
|
fileName: _jsxFileName,
|
|
177
|
-
lineNumber:
|
|
181
|
+
lineNumber: 112,
|
|
178
182
|
columnNumber: 9
|
|
179
183
|
}
|
|
180
184
|
}), /*#__PURE__*/_react.default.createElement(Shape, {
|
|
181
185
|
__self: void 0,
|
|
182
186
|
__source: {
|
|
183
187
|
fileName: _jsxFileName,
|
|
184
|
-
lineNumber:
|
|
188
|
+
lineNumber: 116,
|
|
185
189
|
columnNumber: 9
|
|
186
190
|
}
|
|
187
191
|
})));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_jsxFileName","shapeFor","sectionType","semantic","key","toLowerCase","test","Cards","default","createElement","className","__self","__source","fileName","lineNumber","columnNumber","map","i","Tiles","Rows","LINE_WIDTHS","Lines","w","SHAPES","cards","tiles","rows","lines","SectionSkeleton","shape","Shape","label","replace","trim","role","exports"],"sources":["../../../../src/components/ui/SectionSkeleton.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport './SectionSkeleton.css';\n\n/**\n * Default status-driven placeholder for a V3 section that's been declared (its\n * `<!-- section ... -->` remark arrived in the layout pass) but whose body\n * hasn't finished streaming yet (DL #106). Lives in core so every surface has a\n * sensible default; client packages can override via\n * `uiSlots.SectionSkeletonComponent` and the app resolves the override at\n * render time (see web50-server-ui `SectionSkeletonSlot`).\n *\n * Unlike real sections it does NOT go through the ComponentRegistry — the\n * registry maps parsed content nodes to components, and a skeleton has no\n * content node. The consumption layer hand-builds a `PageSection` whose\n * `component` is this element.\n *\n * Shape is chosen from the section's `semantic`/`sectionType` so the placeholder\n * roughly matches what will replace it (cards for item grids, tiles for KPIs,\n * rows for tables, lines for prose) — minimizing reflow on the skeleton→content\n * swap.\n */\nexport interface SectionSkeletonProps {\n sectionType?: string;\n semantic?: string;\n className?: string;\n}\n\ntype SkeletonShape = 'cards' | 'tiles' | 'rows' | 'lines';\n\nconst shapeFor = (sectionType = '', semantic = ''): SkeletonShape => {\n const key = `${semantic} ${sectionType}`.toLowerCase();\n if (/\\bkpi\\b|metric/.test(key)) {\n return 'tiles';\n }\n if (/comparison|table/.test(key)) {\n return 'rows';\n }\n if (/item|feature_list|gallery|card/.test(key)) {\n return 'cards';\n }\n return 'lines';\n};\n\nconst Cards: FC = () => (\n <div className=\"w5-skeleton__grid\">\n {[0, 1, 2, 3].map((i) => (\n <div key={i} className=\"w5-skeleton__card\">\n <span className=\"w5-skeleton__bar w5-skeleton__media\" />\n <span className=\"w5-skeleton__bar w5-skeleton__line w5-skeleton__line--md\" />\n <span className=\"w5-skeleton__bar w5-skeleton__line w5-skeleton__line--sm\" />\n </div>\n ))}\n </div>\n);\n\nconst Tiles: FC = () => (\n <div className=\"w5-skeleton__grid\">\n {[0, 1, 2, 3].map((i) => (\n <span key={i} className=\"w5-skeleton__bar w5-skeleton__tile\" />\n ))}\n </div>\n);\n\nconst Rows: FC = () => (\n <div className=\"w5-skeleton__lines\">\n {[0, 1, 2, 3, 4].map((i) => (\n <span key={i} className=\"w5-skeleton__bar w5-skeleton__row\" />\n ))}\n </div>\n);\n\nconst LINE_WIDTHS = ['lg', 'md', 'lg', 'md', 'sm'] as const;\nconst Lines: FC = () => (\n <div className=\"w5-skeleton__lines\">\n {LINE_WIDTHS.map((w, i) => (\n <span\n key={i}\n className={`w5-skeleton__bar w5-skeleton__line w5-skeleton__line--${w}`}\n />\n ))}\n </div>\n);\n\nconst SHAPES: Record<SkeletonShape, FC> = {\n cards: Cards,\n tiles: Tiles,\n rows: Rows,\n lines: Lines,\n};\n\nexport const SectionSkeleton: FC<SectionSkeletonProps> = ({\n sectionType,\n semantic,\n className = '',\n}) => {\n const shape = shapeFor(sectionType, semantic);\n const Shape = SHAPES[shape];\n const label = (semantic || sectionType || 'content').replace(/[-_]/g, ' ');\n\n return (\n <section\n className={`w5-skeleton ${className}`.trim()}\n role=\"status\"\n aria-busy=\"true\"\n aria-label={`Loading ${label} section`}\n >\n <div className=\"w5-skeleton__inner\">\n <span\n className=\"w5-skeleton__bar w5-skeleton__title\"\n aria-hidden=\"true\"\n />\n <Shape />\n </div>\n </section>\n );\n};\n"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_jsxFileName","shapeFor","sectionType","semantic","key","toLowerCase","test","Cards","default","createElement","className","__self","__source","fileName","lineNumber","columnNumber","map","i","Tiles","Rows","LINE_WIDTHS","Lines","w","SHAPES","cards","tiles","rows","lines","SectionSkeleton","shape","Shape","label","replace","trim","role","exports"],"sources":["../../../../src/components/ui/SectionSkeleton.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport './SectionSkeleton.css';\n\n/**\n * Default status-driven placeholder for a V3 section that's been declared (its\n * `<!-- section ... -->` remark arrived in the layout pass) but whose body\n * hasn't finished streaming yet (DL #106). Lives in core so every surface has a\n * sensible default; client packages can override via\n * `uiSlots.SectionSkeletonComponent` and the app resolves the override at\n * render time (see web50-server-ui `SectionSkeletonSlot`).\n *\n * Unlike real sections it does NOT go through the ComponentRegistry — the\n * registry maps parsed content nodes to components, and a skeleton has no\n * content node. The consumption layer hand-builds a `PageSection` whose\n * `component` is this element.\n *\n * Shape is chosen from the section's `semantic`/`sectionType` so the placeholder\n * roughly matches what will replace it (cards for item grids, tiles for KPIs,\n * rows for tables, lines for prose) — minimizing reflow on the skeleton→content\n * swap.\n */\nexport interface SectionSkeletonProps {\n sectionType?: string;\n semantic?: string;\n className?: string;\n}\n\ntype SkeletonShape = 'cards' | 'tiles' | 'rows' | 'lines';\n\nconst shapeFor = (sectionType = '', semantic = ''): SkeletonShape => {\n const key = `${semantic} ${sectionType}`.toLowerCase();\n if (/\\bkpi\\b|metric/.test(key)) {\n return 'tiles';\n }\n if (/comparison|table/.test(key)) {\n return 'rows';\n }\n if (/item|feature_list|gallery|card/.test(key)) {\n return 'cards';\n }\n return 'lines';\n};\n\nconst Cards: FC = () => (\n <div className=\"w5-skeleton__grid\">\n {[0, 1, 2, 3].map((i) => (\n <div key={i} className=\"w5-skeleton__card\">\n <span className=\"w5-skeleton__bar w5-skeleton__media\" />\n <span className=\"w5-skeleton__bar w5-skeleton__line w5-skeleton__line--md\" />\n <span className=\"w5-skeleton__bar w5-skeleton__line w5-skeleton__line--sm\" />\n </div>\n ))}\n </div>\n);\n\nconst Tiles: FC = () => (\n <div className=\"w5-skeleton__grid\">\n {[0, 1, 2, 3].map((i) => (\n <span key={i} className=\"w5-skeleton__bar w5-skeleton__tile\" />\n ))}\n </div>\n);\n\nconst Rows: FC = () => (\n <div className=\"w5-skeleton__lines\">\n {[0, 1, 2, 3, 4].map((i) => (\n <span key={i} className=\"w5-skeleton__bar w5-skeleton__row\" />\n ))}\n </div>\n);\n\nconst LINE_WIDTHS = ['lg', 'md', 'lg', 'md', 'sm'] as const;\nconst Lines: FC = () => (\n <div className=\"w5-skeleton__lines\">\n {LINE_WIDTHS.map((w, i) => (\n <span\n key={i}\n className={`w5-skeleton__bar w5-skeleton__line w5-skeleton__line--${w}`}\n />\n ))}\n </div>\n);\n\nconst SHAPES: Record<SkeletonShape, FC> = {\n cards: Cards,\n tiles: Tiles,\n rows: Rows,\n lines: Lines,\n};\n\nexport const SectionSkeleton: FC<SectionSkeletonProps> = ({\n sectionType,\n semantic,\n className = '',\n}) => {\n const shape = shapeFor(sectionType, semantic);\n const Shape = SHAPES[shape];\n const label = (semantic || sectionType || 'content').replace(/[-_]/g, ' ');\n\n return (\n <section\n // `w5-skeleton--<shape>` reserves a realistic min-height per section type so\n // the skeleton→content swap doesn't reflow the sections below it; the\n // `w5-skeleton-expand` class unfolds it from the top when it first appears\n // (both DL #114 C; the expand rule lives in base-utilities.css).\n className={`w5-skeleton w5-skeleton--${shape} w5-skeleton-expand ${className}`.trim()}\n role=\"status\"\n aria-busy=\"true\"\n aria-label={`Loading ${label} section`}\n >\n <div className=\"w5-skeleton__inner\">\n <span\n className=\"w5-skeleton__bar w5-skeleton__title\"\n aria-hidden=\"true\"\n />\n <Shape />\n </div>\n </section>\n );\n};\n"],"mappings":";;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACAA,OAAA;AAA+B,IAAAC,YAAA;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,MAAMC,QAAQ,GAAGA,CAACC,WAAW,GAAG,EAAE,EAAEC,QAAQ,GAAG,EAAE,KAAoB;EACnE,MAAMC,GAAG,GAAG,GAAGD,QAAQ,IAAID,WAAW,EAAE,CAACG,WAAW,CAAC,CAAC;EACtD,IAAI,gBAAgB,CAACC,IAAI,CAACF,GAAG,CAAC,EAAE;IAC9B,OAAO,OAAO;EAChB;EACA,IAAI,kBAAkB,CAACE,IAAI,CAACF,GAAG,CAAC,EAAE;IAChC,OAAO,MAAM;EACf;EACA,IAAI,gCAAgC,CAACE,IAAI,CAACF,GAAG,CAAC,EAAE;IAC9C,OAAO,OAAO;EAChB;EACA,OAAO,OAAO;AAChB,CAAC;AAED,MAAMG,KAAS,GAAGA,CAAA,kBAChBV,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAKC,SAAS,EAAC,mBAAmB;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,GAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAACC,GAAG,CAAEC,CAAC,iBAClBpB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAKL,GAAG,EAAEa,CAAE;EAACP,SAAS,EAAC,mBAAmB;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,gBACxClB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAMC,SAAS,EAAC,qCAAqC;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,CAAE,CAAC,eACxDlB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAMC,SAAS,EAAC,0DAA0D;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,CAAE,CAAC,eAC7ElB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAMC,SAAS,EAAC,0DAA0D;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,CAAE,CACzE,CACN,CACE,CACN;AAED,MAAMG,KAAS,GAAGA,CAAA,kBAChBrB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAKC,SAAS,EAAC,mBAAmB;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,GAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAACC,GAAG,CAAEC,CAAC,iBAClBpB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAML,GAAG,EAAEa,CAAE;EAACP,SAAS,EAAC,oCAAoC;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,CAAE,CAC/D,CACE,CACN;AAED,MAAMI,IAAQ,GAAGA,CAAA,kBACftB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAKC,SAAS,EAAC,oBAAoB;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,GAChC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAACC,GAAG,CAAEC,CAAC,iBACrBpB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAML,GAAG,EAAEa,CAAE;EAACP,SAAS,EAAC,mCAAmC;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,CAAE,CAC9D,CACE,CACN;AAED,MAAMK,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU;AAC3D,MAAMC,KAAS,GAAGA,CAAA,kBAChBxB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EAAKC,SAAS,EAAC,oBAAoB;EAAAC,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,GAChCK,WAAW,CAACJ,GAAG,CAAC,CAACM,CAAC,EAAEL,CAAC,kBACpBpB,MAAA,CAAAW,OAAA,CAAAC,aAAA;EACEL,GAAG,EAAEa,CAAE;EACPP,SAAS,EAAE,yDAAyDY,CAAC,EAAG;EAAAX,MAAA;EAAAC,QAAA;IAAAC,QAAA,EAAAb,YAAA;IAAAc,UAAA;IAAAC,YAAA;EAAA;AAAA,CACzE,CACF,CACE,CACN;AAED,MAAMQ,MAAiC,GAAG;EACxCC,KAAK,EAAEjB,KAAK;EACZkB,KAAK,EAAEP,KAAK;EACZQ,IAAI,EAAEP,IAAI;EACVQ,KAAK,EAAEN;AACT,CAAC;AAEM,MAAMO,eAAyC,GAAGA,CAAC;EACxD1B,WAAW;EACXC,QAAQ;EACRO,SAAS,GAAG;AACd,CAAC,KAAK;EACJ,MAAMmB,KAAK,GAAG5B,QAAQ,CAACC,WAAW,EAAEC,QAAQ,CAAC;EAC7C,MAAM2B,KAAK,GAAGP,MAAM,CAACM,KAAK,CAAC;EAC3B,MAAME,KAAK,GAAG,CAAC5B,QAAQ,IAAID,WAAW,IAAI,SAAS,EAAE8B,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;EAE1E,oBACEnC,MAAA,CAAAW,OAAA,CAAAC,aAAA;IACE;IACA;IACA;IACA;IACAC,SAAS,EAAE,4BAA4BmB,KAAK,uBAAuBnB,SAAS,EAAE,CAACuB,IAAI,CAAC,CAAE;IACtFC,IAAI,EAAC,QAAQ;IACb,aAAU,MAAM;IAChB,cAAY,WAAWH,KAAK,UAAW;IAAApB,MAAA;IAAAC,QAAA;MAAAC,QAAA,EAAAb,YAAA;MAAAc,UAAA;MAAAC,YAAA;IAAA;EAAA,gBAEvClB,MAAA,CAAAW,OAAA,CAAAC,aAAA;IAAKC,SAAS,EAAC,oBAAoB;IAAAC,MAAA;IAAAC,QAAA;MAAAC,QAAA,EAAAb,YAAA;MAAAc,UAAA;MAAAC,YAAA;IAAA;EAAA,gBACjClB,MAAA,CAAAW,OAAA,CAAAC,aAAA;IACEC,SAAS,EAAC,qCAAqC;IAC/C,eAAY,MAAM;IAAAC,MAAA;IAAAC,QAAA;MAAAC,QAAA,EAAAb,YAAA;MAAAc,UAAA;MAAAC,YAAA;IAAA;EAAA,CACnB,CAAC,eACFlB,MAAA,CAAAW,OAAA,CAAAC,aAAA,CAACqB,KAAK;IAAAnB,MAAA;IAAAC,QAAA;MAAAC,QAAA,EAAAb,YAAA;MAAAc,UAAA;MAAAC,YAAA;IAAA;EAAA,CAAE,CACL,CACE,CAAC;AAEd,CAAC;AAACoB,OAAA,CAAAP,eAAA,GAAAA,eAAA","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/* Product-page back badge (DL #114) — self-contained CSS so the badge renders
|
|
2
|
+
styled even where the consumer doesn't compile Tailwind from web5-core/src.
|
|
3
|
+
Mounted inside the shared `UserQuery` header; clients can re-skin via the
|
|
4
|
+
`--web5-product-back-*` custom properties, or replace the whole header via
|
|
5
|
+
the `UserQueryComponent` UI slot. */
|
|
6
|
+
|
|
7
|
+
/* Left column: the badge row stacked above the user's query, with the row→query
|
|
8
|
+
gap. Used whether or not a badge is present (harmless with a single child). */
|
|
9
|
+
.web5-user-query__left {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
gap: var(--web5-user-query-row-gap, 11px);
|
|
13
|
+
min-width: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Badge row: back arrow + thumbnail + product name. */
|
|
17
|
+
.web5-user-query__product-back {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: var(--web5-product-back-gap, 11px);
|
|
21
|
+
min-width: 0;
|
|
22
|
+
max-width: var(--web5-product-back-max-width, 440px);
|
|
23
|
+
margin: 0;
|
|
24
|
+
padding: 0;
|
|
25
|
+
background: transparent;
|
|
26
|
+
border: 0;
|
|
27
|
+
text-align: left;
|
|
28
|
+
color: inherit;
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
transition: color 0.15s ease;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Non-clickable variant (no validated backUrl). */
|
|
34
|
+
.web5-user-query__product-back--static {
|
|
35
|
+
cursor: default;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.web5-user-query__product-back-icon {
|
|
39
|
+
flex: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.web5-user-query__product-back-thumb {
|
|
43
|
+
flex: none;
|
|
44
|
+
width: var(--web5-product-thumb-size, 34px);
|
|
45
|
+
height: var(--web5-product-thumb-size, 34px);
|
|
46
|
+
border-radius: var(--web5-product-thumb-radius, 3px);
|
|
47
|
+
border: 1px solid var(--web5-product-thumb-border, #f1f0ee);
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
background: #fff;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.web5-user-query__product-back-thumb img {
|
|
53
|
+
display: block;
|
|
54
|
+
width: 100%;
|
|
55
|
+
height: 100%;
|
|
56
|
+
object-fit: cover;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.web5-user-query__product-back-title {
|
|
60
|
+
min-width: 0;
|
|
61
|
+
overflow: hidden;
|
|
62
|
+
text-overflow: ellipsis;
|
|
63
|
+
white-space: nowrap;
|
|
64
|
+
font-size: var(--web5-product-back-title-size, 16px);
|
|
65
|
+
line-height: var(--web5-product-back-title-line-height, 20px);
|
|
66
|
+
font-weight: var(--web5-product-back-title-weight, 500);
|
|
67
|
+
color: var(--web5-product-back-title-color, var(--body-text-color, #2b2b2b));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.web5-user-query__product-back:hover .web5-user-query__product-back-title {
|
|
71
|
+
text-decoration: underline;
|
|
72
|
+
}
|