@vite-mf-monorepo/ui 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,120 @@
1
+ import { Skeleton_default } from '../chunk-JPJYJLAP.js';
2
+ import { getMovieCardLinkClasses, MovieCardContent } from '../chunk-JDBRVX5O.js';
3
+ import { getButtonClasses, iconSizeMap, getButtonDisabledClasses } from '../chunk-FDLKS7BI.js';
4
+ import '../chunk-JI3OVXCK.js';
5
+ import { Icon_default } from '../chunk-JHRISQQJ.js';
6
+ import Link from 'next/link';
7
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
8
+ import Image from 'next/image';
9
+ import { useState } from 'react';
10
+
11
+ function Button(props) {
12
+ const {
13
+ variant = "primary",
14
+ size = "md",
15
+ icon,
16
+ iconPosition = "left",
17
+ className,
18
+ children
19
+ } = props;
20
+ const classes = getButtonClasses({ variant, size, iconPosition, className });
21
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ icon && /* @__PURE__ */ jsx(Icon_default, { name: icon, size: iconSizeMap[size] }),
23
+ children
24
+ ] });
25
+ if (props.as === "link") {
26
+ const {
27
+ as: _2,
28
+ variant: _v2,
29
+ size: _s2,
30
+ icon: _i2,
31
+ iconPosition: _ip2,
32
+ className: _c2,
33
+ children: _ch2,
34
+ ...linkProps
35
+ } = props;
36
+ return /* @__PURE__ */ jsx(Link, { className: classes, ...linkProps, children: content });
37
+ }
38
+ const {
39
+ as: _,
40
+ variant: _v,
41
+ size: _s,
42
+ icon: _i,
43
+ iconPosition: _ip,
44
+ className: _c,
45
+ children: _ch,
46
+ ...buttonProps
47
+ } = props;
48
+ return /* @__PURE__ */ jsx("button", { className: getButtonDisabledClasses(classes), ...buttonProps, children: content });
49
+ }
50
+ var Button_default = Button;
51
+ function HeroImage({ backdropPath, title }) {
52
+ const [loading, setLoading] = useState(true);
53
+ const src = backdropPath ? `https://image.tmdb.org/t/p/original${backdropPath}` : void 0;
54
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
55
+ loading && /* @__PURE__ */ jsx(
56
+ Skeleton_default,
57
+ {
58
+ "data-testid": "hero-image-skeleton",
59
+ variant: "rectangle",
60
+ width: "ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0",
61
+ aspectRatio: "21/9",
62
+ rounded: false
63
+ }
64
+ ),
65
+ src && /* @__PURE__ */ jsx(
66
+ Image,
67
+ {
68
+ src,
69
+ alt: title ?? "Unknown",
70
+ fill: true,
71
+ priority: true,
72
+ sizes: "100vw",
73
+ className: "ui:relative ui:h-full ui:w-full ui:object-cover ui:object-center ui:z-0",
74
+ onLoad: () => {
75
+ setLoading(false);
76
+ }
77
+ }
78
+ ),
79
+ /* @__PURE__ */ jsx("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" })
80
+ ] });
81
+ }
82
+ var HeroImage_default = HeroImage;
83
+ function MovieCard({
84
+ id,
85
+ title,
86
+ posterUrl,
87
+ voteAverage,
88
+ year,
89
+ className,
90
+ imageLoading = "lazy",
91
+ as = "card",
92
+ ...rest
93
+ }) {
94
+ const href = "href" in rest ? rest.href : void 0;
95
+ const onClick = "onClick" in rest ? rest.onClick : void 0;
96
+ const isInteractive = as === "link" || as === "button";
97
+ const cardContent = /* @__PURE__ */ jsx(
98
+ MovieCardContent,
99
+ {
100
+ id,
101
+ title,
102
+ posterUrl,
103
+ voteAverage,
104
+ year,
105
+ className,
106
+ imageLoading,
107
+ isInteractive,
108
+ onClick: as === "button" ? onClick : void 0
109
+ }
110
+ );
111
+ if (as === "link" && href) {
112
+ return /* @__PURE__ */ jsx(Link, { href, className: getMovieCardLinkClasses(), children: cardContent });
113
+ }
114
+ return cardContent;
115
+ }
116
+ var MovieCard_default = MovieCard;
117
+
118
+ export { Button_default as Button, HeroImage_default as HeroImage, MovieCard_default as MovieCard };
119
+ //# sourceMappingURL=index.js.map
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/next/Button/Button.tsx","../../src/next/HeroImage/HeroImage.tsx","../../src/next/MovieCard/MovieCard.tsx"],"names":["_","_v","_s","_i","_ip","_c","_ch","jsxs","Fragment","jsx","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","import Image from 'next/image'\nimport { useState } from 'react'\n\nimport { Skeleton } from '../../Skeleton'\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 [loading, setLoading] = useState(true)\n\n const src = backdropPath\n ? `https://image.tmdb.org/t/p/original${backdropPath}`\n : undefined\n\n return (\n <>\n {loading && (\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 {src && (\n <Image\n src={src}\n alt={title ?? 'Unknown'}\n fill\n priority\n sizes=\"100vw\"\n className=\"ui:relative ui:h-full ui:w-full ui:object-cover ui:object-center ui:z-0\"\n onLoad={() => {\n setLoading(false)\n }}\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 Link from 'next/link'\n\nimport { getMovieCardLinkClasses } from '../../MovieCard/MovieCard.utils'\nimport MovieCardContent from '../../MovieCard/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 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 />\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"]}
@@ -0,0 +1,19 @@
1
+ export { Button, ButtonAsButton, ButtonAsLink, ButtonProps } from '../Button/index.js';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { M as MovieCardAsCard, a as MovieCardBaseProps, b as MovieCardAsButton } from '../MovieCard.utils-CpNUUs8O.js';
4
+ import '../Icon/index.js';
5
+ import 'react';
6
+ import 'react-router-dom';
7
+
8
+ interface MovieCardAsLink extends MovieCardBaseProps {
9
+ /** Render as React Router Link */
10
+ as: 'link';
11
+ /** Navigation path (required when as="link") */
12
+ to: string;
13
+ onClick?: never;
14
+ }
15
+ type MovieCardProps = MovieCardAsCard | MovieCardAsLink | MovieCardAsButton;
16
+
17
+ declare function MovieCard({ id, title, posterUrl, voteAverage, year, className, imageLoading, as, ...rest }: Readonly<MovieCardProps>): react_jsx_runtime.JSX.Element;
18
+
19
+ export { MovieCard, MovieCardAsButton, MovieCardAsCard, type MovieCardAsLink, MovieCardBaseProps, type MovieCardProps };
@@ -0,0 +1,8 @@
1
+ export { MovieCard_default as MovieCard } from '../chunk-5NW3IDX2.js';
2
+ export { Button_default as Button } from '../chunk-WYIIOTWJ.js';
3
+ import '../chunk-JDBRVX5O.js';
4
+ import '../chunk-FDLKS7BI.js';
5
+ import '../chunk-JI3OVXCK.js';
6
+ import '../chunk-JHRISQQJ.js';
7
+ //# sourceMappingURL=index.js.map
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vite-mf-monorepo/ui",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Design system components for vite-mf-monorepo",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -16,6 +16,18 @@
16
16
  "default": "./dist/index.js"
17
17
  }
18
18
  },
19
+ "./react-router": {
20
+ "import": {
21
+ "types": "./dist/react-router/index.d.ts",
22
+ "default": "./dist/react-router/index.js"
23
+ }
24
+ },
25
+ "./next": {
26
+ "import": {
27
+ "types": "./dist/next/index.d.ts",
28
+ "default": "./dist/next/index.js"
29
+ }
30
+ },
19
31
  "./*": {
20
32
  "import": {
21
33
  "types": "./dist/*/index.d.ts",
@@ -31,10 +43,19 @@
31
43
  "dist"
32
44
  ],
33
45
  "peerDependencies": {
46
+ "next": ">=14",
34
47
  "react": "19.2.4",
35
48
  "react-dom": "19.2.4",
36
49
  "react-router-dom": "7.5.2"
37
50
  },
51
+ "peerDependenciesMeta": {
52
+ "react-router-dom": {
53
+ "optional": true
54
+ },
55
+ "next": {
56
+ "optional": true
57
+ }
58
+ },
38
59
  "devDependencies": {
39
60
  "@tailwindcss/postcss": "4.1.0",
40
61
  "@testing-library/jest-dom": "6.6.3",
@@ -47,6 +68,7 @@
47
68
  "autoprefixer": "10.4.21",
48
69
  "conventional-changelog": "7.2.0",
49
70
  "jsdom": "26.0.0",
71
+ "next": "^16.2.0",
50
72
  "postcss": "8.5.3",
51
73
  "react-router-dom": "7.5.2",
52
74
  "tailwindcss": "4.1.0",
@@ -57,7 +79,7 @@
57
79
  "dependencies": {
58
80
  "@heroicons/react": "^2.2.0",
59
81
  "clsx": "2.1.1",
60
- "@vite-mf-monorepo/shared": "0.0.3"
82
+ "@vite-mf-monorepo/shared": "0.0.5"
61
83
  },
62
84
  "scripts": {
63
85
  "build:css": "tailwindcss -i ./src/styles.css -o ./dist/styles.css",
@@ -1,85 +0,0 @@
1
- import { Icon_default } from './chunk-JHRISQQJ.js';
2
- import clsx from 'clsx';
3
- import { Link } from 'react-router-dom';
4
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
-
6
- var iconSizeMap = {
7
- sm: 16,
8
- md: 20,
9
- lg: 24
10
- };
11
- function Button(props) {
12
- const {
13
- variant = "primary",
14
- size = "md",
15
- icon,
16
- iconPosition = "left",
17
- className,
18
- children
19
- } = props;
20
- const classes = clsx(
21
- "ui:inline-flex ui:items-center ui:justify-center ui:cursor-pointer ui:gap-2 ui:font-roboto ui:font-medium ui:transition-colors",
22
- "ui:rounded ui:border ui:border-transparent",
23
- "ui:focus:outline-none ui:focus:ring-2 ui:focus:ring-ring ui:focus:ring-offset-2",
24
- {
25
- "ui:flex-row": iconPosition === "left",
26
- "ui:flex-row-reverse": iconPosition === "right"
27
- },
28
- {
29
- "ui:bg-primary ui:text-primary-foreground ui:hover:bg-primary/90": variant === "primary",
30
- "ui:bg-secondary ui:text-secondary-foreground ui:hover:bg-secondary/80": variant === "secondary",
31
- "ui:bg-destructive ui:text-destructive-foreground ui:hover:bg-destructive/90": variant === "destructive",
32
- "ui:border-input ui:bg-background ui:hover:bg-accent ui:hover:text-accent-foreground": variant === "outline",
33
- "ui:hover:bg-accent ui:hover:text-accent-foreground": variant === "ghost"
34
- },
35
- {
36
- "ui:h-8 ui:px-3 ui:text-sm": size === "sm",
37
- "ui:h-10 ui:px-4 ui:text-base": size === "md",
38
- "ui:h-12 ui:px-6 ui:text-lg": size === "lg"
39
- },
40
- className
41
- );
42
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [
43
- icon && /* @__PURE__ */ jsx(Icon_default, { name: icon, size: iconSizeMap[size] }),
44
- children
45
- ] });
46
- if (props.as === "link") {
47
- const {
48
- as: _2,
49
- variant: _v2,
50
- size: _s2,
51
- icon: _i2,
52
- iconPosition: _ip2,
53
- className: _c2,
54
- children: _ch2,
55
- ...linkProps
56
- } = props;
57
- return /* @__PURE__ */ jsx(Link, { className: classes, ...linkProps, children: content });
58
- }
59
- const {
60
- as: _,
61
- variant: _v,
62
- size: _s,
63
- icon: _i,
64
- iconPosition: _ip,
65
- className: _c,
66
- children: _ch,
67
- ...buttonProps
68
- } = props;
69
- return /* @__PURE__ */ jsx(
70
- "button",
71
- {
72
- className: clsx(
73
- classes,
74
- "ui:disabled:pointer-events-none ui:disabled:opacity-50"
75
- ),
76
- ...buttonProps,
77
- children: content
78
- }
79
- );
80
- }
81
- var Button_default = Button;
82
-
83
- export { Button_default };
84
- //# sourceMappingURL=chunk-GNBS5RLB.js.map
85
- //# sourceMappingURL=chunk-GNBS5RLB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/Button/Button.tsx"],"names":["_","_v","_s","_i","_ip","_c","_ch"],"mappings":";;;;;AAOA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,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,OAAA,GAAU,IAAA;AAAA,IACd,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;AAEA,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;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA;AAAA,QACT,OAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,WAAA;AAAA,MAEH,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,IAAO,cAAA,GAAQ","file":"chunk-GNBS5RLB.js","sourcesContent":["import clsx from 'clsx'\nimport { Link } from 'react-router-dom'\n\nimport { Icon } from '../Icon'\n\nimport type { ButtonProps } from './Button.types'\n\nconst iconSizeMap = {\n sm: 16,\n md: 20,\n lg: 24,\n} as const\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 = 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 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\n className={clsx(\n classes,\n 'ui:disabled:pointer-events-none ui:disabled:opacity-50'\n )}\n {...buttonProps}\n >\n {content}\n </button>\n )\n}\n\nexport default Button\n"]}