@burdenoff/website-sdk 2026.720.4 → 2026.720.6

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/store/product-card.tsx","../../src/store/queries.ts","../../src/client/security.ts","../../src/client/graphql-client.ts","../../src/client/provider.tsx","../../src/seo/page-head.tsx","../../src/store/store-home.tsx","../../src/store/store-browse.tsx","../../src/store/workflow-embed.tsx","../../src/store/store-product-detail.tsx"],"names":["jsxs","jsx","Fragment","useState","useRef","useEffect","useMemo"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\n\nimport type { StoreProduct } from \"./types\";\n\n// ─── helpers ────────────────────────────────────────────────────────────────\n\nexport function formatPrice(\n price: number | null | undefined,\n currency: string | null | undefined,\n pricingModel: string,\n): string {\n if (pricingModel === \"FREE\" || !price || price === 0) return \"Free\";\n const curr = currency || \"USD\";\n try {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: curr,\n }).format(price);\n } catch {\n return `${curr} ${price.toFixed(2)}`;\n }\n}\n\nexport function formatDownloads(n: number | null | undefined): string {\n if (!n) return \"0\";\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toString();\n}\n\nexport function StarRating({ rating }: { rating: number }) {\n return (\n <span className=\"flex items-center gap-0.5\">\n {[1, 2, 3, 4, 5].map((star) => (\n <svg\n key={star}\n viewBox=\"0 0 12 12\"\n className={`w-3 h-3 ${\n star <= Math.round(rating)\n ? \"text-amber-400 fill-current\"\n : \"text-muted-foreground/30 fill-current\"\n }`}\n >\n <path d=\"M6 1l1.545 3.09L11 4.59l-2.5 2.41.59 3.41L6 8.79l-3.09 1.61L3.5 7 1 4.59l3.455-.5L6 1z\" />\n </svg>\n ))}\n </span>\n );\n}\n\nexport function TypeBadge({ type }: { type: string }) {\n const labels: Record<string, string> = {\n APP: \"App\",\n NODE: \"Node\",\n WORKFLOW: \"Workflow\",\n TEMPLATE: \"Template\",\n INTEGRATION: \"Integration\",\n EXTENSION: \"Extension\",\n THEME: \"Theme\",\n };\n return (\n <span className=\"inline-block text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium\">\n {labels[type] ?? type}\n </span>\n );\n}\n\n// ─── ProductCard ─────────────────────────────────────────────────────────────\n\ninterface ProductCardProps {\n product: StoreProduct;\n onClick?: () => void;\n href?: string;\n}\n\nexport function ProductCard({ product, onClick, href }: ProductCardProps) {\n const priceLabel = formatPrice(\n product.price,\n product.currency,\n product.pricingModel,\n );\n\n const inner = (\n <div className=\"group bg-card border border-border rounded-xl p-4 flex flex-col gap-3 transition-all duration-200 hover:shadow-md hover:border-primary/30 cursor-pointer h-full\">\n {/* Icon + badge row */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"w-12 h-12 rounded-lg bg-muted flex-shrink-0 overflow-hidden\">\n {product.icon ? (\n <img\n src={product.icon}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-gradient-to-br from-primary/15 to-primary/5\">\n <svg\n viewBox=\"0 0 32 32\"\n className=\"w-8 h-8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <polygon\n points=\"16,4 28,10 16,16 4,10\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.35\"\n />\n <polygon\n points=\"4,10 16,16 16,28 4,22\"\n className=\"fill-primary/15\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.35\"\n />\n <polygon\n points=\"28,10 16,16 16,28 28,22\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.35\"\n />\n </svg>\n </div>\n )}\n </div>\n <TypeBadge type={product.type} />\n </div>\n\n {/* Name + description */}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-foreground text-sm leading-snug line-clamp-1 group-hover:text-primary transition-colors\">\n {product.name}\n </h3>\n {product.description && (\n <p className=\"text-muted-foreground text-xs mt-1 line-clamp-2 leading-relaxed\">\n {product.description}\n </p>\n )}\n </div>\n\n {/* Footer: rating + price */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1.5\">\n {product.rating != null && product.rating > 0 ? (\n <>\n <StarRating rating={product.rating} />\n <span className=\"text-xs text-muted-foreground\">\n {product.rating.toFixed(1)}\n </span>\n </>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n No reviews yet\n </span>\n )}\n </div>\n <span\n className={`text-xs font-semibold ${\n priceLabel === \"Free\" ? \"text-emerald-500\" : \"text-foreground\"\n }`}\n >\n {priceLabel}\n </span>\n </div>\n </div>\n );\n\n if (href) {\n return (\n <a href={href} onClick={onClick} className=\"block h-full no-underline\">\n {inner}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"block w-full text-left h-full\"\n >\n {inner}\n </button>\n );\n}\n","export const STORE_PRODUCT_FIELDS = `\n fragment StoreProductFields on StoreProduct {\n id name slug type subType nature status pricingModel\n price currency description icon bannerUrl screenshots\n category tags featured downloads viewCount rating reviewCount\n publisherId authorName license compatibleProducts\n }\n`;\n\nexport const HOME_GROUPED_PRODUCTS_QUERY = `\n ${STORE_PRODUCT_FIELDS}\n query HomeGroupedProducts($compatibleWith: String) {\n homeGroupedProducts(compatibleWith: $compatibleWith) {\n featured { ...StoreProductFields }\n mostDownloaded { ...StoreProductFields }\n recentlyAdded { ...StoreProductFields }\n freeItems { ...StoreProductFields }\n }\n }\n`;\n\nexport const BROWSE_STORE_QUERY = `\n ${STORE_PRODUCT_FIELDS}\n query BrowseStore($input: BrowseStoreInput!) {\n browseStore(input: $input) {\n products { ...StoreProductFields }\n totalCount\n hasMore\n nextCursor\n facets {\n types { value count }\n categories { value count }\n pricingModels { value count }\n priceRange { min max }\n }\n }\n }\n`;\n\nexport const STORE_PRODUCT_DETAILS_QUERY = `\n ${STORE_PRODUCT_FIELDS}\n query StoreProductDetails($input: StoreProductDetailsInput!) {\n storeProductDetails(input: $input) {\n product { ...StoreProductFields longDescription videoUrls minPlatformVersion }\n publisher { id name email websiteUrl logoUrl bio isVerified tier }\n reviews { id rating title comment verifiedPurchase helpful createdAt }\n reviewsCount\n relatedProducts { ...StoreProductFields }\n ratingDistribution { fiveStars fourStars threeStars twoStars oneStar }\n }\n }\n`;\n\nexport const SEARCH_SUGGESTIONS_QUERY = `\n query SearchSuggestions($query: String!, $limit: Int) {\n searchSuggestions(query: $query, limit: $limit) {\n term type count\n }\n }\n`;\n\nexport const CATEGORIES_QUERY = `\n query Categories {\n categories {\n id name slug description icon parentId\n }\n }\n`;\n","const LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\nconst RESERVED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"x-actor-id\",\n \"x-actor-type\",\n \"x-consent-granted-by\",\n \"x-consent-scope\",\n \"x-consent-granted-at\",\n \"x-consent-expires-at\",\n]);\n\nexport function validateGatewayUrl(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Gateway URL must be a valid absolute URL\");\n }\n\n if (url.protocol === \"https:\") {\n return url.toString();\n }\n\n if (\n url.protocol === \"http:\" &&\n LOOPBACK_HOSTS.has(url.hostname.toLowerCase())\n ) {\n return url.toString();\n }\n\n throw new Error(\"Gateway URL must use HTTPS unless it targets localhost\");\n}\n\nexport function sanitizeHeaders(\n headers?: Record<string, string>,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => !RESERVED_HEADERS.has(key.toLowerCase()),\n ),\n );\n}\n","/**\n * Lightweight GraphQL client for the Burdenoff Web SDK.\n * Uses native fetch - zero external dependencies.\n * All calls are unauthenticated (public gateway operations only).\n */\n\nimport { sanitizeHeaders, validateGatewayUrl } from \"./security\";\n\nexport interface WebSDKClientConfig {\n /** Global public gateway URL (e.g. \"https://api.burdenoff.com/global/graphql\") */\n gatewayUrl: string;\n /** Platform product ID for scoping operations */\n productId: string;\n /** Product slug (used for public product queries) */\n productSlug?: string;\n /** reCAPTCHA site key (if not fetched from product config) */\n recaptchaSiteKey?: string;\n /** Rybbit analytics site ID */\n rybbitSiteId?: string;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n /**\n * Per-request timeout in ms. Kept below the gateway's operation timeout so a\n * stalled request surfaces as an error the UI can render, instead of leaving\n * a page stuck on loading skeletons forever. Default 12000.\n */\n timeoutMs?: number;\n /**\n * Extra attempts for transient failures (timeout / network / 5xx / 429) on\n * QUERIES ONLY. Mutations are never retried — a retried contact-form or\n * waitlist submit would double-submit. Default 1 (2 attempts total).\n */\n maxRetries?: number;\n}\n\nexport interface GraphQLResponse<T = Record<string, unknown>> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport class WebSDKClient {\n private config: WebSDKClientConfig;\n private queryCache = new Map<\n string,\n { data: GraphQLResponse<unknown>; ts: number }\n >();\n private inflight = new Map<string, Promise<GraphQLResponse<unknown>>>();\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static MAX_CACHE_ENTRIES = 100;\n private static DEFAULT_TIMEOUT_MS = 12_000;\n private static DEFAULT_MAX_RETRIES = 1;\n private static RETRY_BASE_DELAY_MS = 400;\n\n constructor(config: WebSDKClientConfig) {\n this.config = {\n ...config,\n gatewayUrl: validateGatewayUrl(config.gatewayUrl),\n headers: sanitizeHeaders(config.headers),\n };\n }\n\n getConfig(): WebSDKClientConfig {\n return this.config;\n }\n\n /**\n * Execute a GraphQL query (with deduplication and caching)\n */\n async query<T = Record<string, unknown>>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const cacheKey = JSON.stringify({ query, variables });\n\n // Return cached response if still valid, evict if expired\n const cached = this.queryCache.get(cacheKey);\n if (cached) {\n if (Date.now() - cached.ts < WebSDKClient.CACHE_TTL) {\n return cached.data as GraphQLResponse<T>;\n }\n this.queryCache.delete(cacheKey);\n }\n\n // Deduplicate: if same query is already in-flight, reuse the promise\n const existing = this.inflight.get(cacheKey);\n if (existing) {\n return existing as Promise<GraphQLResponse<T>>;\n }\n\n const promise = this.request<T>(query, variables)\n .then((result) => {\n // Cache successful responses only\n if (result.data && !result.errors?.length) {\n if (this.queryCache.size >= WebSDKClient.MAX_CACHE_ENTRIES) {\n const oldestEntry = this.queryCache.keys().next().value;\n if (oldestEntry) {\n this.queryCache.delete(oldestEntry);\n }\n }\n this.queryCache.set(cacheKey, { data: result, ts: Date.now() });\n }\n return result;\n })\n .finally(() => {\n this.inflight.delete(cacheKey);\n });\n\n this.inflight.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Execute a GraphQL mutation\n */\n async mutate<T = Record<string, unknown>>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n // retry=false: a retried mutation could double-submit (contact form,\n // waitlist signup, order). Only the timeout applies here.\n return this.request<T>(mutation, variables, false);\n }\n\n /** HTTP statuses worth another attempt — transient server/edge conditions. */\n private static isRetriableStatus(status: number): boolean {\n return status === 429 || status === 408 || (status >= 500 && status < 600);\n }\n\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Perform the HTTP call with a hard timeout. Every outcome resolves to a\n * GraphQLResponse — callers never hang, so a UI's `loading` state always\n * settles into data or a renderable error.\n */\n private async attempt<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n timeoutMs: number,\n ): Promise<{ res: GraphQLResponse<T>; retriable: boolean }> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(this.config.gatewayUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-product-id\": this.config.productId,\n ...this.config.headers,\n },\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n console.error(\n \"[WebSDK] GraphQL request failed\",\n response.status,\n response.statusText,\n );\n return {\n res: {\n errors: [\n {\n message: `HTTP ${response.status}: ${response.statusText}`,\n extensions: { code: `HTTP_${response.status}` },\n },\n ],\n },\n retriable: WebSDKClient.isRetriableStatus(response.status),\n };\n }\n\n return {\n res: (await response.json()) as GraphQLResponse<T>,\n retriable: false,\n };\n } catch (error) {\n const aborted =\n error instanceof Error &&\n (error.name === \"AbortError\" || controller.signal.aborted);\n const message = aborted\n ? `Request timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : \"Network error\";\n console.error(\"[WebSDK] Network error\", message);\n return {\n res: {\n errors: [\n {\n message,\n extensions: { code: aborted ? \"TIMEOUT\" : \"NETWORK_ERROR\" },\n },\n ],\n },\n // Transport-level failures are worth one more try; a genuine outage\n // just fails twice quickly and still renders an error state.\n retriable: true,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>,\n retry = true,\n ): Promise<GraphQLResponse<T>> {\n const timeoutMs = this.config.timeoutMs ?? WebSDKClient.DEFAULT_TIMEOUT_MS;\n const maxRetries = retry\n ? (this.config.maxRetries ?? WebSDKClient.DEFAULT_MAX_RETRIES)\n : 0;\n\n let last: GraphQLResponse<T> | undefined;\n for (let i = 0; i <= maxRetries; i++) {\n const { res, retriable } = await this.attempt<T>(\n query,\n variables,\n timeoutMs,\n );\n if (!retriable || i === maxRetries) return res;\n last = res;\n // Small backoff with jitter so a burst of clients doesn't retry in lockstep.\n await WebSDKClient.sleep(\n WebSDKClient.RETRY_BASE_DELAY_MS * (i + 1) + Math.random() * 200,\n );\n }\n return last as GraphQLResponse<T>;\n }\n}\n","/**\n * React context provider for the Web SDK client.\n * Wraps the application with WebSDKClient configuration.\n */\n\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { resolveGatewayUrl } from \"./gateway-resolver\";\nimport { WebSDKClient, type WebSDKClientConfig } from \"./graphql-client\";\n\nconst WebSDKContext = createContext<WebSDKClient | null>(null);\n\nexport interface WebSDKProviderProps {\n /** SDK client configuration */\n config: WebSDKClientConfig;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the WebSDKClient available to all child components.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={{\n * gatewayUrl: \"https://api.burdenoff.com/global/graphql\",\n * productId: \"your-product-id\",\n * productSlug: \"your-product\",\n * }}>\n * <App />\n * </WebSDKProvider>\n * ```\n */\nexport function WebSDKProvider({ config, children }: WebSDKProviderProps) {\n const client = useMemo(() => {\n const resolvedConfig = {\n ...config,\n gatewayUrl: resolveGatewayUrl(config.gatewayUrl),\n };\n return new WebSDKClient(resolvedConfig);\n }, [config]);\n\n return (\n <WebSDKContext.Provider value={client}>{children}</WebSDKContext.Provider>\n );\n}\n\n/**\n * Hook to access the WebSDKClient instance.\n * Must be used within a WebSDKProvider.\n */\nexport function useWebSDK(): WebSDKClient {\n const client = useContext(WebSDKContext);\n if (!client) {\n throw new Error(\"useWebSDK must be used within a WebSDKProvider\");\n }\n return client;\n}\n\n/**\n * Hook to access the SDK configuration.\n * Useful for components that need config values like productId, recaptchaSiteKey, etc.\n */\nexport function useWebSDKConfig(): WebSDKClientConfig {\n const client = useWebSDK();\n return client.getConfig();\n}\n","/**\n * PageHead Component\n * Manages dynamic meta tags for SEO optimization on a per-page basis.\n * Supports JSON-LD structured data, Open Graph, Twitter Cards, favicons, and robots directives.\n *\n * @example\n * ```tsx\n * <PageHead\n * title=\"About Us\"\n * description=\"Learn about our mission and team\"\n * productName=\"MyProduct\"\n * keywords=\"about, team, mission\"\n * image=\"/og-about.png\"\n * url=\"https://myproduct.com/about\"\n * favicon=\"/favicon.ico\"\n * robots=\"index, follow\"\n * locale=\"en_US\"\n * twitterHandle=\"@burdenoff\"\n * themeColor=\"#1a1a2e\"\n * structuredData={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"WebPage\",\n * name: \"About Us\",\n * }}\n * />\n * ```\n */\n\nimport { Helmet } from \"react-helmet-async\";\n\nexport interface PageHeadProps {\n /** Page title */\n title: string;\n /** Meta description */\n description?: string;\n /** Product/brand name (appended to title) */\n productName?: string;\n /** SEO keywords */\n keywords?: string;\n /** Open Graph image URL */\n image?: string;\n /** Page canonical URL */\n url?: string;\n /** Favicon URL */\n favicon?: string;\n /** Robots directive (e.g., \"index, follow\") */\n robots?: string;\n /** Open Graph locale (e.g., \"en_US\") */\n locale?: string;\n /** Twitter handle (e.g., \"@burdenoff\") */\n twitterHandle?: string;\n /** Theme color for mobile browsers */\n themeColor?: string;\n /** JSON-LD structured data objects */\n structuredData?: Record<string, unknown> | Array<Record<string, unknown>>;\n /** Additional meta tags */\n additionalMeta?: Array<{\n name?: string;\n property?: string;\n content: string;\n }>;\n}\n\nexport function PageHead({\n title,\n description,\n productName,\n keywords,\n image,\n url,\n favicon,\n robots = \"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\",\n locale = \"en_US\",\n twitterHandle,\n themeColor = \"#000000\",\n structuredData,\n additionalMeta,\n}: PageHeadProps) {\n const fullTitle =\n productName && !title.includes(productName)\n ? `${title} | ${productName}`\n : title;\n\n const fullImageUrl =\n image && !image.startsWith(\"http\") && url\n ? `${url.replace(/\\/$/, \"\")}${image}`\n : image;\n\n // Normalize structured data to an array\n const structuredDataItems: Array<Record<string, unknown>> = structuredData\n ? Array.isArray(structuredData)\n ? structuredData\n : [structuredData]\n : [];\n\n return (\n <Helmet>\n {/* Primary Meta Tags */}\n <title>{fullTitle}</title>\n <meta name=\"title\" content={fullTitle} />\n {description && <meta name=\"description\" content={description} />}\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"author\" content=\"Burdenoff Consultancy Services Pvt Ltd\" />\n <meta name=\"robots\" content={robots} />\n\n {/* Canonical URL */}\n {url && <link rel=\"canonical\" href={url} />}\n\n {/* Favicon */}\n {favicon && <link rel=\"icon\" href={favicon} />}\n\n {/* Open Graph / Facebook */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={fullTitle} />\n {description && <meta property=\"og:description\" content={description} />}\n {fullImageUrl && <meta property=\"og:image\" content={fullImageUrl} />}\n {url && <meta property=\"og:url\" content={url} />}\n <meta property=\"og:locale\" content={locale} />\n {productName && <meta property=\"og:site_name\" content={productName} />}\n\n {/* Twitter Card */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={fullTitle} />\n {description && <meta name=\"twitter:description\" content={description} />}\n {fullImageUrl && <meta name=\"twitter:image\" content={fullImageUrl} />}\n {twitterHandle && <meta name=\"twitter:creator\" content={twitterHandle} />}\n\n {/* Theme Color */}\n <meta name=\"theme-color\" content={themeColor} />\n\n {/* JSON-LD Structured Data */}\n {structuredDataItems.map((data, index) => (\n <script key={`ld-${index}`} type=\"application/ld+json\">\n {JSON.stringify(data)}\n </script>\n ))}\n\n {/* Additional Meta Tags */}\n {additionalMeta?.map((meta, index) => (\n <meta\n key={`meta-${index}`}\n {...(meta.name ? { name: meta.name } : {})}\n {...(meta.property ? { property: meta.property } : {})}\n content={meta.content}\n />\n ))}\n </Helmet>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { ProductCard, formatPrice } from \"./product-card\";\nimport { HOME_GROUPED_PRODUCTS_QUERY } from \"./queries\";\nimport { useWebSDK } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type {\n GroupedStoreProducts,\n StorePageProps,\n StoreProduct,\n} from \"./types\";\n\ninterface HomeGroupedResponse {\n homeGroupedProducts: GroupedStoreProducts;\n}\n\n// ─── Dedup across sections ────────────────────────────────────────────────────\n\nfunction dedupAcross(lists: StoreProduct[][]): StoreProduct[][] {\n const seen = new Set<string>();\n return lists.map((list) => {\n const out: StoreProduct[] = [];\n for (const p of list) {\n if (!seen.has(p.id)) {\n seen.add(p.id);\n out.push(p);\n }\n }\n return out;\n });\n}\n\n// ─── FeaturedHeroCard ─────────────────────────────────────────────────────────\n\nfunction FeaturedHeroCard({\n product,\n onNavigate,\n}: {\n product: StoreProduct;\n onNavigate: (path: string) => void;\n}) {\n const priceLabel = formatPrice(\n product.price,\n product.currency,\n product.pricingModel,\n );\n return (\n <button\n type=\"button\"\n onClick={() => onNavigate(`/store/${product.slug}`)}\n className=\"group w-full text-left h-full rounded-2xl border border-border bg-card overflow-hidden hover:border-primary/40 transition-all duration-300 hover:shadow-xl hover:shadow-primary/10 flex flex-col\"\n >\n {/* Banner */}\n <div className=\"relative h-44 sm:h-52 bg-gradient-to-br from-primary/20 via-primary/8 to-background overflow-hidden flex-shrink-0\">\n {product.bannerUrl ? (\n <img\n src={product.bannerUrl}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <>\n <svg\n className=\"absolute inset-0 w-full h-full opacity-[0.07]\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <pattern\n id=\"fg-hero-grid\"\n width=\"36\"\n height=\"36\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 36 0 L 0 0 0 36\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#fg-hero-grid)\" />\n </svg>\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n aria-hidden=\"true\"\n >\n <svg\n viewBox=\"0 0 64 64\"\n className=\"w-20 h-20 opacity-25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polygon\n points=\"32,8 56,20 32,32 8,20\"\n className=\"fill-primary/40\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.5\"\n />\n <polygon\n points=\"8,20 32,32 32,56 8,44\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.5\"\n />\n <polygon\n points=\"56,20 32,32 32,56 56,44\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.5\"\n />\n </svg>\n </div>\n </>\n )}\n {/* Featured badge */}\n <span className=\"absolute top-3 left-3 text-xs font-semibold px-2.5 py-1 rounded-full bg-primary text-primary-foreground shadow-sm\">\n Featured\n </span>\n {/* Icon */}\n <div className=\"absolute bottom-4 left-4 w-14 h-14 rounded-xl shadow-lg overflow-hidden border-2 border-background\">\n {product.icon ? (\n <img\n src={product.icon}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full bg-gradient-to-br from-primary/25 to-primary/10 flex items-center justify-center\">\n <svg\n viewBox=\"0 0 32 32\"\n className=\"w-8 h-8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <polygon\n points=\"16,4 28,10 16,16 4,10\"\n className=\"fill-primary/40\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"4,10 16,16 16,28 4,22\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"28,10 16,16 16,28 28,22\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n </svg>\n </div>\n )}\n </div>\n </div>\n\n {/* Body */}\n <div className=\"p-5 flex flex-col flex-1\">\n <div className=\"flex items-start justify-between gap-3 mb-2\">\n <h3 className=\"text-base font-bold text-foreground group-hover:text-primary transition-colors line-clamp-1\">\n {product.name}\n </h3>\n <span\n className={`text-sm font-bold flex-shrink-0 ${priceLabel === \"Free\" ? \"text-emerald-500\" : \"text-foreground\"}`}\n >\n {priceLabel}\n </span>\n </div>\n {product.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-2 leading-relaxed flex-1\">\n {product.description}\n </p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <span className=\"text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium\">\n {product.type}\n </span>\n {product.authorName && (\n <span className=\"text-xs text-muted-foreground truncate\">\n by {product.authorName}\n </span>\n )}\n </div>\n </div>\n </button>\n );\n}\n\n// ─── Horizontal scroll row ────────────────────────────────────────────────────\n\nfunction ScrollRow({\n products,\n onProductClick,\n}: {\n products: StoreProduct[];\n onProductClick: (p: StoreProduct) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n\n function scroll(dir: \"l\" | \"r\") {\n ref.current?.scrollBy({\n left: dir === \"r\" ? 272 : -272,\n behavior: \"smooth\",\n });\n }\n\n return (\n <div className=\"relative group/row\">\n {/* Left arrow */}\n <button\n type=\"button\"\n onClick={() => scroll(\"l\")}\n aria-label=\"Scroll left\"\n className=\"absolute left-0 top-1/2 -translate-y-1/2 -translate-x-4 z-10 w-8 h-8 rounded-full bg-background border border-border shadow-md items-center justify-center text-muted-foreground hover:text-primary hover:border-primary/40 transition-all hidden sm:flex opacity-0 group-hover/row:opacity-100\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 3L6 8l4 5\" />\n </svg>\n </button>\n\n {/* Scrollable track */}\n <div\n ref={ref}\n className=\"flex gap-3 overflow-x-auto pb-1 snap-x snap-mandatory\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {products.map((product) => (\n <div key={product.id} className=\"flex-shrink-0 w-56 snap-start\">\n <ProductCard\n product={product}\n onClick={() => onProductClick(product)}\n />\n </div>\n ))}\n </div>\n\n {/* Right arrow */}\n <button\n type=\"button\"\n onClick={() => scroll(\"r\")}\n aria-label=\"Scroll right\"\n className=\"absolute right-0 top-1/2 -translate-y-1/2 translate-x-4 z-10 w-8 h-8 rounded-full bg-background border border-border shadow-md items-center justify-center text-muted-foreground hover:text-primary hover:border-primary/40 transition-all hidden sm:flex opacity-0 group-hover/row:opacity-100\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 3l4 5-4 5\" />\n </svg>\n </button>\n </div>\n );\n}\n\n// ─── Section header ───────────────────────────────────────────────────────────\n\nfunction SectionHead({\n title,\n hint,\n browseHref,\n onNavigate,\n}: {\n title: string;\n hint?: string;\n browseHref: string;\n onNavigate: (path: string) => void;\n}) {\n return (\n <div className=\"flex items-end justify-between mb-5 gap-4\">\n <div>\n <h2 className=\"text-xl font-bold text-foreground\">{title}</h2>\n {hint && <p className=\"text-sm text-muted-foreground mt-0.5\">{hint}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onNavigate(browseHref)}\n className=\"text-sm text-primary hover:underline font-medium flex-shrink-0 underline-offset-2\"\n >\n See all →\n </button>\n </div>\n );\n}\n\n// ─── Category quick-filter row ────────────────────────────────────────────────\n\nconst TYPE_FILTERS = [\n { type: \"NODE\", label: \"Nodes\" },\n { type: \"WORKFLOW\", label: \"Workflows\" },\n { type: \"TEMPLATE\", label: \"Templates\" },\n { type: \"INTEGRATION\", label: \"Integrations\" },\n { type: \"APP\", label: \"Apps\" },\n { type: \"EXTENSION\", label: \"Extensions\" },\n];\n\nfunction TypeFilters({\n browsePath,\n onNavigate,\n}: {\n browsePath: string;\n onNavigate: (path: string) => void;\n}) {\n return (\n <div className=\"flex flex-wrap gap-2 justify-center\">\n {TYPE_FILTERS.map((f) => (\n <button\n key={f.type}\n type=\"button\"\n onClick={() => onNavigate(`${browsePath}?type=${f.type}`)}\n className=\"px-4 py-1.5 rounded-full border border-border bg-background text-sm text-foreground hover:border-primary/50 hover:bg-primary/5 hover:text-primary transition-all duration-200\"\n >\n {f.label}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Skeletons ────────────────────────────────────────────────────────────────\n\nfunction HeroCardSkeleton() {\n return (\n <div className=\"rounded-2xl border border-border bg-card overflow-hidden animate-pulse h-full\">\n <div className=\"h-44 sm:h-52 bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-5 bg-muted rounded w-1/2\" />\n <div className=\"h-3 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-5/6\" />\n <div className=\"h-5 bg-muted rounded w-16 mt-2\" />\n </div>\n </div>\n );\n}\n\nfunction GridCardSkeleton() {\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 h-36 animate-pulse\">\n <div className=\"flex gap-3 mb-3\">\n <div className=\"w-12 h-12 rounded-lg bg-muted flex-shrink-0\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-3 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-1/2\" />\n </div>\n </div>\n <div className=\"h-3 bg-muted rounded w-full mb-2\" />\n <div className=\"h-3 bg-muted rounded w-5/6\" />\n </div>\n );\n}\n\nfunction ScrollCardSkeleton() {\n return (\n <div className=\"flex-shrink-0 w-56 rounded-xl border border-border bg-card p-4 h-36 animate-pulse\">\n <div className=\"flex gap-3 mb-3\">\n <div className=\"w-12 h-12 rounded-lg bg-muted flex-shrink-0\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-3 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-1/2\" />\n </div>\n </div>\n <div className=\"h-3 bg-muted rounded w-full mb-2\" />\n <div className=\"h-3 bg-muted rounded w-5/6\" />\n </div>\n );\n}\n\n// ─── StoreHomePage ────────────────────────────────────────────────────────────\n\nexport interface StoreHomePageProps extends StorePageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n browsePath?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\nexport function StoreHomePage({\n compatibleWith,\n appLoginUrl,\n onNavigate,\n productName,\n heroTitle,\n heroSubtitle,\n browsePath = \"/store/browse\",\n seoTitle,\n seoDescription,\n seoKeywords,\n}: StoreHomePageProps) {\n const client = useWebSDK();\n const [grouped, setGrouped] = useState<GroupedStoreProducts | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n async function load() {\n setLoading(true);\n try {\n const res = await client.query<HomeGroupedResponse>(\n HOME_GROUPED_PRODUCTS_QUERY,\n { compatibleWith: compatibleWith ?? null },\n );\n if (cancelled) return;\n if (res.errors?.length) throw new Error(res.errors[0]!.message);\n if (!res.data?.homeGroupedProducts) throw new Error(\"No data\");\n setGrouped(res.data.homeGroupedProducts);\n setError(null);\n } catch {\n if (!cancelled) setError(\"Failed to load store. Please try again.\");\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n load();\n return () => {\n cancelled = true;\n };\n }, [client, compatibleWith]);\n\n function navigate(path: string) {\n if (onNavigate) {\n onNavigate(path);\n return;\n }\n window.location.href = path;\n }\n\n function handleProductClick(product: { slug: string }) {\n navigate(`/store/${product.slug}`);\n }\n\n // Deduplicate so the same item never appears in two sections\n const deduped = grouped\n ? dedupAcross([grouped.featured, grouped.mostDownloaded, grouped.freeItems])\n : [[], [], []];\n const featuredItems: StoreProduct[] = deduped[0] ?? [];\n const popularItems: StoreProduct[] = deduped[1] ?? [];\n const freeItems: StoreProduct[] = deduped[2] ?? [];\n\n // A product whose catalogue has no published items yet (common pre-launch)\n // gets a purpose-built empty state instead of a page of dangling headings.\n const hasNoItems =\n !loading &&\n !error &&\n featuredItems.length === 0 &&\n popularItems.length === 0 &&\n freeItems.length === 0;\n\n const resolvedTitle =\n heroTitle ?? `${productName ? `${productName} ` : \"\"}Store`;\n const resolvedSubtitle =\n heroSubtitle ??\n \"Discover workflows, nodes, integrations, and templates built by the community.\";\n\n return (\n <div className=\"w-full\">\n <PageHead\n title={seoTitle ?? `Store${productName ? ` – ${productName}` : \"\"}`}\n description={seoDescription ?? resolvedSubtitle}\n keywords={seoKeywords}\n productName={productName}\n />\n\n {/* ── Hero ─────────────────────────────────────────────────────────── */}\n <section className=\"relative overflow-hidden pt-14 pb-12 sm:pt-20 sm:pb-16\">\n {/* Background layers */}\n <div\n className=\"absolute inset-0 bg-gradient-to-b from-background via-primary/[0.06] to-background pointer-events-none\"\n aria-hidden=\"true\"\n />\n <svg\n className=\"absolute inset-0 w-full h-full opacity-[0.035] pointer-events-none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <pattern\n id=\"store-home-grid\"\n width=\"40\"\n height=\"40\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 40 0 L 0 0 0 40\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#store-home-grid)\" />\n </svg>\n {/* Glow blobs */}\n <div\n className=\"absolute -top-16 left-1/3 w-80 h-80 rounded-full bg-primary/10 blur-3xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n <div\n className=\"absolute top-8 right-1/4 w-56 h-56 rounded-full bg-primary/8 blur-2xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center\">\n {/* Badge chip */}\n <div className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full border border-primary/30 bg-primary/10 text-xs font-semibold text-primary mb-5\">\n <span\n className=\"w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0\"\n aria-hidden=\"true\"\n />\n Community Marketplace\n </div>\n\n <h1 className=\"text-4xl sm:text-5xl md:text-6xl font-extrabold tracking-tight text-foreground mb-4 leading-[1.08]\">\n {resolvedTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed\">\n {resolvedSubtitle}\n </p>\n\n {/* Search */}\n <form\n className=\"max-w-xl mx-auto flex gap-2 mb-7\"\n onSubmit={(e) => {\n e.preventDefault();\n const q = new FormData(e.currentTarget).get(\"q\") as string;\n navigate(\n q.trim()\n ? `${browsePath}?q=${encodeURIComponent(q.trim())}`\n : browsePath,\n );\n }}\n >\n <input\n name=\"q\"\n type=\"search\"\n placeholder=\"Search nodes, workflows, templates…\"\n className=\"flex-1 h-12 rounded-xl border border-border bg-background px-4 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/40 shadow-sm\"\n />\n <button\n type=\"submit\"\n className=\"h-12 px-6 rounded-xl bg-primary text-primary-foreground text-sm font-semibold hover:opacity-90 transition-opacity shadow-sm\"\n >\n Search\n </button>\n </form>\n\n {/* Type quick-filters */}\n <TypeFilters browsePath={browsePath} onNavigate={navigate} />\n </div>\n </section>\n\n {/* ── Main content ─────────────────────────────────────────────────── */}\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pb-20 space-y-14 pt-4\">\n {/* Featured — spotlight hero + 2×2 grid. Only rendered when there is\n something to feature (or we are still loading / showing an error),\n so the heading never dangles above empty space. */}\n {(loading || error || featuredItems.length > 0) && (\n <section>\n <SectionHead\n title=\"Featured\"\n hint=\"Hand-picked highlights from the community\"\n browseHref={`${browsePath}?featured=true`}\n onNavigate={navigate}\n />\n {loading ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_2fr] gap-4 items-start\">\n <HeroCardSkeleton />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {[...Array(4)].map((_, i) => (\n <GridCardSkeleton key={i} />\n ))}\n </div>\n </div>\n ) : error ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-muted-foreground mb-4\">{error}</p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"text-sm text-primary hover:underline\"\n >\n Retry\n </button>\n </div>\n ) : featuredItems.length > 0 ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_2fr] gap-4 items-start\">\n {/* Spotlight hero card */}\n <FeaturedHeroCard\n product={featuredItems[0]!}\n onNavigate={navigate}\n />\n {/* 2×2 grid of remaining featured */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {featuredItems.slice(1, 5).map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n onClick={() => handleProductClick(product)}\n />\n ))}\n </div>\n </div>\n ) : null}\n </section>\n )}\n\n {/* Most Popular — horizontal scroll row */}\n {(loading || popularItems.length > 0) && (\n <section>\n <SectionHead\n title=\"Most Popular\"\n hint=\"Top downloads across the community\"\n browseHref={`${browsePath}?sortBy=DOWNLOADS`}\n onNavigate={navigate}\n />\n {loading ? (\n <div className=\"flex gap-3 overflow-hidden\">\n {[...Array(5)].map((_, i) => (\n <ScrollCardSkeleton key={i} />\n ))}\n </div>\n ) : (\n <ScrollRow\n products={popularItems}\n onProductClick={handleProductClick}\n />\n )}\n </section>\n )}\n\n {/* Free to Use — 3-col grid, max 6 items */}\n {(loading || freeItems.length > 0) && (\n <section>\n <SectionHead\n title=\"Free to Use\"\n hint=\"Zero cost, full power — community-contributed freebies\"\n browseHref={`${browsePath}?pricingModel=FREE`}\n onNavigate={navigate}\n />\n {loading ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[...Array(6)].map((_, i) => (\n <GridCardSkeleton key={i} />\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {freeItems.slice(0, 6).map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n onClick={() => handleProductClick(product)}\n />\n ))}\n </div>\n )}\n </section>\n )}\n\n {/* Nothing published yet — a warm, honest empty state rather than a\n page of empty section headings. */}\n {hasNoItems && (\n <section\n data-store=\"empty-state\"\n className=\"rounded-2xl border border-border bg-card/50 px-6 py-14 sm:py-16 text-center\"\n >\n <div\n className=\"mx-auto mb-5 flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10\"\n aria-hidden=\"true\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"h-7 w-7 text-primary\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.75 9h16.5M4.5 9l1.2 9.3a1.5 1.5 0 0 0 1.49 1.2h9.62a1.5 1.5 0 0 0 1.49-1.2L19.5 9M8.25 9V6.75a3.75 3.75 0 0 1 7.5 0V9\"\n />\n </svg>\n </div>\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-2\">\n The {productName ?? \"store\"} catalogue is just getting started\n </h2>\n <p className=\"text-sm sm:text-base text-muted-foreground max-w-xl mx-auto mb-7\">\n No items have been published for {productName ?? \"this product\"}{\" \"}\n yet. As the community ships workflows, templates, and\n integrations, they will show up right here.\n </p>\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(browsePath)}\n className=\"inline-flex items-center gap-2 rounded-xl bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition-colors hover:bg-primary/90\"\n >\n Browse the full store\n </button>\n <a\n href={appLoginUrl}\n className=\"inline-flex items-center gap-2 rounded-xl border border-border px-5 py-2.5 text-sm font-semibold text-foreground transition-colors hover:border-primary/40 hover:text-primary\"\n >\n Become a publisher\n </a>\n </div>\n </section>\n )}\n </div>\n\n {/* ── Submit CTA ───────────────────────────────────────────────────── */}\n <section className=\"relative overflow-hidden border-t border-border\">\n <div\n className=\"absolute inset-0 bg-gradient-to-br from-primary/8 via-background to-primary/5 pointer-events-none\"\n aria-hidden=\"true\"\n />\n {/* Glow */}\n <div\n className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-80 h-40 rounded-full bg-primary/12 blur-3xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative max-w-2xl mx-auto px-4 py-16 text-center\">\n <div className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full border border-primary/30 bg-primary/10 text-xs font-semibold text-primary mb-5\">\n <span\n className=\"w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0\"\n aria-hidden=\"true\"\n />\n Become a publisher\n </div>\n <h2 className=\"text-2xl sm:text-3xl font-bold text-foreground mb-3\">\n Built something useful?\n </h2>\n <p className=\"text-muted-foreground mb-8 max-w-lg mx-auto leading-relaxed\">\n Share your workflows, nodes, and integrations with{\" \"}\n {productName ?? \"the\"} community. Earn from your work or contribute\n for free.\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <a\n href={appLoginUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center justify-center h-11 px-7 rounded-lg bg-primary text-primary-foreground text-sm font-semibold hover:opacity-90 transition-opacity\"\n >\n Submit to Store\n </a>\n <button\n type=\"button\"\n onClick={() => navigate(browsePath)}\n className=\"inline-flex items-center justify-center h-11 px-7 rounded-lg border border-border bg-background text-sm font-medium text-foreground hover:border-primary/40 hover:bg-primary/5 transition-all\"\n >\n Browse the store\n </button>\n </div>\n </div>\n </section>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { ProductCard } from \"./product-card\";\nimport { BROWSE_STORE_QUERY, CATEGORIES_QUERY } from \"./queries\";\nimport { useWebSDK } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type {\n BrowseStoreResult,\n ProductCategory,\n StorePageProps,\n StoreFacet,\n} from \"./types\";\n\ninterface BrowseResponse {\n browseStore: BrowseStoreResult;\n}\n\ninterface CategoriesResponse {\n categories: ProductCategory[];\n}\n\n// ─── helpers ─────────────────────────────────────────────────────────────────\n\nconst SORT_OPTIONS = [\n { value: \"RELEVANCE\", label: \"Relevance\" },\n { value: \"NEWEST\", label: \"Newest\" },\n { value: \"DOWNLOADS\", label: \"Most Downloaded\" },\n { value: \"RATING\", label: \"Top Rated\" },\n { value: \"PRICE_LOW\", label: \"Price: Low to High\" },\n { value: \"PRICE_HIGH\", label: \"Price: High to Low\" },\n { value: \"NAME_ASC\", label: \"Name A–Z\" },\n];\n\nconst TYPE_OPTIONS = [\n { value: \"\", label: \"All types\" },\n { value: \"APP\", label: \"Apps\" },\n { value: \"NODE\", label: \"Nodes\" },\n { value: \"WORKFLOW\", label: \"Workflows\" },\n { value: \"TEMPLATE\", label: \"Templates\" },\n { value: \"INTEGRATION\", label: \"Integrations\" },\n { value: \"EXTENSION\", label: \"Extensions\" },\n { value: \"THEME\", label: \"Themes\" },\n];\n\nconst PRICING_OPTIONS = [\n { value: \"\", label: \"All pricing\" },\n { value: \"FREE\", label: \"Free\" },\n { value: \"ONE_TIME\", label: \"Paid (one-time)\" },\n { value: \"SUBSCRIPTION\", label: \"Subscription\" },\n];\n\nfunction parseUrlParams(): {\n q: string;\n type: string;\n pricingModel: string;\n category: string;\n sortBy: string;\n featured: boolean;\n} {\n if (typeof window === \"undefined\")\n return {\n q: \"\",\n type: \"\",\n pricingModel: \"\",\n category: \"\",\n sortBy: \"RELEVANCE\",\n featured: false,\n };\n\n const p = new URLSearchParams(window.location.search);\n return {\n q: p.get(\"q\") ?? \"\",\n type: p.get(\"type\") ?? \"\",\n pricingModel: p.get(\"pricingModel\") ?? \"\",\n category: p.get(\"category\") ?? \"\",\n sortBy: p.get(\"sortBy\") ?? (p.get(\"q\") ? \"RELEVANCE\" : \"NEWEST\"),\n featured: p.get(\"featured\") === \"true\",\n };\n}\n\n// ─── FacetList ────────────────────────────────────────────────────────────────\n\nfunction FacetList({\n title,\n facets,\n selected,\n onSelect,\n}: {\n title: string;\n facets: StoreFacet[];\n selected: string;\n onSelect: (v: string) => void;\n}) {\n if (facets.length === 0) return null;\n return (\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n {title}\n </p>\n <ul className=\"space-y-1\">\n {facets.map((f) => (\n <li key={f.value}>\n <button\n type=\"button\"\n onClick={() => onSelect(selected === f.value ? \"\" : f.value)}\n className={`w-full text-left text-sm px-2 py-1 rounded flex items-center justify-between gap-2 transition-colors ${\n selected === f.value\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n <span className=\"truncate\">{f.value}</span>\n <span className=\"text-xs opacity-60 flex-shrink-0\">\n {f.count}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n// ─── StoreBrowsePage ──────────────────────────────────────────────────────────\n\nexport interface StoreBrowsePageProps extends StorePageProps {\n productName?: string;\n seoTitle?: string;\n seoDescription?: string;\n}\n\nexport function StoreBrowsePage({\n compatibleWith,\n onNavigate,\n productName,\n seoTitle,\n seoDescription,\n}: StoreBrowsePageProps) {\n const client = useWebSDK();\n\n const initial = parseUrlParams();\n const [search, setSearch] = useState(initial.q);\n const [inputValue, setInputValue] = useState(initial.q);\n const [type, setType] = useState(initial.type);\n const [pricingModel, setPricingModel] = useState(initial.pricingModel);\n const [category, setCategory] = useState(initial.category);\n const [sortBy, setSortBy] = useState(initial.sortBy);\n const [featured, setFeatured] = useState(initial.featured);\n const [offset, setOffset] = useState(0);\n\n const [result, setResult] = useState<BrowseStoreResult | null>(null);\n const [allProducts, setAllProducts] = useState<BrowseStoreResult[\"products\"]>(\n [],\n );\n const [categories, setCategories] = useState<ProductCategory[]>([]);\n const [loading, setLoading] = useState(true);\n const [loadingMore, setLoadingMore] = useState(false);\n const [filtersOpen, setFiltersOpen] = useState(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const PAGE_SIZE = 24;\n\n // Load categories once\n useEffect(() => {\n client\n .query<CategoriesResponse>(CATEGORIES_QUERY, {})\n .then((r) => {\n if (r.data?.categories) setCategories(r.data.categories);\n })\n .catch(() => {});\n }, [client]);\n\n // Load products whenever filters change (reset to page 0)\n useEffect(() => {\n let cancelled = false;\n setOffset(0);\n setLoading(true);\n setAllProducts([]);\n\n client\n .query<BrowseResponse>(BROWSE_STORE_QUERY, {\n input: {\n filter: {\n search: search || undefined,\n type: type || undefined,\n pricingModel: pricingModel || undefined,\n category: category || undefined,\n compatibleWith: compatibleWith ?? undefined,\n featured: featured || undefined,\n },\n sortBy,\n pagination: { limit: PAGE_SIZE, offset: 0 },\n },\n })\n .then((r) => {\n if (cancelled) return;\n if (r.data?.browseStore) {\n setResult(r.data.browseStore);\n setAllProducts(r.data.browseStore.products);\n }\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n client,\n search,\n type,\n pricingModel,\n category,\n sortBy,\n compatibleWith,\n featured,\n ]);\n\n function loadMore() {\n const nextOffset = offset + PAGE_SIZE;\n setLoadingMore(true);\n\n client\n .query<BrowseResponse>(BROWSE_STORE_QUERY, {\n input: {\n filter: {\n search: search || undefined,\n type: type || undefined,\n pricingModel: pricingModel || undefined,\n category: category || undefined,\n compatibleWith: compatibleWith ?? undefined,\n featured: featured || undefined,\n },\n sortBy,\n pagination: { limit: PAGE_SIZE, offset: nextOffset },\n },\n })\n .then((r) => {\n if (r.data?.browseStore) {\n setResult(r.data.browseStore);\n setAllProducts((prev) => [...prev, ...r.data!.browseStore.products]);\n setOffset(nextOffset);\n }\n })\n .catch(() => {})\n .finally(() => setLoadingMore(false));\n }\n\n function navigate(path: string) {\n if (onNavigate) {\n onNavigate(path);\n return;\n }\n window.location.href = path;\n }\n\n function handleSearchSubmit(e: React.FormEvent) {\n e.preventDefault();\n setSearch(inputValue);\n setSortBy(inputValue ? \"RELEVANCE\" : \"NEWEST\");\n }\n\n function resetFilters() {\n setSearch(\"\");\n setInputValue(\"\");\n setType(\"\");\n setPricingModel(\"\");\n setCategory(\"\");\n setSortBy(\"NEWEST\");\n setFeatured(false);\n searchRef.current?.focus();\n }\n\n const hasActiveFilters = !!(\n search ||\n type ||\n pricingModel ||\n category ||\n featured\n );\n const facetTypes = result?.facets?.types ?? [];\n const facetCategories = result?.facets?.categories ?? [];\n\n const sidebarContent = (\n <div className=\"space-y-6\">\n {/* Type */}\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n Type\n </p>\n <div className=\"space-y-1\">\n {TYPE_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => setType(opt.value)}\n className={`w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${\n type === opt.value\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Pricing */}\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n Pricing\n </p>\n <div className=\"space-y-1\">\n {PRICING_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => setPricingModel(opt.value)}\n className={`w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${\n pricingModel === opt.value\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Category from server facets or loaded categories */}\n {(facetCategories.length > 0 || categories.length > 0) && (\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n Category\n </p>\n <div className=\"space-y-1\">\n <button\n type=\"button\"\n onClick={() => setCategory(\"\")}\n className={`w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${\n !category\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n All categories\n </button>\n {(facetCategories.length > 0\n ? facetCategories\n : categories\n .slice(0, 12)\n .map((c) => ({ value: c.slug, count: 0 }))\n ).map((f) => {\n const cat = categories.find((c) => c.slug === f.value);\n return (\n <button\n key={f.value}\n type=\"button\"\n onClick={() =>\n setCategory(category === f.value ? \"\" : f.value)\n }\n className={`w-full text-left text-sm px-2 py-1.5 rounded flex items-center justify-between gap-2 transition-colors ${\n category === f.value\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n <span className=\"truncate\">{cat?.name ?? f.value}</span>\n {f.count > 0 && (\n <span className=\"text-xs opacity-60 flex-shrink-0\">\n {f.count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {facetTypes.length > 0 && (\n <FacetList\n title=\"Available types\"\n facets={facetTypes}\n selected={type}\n onSelect={setType}\n />\n )}\n\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={resetFilters}\n className=\"text-sm text-muted-foreground hover:text-foreground underline\"\n >\n Clear all filters\n </button>\n )}\n </div>\n );\n\n return (\n <div className=\"w-full\">\n <PageHead\n title={\n seoTitle ?? `Browse Store${productName ? ` – ${productName}` : \"\"}`\n }\n description={\n seoDescription ?? \"Browse all apps, workflows, nodes, and templates.\"\n }\n productName={productName}\n />\n\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Top bar */}\n <div className=\"flex flex-col sm:flex-row gap-3 mb-6\">\n <form className=\"flex-1 flex gap-2\" onSubmit={handleSearchSubmit}>\n <input\n ref={searchRef}\n type=\"search\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Search…\"\n className=\"flex-1 h-10 rounded-lg border border-border bg-background px-4 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/50\"\n />\n <button\n type=\"submit\"\n className=\"h-10 px-5 rounded-lg bg-primary text-primary-foreground text-sm font-medium hover:opacity-90 transition-opacity\"\n >\n Search\n </button>\n </form>\n <div className=\"flex gap-2\">\n {/* Sort */}\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"h-10 rounded-lg border border-border bg-background px-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50\"\n >\n {SORT_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n {/* Mobile filter toggle */}\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(!filtersOpen)}\n className=\"lg:hidden h-10 px-4 rounded-lg border border-border bg-background text-sm text-foreground hover:bg-muted/50 transition-colors\"\n >\n Filters{\" \"}\n {hasActiveFilters && <span className=\"text-primary\">•</span>}\n </button>\n </div>\n </div>\n\n {/* Mobile filters panel */}\n {filtersOpen && (\n <div className=\"lg:hidden mb-6 p-4 border border-border rounded-xl bg-card\">\n {sidebarContent}\n </div>\n )}\n\n <div className=\"flex gap-8\">\n {/* Desktop sidebar */}\n <aside className=\"hidden lg:block w-52 flex-shrink-0\">\n {sidebarContent}\n </aside>\n\n {/* Main grid */}\n <div className=\"flex-1 min-w-0\">\n {/* Count + active filter chips */}\n <div className=\"flex items-center gap-2 mb-4 flex-wrap\">\n <span className=\"text-sm text-muted-foreground\">\n {loading ? \"Loading…\" : `${result?.totalCount ?? 0} results`}\n </span>\n {hasActiveFilters && (\n <div className=\"flex flex-wrap gap-1.5\">\n {search && (\n <Chip\n label={`\"${search}\"`}\n onRemove={() => {\n setSearch(\"\");\n setInputValue(\"\");\n }}\n />\n )}\n {type && <Chip label={type} onRemove={() => setType(\"\")} />}\n {pricingModel && (\n <Chip\n label={pricingModel}\n onRemove={() => setPricingModel(\"\")}\n />\n )}\n {category && (\n <Chip label={category} onRemove={() => setCategory(\"\")} />\n )}\n {featured && (\n <Chip\n label=\"Featured\"\n onRemove={() => setFeatured(false)}\n />\n )}\n </div>\n )}\n </div>\n\n {loading ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-4\">\n {[...Array(12)].map((_, i) => (\n <div\n key={i}\n className=\"bg-card border border-border rounded-xl p-4 h-36 animate-pulse\"\n />\n ))}\n </div>\n ) : allProducts.length === 0 ? (\n <div className=\"py-20 text-center\">\n <p className=\"text-muted-foreground mb-4\">\n No results found\n {search ? ` for \"${search}\"` : \"\"}.\n </p>\n <button\n type=\"button\"\n onClick={resetFilters}\n className=\"text-sm text-primary hover:underline\"\n >\n Clear filters\n </button>\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-4\">\n {allProducts.map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n onClick={() => navigate(`/store/${product.slug}`)}\n />\n ))}\n </div>\n\n {result?.hasMore && (\n <div className=\"mt-8 text-center\">\n <button\n type=\"button\"\n onClick={loadMore}\n disabled={loadingMore}\n className=\"h-10 px-8 rounded-lg border border-border text-sm font-medium text-foreground hover:bg-muted/50 transition-colors disabled:opacity-50\"\n >\n {loadingMore ? \"Loading…\" : \"Load more\"}\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction Chip({ label, onRemove }: { label: string; onRemove: () => void }) {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs bg-primary/10 text-primary rounded-full px-2.5 py-0.5 font-medium\">\n {label}\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={`Remove ${label}`}\n className=\"hover:opacity-70\"\n >\n ×\n </button>\n </span>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\n\n/**\n * WorkflowEmbed — iframe wrapper around the FluidGrids public read-only\n * workflow viewer (`{app}/embed/workflow`), n8n-demo style.\n *\n * Any website can use this: the viewer route is unauthenticated and the\n * workflow graph is fetched by the iframe itself from the public store\n * gateway using the product id. A \"Click to explore\" overlay keeps page\n * scrolling pleasant until the visitor opts into pan/zoom.\n */\nexport interface WorkflowEmbedProps {\n /** App shell origin serving /embed/workflow (e.g. \"https://app.fluidgrids.com\") */\n appUrl: string;\n /** WORKFLOW store product id to preview */\n productId: string;\n /** Force a theme; defaults to the host page's current light/dark mode */\n theme?: \"light\" | \"dark\";\n /** Gate interactivity behind a click (default true) */\n clickToInteract?: boolean;\n /** Hide the \"Use this template\" CTA inside the viewer */\n hideCta?: boolean;\n className?: string;\n /** Called when the viewer reports it could not load the workflow */\n onError?: (message: string) => void;\n}\n\ntype EmbedStatus = \"loading\" | \"loaded\" | \"error\";\n\nfunction detectTheme(): \"light\" | \"dark\" {\n if (typeof document === \"undefined\") return \"light\";\n const root = document.documentElement;\n return root.classList.contains(\"dark\") ||\n root.getAttribute(\"data-theme\") === \"dark\"\n ? \"dark\"\n : \"light\";\n}\n\nexport function WorkflowEmbed({\n appUrl,\n productId,\n theme,\n clickToInteract = true,\n hideCta = false,\n className,\n onError,\n}: WorkflowEmbedProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [status, setStatus] = useState<EmbedStatus>(\"loading\");\n const [interactive, setInteractive] = useState(!clickToInteract);\n // Snapshot the detected theme once; a mid-session host theme flip only\n // affects subsequently mounted embeds, which is acceptable for a preview.\n const resolvedTheme = useMemo(() => theme ?? detectTheme(), [theme]);\n\n const src = useMemo(() => {\n const base = appUrl.replace(/\\/+$/, \"\");\n const params = new URLSearchParams({\n productId,\n theme: resolvedTheme,\n });\n if (hideCta) params.set(\"cta\", \"false\");\n return `${base}/embed/workflow?${params.toString()}`;\n }, [appUrl, productId, resolvedTheme, hideCta]);\n\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const data = event.data as\n | { type?: string; message?: string }\n | undefined;\n if (data?.type === \"fluidgrids:embed:loaded\") setStatus(\"loaded\");\n if (data?.type === \"fluidgrids:embed:error\") {\n setStatus(\"error\");\n onError?.(data.message ?? \"Failed to load workflow preview\");\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [onError]);\n\n if (status === \"error\") return null;\n\n return (\n <div\n className={`relative w-full overflow-hidden rounded-xl border border-border bg-muted ${className ?? \"\"}`}\n style={{ aspectRatio: \"16 / 9\" }}\n >\n {status === \"loading\" && (\n <div\n className=\"absolute inset-0 animate-pulse bg-muted\"\n aria-hidden=\"true\"\n />\n )}\n <iframe\n ref={iframeRef}\n src={src}\n title=\"Workflow preview\"\n loading=\"lazy\"\n className=\"h-full w-full border-0\"\n style={interactive ? undefined : { pointerEvents: \"none\" }}\n />\n {clickToInteract && !interactive && status === \"loaded\" && (\n <button\n type=\"button\"\n onClick={() => setInteractive(true)}\n className=\"absolute inset-0 flex items-end justify-center bg-transparent pb-4\"\n aria-label=\"Click to explore the workflow\"\n >\n <span className=\"rounded-full border border-border bg-background/90 px-4 py-1.5 text-xs font-medium text-foreground shadow-sm backdrop-blur transition-colors hover:bg-background\">\n Click to explore\n </span>\n </button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport {\n ProductCard,\n StarRating,\n TypeBadge,\n formatDownloads,\n formatPrice,\n} from \"./product-card\";\nimport { STORE_PRODUCT_DETAILS_QUERY } from \"./queries\";\nimport { WorkflowEmbed } from \"./workflow-embed\";\nimport { useWebSDK } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { StorePageProps, StoreProductDetails } from \"./types\";\n\ninterface DetailsResponse {\n storeProductDetails: StoreProductDetails;\n}\n\n// ─── Self-contained animation keyframes ──────────────────────────────────────\n// Prefixed `sd-` so they don't collide with anything in the host website's CSS.\n\nconst ANIM_STYLES = `\n@keyframes sdFadeUp {\n from { opacity: 0; transform: translateY(16px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes sdFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes sdScaleIn {\n from { opacity: 0; transform: scale(0.94); }\n to { opacity: 1; transform: scale(1); }\n}\n@keyframes sdGlowPulse {\n 0%, 100% { opacity: 0.35; }\n 50% { opacity: 0.65; }\n}\n@media (prefers-reduced-motion: reduce) {\n .sd-fu, .sd-fi, .sd-si { animation: none !important; opacity: 1 !important; transform: none !important; }\n .sd-gp { animation: none !important; }\n}\n.sd-fu { animation: sdFadeUp 0.55s cubic-bezier(0.16,1,0.3,1) both; }\n.sd-fi { animation: sdFadeIn 0.45s ease-out both; }\n.sd-si { animation: sdScaleIn 0.45s cubic-bezier(0.16,1,0.3,1) both; }\n.sd-gp { animation: sdGlowPulse 3s ease-in-out infinite; }\n.sd-d1 { animation-delay: 60ms; }\n.sd-d2 { animation-delay: 120ms; }\n.sd-d3 { animation-delay: 180ms; }\n.sd-d4 { animation-delay: 240ms; }\n.sd-d5 { animation-delay: 320ms; }\n.sd-d6 { animation-delay: 400ms; }\n`;\n\n// ─── RatingBar ────────────────────────────────────────────────────────────────\n\nfunction RatingBar({\n label,\n count,\n total,\n}: {\n label: string;\n count: number;\n total: number;\n}) {\n const pct = total > 0 ? Math.round((count / total) * 100) : 0;\n return (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"w-12 text-right shrink-0\">{label}</span>\n <div className=\"flex-1 h-1.5 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-amber-400 rounded-full transition-all duration-700\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <span className=\"w-6 shrink-0\">{count}</span>\n </div>\n );\n}\n\n// ─── IconBlock ────────────────────────────────────────────────────────────────\n\nfunction IconBlock({ src }: { src?: string | null; name: string }) {\n return (\n <div className=\"relative flex-shrink-0\">\n {/* Glow ring */}\n <div\n className=\"sd-gp absolute -inset-1.5 rounded-2xl bg-primary/30 blur-md pointer-events-none\"\n aria-hidden=\"true\"\n />\n <div className=\"sd-si relative w-20 h-20 rounded-2xl overflow-hidden shadow-lg ring-1 ring-border\">\n {src ? (\n <img\n src={src}\n alt=\"\"\n aria-hidden\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full bg-gradient-to-br from-primary/25 to-primary/8 flex items-center justify-center\">\n <svg\n viewBox=\"0 0 40 40\"\n className=\"w-10 h-10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <polygon\n points=\"20,4 34,11 20,18 6,11\"\n className=\"fill-primary/40\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"6,11 20,18 20,34 6,27\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"34,11 20,18 20,34 34,27\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n </svg>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ─── StoreProductDetailPage ───────────────────────────────────────────────────\n\nexport interface StoreProductDetailPageProps extends StorePageProps {\n slug?: string;\n id?: string;\n productName?: string;\n}\n\nexport function StoreProductDetailPage({\n slug,\n id,\n appLoginUrl,\n onNavigate,\n productName,\n}: StoreProductDetailPageProps) {\n const client = useWebSDK();\n const [details, setDetails] = useState<StoreProductDetails | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeScreenshot, setActiveScreenshot] = useState(0);\n // Key bumped on each screenshot change so the img remounts → re-runs sdFadeIn\n const [screenshotKey, setScreenshotKey] = useState(0);\n // WORKFLOW products get a live read-only canvas preview; if the viewer\n // reports an error (e.g. template without a graph) we fall back to\n // screenshots silently.\n const [embedFailed, setEmbedFailed] = useState(false);\n\n useEffect(() => {\n if (!slug && !id) {\n setError(\"Product not found.\");\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n client\n .query<DetailsResponse>(STORE_PRODUCT_DETAILS_QUERY, {\n input: { slug: slug ?? undefined, id: id ?? undefined },\n })\n .then((r) => {\n if (cancelled) return;\n if (r.errors?.length) throw new Error(r.errors[0]!.message);\n if (!r.data?.storeProductDetails) throw new Error(\"Not found\");\n setDetails(r.data.storeProductDetails);\n })\n .catch(() => {\n if (!cancelled) setError(\"Product not found or unavailable.\");\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [client, slug, id]);\n\n function navigate(path: string) {\n if (onNavigate) {\n onNavigate(path);\n return;\n }\n window.location.href = path;\n }\n\n function switchScreenshot(i: number) {\n setActiveScreenshot(i);\n setScreenshotKey((k) => k + 1);\n }\n\n if (loading) {\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12 animate-pulse\">\n <div className=\"h-4 bg-muted rounded w-40 mb-8\" />\n <div className=\"flex gap-6 mb-8\">\n <div className=\"w-20 h-20 rounded-2xl bg-muted flex-shrink-0\" />\n <div className=\"flex-1 space-y-3 pt-1\">\n <div className=\"h-6 bg-muted rounded w-1/3\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n </div>\n </div>\n <div className=\"h-56 bg-muted rounded-xl mb-8\" />\n <div className=\"space-y-3\">\n {[...Array(5)].map((_, i) => (\n <div key={i} className=\"h-4 bg-muted rounded\" />\n ))}\n </div>\n </div>\n );\n }\n\n if (error || !details) {\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 text-center\">\n <p className=\"text-muted-foreground mb-4\">\n {error ?? \"Product not found.\"}\n </p>\n <button\n type=\"button\"\n onClick={() => navigate(\"/store\")}\n className=\"text-sm text-primary hover:underline\"\n >\n Back to Store\n </button>\n </div>\n );\n }\n\n const {\n product,\n publisher,\n reviews,\n reviewsCount,\n relatedProducts,\n ratingDistribution,\n } = details;\n const priceLabel = formatPrice(\n product.price,\n product.currency,\n product.pricingModel,\n );\n const screenshots = product.screenshots ?? [];\n const totalRatings = ratingDistribution\n ? ratingDistribution.fiveStars +\n ratingDistribution.fourStars +\n ratingDistribution.threeStars +\n ratingDistribution.twoStars +\n ratingDistribution.oneStar\n : 0;\n\n return (\n <div className=\"w-full\">\n {/* Self-contained animation styles */}\n <style dangerouslySetInnerHTML={{ __html: ANIM_STYLES }} />\n\n <PageHead\n title={`${product.name}${productName ? ` – ${productName} Store` : \" – Store\"}`}\n description={product.description ?? undefined}\n productName={productName}\n />\n\n {/* ── Hero header band ─────────────────────────────────────────────── */}\n <div className=\"relative overflow-hidden\">\n {/* Gradient background */}\n <div\n className=\"absolute inset-0 bg-gradient-to-b from-primary/[0.07] via-background to-background pointer-events-none\"\n aria-hidden=\"true\"\n />\n {/* Grid overlay */}\n <svg\n className=\"absolute inset-0 w-full h-full opacity-[0.04] pointer-events-none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <pattern\n id=\"sd-grid\"\n width=\"40\"\n height=\"40\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 40 0 L 0 0 0 40\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#sd-grid)\" />\n </svg>\n {/* Glow blob */}\n <div\n className=\"absolute -top-12 -left-12 w-72 h-72 rounded-full bg-primary/10 blur-3xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-6 pb-8\">\n {/* Breadcrumb */}\n <nav className=\"sd-fi text-sm text-muted-foreground mb-6 flex items-center gap-1.5 flex-wrap\">\n <button\n type=\"button\"\n onClick={() => navigate(\"/store\")}\n className=\"hover:text-primary transition-colors\"\n >\n Store\n </button>\n <span aria-hidden=\"true\">›</span>\n {product.category && (\n <>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`/store/browse?category=${product.category}`)\n }\n className=\"hover:text-primary transition-colors\"\n >\n {product.category}\n </button>\n <span aria-hidden=\"true\">›</span>\n </>\n )}\n <span className=\"text-foreground font-medium\">{product.name}</span>\n </nav>\n\n {/* Product identity */}\n <div className=\"flex gap-5 items-start\">\n <IconBlock src={product.icon} name={product.name} />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"sd-fu flex items-start gap-2 flex-wrap mb-1\">\n <h1 className=\"text-2xl sm:text-3xl font-bold text-foreground leading-tight\">\n {product.name}\n </h1>\n <TypeBadge type={product.type} />\n </div>\n {product.description && (\n <p className=\"sd-fu sd-d1 text-muted-foreground text-sm mb-2 leading-relaxed\">\n {product.description}\n </p>\n )}\n <div className=\"sd-fu sd-d2 flex items-center gap-3 text-sm text-muted-foreground flex-wrap\">\n {product.rating != null && product.rating > 0 && (\n <span className=\"flex items-center gap-1\">\n <StarRating rating={product.rating} />\n <span className=\"font-semibold text-foreground\">\n {product.rating.toFixed(1)}\n </span>\n <span>({reviewsCount ?? 0})</span>\n </span>\n )}\n {product.downloads != null && (\n <span>{formatDownloads(product.downloads)} downloads</span>\n )}\n {product.authorName && <span>by {product.authorName}</span>}\n {product.license && <span>{product.license}</span>}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Main content ──────────────────────────────────────────────────── */}\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6\">\n <div className=\"grid lg:grid-cols-[1fr_300px] gap-8\">\n {/* Left column */}\n <div>\n {/* Mobile CTA */}\n <div className=\"sd-fu sd-d3 lg:hidden mb-6 p-4 rounded-xl border border-border bg-card flex items-center gap-4\">\n <div>\n <div className=\"text-2xl font-bold text-foreground\">\n {priceLabel}\n </div>\n {product.pricingModel === \"SUBSCRIPTION\" && (\n <div className=\"text-xs text-muted-foreground\">per month</div>\n )}\n </div>\n <a\n href={appLoginUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex-1 h-11 rounded-lg bg-primary text-primary-foreground text-sm font-semibold flex items-center justify-center hover:opacity-90 transition-opacity\"\n >\n {priceLabel === \"Free\"\n ? \"Install Free\"\n : `Get for ${priceLabel}`}\n </a>\n </div>\n\n {/* Interactive workflow preview (WORKFLOW products only) */}\n {product.type === \"WORKFLOW\" && !embedFailed && (\n <div className=\"sd-fu sd-d3 mb-8\">\n <WorkflowEmbed\n appUrl={appLoginUrl}\n productId={product.id}\n onError={() => setEmbedFailed(true)}\n />\n </div>\n )}\n\n {/* Screenshots */}\n {screenshots.length > 0 && (\n <div className=\"sd-fu sd-d3 mb-8\">\n <div className=\"rounded-xl overflow-hidden bg-muted aspect-video mb-3 shadow-md\">\n <img\n key={screenshotKey}\n src={screenshots[activeScreenshot]}\n alt={`Screenshot ${activeScreenshot + 1}`}\n className=\"sd-fi w-full h-full object-cover\"\n />\n </div>\n {screenshots.length > 1 && (\n <div className=\"flex gap-2 overflow-x-auto pb-1\">\n {screenshots.map((src, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => switchScreenshot(i)}\n className={`w-20 h-14 rounded-lg overflow-hidden flex-shrink-0 border-2 transition-all duration-200 ${\n i === activeScreenshot\n ? \"border-primary shadow-sm shadow-primary/20\"\n : \"border-transparent opacity-50 hover:opacity-80\"\n }`}\n >\n <img\n src={src}\n alt={`Thumbnail ${i + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* About */}\n {product.longDescription && (\n <div className=\"sd-fu sd-d4 mb-8\">\n <h2 className=\"text-lg font-bold text-foreground mb-3\">\n About\n </h2>\n <div className=\"prose prose-sm max-w-none text-muted-foreground leading-relaxed whitespace-pre-line\">\n {product.longDescription}\n </div>\n </div>\n )}\n\n {/* Publisher */}\n {publisher && (\n <div className=\"sd-fu sd-d5 mb-8 p-4 rounded-xl border border-border bg-card hover:border-primary/30 transition-colors duration-300\">\n <h2 className=\"text-sm font-semibold text-foreground mb-3\">\n Publisher\n </h2>\n <div className=\"flex items-center gap-3\">\n {publisher.logoUrl ? (\n <img\n src={publisher.logoUrl}\n alt={publisher.name}\n className=\"w-10 h-10 rounded-full object-cover\"\n />\n ) : (\n <div className=\"w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center text-primary text-sm font-bold\">\n {publisher.name.charAt(0).toUpperCase()}\n </div>\n )}\n <div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-semibold text-foreground text-sm\">\n {publisher.name}\n </span>\n {publisher.isVerified && (\n <span className=\"text-xs text-primary font-medium\">\n ✓ Verified\n </span>\n )}\n </div>\n {publisher.bio && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">\n {publisher.bio}\n </p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Reviews */}\n {(reviews?.length ?? 0) > 0 && (\n <div className=\"sd-fu sd-d5 mb-8\">\n <h2 className=\"text-lg font-bold text-foreground mb-4\">\n Reviews ({reviewsCount ?? reviews!.length})\n </h2>\n\n {ratingDistribution && totalRatings > 0 && (\n <div className=\"sd-si flex gap-6 mb-5 p-4 rounded-xl border border-border bg-card\">\n <div className=\"text-center\">\n <div className=\"text-4xl font-bold text-foreground tabular-nums\">\n {product.rating?.toFixed(1) ?? \"—\"}\n </div>\n {product.rating != null && (\n <StarRating rating={product.rating} />\n )}\n <div className=\"text-xs text-muted-foreground mt-1\">\n {totalRatings} ratings\n </div>\n </div>\n <div className=\"flex-1 space-y-1.5 pt-1\">\n <RatingBar\n label=\"5 ★\"\n count={ratingDistribution.fiveStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"4 ★\"\n count={ratingDistribution.fourStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"3 ★\"\n count={ratingDistribution.threeStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"2 ★\"\n count={ratingDistribution.twoStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"1 ★\"\n count={ratingDistribution.oneStar}\n total={totalRatings}\n />\n </div>\n </div>\n )}\n\n <div className=\"space-y-3\">\n {reviews!.slice(0, 5).map((review, idx) => (\n <div\n key={review.id}\n className=\"sd-fu p-4 rounded-xl border border-border bg-card hover:border-primary/20 transition-colors duration-200\"\n style={{ animationDelay: `${(idx + 5) * 60}ms` }}\n >\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <StarRating rating={review.rating} />\n {review.verifiedPurchase && (\n <span className=\"text-xs text-emerald-500 font-medium\">\n Verified\n </span>\n )}\n </div>\n {review.title && (\n <p className=\"font-semibold text-sm text-foreground mb-1\">\n {review.title}\n </p>\n )}\n {review.comment && (\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {review.comment}\n </p>\n )}\n {review.createdAt && (\n <p className=\"text-xs text-muted-foreground mt-2\">\n {new Date(review.createdAt).toLocaleDateString(\n \"en-US\",\n {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n },\n )}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Related */}\n {(relatedProducts?.length ?? 0) > 0 && (\n <div className=\"sd-fu sd-d6\">\n <h2 className=\"text-lg font-bold text-foreground mb-4\">\n Related\n </h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {relatedProducts!.slice(0, 6).map((p) => (\n <ProductCard\n key={p.id}\n product={p}\n onClick={() => navigate(`/store/${p.slug}`)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Sticky sidebar */}\n <aside className=\"lg:sticky lg:top-24 self-start\">\n <div className=\"sd-fu sd-d4 bg-card border border-border rounded-xl p-5 space-y-4 hover:border-primary/30 transition-colors duration-300 hover:shadow-lg hover:shadow-primary/5\">\n {/* Price */}\n <div>\n <div\n className={`text-3xl font-extrabold ${priceLabel === \"Free\" ? \"text-emerald-500\" : \"text-foreground\"}`}\n >\n {priceLabel}\n </div>\n {product.pricingModel === \"SUBSCRIPTION\" && (\n <div className=\"text-xs text-muted-foreground\">per month</div>\n )}\n </div>\n\n {/* CTA */}\n <a\n href={appLoginUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-center w-full h-11 rounded-lg bg-primary text-primary-foreground text-sm font-semibold hover:opacity-90 active:scale-[0.98] transition-all duration-150\"\n >\n {priceLabel === \"Free\"\n ? \"Install Free\"\n : `Get for ${priceLabel}`}\n </a>\n <p className=\"text-xs text-muted-foreground text-center\">\n Login required to install\n </p>\n\n {/* Metadata */}\n <div className=\"border-t border-border pt-4 space-y-2 text-xs text-muted-foreground\">\n {product.type && (\n <div className=\"flex justify-between\">\n <span>Type</span>\n <span className=\"text-foreground font-medium\">\n {product.type}\n </span>\n </div>\n )}\n {product.category && (\n <div className=\"flex justify-between\">\n <span>Category</span>\n <span className=\"text-foreground font-medium\">\n {product.category}\n </span>\n </div>\n )}\n {product.license && (\n <div className=\"flex justify-between\">\n <span>License</span>\n <span className=\"text-foreground font-medium\">\n {product.license}\n </span>\n </div>\n )}\n {product.minPlatformVersion && (\n <div className=\"flex justify-between\">\n <span>Requires</span>\n <span className=\"text-foreground font-medium\">\n v{product.minPlatformVersion}+\n </span>\n </div>\n )}\n {product.downloads != null && (\n <div className=\"flex justify-between\">\n <span>Downloads</span>\n <span className=\"text-foreground font-medium\">\n {formatDownloads(product.downloads)}\n </span>\n </div>\n )}\n </div>\n\n {/* Tags */}\n {(product.tags?.length ?? 0) > 0 && (\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {product.tags!.map((tag) => (\n <span\n key={tag}\n className=\"text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </aside>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/store/product-card.tsx","../../src/store/queries.ts","../../src/client/security.ts","../../src/client/graphql-client.ts","../../src/client/provider.tsx","../../src/seo/page-head.tsx","../../src/store/store-home.tsx","../../src/store/store-browse.tsx","../../src/store/workflow-embed.tsx","../../src/store/store-product-detail.tsx"],"names":["jsxs","jsx","Fragment","useState","useRef","useEffect","useMemo"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\n\nimport type { StoreProduct } from \"./types\";\n\n// ─── helpers ────────────────────────────────────────────────────────────────\n\nexport function formatPrice(\n price: number | null | undefined,\n currency: string | null | undefined,\n pricingModel: string,\n): string {\n if (pricingModel === \"FREE\" || !price || price === 0) return \"Free\";\n const curr = currency || \"USD\";\n try {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: curr,\n }).format(price);\n } catch {\n return `${curr} ${price.toFixed(2)}`;\n }\n}\n\nexport function formatDownloads(n: number | null | undefined): string {\n if (!n) return \"0\";\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toString();\n}\n\nexport function StarRating({ rating }: { rating: number }) {\n return (\n <span className=\"flex items-center gap-0.5\">\n {[1, 2, 3, 4, 5].map((star) => (\n <svg\n key={star}\n viewBox=\"0 0 12 12\"\n className={`w-3 h-3 ${\n star <= Math.round(rating)\n ? \"text-amber-400 fill-current\"\n : \"text-muted-foreground/30 fill-current\"\n }`}\n >\n <path d=\"M6 1l1.545 3.09L11 4.59l-2.5 2.41.59 3.41L6 8.79l-3.09 1.61L3.5 7 1 4.59l3.455-.5L6 1z\" />\n </svg>\n ))}\n </span>\n );\n}\n\nexport function TypeBadge({ type }: { type: string }) {\n const labels: Record<string, string> = {\n APP: \"App\",\n NODE: \"Node\",\n WORKFLOW: \"Workflow\",\n TEMPLATE: \"Template\",\n INTEGRATION: \"Integration\",\n EXTENSION: \"Extension\",\n THEME: \"Theme\",\n };\n return (\n <span className=\"inline-block text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium\">\n {labels[type] ?? type}\n </span>\n );\n}\n\n// ─── ProductCard ─────────────────────────────────────────────────────────────\n\ninterface ProductCardProps {\n product: StoreProduct;\n onClick?: () => void;\n href?: string;\n}\n\nexport function ProductCard({ product, onClick, href }: ProductCardProps) {\n const priceLabel = formatPrice(\n product.price,\n product.currency,\n product.pricingModel,\n );\n\n const inner = (\n <div className=\"group bg-card border border-border rounded-xl p-4 flex flex-col gap-3 transition-all duration-200 hover:shadow-md hover:border-primary/30 cursor-pointer h-full\">\n {/* Icon + badge row */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"w-12 h-12 rounded-lg bg-muted flex-shrink-0 overflow-hidden\">\n {product.icon ? (\n <img\n src={product.icon}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-gradient-to-br from-primary/15 to-primary/5\">\n <svg\n viewBox=\"0 0 32 32\"\n className=\"w-8 h-8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <polygon\n points=\"16,4 28,10 16,16 4,10\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.35\"\n />\n <polygon\n points=\"4,10 16,16 16,28 4,22\"\n className=\"fill-primary/15\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.35\"\n />\n <polygon\n points=\"28,10 16,16 16,28 28,22\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.35\"\n />\n </svg>\n </div>\n )}\n </div>\n <TypeBadge type={product.type} />\n </div>\n\n {/* Name + description */}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-foreground text-sm leading-snug line-clamp-1 group-hover:text-primary transition-colors\">\n {product.name}\n </h3>\n {product.description && (\n <p className=\"text-muted-foreground text-xs mt-1 line-clamp-2 leading-relaxed\">\n {product.description}\n </p>\n )}\n </div>\n\n {/* Footer: rating + price */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1.5\">\n {product.rating != null && product.rating > 0 ? (\n <>\n <StarRating rating={product.rating} />\n <span className=\"text-xs text-muted-foreground\">\n {product.rating.toFixed(1)}\n </span>\n </>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n No reviews yet\n </span>\n )}\n </div>\n <span\n className={`text-xs font-semibold ${\n priceLabel === \"Free\" ? \"text-emerald-500\" : \"text-foreground\"\n }`}\n >\n {priceLabel}\n </span>\n </div>\n </div>\n );\n\n if (href) {\n return (\n <a href={href} onClick={onClick} className=\"block h-full no-underline\">\n {inner}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"block w-full text-left h-full\"\n >\n {inner}\n </button>\n );\n}\n","export const STORE_PRODUCT_FIELDS = `\n fragment StoreProductFields on StoreProduct {\n id name slug type subType nature status pricingModel\n price currency description icon bannerUrl screenshots\n category tags featured downloads viewCount rating reviewCount\n publisherId authorName license compatibleProducts\n }\n`;\n\nexport const HOME_GROUPED_PRODUCTS_QUERY = `\n ${STORE_PRODUCT_FIELDS}\n query HomeGroupedProducts($compatibleWith: String) {\n homeGroupedProducts(compatibleWith: $compatibleWith) {\n featured { ...StoreProductFields }\n mostDownloaded { ...StoreProductFields }\n recentlyAdded { ...StoreProductFields }\n freeItems { ...StoreProductFields }\n }\n }\n`;\n\nexport const BROWSE_STORE_QUERY = `\n ${STORE_PRODUCT_FIELDS}\n query BrowseStore($input: BrowseStoreInput!) {\n browseStore(input: $input) {\n products { ...StoreProductFields }\n totalCount\n hasMore\n nextCursor\n facets {\n types { value count }\n categories { value count }\n pricingModels { value count }\n priceRange { min max }\n }\n }\n }\n`;\n\nexport const STORE_PRODUCT_DETAILS_QUERY = `\n ${STORE_PRODUCT_FIELDS}\n query StoreProductDetails($input: StoreProductDetailsInput!) {\n storeProductDetails(input: $input) {\n product { ...StoreProductFields longDescription videoUrls minPlatformVersion }\n publisher { id name email websiteUrl logoUrl bio isVerified tier }\n reviews { id rating title comment verifiedPurchase helpful createdAt }\n reviewsCount\n relatedProducts { ...StoreProductFields }\n ratingDistribution { fiveStars fourStars threeStars twoStars oneStar }\n }\n }\n`;\n\nexport const SEARCH_SUGGESTIONS_QUERY = `\n query SearchSuggestions($query: String!, $limit: Int) {\n searchSuggestions(query: $query, limit: $limit) {\n term type count\n }\n }\n`;\n\nexport const CATEGORIES_QUERY = `\n query Categories {\n categories {\n id name slug description icon parentId\n }\n }\n`;\n","const LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\nconst RESERVED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"x-actor-id\",\n \"x-actor-type\",\n \"x-consent-granted-by\",\n \"x-consent-scope\",\n \"x-consent-granted-at\",\n \"x-consent-expires-at\",\n]);\n\nexport function validateGatewayUrl(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Gateway URL must be a valid absolute URL\");\n }\n\n if (url.protocol === \"https:\") {\n return url.toString();\n }\n\n if (\n url.protocol === \"http:\" &&\n LOOPBACK_HOSTS.has(url.hostname.toLowerCase())\n ) {\n return url.toString();\n }\n\n throw new Error(\"Gateway URL must use HTTPS unless it targets localhost\");\n}\n\nexport function sanitizeHeaders(\n headers?: Record<string, string>,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => !RESERVED_HEADERS.has(key.toLowerCase()),\n ),\n );\n}\n","/**\n * Lightweight GraphQL client for the Burdenoff Web SDK.\n * Uses native fetch - zero external dependencies.\n * All calls are unauthenticated (public gateway operations only).\n */\n\nimport { sanitizeHeaders, validateGatewayUrl } from \"./security\";\n\nexport interface WebSDKClientConfig {\n /** Global public gateway URL (e.g. \"https://api.burdenoff.com/global/graphql\") */\n gatewayUrl: string;\n /** Platform product ID for scoping operations */\n productId: string;\n /** Product slug (used for public product queries) */\n productSlug?: string;\n /** reCAPTCHA site key (if not fetched from product config) */\n recaptchaSiteKey?: string;\n /** Rybbit analytics site ID */\n rybbitSiteId?: string;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n /**\n * Per-request timeout in ms. Kept below the gateway's operation timeout so a\n * stalled request surfaces as an error the UI can render, instead of leaving\n * a page stuck on loading skeletons forever. Default 12000.\n */\n timeoutMs?: number;\n /**\n * Extra attempts for transient failures (timeout / network / 5xx / 429) on\n * QUERIES ONLY. Mutations are never retried — a retried contact-form or\n * waitlist submit would double-submit. Default 1 (2 attempts total).\n */\n maxRetries?: number;\n}\n\nexport interface GraphQLResponse<T = Record<string, unknown>> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport class WebSDKClient {\n private config: WebSDKClientConfig;\n private queryCache = new Map<\n string,\n { data: GraphQLResponse<unknown>; ts: number }\n >();\n private inflight = new Map<string, Promise<GraphQLResponse<unknown>>>();\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static MAX_CACHE_ENTRIES = 100;\n private static DEFAULT_TIMEOUT_MS = 12_000;\n private static DEFAULT_MAX_RETRIES = 1;\n private static RETRY_BASE_DELAY_MS = 400;\n\n constructor(config: WebSDKClientConfig) {\n this.config = {\n ...config,\n gatewayUrl: validateGatewayUrl(config.gatewayUrl),\n headers: sanitizeHeaders(config.headers),\n };\n }\n\n getConfig(): WebSDKClientConfig {\n return this.config;\n }\n\n /**\n * Execute a GraphQL query (with deduplication and caching)\n */\n async query<T = Record<string, unknown>>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const cacheKey = JSON.stringify({ query, variables });\n\n // Return cached response if still valid, evict if expired\n const cached = this.queryCache.get(cacheKey);\n if (cached) {\n if (Date.now() - cached.ts < WebSDKClient.CACHE_TTL) {\n return cached.data as GraphQLResponse<T>;\n }\n this.queryCache.delete(cacheKey);\n }\n\n // Deduplicate: if same query is already in-flight, reuse the promise\n const existing = this.inflight.get(cacheKey);\n if (existing) {\n return existing as Promise<GraphQLResponse<T>>;\n }\n\n const promise = this.request<T>(query, variables)\n .then((result) => {\n // Cache successful responses only\n if (result.data && !result.errors?.length) {\n if (this.queryCache.size >= WebSDKClient.MAX_CACHE_ENTRIES) {\n const oldestEntry = this.queryCache.keys().next().value;\n if (oldestEntry) {\n this.queryCache.delete(oldestEntry);\n }\n }\n this.queryCache.set(cacheKey, { data: result, ts: Date.now() });\n }\n return result;\n })\n .finally(() => {\n this.inflight.delete(cacheKey);\n });\n\n this.inflight.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Execute a GraphQL mutation\n */\n async mutate<T = Record<string, unknown>>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n // retry=false: a retried mutation could double-submit (contact form,\n // waitlist signup, order). Only the timeout applies here.\n return this.request<T>(mutation, variables, false);\n }\n\n /** HTTP statuses worth another attempt — transient server/edge conditions. */\n private static isRetriableStatus(status: number): boolean {\n return status === 429 || status === 408 || (status >= 500 && status < 600);\n }\n\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Perform the HTTP call with a hard timeout. Every outcome resolves to a\n * GraphQLResponse — callers never hang, so a UI's `loading` state always\n * settles into data or a renderable error.\n */\n private async attempt<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n timeoutMs: number,\n ): Promise<{ res: GraphQLResponse<T>; retriable: boolean }> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(this.config.gatewayUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-product-id\": this.config.productId,\n ...this.config.headers,\n },\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n console.error(\n \"[WebSDK] GraphQL request failed\",\n response.status,\n response.statusText,\n );\n return {\n res: {\n errors: [\n {\n message: `HTTP ${response.status}: ${response.statusText}`,\n extensions: { code: `HTTP_${response.status}` },\n },\n ],\n },\n retriable: WebSDKClient.isRetriableStatus(response.status),\n };\n }\n\n return {\n res: (await response.json()) as GraphQLResponse<T>,\n retriable: false,\n };\n } catch (error) {\n const aborted =\n error instanceof Error &&\n (error.name === \"AbortError\" || controller.signal.aborted);\n const message = aborted\n ? `Request timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : \"Network error\";\n console.error(\"[WebSDK] Network error\", message);\n return {\n res: {\n errors: [\n {\n message,\n extensions: { code: aborted ? \"TIMEOUT\" : \"NETWORK_ERROR\" },\n },\n ],\n },\n // Transport-level failures are worth one more try; a genuine outage\n // just fails twice quickly and still renders an error state.\n retriable: true,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>,\n retry = true,\n ): Promise<GraphQLResponse<T>> {\n const timeoutMs = this.config.timeoutMs ?? WebSDKClient.DEFAULT_TIMEOUT_MS;\n const maxRetries = retry\n ? (this.config.maxRetries ?? WebSDKClient.DEFAULT_MAX_RETRIES)\n : 0;\n\n let last: GraphQLResponse<T> | undefined;\n for (let i = 0; i <= maxRetries; i++) {\n const { res, retriable } = await this.attempt<T>(\n query,\n variables,\n timeoutMs,\n );\n if (!retriable || i === maxRetries) return res;\n last = res;\n // Small backoff with jitter so a burst of clients doesn't retry in lockstep.\n await WebSDKClient.sleep(\n WebSDKClient.RETRY_BASE_DELAY_MS * (i + 1) + Math.random() * 200,\n );\n }\n return last as GraphQLResponse<T>;\n }\n}\n","/**\n * React context provider for the Web SDK client.\n * Wraps the application with WebSDKClient configuration.\n */\n\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { resolveGatewayUrl } from \"./gateway-resolver\";\nimport { WebSDKClient, type WebSDKClientConfig } from \"./graphql-client\";\n\nconst WebSDKContext = createContext<WebSDKClient | null>(null);\n\nexport interface WebSDKProviderProps {\n /** SDK client configuration */\n config: WebSDKClientConfig;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the WebSDKClient available to all child components.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={{\n * gatewayUrl: \"https://api.burdenoff.com/global/graphql\",\n * productId: \"your-product-id\",\n * productSlug: \"your-product\",\n * }}>\n * <App />\n * </WebSDKProvider>\n * ```\n */\nexport function WebSDKProvider({ config, children }: WebSDKProviderProps) {\n const client = useMemo(() => {\n const resolvedConfig = {\n ...config,\n gatewayUrl: resolveGatewayUrl(config.gatewayUrl),\n };\n return new WebSDKClient(resolvedConfig);\n }, [config]);\n\n return (\n <WebSDKContext.Provider value={client}>{children}</WebSDKContext.Provider>\n );\n}\n\n/**\n * Hook to access the WebSDKClient instance.\n * Must be used within a WebSDKProvider.\n */\nexport function useWebSDK(): WebSDKClient {\n const client = useContext(WebSDKContext);\n if (!client) {\n throw new Error(\"useWebSDK must be used within a WebSDKProvider\");\n }\n return client;\n}\n\n/**\n * Hook to access the SDK configuration.\n * Useful for components that need config values like productId, recaptchaSiteKey, etc.\n */\nexport function useWebSDKConfig(): WebSDKClientConfig {\n const client = useWebSDK();\n return client.getConfig();\n}\n","/**\n * PageHead Component\n * Manages dynamic meta tags for SEO optimization on a per-page basis.\n * Supports JSON-LD structured data, Open Graph, Twitter Cards, favicons, and robots directives.\n *\n * @example\n * ```tsx\n * <PageHead\n * title=\"About Us\"\n * description=\"Learn about our mission and team\"\n * productName=\"MyProduct\"\n * keywords=\"about, team, mission\"\n * image=\"/og-about.png\"\n * url=\"https://myproduct.com/about\"\n * favicon=\"/favicon.ico\"\n * robots=\"index, follow\"\n * locale=\"en_US\"\n * twitterHandle=\"@burdenoff\"\n * themeColor=\"#1a1a2e\"\n * structuredData={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"WebPage\",\n * name: \"About Us\",\n * }}\n * />\n * ```\n */\n\nimport { Helmet } from \"react-helmet-async\";\n\nexport interface PageHeadProps {\n /** Page title */\n title: string;\n /** Meta description */\n description?: string;\n /** Product/brand name (appended to title) */\n productName?: string;\n /** SEO keywords */\n keywords?: string;\n /** Open Graph image URL */\n image?: string;\n /** Page canonical URL */\n url?: string;\n /** Favicon URL */\n favicon?: string;\n /** Robots directive (e.g., \"index, follow\") */\n robots?: string;\n /** Open Graph locale (e.g., \"en_US\") */\n locale?: string;\n /** Twitter handle (e.g., \"@burdenoff\") */\n twitterHandle?: string;\n /** Theme color for mobile browsers */\n themeColor?: string;\n /** JSON-LD structured data objects */\n structuredData?: Record<string, unknown> | Array<Record<string, unknown>>;\n /** Additional meta tags */\n additionalMeta?: Array<{\n name?: string;\n property?: string;\n content: string;\n }>;\n}\n\nexport function PageHead({\n title,\n description,\n productName,\n keywords,\n image,\n url,\n favicon,\n robots = \"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\",\n locale = \"en_US\",\n twitterHandle,\n themeColor = \"#000000\",\n structuredData,\n additionalMeta,\n}: PageHeadProps) {\n const fullTitle =\n productName && !title.includes(productName)\n ? `${title} | ${productName}`\n : title;\n\n const fullImageUrl =\n image && !image.startsWith(\"http\") && url\n ? `${url.replace(/\\/$/, \"\")}${image}`\n : image;\n\n // Normalize structured data to an array\n const structuredDataItems: Array<Record<string, unknown>> = structuredData\n ? Array.isArray(structuredData)\n ? structuredData\n : [structuredData]\n : [];\n\n return (\n <Helmet>\n {/* Primary Meta Tags */}\n <title>{fullTitle}</title>\n <meta name=\"title\" content={fullTitle} />\n {description && <meta name=\"description\" content={description} />}\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"author\" content=\"Burdenoff Consultancy Services Pvt Ltd\" />\n <meta name=\"robots\" content={robots} />\n\n {/* Canonical URL */}\n {url && <link rel=\"canonical\" href={url} />}\n\n {/* Favicon */}\n {favicon && <link rel=\"icon\" href={favicon} />}\n\n {/* Open Graph / Facebook */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={fullTitle} />\n {description && <meta property=\"og:description\" content={description} />}\n {fullImageUrl && <meta property=\"og:image\" content={fullImageUrl} />}\n {url && <meta property=\"og:url\" content={url} />}\n <meta property=\"og:locale\" content={locale} />\n {productName && <meta property=\"og:site_name\" content={productName} />}\n\n {/* Twitter Card */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={fullTitle} />\n {description && <meta name=\"twitter:description\" content={description} />}\n {fullImageUrl && <meta name=\"twitter:image\" content={fullImageUrl} />}\n {twitterHandle && <meta name=\"twitter:creator\" content={twitterHandle} />}\n\n {/* Theme Color */}\n <meta name=\"theme-color\" content={themeColor} />\n\n {/* JSON-LD Structured Data */}\n {structuredDataItems.map((data, index) => (\n <script key={`ld-${index}`} type=\"application/ld+json\">\n {JSON.stringify(data)}\n </script>\n ))}\n\n {/* Additional Meta Tags */}\n {additionalMeta?.map((meta, index) => (\n <meta\n key={`meta-${index}`}\n {...(meta.name ? { name: meta.name } : {})}\n {...(meta.property ? { property: meta.property } : {})}\n content={meta.content}\n />\n ))}\n </Helmet>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { ProductCard, formatPrice } from \"./product-card\";\nimport { HOME_GROUPED_PRODUCTS_QUERY } from \"./queries\";\nimport { useWebSDK } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type {\n GroupedStoreProducts,\n StorePageProps,\n StoreProduct,\n StoreTypeFilter,\n} from \"./types\";\n\ninterface HomeGroupedResponse {\n homeGroupedProducts: GroupedStoreProducts;\n}\n\n// ─── Dedup across sections ────────────────────────────────────────────────────\n\nfunction dedupAcross(lists: StoreProduct[][]): StoreProduct[][] {\n const seen = new Set<string>();\n return lists.map((list) => {\n const out: StoreProduct[] = [];\n for (const p of list) {\n if (!seen.has(p.id)) {\n seen.add(p.id);\n out.push(p);\n }\n }\n return out;\n });\n}\n\n// ─── FeaturedHeroCard ─────────────────────────────────────────────────────────\n\nfunction FeaturedHeroCard({\n product,\n onNavigate,\n}: {\n product: StoreProduct;\n onNavigate: (path: string) => void;\n}) {\n const priceLabel = formatPrice(\n product.price,\n product.currency,\n product.pricingModel,\n );\n return (\n <button\n type=\"button\"\n onClick={() => onNavigate(`/store/${product.slug}`)}\n className=\"group w-full text-left h-full rounded-2xl border border-border bg-card overflow-hidden hover:border-primary/40 transition-all duration-300 hover:shadow-xl hover:shadow-primary/10 flex flex-col\"\n >\n {/* Banner */}\n <div className=\"relative h-44 sm:h-52 bg-gradient-to-br from-primary/20 via-primary/8 to-background overflow-hidden flex-shrink-0\">\n {product.bannerUrl ? (\n <img\n src={product.bannerUrl}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <>\n <svg\n className=\"absolute inset-0 w-full h-full opacity-[0.07]\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <pattern\n id=\"fg-hero-grid\"\n width=\"36\"\n height=\"36\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 36 0 L 0 0 0 36\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#fg-hero-grid)\" />\n </svg>\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n aria-hidden=\"true\"\n >\n <svg\n viewBox=\"0 0 64 64\"\n className=\"w-20 h-20 opacity-25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polygon\n points=\"32,8 56,20 32,32 8,20\"\n className=\"fill-primary/40\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.5\"\n />\n <polygon\n points=\"8,20 32,32 32,56 8,44\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.5\"\n />\n <polygon\n points=\"56,20 32,32 32,56 56,44\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.5\"\n />\n </svg>\n </div>\n </>\n )}\n {/* Featured badge */}\n <span className=\"absolute top-3 left-3 text-xs font-semibold px-2.5 py-1 rounded-full bg-primary text-primary-foreground shadow-sm\">\n Featured\n </span>\n {/* Icon */}\n <div className=\"absolute bottom-4 left-4 w-14 h-14 rounded-xl shadow-lg overflow-hidden border-2 border-background\">\n {product.icon ? (\n <img\n src={product.icon}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full bg-gradient-to-br from-primary/25 to-primary/10 flex items-center justify-center\">\n <svg\n viewBox=\"0 0 32 32\"\n className=\"w-8 h-8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <polygon\n points=\"16,4 28,10 16,16 4,10\"\n className=\"fill-primary/40\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"4,10 16,16 16,28 4,22\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"28,10 16,16 16,28 28,22\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n </svg>\n </div>\n )}\n </div>\n </div>\n\n {/* Body */}\n <div className=\"p-5 flex flex-col flex-1\">\n <div className=\"flex items-start justify-between gap-3 mb-2\">\n <h3 className=\"text-base font-bold text-foreground group-hover:text-primary transition-colors line-clamp-1\">\n {product.name}\n </h3>\n <span\n className={`text-sm font-bold flex-shrink-0 ${priceLabel === \"Free\" ? \"text-emerald-500\" : \"text-foreground\"}`}\n >\n {priceLabel}\n </span>\n </div>\n {product.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-2 leading-relaxed flex-1\">\n {product.description}\n </p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <span className=\"text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium\">\n {product.type}\n </span>\n {product.authorName && (\n <span className=\"text-xs text-muted-foreground truncate\">\n by {product.authorName}\n </span>\n )}\n </div>\n </div>\n </button>\n );\n}\n\n// ─── Horizontal scroll row ────────────────────────────────────────────────────\n\nfunction ScrollRow({\n products,\n onProductClick,\n}: {\n products: StoreProduct[];\n onProductClick: (p: StoreProduct) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n\n function scroll(dir: \"l\" | \"r\") {\n ref.current?.scrollBy({\n left: dir === \"r\" ? 272 : -272,\n behavior: \"smooth\",\n });\n }\n\n return (\n <div className=\"relative group/row\">\n {/* Left arrow */}\n <button\n type=\"button\"\n onClick={() => scroll(\"l\")}\n aria-label=\"Scroll left\"\n className=\"absolute left-0 top-1/2 -translate-y-1/2 -translate-x-4 z-10 w-8 h-8 rounded-full bg-background border border-border shadow-md items-center justify-center text-muted-foreground hover:text-primary hover:border-primary/40 transition-all hidden sm:flex opacity-0 group-hover/row:opacity-100\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 3L6 8l4 5\" />\n </svg>\n </button>\n\n {/* Scrollable track */}\n <div\n ref={ref}\n className=\"flex gap-3 overflow-x-auto pb-1 snap-x snap-mandatory\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {products.map((product) => (\n <div key={product.id} className=\"flex-shrink-0 w-56 snap-start\">\n <ProductCard\n product={product}\n onClick={() => onProductClick(product)}\n />\n </div>\n ))}\n </div>\n\n {/* Right arrow */}\n <button\n type=\"button\"\n onClick={() => scroll(\"r\")}\n aria-label=\"Scroll right\"\n className=\"absolute right-0 top-1/2 -translate-y-1/2 translate-x-4 z-10 w-8 h-8 rounded-full bg-background border border-border shadow-md items-center justify-center text-muted-foreground hover:text-primary hover:border-primary/40 transition-all hidden sm:flex opacity-0 group-hover/row:opacity-100\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 3l4 5-4 5\" />\n </svg>\n </button>\n </div>\n );\n}\n\n// ─── Section header ───────────────────────────────────────────────────────────\n\nfunction SectionHead({\n title,\n hint,\n browseHref,\n onNavigate,\n}: {\n title: string;\n hint?: string;\n browseHref: string;\n onNavigate: (path: string) => void;\n}) {\n return (\n <div className=\"flex items-end justify-between mb-5 gap-4\">\n <div>\n <h2 className=\"text-xl font-bold text-foreground\">{title}</h2>\n {hint && <p className=\"text-sm text-muted-foreground mt-0.5\">{hint}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onNavigate(browseHref)}\n className=\"text-sm text-primary hover:underline font-medium flex-shrink-0 underline-offset-2\"\n >\n See all →\n </button>\n </div>\n );\n}\n\n// ─── Category quick-filter row ────────────────────────────────────────────────\n\nexport const DEFAULT_TYPE_FILTERS: StoreTypeFilter[] = [\n { type: \"NODE\", label: \"Nodes\" },\n { type: \"WORKFLOW\", label: \"Workflows\" },\n { type: \"TEMPLATE\", label: \"Templates\" },\n { type: \"INTEGRATION\", label: \"Integrations\" },\n { type: \"APP\", label: \"Apps\" },\n { type: \"EXTENSION\", label: \"Extensions\" },\n];\n\nfunction TypeFilters({\n browsePath,\n onNavigate,\n typeFilters,\n}: {\n browsePath: string;\n onNavigate: (path: string) => void;\n typeFilters: StoreTypeFilter[];\n}) {\n return (\n <div className=\"flex flex-wrap gap-2 justify-center\">\n {typeFilters.map((f) => (\n <button\n key={f.type}\n type=\"button\"\n onClick={() => onNavigate(`${browsePath}?type=${f.type}`)}\n className=\"px-4 py-1.5 rounded-full border border-border bg-background text-sm text-foreground hover:border-primary/50 hover:bg-primary/5 hover:text-primary transition-all duration-200\"\n >\n {f.label}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Skeletons ────────────────────────────────────────────────────────────────\n\nfunction HeroCardSkeleton() {\n return (\n <div className=\"rounded-2xl border border-border bg-card overflow-hidden animate-pulse h-full\">\n <div className=\"h-44 sm:h-52 bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-5 bg-muted rounded w-1/2\" />\n <div className=\"h-3 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-5/6\" />\n <div className=\"h-5 bg-muted rounded w-16 mt-2\" />\n </div>\n </div>\n );\n}\n\nfunction GridCardSkeleton() {\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 h-36 animate-pulse\">\n <div className=\"flex gap-3 mb-3\">\n <div className=\"w-12 h-12 rounded-lg bg-muted flex-shrink-0\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-3 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-1/2\" />\n </div>\n </div>\n <div className=\"h-3 bg-muted rounded w-full mb-2\" />\n <div className=\"h-3 bg-muted rounded w-5/6\" />\n </div>\n );\n}\n\nfunction ScrollCardSkeleton() {\n return (\n <div className=\"flex-shrink-0 w-56 rounded-xl border border-border bg-card p-4 h-36 animate-pulse\">\n <div className=\"flex gap-3 mb-3\">\n <div className=\"w-12 h-12 rounded-lg bg-muted flex-shrink-0\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-3 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-1/2\" />\n </div>\n </div>\n <div className=\"h-3 bg-muted rounded w-full mb-2\" />\n <div className=\"h-3 bg-muted rounded w-5/6\" />\n </div>\n );\n}\n\n// ─── StoreHomePage ────────────────────────────────────────────────────────────\n\nexport interface StoreHomePageProps extends StorePageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n browsePath?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\nexport function StoreHomePage({\n compatibleWith,\n appLoginUrl,\n onNavigate,\n terminology,\n productName,\n heroTitle,\n heroSubtitle,\n browsePath = \"/store/browse\",\n seoTitle,\n seoDescription,\n seoKeywords,\n}: StoreHomePageProps) {\n const client = useWebSDK();\n const [grouped, setGrouped] = useState<GroupedStoreProducts | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n async function load() {\n setLoading(true);\n try {\n const res = await client.query<HomeGroupedResponse>(\n HOME_GROUPED_PRODUCTS_QUERY,\n { compatibleWith: compatibleWith ?? null },\n );\n if (cancelled) return;\n if (res.errors?.length) throw new Error(res.errors[0]!.message);\n if (!res.data?.homeGroupedProducts) throw new Error(\"No data\");\n setGrouped(res.data.homeGroupedProducts);\n setError(null);\n } catch {\n if (!cancelled) setError(\"Failed to load store. Please try again.\");\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n load();\n return () => {\n cancelled = true;\n };\n }, [client, compatibleWith]);\n\n function navigate(path: string) {\n if (onNavigate) {\n onNavigate(path);\n return;\n }\n window.location.href = path;\n }\n\n function handleProductClick(product: { slug: string }) {\n navigate(`/store/${product.slug}`);\n }\n\n // Deduplicate so the same item never appears in two sections\n const deduped = grouped\n ? dedupAcross([grouped.featured, grouped.mostDownloaded, grouped.freeItems])\n : [[], [], []];\n const featuredItems: StoreProduct[] = deduped[0] ?? [];\n const popularItems: StoreProduct[] = deduped[1] ?? [];\n const freeItems: StoreProduct[] = deduped[2] ?? [];\n\n // A product whose catalogue has no published items yet (common pre-launch)\n // gets a purpose-built empty state instead of a page of dangling headings.\n const hasNoItems =\n !loading &&\n !error &&\n featuredItems.length === 0 &&\n popularItems.length === 0 &&\n freeItems.length === 0;\n\n const resolvedTitle =\n heroTitle ?? `${productName ? `${productName} ` : \"\"}Store`;\n const resolvedSubtitle =\n heroSubtitle ??\n \"Discover workflows, nodes, integrations, and templates built by the community.\";\n\n const typeFilters = terminology?.typeFilters ?? DEFAULT_TYPE_FILTERS;\n const searchPlaceholder =\n terminology?.searchPlaceholder ?? \"Search nodes, workflows, templates…\";\n const emptyStateDescription =\n terminology?.emptyStateDescription ??\n \"As the community ships workflows, templates, and integrations, they will show up right here.\";\n const publisherCtaDescription =\n terminology?.publisherCtaDescription ??\n `Share your workflows, nodes, and integrations with ${\n productName ? \"the \" : \"\"\n }community. Earn from your work or contribute for free.`;\n\n return (\n <div className=\"w-full\">\n <PageHead\n title={seoTitle ?? `Store${productName ? ` – ${productName}` : \"\"}`}\n description={seoDescription ?? resolvedSubtitle}\n keywords={seoKeywords}\n productName={productName}\n />\n\n {/* ── Hero ─────────────────────────────────────────────────────────── */}\n <section className=\"relative overflow-hidden pt-14 pb-12 sm:pt-20 sm:pb-16\">\n {/* Background layers */}\n <div\n className=\"absolute inset-0 bg-gradient-to-b from-background via-primary/[0.06] to-background pointer-events-none\"\n aria-hidden=\"true\"\n />\n <svg\n className=\"absolute inset-0 w-full h-full opacity-[0.035] pointer-events-none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <pattern\n id=\"store-home-grid\"\n width=\"40\"\n height=\"40\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 40 0 L 0 0 0 40\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#store-home-grid)\" />\n </svg>\n {/* Glow blobs */}\n <div\n className=\"absolute -top-16 left-1/3 w-80 h-80 rounded-full bg-primary/10 blur-3xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n <div\n className=\"absolute top-8 right-1/4 w-56 h-56 rounded-full bg-primary/8 blur-2xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center\">\n {/* Badge chip */}\n <div className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full border border-primary/30 bg-primary/10 text-xs font-semibold text-primary mb-5\">\n <span\n className=\"w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0\"\n aria-hidden=\"true\"\n />\n Community Marketplace\n </div>\n\n <h1 className=\"text-4xl sm:text-5xl md:text-6xl font-extrabold tracking-tight text-foreground mb-4 leading-[1.08]\">\n {resolvedTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed\">\n {resolvedSubtitle}\n </p>\n\n {/* Search */}\n <form\n className=\"max-w-xl mx-auto flex gap-2 mb-7\"\n onSubmit={(e) => {\n e.preventDefault();\n const q = new FormData(e.currentTarget).get(\"q\") as string;\n navigate(\n q.trim()\n ? `${browsePath}?q=${encodeURIComponent(q.trim())}`\n : browsePath,\n );\n }}\n >\n <input\n name=\"q\"\n type=\"search\"\n placeholder={searchPlaceholder}\n className=\"flex-1 h-12 rounded-xl border border-border bg-background px-4 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/40 shadow-sm\"\n />\n <button\n type=\"submit\"\n className=\"h-12 px-6 rounded-xl bg-primary text-primary-foreground text-sm font-semibold hover:opacity-90 transition-opacity shadow-sm\"\n >\n Search\n </button>\n </form>\n\n {/* Type quick-filters */}\n <TypeFilters\n browsePath={browsePath}\n onNavigate={navigate}\n typeFilters={typeFilters}\n />\n </div>\n </section>\n\n {/* ── Main content ─────────────────────────────────────────────────── */}\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pb-20 space-y-14 pt-4\">\n {/* Featured — spotlight hero + 2×2 grid. Only rendered when there is\n something to feature (or we are still loading / showing an error),\n so the heading never dangles above empty space. */}\n {(loading || error || featuredItems.length > 0) && (\n <section>\n <SectionHead\n title=\"Featured\"\n hint=\"Hand-picked highlights from the community\"\n browseHref={`${browsePath}?featured=true`}\n onNavigate={navigate}\n />\n {loading ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_2fr] gap-4 items-start\">\n <HeroCardSkeleton />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {[...Array(4)].map((_, i) => (\n <GridCardSkeleton key={i} />\n ))}\n </div>\n </div>\n ) : error ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-muted-foreground mb-4\">{error}</p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"text-sm text-primary hover:underline\"\n >\n Retry\n </button>\n </div>\n ) : featuredItems.length > 0 ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_2fr] gap-4 items-start\">\n {/* Spotlight hero card */}\n <FeaturedHeroCard\n product={featuredItems[0]!}\n onNavigate={navigate}\n />\n {/* 2×2 grid of remaining featured */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {featuredItems.slice(1, 5).map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n onClick={() => handleProductClick(product)}\n />\n ))}\n </div>\n </div>\n ) : null}\n </section>\n )}\n\n {/* Most Popular — horizontal scroll row */}\n {(loading || popularItems.length > 0) && (\n <section>\n <SectionHead\n title=\"Most Popular\"\n hint=\"Top downloads across the community\"\n browseHref={`${browsePath}?sortBy=DOWNLOADS`}\n onNavigate={navigate}\n />\n {loading ? (\n <div className=\"flex gap-3 overflow-hidden\">\n {[...Array(5)].map((_, i) => (\n <ScrollCardSkeleton key={i} />\n ))}\n </div>\n ) : (\n <ScrollRow\n products={popularItems}\n onProductClick={handleProductClick}\n />\n )}\n </section>\n )}\n\n {/* Free to Use — 3-col grid, max 6 items */}\n {(loading || freeItems.length > 0) && (\n <section>\n <SectionHead\n title=\"Free to Use\"\n hint=\"Zero cost, full power — community-contributed freebies\"\n browseHref={`${browsePath}?pricingModel=FREE`}\n onNavigate={navigate}\n />\n {loading ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[...Array(6)].map((_, i) => (\n <GridCardSkeleton key={i} />\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {freeItems.slice(0, 6).map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n onClick={() => handleProductClick(product)}\n />\n ))}\n </div>\n )}\n </section>\n )}\n\n {/* Nothing published yet — a warm, honest empty state rather than a\n page of empty section headings. */}\n {hasNoItems && (\n <section\n data-store=\"empty-state\"\n className=\"rounded-2xl border border-border bg-card/50 px-6 py-14 sm:py-16 text-center\"\n >\n <div\n className=\"mx-auto mb-5 flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10\"\n aria-hidden=\"true\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"h-7 w-7 text-primary\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.75 9h16.5M4.5 9l1.2 9.3a1.5 1.5 0 0 0 1.49 1.2h9.62a1.5 1.5 0 0 0 1.49-1.2L19.5 9M8.25 9V6.75a3.75 3.75 0 0 1 7.5 0V9\"\n />\n </svg>\n </div>\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-2\">\n The {productName ?? \"store\"} catalogue is just getting started\n </h2>\n <p className=\"text-sm sm:text-base text-muted-foreground max-w-xl mx-auto mb-7\">\n No items have been published for {productName ?? \"this product\"}{\" \"}\n yet. {emptyStateDescription}\n </p>\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(browsePath)}\n className=\"inline-flex items-center gap-2 rounded-xl bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition-colors hover:bg-primary/90\"\n >\n Browse the full store\n </button>\n <a\n href={appLoginUrl}\n className=\"inline-flex items-center gap-2 rounded-xl border border-border px-5 py-2.5 text-sm font-semibold text-foreground transition-colors hover:border-primary/40 hover:text-primary\"\n >\n Become a publisher\n </a>\n </div>\n </section>\n )}\n </div>\n\n {/* ── Submit CTA ───────────────────────────────────────────────────── */}\n <section className=\"relative overflow-hidden border-t border-border\">\n <div\n className=\"absolute inset-0 bg-gradient-to-br from-primary/8 via-background to-primary/5 pointer-events-none\"\n aria-hidden=\"true\"\n />\n {/* Glow */}\n <div\n className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-80 h-40 rounded-full bg-primary/12 blur-3xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative max-w-2xl mx-auto px-4 py-16 text-center\">\n <div className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full border border-primary/30 bg-primary/10 text-xs font-semibold text-primary mb-5\">\n <span\n className=\"w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0\"\n aria-hidden=\"true\"\n />\n Become a publisher\n </div>\n <h2 className=\"text-2xl sm:text-3xl font-bold text-foreground mb-3\">\n Built something useful?\n </h2>\n <p className=\"text-muted-foreground mb-8 max-w-lg mx-auto leading-relaxed\">\n {publisherCtaDescription}\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <a\n href={appLoginUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center justify-center h-11 px-7 rounded-lg bg-primary text-primary-foreground text-sm font-semibold hover:opacity-90 transition-opacity\"\n >\n Submit to Store\n </a>\n <button\n type=\"button\"\n onClick={() => navigate(browsePath)}\n className=\"inline-flex items-center justify-center h-11 px-7 rounded-lg border border-border bg-background text-sm font-medium text-foreground hover:border-primary/40 hover:bg-primary/5 transition-all\"\n >\n Browse the store\n </button>\n </div>\n </div>\n </section>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { ProductCard } from \"./product-card\";\nimport { BROWSE_STORE_QUERY, CATEGORIES_QUERY } from \"./queries\";\nimport { useWebSDK } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type {\n BrowseStoreResult,\n ProductCategory,\n StorePageProps,\n StoreFacet,\n StoreTypeFilter,\n} from \"./types\";\n\ninterface BrowseResponse {\n browseStore: BrowseStoreResult;\n}\n\ninterface CategoriesResponse {\n categories: ProductCategory[];\n}\n\n// ─── helpers ─────────────────────────────────────────────────────────────────\n\nconst SORT_OPTIONS = [\n { value: \"RELEVANCE\", label: \"Relevance\" },\n { value: \"NEWEST\", label: \"Newest\" },\n { value: \"DOWNLOADS\", label: \"Most Downloaded\" },\n { value: \"RATING\", label: \"Top Rated\" },\n { value: \"PRICE_LOW\", label: \"Price: Low to High\" },\n { value: \"PRICE_HIGH\", label: \"Price: High to Low\" },\n { value: \"NAME_ASC\", label: \"Name A–Z\" },\n];\n\nconst DEFAULT_TYPE_OPTIONS: StoreTypeFilter[] = [\n { type: \"APP\", label: \"Apps\" },\n { type: \"NODE\", label: \"Nodes\" },\n { type: \"WORKFLOW\", label: \"Workflows\" },\n { type: \"TEMPLATE\", label: \"Templates\" },\n { type: \"INTEGRATION\", label: \"Integrations\" },\n { type: \"EXTENSION\", label: \"Extensions\" },\n { type: \"THEME\", label: \"Themes\" },\n];\n\nfunction buildTypeOptions(typeFilters: StoreTypeFilter[]) {\n return [{ type: \"\", label: \"All types\" }, ...typeFilters];\n}\n\nconst PRICING_OPTIONS = [\n { value: \"\", label: \"All pricing\" },\n { value: \"FREE\", label: \"Free\" },\n { value: \"ONE_TIME\", label: \"Paid (one-time)\" },\n { value: \"SUBSCRIPTION\", label: \"Subscription\" },\n];\n\nfunction parseUrlParams(): {\n q: string;\n type: string;\n pricingModel: string;\n category: string;\n sortBy: string;\n featured: boolean;\n} {\n if (typeof window === \"undefined\")\n return {\n q: \"\",\n type: \"\",\n pricingModel: \"\",\n category: \"\",\n sortBy: \"RELEVANCE\",\n featured: false,\n };\n\n const p = new URLSearchParams(window.location.search);\n return {\n q: p.get(\"q\") ?? \"\",\n type: p.get(\"type\") ?? \"\",\n pricingModel: p.get(\"pricingModel\") ?? \"\",\n category: p.get(\"category\") ?? \"\",\n sortBy: p.get(\"sortBy\") ?? (p.get(\"q\") ? \"RELEVANCE\" : \"NEWEST\"),\n featured: p.get(\"featured\") === \"true\",\n };\n}\n\n// ─── FacetList ────────────────────────────────────────────────────────────────\n\nfunction FacetList({\n title,\n facets,\n selected,\n onSelect,\n}: {\n title: string;\n facets: StoreFacet[];\n selected: string;\n onSelect: (v: string) => void;\n}) {\n if (facets.length === 0) return null;\n return (\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n {title}\n </p>\n <ul className=\"space-y-1\">\n {facets.map((f) => (\n <li key={f.value}>\n <button\n type=\"button\"\n onClick={() => onSelect(selected === f.value ? \"\" : f.value)}\n className={`w-full text-left text-sm px-2 py-1 rounded flex items-center justify-between gap-2 transition-colors ${\n selected === f.value\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n <span className=\"truncate\">{f.value}</span>\n <span className=\"text-xs opacity-60 flex-shrink-0\">\n {f.count}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n// ─── StoreBrowsePage ──────────────────────────────────────────────────────────\n\nexport interface StoreBrowsePageProps extends StorePageProps {\n productName?: string;\n seoTitle?: string;\n seoDescription?: string;\n}\n\nexport function StoreBrowsePage({\n compatibleWith,\n onNavigate,\n terminology,\n productName,\n seoTitle,\n seoDescription,\n}: StoreBrowsePageProps) {\n const client = useWebSDK();\n\n const typeFilters = terminology?.typeFilters ?? DEFAULT_TYPE_OPTIONS;\n const typeOptions = buildTypeOptions(typeFilters);\n const browseDescription =\n terminology?.browseDescription ??\n \"Browse all apps, workflows, nodes, and templates.\";\n\n const initial = parseUrlParams();\n const [search, setSearch] = useState(initial.q);\n const [inputValue, setInputValue] = useState(initial.q);\n const [type, setType] = useState(initial.type);\n const [pricingModel, setPricingModel] = useState(initial.pricingModel);\n const [category, setCategory] = useState(initial.category);\n const [sortBy, setSortBy] = useState(initial.sortBy);\n const [featured, setFeatured] = useState(initial.featured);\n const [offset, setOffset] = useState(0);\n\n const [result, setResult] = useState<BrowseStoreResult | null>(null);\n const [allProducts, setAllProducts] = useState<BrowseStoreResult[\"products\"]>(\n [],\n );\n const [categories, setCategories] = useState<ProductCategory[]>([]);\n const [loading, setLoading] = useState(true);\n const [loadingMore, setLoadingMore] = useState(false);\n const [filtersOpen, setFiltersOpen] = useState(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const PAGE_SIZE = 24;\n\n // Load categories once\n useEffect(() => {\n client\n .query<CategoriesResponse>(CATEGORIES_QUERY, {})\n .then((r) => {\n if (r.data?.categories) setCategories(r.data.categories);\n })\n .catch(() => {});\n }, [client]);\n\n // Load products whenever filters change (reset to page 0)\n useEffect(() => {\n let cancelled = false;\n setOffset(0);\n setLoading(true);\n setAllProducts([]);\n\n client\n .query<BrowseResponse>(BROWSE_STORE_QUERY, {\n input: {\n filter: {\n search: search || undefined,\n type: type || undefined,\n pricingModel: pricingModel || undefined,\n category: category || undefined,\n compatibleWith: compatibleWith ?? undefined,\n featured: featured || undefined,\n },\n sortBy,\n pagination: { limit: PAGE_SIZE, offset: 0 },\n },\n })\n .then((r) => {\n if (cancelled) return;\n if (r.data?.browseStore) {\n setResult(r.data.browseStore);\n setAllProducts(r.data.browseStore.products);\n }\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n client,\n search,\n type,\n pricingModel,\n category,\n sortBy,\n compatibleWith,\n featured,\n ]);\n\n function loadMore() {\n const nextOffset = offset + PAGE_SIZE;\n setLoadingMore(true);\n\n client\n .query<BrowseResponse>(BROWSE_STORE_QUERY, {\n input: {\n filter: {\n search: search || undefined,\n type: type || undefined,\n pricingModel: pricingModel || undefined,\n category: category || undefined,\n compatibleWith: compatibleWith ?? undefined,\n featured: featured || undefined,\n },\n sortBy,\n pagination: { limit: PAGE_SIZE, offset: nextOffset },\n },\n })\n .then((r) => {\n if (r.data?.browseStore) {\n setResult(r.data.browseStore);\n setAllProducts((prev) => [...prev, ...r.data!.browseStore.products]);\n setOffset(nextOffset);\n }\n })\n .catch(() => {})\n .finally(() => setLoadingMore(false));\n }\n\n function navigate(path: string) {\n if (onNavigate) {\n onNavigate(path);\n return;\n }\n window.location.href = path;\n }\n\n function handleSearchSubmit(e: React.FormEvent) {\n e.preventDefault();\n setSearch(inputValue);\n setSortBy(inputValue ? \"RELEVANCE\" : \"NEWEST\");\n }\n\n function resetFilters() {\n setSearch(\"\");\n setInputValue(\"\");\n setType(\"\");\n setPricingModel(\"\");\n setCategory(\"\");\n setSortBy(\"NEWEST\");\n setFeatured(false);\n searchRef.current?.focus();\n }\n\n const hasActiveFilters = !!(\n search ||\n type ||\n pricingModel ||\n category ||\n featured\n );\n const facetTypes = result?.facets?.types ?? [];\n const facetCategories = result?.facets?.categories ?? [];\n\n const sidebarContent = (\n <div className=\"space-y-6\">\n {/* Type */}\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n Type\n </p>\n <div className=\"space-y-1\">\n {typeOptions.map((opt) => (\n <button\n key={opt.type}\n type=\"button\"\n onClick={() => setType(opt.type)}\n className={`w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${\n type === opt.type\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Pricing */}\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n Pricing\n </p>\n <div className=\"space-y-1\">\n {PRICING_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => setPricingModel(opt.value)}\n className={`w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${\n pricingModel === opt.value\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Category from server facets or loaded categories */}\n {(facetCategories.length > 0 || categories.length > 0) && (\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2\">\n Category\n </p>\n <div className=\"space-y-1\">\n <button\n type=\"button\"\n onClick={() => setCategory(\"\")}\n className={`w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${\n !category\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n All categories\n </button>\n {(facetCategories.length > 0\n ? facetCategories\n : categories\n .slice(0, 12)\n .map((c) => ({ value: c.slug, count: 0 }))\n ).map((f) => {\n const cat = categories.find((c) => c.slug === f.value);\n return (\n <button\n key={f.value}\n type=\"button\"\n onClick={() =>\n setCategory(category === f.value ? \"\" : f.value)\n }\n className={`w-full text-left text-sm px-2 py-1.5 rounded flex items-center justify-between gap-2 transition-colors ${\n category === f.value\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n }`}\n >\n <span className=\"truncate\">{cat?.name ?? f.value}</span>\n {f.count > 0 && (\n <span className=\"text-xs opacity-60 flex-shrink-0\">\n {f.count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {facetTypes.length > 0 && (\n <FacetList\n title=\"Available types\"\n facets={facetTypes}\n selected={type}\n onSelect={setType}\n />\n )}\n\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={resetFilters}\n className=\"text-sm text-muted-foreground hover:text-foreground underline\"\n >\n Clear all filters\n </button>\n )}\n </div>\n );\n\n return (\n <div className=\"w-full\">\n <PageHead\n title={\n seoTitle ?? `Browse Store${productName ? ` – ${productName}` : \"\"}`\n }\n description={seoDescription ?? browseDescription}\n productName={productName}\n />\n\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Top bar */}\n <div className=\"flex flex-col sm:flex-row gap-3 mb-6\">\n <form className=\"flex-1 flex gap-2\" onSubmit={handleSearchSubmit}>\n <input\n ref={searchRef}\n type=\"search\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Search…\"\n className=\"flex-1 h-10 rounded-lg border border-border bg-background px-4 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/50\"\n />\n <button\n type=\"submit\"\n className=\"h-10 px-5 rounded-lg bg-primary text-primary-foreground text-sm font-medium hover:opacity-90 transition-opacity\"\n >\n Search\n </button>\n </form>\n <div className=\"flex gap-2\">\n {/* Sort */}\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"h-10 rounded-lg border border-border bg-background px-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50\"\n >\n {SORT_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n {/* Mobile filter toggle */}\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(!filtersOpen)}\n className=\"lg:hidden h-10 px-4 rounded-lg border border-border bg-background text-sm text-foreground hover:bg-muted/50 transition-colors\"\n >\n Filters{\" \"}\n {hasActiveFilters && <span className=\"text-primary\">•</span>}\n </button>\n </div>\n </div>\n\n {/* Mobile filters panel */}\n {filtersOpen && (\n <div className=\"lg:hidden mb-6 p-4 border border-border rounded-xl bg-card\">\n {sidebarContent}\n </div>\n )}\n\n <div className=\"flex gap-8\">\n {/* Desktop sidebar */}\n <aside className=\"hidden lg:block w-52 flex-shrink-0\">\n {sidebarContent}\n </aside>\n\n {/* Main grid */}\n <div className=\"flex-1 min-w-0\">\n {/* Count + active filter chips */}\n <div className=\"flex items-center gap-2 mb-4 flex-wrap\">\n <span className=\"text-sm text-muted-foreground\">\n {loading ? \"Loading…\" : `${result?.totalCount ?? 0} results`}\n </span>\n {hasActiveFilters && (\n <div className=\"flex flex-wrap gap-1.5\">\n {search && (\n <Chip\n label={`\"${search}\"`}\n onRemove={() => {\n setSearch(\"\");\n setInputValue(\"\");\n }}\n />\n )}\n {type && <Chip label={type} onRemove={() => setType(\"\")} />}\n {pricingModel && (\n <Chip\n label={pricingModel}\n onRemove={() => setPricingModel(\"\")}\n />\n )}\n {category && (\n <Chip label={category} onRemove={() => setCategory(\"\")} />\n )}\n {featured && (\n <Chip\n label=\"Featured\"\n onRemove={() => setFeatured(false)}\n />\n )}\n </div>\n )}\n </div>\n\n {loading ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-4\">\n {[...Array(12)].map((_, i) => (\n <div\n key={i}\n className=\"bg-card border border-border rounded-xl p-4 h-36 animate-pulse\"\n />\n ))}\n </div>\n ) : allProducts.length === 0 ? (\n <div className=\"py-20 text-center\">\n <p className=\"text-muted-foreground mb-4\">\n No results found\n {search ? ` for \"${search}\"` : \"\"}.\n </p>\n <button\n type=\"button\"\n onClick={resetFilters}\n className=\"text-sm text-primary hover:underline\"\n >\n Clear filters\n </button>\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-4\">\n {allProducts.map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n onClick={() => navigate(`/store/${product.slug}`)}\n />\n ))}\n </div>\n\n {result?.hasMore && (\n <div className=\"mt-8 text-center\">\n <button\n type=\"button\"\n onClick={loadMore}\n disabled={loadingMore}\n className=\"h-10 px-8 rounded-lg border border-border text-sm font-medium text-foreground hover:bg-muted/50 transition-colors disabled:opacity-50\"\n >\n {loadingMore ? \"Loading…\" : \"Load more\"}\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction Chip({ label, onRemove }: { label: string; onRemove: () => void }) {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs bg-primary/10 text-primary rounded-full px-2.5 py-0.5 font-medium\">\n {label}\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={`Remove ${label}`}\n className=\"hover:opacity-70\"\n >\n ×\n </button>\n </span>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\n\n/**\n * WorkflowEmbed — iframe wrapper around the FluidGrids public read-only\n * workflow viewer (`{app}/embed/workflow`), n8n-demo style.\n *\n * Any website can use this: the viewer route is unauthenticated and the\n * workflow graph is fetched by the iframe itself from the public store\n * gateway using the product id. A \"Click to explore\" overlay keeps page\n * scrolling pleasant until the visitor opts into pan/zoom.\n */\nexport interface WorkflowEmbedProps {\n /** App shell origin serving /embed/workflow (e.g. \"https://app.fluidgrids.com\") */\n appUrl: string;\n /** WORKFLOW store product id to preview */\n productId: string;\n /** Force a theme; defaults to the host page's current light/dark mode */\n theme?: \"light\" | \"dark\";\n /** Gate interactivity behind a click (default true) */\n clickToInteract?: boolean;\n /** Hide the \"Use this template\" CTA inside the viewer */\n hideCta?: boolean;\n className?: string;\n /** Called when the viewer reports it could not load the workflow */\n onError?: (message: string) => void;\n}\n\ntype EmbedStatus = \"loading\" | \"loaded\" | \"error\";\n\nfunction detectTheme(): \"light\" | \"dark\" {\n if (typeof document === \"undefined\") return \"light\";\n const root = document.documentElement;\n return root.classList.contains(\"dark\") ||\n root.getAttribute(\"data-theme\") === \"dark\"\n ? \"dark\"\n : \"light\";\n}\n\nexport function WorkflowEmbed({\n appUrl,\n productId,\n theme,\n clickToInteract = true,\n hideCta = false,\n className,\n onError,\n}: WorkflowEmbedProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [status, setStatus] = useState<EmbedStatus>(\"loading\");\n const [interactive, setInteractive] = useState(!clickToInteract);\n // Snapshot the detected theme once; a mid-session host theme flip only\n // affects subsequently mounted embeds, which is acceptable for a preview.\n const resolvedTheme = useMemo(() => theme ?? detectTheme(), [theme]);\n\n const src = useMemo(() => {\n const base = appUrl.replace(/\\/+$/, \"\");\n const params = new URLSearchParams({\n productId,\n theme: resolvedTheme,\n });\n if (hideCta) params.set(\"cta\", \"false\");\n return `${base}/embed/workflow?${params.toString()}`;\n }, [appUrl, productId, resolvedTheme, hideCta]);\n\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const data = event.data as\n | { type?: string; message?: string }\n | undefined;\n if (data?.type === \"fluidgrids:embed:loaded\") setStatus(\"loaded\");\n if (data?.type === \"fluidgrids:embed:error\") {\n setStatus(\"error\");\n onError?.(data.message ?? \"Failed to load workflow preview\");\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [onError]);\n\n if (status === \"error\") return null;\n\n return (\n <div\n className={`relative w-full overflow-hidden rounded-xl border border-border bg-muted ${className ?? \"\"}`}\n style={{ aspectRatio: \"16 / 9\" }}\n >\n {status === \"loading\" && (\n <div\n className=\"absolute inset-0 animate-pulse bg-muted\"\n aria-hidden=\"true\"\n />\n )}\n <iframe\n ref={iframeRef}\n src={src}\n title=\"Workflow preview\"\n loading=\"lazy\"\n className=\"h-full w-full border-0\"\n style={interactive ? undefined : { pointerEvents: \"none\" }}\n />\n {clickToInteract && !interactive && status === \"loaded\" && (\n <button\n type=\"button\"\n onClick={() => setInteractive(true)}\n className=\"absolute inset-0 flex items-end justify-center bg-transparent pb-4\"\n aria-label=\"Click to explore the workflow\"\n >\n <span className=\"rounded-full border border-border bg-background/90 px-4 py-1.5 text-xs font-medium text-foreground shadow-sm backdrop-blur transition-colors hover:bg-background\">\n Click to explore\n </span>\n </button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport {\n ProductCard,\n StarRating,\n TypeBadge,\n formatDownloads,\n formatPrice,\n} from \"./product-card\";\nimport { STORE_PRODUCT_DETAILS_QUERY } from \"./queries\";\nimport { WorkflowEmbed } from \"./workflow-embed\";\nimport { useWebSDK } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { StorePageProps, StoreProductDetails } from \"./types\";\n\ninterface DetailsResponse {\n storeProductDetails: StoreProductDetails;\n}\n\n// ─── Self-contained animation keyframes ──────────────────────────────────────\n// Prefixed `sd-` so they don't collide with anything in the host website's CSS.\n\nconst ANIM_STYLES = `\n@keyframes sdFadeUp {\n from { opacity: 0; transform: translateY(16px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes sdFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes sdScaleIn {\n from { opacity: 0; transform: scale(0.94); }\n to { opacity: 1; transform: scale(1); }\n}\n@keyframes sdGlowPulse {\n 0%, 100% { opacity: 0.35; }\n 50% { opacity: 0.65; }\n}\n@media (prefers-reduced-motion: reduce) {\n .sd-fu, .sd-fi, .sd-si { animation: none !important; opacity: 1 !important; transform: none !important; }\n .sd-gp { animation: none !important; }\n}\n.sd-fu { animation: sdFadeUp 0.55s cubic-bezier(0.16,1,0.3,1) both; }\n.sd-fi { animation: sdFadeIn 0.45s ease-out both; }\n.sd-si { animation: sdScaleIn 0.45s cubic-bezier(0.16,1,0.3,1) both; }\n.sd-gp { animation: sdGlowPulse 3s ease-in-out infinite; }\n.sd-d1 { animation-delay: 60ms; }\n.sd-d2 { animation-delay: 120ms; }\n.sd-d3 { animation-delay: 180ms; }\n.sd-d4 { animation-delay: 240ms; }\n.sd-d5 { animation-delay: 320ms; }\n.sd-d6 { animation-delay: 400ms; }\n`;\n\n// ─── RatingBar ────────────────────────────────────────────────────────────────\n\nfunction RatingBar({\n label,\n count,\n total,\n}: {\n label: string;\n count: number;\n total: number;\n}) {\n const pct = total > 0 ? Math.round((count / total) * 100) : 0;\n return (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"w-12 text-right shrink-0\">{label}</span>\n <div className=\"flex-1 h-1.5 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-amber-400 rounded-full transition-all duration-700\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <span className=\"w-6 shrink-0\">{count}</span>\n </div>\n );\n}\n\n// ─── IconBlock ────────────────────────────────────────────────────────────────\n\nfunction IconBlock({ src }: { src?: string | null; name: string }) {\n return (\n <div className=\"relative flex-shrink-0\">\n {/* Glow ring */}\n <div\n className=\"sd-gp absolute -inset-1.5 rounded-2xl bg-primary/30 blur-md pointer-events-none\"\n aria-hidden=\"true\"\n />\n <div className=\"sd-si relative w-20 h-20 rounded-2xl overflow-hidden shadow-lg ring-1 ring-border\">\n {src ? (\n <img\n src={src}\n alt=\"\"\n aria-hidden\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full bg-gradient-to-br from-primary/25 to-primary/8 flex items-center justify-center\">\n <svg\n viewBox=\"0 0 40 40\"\n className=\"w-10 h-10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <polygon\n points=\"20,4 34,11 20,18 6,11\"\n className=\"fill-primary/40\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"6,11 20,18 20,34 6,27\"\n className=\"fill-primary/20\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n <polygon\n points=\"34,11 20,18 20,34 34,27\"\n className=\"fill-primary/30\"\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeOpacity=\"0.4\"\n />\n </svg>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ─── StoreProductDetailPage ───────────────────────────────────────────────────\n\nexport interface StoreProductDetailPageProps extends StorePageProps {\n slug?: string;\n id?: string;\n productName?: string;\n}\n\nexport function StoreProductDetailPage({\n slug,\n id,\n appLoginUrl,\n onNavigate,\n productName,\n}: StoreProductDetailPageProps) {\n const client = useWebSDK();\n const [details, setDetails] = useState<StoreProductDetails | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeScreenshot, setActiveScreenshot] = useState(0);\n // Key bumped on each screenshot change so the img remounts → re-runs sdFadeIn\n const [screenshotKey, setScreenshotKey] = useState(0);\n // WORKFLOW products get a live read-only canvas preview; if the viewer\n // reports an error (e.g. template without a graph) we fall back to\n // screenshots silently.\n const [embedFailed, setEmbedFailed] = useState(false);\n\n useEffect(() => {\n if (!slug && !id) {\n setError(\"Product not found.\");\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n client\n .query<DetailsResponse>(STORE_PRODUCT_DETAILS_QUERY, {\n input: { slug: slug ?? undefined, id: id ?? undefined },\n })\n .then((r) => {\n if (cancelled) return;\n if (r.errors?.length) throw new Error(r.errors[0]!.message);\n if (!r.data?.storeProductDetails) throw new Error(\"Not found\");\n setDetails(r.data.storeProductDetails);\n })\n .catch(() => {\n if (!cancelled) setError(\"Product not found or unavailable.\");\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [client, slug, id]);\n\n function navigate(path: string) {\n if (onNavigate) {\n onNavigate(path);\n return;\n }\n window.location.href = path;\n }\n\n function switchScreenshot(i: number) {\n setActiveScreenshot(i);\n setScreenshotKey((k) => k + 1);\n }\n\n if (loading) {\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12 animate-pulse\">\n <div className=\"h-4 bg-muted rounded w-40 mb-8\" />\n <div className=\"flex gap-6 mb-8\">\n <div className=\"w-20 h-20 rounded-2xl bg-muted flex-shrink-0\" />\n <div className=\"flex-1 space-y-3 pt-1\">\n <div className=\"h-6 bg-muted rounded w-1/3\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n </div>\n </div>\n <div className=\"h-56 bg-muted rounded-xl mb-8\" />\n <div className=\"space-y-3\">\n {[...Array(5)].map((_, i) => (\n <div key={i} className=\"h-4 bg-muted rounded\" />\n ))}\n </div>\n </div>\n );\n }\n\n if (error || !details) {\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 text-center\">\n <p className=\"text-muted-foreground mb-4\">\n {error ?? \"Product not found.\"}\n </p>\n <button\n type=\"button\"\n onClick={() => navigate(\"/store\")}\n className=\"text-sm text-primary hover:underline\"\n >\n Back to Store\n </button>\n </div>\n );\n }\n\n const {\n product,\n publisher,\n reviews,\n reviewsCount,\n relatedProducts,\n ratingDistribution,\n } = details;\n const priceLabel = formatPrice(\n product.price,\n product.currency,\n product.pricingModel,\n );\n const screenshots = product.screenshots ?? [];\n const totalRatings = ratingDistribution\n ? ratingDistribution.fiveStars +\n ratingDistribution.fourStars +\n ratingDistribution.threeStars +\n ratingDistribution.twoStars +\n ratingDistribution.oneStar\n : 0;\n\n return (\n <div className=\"w-full\">\n {/* Self-contained animation styles */}\n <style dangerouslySetInnerHTML={{ __html: ANIM_STYLES }} />\n\n <PageHead\n title={`${product.name}${productName ? ` – ${productName} Store` : \" – Store\"}`}\n description={product.description ?? undefined}\n productName={productName}\n />\n\n {/* ── Hero header band ─────────────────────────────────────────────── */}\n <div className=\"relative overflow-hidden\">\n {/* Gradient background */}\n <div\n className=\"absolute inset-0 bg-gradient-to-b from-primary/[0.07] via-background to-background pointer-events-none\"\n aria-hidden=\"true\"\n />\n {/* Grid overlay */}\n <svg\n className=\"absolute inset-0 w-full h-full opacity-[0.04] pointer-events-none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <pattern\n id=\"sd-grid\"\n width=\"40\"\n height=\"40\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 40 0 L 0 0 0 40\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#sd-grid)\" />\n </svg>\n {/* Glow blob */}\n <div\n className=\"absolute -top-12 -left-12 w-72 h-72 rounded-full bg-primary/10 blur-3xl pointer-events-none\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-6 pb-8\">\n {/* Breadcrumb */}\n <nav className=\"sd-fi text-sm text-muted-foreground mb-6 flex items-center gap-1.5 flex-wrap\">\n <button\n type=\"button\"\n onClick={() => navigate(\"/store\")}\n className=\"hover:text-primary transition-colors\"\n >\n Store\n </button>\n <span aria-hidden=\"true\">›</span>\n {product.category && (\n <>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`/store/browse?category=${product.category}`)\n }\n className=\"hover:text-primary transition-colors\"\n >\n {product.category}\n </button>\n <span aria-hidden=\"true\">›</span>\n </>\n )}\n <span className=\"text-foreground font-medium\">{product.name}</span>\n </nav>\n\n {/* Product identity */}\n <div className=\"flex gap-5 items-start\">\n <IconBlock src={product.icon} name={product.name} />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"sd-fu flex items-start gap-2 flex-wrap mb-1\">\n <h1 className=\"text-2xl sm:text-3xl font-bold text-foreground leading-tight\">\n {product.name}\n </h1>\n <TypeBadge type={product.type} />\n </div>\n {product.description && (\n <p className=\"sd-fu sd-d1 text-muted-foreground text-sm mb-2 leading-relaxed\">\n {product.description}\n </p>\n )}\n <div className=\"sd-fu sd-d2 flex items-center gap-3 text-sm text-muted-foreground flex-wrap\">\n {product.rating != null && product.rating > 0 && (\n <span className=\"flex items-center gap-1\">\n <StarRating rating={product.rating} />\n <span className=\"font-semibold text-foreground\">\n {product.rating.toFixed(1)}\n </span>\n <span>({reviewsCount ?? 0})</span>\n </span>\n )}\n {product.downloads != null && (\n <span>{formatDownloads(product.downloads)} downloads</span>\n )}\n {product.authorName && <span>by {product.authorName}</span>}\n {product.license && <span>{product.license}</span>}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Main content ──────────────────────────────────────────────────── */}\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6\">\n <div className=\"grid lg:grid-cols-[1fr_300px] gap-8\">\n {/* Left column */}\n <div>\n {/* Mobile CTA */}\n <div className=\"sd-fu sd-d3 lg:hidden mb-6 p-4 rounded-xl border border-border bg-card flex items-center gap-4\">\n <div>\n <div className=\"text-2xl font-bold text-foreground\">\n {priceLabel}\n </div>\n {product.pricingModel === \"SUBSCRIPTION\" && (\n <div className=\"text-xs text-muted-foreground\">per month</div>\n )}\n </div>\n <a\n href={appLoginUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex-1 h-11 rounded-lg bg-primary text-primary-foreground text-sm font-semibold flex items-center justify-center hover:opacity-90 transition-opacity\"\n >\n {priceLabel === \"Free\"\n ? \"Install Free\"\n : `Get for ${priceLabel}`}\n </a>\n </div>\n\n {/* Interactive workflow preview (WORKFLOW products only) */}\n {product.type === \"WORKFLOW\" && !embedFailed && (\n <div className=\"sd-fu sd-d3 mb-8\">\n <WorkflowEmbed\n appUrl={appLoginUrl}\n productId={product.id}\n onError={() => setEmbedFailed(true)}\n />\n </div>\n )}\n\n {/* Screenshots */}\n {screenshots.length > 0 && (\n <div className=\"sd-fu sd-d3 mb-8\">\n <div className=\"rounded-xl overflow-hidden bg-muted aspect-video mb-3 shadow-md\">\n <img\n key={screenshotKey}\n src={screenshots[activeScreenshot]}\n alt={`Screenshot ${activeScreenshot + 1}`}\n className=\"sd-fi w-full h-full object-cover\"\n />\n </div>\n {screenshots.length > 1 && (\n <div className=\"flex gap-2 overflow-x-auto pb-1\">\n {screenshots.map((src, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => switchScreenshot(i)}\n className={`w-20 h-14 rounded-lg overflow-hidden flex-shrink-0 border-2 transition-all duration-200 ${\n i === activeScreenshot\n ? \"border-primary shadow-sm shadow-primary/20\"\n : \"border-transparent opacity-50 hover:opacity-80\"\n }`}\n >\n <img\n src={src}\n alt={`Thumbnail ${i + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* About */}\n {product.longDescription && (\n <div className=\"sd-fu sd-d4 mb-8\">\n <h2 className=\"text-lg font-bold text-foreground mb-3\">\n About\n </h2>\n <div className=\"prose prose-sm max-w-none text-muted-foreground leading-relaxed whitespace-pre-line\">\n {product.longDescription}\n </div>\n </div>\n )}\n\n {/* Publisher */}\n {publisher && (\n <div className=\"sd-fu sd-d5 mb-8 p-4 rounded-xl border border-border bg-card hover:border-primary/30 transition-colors duration-300\">\n <h2 className=\"text-sm font-semibold text-foreground mb-3\">\n Publisher\n </h2>\n <div className=\"flex items-center gap-3\">\n {publisher.logoUrl ? (\n <img\n src={publisher.logoUrl}\n alt={publisher.name}\n className=\"w-10 h-10 rounded-full object-cover\"\n />\n ) : (\n <div className=\"w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center text-primary text-sm font-bold\">\n {publisher.name.charAt(0).toUpperCase()}\n </div>\n )}\n <div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-semibold text-foreground text-sm\">\n {publisher.name}\n </span>\n {publisher.isVerified && (\n <span className=\"text-xs text-primary font-medium\">\n ✓ Verified\n </span>\n )}\n </div>\n {publisher.bio && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">\n {publisher.bio}\n </p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Reviews */}\n {(reviews?.length ?? 0) > 0 && (\n <div className=\"sd-fu sd-d5 mb-8\">\n <h2 className=\"text-lg font-bold text-foreground mb-4\">\n Reviews ({reviewsCount ?? reviews!.length})\n </h2>\n\n {ratingDistribution && totalRatings > 0 && (\n <div className=\"sd-si flex gap-6 mb-5 p-4 rounded-xl border border-border bg-card\">\n <div className=\"text-center\">\n <div className=\"text-4xl font-bold text-foreground tabular-nums\">\n {product.rating?.toFixed(1) ?? \"—\"}\n </div>\n {product.rating != null && (\n <StarRating rating={product.rating} />\n )}\n <div className=\"text-xs text-muted-foreground mt-1\">\n {totalRatings} ratings\n </div>\n </div>\n <div className=\"flex-1 space-y-1.5 pt-1\">\n <RatingBar\n label=\"5 ★\"\n count={ratingDistribution.fiveStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"4 ★\"\n count={ratingDistribution.fourStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"3 ★\"\n count={ratingDistribution.threeStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"2 ★\"\n count={ratingDistribution.twoStars}\n total={totalRatings}\n />\n <RatingBar\n label=\"1 ★\"\n count={ratingDistribution.oneStar}\n total={totalRatings}\n />\n </div>\n </div>\n )}\n\n <div className=\"space-y-3\">\n {reviews!.slice(0, 5).map((review, idx) => (\n <div\n key={review.id}\n className=\"sd-fu p-4 rounded-xl border border-border bg-card hover:border-primary/20 transition-colors duration-200\"\n style={{ animationDelay: `${(idx + 5) * 60}ms` }}\n >\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <StarRating rating={review.rating} />\n {review.verifiedPurchase && (\n <span className=\"text-xs text-emerald-500 font-medium\">\n Verified\n </span>\n )}\n </div>\n {review.title && (\n <p className=\"font-semibold text-sm text-foreground mb-1\">\n {review.title}\n </p>\n )}\n {review.comment && (\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {review.comment}\n </p>\n )}\n {review.createdAt && (\n <p className=\"text-xs text-muted-foreground mt-2\">\n {new Date(review.createdAt).toLocaleDateString(\n \"en-US\",\n {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n },\n )}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Related */}\n {(relatedProducts?.length ?? 0) > 0 && (\n <div className=\"sd-fu sd-d6\">\n <h2 className=\"text-lg font-bold text-foreground mb-4\">\n Related\n </h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {relatedProducts!.slice(0, 6).map((p) => (\n <ProductCard\n key={p.id}\n product={p}\n onClick={() => navigate(`/store/${p.slug}`)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Sticky sidebar */}\n <aside className=\"lg:sticky lg:top-24 self-start\">\n <div className=\"sd-fu sd-d4 bg-card border border-border rounded-xl p-5 space-y-4 hover:border-primary/30 transition-colors duration-300 hover:shadow-lg hover:shadow-primary/5\">\n {/* Price */}\n <div>\n <div\n className={`text-3xl font-extrabold ${priceLabel === \"Free\" ? \"text-emerald-500\" : \"text-foreground\"}`}\n >\n {priceLabel}\n </div>\n {product.pricingModel === \"SUBSCRIPTION\" && (\n <div className=\"text-xs text-muted-foreground\">per month</div>\n )}\n </div>\n\n {/* CTA */}\n <a\n href={appLoginUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-center w-full h-11 rounded-lg bg-primary text-primary-foreground text-sm font-semibold hover:opacity-90 active:scale-[0.98] transition-all duration-150\"\n >\n {priceLabel === \"Free\"\n ? \"Install Free\"\n : `Get for ${priceLabel}`}\n </a>\n <p className=\"text-xs text-muted-foreground text-center\">\n Login required to install\n </p>\n\n {/* Metadata */}\n <div className=\"border-t border-border pt-4 space-y-2 text-xs text-muted-foreground\">\n {product.type && (\n <div className=\"flex justify-between\">\n <span>Type</span>\n <span className=\"text-foreground font-medium\">\n {product.type}\n </span>\n </div>\n )}\n {product.category && (\n <div className=\"flex justify-between\">\n <span>Category</span>\n <span className=\"text-foreground font-medium\">\n {product.category}\n </span>\n </div>\n )}\n {product.license && (\n <div className=\"flex justify-between\">\n <span>License</span>\n <span className=\"text-foreground font-medium\">\n {product.license}\n </span>\n </div>\n )}\n {product.minPlatformVersion && (\n <div className=\"flex justify-between\">\n <span>Requires</span>\n <span className=\"text-foreground font-medium\">\n v{product.minPlatformVersion}+\n </span>\n </div>\n )}\n {product.downloads != null && (\n <div className=\"flex justify-between\">\n <span>Downloads</span>\n <span className=\"text-foreground font-medium\">\n {formatDownloads(product.downloads)}\n </span>\n </div>\n )}\n </div>\n\n {/* Tags */}\n {(product.tags?.length ?? 0) > 0 && (\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {product.tags!.map((tag) => (\n <span\n key={tag}\n className=\"text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </aside>\n </div>\n </div>\n </div>\n );\n}\n"]}