smart-glide-react 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/url-builder.ts","../src/hooks.ts","../src/components.tsx","../src/provider.tsx"],"names":["useState","useRef","useCallback","useEffect","jsx","forwardRef","SmartGlideImage","jsxs","Fragment","SmartGlidePicture","createContext","useContext"],"mappings":"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","file":"index.js","sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — URL Builder\n// Builds Smart Glide delivery URLs client-side (no API call needed).\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { ImageProfile, ResponsivePreset, SmartGlideOptions } from './types';\n\n/** Resolve the base URL from options or environment variables. */\nexport function resolveBaseUrl(baseUrl?: string): string {\n if (baseUrl) return baseUrl.replace(/\\/$/, '');\n\n // Next.js public env\n if (typeof process !== 'undefined') {\n const env =\n process.env.NEXT_PUBLIC_SMART_GLIDE_URL ??\n process.env.VITE_SMART_GLIDE_URL ??\n process.env.SMART_GLIDE_URL ??\n '';\n if (env) return env.replace(/\\/$/, '');\n }\n\n return '';\n}\n\n/** Resolve the delivery path prefix (default: `/img`). */\nexport function resolveDeliveryPath(deliveryPath?: string): string {\n if (deliveryPath) return '/' + deliveryPath.replace(/^\\/|\\/$/g, '');\n\n if (typeof process !== 'undefined') {\n const env = process.env.NEXT_PUBLIC_SMART_GLIDE_DELIVERY_PATH ?? '/img';\n return '/' + env.replace(/^\\/|\\/$/g, '');\n }\n\n return '/img';\n}\n\n/** Resolve the data API path prefix (default: `/img-data`). */\nexport function resolveDataPath(dataPath?: string): string {\n if (dataPath) return '/' + dataPath.replace(/^\\/|\\/$/g, '');\n\n if (typeof process !== 'undefined') {\n const env = process.env.NEXT_PUBLIC_SMART_GLIDE_DATA_PATH ?? '/img-data';\n return '/' + env.replace(/^\\/|\\/$/g, '');\n }\n\n return '/img-data';\n}\n\n/** Build a single Smart Glide delivery URL (unsigned — for preview/dev). */\nexport function buildDeliveryUrl(\n path: string,\n params: Record<string, string | number> = {},\n options: { baseUrl?: string; deliveryPath?: string } = {}\n): string {\n const base = resolveBaseUrl(options.baseUrl);\n const prefix = resolveDeliveryPath(options.deliveryPath);\n const cleanPath = path.replace(/^\\//, '');\n\n const queryParams = Object.entries(params)\n .filter(([, v]) => v !== undefined && v !== '')\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join('&');\n\n return `${base}${prefix}/${cleanPath}${queryParams ? '?' + queryParams : ''}`;\n}\n\n/** Build the JSON data API URL for a given path. */\nexport function buildDataUrl(\n path: string,\n options: SmartGlideOptions & { deliveryPath?: string; dataPath?: string }\n): string {\n const base = resolveBaseUrl(options.baseUrl);\n const prefix = resolveDataPath(options.dataPath);\n const cleanPath = path.replace(/^\\//, '');\n\n const params: Record<string, string> = {};\n\n if (options.profile) params.profile = options.profile;\n if (options.blurPlaceholder) params.blur_placeholder = '1';\n if (options.schema) params.schema = '1';\n\n // Responsive\n if (options.responsive === false) {\n params.responsive = '0';\n } else if (Array.isArray(options.responsive)) {\n params.responsive = options.responsive.join(',');\n } else if (options.responsive) {\n params.responsive = options.responsive;\n }\n\n // Extra Glide params\n if (options.params) {\n Object.entries(options.params).forEach(([k, v]) => {\n params[k] = String(v);\n });\n }\n\n const query = new URLSearchParams(params).toString();\n return `${base}${prefix}/${cleanPath}${query ? '?' + query : ''}`;\n}\n\n/** Resolve a named or custom responsive set to an array of widths. */\nconst NAMED_SETS: Record<string, number[]> = {\n hero: [640, 960, 1280, 1600, 1920],\n thumbnails: [240, 320, 480],\n square: [320, 480, 640],\n portrait: [480, 768, 1024],\n hd: [960, 1280, 1600],\n fhd: [1280, 1600, 1920, 2560],\n retina: [640, 960, 1280, 1920, 2560],\n};\n\nexport function resolveWidths(\n responsive?: string | number[] | false | null\n): number[] {\n if (responsive === false) return [];\n\n if (responsive === null || responsive === undefined) {\n return NAMED_SETS.retina; // sensible default\n }\n\n if (Array.isArray(responsive)) return responsive;\n\n return NAMED_SETS[responsive] ?? NAMED_SETS.retina;\n}\n\n/**\n * Build srcset and sizes strings entirely client-side\n * (no API call — for use with Next.js custom loader or static generation).\n */\nexport function buildSrcSet(\n path: string,\n params: Record<string, string | number> = {},\n widths: number[] = NAMED_SETS.retina,\n options: { baseUrl?: string; deliveryPath?: string } = {}\n): { srcset: string; sizes: string } {\n const entries = widths.map((w) =>\n `${buildDeliveryUrl(path, { ...params, w }, options)} ${w}w`\n );\n\n const sizes = widths\n .map((w) => `(max-width: ${w}px) 100vw`)\n .concat('100vw')\n .join(', ');\n\n return {\n srcset: entries.join(', '),\n sizes,\n };\n}\n","'use client';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — useSmartGlide Hook\n// Fetches image data from the Laravel /img-data API endpoint.\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport type { SmartGlideData, SmartGlideOptions } from './types';\nimport { buildDataUrl, buildDeliveryUrl, buildSrcSet, resolveWidths } from './url-builder';\n\nexport interface UseSmartGlideResult {\n /** Final signed delivery URL (ready for `<img src>`). */\n src: string;\n /** Responsive srcset string. */\n srcset: string | null;\n /** Sizes attribute. */\n sizes: string | null;\n /** Base64 LQIP blur data URI for placeholder. */\n blurDataUrl: string | null;\n /** JSON-LD ImageObject schema data. */\n schema: Record<string, unknown> | null;\n /** True while fetching from the API. */\n isLoading: boolean;\n /** Error if the fetch failed. */\n error: Error | null;\n /** Manually re-fetch the data. */\n refetch: () => void;\n}\n\n/**\n * Fetch Smart Glide image data from the Laravel API.\n *\n * @example\n * const { src, srcset, sizes, blurDataUrl } = useSmartGlide({\n * path: 'products/phone.jpg',\n * profile: 'hero',\n * responsive: 'retina',\n * blurPlaceholder: true,\n * baseUrl: process.env.NEXT_PUBLIC_API_URL,\n * });\n */\nexport function useSmartGlide(options: SmartGlideOptions): UseSmartGlideResult {\n const {\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder,\n schema,\n params,\n fetchOptions,\n } = options;\n\n const [data, setData] = useState<SmartGlideData | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchCounter = useRef(0);\n\n const fetchData = useCallback(async () => {\n const id = ++fetchCounter.current;\n setIsLoading(true);\n setError(null);\n\n try {\n const url = buildDataUrl(path, { path, baseUrl, profile, responsive, blurPlaceholder, schema, params });\n const response = await fetch(url, {\n headers: { Accept: 'application/json' },\n ...fetchOptions,\n });\n\n if (!response.ok) {\n throw new Error(`Smart Glide API error: ${response.status} ${response.statusText}`);\n }\n\n const json: SmartGlideData = await response.json();\n\n if (id === fetchCounter.current) {\n setData(json);\n }\n } catch (err) {\n if (id === fetchCounter.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (id === fetchCounter.current) {\n setIsLoading(false);\n }\n }\n }, [path, baseUrl, profile, JSON.stringify(responsive), blurPlaceholder, schema, JSON.stringify(params)]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n src: data?.src ?? buildDeliveryUrl(path, params ?? {}, { baseUrl }),\n srcset: data?.srcset ?? null,\n sizes: data?.sizes ?? null,\n blurDataUrl: data?.blurDataUrl ?? null,\n schema: data?.schema ?? null,\n isLoading,\n error,\n refetch: fetchData,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useSmartGlideStatic — No API call, builds URLs client-side\n// Best used with Next.js ISR or static export where you already know the params\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UseSmartGlideStaticResult {\n src: string;\n srcset: string;\n sizes: string;\n}\n\n/**\n * Build image URLs entirely client-side — no API fetch required.\n * Ideal for Next.js App Router with `generateStaticParams` or ISR.\n *\n * NOTE: URLs generated here are **unsigned**. Use this only in development\n * or when `SMART_GLIDE_SECURE=false` on your Laravel backend.\n * For signed URLs, use `useSmartGlide` or server-side data fetching.\n */\nexport function useSmartGlideStatic(options: SmartGlideOptions): UseSmartGlideStaticResult {\n const { path, baseUrl, profile, responsive, params } = options;\n\n const glideParams: Record<string, string | number> = { ...params };\n if (profile) glideParams.profile = profile;\n\n const widths = resolveWidths(responsive);\n const { srcset, sizes } = buildSrcSet(path, glideParams, widths, { baseUrl });\n const src = buildDeliveryUrl(path, glideParams, { baseUrl });\n\n return { src, srcset, sizes };\n}\n","'use client';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — Components\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport React, { useState, useCallback, forwardRef } from 'react';\nimport type { SmartGlideImageProps, SmartGlideOptions } from './types';\nimport { useSmartGlide } from './hooks';\nimport { buildDeliveryUrl, buildSrcSet, resolveWidths } from './url-builder';\n\n// ─── Internal: Blur Placeholder ───────────────────────────────────────────────\n\ninterface BlurOverlayProps {\n blurDataUrl: string;\n isVisible: boolean;\n}\n\nconst BlurOverlay: React.FC<BlurOverlayProps> = ({ blurDataUrl, isVisible }) => (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n inset: 0,\n backgroundImage: `url(${blurDataUrl})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n filter: 'blur(20px)',\n transform: 'scale(1.05)',\n transition: 'opacity 0.4s ease',\n opacity: isVisible ? 1 : 0,\n pointerEvents: 'none',\n }}\n />\n);\n\n// ─── Internal: JSON-LD Schema ─────────────────────────────────────────────────\n\ninterface SchemaScriptProps {\n schema: Record<string, unknown>;\n}\n\nconst SchemaScript: React.FC<SchemaScriptProps> = ({ schema }) => (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}\n />\n);\n\n// ─── SmartGlideImage ──────────────────────────────────────────────────────────\n\n/**\n * A full-featured, SEO-optimised `<img>` component backed by Laravel Smart Glide.\n *\n * @example\n * <SmartGlideImage\n * path=\"products/phone.jpg\"\n * alt=\"Awesome Phone\"\n * profile=\"hero\"\n * responsive=\"retina\"\n * />\n *\n * @example\n * <SmartGlideImage\n * path=\"home/hero.jpg\"\n * alt=\"Hero banner\"\n * profile=\"hero\"\n * priority\n * placeholder=\"blur\"\n * blurPlaceholder\n * schema\n * width={1600}\n * height={900}\n * />\n */\nexport const SmartGlideImage = forwardRef<HTMLImageElement, SmartGlideImageProps>(\n function SmartGlideImage(props, ref) {\n const {\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder: fetchBlur = false,\n schema: emitSchema = false,\n params,\n fetchOptions,\n priority = false,\n placeholder = 'empty',\n aspectRatio,\n alt,\n width,\n height,\n className,\n style,\n onLoad,\n onError,\n } = props;\n\n const shouldFetchBlur = placeholder === 'blur' || fetchBlur;\n\n const { src, srcset, sizes, blurDataUrl, schema } = useSmartGlide({\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder: shouldFetchBlur,\n schema: emitSchema,\n params,\n fetchOptions,\n });\n\n const [imgLoaded, setImgLoaded] = useState(false);\n const showBlur = shouldFetchBlur && !!blurDataUrl && !imgLoaded;\n\n const handleLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImgLoaded(true);\n onLoad?.(e);\n },\n [onLoad]\n );\n\n const handleError = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImgLoaded(true);\n onError?.(e);\n },\n [onError]\n );\n\n const composedStyle: React.CSSProperties = {\n ...style,\n ...(aspectRatio ? { aspectRatio } : {}),\n };\n\n // Wrapper needed only for blur placeholder\n if (shouldFetchBlur && blurDataUrl) {\n return (\n <>\n <span\n style={{\n position: 'relative',\n display: 'inline-block',\n overflow: 'hidden',\n width: width ? `${width}px` : undefined,\n height: height ? `${height}px` : undefined,\n aspectRatio,\n }}\n >\n <BlurOverlay blurDataUrl={blurDataUrl} isVisible={showBlur} />\n <img\n ref={ref}\n src={src}\n srcSet={srcset ?? undefined}\n sizes={sizes ?? undefined}\n alt={alt}\n width={width}\n height={height}\n className={className}\n style={{ ...composedStyle, display: 'block', width: '100%', height: '100%', objectFit: 'cover' }}\n loading={priority ? 'eager' : 'lazy'}\n fetchPriority={priority ? 'high' : 'auto'}\n decoding=\"async\"\n onLoad={handleLoad}\n onError={handleError}\n />\n </span>\n {schema && <SchemaScript schema={schema} />}\n </>\n );\n }\n\n return (\n <>\n <img\n ref={ref}\n src={src}\n srcSet={srcset ?? undefined}\n sizes={sizes ?? undefined}\n alt={alt}\n width={width}\n height={height}\n className={className}\n style={composedStyle}\n loading={priority ? 'eager' : 'lazy'}\n fetchPriority={priority ? 'high' : 'auto'}\n decoding=\"async\"\n onLoad={onLoad}\n onError={onError}\n />\n {emitSchema && schema && <SchemaScript schema={schema} />}\n </>\n );\n }\n);\n\nSmartGlideImage.displayName = 'SmartGlideImage';\n\n// ─── SmartGlidePicture ────────────────────────────────────────────────────────\n\nexport interface SmartGlidePictureSource {\n media?: string;\n widths?: number[];\n responsive?: string | number[];\n params?: Record<string, string | number>;\n type?: string;\n}\n\nexport interface SmartGlidePictureProps extends SmartGlideImageProps {\n sources?: SmartGlidePictureSource[];\n}\n\n/**\n * `<picture>` component with multiple `<source>` breakpoints\n * plus a Smart Glide powered `<img>` fallback.\n */\nexport const SmartGlidePicture = forwardRef<HTMLImageElement, SmartGlidePictureProps>(\n function SmartGlidePicture(props, ref) {\n const {\n sources = [],\n path,\n baseUrl,\n params,\n alt,\n profile,\n blurPlaceholder,\n schema,\n fetchOptions,\n priority,\n placeholder,\n aspectRatio,\n width,\n height,\n className,\n style,\n onLoad,\n onError,\n } = props;\n\n return (\n <picture>\n {sources.map((source, i: number) => {\n const widths = source.widths ?? resolveWidths(source.responsive as string | number[] | false | undefined);\n const mergedParams = { ...(params ?? {}), ...(source.params ?? {}) };\n const { srcset } = buildSrcSet(path, mergedParams, widths, { baseUrl });\n\n return (\n <source\n key={i}\n media={source.media}\n srcSet={srcset}\n type={source.type}\n />\n );\n })}\n <SmartGlideImage\n ref={ref}\n path={path}\n baseUrl={baseUrl}\n params={params}\n alt={alt}\n profile={profile}\n blurPlaceholder={blurPlaceholder}\n schema={schema}\n fetchOptions={fetchOptions}\n priority={priority}\n placeholder={placeholder}\n aspectRatio={aspectRatio}\n width={width}\n height={height}\n className={className}\n style={style}\n onLoad={onLoad}\n onError={onError}\n />\n </picture>\n );\n }\n);\n\nSmartGlidePicture.displayName = 'SmartGlidePicture';\n\n// ─── SmartGlideBackground ─────────────────────────────────────────────────────\n\nexport interface SmartGlideBackgroundProps extends SmartGlideOptions {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n}\n\n/**\n * CSS background-image container backed by Smart Glide.\n */\nexport const SmartGlideBackground: React.FC<SmartGlideBackgroundProps> = ({\n path,\n baseUrl,\n profile,\n responsive,\n params,\n blurPlaceholder: fetchBlur,\n children,\n className,\n style,\n 'aria-label': ariaLabel,\n}) => {\n const glideParams: Record<string, string | number> = { ...(params ?? {}) };\n if (profile) glideParams.profile = profile;\n\n const widths = resolveWidths(responsive);\n const primaryWidth = widths[widths.length - 1] ?? 1920;\n const primarySrc = buildDeliveryUrl(path, { ...glideParams, w: primaryWidth }, { baseUrl });\n\n const { blurDataUrl } = useSmartGlide({\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder: !!fetchBlur,\n params,\n });\n\n const mediaStyles = widths\n .slice()\n .reverse()\n .map((w) => {\n const url = buildDeliveryUrl(path, { ...glideParams, w }, { baseUrl });\n return `@media (max-width: ${w}px) { .sg-bg-${w} { background-image: url('${url}'); } }`;\n })\n .join('\\n');\n\n return (\n <>\n {mediaStyles && (\n <style dangerouslySetInnerHTML={{ __html: mediaStyles }} />\n )}\n <div\n role=\"img\"\n aria-label={ariaLabel}\n className={className}\n style={{\n backgroundImage: blurDataUrl\n ? `url('${primarySrc}'), url('${blurDataUrl}')`\n : `url('${primarySrc}')`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n ...style,\n }}\n >\n {children}\n </div>\n </>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — SmartGlideProvider\n// Global configuration context — set baseUrl once, use everywhere.\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport React, { createContext, useContext } from 'react';\n\nexport interface SmartGlideConfig {\n /** Base URL of your Laravel application (e.g. `\"https://api.example.com\"`). */\n baseUrl?: string;\n\n /** Delivery path prefix (default: `\"/img\"`). */\n deliveryPath?: string;\n\n /** Data API path prefix (default: `\"/img-data\"`). */\n dataPath?: string;\n\n /** Default image profile to apply when none is specified. */\n defaultProfile?: string;\n\n /** Default responsive set name or widths. */\n defaultResponsive?: string | number[];\n\n /** Emit JSON-LD `ImageObject` by default for all images. */\n defaultSchema?: boolean;\n}\n\nconst SmartGlideContext = createContext<SmartGlideConfig>({});\n\nexport function useSmartGlideConfig(): SmartGlideConfig {\n return useContext(SmartGlideContext);\n}\n\nexport interface SmartGlideProviderProps {\n config: SmartGlideConfig;\n children: React.ReactNode;\n}\n\n/**\n * Wrap your application (or part of it) with `<SmartGlideProvider>` to\n * configure Smart Glide globally. Individual components/hooks can still\n * override any option locally.\n *\n * @example\n * // app/layout.tsx (Next.js App Router)\n * import { SmartGlideProvider } from 'smart-glide-react';\n *\n * export default function RootLayout({ children }) {\n * return (\n * <SmartGlideProvider config={{ baseUrl: process.env.NEXT_PUBLIC_API_URL }}>\n * {children}\n * </SmartGlideProvider>\n * );\n * }\n */\nexport function SmartGlideProvider({ config, children }: SmartGlideProviderProps) {\n return (\n <SmartGlideContext.Provider value={config}>\n {children}\n </SmartGlideContext.Provider>\n );\n}\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,421 @@
1
+ import { forwardRef, useState, useCallback, createContext, useRef, useEffect, useContext } from 'react';
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+
4
+ // src/components.tsx
5
+
6
+ // src/url-builder.ts
7
+ function resolveBaseUrl(baseUrl) {
8
+ if (baseUrl) return baseUrl.replace(/\/$/, "");
9
+ if (typeof process !== "undefined") {
10
+ const env = process.env.NEXT_PUBLIC_SMART_GLIDE_URL ?? process.env.VITE_SMART_GLIDE_URL ?? process.env.SMART_GLIDE_URL ?? "";
11
+ if (env) return env.replace(/\/$/, "");
12
+ }
13
+ return "";
14
+ }
15
+ function resolveDeliveryPath(deliveryPath) {
16
+ if (deliveryPath) return "/" + deliveryPath.replace(/^\/|\/$/g, "");
17
+ if (typeof process !== "undefined") {
18
+ const env = process.env.NEXT_PUBLIC_SMART_GLIDE_DELIVERY_PATH ?? "/img";
19
+ return "/" + env.replace(/^\/|\/$/g, "");
20
+ }
21
+ return "/img";
22
+ }
23
+ function resolveDataPath(dataPath) {
24
+ if (dataPath) return "/" + dataPath.replace(/^\/|\/$/g, "");
25
+ if (typeof process !== "undefined") {
26
+ const env = process.env.NEXT_PUBLIC_SMART_GLIDE_DATA_PATH ?? "/img-data";
27
+ return "/" + env.replace(/^\/|\/$/g, "");
28
+ }
29
+ return "/img-data";
30
+ }
31
+ function buildDeliveryUrl(path, params = {}, options = {}) {
32
+ const base = resolveBaseUrl(options.baseUrl);
33
+ const prefix = resolveDeliveryPath(options.deliveryPath);
34
+ const cleanPath = path.replace(/^\//, "");
35
+ const queryParams = Object.entries(params).filter(([, v]) => v !== void 0 && v !== "").map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&");
36
+ return `${base}${prefix}/${cleanPath}${queryParams ? "?" + queryParams : ""}`;
37
+ }
38
+ function buildDataUrl(path, options) {
39
+ const base = resolveBaseUrl(options.baseUrl);
40
+ const prefix = resolveDataPath(options.dataPath);
41
+ const cleanPath = path.replace(/^\//, "");
42
+ const params = {};
43
+ if (options.profile) params.profile = options.profile;
44
+ if (options.blurPlaceholder) params.blur_placeholder = "1";
45
+ if (options.schema) params.schema = "1";
46
+ if (options.responsive === false) {
47
+ params.responsive = "0";
48
+ } else if (Array.isArray(options.responsive)) {
49
+ params.responsive = options.responsive.join(",");
50
+ } else if (options.responsive) {
51
+ params.responsive = options.responsive;
52
+ }
53
+ if (options.params) {
54
+ Object.entries(options.params).forEach(([k, v]) => {
55
+ params[k] = String(v);
56
+ });
57
+ }
58
+ const query = new URLSearchParams(params).toString();
59
+ return `${base}${prefix}/${cleanPath}${query ? "?" + query : ""}`;
60
+ }
61
+ var NAMED_SETS = {
62
+ hero: [640, 960, 1280, 1600, 1920],
63
+ thumbnails: [240, 320, 480],
64
+ square: [320, 480, 640],
65
+ portrait: [480, 768, 1024],
66
+ hd: [960, 1280, 1600],
67
+ fhd: [1280, 1600, 1920, 2560],
68
+ retina: [640, 960, 1280, 1920, 2560]
69
+ };
70
+ function resolveWidths(responsive) {
71
+ if (responsive === false) return [];
72
+ if (responsive === null || responsive === void 0) {
73
+ return NAMED_SETS.retina;
74
+ }
75
+ if (Array.isArray(responsive)) return responsive;
76
+ return NAMED_SETS[responsive] ?? NAMED_SETS.retina;
77
+ }
78
+ function buildSrcSet(path, params = {}, widths = NAMED_SETS.retina, options = {}) {
79
+ const entries = widths.map(
80
+ (w) => `${buildDeliveryUrl(path, { ...params, w }, options)} ${w}w`
81
+ );
82
+ const sizes = widths.map((w) => `(max-width: ${w}px) 100vw`).concat("100vw").join(", ");
83
+ return {
84
+ srcset: entries.join(", "),
85
+ sizes
86
+ };
87
+ }
88
+
89
+ // src/hooks.ts
90
+ function useSmartGlide(options) {
91
+ const {
92
+ path,
93
+ baseUrl,
94
+ profile,
95
+ responsive,
96
+ blurPlaceholder,
97
+ schema,
98
+ params,
99
+ fetchOptions
100
+ } = options;
101
+ const [data, setData] = useState(null);
102
+ const [isLoading, setIsLoading] = useState(true);
103
+ const [error, setError] = useState(null);
104
+ const fetchCounter = useRef(0);
105
+ const fetchData = useCallback(async () => {
106
+ const id = ++fetchCounter.current;
107
+ setIsLoading(true);
108
+ setError(null);
109
+ try {
110
+ const url = buildDataUrl(path, { path, baseUrl, profile, responsive, blurPlaceholder, schema, params });
111
+ const response = await fetch(url, {
112
+ headers: { Accept: "application/json" },
113
+ ...fetchOptions
114
+ });
115
+ if (!response.ok) {
116
+ throw new Error(`Smart Glide API error: ${response.status} ${response.statusText}`);
117
+ }
118
+ const json = await response.json();
119
+ if (id === fetchCounter.current) {
120
+ setData(json);
121
+ }
122
+ } catch (err) {
123
+ if (id === fetchCounter.current) {
124
+ setError(err instanceof Error ? err : new Error(String(err)));
125
+ }
126
+ } finally {
127
+ if (id === fetchCounter.current) {
128
+ setIsLoading(false);
129
+ }
130
+ }
131
+ }, [path, baseUrl, profile, JSON.stringify(responsive), blurPlaceholder, schema, JSON.stringify(params)]);
132
+ useEffect(() => {
133
+ fetchData();
134
+ }, [fetchData]);
135
+ return {
136
+ src: data?.src ?? buildDeliveryUrl(path, params ?? {}, { baseUrl }),
137
+ srcset: data?.srcset ?? null,
138
+ sizes: data?.sizes ?? null,
139
+ blurDataUrl: data?.blurDataUrl ?? null,
140
+ schema: data?.schema ?? null,
141
+ isLoading,
142
+ error,
143
+ refetch: fetchData
144
+ };
145
+ }
146
+ function useSmartGlideStatic(options) {
147
+ const { path, baseUrl, profile, responsive, params } = options;
148
+ const glideParams = { ...params };
149
+ if (profile) glideParams.profile = profile;
150
+ const widths = resolveWidths(responsive);
151
+ const { srcset, sizes } = buildSrcSet(path, glideParams, widths, { baseUrl });
152
+ const src = buildDeliveryUrl(path, glideParams, { baseUrl });
153
+ return { src, srcset, sizes };
154
+ }
155
+ var BlurOverlay = ({ blurDataUrl, isVisible }) => /* @__PURE__ */ jsx(
156
+ "span",
157
+ {
158
+ "aria-hidden": "true",
159
+ style: {
160
+ position: "absolute",
161
+ inset: 0,
162
+ backgroundImage: `url(${blurDataUrl})`,
163
+ backgroundSize: "cover",
164
+ backgroundPosition: "center",
165
+ filter: "blur(20px)",
166
+ transform: "scale(1.05)",
167
+ transition: "opacity 0.4s ease",
168
+ opacity: isVisible ? 1 : 0,
169
+ pointerEvents: "none"
170
+ }
171
+ }
172
+ );
173
+ var SchemaScript = ({ schema }) => /* @__PURE__ */ jsx(
174
+ "script",
175
+ {
176
+ type: "application/ld+json",
177
+ dangerouslySetInnerHTML: { __html: JSON.stringify(schema) }
178
+ }
179
+ );
180
+ var SmartGlideImage = forwardRef(
181
+ function SmartGlideImage2(props, ref) {
182
+ const {
183
+ path,
184
+ baseUrl,
185
+ profile,
186
+ responsive,
187
+ blurPlaceholder: fetchBlur = false,
188
+ schema: emitSchema = false,
189
+ params,
190
+ fetchOptions,
191
+ priority = false,
192
+ placeholder = "empty",
193
+ aspectRatio,
194
+ alt,
195
+ width,
196
+ height,
197
+ className,
198
+ style,
199
+ onLoad,
200
+ onError
201
+ } = props;
202
+ const shouldFetchBlur = placeholder === "blur" || fetchBlur;
203
+ const { src, srcset, sizes, blurDataUrl, schema } = useSmartGlide({
204
+ path,
205
+ baseUrl,
206
+ profile,
207
+ responsive,
208
+ blurPlaceholder: shouldFetchBlur,
209
+ schema: emitSchema,
210
+ params,
211
+ fetchOptions
212
+ });
213
+ const [imgLoaded, setImgLoaded] = useState(false);
214
+ const showBlur = shouldFetchBlur && !!blurDataUrl && !imgLoaded;
215
+ const handleLoad = useCallback(
216
+ (e) => {
217
+ setImgLoaded(true);
218
+ onLoad?.(e);
219
+ },
220
+ [onLoad]
221
+ );
222
+ const handleError = useCallback(
223
+ (e) => {
224
+ setImgLoaded(true);
225
+ onError?.(e);
226
+ },
227
+ [onError]
228
+ );
229
+ const composedStyle = {
230
+ ...style,
231
+ ...aspectRatio ? { aspectRatio } : {}
232
+ };
233
+ if (shouldFetchBlur && blurDataUrl) {
234
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
235
+ /* @__PURE__ */ jsxs(
236
+ "span",
237
+ {
238
+ style: {
239
+ position: "relative",
240
+ display: "inline-block",
241
+ overflow: "hidden",
242
+ width: width ? `${width}px` : void 0,
243
+ height: height ? `${height}px` : void 0,
244
+ aspectRatio
245
+ },
246
+ children: [
247
+ /* @__PURE__ */ jsx(BlurOverlay, { blurDataUrl, isVisible: showBlur }),
248
+ /* @__PURE__ */ jsx(
249
+ "img",
250
+ {
251
+ ref,
252
+ src,
253
+ srcSet: srcset ?? void 0,
254
+ sizes: sizes ?? void 0,
255
+ alt,
256
+ width,
257
+ height,
258
+ className,
259
+ style: { ...composedStyle, display: "block", width: "100%", height: "100%", objectFit: "cover" },
260
+ loading: priority ? "eager" : "lazy",
261
+ fetchPriority: priority ? "high" : "auto",
262
+ decoding: "async",
263
+ onLoad: handleLoad,
264
+ onError: handleError
265
+ }
266
+ )
267
+ ]
268
+ }
269
+ ),
270
+ schema && /* @__PURE__ */ jsx(SchemaScript, { schema })
271
+ ] });
272
+ }
273
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
274
+ /* @__PURE__ */ jsx(
275
+ "img",
276
+ {
277
+ ref,
278
+ src,
279
+ srcSet: srcset ?? void 0,
280
+ sizes: sizes ?? void 0,
281
+ alt,
282
+ width,
283
+ height,
284
+ className,
285
+ style: composedStyle,
286
+ loading: priority ? "eager" : "lazy",
287
+ fetchPriority: priority ? "high" : "auto",
288
+ decoding: "async",
289
+ onLoad,
290
+ onError
291
+ }
292
+ ),
293
+ emitSchema && schema && /* @__PURE__ */ jsx(SchemaScript, { schema })
294
+ ] });
295
+ }
296
+ );
297
+ SmartGlideImage.displayName = "SmartGlideImage";
298
+ var SmartGlidePicture = forwardRef(
299
+ function SmartGlidePicture2(props, ref) {
300
+ const {
301
+ sources = [],
302
+ path,
303
+ baseUrl,
304
+ params,
305
+ alt,
306
+ profile,
307
+ blurPlaceholder,
308
+ schema,
309
+ fetchOptions,
310
+ priority,
311
+ placeholder,
312
+ aspectRatio,
313
+ width,
314
+ height,
315
+ className,
316
+ style,
317
+ onLoad,
318
+ onError
319
+ } = props;
320
+ return /* @__PURE__ */ jsxs("picture", { children: [
321
+ sources.map((source, i) => {
322
+ const widths = source.widths ?? resolveWidths(source.responsive);
323
+ const mergedParams = { ...params ?? {}, ...source.params ?? {} };
324
+ const { srcset } = buildSrcSet(path, mergedParams, widths, { baseUrl });
325
+ return /* @__PURE__ */ jsx(
326
+ "source",
327
+ {
328
+ media: source.media,
329
+ srcSet: srcset,
330
+ type: source.type
331
+ },
332
+ i
333
+ );
334
+ }),
335
+ /* @__PURE__ */ jsx(
336
+ SmartGlideImage,
337
+ {
338
+ ref,
339
+ path,
340
+ baseUrl,
341
+ params,
342
+ alt,
343
+ profile,
344
+ blurPlaceholder,
345
+ schema,
346
+ fetchOptions,
347
+ priority,
348
+ placeholder,
349
+ aspectRatio,
350
+ width,
351
+ height,
352
+ className,
353
+ style,
354
+ onLoad,
355
+ onError
356
+ }
357
+ )
358
+ ] });
359
+ }
360
+ );
361
+ SmartGlidePicture.displayName = "SmartGlidePicture";
362
+ var SmartGlideBackground = ({
363
+ path,
364
+ baseUrl,
365
+ profile,
366
+ responsive,
367
+ params,
368
+ blurPlaceholder: fetchBlur,
369
+ children,
370
+ className,
371
+ style,
372
+ "aria-label": ariaLabel
373
+ }) => {
374
+ const glideParams = { ...params ?? {} };
375
+ if (profile) glideParams.profile = profile;
376
+ const widths = resolveWidths(responsive);
377
+ const primaryWidth = widths[widths.length - 1] ?? 1920;
378
+ const primarySrc = buildDeliveryUrl(path, { ...glideParams, w: primaryWidth }, { baseUrl });
379
+ const { blurDataUrl } = useSmartGlide({
380
+ path,
381
+ baseUrl,
382
+ profile,
383
+ responsive,
384
+ blurPlaceholder: !!fetchBlur,
385
+ params
386
+ });
387
+ const mediaStyles = widths.slice().reverse().map((w) => {
388
+ const url = buildDeliveryUrl(path, { ...glideParams, w }, { baseUrl });
389
+ return `@media (max-width: ${w}px) { .sg-bg-${w} { background-image: url('${url}'); } }`;
390
+ }).join("\n");
391
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
392
+ mediaStyles && /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: mediaStyles } }),
393
+ /* @__PURE__ */ jsx(
394
+ "div",
395
+ {
396
+ role: "img",
397
+ "aria-label": ariaLabel,
398
+ className,
399
+ style: {
400
+ backgroundImage: blurDataUrl ? `url('${primarySrc}'), url('${blurDataUrl}')` : `url('${primarySrc}')`,
401
+ backgroundSize: "cover",
402
+ backgroundPosition: "center",
403
+ backgroundRepeat: "no-repeat",
404
+ ...style
405
+ },
406
+ children
407
+ }
408
+ )
409
+ ] });
410
+ };
411
+ var SmartGlideContext = createContext({});
412
+ function useSmartGlideConfig() {
413
+ return useContext(SmartGlideContext);
414
+ }
415
+ function SmartGlideProvider({ config, children }) {
416
+ return /* @__PURE__ */ jsx(SmartGlideContext.Provider, { value: config, children });
417
+ }
418
+
419
+ export { SmartGlideBackground, SmartGlideImage, SmartGlidePicture, SmartGlideProvider, buildDataUrl, buildDeliveryUrl, buildSrcSet, resolveBaseUrl, resolveDataPath, resolveDeliveryPath, resolveWidths, useSmartGlide, useSmartGlideConfig, useSmartGlideStatic };
420
+ //# sourceMappingURL=index.mjs.map
421
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/url-builder.ts","../src/hooks.ts","../src/components.tsx","../src/provider.tsx"],"names":["SmartGlideImage","useState","useCallback","SmartGlidePicture","jsx"],"mappings":";;;;;;AAQO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,IAAI,OAAA,EAAS,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAG7C,EAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,IAAA,MAAM,GAAA,GACJ,QAAQ,GAAA,CAAI,2BAAA,IACZ,QAAQ,GAAA,CAAI,oBAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,eAAA,IACZ,EAAA;AACF,IAAA,IAAI,GAAA,EAAK,OAAO,GAAA,CAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,oBAAoB,YAAA,EAA+B;AACjE,EAAA,IAAI,cAAc,OAAO,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,YAAY,EAAE,CAAA;AAElE,EAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,qCAAA,IAAyC,MAAA;AACjE,IAAA,OAAO,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,gBAAgB,QAAA,EAA2B;AACzD,EAAA,IAAI,UAAU,OAAO,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,YAAY,EAAE,CAAA;AAE1D,EAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,iCAAA,IAAqC,WAAA;AAC7D,IAAA,OAAO,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,WAAA;AACT;AAGO,SAAS,iBACd,IAAA,EACA,MAAA,GAA0C,EAAC,EAC3C,OAAA,GAAuD,EAAC,EAChD;AACR,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,OAAA,CAAQ,YAAY,CAAA;AACvD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAExC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,MAAM,EACtC,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAA,IAAa,MAAM,EAAE,CAAA,CAC7C,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,GAAG,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA,EAAI,mBAAmB,CAAC,CAAC,CAAA,CAAE,CAAA,CACnE,KAAK,GAAG,CAAA;AAEX,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,EAAG,WAAA,GAAc,GAAA,GAAM,WAAA,GAAc,EAAE,CAAA,CAAA;AAC7E;AAGO,SAAS,YAAA,CACd,MACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAExC,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,OAAA,CAAQ,OAAA;AAC9C,EAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,CAAO,gBAAA,GAAmB,GAAA;AACvD,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,GAAA;AAGpC,EAAA,IAAI,OAAA,CAAQ,eAAe,KAAA,EAAO;AAChC,IAAA,MAAA,CAAO,UAAA,GAAa,GAAA;AAAA,EACtB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC5C,IAAA,MAAA,CAAO,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,EACjD,CAAA,MAAA,IAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AACjD,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,CAAgB,MAAM,EAAE,QAAA,EAAS;AACnD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,EAAG,KAAA,GAAQ,GAAA,GAAM,KAAA,GAAQ,EAAE,CAAA,CAAA;AACjE;AAGA,IAAM,UAAA,GAAuC;AAAA,EAC3C,MAAY,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EACvC,UAAA,EAAY,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAA,EAC1B,MAAA,EAAY,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAA,EAC1B,QAAA,EAAY,CAAC,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EAC3B,EAAA,EAAY,CAAC,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAC5B,GAAA,EAAY,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EACnC,QAAY,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI;AACzC,CAAA;AAEO,SAAS,cACd,UAAA,EACU;AACV,EAAA,IAAI,UAAA,KAAe,KAAA,EAAO,OAAO,EAAC;AAElC,EAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,UAAA,KAAe,MAAA,EAAW;AACnD,IAAA,OAAO,UAAA,CAAW,MAAA;AAAA,EACpB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG,OAAO,UAAA;AAEtC,EAAA,OAAO,UAAA,CAAW,UAAU,CAAA,IAAK,UAAA,CAAW,MAAA;AAC9C;AAMO,SAAS,WAAA,CACd,IAAA,EACA,MAAA,GAA0C,EAAC,EAC3C,SAAmB,UAAA,CAAW,MAAA,EAC9B,OAAA,GAAuD,EAAC,EACrB;AACnC,EAAA,MAAM,UAAU,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,CAAA,KAC1B,CAAA,EAAG,gBAAA,CAAiB,IAAA,EAAM,EAAE,GAAG,MAAA,EAAQ,CAAA,EAAE,EAAG,OAAO,CAAC,IAAI,CAAC,CAAA,CAAA;AAAA,GAC3D;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,YAAA,EAAe,CAAC,CAAA,SAAA,CAAW,CAAA,CACtC,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AC3GO,SAAS,cAAc,OAAA,EAAiD;AAC7E,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAgC,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,OAAO,CAAC,CAAA;AAE7B,EAAA,MAAM,SAAA,GAAY,YAAY,YAAY;AACxC,IAAA,MAAM,EAAA,GAAK,EAAE,YAAA,CAAa,OAAA;AAC1B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,CAAA;AACtG,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,QACtC,GAAG;AAAA,OACJ,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MACpF;AAEA,MAAA,MAAM,IAAA,GAAuB,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjD,MAAA,IAAI,EAAA,KAAO,aAAa,OAAA,EAAS;AAC/B,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,EAAA,KAAO,aAAa,OAAA,EAAS;AAC/B,QAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,MAC9D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,EAAA,KAAO,aAAa,OAAA,EAAS;AAC/B,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA,EAAG,iBAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAC,CAAA;AAExG,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,GAAA,EAAa,IAAA,EAAM,GAAA,IAAQ,gBAAA,CAAiB,IAAA,EAAM,UAAU,EAAC,EAAG,EAAE,OAAA,EAAS,CAAA;AAAA,IAC3E,MAAA,EAAa,MAAM,MAAA,IAAU,IAAA;AAAA,IAC7B,KAAA,EAAa,MAAM,KAAA,IAAS,IAAA;AAAA,IAC5B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,IAClC,MAAA,EAAa,MAAM,MAAA,IAAU,IAAA;AAAA,IAC7B,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAa;AAAA,GACf;AACF;AAqBO,SAAS,oBAAoB,OAAA,EAAuD;AACzF,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,QAAO,GAAI,OAAA;AAEvD,EAAA,MAAM,WAAA,GAA+C,EAAE,GAAG,MAAA,EAAO;AACjE,EAAA,IAAI,OAAA,cAAqB,OAAA,GAAU,OAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,cAAc,UAAU,CAAA;AACvC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,WAAA,CAAY,MAAM,WAAA,EAAa,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA;AAC5E,EAAA,MAAM,MAAM,gBAAA,CAAiB,IAAA,EAAM,WAAA,EAAa,EAAE,SAAS,CAAA;AAE3D,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAM;AAC9B;ACvHA,IAAM,WAAA,GAA0C,CAAC,EAAE,WAAA,EAAa,WAAU,qBACxE,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,aAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,eAAA,EAAiB,OAAO,WAAW,CAAA,CAAA,CAAA;AAAA,MACnC,cAAA,EAAgB,OAAA;AAAA,MAChB,kBAAA,EAAoB,QAAA;AAAA,MACpB,MAAA,EAAQ,YAAA;AAAA,MACR,SAAA,EAAW,aAAA;AAAA,MACX,UAAA,EAAY,mBAAA;AAAA,MACZ,OAAA,EAAS,YAAY,CAAA,GAAI,CAAA;AAAA,MACzB,aAAA,EAAe;AAAA;AACjB;AACF,CAAA;AASF,IAAM,YAAA,GAA4C,CAAC,EAAE,MAAA,EAAO,qBAC1D,GAAA;AAAA,EAAC,QAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAK,qBAAA;AAAA,IACL,yBAAyB,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAE;AAC5D,CAAA;AA6BK,IAAM,eAAA,GAAkB,UAAA;AAAA,EAC7B,SAASA,gBAAAA,CAAgB,KAAA,EAAO,GAAA,EAAK;AACnC,IAAA,MAAM;AAAA,MACJ,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAiB,SAAA,GAAY,KAAA;AAAA,MAC7B,QAAQ,UAAA,GAAa,KAAA;AAAA,MACrB,MAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA,GAAW,KAAA;AAAA,MACX,WAAA,GAAc,OAAA;AAAA,MACd,WAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAA,GAAkB,gBAAgB,MAAA,IAAU,SAAA;AAElD,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,WAAA,EAAa,MAAA,KAAW,aAAA,CAAc;AAAA,MAChE,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA,EAAiB,eAAA;AAAA,MACjB,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAS,KAAK,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,eAAA,IAAmB,CAAC,CAAC,eAAe,CAAC,SAAA;AAEtD,IAAA,MAAM,UAAA,GAAaC,WAAAA;AAAA,MACjB,CAAC,CAAA,KAA8C;AAC7C,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,MAAA,GAAS,CAAC,CAAA;AAAA,MACZ,CAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAEA,IAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,MAClB,CAAC,CAAA,KAA8C;AAC7C,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,MAAM,aAAA,GAAqC;AAAA,MACzC,GAAG,KAAA;AAAA,MACH,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC,KACvC;AAGA,IAAA,IAAI,mBAAmB,WAAA,EAAa;AAClC,MAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,UAAA;AAAA,cACV,OAAA,EAAS,cAAA;AAAA,cACT,QAAA,EAAU,QAAA;AAAA,cACV,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,cAC9B,MAAA,EAAQ,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,cACjC;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,WAAA,EAAA,EAAY,WAAA,EAA0B,SAAA,EAAW,QAAA,EAAU,CAAA;AAAA,8BAC5D,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,GAAA;AAAA,kBACA,GAAA;AAAA,kBACA,QAAQ,MAAA,IAAU,MAAA;AAAA,kBAClB,OAAO,KAAA,IAAS,MAAA;AAAA,kBAChB,GAAA;AAAA,kBACA,KAAA;AAAA,kBACA,MAAA;AAAA,kBACA,SAAA;AAAA,kBACA,KAAA,EAAO,EAAE,GAAG,aAAA,EAAe,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAQ;AAAA,kBAC/F,OAAA,EAAS,WAAW,OAAA,GAAU,MAAA;AAAA,kBAC9B,aAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,kBACnC,QAAA,EAAS,OAAA;AAAA,kBACT,MAAA,EAAQ,UAAA;AAAA,kBACR,OAAA,EAAS;AAAA;AAAA;AACX;AAAA;AAAA,SACF;AAAA,QACC,MAAA,oBAAU,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB;AAAA,OAAA,EAC3C,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,GAAA;AAAA,UACA,QAAQ,MAAA,IAAU,MAAA;AAAA,UAClB,OAAO,KAAA,IAAS,MAAA;AAAA,UAChB,GAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAA,EAAO,aAAA;AAAA,UACP,OAAA,EAAS,WAAW,OAAA,GAAU,MAAA;AAAA,UAC9B,aAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,UACnC,QAAA,EAAS,OAAA;AAAA,UACT,MAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,MACC,UAAA,IAAc,MAAA,oBAAU,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB;AAAA,KAAA,EACzD,CAAA;AAAA,EAEJ;AACF;AAEA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAoBvB,IAAM,iBAAA,GAAoB,UAAA;AAAA,EAC/B,SAASC,kBAAAA,CAAkB,KAAA,EAAO,GAAA,EAAK;AACrC,IAAA,MAAM;AAAA,MACJ,UAAU,EAAC;AAAA,MACX,IAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA;AAAA,MACA,eAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAA;AAEJ,IAAA,4BACG,SAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAA,KAAc;AAClC,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,aAAA,CAAc,OAAO,UAAmD,CAAA;AACxG,QAAA,MAAM,YAAA,GAAe,EAAE,GAAI,MAAA,IAAU,IAAK,GAAI,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACnE,QAAA,MAAM,EAAE,QAAO,GAAI,WAAA,CAAY,MAAM,YAAA,EAAc,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA;AAEtE,QAAA,uBACE,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,MAAA,EAAQ,MAAA;AAAA,YACR,MAAM,MAAA,CAAO;AAAA,WAAA;AAAA,UAHR;AAAA,SAIP;AAAA,MAEJ,CAAC,CAAA;AAAA,sBACD,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,GAAA;AAAA,UACA,OAAA;AAAA,UACA,eAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,WAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAczB,IAAM,uBAA4D,CAAC;AAAA,EACxE,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA,EAAiB,SAAA;AAAA,EACjB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAA+C,EAAE,GAAI,MAAA,IAAU,EAAC,EAAG;AACzE,EAAA,IAAI,OAAA,cAAqB,OAAA,GAAU,OAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,cAAc,UAAU,CAAA;AACvC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AAClD,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,IAAA,EAAM,EAAE,GAAG,WAAA,EAAa,CAAA,EAAG,YAAA,EAAa,EAAG,EAAE,OAAA,EAAS,CAAA;AAE1F,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,aAAA,CAAc;AAAA,IACpC,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA,EAAiB,CAAC,CAAC,SAAA;AAAA,IACnB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,OACjB,KAAA,EAAM,CACN,SAAQ,CACR,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,EAAM,EAAE,GAAG,aAAa,CAAA,EAAE,EAAG,EAAE,OAAA,EAAS,CAAA;AACrE,IAAA,OAAO,CAAA,mBAAA,EAAsB,CAAC,CAAA,aAAA,EAAgB,CAAC,6BAA6B,GAAG,CAAA,OAAA,CAAA;AAAA,EACjF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,WAAA,wBACE,OAAA,EAAA,EAAM,uBAAA,EAAyB,EAAE,MAAA,EAAQ,aAAY,EAAG,CAAA;AAAA,oBAE3D,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,KAAA;AAAA,QACL,YAAA,EAAY,SAAA;AAAA,QACZ,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB,cACb,CAAA,KAAA,EAAQ,UAAU,YAAY,WAAW,CAAA,EAAA,CAAA,GACzC,QAAQ,UAAU,CAAA,EAAA,CAAA;AAAA,UACtB,cAAA,EAAgB,OAAA;AAAA,UAChB,kBAAA,EAAoB,QAAA;AAAA,UACpB,gBAAA,EAAkB,WAAA;AAAA,UAClB,GAAG;AAAA,SACL;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;ACrUA,IAAM,iBAAA,GAAoB,aAAA,CAAgC,EAAE,CAAA;AAErD,SAAS,mBAAA,GAAwC;AACtD,EAAA,OAAO,WAAW,iBAAiB,CAAA;AACrC;AAwBO,SAAS,kBAAA,CAAmB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA4B;AAChF,EAAA,uBACEC,GAAAA,CAAC,iBAAA,CAAkB,UAAlB,EAA2B,KAAA,EAAO,QAChC,QAAA,EACH,CAAA;AAEJ","file":"index.mjs","sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — URL Builder\n// Builds Smart Glide delivery URLs client-side (no API call needed).\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { ImageProfile, ResponsivePreset, SmartGlideOptions } from './types';\n\n/** Resolve the base URL from options or environment variables. */\nexport function resolveBaseUrl(baseUrl?: string): string {\n if (baseUrl) return baseUrl.replace(/\\/$/, '');\n\n // Next.js public env\n if (typeof process !== 'undefined') {\n const env =\n process.env.NEXT_PUBLIC_SMART_GLIDE_URL ??\n process.env.VITE_SMART_GLIDE_URL ??\n process.env.SMART_GLIDE_URL ??\n '';\n if (env) return env.replace(/\\/$/, '');\n }\n\n return '';\n}\n\n/** Resolve the delivery path prefix (default: `/img`). */\nexport function resolveDeliveryPath(deliveryPath?: string): string {\n if (deliveryPath) return '/' + deliveryPath.replace(/^\\/|\\/$/g, '');\n\n if (typeof process !== 'undefined') {\n const env = process.env.NEXT_PUBLIC_SMART_GLIDE_DELIVERY_PATH ?? '/img';\n return '/' + env.replace(/^\\/|\\/$/g, '');\n }\n\n return '/img';\n}\n\n/** Resolve the data API path prefix (default: `/img-data`). */\nexport function resolveDataPath(dataPath?: string): string {\n if (dataPath) return '/' + dataPath.replace(/^\\/|\\/$/g, '');\n\n if (typeof process !== 'undefined') {\n const env = process.env.NEXT_PUBLIC_SMART_GLIDE_DATA_PATH ?? '/img-data';\n return '/' + env.replace(/^\\/|\\/$/g, '');\n }\n\n return '/img-data';\n}\n\n/** Build a single Smart Glide delivery URL (unsigned — for preview/dev). */\nexport function buildDeliveryUrl(\n path: string,\n params: Record<string, string | number> = {},\n options: { baseUrl?: string; deliveryPath?: string } = {}\n): string {\n const base = resolveBaseUrl(options.baseUrl);\n const prefix = resolveDeliveryPath(options.deliveryPath);\n const cleanPath = path.replace(/^\\//, '');\n\n const queryParams = Object.entries(params)\n .filter(([, v]) => v !== undefined && v !== '')\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join('&');\n\n return `${base}${prefix}/${cleanPath}${queryParams ? '?' + queryParams : ''}`;\n}\n\n/** Build the JSON data API URL for a given path. */\nexport function buildDataUrl(\n path: string,\n options: SmartGlideOptions & { deliveryPath?: string; dataPath?: string }\n): string {\n const base = resolveBaseUrl(options.baseUrl);\n const prefix = resolveDataPath(options.dataPath);\n const cleanPath = path.replace(/^\\//, '');\n\n const params: Record<string, string> = {};\n\n if (options.profile) params.profile = options.profile;\n if (options.blurPlaceholder) params.blur_placeholder = '1';\n if (options.schema) params.schema = '1';\n\n // Responsive\n if (options.responsive === false) {\n params.responsive = '0';\n } else if (Array.isArray(options.responsive)) {\n params.responsive = options.responsive.join(',');\n } else if (options.responsive) {\n params.responsive = options.responsive;\n }\n\n // Extra Glide params\n if (options.params) {\n Object.entries(options.params).forEach(([k, v]) => {\n params[k] = String(v);\n });\n }\n\n const query = new URLSearchParams(params).toString();\n return `${base}${prefix}/${cleanPath}${query ? '?' + query : ''}`;\n}\n\n/** Resolve a named or custom responsive set to an array of widths. */\nconst NAMED_SETS: Record<string, number[]> = {\n hero: [640, 960, 1280, 1600, 1920],\n thumbnails: [240, 320, 480],\n square: [320, 480, 640],\n portrait: [480, 768, 1024],\n hd: [960, 1280, 1600],\n fhd: [1280, 1600, 1920, 2560],\n retina: [640, 960, 1280, 1920, 2560],\n};\n\nexport function resolveWidths(\n responsive?: string | number[] | false | null\n): number[] {\n if (responsive === false) return [];\n\n if (responsive === null || responsive === undefined) {\n return NAMED_SETS.retina; // sensible default\n }\n\n if (Array.isArray(responsive)) return responsive;\n\n return NAMED_SETS[responsive] ?? NAMED_SETS.retina;\n}\n\n/**\n * Build srcset and sizes strings entirely client-side\n * (no API call — for use with Next.js custom loader or static generation).\n */\nexport function buildSrcSet(\n path: string,\n params: Record<string, string | number> = {},\n widths: number[] = NAMED_SETS.retina,\n options: { baseUrl?: string; deliveryPath?: string } = {}\n): { srcset: string; sizes: string } {\n const entries = widths.map((w) =>\n `${buildDeliveryUrl(path, { ...params, w }, options)} ${w}w`\n );\n\n const sizes = widths\n .map((w) => `(max-width: ${w}px) 100vw`)\n .concat('100vw')\n .join(', ');\n\n return {\n srcset: entries.join(', '),\n sizes,\n };\n}\n","'use client';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — useSmartGlide Hook\n// Fetches image data from the Laravel /img-data API endpoint.\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport type { SmartGlideData, SmartGlideOptions } from './types';\nimport { buildDataUrl, buildDeliveryUrl, buildSrcSet, resolveWidths } from './url-builder';\n\nexport interface UseSmartGlideResult {\n /** Final signed delivery URL (ready for `<img src>`). */\n src: string;\n /** Responsive srcset string. */\n srcset: string | null;\n /** Sizes attribute. */\n sizes: string | null;\n /** Base64 LQIP blur data URI for placeholder. */\n blurDataUrl: string | null;\n /** JSON-LD ImageObject schema data. */\n schema: Record<string, unknown> | null;\n /** True while fetching from the API. */\n isLoading: boolean;\n /** Error if the fetch failed. */\n error: Error | null;\n /** Manually re-fetch the data. */\n refetch: () => void;\n}\n\n/**\n * Fetch Smart Glide image data from the Laravel API.\n *\n * @example\n * const { src, srcset, sizes, blurDataUrl } = useSmartGlide({\n * path: 'products/phone.jpg',\n * profile: 'hero',\n * responsive: 'retina',\n * blurPlaceholder: true,\n * baseUrl: process.env.NEXT_PUBLIC_API_URL,\n * });\n */\nexport function useSmartGlide(options: SmartGlideOptions): UseSmartGlideResult {\n const {\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder,\n schema,\n params,\n fetchOptions,\n } = options;\n\n const [data, setData] = useState<SmartGlideData | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchCounter = useRef(0);\n\n const fetchData = useCallback(async () => {\n const id = ++fetchCounter.current;\n setIsLoading(true);\n setError(null);\n\n try {\n const url = buildDataUrl(path, { path, baseUrl, profile, responsive, blurPlaceholder, schema, params });\n const response = await fetch(url, {\n headers: { Accept: 'application/json' },\n ...fetchOptions,\n });\n\n if (!response.ok) {\n throw new Error(`Smart Glide API error: ${response.status} ${response.statusText}`);\n }\n\n const json: SmartGlideData = await response.json();\n\n if (id === fetchCounter.current) {\n setData(json);\n }\n } catch (err) {\n if (id === fetchCounter.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (id === fetchCounter.current) {\n setIsLoading(false);\n }\n }\n }, [path, baseUrl, profile, JSON.stringify(responsive), blurPlaceholder, schema, JSON.stringify(params)]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n src: data?.src ?? buildDeliveryUrl(path, params ?? {}, { baseUrl }),\n srcset: data?.srcset ?? null,\n sizes: data?.sizes ?? null,\n blurDataUrl: data?.blurDataUrl ?? null,\n schema: data?.schema ?? null,\n isLoading,\n error,\n refetch: fetchData,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useSmartGlideStatic — No API call, builds URLs client-side\n// Best used with Next.js ISR or static export where you already know the params\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UseSmartGlideStaticResult {\n src: string;\n srcset: string;\n sizes: string;\n}\n\n/**\n * Build image URLs entirely client-side — no API fetch required.\n * Ideal for Next.js App Router with `generateStaticParams` or ISR.\n *\n * NOTE: URLs generated here are **unsigned**. Use this only in development\n * or when `SMART_GLIDE_SECURE=false` on your Laravel backend.\n * For signed URLs, use `useSmartGlide` or server-side data fetching.\n */\nexport function useSmartGlideStatic(options: SmartGlideOptions): UseSmartGlideStaticResult {\n const { path, baseUrl, profile, responsive, params } = options;\n\n const glideParams: Record<string, string | number> = { ...params };\n if (profile) glideParams.profile = profile;\n\n const widths = resolveWidths(responsive);\n const { srcset, sizes } = buildSrcSet(path, glideParams, widths, { baseUrl });\n const src = buildDeliveryUrl(path, glideParams, { baseUrl });\n\n return { src, srcset, sizes };\n}\n","'use client';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — Components\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport React, { useState, useCallback, forwardRef } from 'react';\nimport type { SmartGlideImageProps, SmartGlideOptions } from './types';\nimport { useSmartGlide } from './hooks';\nimport { buildDeliveryUrl, buildSrcSet, resolveWidths } from './url-builder';\n\n// ─── Internal: Blur Placeholder ───────────────────────────────────────────────\n\ninterface BlurOverlayProps {\n blurDataUrl: string;\n isVisible: boolean;\n}\n\nconst BlurOverlay: React.FC<BlurOverlayProps> = ({ blurDataUrl, isVisible }) => (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n inset: 0,\n backgroundImage: `url(${blurDataUrl})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n filter: 'blur(20px)',\n transform: 'scale(1.05)',\n transition: 'opacity 0.4s ease',\n opacity: isVisible ? 1 : 0,\n pointerEvents: 'none',\n }}\n />\n);\n\n// ─── Internal: JSON-LD Schema ─────────────────────────────────────────────────\n\ninterface SchemaScriptProps {\n schema: Record<string, unknown>;\n}\n\nconst SchemaScript: React.FC<SchemaScriptProps> = ({ schema }) => (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}\n />\n);\n\n// ─── SmartGlideImage ──────────────────────────────────────────────────────────\n\n/**\n * A full-featured, SEO-optimised `<img>` component backed by Laravel Smart Glide.\n *\n * @example\n * <SmartGlideImage\n * path=\"products/phone.jpg\"\n * alt=\"Awesome Phone\"\n * profile=\"hero\"\n * responsive=\"retina\"\n * />\n *\n * @example\n * <SmartGlideImage\n * path=\"home/hero.jpg\"\n * alt=\"Hero banner\"\n * profile=\"hero\"\n * priority\n * placeholder=\"blur\"\n * blurPlaceholder\n * schema\n * width={1600}\n * height={900}\n * />\n */\nexport const SmartGlideImage = forwardRef<HTMLImageElement, SmartGlideImageProps>(\n function SmartGlideImage(props, ref) {\n const {\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder: fetchBlur = false,\n schema: emitSchema = false,\n params,\n fetchOptions,\n priority = false,\n placeholder = 'empty',\n aspectRatio,\n alt,\n width,\n height,\n className,\n style,\n onLoad,\n onError,\n } = props;\n\n const shouldFetchBlur = placeholder === 'blur' || fetchBlur;\n\n const { src, srcset, sizes, blurDataUrl, schema } = useSmartGlide({\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder: shouldFetchBlur,\n schema: emitSchema,\n params,\n fetchOptions,\n });\n\n const [imgLoaded, setImgLoaded] = useState(false);\n const showBlur = shouldFetchBlur && !!blurDataUrl && !imgLoaded;\n\n const handleLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImgLoaded(true);\n onLoad?.(e);\n },\n [onLoad]\n );\n\n const handleError = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImgLoaded(true);\n onError?.(e);\n },\n [onError]\n );\n\n const composedStyle: React.CSSProperties = {\n ...style,\n ...(aspectRatio ? { aspectRatio } : {}),\n };\n\n // Wrapper needed only for blur placeholder\n if (shouldFetchBlur && blurDataUrl) {\n return (\n <>\n <span\n style={{\n position: 'relative',\n display: 'inline-block',\n overflow: 'hidden',\n width: width ? `${width}px` : undefined,\n height: height ? `${height}px` : undefined,\n aspectRatio,\n }}\n >\n <BlurOverlay blurDataUrl={blurDataUrl} isVisible={showBlur} />\n <img\n ref={ref}\n src={src}\n srcSet={srcset ?? undefined}\n sizes={sizes ?? undefined}\n alt={alt}\n width={width}\n height={height}\n className={className}\n style={{ ...composedStyle, display: 'block', width: '100%', height: '100%', objectFit: 'cover' }}\n loading={priority ? 'eager' : 'lazy'}\n fetchPriority={priority ? 'high' : 'auto'}\n decoding=\"async\"\n onLoad={handleLoad}\n onError={handleError}\n />\n </span>\n {schema && <SchemaScript schema={schema} />}\n </>\n );\n }\n\n return (\n <>\n <img\n ref={ref}\n src={src}\n srcSet={srcset ?? undefined}\n sizes={sizes ?? undefined}\n alt={alt}\n width={width}\n height={height}\n className={className}\n style={composedStyle}\n loading={priority ? 'eager' : 'lazy'}\n fetchPriority={priority ? 'high' : 'auto'}\n decoding=\"async\"\n onLoad={onLoad}\n onError={onError}\n />\n {emitSchema && schema && <SchemaScript schema={schema} />}\n </>\n );\n }\n);\n\nSmartGlideImage.displayName = 'SmartGlideImage';\n\n// ─── SmartGlidePicture ────────────────────────────────────────────────────────\n\nexport interface SmartGlidePictureSource {\n media?: string;\n widths?: number[];\n responsive?: string | number[];\n params?: Record<string, string | number>;\n type?: string;\n}\n\nexport interface SmartGlidePictureProps extends SmartGlideImageProps {\n sources?: SmartGlidePictureSource[];\n}\n\n/**\n * `<picture>` component with multiple `<source>` breakpoints\n * plus a Smart Glide powered `<img>` fallback.\n */\nexport const SmartGlidePicture = forwardRef<HTMLImageElement, SmartGlidePictureProps>(\n function SmartGlidePicture(props, ref) {\n const {\n sources = [],\n path,\n baseUrl,\n params,\n alt,\n profile,\n blurPlaceholder,\n schema,\n fetchOptions,\n priority,\n placeholder,\n aspectRatio,\n width,\n height,\n className,\n style,\n onLoad,\n onError,\n } = props;\n\n return (\n <picture>\n {sources.map((source, i: number) => {\n const widths = source.widths ?? resolveWidths(source.responsive as string | number[] | false | undefined);\n const mergedParams = { ...(params ?? {}), ...(source.params ?? {}) };\n const { srcset } = buildSrcSet(path, mergedParams, widths, { baseUrl });\n\n return (\n <source\n key={i}\n media={source.media}\n srcSet={srcset}\n type={source.type}\n />\n );\n })}\n <SmartGlideImage\n ref={ref}\n path={path}\n baseUrl={baseUrl}\n params={params}\n alt={alt}\n profile={profile}\n blurPlaceholder={blurPlaceholder}\n schema={schema}\n fetchOptions={fetchOptions}\n priority={priority}\n placeholder={placeholder}\n aspectRatio={aspectRatio}\n width={width}\n height={height}\n className={className}\n style={style}\n onLoad={onLoad}\n onError={onError}\n />\n </picture>\n );\n }\n);\n\nSmartGlidePicture.displayName = 'SmartGlidePicture';\n\n// ─── SmartGlideBackground ─────────────────────────────────────────────────────\n\nexport interface SmartGlideBackgroundProps extends SmartGlideOptions {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n}\n\n/**\n * CSS background-image container backed by Smart Glide.\n */\nexport const SmartGlideBackground: React.FC<SmartGlideBackgroundProps> = ({\n path,\n baseUrl,\n profile,\n responsive,\n params,\n blurPlaceholder: fetchBlur,\n children,\n className,\n style,\n 'aria-label': ariaLabel,\n}) => {\n const glideParams: Record<string, string | number> = { ...(params ?? {}) };\n if (profile) glideParams.profile = profile;\n\n const widths = resolveWidths(responsive);\n const primaryWidth = widths[widths.length - 1] ?? 1920;\n const primarySrc = buildDeliveryUrl(path, { ...glideParams, w: primaryWidth }, { baseUrl });\n\n const { blurDataUrl } = useSmartGlide({\n path,\n baseUrl,\n profile,\n responsive,\n blurPlaceholder: !!fetchBlur,\n params,\n });\n\n const mediaStyles = widths\n .slice()\n .reverse()\n .map((w) => {\n const url = buildDeliveryUrl(path, { ...glideParams, w }, { baseUrl });\n return `@media (max-width: ${w}px) { .sg-bg-${w} { background-image: url('${url}'); } }`;\n })\n .join('\\n');\n\n return (\n <>\n {mediaStyles && (\n <style dangerouslySetInnerHTML={{ __html: mediaStyles }} />\n )}\n <div\n role=\"img\"\n aria-label={ariaLabel}\n className={className}\n style={{\n backgroundImage: blurDataUrl\n ? `url('${primarySrc}'), url('${blurDataUrl}')`\n : `url('${primarySrc}')`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n ...style,\n }}\n >\n {children}\n </div>\n </>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// smart-glide-react — SmartGlideProvider\n// Global configuration context — set baseUrl once, use everywhere.\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport React, { createContext, useContext } from 'react';\n\nexport interface SmartGlideConfig {\n /** Base URL of your Laravel application (e.g. `\"https://api.example.com\"`). */\n baseUrl?: string;\n\n /** Delivery path prefix (default: `\"/img\"`). */\n deliveryPath?: string;\n\n /** Data API path prefix (default: `\"/img-data\"`). */\n dataPath?: string;\n\n /** Default image profile to apply when none is specified. */\n defaultProfile?: string;\n\n /** Default responsive set name or widths. */\n defaultResponsive?: string | number[];\n\n /** Emit JSON-LD `ImageObject` by default for all images. */\n defaultSchema?: boolean;\n}\n\nconst SmartGlideContext = createContext<SmartGlideConfig>({});\n\nexport function useSmartGlideConfig(): SmartGlideConfig {\n return useContext(SmartGlideContext);\n}\n\nexport interface SmartGlideProviderProps {\n config: SmartGlideConfig;\n children: React.ReactNode;\n}\n\n/**\n * Wrap your application (or part of it) with `<SmartGlideProvider>` to\n * configure Smart Glide globally. Individual components/hooks can still\n * override any option locally.\n *\n * @example\n * // app/layout.tsx (Next.js App Router)\n * import { SmartGlideProvider } from 'smart-glide-react';\n *\n * export default function RootLayout({ children }) {\n * return (\n * <SmartGlideProvider config={{ baseUrl: process.env.NEXT_PUBLIC_API_URL }}>\n * {children}\n * </SmartGlideProvider>\n * );\n * }\n */\nexport function SmartGlideProvider({ config, children }: SmartGlideProviderProps) {\n return (\n <SmartGlideContext.Provider value={config}>\n {children}\n </SmartGlideContext.Provider>\n );\n}\n"]}
@@ -0,0 +1,21 @@
1
+ interface SmartGlideLoaderConfig {
2
+ src: string;
3
+ width: number;
4
+ quality?: number;
5
+ }
6
+ /**
7
+ * Smart Glide loader for `next/image`.
8
+ *
9
+ * Usage in `smart-glide-loader.ts` (project root):
10
+ * ```ts
11
+ * export { smartGlideNextLoader as default } from 'smart-glide-react/next';
12
+ * ```
13
+ *
14
+ * Then in `next.config.ts`:
15
+ * ```ts
16
+ * images: { loader: 'custom', loaderFile: './smart-glide-loader.ts' }
17
+ * ```
18
+ */
19
+ declare function smartGlideNextLoader({ src, width, quality, }: SmartGlideLoaderConfig): string;
20
+
21
+ export { type SmartGlideLoaderConfig, smartGlideNextLoader as default, smartGlideNextLoader };
package/dist/next.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ interface SmartGlideLoaderConfig {
2
+ src: string;
3
+ width: number;
4
+ quality?: number;
5
+ }
6
+ /**
7
+ * Smart Glide loader for `next/image`.
8
+ *
9
+ * Usage in `smart-glide-loader.ts` (project root):
10
+ * ```ts
11
+ * export { smartGlideNextLoader as default } from 'smart-glide-react/next';
12
+ * ```
13
+ *
14
+ * Then in `next.config.ts`:
15
+ * ```ts
16
+ * images: { loader: 'custom', loaderFile: './smart-glide-loader.ts' }
17
+ * ```
18
+ */
19
+ declare function smartGlideNextLoader({ src, width, quality, }: SmartGlideLoaderConfig): string;
20
+
21
+ export { type SmartGlideLoaderConfig, smartGlideNextLoader as default, smartGlideNextLoader };
package/dist/next.js ADDED
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ // src/next.ts
6
+ function smartGlideNextLoader({
7
+ src,
8
+ width,
9
+ quality = 80
10
+ }) {
11
+ const base = (process.env.NEXT_PUBLIC_SMART_GLIDE_URL ?? "").replace(/\/$/, "");
12
+ const prefix = (process.env.NEXT_PUBLIC_SMART_GLIDE_DELIVERY_PATH ?? "/img").replace(/^\//, "");
13
+ const cleanSrc = src.replace(/^\//, "");
14
+ return `${base}/${prefix}/${cleanSrc}?w=${width}&q=${quality}&fm=webp`;
15
+ }
16
+ var next_default = smartGlideNextLoader;
17
+
18
+ exports.default = next_default;
19
+ exports.smartGlideNextLoader = smartGlideNextLoader;
20
+ //# sourceMappingURL=next.js.map
21
+ //# sourceMappingURL=next.js.map