@vite-mf-monorepo/ui 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Button/index.js +4 -4
- package/dist/Card/index.js +1 -1
- package/dist/Icon/index.js +1 -1
- package/dist/{chunk-2EQIYKZF.js → chunk-6DP3KZQG.js} +3 -3
- package/dist/{chunk-2EQIYKZF.js.map → chunk-6DP3KZQG.js.map} +1 -1
- package/dist/{chunk-JHRISQQJ.js → chunk-6FBMTGXQ.js} +2 -3
- package/dist/chunk-6FBMTGXQ.js.map +1 -0
- package/dist/{chunk-3GCDFSJB.js → chunk-7IAJQE27.js} +5 -5
- package/dist/{chunk-3GCDFSJB.js.map → chunk-7IAJQE27.js.map} +1 -1
- package/dist/chunk-DGJI4VNO.js +3 -0
- package/dist/{chunk-Y5GP5OWN.js.map → chunk-DGJI4VNO.js.map} +1 -1
- package/dist/{chunk-JPJYJLAP.js → chunk-FJZK3PY6.js} +2 -3
- package/dist/chunk-FJZK3PY6.js.map +1 -0
- package/dist/{chunk-FDLKS7BI.js → chunk-IUGKH376.js} +2 -3
- package/dist/chunk-IUGKH376.js.map +1 -0
- package/dist/{chunk-JI3OVXCK.js → chunk-RZU2FFBW.js} +2 -3
- package/dist/chunk-RZU2FFBW.js.map +1 -0
- package/dist/{chunk-WYIIOTWJ.js → chunk-ZTQU4GMY.js} +4 -4
- package/dist/{chunk-WYIIOTWJ.js.map → chunk-ZTQU4GMY.js.map} +1 -1
- package/dist/index.js +12 -12
- package/dist/next/index.js +9 -6
- package/dist/next/index.js.map +1 -1
- package/dist/react-router/index.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-FDLKS7BI.js.map +0 -1
- package/dist/chunk-JHRISQQJ.js.map +0 -1
- package/dist/chunk-JI3OVXCK.js.map +0 -1
- package/dist/chunk-JPJYJLAP.js.map +0 -1
- package/dist/chunk-Y5GP5OWN.js +0 -3
package/dist/Button/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import '../chunk-
|
|
2
|
-
export { Button_default as Button } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
1
|
+
import '../chunk-DGJI4VNO.js';
|
|
2
|
+
export { Button_default as Button } from '../chunk-ZTQU4GMY.js';
|
|
3
|
+
import '../chunk-IUGKH376.js';
|
|
4
|
+
import '../chunk-6FBMTGXQ.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/Card/index.js
CHANGED
package/dist/Icon/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Icon_default } from './chunk-
|
|
1
|
+
import { Icon_default } from './chunk-6FBMTGXQ.js';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
4
|
import { createElement } from 'react';
|
|
@@ -210,5 +210,5 @@ function getMovieCardLinkClasses() {
|
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
export { Rating_default, Typography_default, getMovieCardClasses, getMovieCardLinkClasses };
|
|
213
|
-
//# sourceMappingURL=chunk-
|
|
214
|
-
//# sourceMappingURL=chunk-
|
|
213
|
+
//# sourceMappingURL=chunk-6DP3KZQG.js.map
|
|
214
|
+
//# sourceMappingURL=chunk-6DP3KZQG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Rating/CircleRating.tsx","../src/Rating/StarsRating.tsx","../src/Rating/Rating.tsx","../src/Typography/Typography.tsx","../src/MovieCard/MovieCard.utils.ts"],"names":["jsxs","jsx","clsx"],"mappings":"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","file":"chunk-2EQIYKZF.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { RatingSize } from './Rating'\n\nconst circleSizeMap: Record<\n RatingSize,\n { size: number; stroke: number; fontSize: string }\n> = {\n sm: { size: 32, stroke: 3, fontSize: 'ui:text-xs' },\n md: { size: 48, stroke: 4, fontSize: 'ui:text-sm' },\n lg: { size: 64, stroke: 5, fontSize: 'ui:text-base' },\n}\n\nconst getColorClass = (percent: number): string => {\n if (percent >= 70) return 'ui:text-green-600'\n if (percent >= 40) return 'ui:text-amber-600'\n return 'ui:text-red-500'\n}\n\nexport interface CircleRatingProps {\n /** Percentage value (0-100) for the progress ring */\n percent: number\n /** Size of the rating circle */\n size: RatingSize\n /** Whether to display the numeric value in the center */\n showValue: boolean\n /** The actual rating value (used for display) */\n value: number\n /** Maximum rating value (used for display formatting) */\n max: number\n /** Custom class for the background track circle */\n trackClassName?: string\n}\n\nfunction CircleRating({\n percent,\n size,\n showValue,\n value,\n max,\n trackClassName,\n}: Readonly<CircleRatingProps>) {\n const { size: svgSize, stroke, fontSize } = circleSizeMap[size]\n const radius = (svgSize - stroke) / 2\n const circumference = 2 * Math.PI * radius\n const offset = circumference - (percent / 100) * circumference\n\n return (\n <div className=\"ui:relative ui:inline-flex ui:items-center ui:justify-center\">\n <svg width={svgSize} height={svgSize} className=\"ui:-rotate-90\">\n <circle\n cx={svgSize / 2}\n cy={svgSize / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={stroke}\n className={trackClassName ?? 'ui:text-gray-200'}\n />\n <circle\n cx={svgSize / 2}\n cy={svgSize / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n className={clsx(\n 'ui:transition-all ui:duration-500',\n getColorClass(percent)\n )}\n />\n </svg>\n {showValue && (\n <span\n className={clsx(\n 'ui:absolute ui:font-bold',\n fontSize,\n getColorClass(percent)\n )}\n >\n {max === 100 ? Math.round(percent) : value.toFixed(1)}\n </span>\n )}\n </div>\n )\n}\n\nexport default CircleRating\n","import clsx from 'clsx'\n\nimport { Icon } from '../Icon'\n\nimport type { IconSize } from '../Icon'\nimport type { RatingSize } from './Rating'\n\nconst starsSizeMap: Record<RatingSize, IconSize> = {\n sm: 16,\n md: 20,\n lg: 24,\n}\n\nexport interface StarsRatingProps {\n /** Percentage value (0-100) for the star fill */\n percent: number\n /** Size of the stars */\n size: RatingSize\n /** Whether to display the numeric value next to stars */\n showValue: boolean\n /** The actual rating value (used for display) */\n value: number\n /** Maximum rating value (used for display formatting) */\n max: number\n}\n\nfunction StarsRating({\n percent,\n size,\n showValue,\n value,\n max,\n}: Readonly<StarsRatingProps>) {\n const iconSize = starsSizeMap[size]\n\n return (\n <div className=\"ui:inline-flex ui:items-center ui:gap-1\">\n <div className=\"ui:relative\">\n {/* Empty stars */}\n <div className=\"ui:flex ui:text-gray-300\">\n {[1, 2, 3, 4, 5].map((i) => (\n <Icon key={i} name=\"Star\" size={iconSize} />\n ))}\n </div>\n {/* Filled stars with clip */}\n <div\n className=\"ui:absolute ui:inset-0 ui:flex ui:text-yellow-400\"\n style={{ clipPath: `inset(0 ${String(100 - percent)}% 0 0)` }}\n >\n {[1, 2, 3, 4, 5].map((i) => (\n <Icon key={i} name=\"Star\" size={iconSize} />\n ))}\n </div>\n </div>\n {showValue && (\n <span\n className={clsx(\n 'ui:font-medium ui:text-muted-foreground',\n size === 'sm' && 'ui:text-xs',\n size === 'md' && 'ui:text-sm',\n size === 'lg' && 'ui:text-base'\n )}\n >\n {max === 100 ? (value / 10).toFixed(1) : value.toFixed(1)}\n </span>\n )}\n </div>\n )\n}\n\nexport default StarsRating\n","import clsx from 'clsx'\n\nimport CircleRating from './CircleRating'\nimport StarsRating from './StarsRating'\n\nexport type RatingVariant = 'circle' | 'stars'\nexport type RatingSize = 'sm' | 'md' | 'lg'\n\nexport interface RatingProps {\n /** Rating value (0-10 by default, or 0-100 if max=100) */\n value: number\n /** Maximum value (default: 10 for TMDB scores) */\n max?: number\n /** Visual variant */\n variant?: RatingVariant\n /** Size of the rating */\n size?: RatingSize\n /** Show the numeric value */\n showValue?: boolean\n /** Custom class for the background track circle (circle variant only) */\n trackClassName?: string\n /** Additional class name */\n className?: string\n}\n\nfunction Rating({\n value,\n max = 10,\n variant = 'circle',\n size = 'md',\n showValue = true,\n trackClassName,\n className,\n}: Readonly<RatingProps>) {\n const clampedValue = Math.max(0, Math.min(value, max))\n const percent = (clampedValue / max) * 100\n\n return (\n <div className={clsx('ui:inline-flex', className)}>\n {variant === 'circle' ? (\n <CircleRating\n percent={percent}\n size={size}\n showValue={showValue}\n value={clampedValue}\n max={max}\n trackClassName={trackClassName}\n />\n ) : (\n <StarsRating\n percent={percent}\n size={size}\n showValue={showValue}\n value={clampedValue}\n max={max}\n />\n )}\n </div>\n )\n}\n\nexport default Rating\n","import clsx from 'clsx'\nimport { createElement } from 'react'\n\nimport type { ElementType, HTMLAttributes, ReactNode } from 'react'\n\nexport type TypographyVariant =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'body'\n | 'body-sm'\n | 'body-lg'\n | 'lead'\n | 'caption'\n | 'caption-xs'\n | 'label'\n | 'muted'\n | 'blockquote'\n\nexport interface TypographyProps extends HTMLAttributes<HTMLElement> {\n /** Visual style variant */\n variant: TypographyVariant\n /** Override semantic HTML tag */\n as?: ElementType\n /** Additional CSS classes */\n className?: string\n /** Content */\n children: ReactNode\n}\n\nconst variantStyles: Record<TypographyVariant, string> = {\n h1: 'ui:font-roboto ui:text-xl ui:sm:text-2xl ui:md:text-3xl ui:lg:text-4xl ui:font-bold ui:leading-tight ui:text-foreground',\n h2: 'ui:font-roboto ui:text-lg ui:sm:text-xl ui:md:text-2xl ui:lg:text-3xl ui:font-bold ui:leading-tight ui:text-foreground',\n h3: 'ui:font-roboto ui:text-base ui:sm:text-lg ui:md:text-xl ui:lg:text-2xl ui:font-semibold ui:leading-snug ui:text-foreground',\n h4: 'ui:font-roboto ui:text-sm ui:sm:text-base ui:md:text-lg ui:lg:text-xl ui:font-semibold ui:leading-snug ui:text-foreground',\n h5: 'ui:font-roboto ui:text-sm ui:sm:text-base ui:md:text-lg ui:font-medium ui:leading-normal ui:text-foreground',\n h6: 'ui:font-roboto ui:text-xs ui:sm:text-sm ui:md:text-base ui:font-medium ui:leading-normal ui:text-foreground',\n body: 'ui:font-inter ui:text-xs ui:sm:text-sm ui:md:text-base ui:leading-relaxed ui:text-foreground',\n 'body-sm':\n 'ui:font-inter ui:text-xs ui:sm:text-sm ui:leading-relaxed ui:text-foreground',\n 'body-lg':\n 'ui:font-inter ui:text-sm ui:sm:text-base ui:md:text-lg ui:leading-relaxed ui:text-foreground',\n lead: 'ui:font-inter ui:text-sm ui:sm:text-base ui:md:text-lg ui:lg:text-xl ui:leading-relaxed ui:text-muted-foreground',\n caption: 'ui:font-inter ui:text-xs ui:sm:text-sm ui:text-muted-foreground',\n 'caption-xs': 'ui:font-inter ui:text-xs ui:text-muted-foreground',\n label:\n 'ui:font-inter ui:text-xs ui:sm:text-sm ui:font-medium ui:text-foreground',\n muted: 'ui:font-inter ui:text-xs ui:sm:text-sm ui:text-muted-foreground',\n blockquote:\n 'ui:font-inter ui:text-xs ui:sm:text-sm ui:md:text-base ui:border-l-4 ui:border-border ui:pl-4 ui:italic ui:text-muted-foreground',\n}\n\nconst variantToTag: Record<TypographyVariant, ElementType> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n body: 'p',\n 'body-sm': 'p',\n 'body-lg': 'p',\n lead: 'p',\n caption: 'span',\n 'caption-xs': 'span',\n label: 'label',\n muted: 'p',\n blockquote: 'blockquote',\n}\n\nfunction Typography({\n variant,\n as,\n className,\n children,\n ...rest\n}: Readonly<TypographyProps>) {\n const Component = as ?? variantToTag[variant]\n\n return createElement(\n Component,\n { className: clsx(variantStyles[variant], className), ...rest },\n children\n )\n}\n\nexport default Typography\n","import clsx from 'clsx'\n\nimport type { ImageLoading } from '../Image'\n\nexport interface MovieCardBaseProps {\n /** Media ID */\n id: number\n /** Media title */\n title: string\n /** Poster URL (full URL or TMDB path) */\n posterUrl: string\n /** Vote average (0-10) */\n voteAverage: number\n /** Release year */\n year?: number | null\n /** Additional class name */\n className?: string\n /** Image loading strategy ('lazy' | 'eager'). Default: 'lazy' */\n imageLoading?: ImageLoading\n /** Base64 blur data URL for next/image placeholder=\"blur\" */\n blurDataURL?: string\n}\n\nexport interface MovieCardAsCard extends MovieCardBaseProps {\n as?: 'card' | undefined\n onClick?: never\n}\n\nexport interface MovieCardAsButton extends MovieCardBaseProps {\n as: 'button'\n onClick: () => void\n}\n\nexport function getMovieCardClasses(\n isInteractive: boolean,\n className?: string\n) {\n return clsx(\n 'ui:group ui:relative ui:flex ui:flex-col ui:overflow-hidden',\n isInteractive && [\n 'ui:cursor-pointer',\n 'ui:transition-transform ui:duration-200',\n 'hover:ui:scale-[1.02]',\n ],\n className\n )\n}\n\nexport function getMovieCardLinkClasses() {\n return 'ui:block ui:no-underline ui:text-inherit'\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Rating/CircleRating.tsx","../src/Rating/StarsRating.tsx","../src/Rating/Rating.tsx","../src/Typography/Typography.tsx","../src/MovieCard/MovieCard.utils.ts"],"names":["jsxs","jsx","clsx"],"mappings":"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","file":"chunk-6DP3KZQG.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { RatingSize } from './Rating'\n\nconst circleSizeMap: Record<\n RatingSize,\n { size: number; stroke: number; fontSize: string }\n> = {\n sm: { size: 32, stroke: 3, fontSize: 'ui:text-xs' },\n md: { size: 48, stroke: 4, fontSize: 'ui:text-sm' },\n lg: { size: 64, stroke: 5, fontSize: 'ui:text-base' },\n}\n\nconst getColorClass = (percent: number): string => {\n if (percent >= 70) return 'ui:text-green-600'\n if (percent >= 40) return 'ui:text-amber-600'\n return 'ui:text-red-500'\n}\n\nexport interface CircleRatingProps {\n /** Percentage value (0-100) for the progress ring */\n percent: number\n /** Size of the rating circle */\n size: RatingSize\n /** Whether to display the numeric value in the center */\n showValue: boolean\n /** The actual rating value (used for display) */\n value: number\n /** Maximum rating value (used for display formatting) */\n max: number\n /** Custom class for the background track circle */\n trackClassName?: string\n}\n\nfunction CircleRating({\n percent,\n size,\n showValue,\n value,\n max,\n trackClassName,\n}: Readonly<CircleRatingProps>) {\n const { size: svgSize, stroke, fontSize } = circleSizeMap[size]\n const radius = (svgSize - stroke) / 2\n const circumference = 2 * Math.PI * radius\n const offset = circumference - (percent / 100) * circumference\n\n return (\n <div className=\"ui:relative ui:inline-flex ui:items-center ui:justify-center\">\n <svg width={svgSize} height={svgSize} className=\"ui:-rotate-90\">\n <circle\n cx={svgSize / 2}\n cy={svgSize / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={stroke}\n className={trackClassName ?? 'ui:text-gray-200'}\n />\n <circle\n cx={svgSize / 2}\n cy={svgSize / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n className={clsx(\n 'ui:transition-all ui:duration-500',\n getColorClass(percent)\n )}\n />\n </svg>\n {showValue && (\n <span\n className={clsx(\n 'ui:absolute ui:font-bold',\n fontSize,\n getColorClass(percent)\n )}\n >\n {max === 100 ? Math.round(percent) : value.toFixed(1)}\n </span>\n )}\n </div>\n )\n}\n\nexport default CircleRating\n","import clsx from 'clsx'\n\nimport { Icon } from '../Icon'\n\nimport type { IconSize } from '../Icon'\nimport type { RatingSize } from './Rating'\n\nconst starsSizeMap: Record<RatingSize, IconSize> = {\n sm: 16,\n md: 20,\n lg: 24,\n}\n\nexport interface StarsRatingProps {\n /** Percentage value (0-100) for the star fill */\n percent: number\n /** Size of the stars */\n size: RatingSize\n /** Whether to display the numeric value next to stars */\n showValue: boolean\n /** The actual rating value (used for display) */\n value: number\n /** Maximum rating value (used for display formatting) */\n max: number\n}\n\nfunction StarsRating({\n percent,\n size,\n showValue,\n value,\n max,\n}: Readonly<StarsRatingProps>) {\n const iconSize = starsSizeMap[size]\n\n return (\n <div className=\"ui:inline-flex ui:items-center ui:gap-1\">\n <div className=\"ui:relative\">\n {/* Empty stars */}\n <div className=\"ui:flex ui:text-gray-300\">\n {[1, 2, 3, 4, 5].map((i) => (\n <Icon key={i} name=\"Star\" size={iconSize} />\n ))}\n </div>\n {/* Filled stars with clip */}\n <div\n className=\"ui:absolute ui:inset-0 ui:flex ui:text-yellow-400\"\n style={{ clipPath: `inset(0 ${String(100 - percent)}% 0 0)` }}\n >\n {[1, 2, 3, 4, 5].map((i) => (\n <Icon key={i} name=\"Star\" size={iconSize} />\n ))}\n </div>\n </div>\n {showValue && (\n <span\n className={clsx(\n 'ui:font-medium ui:text-muted-foreground',\n size === 'sm' && 'ui:text-xs',\n size === 'md' && 'ui:text-sm',\n size === 'lg' && 'ui:text-base'\n )}\n >\n {max === 100 ? (value / 10).toFixed(1) : value.toFixed(1)}\n </span>\n )}\n </div>\n )\n}\n\nexport default StarsRating\n","import clsx from 'clsx'\n\nimport CircleRating from './CircleRating'\nimport StarsRating from './StarsRating'\n\nexport type RatingVariant = 'circle' | 'stars'\nexport type RatingSize = 'sm' | 'md' | 'lg'\n\nexport interface RatingProps {\n /** Rating value (0-10 by default, or 0-100 if max=100) */\n value: number\n /** Maximum value (default: 10 for TMDB scores) */\n max?: number\n /** Visual variant */\n variant?: RatingVariant\n /** Size of the rating */\n size?: RatingSize\n /** Show the numeric value */\n showValue?: boolean\n /** Custom class for the background track circle (circle variant only) */\n trackClassName?: string\n /** Additional class name */\n className?: string\n}\n\nfunction Rating({\n value,\n max = 10,\n variant = 'circle',\n size = 'md',\n showValue = true,\n trackClassName,\n className,\n}: Readonly<RatingProps>) {\n const clampedValue = Math.max(0, Math.min(value, max))\n const percent = (clampedValue / max) * 100\n\n return (\n <div className={clsx('ui:inline-flex', className)}>\n {variant === 'circle' ? (\n <CircleRating\n percent={percent}\n size={size}\n showValue={showValue}\n value={clampedValue}\n max={max}\n trackClassName={trackClassName}\n />\n ) : (\n <StarsRating\n percent={percent}\n size={size}\n showValue={showValue}\n value={clampedValue}\n max={max}\n />\n )}\n </div>\n )\n}\n\nexport default Rating\n","import clsx from 'clsx'\nimport { createElement } from 'react'\n\nimport type { ElementType, HTMLAttributes, ReactNode } from 'react'\n\nexport type TypographyVariant =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'body'\n | 'body-sm'\n | 'body-lg'\n | 'lead'\n | 'caption'\n | 'caption-xs'\n | 'label'\n | 'muted'\n | 'blockquote'\n\nexport interface TypographyProps extends HTMLAttributes<HTMLElement> {\n /** Visual style variant */\n variant: TypographyVariant\n /** Override semantic HTML tag */\n as?: ElementType\n /** Additional CSS classes */\n className?: string\n /** Content */\n children: ReactNode\n}\n\nconst variantStyles: Record<TypographyVariant, string> = {\n h1: 'ui:font-roboto ui:text-xl ui:sm:text-2xl ui:md:text-3xl ui:lg:text-4xl ui:font-bold ui:leading-tight ui:text-foreground',\n h2: 'ui:font-roboto ui:text-lg ui:sm:text-xl ui:md:text-2xl ui:lg:text-3xl ui:font-bold ui:leading-tight ui:text-foreground',\n h3: 'ui:font-roboto ui:text-base ui:sm:text-lg ui:md:text-xl ui:lg:text-2xl ui:font-semibold ui:leading-snug ui:text-foreground',\n h4: 'ui:font-roboto ui:text-sm ui:sm:text-base ui:md:text-lg ui:lg:text-xl ui:font-semibold ui:leading-snug ui:text-foreground',\n h5: 'ui:font-roboto ui:text-sm ui:sm:text-base ui:md:text-lg ui:font-medium ui:leading-normal ui:text-foreground',\n h6: 'ui:font-roboto ui:text-xs ui:sm:text-sm ui:md:text-base ui:font-medium ui:leading-normal ui:text-foreground',\n body: 'ui:font-inter ui:text-xs ui:sm:text-sm ui:md:text-base ui:leading-relaxed ui:text-foreground',\n 'body-sm':\n 'ui:font-inter ui:text-xs ui:sm:text-sm ui:leading-relaxed ui:text-foreground',\n 'body-lg':\n 'ui:font-inter ui:text-sm ui:sm:text-base ui:md:text-lg ui:leading-relaxed ui:text-foreground',\n lead: 'ui:font-inter ui:text-sm ui:sm:text-base ui:md:text-lg ui:lg:text-xl ui:leading-relaxed ui:text-muted-foreground',\n caption: 'ui:font-inter ui:text-xs ui:sm:text-sm ui:text-muted-foreground',\n 'caption-xs': 'ui:font-inter ui:text-xs ui:text-muted-foreground',\n label:\n 'ui:font-inter ui:text-xs ui:sm:text-sm ui:font-medium ui:text-foreground',\n muted: 'ui:font-inter ui:text-xs ui:sm:text-sm ui:text-muted-foreground',\n blockquote:\n 'ui:font-inter ui:text-xs ui:sm:text-sm ui:md:text-base ui:border-l-4 ui:border-border ui:pl-4 ui:italic ui:text-muted-foreground',\n}\n\nconst variantToTag: Record<TypographyVariant, ElementType> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n body: 'p',\n 'body-sm': 'p',\n 'body-lg': 'p',\n lead: 'p',\n caption: 'span',\n 'caption-xs': 'span',\n label: 'label',\n muted: 'p',\n blockquote: 'blockquote',\n}\n\nfunction Typography({\n variant,\n as,\n className,\n children,\n ...rest\n}: Readonly<TypographyProps>) {\n const Component = as ?? variantToTag[variant]\n\n return createElement(\n Component,\n { className: clsx(variantStyles[variant], className), ...rest },\n children\n )\n}\n\nexport default Typography\n","import clsx from 'clsx'\n\nimport type { ImageLoading } from '../Image'\n\nexport interface MovieCardBaseProps {\n /** Media ID */\n id: number\n /** Media title */\n title: string\n /** Poster URL (full URL or TMDB path) */\n posterUrl: string\n /** Vote average (0-10) */\n voteAverage: number\n /** Release year */\n year?: number | null\n /** Additional class name */\n className?: string\n /** Image loading strategy ('lazy' | 'eager'). Default: 'lazy' */\n imageLoading?: ImageLoading\n /** Base64 blur data URL for next/image placeholder=\"blur\" */\n blurDataURL?: string\n}\n\nexport interface MovieCardAsCard extends MovieCardBaseProps {\n as?: 'card' | undefined\n onClick?: never\n}\n\nexport interface MovieCardAsButton extends MovieCardBaseProps {\n as: 'button'\n onClick: () => void\n}\n\nexport function getMovieCardClasses(\n isInteractive: boolean,\n className?: string\n) {\n return clsx(\n 'ui:group ui:relative ui:flex ui:flex-col ui:overflow-hidden',\n isInteractive && [\n 'ui:cursor-pointer',\n 'ui:transition-transform ui:duration-200',\n 'hover:ui:scale-[1.02]',\n ],\n className\n )\n}\n\nexport function getMovieCardLinkClasses() {\n return 'ui:block ui:no-underline ui:text-inherit'\n}\n"]}
|
|
@@ -3,7 +3,6 @@ import { XMarkIcon as XMarkIcon$1, UsersIcon, UserIcon as UserIcon$1, TvIcon, St
|
|
|
3
3
|
import { XMarkIcon as XMarkIcon$2, UsersIcon as UsersIcon$1, UserIcon as UserIcon$2, TvIcon as TvIcon$1, StarIcon as StarIcon$2, ShareIcon as ShareIcon$1, PlusIcon as PlusIcon$2, PlayCircleIcon as PlayCircleIcon$1, PlayIcon as PlayIcon$2, MinusIcon as MinusIcon$2, MagnifyingGlassIcon as MagnifyingGlassIcon$2, LinkIcon as LinkIcon$2, InformationCircleIcon as InformationCircleIcon$2, HeartIcon as HeartIcon$2, PhotoIcon as PhotoIcon$1, FilmIcon as FilmIcon$1, ExclamationTriangleIcon as ExclamationTriangleIcon$2, ExclamationCircleIcon as ExclamationCircleIcon$2, EllipsisVerticalIcon as EllipsisVerticalIcon$2, ChevronUpIcon as ChevronUpIcon$2, ChevronRightIcon as ChevronRightIcon$2, ChevronLeftIcon as ChevronLeftIcon$2, ChevronDownIcon as ChevronDownIcon$2, CheckIcon as CheckIcon$2, CalendarIcon as CalendarIcon$2, BookmarkIcon as BookmarkIcon$2, Bars3Icon as Bars3Icon$2, ArrowTopRightOnSquareIcon as ArrowTopRightOnSquareIcon$1, ArrowRightIcon as ArrowRightIcon$2, ArrowLeftIcon as ArrowLeftIcon$2 } from '@heroicons/react/24/outline';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
|
-
// src/Icon/Icon.tsx
|
|
7
6
|
var iconMap24 = {
|
|
8
7
|
ArrowLeft: ArrowLeftIcon$2,
|
|
9
8
|
ArrowRight: ArrowRightIcon$2,
|
|
@@ -116,5 +115,5 @@ function Icon({ name, size = 24, className, ...rest }) {
|
|
|
116
115
|
var Icon_default = Icon;
|
|
117
116
|
|
|
118
117
|
export { Icon_default };
|
|
119
|
-
//# sourceMappingURL=chunk-
|
|
120
|
-
//# sourceMappingURL=chunk-
|
|
118
|
+
//# sourceMappingURL=chunk-6FBMTGXQ.js.map
|
|
119
|
+
//# sourceMappingURL=chunk-6FBMTGXQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Icon/Icon.tsx"],"names":["ArrowLeftIcon24","ArrowRightIcon24","ArrowTopRightOnSquareIcon24","Bars3Icon24","BookmarkIcon24","CalendarIcon24","CheckIcon24","ChevronDownIcon24","ChevronLeftIcon24","ChevronRightIcon24","ChevronUpIcon24","EllipsisVerticalIcon24","ExclamationCircleIcon24","ExclamationTriangleIcon24","FilmIcon24","PhotoIcon24","HeartIcon24","InformationCircleIcon24","LinkIcon24","MagnifyingGlassIcon24","MinusIcon24","PlayIcon24","PlayCircleIcon24","PlusIcon24","ShareIcon24","StarIcon24","TvIcon24","UserIcon24","UsersIcon24","XMarkIcon24","ArrowLeftIcon20","ArrowRightIcon20","ArrowTopRightOnSquareIcon20","Bars3Icon20","BookmarkIcon20","CalendarIcon20","CheckIcon20","ChevronDownIcon20","ChevronLeftIcon20","ChevronRightIcon20","ChevronUpIcon20","EllipsisVerticalIcon20","ExclamationCircleIcon20","ExclamationTriangleIcon20","FilmIcon20","PhotoIcon20","HeartIcon20","InformationCircleIcon20","LinkIcon20","MagnifyingGlassIcon20","MinusIcon20","PlayIcon20","PlayCircleIcon20","PlusIcon20","ShareIcon20","StarIcon20","TvIcon20","UserIcon20","UsersIcon20","XMarkIcon20","ArrowLeftIcon16","ArrowRightIcon16","Bars3Icon16","BookmarkIcon16","CalendarIcon16","CheckIcon16","ChevronDownIcon16","ChevronLeftIcon16","ChevronRightIcon16","ChevronUpIcon16","EllipsisVerticalIcon16","ExclamationCircleIcon16","ExclamationTriangleIcon16","HeartIcon16","InformationCircleIcon16","LinkIcon16","MagnifyingGlassIcon16","MinusIcon16","PlayIcon16","PlusIcon16","StarIcon16","UserIcon16","XMarkIcon16"],"mappings":"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","file":"chunk-6FBMTGXQ.js","sourcesContent":["import {\n ArrowLeftIcon as ArrowLeftIcon16,\n ArrowRightIcon as ArrowRightIcon16,\n Bars3Icon as Bars3Icon16,\n BookmarkIcon as BookmarkIcon16,\n CalendarIcon as CalendarIcon16,\n CheckIcon as CheckIcon16,\n ChevronDownIcon as ChevronDownIcon16,\n ChevronLeftIcon as ChevronLeftIcon16,\n ChevronRightIcon as ChevronRightIcon16,\n ChevronUpIcon as ChevronUpIcon16,\n EllipsisVerticalIcon as EllipsisVerticalIcon16,\n ExclamationCircleIcon as ExclamationCircleIcon16,\n ExclamationTriangleIcon as ExclamationTriangleIcon16,\n HeartIcon as HeartIcon16,\n InformationCircleIcon as InformationCircleIcon16,\n LinkIcon as LinkIcon16,\n MagnifyingGlassIcon as MagnifyingGlassIcon16,\n MinusIcon as MinusIcon16,\n PlayIcon as PlayIcon16,\n PlusIcon as PlusIcon16,\n StarIcon as StarIcon16,\n UserIcon as UserIcon16,\n XMarkIcon as XMarkIcon16,\n} from '@heroicons/react/16/solid'\nimport {\n ArrowLeftIcon as ArrowLeftIcon20,\n ArrowRightIcon as ArrowRightIcon20,\n ArrowTopRightOnSquareIcon as ArrowTopRightOnSquareIcon20,\n Bars3Icon as Bars3Icon20,\n BookmarkIcon as BookmarkIcon20,\n CalendarIcon as CalendarIcon20,\n CheckIcon as CheckIcon20,\n ChevronDownIcon as ChevronDownIcon20,\n ChevronLeftIcon as ChevronLeftIcon20,\n ChevronRightIcon as ChevronRightIcon20,\n ChevronUpIcon as ChevronUpIcon20,\n EllipsisVerticalIcon as EllipsisVerticalIcon20,\n ExclamationCircleIcon as ExclamationCircleIcon20,\n ExclamationTriangleIcon as ExclamationTriangleIcon20,\n FilmIcon as FilmIcon20,\n HeartIcon as HeartIcon20,\n InformationCircleIcon as InformationCircleIcon20,\n LinkIcon as LinkIcon20,\n MagnifyingGlassIcon as MagnifyingGlassIcon20,\n MinusIcon as MinusIcon20,\n PhotoIcon as PhotoIcon20,\n PlayCircleIcon as PlayCircleIcon20,\n PlayIcon as PlayIcon20,\n PlusIcon as PlusIcon20,\n ShareIcon as ShareIcon20,\n StarIcon as StarIcon20,\n TvIcon as TvIcon20,\n UserIcon as UserIcon20,\n UsersIcon as UsersIcon20,\n XMarkIcon as XMarkIcon20,\n} from '@heroicons/react/20/solid'\nimport {\n ArrowLeftIcon as ArrowLeftIcon24,\n ArrowRightIcon as ArrowRightIcon24,\n ArrowTopRightOnSquareIcon as ArrowTopRightOnSquareIcon24,\n Bars3Icon as Bars3Icon24,\n BookmarkIcon as BookmarkIcon24,\n CalendarIcon as CalendarIcon24,\n CheckIcon as CheckIcon24,\n ChevronDownIcon as ChevronDownIcon24,\n ChevronLeftIcon as ChevronLeftIcon24,\n ChevronRightIcon as ChevronRightIcon24,\n ChevronUpIcon as ChevronUpIcon24,\n EllipsisVerticalIcon as EllipsisVerticalIcon24,\n ExclamationCircleIcon as ExclamationCircleIcon24,\n ExclamationTriangleIcon as ExclamationTriangleIcon24,\n FilmIcon as FilmIcon24,\n HeartIcon as HeartIcon24,\n InformationCircleIcon as InformationCircleIcon24,\n LinkIcon as LinkIcon24,\n MagnifyingGlassIcon as MagnifyingGlassIcon24,\n MinusIcon as MinusIcon24,\n PhotoIcon as PhotoIcon24,\n PlayCircleIcon as PlayCircleIcon24,\n PlayIcon as PlayIcon24,\n PlusIcon as PlusIcon24,\n ShareIcon as ShareIcon24,\n StarIcon as StarIcon24,\n TvIcon as TvIcon24,\n UserIcon as UserIcon24,\n UsersIcon as UsersIcon24,\n XMarkIcon as XMarkIcon24,\n} from '@heroicons/react/24/outline'\n\nimport type { ComponentType, SVGProps } from 'react'\n\ntype HeroIcon = ComponentType<SVGProps<SVGSVGElement>>\n\nconst iconMap24: Record<string, HeroIcon> = {\n ArrowLeft: ArrowLeftIcon24,\n ArrowRight: ArrowRightIcon24,\n ArrowTopRightOnSquare: ArrowTopRightOnSquareIcon24,\n Bars3: Bars3Icon24,\n Bookmark: BookmarkIcon24,\n Calendar: CalendarIcon24,\n Check: CheckIcon24,\n ChevronDown: ChevronDownIcon24,\n ChevronLeft: ChevronLeftIcon24,\n ChevronRight: ChevronRightIcon24,\n ChevronUp: ChevronUpIcon24,\n EllipsisVertical: EllipsisVerticalIcon24,\n ExclamationCircle: ExclamationCircleIcon24,\n ExclamationTriangle: ExclamationTriangleIcon24,\n Film: FilmIcon24,\n Photo: PhotoIcon24,\n Heart: HeartIcon24,\n InformationCircle: InformationCircleIcon24,\n Link: LinkIcon24,\n MagnifyingGlass: MagnifyingGlassIcon24,\n Minus: MinusIcon24,\n Play: PlayIcon24,\n PlayCircle: PlayCircleIcon24,\n Plus: PlusIcon24,\n Share: ShareIcon24,\n Star: StarIcon24,\n Tv: TvIcon24,\n User: UserIcon24,\n Users: UsersIcon24,\n XMark: XMarkIcon24,\n}\n\nconst iconMap20: Record<string, HeroIcon> = {\n ArrowLeft: ArrowLeftIcon20,\n ArrowRight: ArrowRightIcon20,\n ArrowTopRightOnSquare: ArrowTopRightOnSquareIcon20,\n Bars3: Bars3Icon20,\n Bookmark: BookmarkIcon20,\n Calendar: CalendarIcon20,\n Check: CheckIcon20,\n ChevronDown: ChevronDownIcon20,\n ChevronLeft: ChevronLeftIcon20,\n ChevronRight: ChevronRightIcon20,\n ChevronUp: ChevronUpIcon20,\n EllipsisVertical: EllipsisVerticalIcon20,\n ExclamationCircle: ExclamationCircleIcon20,\n ExclamationTriangle: ExclamationTriangleIcon20,\n Film: FilmIcon20,\n Photo: PhotoIcon20,\n Heart: HeartIcon20,\n InformationCircle: InformationCircleIcon20,\n Link: LinkIcon20,\n MagnifyingGlass: MagnifyingGlassIcon20,\n Minus: MinusIcon20,\n Play: PlayIcon20,\n PlayCircle: PlayCircleIcon20,\n Plus: PlusIcon20,\n Share: ShareIcon20,\n Star: StarIcon20,\n Tv: TvIcon20,\n User: UserIcon20,\n Users: UsersIcon20,\n XMark: XMarkIcon20,\n}\n\nconst iconMap16: Record<string, HeroIcon> = {\n ArrowLeft: ArrowLeftIcon16,\n ArrowRight: ArrowRightIcon16,\n Bars3: Bars3Icon16,\n Bookmark: BookmarkIcon16,\n Calendar: CalendarIcon16,\n Check: CheckIcon16,\n ChevronDown: ChevronDownIcon16,\n ChevronLeft: ChevronLeftIcon16,\n ChevronRight: ChevronRightIcon16,\n ChevronUp: ChevronUpIcon16,\n EllipsisVertical: EllipsisVerticalIcon16,\n ExclamationCircle: ExclamationCircleIcon16,\n ExclamationTriangle: ExclamationTriangleIcon16,\n Heart: HeartIcon16,\n InformationCircle: InformationCircleIcon16,\n Link: LinkIcon16,\n MagnifyingGlass: MagnifyingGlassIcon16,\n Minus: MinusIcon16,\n Play: PlayIcon16,\n Plus: PlusIcon16,\n Star: StarIcon16,\n User: UserIcon16,\n XMark: XMarkIcon16,\n}\n\nexport type IconName =\n | 'ArrowLeft'\n | 'ArrowRight'\n | 'ArrowTopRightOnSquare'\n | 'Bars3'\n | 'Bookmark'\n | 'Check'\n | 'Calendar'\n | 'ChevronDown'\n | 'ChevronLeft'\n | 'ChevronRight'\n | 'ChevronUp'\n | 'EllipsisVertical'\n | 'ExclamationCircle'\n | 'ExclamationTriangle'\n | 'Film'\n | 'Photo'\n | 'Heart'\n | 'InformationCircle'\n | 'Link'\n | 'MagnifyingGlass'\n | 'Minus'\n | 'Play'\n | 'PlayCircle'\n | 'Plus'\n | 'Share'\n | 'Star'\n | 'Tv'\n | 'User'\n | 'Users'\n | 'XMark'\n\nexport type IconSize = 16 | 20 | 24 | 32 | 48 | 64\n\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n /** Icon name from the available subset */\n name: IconName\n /** Icon size in pixels (16, 20, 24, 32, 48, 64) */\n size?: IconSize\n}\n\nfunction Icon({ name, size = 24, className, ...rest }: Readonly<IconProps>) {\n let IconComponent: HeroIcon\n\n if (size <= 16) {\n IconComponent = iconMap16[name] ?? iconMap20[name]\n } else if (size <= 20) {\n IconComponent = iconMap20[name]\n } else {\n IconComponent = iconMap24[name]\n }\n\n return (\n <IconComponent\n className={className}\n width={size}\n height={size}\n {...rest}\n aria-hidden\n />\n )\n}\n\nexport default Icon\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getMovieCardLinkClasses, Rating_default, Typography_default, getMovieCardClasses } from './chunk-
|
|
2
|
-
import { Card_default } from './chunk-
|
|
3
|
-
import { Icon_default } from './chunk-
|
|
1
|
+
import { getMovieCardLinkClasses, Rating_default, Typography_default, getMovieCardClasses } from './chunk-6DP3KZQG.js';
|
|
2
|
+
import { Card_default } from './chunk-RZU2FFBW.js';
|
|
3
|
+
import { Icon_default } from './chunk-6FBMTGXQ.js';
|
|
4
4
|
import { getBlurDataUrl } from '@vite-mf-monorepo/shared';
|
|
5
5
|
import clsx from 'clsx';
|
|
6
6
|
import { useRef, useState, useEffect, useCallback } from 'react';
|
|
@@ -224,5 +224,5 @@ function MovieCard({
|
|
|
224
224
|
var MovieCard_default = MovieCard;
|
|
225
225
|
|
|
226
226
|
export { Image_default, MovieCard_default };
|
|
227
|
-
//# sourceMappingURL=chunk-
|
|
228
|
-
//# sourceMappingURL=chunk-
|
|
227
|
+
//# sourceMappingURL=chunk-7IAJQE27.js.map
|
|
228
|
+
//# sourceMappingURL=chunk-7IAJQE27.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Image/Image.tsx","../src/MovieCard/MovieCardContent.tsx","../src/react-router/MovieCard/MovieCard.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"chunk-3GCDFSJB.js","sourcesContent":["import { getBlurDataUrl } from '@vite-mf-monorepo/shared'\nimport clsx from 'clsx'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Icon } from '../Icon'\n\nimport type { ImgHTMLAttributes, ReactNode } from 'react'\n\nexport type ImageState = 'loading' | 'loaded' | 'error'\n\nexport type AspectRatio = '2/3' | '16/9' | '1/1' | '4/3' | '3/2'\n\nexport type ImageLoading = 'lazy' | 'eager'\n\nexport interface ImageProps\n extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'placeholder'> {\n /** Image source URL */\n src: string\n /** Alt text for accessibility */\n alt: string\n /** Pre-generated blur data URL (base64) */\n blurDataUrl?: string\n /** Auto-generate blur placeholder from src using Canvas API */\n autoBlur?: boolean\n /** Size of blur canvas (smaller = more blur). Default: 16 */\n blurSize?: number\n /** JPEG quality for blur (0-1). Default: 0.3 */\n blurQuality?: number\n /** Aspect ratio of the image container */\n aspectRatio?: AspectRatio | (string & {})\n /** Fallback content when image fails to load */\n fallback?: ReactNode\n /** Callback when image loads successfully */\n onLoad?: () => void\n /** Callback when image fails to load */\n onError?: () => void\n /** Load strategy: 'lazy' waits for viewport visibility, 'eager' loads immediately. Default: 'eager' */\n loading?: ImageLoading\n}\n\nfunction Image({\n src,\n alt,\n blurDataUrl,\n autoBlur = false,\n blurSize = 16,\n blurQuality = 0.3,\n aspectRatio = '2/3',\n fallback,\n className,\n onLoad,\n onError,\n loading = 'eager',\n ...rest\n}: Readonly<ImageProps>) {\n const imgRef = useRef<HTMLImageElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const [state, setState] = useState<ImageState>('loading')\n const [generatedBlur, setGeneratedBlur] = useState<string | undefined>(\n undefined\n )\n const [blurReady, setBlurReady] = useState(!autoBlur || !!blurDataUrl)\n const [isVisible, setIsVisible] = useState(loading === 'eager')\n\n const effectiveBlur = blurDataUrl ?? generatedBlur\n\n // Lazy load with IntersectionObserver\n useEffect(() => {\n if (loading === 'eager' || !containerRef.current) {\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true)\n observer.unobserve(entry.target)\n }\n },\n { rootMargin: '50px' }\n )\n\n observer.observe(containerRef.current)\n\n return () => {\n observer.disconnect()\n }\n }, [loading])\n\n useEffect(() => {\n if (!autoBlur || blurDataUrl) {\n setBlurReady(true)\n return\n }\n\n setBlurReady(false)\n\n getBlurDataUrl(src, blurSize, blurQuality)\n .then((base64) => {\n setGeneratedBlur(base64)\n setBlurReady(true)\n })\n .catch(() => {\n setBlurReady(true)\n })\n }, [autoBlur, src, blurDataUrl, blurSize, blurQuality])\n\n useEffect(() => {\n setState('loading')\n setGeneratedBlur(undefined)\n\n // Check if image is already loaded from cache\n if (imgRef.current?.complete && imgRef.current.naturalHeight !== 0) {\n setState('loaded')\n }\n }, [src])\n\n const handleLoad = useCallback(() => {\n setState('loaded')\n onLoad?.()\n }, [onLoad])\n\n const handleError = useCallback(() => {\n setState('error')\n onError?.()\n }, [onError])\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 ref={containerRef}\n className={clsx('ui:relative ui:overflow-hidden ui:bg-muted', className)}\n style={aspectRatio ? { aspectRatio } : undefined}\n data-state={state}\n >\n {state === 'error' ? (\n (fallback ?? defaultFallback)\n ) : (\n <>\n {effectiveBlur && state === 'loading' && (\n <img\n src={effectiveBlur}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"ui:absolute ui:inset-0 ui:h-full ui:w-full ui:scale-105 ui:object-cover\"\n />\n )}\n\n {blurReady && isVisible && (\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n onLoad={handleLoad}\n onError={handleError}\n className={clsx(\n 'ui:absolute ui:inset-0 ui:h-full ui:w-full ui:object-cover ui:transition-opacity ui:duration-300',\n state === 'loaded' ? 'ui:opacity-100' : 'ui:opacity-0'\n )}\n {...rest}\n />\n )}\n </>\n )}\n </div>\n )\n}\n\nexport default Image\n","import { Card } from '../Card'\nimport { Image } from '../Image'\nimport { Rating } from '../Rating'\nimport { Typography } from '../Typography'\n\nimport { getMovieCardClasses } from './MovieCard.utils'\n\nimport type { ImageLoading } from '../Image'\nimport type { ReactNode } from 'react'\n\ninterface MovieCardContentProps {\n id: number\n title: string\n posterUrl: string\n voteAverage: number\n year?: number | null\n className?: string\n imageLoading?: ImageLoading\n isInteractive: boolean\n onClick?: (() => void) | undefined\n}\n\nexport default function MovieCardContent({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n isInteractive,\n onClick,\n}: Readonly<MovieCardContentProps>): ReactNode {\n return (\n <Card\n variant=\"ghost\"\n className={getMovieCardClasses(isInteractive, className)}\n onClick={onClick}\n data-testid={`movie-card-${String(id)}`}\n >\n <div className=\"ui:relative ui:aspect-[2/3] ui:w-full ui:overflow-hidden ui:rounded-md ui:bg-gray-200\">\n <Image\n src={posterUrl}\n alt={title}\n loading={imageLoading}\n aspectRatio={undefined}\n className=\"ui:h-full ui:w-full ui:object-cover\"\n />\n <div className=\"ui:absolute ui:bottom-2 ui:right-2 ui:flex ui:items-center ui:justify-center ui:rounded-full ui:bg-white/80 ui:p-1\">\n <Rating\n value={voteAverage}\n size=\"sm\"\n variant=\"circle\"\n trackClassName=\"ui:text-gray-200\"\n className=\"ui:drop-shadow\"\n />\n </div>\n </div>\n\n <div className=\"ui:mt-2 ui:flex ui:flex-col ui:gap-0.5 ui:px-1\">\n <Typography\n variant=\"label\"\n as=\"h3\"\n className=\"ui:line-clamp-2\"\n title={title}\n >\n {title}\n </Typography>\n {year && (\n <Typography\n variant=\"caption-xs\"\n className=\"ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground\"\n >\n {year}\n </Typography>\n )}\n </div>\n </Card>\n )\n}\n","import { Link } from 'react-router-dom'\n\nimport { getMovieCardLinkClasses } from '../../MovieCard/MovieCard.utils'\nimport MovieCardContent from '../../MovieCard/MovieCardContent'\n\nimport type { MovieCardProps } from './MovieCard.types'\n\nfunction MovieCard({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n as = 'card',\n ...rest\n}: Readonly<MovieCardProps>) {\n const to = 'to' in rest ? rest.to : undefined\n const onClick = 'onClick' in rest ? rest.onClick : undefined\n\n const isInteractive = as === 'link' || as === 'button'\n\n const cardContent = (\n <MovieCardContent\n id={id}\n title={title}\n posterUrl={posterUrl}\n voteAverage={voteAverage}\n year={year}\n className={className}\n imageLoading={imageLoading}\n isInteractive={isInteractive}\n onClick={as === 'button' ? onClick : undefined}\n />\n )\n\n if (as === 'link' && to) {\n return (\n <Link to={to} className={getMovieCardLinkClasses()}>\n {cardContent}\n </Link>\n )\n }\n\n return cardContent\n}\n\nexport default MovieCard\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Image/Image.tsx","../src/MovieCard/MovieCardContent.tsx","../src/react-router/MovieCard/MovieCard.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"chunk-7IAJQE27.js","sourcesContent":["import { getBlurDataUrl } from '@vite-mf-monorepo/shared'\nimport clsx from 'clsx'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Icon } from '../Icon'\n\nimport type { ImgHTMLAttributes, ReactNode } from 'react'\n\nexport type ImageState = 'loading' | 'loaded' | 'error'\n\nexport type AspectRatio = '2/3' | '16/9' | '1/1' | '4/3' | '3/2'\n\nexport type ImageLoading = 'lazy' | 'eager'\n\nexport interface ImageProps\n extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'placeholder'> {\n /** Image source URL */\n src: string\n /** Alt text for accessibility */\n alt: string\n /** Pre-generated blur data URL (base64) */\n blurDataUrl?: string\n /** Auto-generate blur placeholder from src using Canvas API */\n autoBlur?: boolean\n /** Size of blur canvas (smaller = more blur). Default: 16 */\n blurSize?: number\n /** JPEG quality for blur (0-1). Default: 0.3 */\n blurQuality?: number\n /** Aspect ratio of the image container */\n aspectRatio?: AspectRatio | (string & {})\n /** Fallback content when image fails to load */\n fallback?: ReactNode\n /** Callback when image loads successfully */\n onLoad?: () => void\n /** Callback when image fails to load */\n onError?: () => void\n /** Load strategy: 'lazy' waits for viewport visibility, 'eager' loads immediately. Default: 'eager' */\n loading?: ImageLoading\n}\n\nfunction Image({\n src,\n alt,\n blurDataUrl,\n autoBlur = false,\n blurSize = 16,\n blurQuality = 0.3,\n aspectRatio = '2/3',\n fallback,\n className,\n onLoad,\n onError,\n loading = 'eager',\n ...rest\n}: Readonly<ImageProps>) {\n const imgRef = useRef<HTMLImageElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const [state, setState] = useState<ImageState>('loading')\n const [generatedBlur, setGeneratedBlur] = useState<string | undefined>(\n undefined\n )\n const [blurReady, setBlurReady] = useState(!autoBlur || !!blurDataUrl)\n const [isVisible, setIsVisible] = useState(loading === 'eager')\n\n const effectiveBlur = blurDataUrl ?? generatedBlur\n\n // Lazy load with IntersectionObserver\n useEffect(() => {\n if (loading === 'eager' || !containerRef.current) {\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true)\n observer.unobserve(entry.target)\n }\n },\n { rootMargin: '50px' }\n )\n\n observer.observe(containerRef.current)\n\n return () => {\n observer.disconnect()\n }\n }, [loading])\n\n useEffect(() => {\n if (!autoBlur || blurDataUrl) {\n setBlurReady(true)\n return\n }\n\n setBlurReady(false)\n\n getBlurDataUrl(src, blurSize, blurQuality)\n .then((base64) => {\n setGeneratedBlur(base64)\n setBlurReady(true)\n })\n .catch(() => {\n setBlurReady(true)\n })\n }, [autoBlur, src, blurDataUrl, blurSize, blurQuality])\n\n useEffect(() => {\n setState('loading')\n setGeneratedBlur(undefined)\n\n // Check if image is already loaded from cache\n if (imgRef.current?.complete && imgRef.current.naturalHeight !== 0) {\n setState('loaded')\n }\n }, [src])\n\n const handleLoad = useCallback(() => {\n setState('loaded')\n onLoad?.()\n }, [onLoad])\n\n const handleError = useCallback(() => {\n setState('error')\n onError?.()\n }, [onError])\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 ref={containerRef}\n className={clsx('ui:relative ui:overflow-hidden ui:bg-muted', className)}\n style={aspectRatio ? { aspectRatio } : undefined}\n data-state={state}\n >\n {state === 'error' ? (\n (fallback ?? defaultFallback)\n ) : (\n <>\n {effectiveBlur && state === 'loading' && (\n <img\n src={effectiveBlur}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"ui:absolute ui:inset-0 ui:h-full ui:w-full ui:scale-105 ui:object-cover\"\n />\n )}\n\n {blurReady && isVisible && (\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n onLoad={handleLoad}\n onError={handleError}\n className={clsx(\n 'ui:absolute ui:inset-0 ui:h-full ui:w-full ui:object-cover ui:transition-opacity ui:duration-300',\n state === 'loaded' ? 'ui:opacity-100' : 'ui:opacity-0'\n )}\n {...rest}\n />\n )}\n </>\n )}\n </div>\n )\n}\n\nexport default Image\n","import { Card } from '../Card'\nimport { Image } from '../Image'\nimport { Rating } from '../Rating'\nimport { Typography } from '../Typography'\n\nimport { getMovieCardClasses } from './MovieCard.utils'\n\nimport type { ImageLoading } from '../Image'\nimport type { ReactNode } from 'react'\n\ninterface MovieCardContentProps {\n id: number\n title: string\n posterUrl: string\n voteAverage: number\n year?: number | null\n className?: string\n imageLoading?: ImageLoading\n isInteractive: boolean\n onClick?: (() => void) | undefined\n}\n\nexport default function MovieCardContent({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n isInteractive,\n onClick,\n}: Readonly<MovieCardContentProps>): ReactNode {\n return (\n <Card\n variant=\"ghost\"\n className={getMovieCardClasses(isInteractive, className)}\n onClick={onClick}\n data-testid={`movie-card-${String(id)}`}\n >\n <div className=\"ui:relative ui:aspect-[2/3] ui:w-full ui:overflow-hidden ui:rounded-md ui:bg-gray-200\">\n <Image\n src={posterUrl}\n alt={title}\n loading={imageLoading}\n aspectRatio={undefined}\n className=\"ui:h-full ui:w-full ui:object-cover\"\n />\n <div className=\"ui:absolute ui:bottom-2 ui:right-2 ui:flex ui:items-center ui:justify-center ui:rounded-full ui:bg-white/80 ui:p-1\">\n <Rating\n value={voteAverage}\n size=\"sm\"\n variant=\"circle\"\n trackClassName=\"ui:text-gray-200\"\n className=\"ui:drop-shadow\"\n />\n </div>\n </div>\n\n <div className=\"ui:mt-2 ui:flex ui:flex-col ui:gap-0.5 ui:px-1\">\n <Typography\n variant=\"label\"\n as=\"h3\"\n className=\"ui:line-clamp-2\"\n title={title}\n >\n {title}\n </Typography>\n {year && (\n <Typography\n variant=\"caption-xs\"\n className=\"ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground\"\n >\n {year}\n </Typography>\n )}\n </div>\n </Card>\n )\n}\n","import { Link } from 'react-router-dom'\n\nimport { getMovieCardLinkClasses } from '../../MovieCard/MovieCard.utils'\nimport MovieCardContent from '../../MovieCard/MovieCardContent'\n\nimport type { MovieCardProps } from './MovieCard.types'\n\nfunction MovieCard({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n as = 'card',\n ...rest\n}: Readonly<MovieCardProps>) {\n const to = 'to' in rest ? rest.to : undefined\n const onClick = 'onClick' in rest ? rest.onClick : undefined\n\n const isInteractive = as === 'link' || as === 'button'\n\n const cardContent = (\n <MovieCardContent\n id={id}\n title={title}\n posterUrl={posterUrl}\n voteAverage={voteAverage}\n year={year}\n className={className}\n imageLoading={imageLoading}\n isInteractive={isInteractive}\n onClick={as === 'button' ? onClick : undefined}\n />\n )\n\n if (as === 'link' && to) {\n return (\n <Link to={to} className={getMovieCardLinkClasses()}>\n {cardContent}\n </Link>\n )\n }\n\n return cardContent\n}\n\nexport default MovieCard\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-DGJI4VNO.js"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
|
|
4
|
-
// src/Skeleton/Skeleton.tsx
|
|
5
4
|
function Skeleton({
|
|
6
5
|
variant = "rectangle",
|
|
7
6
|
width,
|
|
@@ -34,5 +33,5 @@ function Skeleton({
|
|
|
34
33
|
var Skeleton_default = Skeleton;
|
|
35
34
|
|
|
36
35
|
export { Skeleton_default };
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
38
|
-
//# sourceMappingURL=chunk-
|
|
36
|
+
//# sourceMappingURL=chunk-FJZK3PY6.js.map
|
|
37
|
+
//# sourceMappingURL=chunk-FJZK3PY6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Skeleton/Skeleton.tsx"],"names":[],"mappings":";;;AAsBA,SAAS,QAAA,CAAS;AAAA,EAChB,OAAA,GAAU,WAAA;AAAA,EACV,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA;AAAA,QACT,4CAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,UACE,eAAA,EAAiB,YAAY,WAAA,IAAe,OAAA;AAAA,UAC5C,mBAAmB,OAAA,KAAY,QAAA;AAAA,UAC/B,YAAA,EAAc,YAAY,MAAA,IAAU;AAAA,SACtC;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,WAAA,GAAc,EAAE,WAAA,EAAY,GAAI,MAAA;AAAA,MACtC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,IAAO,gBAAA,GAAQ","file":"chunk-FJZK3PY6.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { ComponentProps } from 'react'\n\nexport interface SkeletonProps extends ComponentProps<'div'> {\n /** Shape variant */\n variant?: 'rectangle' | 'circle' | 'line'\n /** Width (Tailwind class or custom value) */\n width?: string\n /** Height (Tailwind class or custom value) */\n height?: string\n /** Aspect ratio (e.g., \"2/3\", \"16/9\", \"1/1\") */\n aspectRatio?: string\n /** Apply rounded corners (default: true for rectangle/line, always true for circle) */\n rounded?: boolean\n}\n\n/**\n * Skeleton - Atomic loading placeholder component\n *\n * Composable primitive for building loading states with shimmer effect.\n */\nfunction Skeleton({\n variant = 'rectangle',\n width,\n height,\n aspectRatio,\n rounded = true,\n className,\n ...rest\n}: Readonly<SkeletonProps>) {\n return (\n <div\n className={clsx(\n 'ui:relative ui:overflow-hidden ui:bg-muted',\n 'ui-skeleton-shimmer',\n {\n 'ui:rounded-lg': variant === 'rectangle' && rounded,\n 'ui:rounded-full': variant === 'circle',\n 'ui:rounded': variant === 'line' && rounded,\n },\n width,\n height,\n className\n )}\n style={aspectRatio ? { aspectRatio } : undefined}\n {...rest}\n />\n )\n}\n\nexport default Skeleton\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
2
|
|
|
3
|
-
// src/Button/Button.utils.ts
|
|
4
3
|
var iconSizeMap = {
|
|
5
4
|
sm: 16,
|
|
6
5
|
md: 20,
|
|
@@ -40,5 +39,5 @@ function getButtonDisabledClasses(classes) {
|
|
|
40
39
|
}
|
|
41
40
|
|
|
42
41
|
export { getButtonClasses, getButtonDisabledClasses, iconSizeMap };
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
42
|
+
//# sourceMappingURL=chunk-IUGKH376.js.map
|
|
43
|
+
//# sourceMappingURL=chunk-IUGKH376.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Button/Button.utils.ts"],"names":[],"mappings":";;AAaO,IAAM,WAAA,GAAc;AAAA,EACzB,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAWO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,MAAA;AAAA,EACf;AACF,CAAA,EAAsB;AACpB,EAAA,OAAO,IAAA;AAAA,IACL,gIAAA;AAAA,IACA,4CAAA;AAAA,IACA,iFAAA;AAAA,IACA;AAAA,MACE,eAAe,YAAA,KAAiB,MAAA;AAAA,MAChC,uBAAuB,YAAA,KAAiB;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,mEACE,OAAA,KAAY,SAAA;AAAA,MACd,yEACE,OAAA,KAAY,WAAA;AAAA,MACd,+EACE,OAAA,KAAY,aAAA;AAAA,MACd,uFACE,OAAA,KAAY,SAAA;AAAA,MACd,sDAAsD,OAAA,KAAY;AAAA,KACpE;AAAA,IACA;AAAA,MACE,6BAA6B,IAAA,KAAS,IAAA;AAAA,MACtC,gCAAgC,IAAA,KAAS,IAAA;AAAA,MACzC,8BAA8B,IAAA,KAAS;AAAA,KACzC;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,yBAAyB,OAAA,EAAiB;AACxD,EAAA,OAAO,IAAA,CAAK,SAAS,wDAAwD,CAAA;AAC/E","file":"chunk-IUGKH376.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { IconName } from '../Icon'\nimport type { ReactNode } from 'react'\n\nexport type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'destructive'\n | 'outline'\n | 'ghost'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\nexport const iconSizeMap = {\n sm: 16,\n md: 20,\n lg: 24,\n} as const\n\nexport interface ButtonVisualInput {\n variant?: ButtonVariant\n size?: ButtonSize\n icon?: IconName\n iconPosition?: 'left' | 'right'\n className?: string\n children?: ReactNode\n}\n\nexport function getButtonClasses({\n variant = 'primary',\n size = 'md',\n iconPosition = 'left',\n className,\n}: ButtonVisualInput) {\n return clsx(\n 'ui:inline-flex ui:items-center ui:justify-center ui:cursor-pointer ui:gap-2 ui:font-roboto ui:font-medium ui:transition-colors',\n 'ui:rounded ui:border ui:border-transparent',\n 'ui:focus:outline-none ui:focus:ring-2 ui:focus:ring-ring ui:focus:ring-offset-2',\n {\n 'ui:flex-row': iconPosition === 'left',\n 'ui:flex-row-reverse': iconPosition === 'right',\n },\n {\n 'ui:bg-primary ui:text-primary-foreground ui:hover:bg-primary/90':\n variant === 'primary',\n 'ui:bg-secondary ui:text-secondary-foreground ui:hover:bg-secondary/80':\n variant === 'secondary',\n 'ui:bg-destructive ui:text-destructive-foreground ui:hover:bg-destructive/90':\n variant === 'destructive',\n 'ui:border-input ui:bg-background ui:hover:bg-accent ui:hover:text-accent-foreground':\n variant === 'outline',\n 'ui:hover:bg-accent ui:hover:text-accent-foreground': variant === 'ghost',\n },\n {\n 'ui:h-8 ui:px-3 ui:text-sm': size === 'sm',\n 'ui:h-10 ui:px-4 ui:text-base': size === 'md',\n 'ui:h-12 ui:px-6 ui:text-lg': size === 'lg',\n },\n className\n )\n}\n\nexport function getButtonDisabledClasses(classes: string) {\n return clsx(classes, 'ui:disabled:pointer-events-none ui:disabled:opacity-50')\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
|
|
4
|
-
// src/Card/Card.tsx
|
|
5
4
|
var variantStyles = {
|
|
6
5
|
default: "ui:rounded-md ui:p-4 ui:bg-card ui:text-card-foreground ui:shadow-md",
|
|
7
6
|
outline: "ui:rounded-md ui:p-4 ui:border ui:border-border ui:bg-transparent",
|
|
@@ -19,5 +18,5 @@ function Card({
|
|
|
19
18
|
var Card_default = Card;
|
|
20
19
|
|
|
21
20
|
export { Card_default };
|
|
22
|
-
//# sourceMappingURL=chunk-
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
21
|
+
//# sourceMappingURL=chunk-RZU2FFBW.js.map
|
|
22
|
+
//# sourceMappingURL=chunk-RZU2FFBW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Card/Card.tsx"],"names":[],"mappings":";;;AAWA,IAAM,aAAA,GAA6C;AAAA,EACjD,OAAA,EACE,sEAAA;AAAA,EACF,OAAA,EAAS,mEAAA;AAAA,EACT,QAAA,EACE,sEAAA;AAAA,EACF,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,IAAA,CAAK;AAAA,EACZ,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC1D,QAAA,EACH,CAAA;AAEJ;AAEA,IAAO,YAAA,GAAQ","file":"chunk-RZU2FFBW.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { HTMLAttributes } from 'react'\n\nexport type CardVariant = 'default' | 'outline' | 'elevated' | 'ghost'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** Visual variant of the card */\n variant?: CardVariant\n}\n\nconst variantStyles: Record<CardVariant, string> = {\n default:\n 'ui:rounded-md ui:p-4 ui:bg-card ui:text-card-foreground ui:shadow-md',\n outline: 'ui:rounded-md ui:p-4 ui:border ui:border-border ui:bg-transparent',\n elevated:\n 'ui:rounded-lg ui:p-6 ui:bg-card ui:text-card-foreground ui:shadow-lg',\n ghost: 'ui:rounded-md',\n}\n\nfunction Card({\n className,\n variant = 'default',\n children,\n ...rest\n}: Readonly<CardProps>) {\n return (\n <div className={clsx(variantStyles[variant], className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport default Card\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getButtonClasses, iconSizeMap, getButtonDisabledClasses } from './chunk-
|
|
2
|
-
import { Icon_default } from './chunk-
|
|
1
|
+
import { getButtonClasses, iconSizeMap, getButtonDisabledClasses } from './chunk-IUGKH376.js';
|
|
2
|
+
import { Icon_default } from './chunk-6FBMTGXQ.js';
|
|
3
3
|
import { Link } from 'react-router-dom';
|
|
4
4
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -45,5 +45,5 @@ function Button(props) {
|
|
|
45
45
|
var Button_default = Button;
|
|
46
46
|
|
|
47
47
|
export { Button_default };
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
48
|
+
//# sourceMappingURL=chunk-ZTQU4GMY.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-ZTQU4GMY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-router/Button/Button.tsx"],"names":["_","_v","_s","_i","_ip","_c","_ch"],"mappings":";;;;;AAWA,SAAS,OAAO,KAAA,EAA8B;AAC5C,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,SAAA;AAAA,IACV,IAAA,GAAO,IAAA;AAAA,IACP,IAAA;AAAA,IACA,YAAA,GAAe,MAAA;AAAA,IACf,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,UAAU,gBAAA,CAAiB,EAAE,SAAS,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAE3E,EAAA,MAAM,0BACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,wBAAS,YAAA,EAAA,EAAK,IAAA,EAAM,MAAM,IAAA,EAAM,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA;AAAA,IACnD;AAAA,GAAA,EACH,CAAA;AAGF,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAQ;AACvB,IAAA,MAAM;AAAA,MACJ,EAAA,EAAIA,EAAAA;AAAA,MACJ,OAAA,EAASC,GAAAA;AAAA,MACT,IAAA,EAAMC,GAAAA;AAAA,MACN,IAAA,EAAMC,GAAAA;AAAA,MACN,YAAA,EAAcC,IAAAA;AAAA,MACd,SAAA,EAAWC,GAAAA;AAAA,MACX,QAAA,EAAUC,IAAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,2BACG,IAAA,EAAA,EAAK,SAAA,EAAW,OAAA,EAAU,GAAG,WAC3B,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM;AAAA,IACJ,EAAA,EAAI,CAAA;AAAA,IACJ,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM,EAAA;AAAA,IACN,YAAA,EAAc,GAAA;AAAA,IACd,SAAA,EAAW,EAAA;AAAA,IACX,QAAA,EAAU,GAAA;AAAA,IACV,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,uBACE,GAAA,CAAC,YAAO,SAAA,EAAW,wBAAA,CAAyB,OAAO,CAAA,EAAI,GAAG,aACvD,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ;AAEA,IAAO,cAAA,GAAQ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/react-router/Button/Button.tsx"],"names":["_","_v","_s","_i","_ip","_c","_ch"],"mappings":";;;;;AAWA,SAAS,OAAO,KAAA,EAA8B;AAC5C,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,SAAA;AAAA,IACV,IAAA,GAAO,IAAA;AAAA,IACP,IAAA;AAAA,IACA,YAAA,GAAe,MAAA;AAAA,IACf,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,UAAU,gBAAA,CAAiB,EAAE,SAAS,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAE3E,EAAA,MAAM,0BACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,wBAAS,YAAA,EAAA,EAAK,IAAA,EAAM,MAAM,IAAA,EAAM,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA;AAAA,IACnD;AAAA,GAAA,EACH,CAAA;AAGF,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAQ;AACvB,IAAA,MAAM;AAAA,MACJ,EAAA,EAAIA,EAAAA;AAAA,MACJ,OAAA,EAASC,GAAAA;AAAA,MACT,IAAA,EAAMC,GAAAA;AAAA,MACN,IAAA,EAAMC,GAAAA;AAAA,MACN,YAAA,EAAcC,IAAAA;AAAA,MACd,SAAA,EAAWC,GAAAA;AAAA,MACX,QAAA,EAAUC,IAAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,2BACG,IAAA,EAAA,EAAK,SAAA,EAAW,OAAA,EAAU,GAAG,WAC3B,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM;AAAA,IACJ,EAAA,EAAI,CAAA;AAAA,IACJ,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM,EAAA;AAAA,IACN,YAAA,EAAc,GAAA;AAAA,IACd,SAAA,EAAW,EAAA;AAAA,IACX,QAAA,EAAU,GAAA;AAAA,IACV,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,uBACE,GAAA,CAAC,YAAO,SAAA,EAAW,wBAAA,CAAyB,OAAO,CAAA,EAAI,GAAG,aACvD,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ;AAEA,IAAO,cAAA,GAAQ","file":"chunk-ZTQU4GMY.js","sourcesContent":["import { Link } from 'react-router-dom'\n\nimport {\n getButtonClasses,\n getButtonDisabledClasses,\n iconSizeMap,\n} from '../../Button/Button.utils'\nimport { Icon } from '../../Icon'\n\nimport type { ButtonProps } from './Button.types'\n\nfunction Button(props: Readonly<ButtonProps>) {\n const {\n variant = 'primary',\n size = 'md',\n icon,\n iconPosition = 'left',\n className,\n children,\n } = props\n\n const classes = getButtonClasses({ variant, size, iconPosition, className })\n\n const content = (\n <>\n {icon && <Icon name={icon} size={iconSizeMap[size]} />}\n {children}\n </>\n )\n\n if (props.as === 'link') {\n const {\n as: _,\n variant: _v,\n size: _s,\n icon: _i,\n iconPosition: _ip,\n className: _c,\n children: _ch,\n ...linkProps\n } = props\n\n return (\n <Link className={classes} {...linkProps}>\n {content}\n </Link>\n )\n }\n\n const {\n as: _,\n variant: _v,\n size: _s,\n icon: _i,\n iconPosition: _ip,\n className: _c,\n children: _ch,\n ...buttonProps\n } = props\n\n return (\n <button className={getButtonDisabledClasses(classes)} {...buttonProps}>\n {content}\n </button>\n )\n}\n\nexport default Button\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import './chunk-
|
|
2
|
-
import { Skeleton_default } from './chunk-
|
|
3
|
-
export { Skeleton_default as Skeleton } from './chunk-
|
|
4
|
-
export { Image_default as Image, MovieCard_default as MovieCard } from './chunk-
|
|
5
|
-
import { Button_default } from './chunk-
|
|
6
|
-
export { Button_default as Button } from './chunk-
|
|
7
|
-
import { Typography_default } from './chunk-
|
|
8
|
-
export { Rating_default as Rating, Typography_default as Typography } from './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
export { Card_default as Card } from './chunk-
|
|
11
|
-
import { Icon_default } from './chunk-
|
|
12
|
-
export { Icon_default as Icon } from './chunk-
|
|
1
|
+
import './chunk-DGJI4VNO.js';
|
|
2
|
+
import { Skeleton_default } from './chunk-FJZK3PY6.js';
|
|
3
|
+
export { Skeleton_default as Skeleton } from './chunk-FJZK3PY6.js';
|
|
4
|
+
export { Image_default as Image, MovieCard_default as MovieCard } from './chunk-7IAJQE27.js';
|
|
5
|
+
import { Button_default } from './chunk-ZTQU4GMY.js';
|
|
6
|
+
export { Button_default as Button } from './chunk-ZTQU4GMY.js';
|
|
7
|
+
import { Typography_default } from './chunk-6DP3KZQG.js';
|
|
8
|
+
export { Rating_default as Rating, Typography_default as Typography } from './chunk-6DP3KZQG.js';
|
|
9
|
+
import './chunk-IUGKH376.js';
|
|
10
|
+
export { Card_default as Card } from './chunk-RZU2FFBW.js';
|
|
11
|
+
import { Icon_default } from './chunk-6FBMTGXQ.js';
|
|
12
|
+
export { Icon_default as Icon } from './chunk-6FBMTGXQ.js';
|
|
13
13
|
import clsx8 from 'clsx';
|
|
14
14
|
import { createContext, useState, useRef, useEffect, useCallback, useLayoutEffect, useContext } from 'react';
|
|
15
15
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
package/dist/next/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Skeleton_default } from '../chunk-
|
|
2
|
-
import { getMovieCardLinkClasses, Rating_default, Typography_default, getMovieCardClasses } from '../chunk-
|
|
3
|
-
import { getButtonClasses, iconSizeMap, getButtonDisabledClasses } from '../chunk-
|
|
4
|
-
import { Card_default } from '../chunk-
|
|
5
|
-
import { Icon_default } from '../chunk-
|
|
1
|
+
import { Skeleton_default } from '../chunk-FJZK3PY6.js';
|
|
2
|
+
import { getMovieCardLinkClasses, Rating_default, Typography_default, getMovieCardClasses } from '../chunk-6DP3KZQG.js';
|
|
3
|
+
import { getButtonClasses, iconSizeMap, getButtonDisabledClasses } from '../chunk-IUGKH376.js';
|
|
4
|
+
import { Card_default } from '../chunk-RZU2FFBW.js';
|
|
5
|
+
import { Icon_default } from '../chunk-6FBMTGXQ.js';
|
|
6
6
|
import Link from 'next/link';
|
|
7
7
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
8
8
|
import clsx from 'clsx';
|
|
@@ -63,14 +63,16 @@ function NextImage({
|
|
|
63
63
|
const wrapperRef = useRef(null);
|
|
64
64
|
useEffect(() => {
|
|
65
65
|
const img = wrapperRef.current?.querySelector("img");
|
|
66
|
+
console.warn("NextImage::useEffect - img: ", img);
|
|
66
67
|
if (img?.complete && img.naturalWidth > 0) {
|
|
68
|
+
console.warn("NextImage::useEffect - loaded from cache");
|
|
67
69
|
setState("loaded");
|
|
68
70
|
}
|
|
69
71
|
}, []);
|
|
70
72
|
const handleLoad = useCallback(
|
|
71
73
|
(e) => {
|
|
72
74
|
setState("loaded");
|
|
73
|
-
console.warn("handleLoad::
|
|
75
|
+
console.warn("NextImage::handleLoad::loaded");
|
|
74
76
|
if (typeof onLoad === "function") {
|
|
75
77
|
onLoad(e);
|
|
76
78
|
}
|
|
@@ -80,6 +82,7 @@ function NextImage({
|
|
|
80
82
|
const handleError = useCallback(
|
|
81
83
|
(e) => {
|
|
82
84
|
setState("error");
|
|
85
|
+
console.warn("NextImage::handleError::error");
|
|
83
86
|
if (typeof onError === "function") {
|
|
84
87
|
onError(e);
|
|
85
88
|
}
|
package/dist/next/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/Button/Button.tsx","../../src/next/Image/NextImage.tsx","../../src/next/HeroImage/HeroImage.tsx","../../src/next/MovieCard/MovieCardContent.tsx","../../src/next/MovieCard/MovieCard.tsx"],"names":["_","_v","_s","_i","_ip","_c","_ch","jsx","jsxs","Fragment","Link"],"mappings":"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","file":"index.js","sourcesContent":["import Link from 'next/link'\n\nimport {\n getButtonClasses,\n getButtonDisabledClasses,\n iconSizeMap,\n} from '../../Button/Button.utils'\nimport { Icon } from '../../Icon'\n\nimport type { NextButtonProps } from './Button.types'\n\nfunction Button(props: Readonly<NextButtonProps>) {\n const {\n variant = 'primary',\n size = 'md',\n icon,\n iconPosition = 'left',\n className,\n children,\n } = props\n\n const classes = getButtonClasses({ variant, size, iconPosition, className })\n\n const content = (\n <>\n {icon && <Icon name={icon} size={iconSizeMap[size]} />}\n {children}\n </>\n )\n\n if (props.as === 'link') {\n const {\n as: _,\n variant: _v,\n size: _s,\n icon: _i,\n iconPosition: _ip,\n className: _c,\n children: _ch,\n ...linkProps\n } = props\n\n return (\n <Link className={classes} {...linkProps}>\n {content}\n </Link>\n )\n }\n\n const {\n as: _,\n variant: _v,\n size: _s,\n icon: _i,\n iconPosition: _ip,\n className: _c,\n children: _ch,\n ...buttonProps\n } = props\n\n return (\n <button className={getButtonDisabledClasses(classes)} {...buttonProps}>\n {content}\n </button>\n )\n}\n\nexport default Button\n","'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 if (img?.complete && img.naturalWidth > 0) {\n setState('loaded')\n }\n }, [])\n\n const handleLoad = useCallback(\n (e: SyntheticEvent<HTMLImageElement>) => {\n setState('loaded')\n console.warn('handleLoad::load')\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 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","import { 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: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","import { Card } from '../../Card'\nimport { getMovieCardClasses } from '../../MovieCard/MovieCard.utils'\nimport { Rating } from '../../Rating'\nimport { Typography } from '../../Typography'\nimport { NextImage } from '../Image'\n\nimport type { ImageLoading } from '../../Image/Image'\nimport type { ReactNode } from 'react'\n\ninterface NextMovieCardContentProps {\n id: number\n title: string\n posterUrl: string\n voteAverage: number\n year?: number | null\n className?: string\n imageLoading?: ImageLoading\n isInteractive: boolean\n onClick?: (() => void) | undefined\n blurDataURL?: string\n}\n\nexport default function MovieCardContent({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n isInteractive,\n onClick,\n blurDataURL,\n}: Readonly<NextMovieCardContentProps>): ReactNode {\n const src = `https://image.tmdb.org/t/p/w342${posterUrl}`\n\n return (\n <Card\n variant=\"ghost\"\n className={getMovieCardClasses(isInteractive, className)}\n onClick={onClick}\n data-testid={`movie-card-${String(id)}`}\n >\n <div className=\"ui:relative ui:aspect-[2/3] ui:w-full ui:overflow-hidden ui:rounded-md ui:bg-gray-200\">\n <NextImage\n src={src}\n alt={title}\n width={150}\n height={225}\n loading={imageLoading}\n blurDataURL={blurDataURL}\n className=\"ui:h-full ui:w-full\"\n />\n <div className=\"ui:absolute ui:bottom-2 ui:right-2 ui:flex ui:items-center ui:justify-center ui:rounded-full ui:bg-white/80 ui:p-1\">\n <Rating\n value={voteAverage}\n size=\"sm\"\n variant=\"circle\"\n trackClassName=\"ui:text-gray-200\"\n className=\"ui:drop-shadow\"\n />\n </div>\n </div>\n\n <div className=\"ui:mt-2 ui:flex ui:flex-col ui:gap-0.5 ui:px-1\">\n <Typography\n variant=\"label\"\n as=\"h3\"\n className=\"ui:line-clamp-2\"\n title={title}\n >\n {title}\n </Typography>\n {year && (\n <Typography\n variant=\"caption-xs\"\n className=\"ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground\"\n >\n {year}\n </Typography>\n )}\n </div>\n </Card>\n )\n}\n","import Link from 'next/link'\n\nimport { getMovieCardLinkClasses } from '../../MovieCard/MovieCard.utils'\n\nimport MovieCardContent from './MovieCardContent'\n\nimport type { NextMovieCardProps } from './MovieCard.types'\n\nfunction MovieCard({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n blurDataURL,\n as = 'card',\n ...rest\n}: Readonly<NextMovieCardProps>) {\n const href = 'href' in rest ? rest.href : undefined\n const onClick = 'onClick' in rest ? rest.onClick : undefined\n\n const isInteractive = as === 'link' || as === 'button'\n\n const cardContent = (\n <MovieCardContent\n id={id}\n title={title}\n posterUrl={posterUrl}\n voteAverage={voteAverage}\n year={year}\n className={className}\n imageLoading={imageLoading}\n isInteractive={isInteractive}\n onClick={as === 'button' ? onClick : undefined}\n blurDataURL={blurDataURL}\n />\n )\n\n if (as === 'link' && href) {\n return (\n <Link href={href} className={getMovieCardLinkClasses()}>\n {cardContent}\n </Link>\n )\n }\n\n return cardContent\n}\n\nexport default MovieCard\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/next/Button/Button.tsx","../../src/next/Image/NextImage.tsx","../../src/next/HeroImage/HeroImage.tsx","../../src/next/MovieCard/MovieCardContent.tsx","../../src/next/MovieCard/MovieCard.tsx"],"names":["_","_v","_s","_i","_ip","_c","_ch","jsx","jsxs","Fragment","Link"],"mappings":"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","file":"index.js","sourcesContent":["import Link from 'next/link'\n\nimport {\n getButtonClasses,\n getButtonDisabledClasses,\n iconSizeMap,\n} from '../../Button/Button.utils'\nimport { Icon } from '../../Icon'\n\nimport type { NextButtonProps } from './Button.types'\n\nfunction Button(props: Readonly<NextButtonProps>) {\n const {\n variant = 'primary',\n size = 'md',\n icon,\n iconPosition = 'left',\n className,\n children,\n } = props\n\n const classes = getButtonClasses({ variant, size, iconPosition, className })\n\n const content = (\n <>\n {icon && <Icon name={icon} size={iconSizeMap[size]} />}\n {children}\n </>\n )\n\n if (props.as === 'link') {\n const {\n as: _,\n variant: _v,\n size: _s,\n icon: _i,\n iconPosition: _ip,\n className: _c,\n children: _ch,\n ...linkProps\n } = props\n\n return (\n <Link className={classes} {...linkProps}>\n {content}\n </Link>\n )\n }\n\n const {\n as: _,\n variant: _v,\n size: _s,\n icon: _i,\n iconPosition: _ip,\n className: _c,\n children: _ch,\n ...buttonProps\n } = props\n\n return (\n <button className={getButtonDisabledClasses(classes)} {...buttonProps}>\n {content}\n </button>\n )\n}\n\nexport default Button\n","'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 console.warn('NextImage::useEffect - img: ', img)\n if (img?.complete && img.naturalWidth > 0) {\n console.warn('NextImage::useEffect - loaded from cache')\n setState('loaded')\n }\n }, [])\n\n const handleLoad = useCallback(\n (e: SyntheticEvent<HTMLImageElement>) => {\n setState('loaded')\n console.warn('NextImage::handleLoad::loaded')\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 console.warn('NextImage::handleError::error')\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","import { 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: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","import { Card } from '../../Card'\nimport { getMovieCardClasses } from '../../MovieCard/MovieCard.utils'\nimport { Rating } from '../../Rating'\nimport { Typography } from '../../Typography'\nimport { NextImage } from '../Image'\n\nimport type { ImageLoading } from '../../Image/Image'\nimport type { ReactNode } from 'react'\n\ninterface NextMovieCardContentProps {\n id: number\n title: string\n posterUrl: string\n voteAverage: number\n year?: number | null\n className?: string\n imageLoading?: ImageLoading\n isInteractive: boolean\n onClick?: (() => void) | undefined\n blurDataURL?: string\n}\n\nexport default function MovieCardContent({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n isInteractive,\n onClick,\n blurDataURL,\n}: Readonly<NextMovieCardContentProps>): ReactNode {\n const src = `https://image.tmdb.org/t/p/w342${posterUrl}`\n\n return (\n <Card\n variant=\"ghost\"\n className={getMovieCardClasses(isInteractive, className)}\n onClick={onClick}\n data-testid={`movie-card-${String(id)}`}\n >\n <div className=\"ui:relative ui:aspect-[2/3] ui:w-full ui:overflow-hidden ui:rounded-md ui:bg-gray-200\">\n <NextImage\n src={src}\n alt={title}\n width={150}\n height={225}\n loading={imageLoading}\n blurDataURL={blurDataURL}\n className=\"ui:h-full ui:w-full\"\n />\n <div className=\"ui:absolute ui:bottom-2 ui:right-2 ui:flex ui:items-center ui:justify-center ui:rounded-full ui:bg-white/80 ui:p-1\">\n <Rating\n value={voteAverage}\n size=\"sm\"\n variant=\"circle\"\n trackClassName=\"ui:text-gray-200\"\n className=\"ui:drop-shadow\"\n />\n </div>\n </div>\n\n <div className=\"ui:mt-2 ui:flex ui:flex-col ui:gap-0.5 ui:px-1\">\n <Typography\n variant=\"label\"\n as=\"h3\"\n className=\"ui:line-clamp-2\"\n title={title}\n >\n {title}\n </Typography>\n {year && (\n <Typography\n variant=\"caption-xs\"\n className=\"ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground\"\n >\n {year}\n </Typography>\n )}\n </div>\n </Card>\n )\n}\n","import Link from 'next/link'\n\nimport { getMovieCardLinkClasses } from '../../MovieCard/MovieCard.utils'\n\nimport MovieCardContent from './MovieCardContent'\n\nimport type { NextMovieCardProps } from './MovieCard.types'\n\nfunction MovieCard({\n id,\n title,\n posterUrl,\n voteAverage,\n year,\n className,\n imageLoading = 'lazy',\n blurDataURL,\n as = 'card',\n ...rest\n}: Readonly<NextMovieCardProps>) {\n const href = 'href' in rest ? rest.href : undefined\n const onClick = 'onClick' in rest ? rest.onClick : undefined\n\n const isInteractive = as === 'link' || as === 'button'\n\n const cardContent = (\n <MovieCardContent\n id={id}\n title={title}\n posterUrl={posterUrl}\n voteAverage={voteAverage}\n year={year}\n className={className}\n imageLoading={imageLoading}\n isInteractive={isInteractive}\n onClick={as === 'button' ? onClick : undefined}\n blurDataURL={blurDataURL}\n />\n )\n\n if (as === 'link' && href) {\n return (\n <Link href={href} className={getMovieCardLinkClasses()}>\n {cardContent}\n </Link>\n )\n }\n\n return cardContent\n}\n\nexport default MovieCard\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { MovieCard_default as MovieCard } from '../chunk-
|
|
2
|
-
export { Button_default as Button } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
6
|
-
import '../chunk-
|
|
1
|
+
export { MovieCard_default as MovieCard } from '../chunk-7IAJQE27.js';
|
|
2
|
+
export { Button_default as Button } from '../chunk-ZTQU4GMY.js';
|
|
3
|
+
import '../chunk-6DP3KZQG.js';
|
|
4
|
+
import '../chunk-IUGKH376.js';
|
|
5
|
+
import '../chunk-RZU2FFBW.js';
|
|
6
|
+
import '../chunk-6FBMTGXQ.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Button/Button.utils.ts"],"names":[],"mappings":";;;AAaO,IAAM,WAAA,GAAc;AAAA,EACzB,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAWO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,MAAA;AAAA,EACf;AACF,CAAA,EAAsB;AACpB,EAAA,OAAO,IAAA;AAAA,IACL,gIAAA;AAAA,IACA,4CAAA;AAAA,IACA,iFAAA;AAAA,IACA;AAAA,MACE,eAAe,YAAA,KAAiB,MAAA;AAAA,MAChC,uBAAuB,YAAA,KAAiB;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,mEACE,OAAA,KAAY,SAAA;AAAA,MACd,yEACE,OAAA,KAAY,WAAA;AAAA,MACd,+EACE,OAAA,KAAY,aAAA;AAAA,MACd,uFACE,OAAA,KAAY,SAAA;AAAA,MACd,sDAAsD,OAAA,KAAY;AAAA,KACpE;AAAA,IACA;AAAA,MACE,6BAA6B,IAAA,KAAS,IAAA;AAAA,MACtC,gCAAgC,IAAA,KAAS,IAAA;AAAA,MACzC,8BAA8B,IAAA,KAAS;AAAA,KACzC;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,yBAAyB,OAAA,EAAiB;AACxD,EAAA,OAAO,IAAA,CAAK,SAAS,wDAAwD,CAAA;AAC/E","file":"chunk-FDLKS7BI.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { IconName } from '../Icon'\nimport type { ReactNode } from 'react'\n\nexport type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'destructive'\n | 'outline'\n | 'ghost'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\nexport const iconSizeMap = {\n sm: 16,\n md: 20,\n lg: 24,\n} as const\n\nexport interface ButtonVisualInput {\n variant?: ButtonVariant\n size?: ButtonSize\n icon?: IconName\n iconPosition?: 'left' | 'right'\n className?: string\n children?: ReactNode\n}\n\nexport function getButtonClasses({\n variant = 'primary',\n size = 'md',\n iconPosition = 'left',\n className,\n}: ButtonVisualInput) {\n return clsx(\n 'ui:inline-flex ui:items-center ui:justify-center ui:cursor-pointer ui:gap-2 ui:font-roboto ui:font-medium ui:transition-colors',\n 'ui:rounded ui:border ui:border-transparent',\n 'ui:focus:outline-none ui:focus:ring-2 ui:focus:ring-ring ui:focus:ring-offset-2',\n {\n 'ui:flex-row': iconPosition === 'left',\n 'ui:flex-row-reverse': iconPosition === 'right',\n },\n {\n 'ui:bg-primary ui:text-primary-foreground ui:hover:bg-primary/90':\n variant === 'primary',\n 'ui:bg-secondary ui:text-secondary-foreground ui:hover:bg-secondary/80':\n variant === 'secondary',\n 'ui:bg-destructive ui:text-destructive-foreground ui:hover:bg-destructive/90':\n variant === 'destructive',\n 'ui:border-input ui:bg-background ui:hover:bg-accent ui:hover:text-accent-foreground':\n variant === 'outline',\n 'ui:hover:bg-accent ui:hover:text-accent-foreground': variant === 'ghost',\n },\n {\n 'ui:h-8 ui:px-3 ui:text-sm': size === 'sm',\n 'ui:h-10 ui:px-4 ui:text-base': size === 'md',\n 'ui:h-12 ui:px-6 ui:text-lg': size === 'lg',\n },\n className\n )\n}\n\nexport function getButtonDisabledClasses(classes: string) {\n return clsx(classes, 'ui:disabled:pointer-events-none ui:disabled:opacity-50')\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Icon/Icon.tsx"],"names":["ArrowLeftIcon24","ArrowRightIcon24","ArrowTopRightOnSquareIcon24","Bars3Icon24","BookmarkIcon24","CalendarIcon24","CheckIcon24","ChevronDownIcon24","ChevronLeftIcon24","ChevronRightIcon24","ChevronUpIcon24","EllipsisVerticalIcon24","ExclamationCircleIcon24","ExclamationTriangleIcon24","FilmIcon24","PhotoIcon24","HeartIcon24","InformationCircleIcon24","LinkIcon24","MagnifyingGlassIcon24","MinusIcon24","PlayIcon24","PlayCircleIcon24","PlusIcon24","ShareIcon24","StarIcon24","TvIcon24","UserIcon24","UsersIcon24","XMarkIcon24","ArrowLeftIcon20","ArrowRightIcon20","ArrowTopRightOnSquareIcon20","Bars3Icon20","BookmarkIcon20","CalendarIcon20","CheckIcon20","ChevronDownIcon20","ChevronLeftIcon20","ChevronRightIcon20","ChevronUpIcon20","EllipsisVerticalIcon20","ExclamationCircleIcon20","ExclamationTriangleIcon20","FilmIcon20","PhotoIcon20","HeartIcon20","InformationCircleIcon20","LinkIcon20","MagnifyingGlassIcon20","MinusIcon20","PlayIcon20","PlayCircleIcon20","PlusIcon20","ShareIcon20","StarIcon20","TvIcon20","UserIcon20","UsersIcon20","XMarkIcon20","ArrowLeftIcon16","ArrowRightIcon16","Bars3Icon16","BookmarkIcon16","CalendarIcon16","CheckIcon16","ChevronDownIcon16","ChevronLeftIcon16","ChevronRightIcon16","ChevronUpIcon16","EllipsisVerticalIcon16","ExclamationCircleIcon16","ExclamationTriangleIcon16","HeartIcon16","InformationCircleIcon16","LinkIcon16","MagnifyingGlassIcon16","MinusIcon16","PlayIcon16","PlusIcon16","StarIcon16","UserIcon16","XMarkIcon16"],"mappings":"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","file":"chunk-JHRISQQJ.js","sourcesContent":["import {\n ArrowLeftIcon as ArrowLeftIcon16,\n ArrowRightIcon as ArrowRightIcon16,\n Bars3Icon as Bars3Icon16,\n BookmarkIcon as BookmarkIcon16,\n CalendarIcon as CalendarIcon16,\n CheckIcon as CheckIcon16,\n ChevronDownIcon as ChevronDownIcon16,\n ChevronLeftIcon as ChevronLeftIcon16,\n ChevronRightIcon as ChevronRightIcon16,\n ChevronUpIcon as ChevronUpIcon16,\n EllipsisVerticalIcon as EllipsisVerticalIcon16,\n ExclamationCircleIcon as ExclamationCircleIcon16,\n ExclamationTriangleIcon as ExclamationTriangleIcon16,\n HeartIcon as HeartIcon16,\n InformationCircleIcon as InformationCircleIcon16,\n LinkIcon as LinkIcon16,\n MagnifyingGlassIcon as MagnifyingGlassIcon16,\n MinusIcon as MinusIcon16,\n PlayIcon as PlayIcon16,\n PlusIcon as PlusIcon16,\n StarIcon as StarIcon16,\n UserIcon as UserIcon16,\n XMarkIcon as XMarkIcon16,\n} from '@heroicons/react/16/solid'\nimport {\n ArrowLeftIcon as ArrowLeftIcon20,\n ArrowRightIcon as ArrowRightIcon20,\n ArrowTopRightOnSquareIcon as ArrowTopRightOnSquareIcon20,\n Bars3Icon as Bars3Icon20,\n BookmarkIcon as BookmarkIcon20,\n CalendarIcon as CalendarIcon20,\n CheckIcon as CheckIcon20,\n ChevronDownIcon as ChevronDownIcon20,\n ChevronLeftIcon as ChevronLeftIcon20,\n ChevronRightIcon as ChevronRightIcon20,\n ChevronUpIcon as ChevronUpIcon20,\n EllipsisVerticalIcon as EllipsisVerticalIcon20,\n ExclamationCircleIcon as ExclamationCircleIcon20,\n ExclamationTriangleIcon as ExclamationTriangleIcon20,\n FilmIcon as FilmIcon20,\n HeartIcon as HeartIcon20,\n InformationCircleIcon as InformationCircleIcon20,\n LinkIcon as LinkIcon20,\n MagnifyingGlassIcon as MagnifyingGlassIcon20,\n MinusIcon as MinusIcon20,\n PhotoIcon as PhotoIcon20,\n PlayCircleIcon as PlayCircleIcon20,\n PlayIcon as PlayIcon20,\n PlusIcon as PlusIcon20,\n ShareIcon as ShareIcon20,\n StarIcon as StarIcon20,\n TvIcon as TvIcon20,\n UserIcon as UserIcon20,\n UsersIcon as UsersIcon20,\n XMarkIcon as XMarkIcon20,\n} from '@heroicons/react/20/solid'\nimport {\n ArrowLeftIcon as ArrowLeftIcon24,\n ArrowRightIcon as ArrowRightIcon24,\n ArrowTopRightOnSquareIcon as ArrowTopRightOnSquareIcon24,\n Bars3Icon as Bars3Icon24,\n BookmarkIcon as BookmarkIcon24,\n CalendarIcon as CalendarIcon24,\n CheckIcon as CheckIcon24,\n ChevronDownIcon as ChevronDownIcon24,\n ChevronLeftIcon as ChevronLeftIcon24,\n ChevronRightIcon as ChevronRightIcon24,\n ChevronUpIcon as ChevronUpIcon24,\n EllipsisVerticalIcon as EllipsisVerticalIcon24,\n ExclamationCircleIcon as ExclamationCircleIcon24,\n ExclamationTriangleIcon as ExclamationTriangleIcon24,\n FilmIcon as FilmIcon24,\n HeartIcon as HeartIcon24,\n InformationCircleIcon as InformationCircleIcon24,\n LinkIcon as LinkIcon24,\n MagnifyingGlassIcon as MagnifyingGlassIcon24,\n MinusIcon as MinusIcon24,\n PhotoIcon as PhotoIcon24,\n PlayCircleIcon as PlayCircleIcon24,\n PlayIcon as PlayIcon24,\n PlusIcon as PlusIcon24,\n ShareIcon as ShareIcon24,\n StarIcon as StarIcon24,\n TvIcon as TvIcon24,\n UserIcon as UserIcon24,\n UsersIcon as UsersIcon24,\n XMarkIcon as XMarkIcon24,\n} from '@heroicons/react/24/outline'\n\nimport type { ComponentType, SVGProps } from 'react'\n\ntype HeroIcon = ComponentType<SVGProps<SVGSVGElement>>\n\nconst iconMap24: Record<string, HeroIcon> = {\n ArrowLeft: ArrowLeftIcon24,\n ArrowRight: ArrowRightIcon24,\n ArrowTopRightOnSquare: ArrowTopRightOnSquareIcon24,\n Bars3: Bars3Icon24,\n Bookmark: BookmarkIcon24,\n Calendar: CalendarIcon24,\n Check: CheckIcon24,\n ChevronDown: ChevronDownIcon24,\n ChevronLeft: ChevronLeftIcon24,\n ChevronRight: ChevronRightIcon24,\n ChevronUp: ChevronUpIcon24,\n EllipsisVertical: EllipsisVerticalIcon24,\n ExclamationCircle: ExclamationCircleIcon24,\n ExclamationTriangle: ExclamationTriangleIcon24,\n Film: FilmIcon24,\n Photo: PhotoIcon24,\n Heart: HeartIcon24,\n InformationCircle: InformationCircleIcon24,\n Link: LinkIcon24,\n MagnifyingGlass: MagnifyingGlassIcon24,\n Minus: MinusIcon24,\n Play: PlayIcon24,\n PlayCircle: PlayCircleIcon24,\n Plus: PlusIcon24,\n Share: ShareIcon24,\n Star: StarIcon24,\n Tv: TvIcon24,\n User: UserIcon24,\n Users: UsersIcon24,\n XMark: XMarkIcon24,\n}\n\nconst iconMap20: Record<string, HeroIcon> = {\n ArrowLeft: ArrowLeftIcon20,\n ArrowRight: ArrowRightIcon20,\n ArrowTopRightOnSquare: ArrowTopRightOnSquareIcon20,\n Bars3: Bars3Icon20,\n Bookmark: BookmarkIcon20,\n Calendar: CalendarIcon20,\n Check: CheckIcon20,\n ChevronDown: ChevronDownIcon20,\n ChevronLeft: ChevronLeftIcon20,\n ChevronRight: ChevronRightIcon20,\n ChevronUp: ChevronUpIcon20,\n EllipsisVertical: EllipsisVerticalIcon20,\n ExclamationCircle: ExclamationCircleIcon20,\n ExclamationTriangle: ExclamationTriangleIcon20,\n Film: FilmIcon20,\n Photo: PhotoIcon20,\n Heart: HeartIcon20,\n InformationCircle: InformationCircleIcon20,\n Link: LinkIcon20,\n MagnifyingGlass: MagnifyingGlassIcon20,\n Minus: MinusIcon20,\n Play: PlayIcon20,\n PlayCircle: PlayCircleIcon20,\n Plus: PlusIcon20,\n Share: ShareIcon20,\n Star: StarIcon20,\n Tv: TvIcon20,\n User: UserIcon20,\n Users: UsersIcon20,\n XMark: XMarkIcon20,\n}\n\nconst iconMap16: Record<string, HeroIcon> = {\n ArrowLeft: ArrowLeftIcon16,\n ArrowRight: ArrowRightIcon16,\n Bars3: Bars3Icon16,\n Bookmark: BookmarkIcon16,\n Calendar: CalendarIcon16,\n Check: CheckIcon16,\n ChevronDown: ChevronDownIcon16,\n ChevronLeft: ChevronLeftIcon16,\n ChevronRight: ChevronRightIcon16,\n ChevronUp: ChevronUpIcon16,\n EllipsisVertical: EllipsisVerticalIcon16,\n ExclamationCircle: ExclamationCircleIcon16,\n ExclamationTriangle: ExclamationTriangleIcon16,\n Heart: HeartIcon16,\n InformationCircle: InformationCircleIcon16,\n Link: LinkIcon16,\n MagnifyingGlass: MagnifyingGlassIcon16,\n Minus: MinusIcon16,\n Play: PlayIcon16,\n Plus: PlusIcon16,\n Star: StarIcon16,\n User: UserIcon16,\n XMark: XMarkIcon16,\n}\n\nexport type IconName =\n | 'ArrowLeft'\n | 'ArrowRight'\n | 'ArrowTopRightOnSquare'\n | 'Bars3'\n | 'Bookmark'\n | 'Check'\n | 'Calendar'\n | 'ChevronDown'\n | 'ChevronLeft'\n | 'ChevronRight'\n | 'ChevronUp'\n | 'EllipsisVertical'\n | 'ExclamationCircle'\n | 'ExclamationTriangle'\n | 'Film'\n | 'Photo'\n | 'Heart'\n | 'InformationCircle'\n | 'Link'\n | 'MagnifyingGlass'\n | 'Minus'\n | 'Play'\n | 'PlayCircle'\n | 'Plus'\n | 'Share'\n | 'Star'\n | 'Tv'\n | 'User'\n | 'Users'\n | 'XMark'\n\nexport type IconSize = 16 | 20 | 24 | 32 | 48 | 64\n\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n /** Icon name from the available subset */\n name: IconName\n /** Icon size in pixels (16, 20, 24, 32, 48, 64) */\n size?: IconSize\n}\n\nfunction Icon({ name, size = 24, className, ...rest }: Readonly<IconProps>) {\n let IconComponent: HeroIcon\n\n if (size <= 16) {\n IconComponent = iconMap16[name] ?? iconMap20[name]\n } else if (size <= 20) {\n IconComponent = iconMap20[name]\n } else {\n IconComponent = iconMap24[name]\n }\n\n return (\n <IconComponent\n className={className}\n width={size}\n height={size}\n {...rest}\n aria-hidden\n />\n )\n}\n\nexport default Icon\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Card/Card.tsx"],"names":[],"mappings":";;;;AAWA,IAAM,aAAA,GAA6C;AAAA,EACjD,OAAA,EACE,sEAAA;AAAA,EACF,OAAA,EAAS,mEAAA;AAAA,EACT,QAAA,EACE,sEAAA;AAAA,EACF,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,IAAA,CAAK;AAAA,EACZ,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC1D,QAAA,EACH,CAAA;AAEJ;AAEA,IAAO,YAAA,GAAQ","file":"chunk-JI3OVXCK.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { HTMLAttributes } from 'react'\n\nexport type CardVariant = 'default' | 'outline' | 'elevated' | 'ghost'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** Visual variant of the card */\n variant?: CardVariant\n}\n\nconst variantStyles: Record<CardVariant, string> = {\n default:\n 'ui:rounded-md ui:p-4 ui:bg-card ui:text-card-foreground ui:shadow-md',\n outline: 'ui:rounded-md ui:p-4 ui:border ui:border-border ui:bg-transparent',\n elevated:\n 'ui:rounded-lg ui:p-6 ui:bg-card ui:text-card-foreground ui:shadow-lg',\n ghost: 'ui:rounded-md',\n}\n\nfunction Card({\n className,\n variant = 'default',\n children,\n ...rest\n}: Readonly<CardProps>) {\n return (\n <div className={clsx(variantStyles[variant], className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport default Card\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Skeleton/Skeleton.tsx"],"names":[],"mappings":";;;;AAsBA,SAAS,QAAA,CAAS;AAAA,EAChB,OAAA,GAAU,WAAA;AAAA,EACV,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA;AAAA,QACT,4CAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,UACE,eAAA,EAAiB,YAAY,WAAA,IAAe,OAAA;AAAA,UAC5C,mBAAmB,OAAA,KAAY,QAAA;AAAA,UAC/B,YAAA,EAAc,YAAY,MAAA,IAAU;AAAA,SACtC;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,WAAA,GAAc,EAAE,WAAA,EAAY,GAAI,MAAA;AAAA,MACtC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,IAAO,gBAAA,GAAQ","file":"chunk-JPJYJLAP.js","sourcesContent":["import clsx from 'clsx'\n\nimport type { ComponentProps } from 'react'\n\nexport interface SkeletonProps extends ComponentProps<'div'> {\n /** Shape variant */\n variant?: 'rectangle' | 'circle' | 'line'\n /** Width (Tailwind class or custom value) */\n width?: string\n /** Height (Tailwind class or custom value) */\n height?: string\n /** Aspect ratio (e.g., \"2/3\", \"16/9\", \"1/1\") */\n aspectRatio?: string\n /** Apply rounded corners (default: true for rectangle/line, always true for circle) */\n rounded?: boolean\n}\n\n/**\n * Skeleton - Atomic loading placeholder component\n *\n * Composable primitive for building loading states with shimmer effect.\n */\nfunction Skeleton({\n variant = 'rectangle',\n width,\n height,\n aspectRatio,\n rounded = true,\n className,\n ...rest\n}: Readonly<SkeletonProps>) {\n return (\n <div\n className={clsx(\n 'ui:relative ui:overflow-hidden ui:bg-muted',\n 'ui-skeleton-shimmer',\n {\n 'ui:rounded-lg': variant === 'rectangle' && rounded,\n 'ui:rounded-full': variant === 'circle',\n 'ui:rounded': variant === 'line' && rounded,\n },\n width,\n height,\n className\n )}\n style={aspectRatio ? { aspectRatio } : undefined}\n {...rest}\n />\n )\n}\n\nexport default Skeleton\n"]}
|
package/dist/chunk-Y5GP5OWN.js
DELETED