jvetrau-ds 0.1.42 → 0.1.44
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/components/avatar/avatar.cjs +12 -2
- package/components/avatar/avatar.cjs.map +1 -1
- package/components/avatar/avatar.js +8 -2
- package/components/avatar/avatar.js.map +1 -1
- package/components/avatar-upload/avatar-upload.cjs +116 -0
- package/components/avatar-upload/avatar-upload.cjs.map +1 -0
- package/components/avatar-upload/avatar-upload.css +89 -0
- package/components/avatar-upload/avatar-upload.d.ts +15 -0
- package/components/avatar-upload/avatar-upload.js +108 -0
- package/components/avatar-upload/avatar-upload.js.map +1 -0
- package/components/avatar-upload/index.cjs +13 -0
- package/components/avatar-upload/index.cjs.map +1 -0
- package/components/avatar-upload/index.d.ts +2 -0
- package/components/avatar-upload/index.js +3 -0
- package/components/avatar-upload/index.js.map +1 -0
- package/components/flip-list/flip-list.cjs +131 -0
- package/components/flip-list/flip-list.cjs.map +1 -0
- package/components/flip-list/flip-list.css +354 -0
- package/components/flip-list/flip-list.d.ts +28 -0
- package/components/flip-list/flip-list.js +125 -0
- package/components/flip-list/flip-list.js.map +1 -0
- package/components/flip-list/index.cjs +22 -0
- package/components/flip-list/index.cjs.map +1 -0
- package/components/flip-list/index.d.ts +3 -0
- package/components/flip-list/index.js +3 -0
- package/components/flip-list/index.js.map +1 -0
- package/components/index.cjs +12 -0
- package/components/index.d.ts +4 -0
- package/components/index.js +2 -0
- package/index.cjs +12 -0
- package/index.d.ts +4 -0
- package/index.js +2 -0
- package/package.json +1 -1
- package/styles.css +447 -0
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
4
5
|
require('./avatar.css');
|
|
5
6
|
var classnames = require('../helpers/classnames');
|
|
6
7
|
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
11
|
+
|
|
7
12
|
const Avatar = ({
|
|
8
13
|
src,
|
|
9
14
|
alt = "",
|
|
@@ -12,16 +17,21 @@ const Avatar = ({
|
|
|
12
17
|
onClick,
|
|
13
18
|
...props
|
|
14
19
|
}) => {
|
|
20
|
+
const [failedSrc, setFailedSrc] = React__default.default.useState();
|
|
15
21
|
const isInteractive = !!onClick;
|
|
22
|
+
const showImage = Boolean(src) && src !== failedSrc;
|
|
16
23
|
const classes = classnames.classnames("avatar", className, {
|
|
17
24
|
"avatar--button": isInteractive
|
|
18
25
|
});
|
|
19
|
-
const content =
|
|
26
|
+
const content = showImage ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
20
27
|
"img",
|
|
21
28
|
{
|
|
22
29
|
className: "avatar__image",
|
|
23
30
|
src,
|
|
24
|
-
alt
|
|
31
|
+
alt,
|
|
32
|
+
onError: () => {
|
|
33
|
+
setFailedSrc(src);
|
|
34
|
+
}
|
|
25
35
|
}
|
|
26
36
|
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "avatar__initials", children: initials });
|
|
27
37
|
if (isInteractive) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/avatar/avatar.tsx"],"names":["classnames","jsx"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/avatar/avatar.tsx"],"names":["React","classnames","jsx"],"mappings":";;;;;;;;;;;AA2BA,MAAM,SAAgC,CAAC;AAAA,EACrC,GAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAC5BA,uBAAM,QAAA,EAA6B;AAErC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,OAAA;AAExB,EAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,GAAG,CAAA,IAAK,GAAA,KAAQ,SAAA;AAE1B,EAAA,MAAM,OAAA,GAAUC,qBAAA,CAAW,QAAA,EAAU,SAAA,EAAW;AAAA,IAC9C,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAED,EAAA,MAAM,UAAU,SAAA,mBACdC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,eAAA;AAAA,MACV,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,YAAA,CAAa,GAAG,CAAA;AAAA,MAClB;AAAA;AAAA,GACF,mBAEAA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBACb,QAAA,EAAA,QAAA,EACH,CAAA;AAGF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBACEA,cAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,OAAA;AAAA,QACX,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,KAAA,CAAM,YAAY,CAAA,IAAK,GAAA;AAAA,QACnC,OAAA;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAY,GAAA;AAAA,MACX,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,IAAO,cAAA,GAAQ","file":"avatar.cjs","sourcesContent":["import React from 'react';\nimport './avatar.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface AvatarBaseProps\n extends React.HTMLAttributes<HTMLDivElement> {\n src?: string;\n alt?: string;\n initials?: string;\n}\n\ntype AvatarStaticProps =\n AvatarBaseProps &\n React.HTMLAttributes<HTMLDivElement> & {\n onClick?: undefined;\n };\n\ntype AvatarButtonProps =\n AvatarBaseProps &\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n };\n\nexport type AvatarProps =\n | AvatarStaticProps\n | AvatarButtonProps;\n\nconst Avatar: React.FC<AvatarProps> = ({\n src,\n alt = '',\n initials,\n className = '',\n onClick,\n ...props\n}) => {\n const [failedSrc, setFailedSrc] =\n React.useState<string | undefined>();\n\n const isInteractive = !!onClick;\n\n const showImage =\n Boolean(src) && src !== failedSrc;\n\n const classes = classnames('avatar', className, {\n 'avatar--button': isInteractive,\n });\n\n const content = showImage ? (\n <img\n className=\"avatar__image\"\n src={src}\n alt={alt}\n onError={() => {\n setFailedSrc(src);\n }}\n />\n ) : (\n <span className=\"avatar__initials\">\n {initials}\n </span>\n );\n\n if (isInteractive) {\n return (\n <button\n className={classes}\n type=\"button\"\n aria-label={props['aria-label'] ?? alt}\n onClick={onClick}\n {...props as React.ButtonHTMLAttributes<HTMLButtonElement>}\n >\n {content}\n </button>\n );\n }\n\n return (\n <div\n className={classes}\n aria-label={alt}\n {...props as React.HTMLAttributes<HTMLDivElement>}\n >\n {content}\n </div>\n );\n};\n\nexport default Avatar;\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
2
3
|
import './avatar.css';
|
|
3
4
|
import { classnames } from '../helpers/classnames';
|
|
4
5
|
|
|
@@ -10,16 +11,21 @@ const Avatar = ({
|
|
|
10
11
|
onClick,
|
|
11
12
|
...props
|
|
12
13
|
}) => {
|
|
14
|
+
const [failedSrc, setFailedSrc] = React.useState();
|
|
13
15
|
const isInteractive = !!onClick;
|
|
16
|
+
const showImage = Boolean(src) && src !== failedSrc;
|
|
14
17
|
const classes = classnames("avatar", className, {
|
|
15
18
|
"avatar--button": isInteractive
|
|
16
19
|
});
|
|
17
|
-
const content =
|
|
20
|
+
const content = showImage ? /* @__PURE__ */ jsx(
|
|
18
21
|
"img",
|
|
19
22
|
{
|
|
20
23
|
className: "avatar__image",
|
|
21
24
|
src,
|
|
22
|
-
alt
|
|
25
|
+
alt,
|
|
26
|
+
onError: () => {
|
|
27
|
+
setFailedSrc(src);
|
|
28
|
+
}
|
|
23
29
|
}
|
|
24
30
|
) : /* @__PURE__ */ jsx("span", { className: "avatar__initials", children: initials });
|
|
25
31
|
if (isInteractive) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/avatar/avatar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/avatar/avatar.tsx"],"names":[],"mappings":";;;;;AA2BA,MAAM,SAAgC,CAAC;AAAA,EACrC,GAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAC5B,MAAM,QAAA,EAA6B;AAErC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,OAAA;AAExB,EAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,GAAG,CAAA,IAAK,GAAA,KAAQ,SAAA;AAE1B,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,SAAA,EAAW;AAAA,IAC9C,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAED,EAAA,MAAM,UAAU,SAAA,mBACd,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,eAAA;AAAA,MACV,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,YAAA,CAAa,GAAG,CAAA;AAAA,MAClB;AAAA;AAAA,GACF,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBACb,QAAA,EAAA,QAAA,EACH,CAAA;AAGF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,OAAA;AAAA,QACX,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,KAAA,CAAM,YAAY,CAAA,IAAK,GAAA;AAAA,QACnC,OAAA;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAY,GAAA;AAAA,MACX,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,IAAO,cAAA,GAAQ","file":"avatar.js","sourcesContent":["import React from 'react';\nimport './avatar.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface AvatarBaseProps\n extends React.HTMLAttributes<HTMLDivElement> {\n src?: string;\n alt?: string;\n initials?: string;\n}\n\ntype AvatarStaticProps =\n AvatarBaseProps &\n React.HTMLAttributes<HTMLDivElement> & {\n onClick?: undefined;\n };\n\ntype AvatarButtonProps =\n AvatarBaseProps &\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n };\n\nexport type AvatarProps =\n | AvatarStaticProps\n | AvatarButtonProps;\n\nconst Avatar: React.FC<AvatarProps> = ({\n src,\n alt = '',\n initials,\n className = '',\n onClick,\n ...props\n}) => {\n const [failedSrc, setFailedSrc] =\n React.useState<string | undefined>();\n\n const isInteractive = !!onClick;\n\n const showImage =\n Boolean(src) && src !== failedSrc;\n\n const classes = classnames('avatar', className, {\n 'avatar--button': isInteractive,\n });\n\n const content = showImage ? (\n <img\n className=\"avatar__image\"\n src={src}\n alt={alt}\n onError={() => {\n setFailedSrc(src);\n }}\n />\n ) : (\n <span className=\"avatar__initials\">\n {initials}\n </span>\n );\n\n if (isInteractive) {\n return (\n <button\n className={classes}\n type=\"button\"\n aria-label={props['aria-label'] ?? alt}\n onClick={onClick}\n {...props as React.ButtonHTMLAttributes<HTMLButtonElement>}\n >\n {content}\n </button>\n );\n }\n\n return (\n <div\n className={classes}\n aria-label={alt}\n {...props as React.HTMLAttributes<HTMLDivElement>}\n >\n {content}\n </div>\n );\n};\n\nexport default Avatar;\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
require('./avatar-upload.css');
|
|
6
|
+
var Avatar = require('../avatar/avatar');
|
|
7
|
+
var Button = require('../button/button');
|
|
8
|
+
var classnames = require('../helpers/classnames');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
13
|
+
var Avatar__default = /*#__PURE__*/_interopDefault(Avatar);
|
|
14
|
+
var Button__default = /*#__PURE__*/_interopDefault(Button);
|
|
15
|
+
|
|
16
|
+
const AvatarUpload = ({
|
|
17
|
+
src,
|
|
18
|
+
initials,
|
|
19
|
+
alt,
|
|
20
|
+
accept,
|
|
21
|
+
disabled = false,
|
|
22
|
+
loading = false,
|
|
23
|
+
error,
|
|
24
|
+
selectLabel,
|
|
25
|
+
onFileSelect,
|
|
26
|
+
className = "",
|
|
27
|
+
...props
|
|
28
|
+
}) => {
|
|
29
|
+
const inputRef = React__default.default.useRef(
|
|
30
|
+
null
|
|
31
|
+
);
|
|
32
|
+
const reactId = React__default.default.useId();
|
|
33
|
+
const errorId = `${reactId}-error`;
|
|
34
|
+
const hasError = error !== null && error !== void 0;
|
|
35
|
+
const isDisabled = disabled || loading;
|
|
36
|
+
const classes = classnames.classnames(
|
|
37
|
+
"avatar-upload",
|
|
38
|
+
className,
|
|
39
|
+
{
|
|
40
|
+
"avatar-upload--disabled": isDisabled,
|
|
41
|
+
"avatar-upload--loading": loading,
|
|
42
|
+
"avatar-upload--error": hasError
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
const handleSelectClick = () => {
|
|
46
|
+
if (isDisabled) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
inputRef.current?.click();
|
|
50
|
+
};
|
|
51
|
+
const handleFileChange = (event) => {
|
|
52
|
+
const input = event.currentTarget;
|
|
53
|
+
const file = input.files?.[0];
|
|
54
|
+
input.value = "";
|
|
55
|
+
if (!file) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
onFileSelect(file);
|
|
59
|
+
};
|
|
60
|
+
const resolvedAriaBusy = loading ? true : props["aria-busy"];
|
|
61
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
...props,
|
|
65
|
+
className: classes,
|
|
66
|
+
"aria-busy": resolvedAriaBusy,
|
|
67
|
+
children: [
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
69
|
+
Avatar__default.default,
|
|
70
|
+
{
|
|
71
|
+
className: "avatar-upload__avatar",
|
|
72
|
+
src,
|
|
73
|
+
initials,
|
|
74
|
+
alt
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
78
|
+
"input",
|
|
79
|
+
{
|
|
80
|
+
ref: inputRef,
|
|
81
|
+
className: "avatar-upload__input",
|
|
82
|
+
type: "file",
|
|
83
|
+
accept,
|
|
84
|
+
disabled: isDisabled,
|
|
85
|
+
onChange: handleFileChange
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
89
|
+
Button__default.default,
|
|
90
|
+
{
|
|
91
|
+
className: "avatar-upload__button",
|
|
92
|
+
type: "button",
|
|
93
|
+
disabled: isDisabled,
|
|
94
|
+
"aria-describedby": hasError ? errorId : void 0,
|
|
95
|
+
onClick: handleSelectClick,
|
|
96
|
+
children: selectLabel
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
hasError && /* @__PURE__ */ jsxRuntime.jsx(
|
|
100
|
+
"div",
|
|
101
|
+
{
|
|
102
|
+
className: "avatar-upload__error",
|
|
103
|
+
id: errorId,
|
|
104
|
+
role: "alert",
|
|
105
|
+
children: error
|
|
106
|
+
}
|
|
107
|
+
)
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
};
|
|
112
|
+
var avatar_upload_default = AvatarUpload;
|
|
113
|
+
|
|
114
|
+
module.exports = avatar_upload_default;
|
|
115
|
+
//# sourceMappingURL=avatar-upload.cjs.map
|
|
116
|
+
//# sourceMappingURL=avatar-upload.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/avatar-upload/avatar-upload.tsx"],"names":["React","classnames","jsxs","jsx","Avatar","Button"],"mappings":";;;;;;;;;;;;;;;AAuBA,MAAM,eAEF,CAAC;AAAA,EACH,GAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,WACJA,sBAAA,CAAM,MAAA;AAAA,IACJ;AAAA,GACF;AAEF,EAAA,MAAM,OAAA,GAAUA,uBAAM,KAAA,EAAM;AAE5B,EAAA,MAAM,OAAA,GAAU,GAAG,OAAO,CAAA,MAAA,CAAA;AAE1B,EAAA,MAAM,QAAA,GACJ,KAAA,KAAU,IAAA,IACV,KAAA,KAAU,MAAA;AAEZ,EAAA,MAAM,aACJ,QAAA,IAAY,OAAA;AAEd,EAAA,MAAM,OAAA,GAAUC,qBAAA;AAAA,IACd,eAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,yBAAA,EACE,UAAA;AAAA,MACF,wBAAA,EACE,OAAA;AAAA,MACF,sBAAA,EACE;AAAA;AACJ,GACF;AAEA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CACvB,KAAA,KACG;AACH,IAAA,MAAM,QAAQ,KAAA,CAAM,aAAA;AACpB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAO5B,IAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA,GACrB,IAAA,GACA,KAAA,CAAM,WAAW,CAAA;AAErB,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,OAAA;AAAA,MACX,WAAA,EAAW,gBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAACC,uBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,GAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBAEAD,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,sBAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA;AAAA,YACA,QAAA,EAAU,UAAA;AAAA,YACV,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAEAA,cAAA;AAAA,UAACE,uBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,UAAA;AAAA,YACV,kBAAA,EACE,WACI,OAAA,GACA,MAAA;AAAA,YAEN,OAAA,EAAS,iBAAA;AAAA,YAER,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAEC,QAAA,oBACCF,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sBAAA;AAAA,YACV,EAAA,EAAI,OAAA;AAAA,YACJ,IAAA,EAAK,OAAA;AAAA,YAEJ,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAEA,IAAO,qBAAA,GAAQ","file":"avatar-upload.cjs","sourcesContent":["import React from 'react';\n\nimport './avatar-upload.css';\nimport Avatar from '../avatar/avatar';\nimport Button from '../button/button';\nimport { classnames } from '../helpers/classnames';\n\nexport interface AvatarUploadProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n src?: string;\n initials?: string;\n alt?: string;\n accept?: string;\n disabled?: boolean;\n loading?: boolean;\n error?: React.ReactNode;\n selectLabel: React.ReactNode;\n onFileSelect: (file: File) => void;\n}\n\nconst AvatarUpload: React.FC<\n AvatarUploadProps\n> = ({\n src,\n initials,\n alt,\n accept,\n disabled = false,\n loading = false,\n error,\n selectLabel,\n onFileSelect,\n className = '',\n ...props\n}) => {\n const inputRef =\n React.useRef<HTMLInputElement>(\n null,\n );\n\n const reactId = React.useId();\n\n const errorId = `${reactId}-error`;\n\n const hasError =\n error !== null &&\n error !== undefined;\n\n const isDisabled =\n disabled || loading;\n\n const classes = classnames(\n 'avatar-upload',\n className,\n {\n 'avatar-upload--disabled':\n isDisabled,\n 'avatar-upload--loading':\n loading,\n 'avatar-upload--error':\n hasError,\n },\n );\n\n const handleSelectClick = () => {\n if (isDisabled) {\n return;\n }\n\n inputRef.current?.click();\n };\n\n const handleFileChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const input = event.currentTarget;\n const file = input.files?.[0];\n\n /*\n * Reset the native input after reading\n * the selected file so the same file\n * can be selected again later.\n */\n input.value = '';\n\n if (!file) {\n return;\n }\n\n onFileSelect(file);\n };\n\n const resolvedAriaBusy = loading\n ? true\n : props['aria-busy'];\n\n return (\n <div\n {...props}\n className={classes}\n aria-busy={resolvedAriaBusy}\n >\n <Avatar\n className=\"avatar-upload__avatar\"\n src={src}\n initials={initials}\n alt={alt}\n />\n\n <input\n ref={inputRef}\n className=\"avatar-upload__input\"\n type=\"file\"\n accept={accept}\n disabled={isDisabled}\n onChange={handleFileChange}\n />\n\n <Button\n className=\"avatar-upload__button\"\n type=\"button\"\n disabled={isDisabled}\n aria-describedby={\n hasError\n ? errorId\n : undefined\n }\n onClick={handleSelectClick}\n >\n {selectLabel}\n </Button>\n\n {hasError && (\n <div\n className=\"avatar-upload__error\"\n id={errorId}\n role=\"alert\"\n >\n {error}\n </div>\n )}\n </div>\n );\n};\n\nexport default AvatarUpload;"]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
.avatar-upload {
|
|
2
|
+
/* color */
|
|
3
|
+
|
|
4
|
+
/* typography */
|
|
5
|
+
|
|
6
|
+
/* size */
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
align-items: flex-start;
|
|
10
|
+
|
|
11
|
+
/* border */
|
|
12
|
+
|
|
13
|
+
/* depth */
|
|
14
|
+
|
|
15
|
+
/* motion */
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.avatar-upload__avatar {
|
|
19
|
+
/* color */
|
|
20
|
+
|
|
21
|
+
/* typography */
|
|
22
|
+
|
|
23
|
+
/* size */
|
|
24
|
+
margin-bottom: var(--margin-control);
|
|
25
|
+
|
|
26
|
+
/* border */
|
|
27
|
+
|
|
28
|
+
/* depth */
|
|
29
|
+
|
|
30
|
+
/* motion */
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.avatar-upload__input {
|
|
34
|
+
/* color */
|
|
35
|
+
|
|
36
|
+
/* typography */
|
|
37
|
+
|
|
38
|
+
/* size */
|
|
39
|
+
position: absolute;
|
|
40
|
+
width: 1px;
|
|
41
|
+
height: 1px;
|
|
42
|
+
padding: 0;
|
|
43
|
+
margin: -1px;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
|
|
46
|
+
/* border */
|
|
47
|
+
border: 0;
|
|
48
|
+
|
|
49
|
+
/* depth */
|
|
50
|
+
clip: rect(0 0 0 0);
|
|
51
|
+
clip-path: inset(50%);
|
|
52
|
+
|
|
53
|
+
/* motion */
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.avatar-upload__button {
|
|
57
|
+
/* color */
|
|
58
|
+
|
|
59
|
+
/* typography */
|
|
60
|
+
|
|
61
|
+
/* size */
|
|
62
|
+
|
|
63
|
+
/* border */
|
|
64
|
+
|
|
65
|
+
/* depth */
|
|
66
|
+
|
|
67
|
+
/* motion */
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.avatar-upload__error {
|
|
71
|
+
/* color */
|
|
72
|
+
color: var(--color-text-bad);
|
|
73
|
+
|
|
74
|
+
/* typography */
|
|
75
|
+
font-family: var(--font-note-family);
|
|
76
|
+
font-size: var(--font-note);
|
|
77
|
+
font-weight: var(--font-note-weight);
|
|
78
|
+
line-height: var(--font-note-line);
|
|
79
|
+
letter-spacing: var(--font-note-letter-spacing);
|
|
80
|
+
|
|
81
|
+
/* size */
|
|
82
|
+
margin-top: var(--margin-descriptor);
|
|
83
|
+
|
|
84
|
+
/* border */
|
|
85
|
+
|
|
86
|
+
/* depth */
|
|
87
|
+
|
|
88
|
+
/* motion */
|
|
89
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './avatar-upload.css';
|
|
3
|
+
export interface AvatarUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
|
|
4
|
+
src?: string;
|
|
5
|
+
initials?: string;
|
|
6
|
+
alt?: string;
|
|
7
|
+
accept?: string;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
loading?: boolean;
|
|
10
|
+
error?: React.ReactNode;
|
|
11
|
+
selectLabel: React.ReactNode;
|
|
12
|
+
onFileSelect: (file: File) => void;
|
|
13
|
+
}
|
|
14
|
+
declare const AvatarUpload: React.FC<AvatarUploadProps>;
|
|
15
|
+
export default AvatarUpload;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import './avatar-upload.css';
|
|
4
|
+
import Avatar from '../avatar/avatar';
|
|
5
|
+
import Button from '../button/button';
|
|
6
|
+
import { classnames } from '../helpers/classnames';
|
|
7
|
+
|
|
8
|
+
const AvatarUpload = ({
|
|
9
|
+
src,
|
|
10
|
+
initials,
|
|
11
|
+
alt,
|
|
12
|
+
accept,
|
|
13
|
+
disabled = false,
|
|
14
|
+
loading = false,
|
|
15
|
+
error,
|
|
16
|
+
selectLabel,
|
|
17
|
+
onFileSelect,
|
|
18
|
+
className = "",
|
|
19
|
+
...props
|
|
20
|
+
}) => {
|
|
21
|
+
const inputRef = React.useRef(
|
|
22
|
+
null
|
|
23
|
+
);
|
|
24
|
+
const reactId = React.useId();
|
|
25
|
+
const errorId = `${reactId}-error`;
|
|
26
|
+
const hasError = error !== null && error !== void 0;
|
|
27
|
+
const isDisabled = disabled || loading;
|
|
28
|
+
const classes = classnames(
|
|
29
|
+
"avatar-upload",
|
|
30
|
+
className,
|
|
31
|
+
{
|
|
32
|
+
"avatar-upload--disabled": isDisabled,
|
|
33
|
+
"avatar-upload--loading": loading,
|
|
34
|
+
"avatar-upload--error": hasError
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
const handleSelectClick = () => {
|
|
38
|
+
if (isDisabled) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
inputRef.current?.click();
|
|
42
|
+
};
|
|
43
|
+
const handleFileChange = (event) => {
|
|
44
|
+
const input = event.currentTarget;
|
|
45
|
+
const file = input.files?.[0];
|
|
46
|
+
input.value = "";
|
|
47
|
+
if (!file) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
onFileSelect(file);
|
|
51
|
+
};
|
|
52
|
+
const resolvedAriaBusy = loading ? true : props["aria-busy"];
|
|
53
|
+
return /* @__PURE__ */ jsxs(
|
|
54
|
+
"div",
|
|
55
|
+
{
|
|
56
|
+
...props,
|
|
57
|
+
className: classes,
|
|
58
|
+
"aria-busy": resolvedAriaBusy,
|
|
59
|
+
children: [
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
Avatar,
|
|
62
|
+
{
|
|
63
|
+
className: "avatar-upload__avatar",
|
|
64
|
+
src,
|
|
65
|
+
initials,
|
|
66
|
+
alt
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
"input",
|
|
71
|
+
{
|
|
72
|
+
ref: inputRef,
|
|
73
|
+
className: "avatar-upload__input",
|
|
74
|
+
type: "file",
|
|
75
|
+
accept,
|
|
76
|
+
disabled: isDisabled,
|
|
77
|
+
onChange: handleFileChange
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
/* @__PURE__ */ jsx(
|
|
81
|
+
Button,
|
|
82
|
+
{
|
|
83
|
+
className: "avatar-upload__button",
|
|
84
|
+
type: "button",
|
|
85
|
+
disabled: isDisabled,
|
|
86
|
+
"aria-describedby": hasError ? errorId : void 0,
|
|
87
|
+
onClick: handleSelectClick,
|
|
88
|
+
children: selectLabel
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
hasError && /* @__PURE__ */ jsx(
|
|
92
|
+
"div",
|
|
93
|
+
{
|
|
94
|
+
className: "avatar-upload__error",
|
|
95
|
+
id: errorId,
|
|
96
|
+
role: "alert",
|
|
97
|
+
children: error
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
var avatar_upload_default = AvatarUpload;
|
|
105
|
+
|
|
106
|
+
export { avatar_upload_default as default };
|
|
107
|
+
//# sourceMappingURL=avatar-upload.js.map
|
|
108
|
+
//# sourceMappingURL=avatar-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/avatar-upload/avatar-upload.tsx"],"names":[],"mappings":";;;;;;;AAuBA,MAAM,eAEF,CAAC;AAAA,EACH,GAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,WACJ,KAAA,CAAM,MAAA;AAAA,IACJ;AAAA,GACF;AAEF,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAE5B,EAAA,MAAM,OAAA,GAAU,GAAG,OAAO,CAAA,MAAA,CAAA;AAE1B,EAAA,MAAM,QAAA,GACJ,KAAA,KAAU,IAAA,IACV,KAAA,KAAU,MAAA;AAEZ,EAAA,MAAM,aACJ,QAAA,IAAY,OAAA;AAEd,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,eAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,yBAAA,EACE,UAAA;AAAA,MACF,wBAAA,EACE,OAAA;AAAA,MACF,sBAAA,EACE;AAAA;AACJ,GACF;AAEA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CACvB,KAAA,KACG;AACH,IAAA,MAAM,QAAQ,KAAA,CAAM,aAAA;AACpB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAO5B,IAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA,GACrB,IAAA,GACA,KAAA,CAAM,WAAW,CAAA;AAErB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,OAAA;AAAA,MACX,WAAA,EAAW,gBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,GAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBAEA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,sBAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA;AAAA,YACA,QAAA,EAAU,UAAA;AAAA,YACV,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAEA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,UAAA;AAAA,YACV,kBAAA,EACE,WACI,OAAA,GACA,MAAA;AAAA,YAEN,OAAA,EAAS,iBAAA;AAAA,YAER,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAEC,QAAA,oBACC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sBAAA;AAAA,YACV,EAAA,EAAI,OAAA;AAAA,YACJ,IAAA,EAAK,OAAA;AAAA,YAEJ,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAEA,IAAO,qBAAA,GAAQ","file":"avatar-upload.js","sourcesContent":["import React from 'react';\n\nimport './avatar-upload.css';\nimport Avatar from '../avatar/avatar';\nimport Button from '../button/button';\nimport { classnames } from '../helpers/classnames';\n\nexport interface AvatarUploadProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n src?: string;\n initials?: string;\n alt?: string;\n accept?: string;\n disabled?: boolean;\n loading?: boolean;\n error?: React.ReactNode;\n selectLabel: React.ReactNode;\n onFileSelect: (file: File) => void;\n}\n\nconst AvatarUpload: React.FC<\n AvatarUploadProps\n> = ({\n src,\n initials,\n alt,\n accept,\n disabled = false,\n loading = false,\n error,\n selectLabel,\n onFileSelect,\n className = '',\n ...props\n}) => {\n const inputRef =\n React.useRef<HTMLInputElement>(\n null,\n );\n\n const reactId = React.useId();\n\n const errorId = `${reactId}-error`;\n\n const hasError =\n error !== null &&\n error !== undefined;\n\n const isDisabled =\n disabled || loading;\n\n const classes = classnames(\n 'avatar-upload',\n className,\n {\n 'avatar-upload--disabled':\n isDisabled,\n 'avatar-upload--loading':\n loading,\n 'avatar-upload--error':\n hasError,\n },\n );\n\n const handleSelectClick = () => {\n if (isDisabled) {\n return;\n }\n\n inputRef.current?.click();\n };\n\n const handleFileChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const input = event.currentTarget;\n const file = input.files?.[0];\n\n /*\n * Reset the native input after reading\n * the selected file so the same file\n * can be selected again later.\n */\n input.value = '';\n\n if (!file) {\n return;\n }\n\n onFileSelect(file);\n };\n\n const resolvedAriaBusy = loading\n ? true\n : props['aria-busy'];\n\n return (\n <div\n {...props}\n className={classes}\n aria-busy={resolvedAriaBusy}\n >\n <Avatar\n className=\"avatar-upload__avatar\"\n src={src}\n initials={initials}\n alt={alt}\n />\n\n <input\n ref={inputRef}\n className=\"avatar-upload__input\"\n type=\"file\"\n accept={accept}\n disabled={isDisabled}\n onChange={handleFileChange}\n />\n\n <Button\n className=\"avatar-upload__button\"\n type=\"button\"\n disabled={isDisabled}\n aria-describedby={\n hasError\n ? errorId\n : undefined\n }\n onClick={handleSelectClick}\n >\n {selectLabel}\n </Button>\n\n {hasError && (\n <div\n className=\"avatar-upload__error\"\n id={errorId}\n role=\"alert\"\n >\n {error}\n </div>\n )}\n </div>\n );\n};\n\nexport default AvatarUpload;"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var avatarUpload = require('./avatar-upload');
|
|
4
|
+
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var avatarUpload__default = /*#__PURE__*/_interopDefault(avatarUpload);
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
module.exports = avatarUpload__default.default;
|
|
12
|
+
//# sourceMappingURL=index.cjs.map
|
|
13
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs","sourcesContent":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
require('./flip-list.css');
|
|
6
|
+
var classnames = require('../helpers/classnames');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
11
|
+
|
|
12
|
+
function hasContent(value) {
|
|
13
|
+
return value !== null && value !== void 0;
|
|
14
|
+
}
|
|
15
|
+
function getInitialOpenItemId(items, defaultOpenId) {
|
|
16
|
+
if (defaultOpenId === void 0) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const hasMatchingItem = items.some(
|
|
20
|
+
(item) => item.id === defaultOpenId
|
|
21
|
+
);
|
|
22
|
+
return hasMatchingItem ? defaultOpenId : null;
|
|
23
|
+
}
|
|
24
|
+
const FlipList = ({
|
|
25
|
+
items,
|
|
26
|
+
defaultOpenId,
|
|
27
|
+
scrollToDefaultOpen = false,
|
|
28
|
+
className = "",
|
|
29
|
+
...props
|
|
30
|
+
}) => {
|
|
31
|
+
const componentId = React__default.default.useId();
|
|
32
|
+
const initialOpenItemIdRef = React__default.default.useRef(
|
|
33
|
+
getInitialOpenItemId(
|
|
34
|
+
items,
|
|
35
|
+
defaultOpenId
|
|
36
|
+
)
|
|
37
|
+
);
|
|
38
|
+
const shouldScrollInitiallyRef = React__default.default.useRef(scrollToDefaultOpen);
|
|
39
|
+
const initialOpenItemRef = React__default.default.useRef(
|
|
40
|
+
null
|
|
41
|
+
);
|
|
42
|
+
const hasScrolledInitiallyRef = React__default.default.useRef(false);
|
|
43
|
+
const [openItemId, setOpenItemId] = React__default.default.useState(
|
|
44
|
+
initialOpenItemIdRef.current
|
|
45
|
+
);
|
|
46
|
+
React__default.default.useEffect(() => {
|
|
47
|
+
if (hasScrolledInitiallyRef.current || !shouldScrollInitiallyRef.current || initialOpenItemIdRef.current === null || !initialOpenItemRef.current) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
hasScrolledInitiallyRef.current = true;
|
|
51
|
+
initialOpenItemRef.current.scrollIntoView({
|
|
52
|
+
behavior: "auto",
|
|
53
|
+
block: "start"
|
|
54
|
+
});
|
|
55
|
+
}, []);
|
|
56
|
+
if (items.length === 0) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const classes = classnames.classnames(
|
|
60
|
+
"flip-list",
|
|
61
|
+
className,
|
|
62
|
+
{}
|
|
63
|
+
);
|
|
64
|
+
const toggleItem = (itemId) => {
|
|
65
|
+
setOpenItemId(
|
|
66
|
+
(current) => current === itemId ? null : itemId
|
|
67
|
+
);
|
|
68
|
+
};
|
|
69
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
"div",
|
|
71
|
+
{
|
|
72
|
+
className: classes,
|
|
73
|
+
...props,
|
|
74
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flip-list__items", children: items.map((item, itemIndex) => {
|
|
75
|
+
const isOpen = openItemId === item.id;
|
|
76
|
+
const hasMeta = hasContent(
|
|
77
|
+
item.meta
|
|
78
|
+
);
|
|
79
|
+
const triggerId = `${componentId}-trigger-${itemIndex}`;
|
|
80
|
+
const contentId = `${componentId}-content-${itemIndex}`;
|
|
81
|
+
const itemClasses = classnames.classnames(
|
|
82
|
+
"flip-list__item",
|
|
83
|
+
"",
|
|
84
|
+
{
|
|
85
|
+
"flip-list__item--open": isOpen
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
89
|
+
"div",
|
|
90
|
+
{
|
|
91
|
+
ref: item.id === initialOpenItemIdRef.current ? initialOpenItemRef : void 0,
|
|
92
|
+
className: itemClasses,
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
95
|
+
"button",
|
|
96
|
+
{
|
|
97
|
+
className: "flip-list__trigger",
|
|
98
|
+
id: triggerId,
|
|
99
|
+
type: "button",
|
|
100
|
+
"aria-expanded": isOpen,
|
|
101
|
+
"aria-controls": contentId,
|
|
102
|
+
onClick: () => toggleItem(item.id),
|
|
103
|
+
children: [
|
|
104
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__title", children: item.title }),
|
|
105
|
+
hasMeta && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__meta", children: item.meta })
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
110
|
+
"div",
|
|
111
|
+
{
|
|
112
|
+
className: "flip-list__content",
|
|
113
|
+
id: contentId,
|
|
114
|
+
"aria-labelledby": triggerId,
|
|
115
|
+
hidden: !isOpen,
|
|
116
|
+
children: item.content
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
item.id
|
|
122
|
+
);
|
|
123
|
+
}) })
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
};
|
|
127
|
+
var flip_list_default = FlipList;
|
|
128
|
+
|
|
129
|
+
module.exports = flip_list_default;
|
|
130
|
+
//# sourceMappingURL=flip-list.cjs.map
|
|
131
|
+
//# sourceMappingURL=flip-list.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/flip-list/flip-list.tsx"],"names":["React","classnames","jsx","jsxs"],"mappings":"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","file":"flip-list.cjs","sourcesContent":["import React from 'react';\n\nimport './flip-list.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface FlipListItem {\n id: React.Key;\n title: React.ReactNode;\n meta?: React.ReactNode;\n content: React.ReactNode;\n}\n\nexport interface FlipListProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n items: FlipListItem[];\n\n /**\n * Item opened during the initial render.\n *\n * Later changes to this prop do not control\n * the component state.\n */\n defaultOpenId?: React.Key;\n\n /**\n * Scrolls the initially opened item into view once\n * after mounting.\n *\n * Has no effect without a valid defaultOpenId.\n * Manual item opening never triggers scrolling.\n */\n scrollToDefaultOpen?: boolean;\n}\n\ntype OpenItemId = React.Key | null;\n\nfunction hasContent(\n value: React.ReactNode,\n): value is Exclude<\n React.ReactNode,\n null | undefined\n> {\n return value !== null && value !== undefined;\n}\n\nfunction getInitialOpenItemId(\n items: FlipListItem[],\n defaultOpenId: React.Key | undefined,\n): OpenItemId {\n if (defaultOpenId === undefined) {\n return null;\n }\n\n const hasMatchingItem = items.some(\n (item) => item.id === defaultOpenId,\n );\n\n return hasMatchingItem\n ? defaultOpenId\n : null;\n}\n\nconst FlipList: React.FC<FlipListProps> = ({\n items,\n defaultOpenId,\n scrollToDefaultOpen = false,\n className = '',\n ...props\n}) => {\n const componentId = React.useId();\n\n const initialOpenItemIdRef =\n React.useRef<OpenItemId>(\n getInitialOpenItemId(\n items,\n defaultOpenId,\n ),\n );\n\n const shouldScrollInitiallyRef =\n React.useRef(scrollToDefaultOpen);\n\n const initialOpenItemRef =\n React.useRef<HTMLDivElement | null>(\n null,\n );\n\n const hasScrolledInitiallyRef =\n React.useRef(false);\n\n const [openItemId, setOpenItemId] =\n React.useState<OpenItemId>(\n initialOpenItemIdRef.current,\n );\n\n React.useEffect(() => {\n if (\n hasScrolledInitiallyRef.current ||\n !shouldScrollInitiallyRef.current ||\n initialOpenItemIdRef.current === null ||\n !initialOpenItemRef.current\n ) {\n return;\n }\n\n hasScrolledInitiallyRef.current = true;\n\n initialOpenItemRef.current.scrollIntoView({\n behavior: 'auto',\n block: 'start',\n });\n }, []);\n\n if (items.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'flip-list',\n className,\n {},\n );\n\n const toggleItem = (\n itemId: React.Key,\n ) => {\n setOpenItemId((current) =>\n current === itemId\n ? null\n : itemId,\n );\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <div className=\"flip-list__items\">\n {items.map((item, itemIndex) => {\n const isOpen =\n openItemId === item.id;\n\n const hasMeta = hasContent(\n item.meta,\n );\n\n const triggerId =\n `${componentId}-trigger-${itemIndex}`;\n\n const contentId =\n `${componentId}-content-${itemIndex}`;\n\n const itemClasses = classnames(\n 'flip-list__item',\n '',\n {\n 'flip-list__item--open':\n isOpen,\n },\n );\n\n return (\n <div\n key={item.id}\n ref={\n item.id ===\n initialOpenItemIdRef.current\n ? initialOpenItemRef\n : undefined\n }\n className={itemClasses}\n >\n <button\n className=\"flip-list__trigger\"\n id={triggerId}\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={() =>\n toggleItem(item.id)\n }\n >\n <span className=\"flip-list__title\">\n {item.title}\n </span>\n\n {hasMeta && (\n <span className=\"flip-list__meta\">\n {item.meta}\n </span>\n )}\n </button>\n\n <div\n className=\"flip-list__content\"\n id={contentId}\n aria-labelledby={triggerId}\n hidden={!isOpen}\n >\n {item.content}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default FlipList;"]}
|