@vite-mf-monorepo/ui 0.4.13 → 0.4.15

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,2 +1,2 @@
1
- "use client";import{Fragment as r,jsx as e,jsxs as n}from"react/jsx-runtime";import{Skeleton as a}from"../../Skeleton";import{NextImage as u}from"../Image";function o({backdropPath:t,title:l}){const i=t?`https://image.tmdb.org/t/p/original${t}`:void 0;return n(r,{children:[i?e(u,{src:i,alt:l??"Unknown",preload:!0,sizes:"100vw",className:"ui:h-full ui:w-full",fallback:e(a,{"data-testid":"hero-image-skeleton",variant:"rectangle",width:"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0",aspectRatio:"21/9",rounded:!1})}):e(a,{"data-testid":"hero-image-skeleton",variant:"rectangle",width:"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0",aspectRatio:"21/9",rounded:!1}),e("div",{className:"ui:absolute ui:inset-0 ui:bg-gradient-to-t ui:from-black/80 ui:via-black/40 ui:to-transparent ui:z-1 ui:top-0 ui:left-0 ui:right-0 ui:bottom-0"})]})}var g=o;export{g as default};
1
+ "use client";import{Fragment as r,jsx as e,jsxs as n}from"react/jsx-runtime";import{Skeleton as a}from"../../Skeleton";import{NextImage as u}from"../Image";function o({backdropPath:i,title:l}){const t=i?`https://image.tmdb.org/t/p/original${i}`:void 0;return n(r,{children:[t?e(u,{src:t,alt:l??"Unknown",fill:!0,preload:!0,sizes:"100vw",className:"ui:relative ui:h-full ui:w-full ui:z-0",imageClassName:"ui:object-cover ui:object-center",fallback:e(a,{"data-testid":"hero-image-skeleton",variant:"rectangle",width:"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0",aspectRatio:"21/9",rounded:!1})}):e(a,{"data-testid":"hero-image-skeleton",variant:"rectangle",width:"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0",aspectRatio:"21/9",rounded:!1}),e("div",{className:"ui:absolute ui:inset-0 ui:bg-gradient-to-t ui:from-black/80 ui:via-black/40 ui:to-transparent ui:z-1 ui:top-0 ui:left-0 ui:right-0 ui:bottom-0"})]})}var c=o;export{c as default};
2
2
  //# sourceMappingURL=HeroImage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/next/HeroImage/HeroImage.tsx"],"sourcesContent":["'use client'\n\nimport { Skeleton } from '../../Skeleton'\nimport { NextImage } from '../Image'\n\nexport interface NextHeroImageProps {\n /** Backdrop path from TMDB API (e.g. \"/abc123.jpg\") */\n backdropPath?: string | null\n /** Alt text for the image */\n title?: string | null\n}\n\nfunction HeroImage({ backdropPath, title }: Readonly<NextHeroImageProps>) {\n const src = backdropPath\n ? `https://image.tmdb.org/t/p/original${backdropPath}`\n : undefined\n\n return (\n <>\n {src ? (\n <NextImage\n src={src}\n alt={title ?? 'Unknown'}\n preload\n sizes=\"100vw\"\n className=\"ui:h-full ui:w-full\"\n fallback={\n <Skeleton\n data-testid=\"hero-image-skeleton\"\n variant=\"rectangle\"\n width=\"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0\"\n aspectRatio=\"21/9\"\n rounded={false}\n />\n }\n />\n ) : (\n <Skeleton\n data-testid=\"hero-image-skeleton\"\n variant=\"rectangle\"\n width=\"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0\"\n aspectRatio=\"21/9\"\n rounded={false}\n />\n )}\n {/* Gradient Overlay */}\n <div className=\"ui:absolute ui:inset-0 ui:bg-gradient-to-t ui:from-black/80 ui:via-black/40 ui:to-transparent ui:z-1 ui:top-0 ui:left-0 ui:right-0 ui:bottom-0\" />\n </>\n )\n}\n\nexport default HeroImage\n"],"mappings":"aAkBI,mBAAAA,EASQ,OAAAC,EATR,QAAAC,MAAA,oBAhBJ,OAAS,YAAAC,MAAgB,iBACzB,OAAS,aAAAC,MAAiB,WAS1B,SAASC,EAAU,CAAE,aAAAC,EAAc,MAAAC,CAAM,EAAiC,CACxE,MAAMC,EAAMF,EACR,sCAAsCA,CAAY,GAClD,OAEJ,OACEJ,EAAAF,EAAA,CACG,UAAAQ,EACCP,EAACG,EAAA,CACC,IAAKI,EACL,IAAKD,GAAS,UACd,QAAO,GACP,MAAM,QACN,UAAU,sBACV,SACEN,EAACE,EAAA,CACC,cAAY,sBACZ,QAAQ,YACR,MAAM,wDACN,YAAY,OACZ,QAAS,GACX,EAEJ,EAEAF,EAACE,EAAA,CACC,cAAY,sBACZ,QAAQ,YACR,MAAM,wDACN,YAAY,OACZ,QAAS,GACX,EAGFF,EAAC,OAAI,UAAU,iJAAiJ,GAClK,CAEJ,CAEA,IAAOQ,EAAQJ","names":["Fragment","jsx","jsxs","Skeleton","NextImage","HeroImage","backdropPath","title","src","HeroImage_default"]}
1
+ {"version":3,"sources":["../../../src/next/HeroImage/HeroImage.tsx"],"sourcesContent":["'use client'\n\nimport { Skeleton } from '../../Skeleton'\nimport { NextImage } from '../Image'\n\nexport interface NextHeroImageProps {\n /** Backdrop path from TMDB API (e.g. \"/abc123.jpg\") */\n backdropPath?: string | null\n /** Alt text for the image */\n title?: string | null\n}\n\nfunction HeroImage({ backdropPath, title }: Readonly<NextHeroImageProps>) {\n const src = backdropPath\n ? `https://image.tmdb.org/t/p/original${backdropPath}`\n : undefined\n\n return (\n <>\n {src ? (\n <NextImage\n src={src}\n alt={title ?? 'Unknown'}\n fill\n preload\n sizes=\"100vw\"\n className=\"ui:relative ui:h-full ui:w-full ui:z-0\"\n imageClassName=\"ui:object-cover ui:object-center\"\n fallback={\n <Skeleton\n data-testid=\"hero-image-skeleton\"\n variant=\"rectangle\"\n width=\"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0\"\n aspectRatio=\"21/9\"\n rounded={false}\n />\n }\n />\n ) : (\n <Skeleton\n data-testid=\"hero-image-skeleton\"\n variant=\"rectangle\"\n width=\"ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0\"\n aspectRatio=\"21/9\"\n rounded={false}\n />\n )}\n {/* Gradient Overlay */}\n <div className=\"ui:absolute ui:inset-0 ui:bg-gradient-to-t ui:from-black/80 ui:via-black/40 ui:to-transparent ui:z-1 ui:top-0 ui:left-0 ui:right-0 ui:bottom-0\" />\n </>\n )\n}\n\nexport default HeroImage\n"],"mappings":"aAkBI,mBAAAA,EAWQ,OAAAC,EAXR,QAAAC,MAAA,oBAhBJ,OAAS,YAAAC,MAAgB,iBACzB,OAAS,aAAAC,MAAiB,WAS1B,SAASC,EAAU,CAAE,aAAAC,EAAc,MAAAC,CAAM,EAAiC,CACxE,MAAMC,EAAMF,EACR,sCAAsCA,CAAY,GAClD,OAEJ,OACEJ,EAAAF,EAAA,CACG,UAAAQ,EACCP,EAACG,EAAA,CACC,IAAKI,EACL,IAAKD,GAAS,UACd,KAAI,GACJ,QAAO,GACP,MAAM,QACN,UAAU,yCACV,eAAe,mCACf,SACEN,EAACE,EAAA,CACC,cAAY,sBACZ,QAAQ,YACR,MAAM,wDACN,YAAY,OACZ,QAAS,GACX,EAEJ,EAEAF,EAACE,EAAA,CACC,cAAY,sBACZ,QAAQ,YACR,MAAM,wDACN,YAAY,OACZ,QAAS,GACX,EAGFF,EAAC,OAAI,UAAU,iJAAiJ,GAClK,CAEJ,CAEA,IAAOQ,EAAQJ","names":["Fragment","jsx","jsxs","Skeleton","NextImage","HeroImage","backdropPath","title","src","HeroImage_default"]}
@@ -3,6 +3,6 @@ import { NextImageProps } from './NextImage.types.js';
3
3
  import 'next/image';
4
4
  import 'react';
5
5
 
6
- declare function NextImage({ fallback, aspectRatio, blurDataURL, className, onLoad, onError, style, ...rest }: Readonly<NextImageProps>): react_jsx_runtime.JSX.Element;
6
+ declare function NextImage({ fallback, aspectRatio, blurDataURL, className, imageClassName, onLoad, onError, style, ...rest }: Readonly<NextImageProps>): react_jsx_runtime.JSX.Element;
7
7
 
8
8
  export { NextImage as default };
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import s from"clsx";import I from"next/image";import{useCallback as c,useEffect as v,useRef as E,useState as N}from"react";import{Icon as S}from"../../Icon";function x({fallback:f,aspectRatio:m,blurDataURL:n,className:d,onLoad:a,onError:o,style:u,...p}){const[i,r]=N("loading"),l=E(null);v(()=>{const e=l.current?.querySelector("img");e?.complete&&e.naturalWidth>0&&r("loaded")},[]);const y=c(e=>{r("loaded"),typeof a=="function"&&a(e)},[a]),g=c(e=>{r("error"),typeof o=="function"&&o(e)},[o]),h=t("div",{className:"ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:bg-muted",children:t(S,{name:"Photo",size:48,className:"ui:text-muted-foreground","aria-hidden":"true"})});return t("div",{className:s("ui:relative ui:overflow-hidden ui:bg-muted",d),style:m?{aspectRatio:m,...u}:u,"data-state":i,ref:l,children:i==="error"?f??h:t(I,{...p,className:s("ui:transition-opacity ui:duration-300",i==="loaded"?"ui:opacity-100":"ui:opacity-0"),onLoad:y,onError:g,placeholder:n?"blur":"empty",blurDataURL:n})})}var H=x;export{H as default};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import s from"clsx";import v from"next/image";import{useCallback as c,useEffect as E,useRef as N,useState as S}from"react";import{Icon as x}from"../../Icon";function b({fallback:f,aspectRatio:m,blurDataURL:n,className:d,imageClassName:p,onLoad:a,onError:o,style:u,...y}){const[i,r]=S("loading"),l=N(null);E(()=>{const e=l.current?.querySelector("img");e?.complete&&e.naturalWidth>0&&r("loaded")},[]);const g=c(e=>{r("loaded"),typeof a=="function"&&a(e)},[a]),h=c(e=>{r("error"),typeof o=="function"&&o(e)},[o]),I=t("div",{className:"ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:bg-muted",children:t(x,{name:"Photo",size:48,className:"ui:text-muted-foreground","aria-hidden":"true"})});return t("div",{className:s("ui:relative ui:overflow-hidden ui:bg-muted",d),style:m?{aspectRatio:m,...u}:u,"data-state":i,ref:l,children:i==="error"?f??I:t(v,{...y,className:s("ui:transition-opacity ui:duration-300",i==="loaded"?"ui:opacity-100":"ui:opacity-0",p),onLoad:g,onError:h,placeholder:n?"blur":"empty",blurDataURL:n})})}var M=b;export{M as default};
2
2
  //# sourceMappingURL=NextImage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/next/Image/NextImage.tsx"],"sourcesContent":["'use client'\n\nimport clsx from 'clsx'\nimport Image from 'next/image'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Icon } from '../../Icon'\n\nimport type { NextImageProps } from './NextImage.types'\nimport type { ImageState } from '../../Image'\nimport type { SyntheticEvent } from 'react'\n\nfunction NextImage({\n fallback,\n aspectRatio,\n blurDataURL,\n className,\n onLoad,\n onError,\n style,\n ...rest\n}: Readonly<NextImageProps>) {\n const [state, setState] = useState<ImageState>('loading')\n\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const img = wrapperRef.current?.querySelector('img')\n\n if (img?.complete && img.naturalWidth > 0) {\n setState('loaded')\n }\n }, [])\n\n const handleLoad = useCallback(\n (e: SyntheticEvent<HTMLImageElement>) => {\n setState('loaded')\n\n if (typeof onLoad === 'function') {\n onLoad(e as Parameters<typeof onLoad>[0])\n }\n },\n [onLoad]\n )\n\n const handleError = useCallback(\n (e: SyntheticEvent<HTMLImageElement>) => {\n setState('error')\n\n if (typeof onError === 'function') {\n onError(e as Parameters<typeof onError>[0])\n }\n },\n [onError]\n )\n\n const defaultFallback = (\n <div className=\"ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:bg-muted\">\n <Icon\n name=\"Photo\"\n size={48}\n className=\"ui:text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </div>\n )\n\n return (\n <div\n className={clsx('ui:relative ui:overflow-hidden ui:bg-muted', className)}\n style={aspectRatio ? { aspectRatio, ...style } : style}\n data-state={state}\n ref={wrapperRef}\n >\n {state === 'error' ? (\n (fallback ?? defaultFallback)\n ) : (\n <Image\n {...rest}\n className={clsx(\n 'ui:transition-opacity ui:duration-300',\n state === 'loaded' ? 'ui:opacity-100' : 'ui:opacity-0'\n )}\n onLoad={handleLoad}\n onError={handleError}\n placeholder={blurDataURL ? 'blur' : 'empty'}\n blurDataURL={blurDataURL}\n />\n )}\n </div>\n )\n}\n\nexport default NextImage\n"],"mappings":"aA0DM,cAAAA,MAAA,oBAxDN,OAAOC,MAAU,OACjB,OAAOC,MAAW,aAClB,OAAS,eAAAC,EAAa,aAAAC,EAAW,UAAAC,EAAQ,YAAAC,MAAgB,QAEzD,OAAS,QAAAC,MAAY,aAMrB,SAASC,EAAU,CACjB,SAAAC,EACA,YAAAC,EACA,YAAAC,EACA,UAAAC,EACA,OAAAC,EACA,QAAAC,EACA,MAAAC,EACA,GAAGC,CACL,EAA6B,CAC3B,KAAM,CAACC,EAAOC,CAAQ,EAAIZ,EAAqB,SAAS,EAElDa,EAAad,EAAuB,IAAI,EAE9CD,EAAU,IAAM,CACd,MAAMgB,EAAMD,EAAW,SAAS,cAAc,KAAK,EAE/CC,GAAK,UAAYA,EAAI,aAAe,GACtCF,EAAS,QAAQ,CAErB,EAAG,CAAC,CAAC,EAEL,MAAMG,EAAalB,EAChB,GAAwC,CACvCe,EAAS,QAAQ,EAEb,OAAOL,GAAW,YACpBA,EAAO,CAAiC,CAE5C,EACA,CAACA,CAAM,CACT,EAEMS,EAAcnB,EACjB,GAAwC,CACvCe,EAAS,OAAO,EAEZ,OAAOJ,GAAY,YACrBA,EAAQ,CAAkC,CAE9C,EACA,CAACA,CAAO,CACV,EAEMS,EACJvB,EAAC,OAAI,UAAU,4EACb,SAAAA,EAACO,EAAA,CACC,KAAK,QACL,KAAM,GACN,UAAU,2BACV,cAAY,OACd,EACF,EAGF,OACEP,EAAC,OACC,UAAWC,EAAK,6CAA8CW,CAAS,EACvE,MAAOF,EAAc,CAAE,YAAAA,EAAa,GAAGK,CAAM,EAAIA,EACjD,aAAYE,EACZ,IAAKE,EAEJ,SAAAF,IAAU,QACRR,GAAYc,EAEbvB,EAACE,EAAA,CACE,GAAGc,EACJ,UAAWf,EACT,wCACAgB,IAAU,SAAW,iBAAmB,cAC1C,EACA,OAAQI,EACR,QAASC,EACT,YAAaX,EAAc,OAAS,QACpC,YAAaA,EACf,EAEJ,CAEJ,CAEA,IAAOa,EAAQhB","names":["jsx","clsx","Image","useCallback","useEffect","useRef","useState","Icon","NextImage","fallback","aspectRatio","blurDataURL","className","onLoad","onError","style","rest","state","setState","wrapperRef","img","handleLoad","handleError","defaultFallback","NextImage_default"]}
1
+ {"version":3,"sources":["../../../src/next/Image/NextImage.tsx"],"sourcesContent":["'use client'\n\nimport clsx from 'clsx'\nimport Image from 'next/image'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Icon } from '../../Icon'\n\nimport type { NextImageProps } from './NextImage.types'\nimport type { ImageState } from '../../Image'\nimport type { SyntheticEvent } from 'react'\n\nfunction NextImage({\n fallback,\n aspectRatio,\n blurDataURL,\n className,\n imageClassName,\n onLoad,\n onError,\n style,\n ...rest\n}: Readonly<NextImageProps>) {\n const [state, setState] = useState<ImageState>('loading')\n\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const img = wrapperRef.current?.querySelector('img')\n\n if (img?.complete && img.naturalWidth > 0) {\n setState('loaded')\n }\n }, [])\n\n const handleLoad = useCallback(\n (e: SyntheticEvent<HTMLImageElement>) => {\n setState('loaded')\n\n if (typeof onLoad === 'function') {\n onLoad(e as Parameters<typeof onLoad>[0])\n }\n },\n [onLoad]\n )\n\n const handleError = useCallback(\n (e: SyntheticEvent<HTMLImageElement>) => {\n setState('error')\n\n if (typeof onError === 'function') {\n onError(e as Parameters<typeof onError>[0])\n }\n },\n [onError]\n )\n\n const defaultFallback = (\n <div className=\"ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:bg-muted\">\n <Icon\n name=\"Photo\"\n size={48}\n className=\"ui:text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </div>\n )\n\n return (\n <div\n className={clsx('ui:relative ui:overflow-hidden ui:bg-muted', className)}\n style={aspectRatio ? { aspectRatio, ...style } : style}\n data-state={state}\n ref={wrapperRef}\n >\n {state === 'error' ? (\n (fallback ?? defaultFallback)\n ) : (\n <Image\n {...rest}\n className={clsx(\n 'ui:transition-opacity ui:duration-300',\n state === 'loaded' ? 'ui:opacity-100' : 'ui:opacity-0',\n imageClassName\n )}\n onLoad={handleLoad}\n onError={handleError}\n placeholder={blurDataURL ? 'blur' : 'empty'}\n blurDataURL={blurDataURL}\n />\n )}\n </div>\n )\n}\n\nexport default NextImage\n"],"mappings":"aA2DM,cAAAA,MAAA,oBAzDN,OAAOC,MAAU,OACjB,OAAOC,MAAW,aAClB,OAAS,eAAAC,EAAa,aAAAC,EAAW,UAAAC,EAAQ,YAAAC,MAAgB,QAEzD,OAAS,QAAAC,MAAY,aAMrB,SAASC,EAAU,CACjB,SAAAC,EACA,YAAAC,EACA,YAAAC,EACA,UAAAC,EACA,eAAAC,EACA,OAAAC,EACA,QAAAC,EACA,MAAAC,EACA,GAAGC,CACL,EAA6B,CAC3B,KAAM,CAACC,EAAOC,CAAQ,EAAIb,EAAqB,SAAS,EAElDc,EAAaf,EAAuB,IAAI,EAE9CD,EAAU,IAAM,CACd,MAAMiB,EAAMD,EAAW,SAAS,cAAc,KAAK,EAE/CC,GAAK,UAAYA,EAAI,aAAe,GACtCF,EAAS,QAAQ,CAErB,EAAG,CAAC,CAAC,EAEL,MAAMG,EAAanB,EAChB,GAAwC,CACvCgB,EAAS,QAAQ,EAEb,OAAOL,GAAW,YACpBA,EAAO,CAAiC,CAE5C,EACA,CAACA,CAAM,CACT,EAEMS,EAAcpB,EACjB,GAAwC,CACvCgB,EAAS,OAAO,EAEZ,OAAOJ,GAAY,YACrBA,EAAQ,CAAkC,CAE9C,EACA,CAACA,CAAO,CACV,EAEMS,EACJxB,EAAC,OAAI,UAAU,4EACb,SAAAA,EAACO,EAAA,CACC,KAAK,QACL,KAAM,GACN,UAAU,2BACV,cAAY,OACd,EACF,EAGF,OACEP,EAAC,OACC,UAAWC,EAAK,6CAA8CW,CAAS,EACvE,MAAOF,EAAc,CAAE,YAAAA,EAAa,GAAGM,CAAM,EAAIA,EACjD,aAAYE,EACZ,IAAKE,EAEJ,SAAAF,IAAU,QACRT,GAAYe,EAEbxB,EAACE,EAAA,CACE,GAAGe,EACJ,UAAWhB,EACT,wCACAiB,IAAU,SAAW,iBAAmB,eACxCL,CACF,EACA,OAAQS,EACR,QAASC,EACT,YAAaZ,EAAc,OAAS,QACpC,YAAaA,EACf,EAEJ,CAEJ,CAEA,IAAOc,EAAQjB","names":["jsx","clsx","Image","useCallback","useEffect","useRef","useState","Icon","NextImage","fallback","aspectRatio","blurDataURL","className","imageClassName","onLoad","onError","style","rest","state","setState","wrapperRef","img","handleLoad","handleError","defaultFallback","NextImage_default"]}
@@ -8,6 +8,8 @@ interface NextImageProps extends Omit<ImageProps, 'placeholder'> {
8
8
  aspectRatio?: string;
9
9
  /** Base64 blur data URL — auto-sets placeholder="blur" when provided */
10
10
  blurDataURL?: string;
11
+ /** Classes applied directly to the `<Image>` element (e.g. object-cover) */
12
+ imageClassName?: string;
11
13
  }
12
14
 
13
15
  export type { NextImageProps };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vite-mf-monorepo/ui",
3
- "version": "0.4.13",
3
+ "version": "0.4.15",
4
4
  "description": "Design system components for vite-mf-monorepo",
5
5
  "type": "module",
6
6
  "publishConfig": {