@uxf/ui 1.0.0-beta.11 → 1.0.0-beta.16
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/avatar/avatar.d.ts +14 -0
- package/avatar/avatar.jsx +10 -0
- package/avatar/avatar.stories.d.ts +8 -0
- package/avatar/avatar.stories.jsx +29 -0
- package/avatar/theme.d.ts +5 -0
- package/avatar/theme.js +2 -0
- package/{styles → button}/button.css +8 -8
- package/button/button.d.ts +1 -0
- package/button/button.jsx +17 -0
- package/button/button.stories.jsx +59 -0
- package/{stories → button}/button.stories.tsx +1 -1
- package/button/button.tsx +36 -0
- package/button/index.js +0 -1
- package/button/index.ts +2 -0
- package/button/theme.js +0 -1
- package/button/theme.ts +20 -0
- package/image-gallery/components/close-button.jsx +13 -0
- package/image-gallery/components/close-button.tsx +19 -0
- package/image-gallery/components/dot.jsx +12 -0
- package/image-gallery/components/dot.tsx +17 -0
- package/image-gallery/components/gallery.jsx +74 -0
- package/image-gallery/components/gallery.tsx +67 -0
- package/image-gallery/components/icon-chevron-left.jsx +12 -0
- package/image-gallery/components/icon-chevron-left.tsx +18 -0
- package/image-gallery/components/icon-chevron-right.jsx +12 -0
- package/image-gallery/components/icon-chevron-right.tsx +18 -0
- package/image-gallery/components/icon-close.jsx +12 -0
- package/image-gallery/components/icon-close.tsx +22 -0
- package/image-gallery/components/next-button.jsx +13 -0
- package/image-gallery/components/next-button.tsx +19 -0
- package/image-gallery/components/previous-button.jsx +13 -0
- package/image-gallery/components/previous-button.tsx +19 -0
- package/image-gallery/context.jsx +12 -0
- package/image-gallery/context.tsx +17 -0
- package/image-gallery/image-gallery.jsx +58 -0
- package/image-gallery/image-gallery.stories.jsx +29 -0
- package/{stories → image-gallery}/image-gallery.stories.tsx +0 -0
- package/image-gallery/image-gallery.tsx +59 -0
- package/image-gallery/image.jsx +12 -0
- package/image-gallery/image.tsx +19 -0
- package/image-gallery/index.js +0 -1
- package/image-gallery/index.ts +3 -0
- package/image-gallery/types.js +0 -1
- package/image-gallery/types.ts +6 -0
- package/image-gallery/use-image.js +5 -6
- package/image-gallery/use-image.ts +17 -0
- package/input/index.d.ts +13 -6
- package/input/index.js +14 -14
- package/input/index.ts +14 -0
- package/input/input-basic.css +18 -0
- package/input/input-element.d.ts +8 -0
- package/input/input-element.jsx +11 -0
- package/input/input-element.tsx +30 -0
- package/input/input-left-addon.jsx +10 -0
- package/input/input-left-addon.tsx +12 -0
- package/input/input-left-element.jsx +10 -0
- package/input/input-left-element.tsx +11 -0
- package/input/input-right-addon.jsx +10 -0
- package/input/input-right-addon.tsx +11 -0
- package/input/input-right-element.jsx +10 -0
- package/input/input-right-element.tsx +11 -0
- package/{styles → input}/input.css +27 -26
- package/input/input.d.ts +8 -7
- package/input/input.jsx +65 -0
- package/input/input.stories.d.ts +9 -4
- package/input/input.stories.jsx +78 -0
- package/input/input.stories.tsx +79 -0
- package/input/input.tsx +70 -0
- package/input/theme.js +0 -1
- package/input/theme.ts +7 -0
- package/package.json +11 -41
- package/text-input/index.d.ts +1 -0
- package/{storybook → text-input}/index.js +1 -2
- package/text-input/index.ts +1 -0
- package/text-input/text-input.css +29 -0
- package/text-input/text-input.d.ts +22 -0
- package/text-input/text-input.jsx +32 -0
- package/text-input/text-input.stories.d.ts +9 -0
- package/text-input/text-input.stories.jsx +55 -0
- package/text-input/text-input.stories.tsx +72 -0
- package/text-input/text-input.tsx +99 -0
- package/tsconfig.json +7 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/types/form-control-props.d.ts +1 -1
- package/types/form-control-props.js +0 -1
- package/types/form-control-props.ts +35 -0
- package/types/index.d.ts +1 -0
- package/types/index.js +17 -0
- package/types/index.ts +1 -0
- package/{storybook → utils}/action.d.ts +0 -0
- package/utils/action.js +11 -0
- package/utils/action.ts +14 -0
- package/{styles → utils}/component-structure-analyzer.css +0 -0
- package/utils/component-structure-analyzer.jsx +10 -0
- package/utils/component-structure-analyzer.tsx +12 -0
- package/utils/cx.js +8 -13
- package/utils/cx.ts +56 -0
- package/utils/forwardRef.js +3 -4
- package/utils/forwardRef.ts +30 -0
- package/{storybook → utils}/storybook-config.d.ts +1 -1
- package/{storybook/storybook-config.js → utils/storybook-config.jsx} +3 -4
- package/utils/storybook-config.tsx +42 -0
- package/button/button.js +0 -17
- package/button/button.stories.js +0 -33
- package/image-gallery/components/close-button.js +0 -13
- package/image-gallery/components/dot.js +0 -13
- package/image-gallery/components/gallery.js +0 -68
- package/image-gallery/components/icon-chevron-left.js +0 -12
- package/image-gallery/components/icon-chevron-right.js +0 -12
- package/image-gallery/components/icon-close.js +0 -12
- package/image-gallery/components/next-button.js +0 -13
- package/image-gallery/components/previous-button.js +0 -13
- package/image-gallery/context.js +0 -13
- package/image-gallery/image-gallery.js +0 -87
- package/image-gallery/image-gallery.stories.js +0 -27
- package/image-gallery/image.js +0 -13
- package/input/input-group.d.ts +0 -9
- package/input/input-group.js +0 -78
- package/input/input-left-addon.js +0 -11
- package/input/input-left-element.js +0 -11
- package/input/input-right-addon.js +0 -11
- package/input/input-right-element.js +0 -11
- package/input/input.js +0 -12
- package/input/input.stories.js +0 -105
- package/stories/input.stories.tsx +0 -101
- package/storybook/action.js +0 -41
- package/storybook/index.d.ts +0 -1
- package/styles/input-basic.css +0 -18
- package/types.d.ts +0 -3
- package/types.js +0 -3
- package/utils/component-structure-analyzer.js +0 -11
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { AvatarSizes } from "./theme";
|
|
3
|
+
interface FileResponse {
|
|
4
|
+
uuid: string;
|
|
5
|
+
namespace?: string;
|
|
6
|
+
extension: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AvatarProps {
|
|
9
|
+
src: FileResponse | string | null | undefined;
|
|
10
|
+
size?: keyof AvatarSizes;
|
|
11
|
+
rounded?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function Avatar(props: AvatarProps): JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Avatar = void 0;
|
|
4
|
+
const cx_1 = require("@uxf/core/utils/cx");
|
|
5
|
+
function Avatar(props) {
|
|
6
|
+
var _a;
|
|
7
|
+
const className = (0, cx_1.cx)("avatar", `avatar--size-${props.size}`, `avatar--variant-${(_a = props.circular) !== null && _a !== void 0 ? _a : "default"}`);
|
|
8
|
+
return <img src={props.src} className={className}/>;
|
|
9
|
+
}
|
|
10
|
+
exports.Avatar = Avatar;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Default = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const storybook_config_1 = require("@uxf/ui/utils/storybook-config");
|
|
9
|
+
const avatar_1 = require("./avatar");
|
|
10
|
+
exports.default = {
|
|
11
|
+
title: "UI/Avatar",
|
|
12
|
+
component: avatar_1.Avatar,
|
|
13
|
+
};
|
|
14
|
+
function Default() {
|
|
15
|
+
const config = (0, storybook_config_1.useStorybookConfig)("Button");
|
|
16
|
+
return (<div className="space-y-4">
|
|
17
|
+
<div className="flex flex-row items-center space-x-4">
|
|
18
|
+
<avatar_1.Avatar src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" size="8"/>
|
|
19
|
+
<avatar_1.Avatar src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" size="10"/>
|
|
20
|
+
<avatar_1.Avatar src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" size="12"/>
|
|
21
|
+
</div>
|
|
22
|
+
<div className="flex flex-row items-center space-x-4">
|
|
23
|
+
<avatar_1.Avatar src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" size="8" variant="circular"/>
|
|
24
|
+
<avatar_1.Avatar src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" size="10" variant="circular"/>
|
|
25
|
+
<avatar_1.Avatar src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" size="12" variant="circular"/>
|
|
26
|
+
</div>
|
|
27
|
+
</div>);
|
|
28
|
+
}
|
|
29
|
+
exports.Default = Default;
|
package/avatar/theme.js
ADDED
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
.button {
|
|
2
2
|
@apply inline-flex items-center rounded font-medium shadow-md shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2;
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
&--disabled {
|
|
5
5
|
@apply pointer-events-none opacity-40;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
&--size-xs {
|
|
9
9
|
@apply px-2.5 py-1.5 text-xs;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
&--size-sm {
|
|
13
13
|
@apply px-3 py-2 text-sm leading-4;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
&--size-default {
|
|
17
17
|
@apply px-4 py-2 text-sm;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
&--size-lg {
|
|
21
21
|
@apply px-4 py-2 text-base;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
&--size-xl {
|
|
25
25
|
@apply border px-6 py-3 text-base;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
&--variant-outlined {
|
|
29
29
|
@apply border bg-white;
|
|
30
30
|
|
|
31
31
|
&.button--color-default {
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
&--variant-default {
|
|
53
53
|
@apply border-transparent text-white;
|
|
54
54
|
|
|
55
55
|
&.button--color-default {
|
package/button/button.d.ts
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const cx_1 = require("@uxf/core/utils/cx");
|
|
8
|
+
function Button(props) {
|
|
9
|
+
var _a, _b, _c;
|
|
10
|
+
const className = (0, cx_1.cx)("button", `button--color-${(_a = props.color) !== null && _a !== void 0 ? _a : "default"}`, `button--size-${(_b = props.size) !== null && _b !== void 0 ? _b : "default"}`, `button--variant-${(_c = props.variant) !== null && _c !== void 0 ? _c : "default"}`, props.disabled && `button--disabled`, props.loading && `button--loading`);
|
|
11
|
+
return (<button type={props.type} className={className}>
|
|
12
|
+
{props.startAdornment}
|
|
13
|
+
{props.children}
|
|
14
|
+
{props.endAdornment}
|
|
15
|
+
</button>);
|
|
16
|
+
}
|
|
17
|
+
exports.default = Button;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Loading = exports.Disabled = exports.Default = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const button_1 = require("@uxf/ui/button");
|
|
9
|
+
const storybook_config_1 = require("@uxf/ui/utils/storybook-config");
|
|
10
|
+
const react_2 = require("react");
|
|
11
|
+
exports.default = {
|
|
12
|
+
title: "UI/Button",
|
|
13
|
+
component: button_1.Button,
|
|
14
|
+
};
|
|
15
|
+
function Default() {
|
|
16
|
+
const config = (0, storybook_config_1.useStorybookConfig)("Button");
|
|
17
|
+
return (<div className="space-y-2">
|
|
18
|
+
{config.variants.map((variant) => (<react_2.Fragment key={variant}>
|
|
19
|
+
{config.colors.map((color) => (<react_2.Fragment key={color}>
|
|
20
|
+
{config.sizes.map((size) => (<div>
|
|
21
|
+
<button_1.Button key={size} variant={variant} color={color} size={size}>
|
|
22
|
+
Button
|
|
23
|
+
</button_1.Button>
|
|
24
|
+
</div>))}
|
|
25
|
+
</react_2.Fragment>))}
|
|
26
|
+
</react_2.Fragment>))}
|
|
27
|
+
</div>);
|
|
28
|
+
}
|
|
29
|
+
exports.Default = Default;
|
|
30
|
+
function Disabled() {
|
|
31
|
+
const config = (0, storybook_config_1.useStorybookConfig)("Button");
|
|
32
|
+
return (<div className="space-y-2">
|
|
33
|
+
{config.variants.map((variant) => (<react_2.Fragment key={variant}>
|
|
34
|
+
{config.colors.map((color) => (<react_2.Fragment key={color}>
|
|
35
|
+
{config.sizes.map((size) => (<div>
|
|
36
|
+
<button_1.Button key={size} variant={variant} color={color} size={size} disabled>
|
|
37
|
+
Button
|
|
38
|
+
</button_1.Button>
|
|
39
|
+
</div>))}
|
|
40
|
+
</react_2.Fragment>))}
|
|
41
|
+
</react_2.Fragment>))}
|
|
42
|
+
</div>);
|
|
43
|
+
}
|
|
44
|
+
exports.Disabled = Disabled;
|
|
45
|
+
function Loading() {
|
|
46
|
+
const config = (0, storybook_config_1.useStorybookConfig)("Button");
|
|
47
|
+
return (<div className="space-y-2">
|
|
48
|
+
{config.variants.map((variant) => (<react_2.Fragment key={variant}>
|
|
49
|
+
{config.colors.map((color) => (<react_2.Fragment key={color}>
|
|
50
|
+
{config.sizes.map((size) => (<div>
|
|
51
|
+
<button_1.Button key={size} variant={variant} color={color} size={size} loading>
|
|
52
|
+
Button
|
|
53
|
+
</button_1.Button>
|
|
54
|
+
</div>))}
|
|
55
|
+
</react_2.Fragment>))}
|
|
56
|
+
</react_2.Fragment>))}
|
|
57
|
+
</div>);
|
|
58
|
+
}
|
|
59
|
+
exports.Loading = Loading;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React, { ReactNode } from "react";
|
|
2
|
+
import { ButtonColors, ButtonSizes, ButtonVariants } from "@uxf/ui/button";
|
|
3
|
+
import { cx } from "@uxf/core/utils/cx";
|
|
4
|
+
|
|
5
|
+
interface ButtonProps {
|
|
6
|
+
variant?: keyof ButtonVariants;
|
|
7
|
+
color?: keyof ButtonColors;
|
|
8
|
+
size?: keyof ButtonSizes;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
loading?: boolean;
|
|
11
|
+
startAdornment?: ReactNode;
|
|
12
|
+
endAdornment?: ReactNode;
|
|
13
|
+
type?: "button" | "submit" | "reset";
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function Button(props: ButtonProps) {
|
|
18
|
+
const className = cx(
|
|
19
|
+
"button",
|
|
20
|
+
`button--color-${props.color ?? "default"}`,
|
|
21
|
+
`button--size-${props.size ?? "default"}`,
|
|
22
|
+
`button--variant-${props.variant ?? "default"}`,
|
|
23
|
+
props.disabled && `button--disabled`,
|
|
24
|
+
props.loading && `button--loading`
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<button type={props.type} className={className}>
|
|
29
|
+
{props.startAdornment}
|
|
30
|
+
{props.children}
|
|
31
|
+
{props.endAdornment}
|
|
32
|
+
</button>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export default Button;
|
package/button/index.js
CHANGED
|
@@ -21,4 +21,3 @@ exports.Button = void 0;
|
|
|
21
21
|
var button_1 = require("@uxf/ui/button/button");
|
|
22
22
|
Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return __importDefault(button_1).default; } });
|
|
23
23
|
__exportStar(require("@uxf/ui/button/theme"), exports);
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnV0dG9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQTBEO0FBQWpELGlIQUFBLE9BQU8sT0FBVTtBQUMxQix1REFBcUMifQ==
|
package/button/index.ts
ADDED
package/button/theme.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnV0dG9uL3RoZW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
package/button/theme.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ButtonVariants {
|
|
2
|
+
outlined: true;
|
|
3
|
+
default: true;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface ButtonSizes {
|
|
7
|
+
xs: true;
|
|
8
|
+
sm: true;
|
|
9
|
+
default: true;
|
|
10
|
+
lg: true;
|
|
11
|
+
xl: true;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ButtonColors {
|
|
15
|
+
default: true;
|
|
16
|
+
white: true;
|
|
17
|
+
success: true;
|
|
18
|
+
warning: true;
|
|
19
|
+
error: true;
|
|
20
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const icon_close_1 = __importDefault(require("./icon-close"));
|
|
8
|
+
function CloseButton(props) {
|
|
9
|
+
return (<button className="bg-black bg-opacity-50 p-3" onClick={() => props.onClick()}>
|
|
10
|
+
<icon_close_1.default />
|
|
11
|
+
</button>);
|
|
12
|
+
}
|
|
13
|
+
exports.default = CloseButton;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import IconClose from "./icon-close";
|
|
3
|
+
|
|
4
|
+
interface CloseButtonProps {
|
|
5
|
+
onClick: () => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function CloseButton(props: CloseButtonProps) {
|
|
9
|
+
return (
|
|
10
|
+
<button
|
|
11
|
+
className="bg-black bg-opacity-50 p-3"
|
|
12
|
+
onClick={() => props.onClick()}
|
|
13
|
+
>
|
|
14
|
+
<IconClose />
|
|
15
|
+
</button>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default CloseButton;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const cx_1 = require("@uxf/core/utils/cx");
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
function Dot(props) {
|
|
9
|
+
const className = (0, cx_1.cx)("h-2 w-2 rounded-full", props.active ? "bg-gray-500" : "bg-white");
|
|
10
|
+
return <div className={className}/>;
|
|
11
|
+
}
|
|
12
|
+
exports.default = Dot;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { cx } from "@uxf/core/utils/cx";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
interface DotProps {
|
|
5
|
+
active?: boolean;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function Dot(props: DotProps) {
|
|
9
|
+
const className = cx(
|
|
10
|
+
"h-2 w-2 rounded-full",
|
|
11
|
+
props.active ? "bg-gray-500" : "bg-white"
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
return <div className={className} />;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default Dot;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const close_button_1 = __importDefault(require("./close-button"));
|
|
30
|
+
const previous_button_1 = __importDefault(require("./previous-button"));
|
|
31
|
+
const next_button_1 = __importDefault(require("./next-button"));
|
|
32
|
+
const dot_1 = __importDefault(require("./dot"));
|
|
33
|
+
const react_1 = __importStar(require("react"));
|
|
34
|
+
function Gallery(props) {
|
|
35
|
+
(0, react_1.useEffect)(() => {
|
|
36
|
+
const onKeyDown = (event) => {
|
|
37
|
+
switch (event.key) {
|
|
38
|
+
case "ArrowRight":
|
|
39
|
+
props.onNext();
|
|
40
|
+
break;
|
|
41
|
+
case "ArrowLeft":
|
|
42
|
+
props.onPrevious();
|
|
43
|
+
break;
|
|
44
|
+
case "Escape":
|
|
45
|
+
props.onClose();
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
document.body.style.overflow = "hidden";
|
|
50
|
+
window.addEventListener("keydown", onKeyDown);
|
|
51
|
+
return () => {
|
|
52
|
+
document.body.style.overflow = "auto";
|
|
53
|
+
window.removeEventListener("keydown", onKeyDown);
|
|
54
|
+
};
|
|
55
|
+
}, []);
|
|
56
|
+
return (<div className="fixed inset-0 top-0 bottom-0 z-50 flex flex-col bg-black bg-opacity-75 transition-opacity">
|
|
57
|
+
<div className="flex justify-end">
|
|
58
|
+
<close_button_1.default onClick={props.onClose}/>
|
|
59
|
+
</div>
|
|
60
|
+
<div className="container mx-auto flex h-full flex-1 flex-col">
|
|
61
|
+
<div className="relative flex flex-1 items-center justify-center">
|
|
62
|
+
<img className="absolute left-0 right-0 top-0 h-full w-full object-contain" src={props.images[props.imageIndex].src}/>
|
|
63
|
+
<div className="pointer-events-none absolute inset-0 flex items-center justify-between p-2">
|
|
64
|
+
<previous_button_1.default onClick={props.onPrevious}/>
|
|
65
|
+
<next_button_1.default onClick={props.onNext}/>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div className="row mx-auto flex space-x-2 p-4">
|
|
70
|
+
{props.images.map((url, index) => (<dot_1.default key={url.src} active={index === props.imageIndex}/>))}
|
|
71
|
+
</div>
|
|
72
|
+
</div>);
|
|
73
|
+
}
|
|
74
|
+
exports.default = Gallery;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import CloseButton from "./close-button";
|
|
2
|
+
import PreviousButton from "./previous-button";
|
|
3
|
+
import NextButton from "./next-button";
|
|
4
|
+
import Dot from "./dot";
|
|
5
|
+
import React, { useEffect } from "react";
|
|
6
|
+
import { ImageGalleryImageProps } from "../types";
|
|
7
|
+
|
|
8
|
+
interface GalleryProps {
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
onNext: () => void;
|
|
11
|
+
onPrevious: () => void;
|
|
12
|
+
imageIndex: number;
|
|
13
|
+
images: ImageGalleryImageProps[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function Gallery(props: GalleryProps) {
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const onKeyDown = (event: KeyboardEvent) => {
|
|
19
|
+
switch (event.key) {
|
|
20
|
+
case "ArrowRight":
|
|
21
|
+
props.onNext();
|
|
22
|
+
break;
|
|
23
|
+
case "ArrowLeft":
|
|
24
|
+
props.onPrevious();
|
|
25
|
+
break;
|
|
26
|
+
case "Escape":
|
|
27
|
+
props.onClose();
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
document.body.style.overflow = "hidden";
|
|
33
|
+
window.addEventListener("keydown", onKeyDown);
|
|
34
|
+
|
|
35
|
+
return () => {
|
|
36
|
+
document.body.style.overflow = "auto";
|
|
37
|
+
window.removeEventListener("keydown", onKeyDown);
|
|
38
|
+
};
|
|
39
|
+
}, []);
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<div className="fixed inset-0 top-0 bottom-0 z-50 flex flex-col bg-black bg-opacity-75 transition-opacity">
|
|
43
|
+
<div className="flex justify-end">
|
|
44
|
+
<CloseButton onClick={props.onClose} />
|
|
45
|
+
</div>
|
|
46
|
+
<div className="container mx-auto flex h-full flex-1 flex-col">
|
|
47
|
+
<div className="relative flex flex-1 items-center justify-center">
|
|
48
|
+
<img
|
|
49
|
+
className="absolute left-0 right-0 top-0 h-full w-full object-contain"
|
|
50
|
+
src={props.images[props.imageIndex].src}
|
|
51
|
+
/>
|
|
52
|
+
<div className="pointer-events-none absolute inset-0 flex items-center justify-between p-2">
|
|
53
|
+
<PreviousButton onClick={props.onPrevious} />
|
|
54
|
+
<NextButton onClick={props.onNext} />
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
<div className="row mx-auto flex space-x-2 p-4">
|
|
59
|
+
{props.images.map((url, index) => (
|
|
60
|
+
<Dot key={url.src} active={index === props.imageIndex} />
|
|
61
|
+
))}
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export default Gallery;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
function IconChevronLeft() {
|
|
8
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" className="h-10 w-10 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
|
|
9
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M15 19l-7-7 7-7"/>
|
|
10
|
+
</svg>);
|
|
11
|
+
}
|
|
12
|
+
exports.default = IconChevronLeft;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
function IconChevronLeft() {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
className="h-10 w-10 text-white"
|
|
8
|
+
fill="none"
|
|
9
|
+
viewBox="0 0 24 24"
|
|
10
|
+
stroke="currentColor"
|
|
11
|
+
strokeWidth={2}
|
|
12
|
+
>
|
|
13
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M15 19l-7-7 7-7" />
|
|
14
|
+
</svg>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default IconChevronLeft;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
function IconChevronRight() {
|
|
8
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" className="h-10 w-10 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
|
|
9
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M9 5l7 7-7 7"/>
|
|
10
|
+
</svg>);
|
|
11
|
+
}
|
|
12
|
+
exports.default = IconChevronRight;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
function IconChevronRight() {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
className="h-10 w-10 text-white"
|
|
8
|
+
fill="none"
|
|
9
|
+
viewBox="0 0 24 24"
|
|
10
|
+
stroke="currentColor"
|
|
11
|
+
strokeWidth={2}
|
|
12
|
+
>
|
|
13
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M9 5l7 7-7 7" />
|
|
14
|
+
</svg>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default IconChevronRight;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
function IconClose() {
|
|
8
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2} className="h-10 w-10 text-white">
|
|
9
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M6 18L18 6M6 6l12 12"/>
|
|
10
|
+
</svg>);
|
|
11
|
+
}
|
|
12
|
+
exports.default = IconClose;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
function IconClose() {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
fill="none"
|
|
8
|
+
viewBox="0 0 24 24"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
strokeWidth={2}
|
|
11
|
+
className="h-10 w-10 text-white"
|
|
12
|
+
>
|
|
13
|
+
<path
|
|
14
|
+
strokeLinecap="round"
|
|
15
|
+
strokeLinejoin="round"
|
|
16
|
+
d="M6 18L18 6M6 6l12 12"
|
|
17
|
+
/>
|
|
18
|
+
</svg>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default IconClose;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const icon_chevron_right_1 = __importDefault(require("./icon-chevron-right"));
|
|
8
|
+
function NextButton(props) {
|
|
9
|
+
return (<button className="pointer-events-auto rounded-full bg-black bg-opacity-50 p-2" onClick={props.onClick}>
|
|
10
|
+
<icon_chevron_right_1.default />
|
|
11
|
+
</button>);
|
|
12
|
+
}
|
|
13
|
+
exports.default = NextButton;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import IconChevronRight from "./icon-chevron-right";
|
|
3
|
+
|
|
4
|
+
interface NextButtonProps {
|
|
5
|
+
onClick: () => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function NextButton(props: NextButtonProps) {
|
|
9
|
+
return (
|
|
10
|
+
<button
|
|
11
|
+
className="pointer-events-auto rounded-full bg-black bg-opacity-50 p-2"
|
|
12
|
+
onClick={props.onClick}
|
|
13
|
+
>
|
|
14
|
+
<IconChevronRight />
|
|
15
|
+
</button>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default NextButton;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const icon_chevron_left_1 = __importDefault(require("./icon-chevron-left"));
|
|
8
|
+
function PreviousButton(props) {
|
|
9
|
+
return (<button className="pointer-events-auto rounded-full bg-black bg-opacity-50 p-2" onClick={props.onClick}>
|
|
10
|
+
<icon_chevron_left_1.default />
|
|
11
|
+
</button>);
|
|
12
|
+
}
|
|
13
|
+
exports.default = PreviousButton;
|