jvetrau-ds 0.1.45 → 0.2.1
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/button/button.cjs +41 -16
- package/components/button/button.cjs.map +1 -1
- package/components/button/button.css +80 -7
- package/components/button/button.d.ts +26 -3
- package/components/button/button.js +41 -16
- package/components/button/button.js.map +1 -1
- package/components/flip-list/flip-list.cjs +8 -2
- package/components/flip-list/flip-list.cjs.map +1 -1
- package/components/flip-list/flip-list.css +49 -3
- package/components/flip-list/flip-list.d.ts +1 -0
- package/components/flip-list/flip-list.js +8 -2
- package/components/flip-list/flip-list.js.map +1 -1
- package/components/index.cjs +0 -6
- package/components/index.d.ts +0 -2
- package/components/index.js +0 -1
- package/components/tabs/tabs.cjs +25 -9
- package/components/tabs/tabs.cjs.map +1 -1
- package/components/tabs/tabs.css +63 -0
- package/components/tabs/tabs.d.ts +1 -0
- package/components/tabs/tabs.js +26 -10
- package/components/tabs/tabs.js.map +1 -1
- package/components/video/video.cjs +150 -60
- package/components/video/video.cjs.map +1 -1
- package/components/video/video.js +147 -58
- package/components/video/video.js.map +1 -1
- package/index.cjs +0 -6
- package/index.d.ts +0 -2
- package/index.js +0 -1
- package/package.json +1 -1
- package/styles.css +178 -65
- package/themes/base/desktop.css +1 -0
- package/themes/base/desktop.md +1 -0
- package/themes/base/desktop.scoped.css +1 -0
- package/themes/base/diagram.css +1 -0
- package/themes/base/diagram.md +1 -0
- package/themes/base/diagram.scoped.css +1 -0
- package/themes/base/mobile.css +1 -0
- package/themes/base/mobile.md +1 -0
- package/themes/base/mobile.scoped.css +1 -0
- package/themes/brandcopilot/desktop.css +1 -0
- package/themes/brandcopilot/desktop.md +1 -0
- package/themes/brandcopilot/desktop.scoped.css +1 -0
- package/themes/brandcopilot/diagram.css +1 -0
- package/themes/brandcopilot/diagram.md +1 -0
- package/themes/brandcopilot/diagram.scoped.css +1 -0
- package/themes/brandcopilot/mobile.css +1 -0
- package/themes/brandcopilot/mobile.md +1 -0
- package/themes/brandcopilot/mobile.scoped.css +1 -0
- package/themes/dmpatterns/desktop.css +1 -0
- package/themes/dmpatterns/desktop.md +1 -0
- package/themes/dmpatterns/desktop.scoped.css +1 -0
- package/themes/dmpatterns/diagram.css +1 -0
- package/themes/dmpatterns/diagram.md +1 -0
- package/themes/dmpatterns/diagram.scoped.css +1 -0
- package/themes/dmpatterns/mobile.css +1 -0
- package/themes/dmpatterns/mobile.md +1 -0
- package/themes/dmpatterns/mobile.scoped.css +1 -0
- package/themes/pdigest/desktop.css +1 -0
- package/themes/pdigest/desktop.md +1 -0
- package/themes/pdigest/desktop.scoped.css +1 -0
- package/themes/pdigest/diagram.css +1 -0
- package/themes/pdigest/diagram.md +1 -0
- package/themes/pdigest/diagram.scoped.css +1 -0
- package/themes/pdigest/mobile.css +1 -0
- package/themes/pdigest/mobile.md +1 -0
- package/themes/pdigest/mobile.scoped.css +1 -0
- package/themes/redesigntrack/desktop.css +1 -0
- package/themes/redesigntrack/desktop.md +1 -0
- package/themes/redesigntrack/desktop.scoped.css +1 -0
- package/themes/redesigntrack/diagram.css +1 -0
- package/themes/redesigntrack/diagram.md +1 -0
- package/themes/redesigntrack/diagram.scoped.css +1 -0
- package/themes/redesigntrack/mobile.css +1 -0
- package/themes/redesigntrack/mobile.md +1 -0
- package/themes/redesigntrack/mobile.scoped.css +1 -0
- package/tokens/runtime/tokens.base.desktop.runtime.cjs +1 -0
- package/tokens/runtime/tokens.base.desktop.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.base.desktop.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.base.desktop.runtime.js +1 -0
- package/tokens/runtime/tokens.base.desktop.runtime.js.map +1 -1
- package/tokens/runtime/tokens.base.diagram.runtime.cjs +1 -0
- package/tokens/runtime/tokens.base.diagram.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.base.diagram.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.base.diagram.runtime.js +1 -0
- package/tokens/runtime/tokens.base.diagram.runtime.js.map +1 -1
- package/tokens/runtime/tokens.base.mobile.runtime.cjs +1 -0
- package/tokens/runtime/tokens.base.mobile.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.base.mobile.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.base.mobile.runtime.js +1 -0
- package/tokens/runtime/tokens.base.mobile.runtime.js.map +1 -1
- package/tokens/runtime/tokens.brandcopilot.desktop.runtime.cjs +1 -0
- package/tokens/runtime/tokens.brandcopilot.desktop.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.brandcopilot.desktop.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.brandcopilot.desktop.runtime.js +1 -0
- package/tokens/runtime/tokens.brandcopilot.desktop.runtime.js.map +1 -1
- package/tokens/runtime/tokens.brandcopilot.diagram.runtime.cjs +1 -0
- package/tokens/runtime/tokens.brandcopilot.diagram.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.brandcopilot.diagram.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.brandcopilot.diagram.runtime.js +1 -0
- package/tokens/runtime/tokens.brandcopilot.diagram.runtime.js.map +1 -1
- package/tokens/runtime/tokens.brandcopilot.mobile.runtime.cjs +1 -0
- package/tokens/runtime/tokens.brandcopilot.mobile.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.brandcopilot.mobile.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.brandcopilot.mobile.runtime.js +1 -0
- package/tokens/runtime/tokens.brandcopilot.mobile.runtime.js.map +1 -1
- package/tokens/runtime/tokens.dmpatterns.desktop.runtime.cjs +1 -0
- package/tokens/runtime/tokens.dmpatterns.desktop.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.dmpatterns.desktop.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.dmpatterns.desktop.runtime.js +1 -0
- package/tokens/runtime/tokens.dmpatterns.desktop.runtime.js.map +1 -1
- package/tokens/runtime/tokens.dmpatterns.diagram.runtime.cjs +1 -0
- package/tokens/runtime/tokens.dmpatterns.diagram.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.dmpatterns.diagram.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.dmpatterns.diagram.runtime.js +1 -0
- package/tokens/runtime/tokens.dmpatterns.diagram.runtime.js.map +1 -1
- package/tokens/runtime/tokens.dmpatterns.mobile.runtime.cjs +1 -0
- package/tokens/runtime/tokens.dmpatterns.mobile.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.dmpatterns.mobile.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.dmpatterns.mobile.runtime.js +1 -0
- package/tokens/runtime/tokens.dmpatterns.mobile.runtime.js.map +1 -1
- package/tokens/runtime/tokens.pdigest.desktop.runtime.cjs +1 -0
- package/tokens/runtime/tokens.pdigest.desktop.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.pdigest.desktop.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.pdigest.desktop.runtime.js +1 -0
- package/tokens/runtime/tokens.pdigest.desktop.runtime.js.map +1 -1
- package/tokens/runtime/tokens.pdigest.diagram.runtime.cjs +1 -0
- package/tokens/runtime/tokens.pdigest.diagram.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.pdigest.diagram.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.pdigest.diagram.runtime.js +1 -0
- package/tokens/runtime/tokens.pdigest.diagram.runtime.js.map +1 -1
- package/tokens/runtime/tokens.pdigest.mobile.runtime.cjs +1 -0
- package/tokens/runtime/tokens.pdigest.mobile.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.pdigest.mobile.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.pdigest.mobile.runtime.js +1 -0
- package/tokens/runtime/tokens.pdigest.mobile.runtime.js.map +1 -1
- package/tokens/runtime/tokens.redesigntrack.desktop.runtime.cjs +1 -0
- package/tokens/runtime/tokens.redesigntrack.desktop.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.redesigntrack.desktop.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.redesigntrack.desktop.runtime.js +1 -0
- package/tokens/runtime/tokens.redesigntrack.desktop.runtime.js.map +1 -1
- package/tokens/runtime/tokens.redesigntrack.diagram.runtime.cjs +1 -0
- package/tokens/runtime/tokens.redesigntrack.diagram.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.redesigntrack.diagram.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.redesigntrack.diagram.runtime.js +1 -0
- package/tokens/runtime/tokens.redesigntrack.diagram.runtime.js.map +1 -1
- package/tokens/runtime/tokens.redesigntrack.mobile.runtime.cjs +1 -0
- package/tokens/runtime/tokens.redesigntrack.mobile.runtime.cjs.map +1 -1
- package/tokens/runtime/tokens.redesigntrack.mobile.runtime.d.ts +1 -0
- package/tokens/runtime/tokens.redesigntrack.mobile.runtime.js +1 -0
- package/tokens/runtime/tokens.redesigntrack.mobile.runtime.js.map +1 -1
- package/tokens/themes/base/dist/desktop.json +8 -0
- package/tokens/themes/base/dist/diagram.json +8 -0
- package/tokens/themes/base/dist/mobile.json +8 -0
- package/tokens/themes/brandcopilot/dist/desktop.json +8 -0
- package/tokens/themes/brandcopilot/dist/diagram.json +8 -0
- package/tokens/themes/brandcopilot/dist/mobile.json +8 -0
- package/tokens/themes/dmpatterns/dist/desktop.json +8 -0
- package/tokens/themes/dmpatterns/dist/diagram.json +8 -0
- package/tokens/themes/dmpatterns/dist/mobile.json +8 -0
- package/tokens/themes/pdigest/dist/desktop.json +8 -0
- package/tokens/themes/pdigest/dist/diagram.json +8 -0
- package/tokens/themes/pdigest/dist/mobile.json +8 -0
- package/tokens/themes/redesigntrack/dist/desktop.json +8 -0
- package/tokens/themes/redesigntrack/dist/diagram.json +8 -0
- package/tokens/themes/redesigntrack/dist/mobile.json +8 -0
- package/components/button-icon/button-icon.cjs +0 -48
- package/components/button-icon/button-icon.cjs.map +0 -1
- package/components/button-icon/button-icon.css +0 -67
- package/components/button-icon/button-icon.d.ts +0 -10
- package/components/button-icon/button-icon.js +0 -42
- package/components/button-icon/button-icon.js.map +0 -1
- package/components/button-icon/index.cjs +0 -13
- package/components/button-icon/index.cjs.map +0 -1
- package/components/button-icon/index.d.ts +0 -2
- package/components/button-icon/index.js +0 -3
- package/components/button-icon/index.js.map +0 -1
|
@@ -3,43 +3,68 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
require('./button.css');
|
|
6
|
-
var classnames = require('../helpers/classnames');
|
|
7
6
|
var Icon = require('../../icons/icon');
|
|
7
|
+
var classnames = require('../helpers/classnames');
|
|
8
8
|
|
|
9
9
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
|
|
11
11
|
var Icon__default = /*#__PURE__*/_interopDefault(Icon);
|
|
12
12
|
|
|
13
|
+
function hasContent(value) {
|
|
14
|
+
return value !== null && value !== void 0;
|
|
15
|
+
}
|
|
13
16
|
const Button = ({
|
|
14
|
-
|
|
17
|
+
mode = "default",
|
|
18
|
+
rank = "default",
|
|
19
|
+
density = "default",
|
|
20
|
+
loading = false,
|
|
15
21
|
icon,
|
|
16
22
|
className = "",
|
|
17
23
|
disabled = false,
|
|
18
24
|
children,
|
|
19
25
|
...props
|
|
20
26
|
}) => {
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
const hasIcon = hasContent(icon);
|
|
28
|
+
const hasChildren = hasContent(children);
|
|
29
|
+
const isIconOnly = hasIcon && !hasChildren;
|
|
30
|
+
const isDisabled = disabled || loading;
|
|
31
|
+
const classes = classnames.classnames(
|
|
32
|
+
"button",
|
|
33
|
+
className,
|
|
34
|
+
{
|
|
35
|
+
"button--primary": rank === "primary",
|
|
36
|
+
"button--link": rank === "link",
|
|
37
|
+
"button--compact": density === "compact",
|
|
38
|
+
"button--toolbar": mode === "toolbar",
|
|
39
|
+
"button--disabled": isDisabled,
|
|
40
|
+
"button--loading": loading,
|
|
41
|
+
"button--icon-only": isIconOnly
|
|
42
|
+
}
|
|
43
|
+
);
|
|
27
44
|
let resolvedIcon = icon;
|
|
28
45
|
if (react.isValidElement(icon) && icon.type === Icon__default.default) {
|
|
29
46
|
const iconElement = icon;
|
|
30
|
-
resolvedIcon = react.cloneElement(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
resolvedIcon = react.cloneElement(
|
|
48
|
+
iconElement,
|
|
49
|
+
{
|
|
50
|
+
size: iconElement.props.size ?? "base",
|
|
51
|
+
className: classnames.classnames(
|
|
52
|
+
"button__icon",
|
|
53
|
+
iconElement.props.className
|
|
54
|
+
),
|
|
55
|
+
"aria-hidden": iconElement.props["aria-hidden"] ?? true,
|
|
56
|
+
focusable: iconElement.props.focusable ?? false
|
|
57
|
+
}
|
|
58
|
+
);
|
|
36
59
|
}
|
|
60
|
+
const resolvedAriaBusy = loading ? true : props["aria-busy"];
|
|
37
61
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
38
62
|
"button",
|
|
39
63
|
{
|
|
40
|
-
className: classes,
|
|
41
|
-
disabled,
|
|
42
64
|
...props,
|
|
65
|
+
className: classes,
|
|
66
|
+
disabled: isDisabled,
|
|
67
|
+
"aria-busy": resolvedAriaBusy,
|
|
43
68
|
children: [
|
|
44
69
|
resolvedIcon,
|
|
45
70
|
children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/button/button.tsx"],"names":["classnames","isValidElement","Icon","cloneElement","jsxs"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/button/button.tsx"],"names":["classnames","isValidElement","Icon","cloneElement","jsxs"],"mappings":";;;;;;;;;;;;AA6DA,SAAS,WACP,KAAA,EAIA;AACA,EAAA,OAAO,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;AACrC;AAEA,MAAM,SAAgC,CAAC;AAAA,EACrC,IAAA,GAAO,SAAA;AAAA,EACP,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,IAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,WAAW,QAAQ,CAAA;AAEvC,EAAA,MAAM,UAAA,GACJ,WAAW,CAAC,WAAA;AAEd,EAAA,MAAM,aACJ,QAAA,IAAY,OAAA;AAEd,EAAA,MAAM,OAAA,GAAUA,qBAAA;AAAA,IACd,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,mBACE,IAAA,KAAS,SAAA;AAAA,MACX,gBACE,IAAA,KAAS,MAAA;AAAA,MACX,mBACE,OAAA,KAAY,SAAA;AAAA,MACd,mBACE,IAAA,KAAS,SAAA;AAAA,MACX,kBAAA,EACE,UAAA;AAAA,MACF,iBAAA,EACE,OAAA;AAAA,MACF,mBAAA,EACE;AAAA;AACJ,GACF;AAEA,EAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,EAAA,IACEC,oBAAA,CAAe,IAAI,CAAA,IACnB,IAAA,CAAK,SAASC,qBAAA,EACd;AACA,IAAA,MAAM,WAAA,GACJ,IAAA;AAEF,IAAA,YAAA,GAAeC,kBAAA;AAAA,MACb,WAAA;AAAA,MACA;AAAA,QACE,IAAA,EACE,WAAA,CAAY,KAAA,CAAM,IAAA,IAClB,MAAA;AAAA,QACF,SAAA,EAAWH,qBAAA;AAAA,UACT,cAAA;AAAA,UACA,YAAY,KAAA,CAAM;AAAA,SACpB;AAAA,QACA,aAAA,EACE,WAAA,CAAY,KAAA,CACV,aACF,CAAA,IAAK,IAAA;AAAA,QACP,SAAA,EACE,WAAA,CAAY,KAAA,CACT,SAAA,IAAa;AAAA;AACpB,KACF;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GACJ,OAAA,GACI,IAAA,GACA,KAAA,CAAM,WAAW,CAAA;AAEvB,EAAA,uBACEI,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAU,UAAA;AAAA,MACV,WAAA,EAAW,gBAAA;AAAA,MAEV,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,IAAO,cAAA,GAAQ","file":"button.cjs","sourcesContent":["import React, {\n cloneElement,\n isValidElement,\n type ReactElement,\n} from 'react';\n\nimport './button.css';\nimport Icon, { type IconProps } from '../../icons/icon';\nimport { classnames } from '../helpers/classnames';\n\nexport type ButtonRank =\n | 'default'\n | 'primary'\n | 'link';\n\nexport type ButtonDensity =\n | 'default'\n | 'compact';\n\ntype ButtonNativeProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n>;\n\ninterface ButtonSharedProps\n extends ButtonNativeProps {\n density?: ButtonDensity;\n loading?: boolean;\n}\n\ntype RegularButtonContentProps =\n | {\n children: React.ReactNode;\n icon?: React.ReactNode;\n }\n | {\n children?: never;\n icon: React.ReactNode;\n 'aria-label': string;\n };\n\ntype RegularButtonProps =\n ButtonSharedProps &\n RegularButtonContentProps & {\n mode?: 'default';\n rank?: ButtonRank;\n };\n\ntype ToolbarButtonProps =\n ButtonSharedProps & {\n mode: 'toolbar';\n icon: React.ReactNode;\n children?: never;\n rank?: never;\n 'aria-label': string;\n };\n\nexport type ButtonProps =\n | RegularButtonProps\n | ToolbarButtonProps;\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\nconst Button: React.FC<ButtonProps> = ({\n mode = 'default',\n rank = 'default',\n density = 'default',\n loading = false,\n icon,\n className = '',\n disabled = false,\n children,\n ...props\n}) => {\n const hasIcon = hasContent(icon);\n const hasChildren = hasContent(children);\n\n const isIconOnly =\n hasIcon && !hasChildren;\n\n const isDisabled =\n disabled || loading;\n\n const classes = classnames(\n 'button',\n className,\n {\n 'button--primary':\n rank === 'primary',\n 'button--link':\n rank === 'link',\n 'button--compact':\n density === 'compact',\n 'button--toolbar':\n mode === 'toolbar',\n 'button--disabled':\n isDisabled,\n 'button--loading':\n loading,\n 'button--icon-only':\n isIconOnly,\n },\n );\n\n let resolvedIcon = icon;\n\n if (\n isValidElement(icon) &&\n icon.type === Icon\n ) {\n const iconElement =\n icon as ReactElement<IconProps>;\n\n resolvedIcon = cloneElement(\n iconElement,\n {\n size:\n iconElement.props.size ??\n 'base',\n className: classnames(\n 'button__icon',\n iconElement.props.className,\n ),\n 'aria-hidden':\n iconElement.props[\n 'aria-hidden'\n ] ?? true,\n focusable:\n iconElement.props\n .focusable ?? false,\n },\n );\n }\n\n const resolvedAriaBusy =\n loading\n ? true\n : props['aria-busy'];\n\n return (\n <button\n {...props}\n className={classes}\n disabled={isDisabled}\n aria-busy={resolvedAriaBusy}\n >\n {resolvedIcon}\n {children}\n </button>\n );\n};\n\nexport default Button;\n"]}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
.button {
|
|
2
2
|
/* color */
|
|
3
|
-
--button-bg: var(--color-
|
|
4
|
-
--button-color: var(--color-text-
|
|
3
|
+
--button-bg: var(--color-control);
|
|
4
|
+
--button-color: var(--color-text-control);
|
|
5
5
|
--button-bg-disabled: var(--color-bg-disabled);
|
|
6
|
-
--button-color-disabled: var(
|
|
6
|
+
--button-color-disabled: var(
|
|
7
|
+
--color-text-disabled,
|
|
8
|
+
var(--color-text-control)
|
|
9
|
+
);
|
|
10
|
+
--button-focus-color: var(--button-bg);
|
|
7
11
|
|
|
8
12
|
background: var(--button-bg);
|
|
9
13
|
color: var(--button-color);
|
|
@@ -13,7 +17,9 @@
|
|
|
13
17
|
--button-font-weight: var(--font-control-weight);
|
|
14
18
|
--button-font-size: var(--font-control);
|
|
15
19
|
--button-line-height: var(--font-control-line);
|
|
16
|
-
--button-letter-spacing: var(
|
|
20
|
+
--button-letter-spacing: var(
|
|
21
|
+
--font-control-letter-spacing
|
|
22
|
+
);
|
|
17
23
|
|
|
18
24
|
font-family: var(--button-font-family);
|
|
19
25
|
font-size: var(--button-font-size);
|
|
@@ -25,7 +31,9 @@
|
|
|
25
31
|
--button-gap: var(--margin-icon);
|
|
26
32
|
--button-height: var(--size-control-height);
|
|
27
33
|
--button-padding-x: var(--padding-control-button-horz);
|
|
28
|
-
--button-padding-icon-only: var(
|
|
34
|
+
--button-padding-icon-only: var(
|
|
35
|
+
--padding-control-button-icon-horz
|
|
36
|
+
);
|
|
29
37
|
|
|
30
38
|
display: inline-flex;
|
|
31
39
|
align-items: center;
|
|
@@ -52,7 +60,8 @@
|
|
|
52
60
|
|
|
53
61
|
cursor: pointer;
|
|
54
62
|
user-select: none;
|
|
55
|
-
transition:
|
|
63
|
+
transition:
|
|
64
|
+
opacity var(--button-transition-duration) ease;
|
|
56
65
|
}
|
|
57
66
|
|
|
58
67
|
.button__icon {
|
|
@@ -78,7 +87,10 @@
|
|
|
78
87
|
}
|
|
79
88
|
|
|
80
89
|
.button:focus-visible {
|
|
81
|
-
outline:
|
|
90
|
+
outline:
|
|
91
|
+
var(--button-focus-width)
|
|
92
|
+
solid
|
|
93
|
+
var(--button-focus-color);
|
|
82
94
|
outline-offset: var(--button-focus-offset);
|
|
83
95
|
}
|
|
84
96
|
|
|
@@ -94,11 +106,72 @@
|
|
|
94
106
|
cursor: not-allowed;
|
|
95
107
|
}
|
|
96
108
|
|
|
109
|
+
/* Rank */
|
|
110
|
+
|
|
97
111
|
.button--primary {
|
|
98
112
|
--button-bg: var(--color-primary-2);
|
|
99
113
|
--button-color: var(--color-text-primary-2);
|
|
114
|
+
--button-focus-color: var(--color-primary-2);
|
|
100
115
|
}
|
|
101
116
|
|
|
117
|
+
.button--link {
|
|
118
|
+
--button-bg: transparent;
|
|
119
|
+
--button-color: var(--color-link);
|
|
120
|
+
--button-focus-color: var(--color-link);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.button--link:disabled,
|
|
124
|
+
.button--link.button--disabled {
|
|
125
|
+
background: transparent;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Density */
|
|
129
|
+
|
|
130
|
+
.button--compact {
|
|
131
|
+
/*
|
|
132
|
+
* Compact presentation is intentionally left
|
|
133
|
+
* token-driven but visually unfinished.
|
|
134
|
+
*
|
|
135
|
+
* Add compact control dimensions when the
|
|
136
|
+
* corresponding semantic tokens are available.
|
|
137
|
+
*/
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Mode */
|
|
141
|
+
|
|
142
|
+
.button--toolbar {
|
|
143
|
+
--button-bg: transparent;
|
|
144
|
+
--button-color: var(--color-text);
|
|
145
|
+
--button-focus-color: var(--color-text);
|
|
146
|
+
|
|
147
|
+
background: transparent;
|
|
148
|
+
padding-inline: 0;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.button--toolbar:disabled,
|
|
152
|
+
.button--toolbar.button--disabled {
|
|
153
|
+
background: transparent;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* State */
|
|
157
|
+
|
|
158
|
+
.button--loading {
|
|
159
|
+
/*
|
|
160
|
+
* Loading behavior is already defined by the
|
|
161
|
+
* component contract:
|
|
162
|
+
* disabled + aria-busy.
|
|
163
|
+
*
|
|
164
|
+
* Spinner and visual treatment can be added
|
|
165
|
+
* later without changing the public API.
|
|
166
|
+
*/
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Content */
|
|
170
|
+
|
|
102
171
|
.button--icon-only {
|
|
103
172
|
padding-inline: var(--button-padding-icon-only);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.button--toolbar.button--icon-only {
|
|
176
|
+
padding-inline: 0;
|
|
104
177
|
}
|
|
@@ -1,8 +1,31 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import './button.css';
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
export type ButtonRank = 'default' | 'primary' | 'link';
|
|
4
|
+
export type ButtonDensity = 'default' | 'compact';
|
|
5
|
+
type ButtonNativeProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'>;
|
|
6
|
+
interface ButtonSharedProps extends ButtonNativeProps {
|
|
7
|
+
density?: ButtonDensity;
|
|
8
|
+
loading?: boolean;
|
|
6
9
|
}
|
|
10
|
+
type RegularButtonContentProps = {
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
icon?: React.ReactNode;
|
|
13
|
+
} | {
|
|
14
|
+
children?: never;
|
|
15
|
+
icon: React.ReactNode;
|
|
16
|
+
'aria-label': string;
|
|
17
|
+
};
|
|
18
|
+
type RegularButtonProps = ButtonSharedProps & RegularButtonContentProps & {
|
|
19
|
+
mode?: 'default';
|
|
20
|
+
rank?: ButtonRank;
|
|
21
|
+
};
|
|
22
|
+
type ToolbarButtonProps = ButtonSharedProps & {
|
|
23
|
+
mode: 'toolbar';
|
|
24
|
+
icon: React.ReactNode;
|
|
25
|
+
children?: never;
|
|
26
|
+
rank?: never;
|
|
27
|
+
'aria-label': string;
|
|
28
|
+
};
|
|
29
|
+
export type ButtonProps = RegularButtonProps | ToolbarButtonProps;
|
|
7
30
|
declare const Button: React.FC<ButtonProps>;
|
|
8
31
|
export default Button;
|
|
@@ -1,39 +1,64 @@
|
|
|
1
1
|
import { jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { isValidElement, cloneElement } from 'react';
|
|
3
3
|
import './button.css';
|
|
4
|
-
import { classnames } from '../helpers/classnames';
|
|
5
4
|
import Icon from '../../icons/icon';
|
|
5
|
+
import { classnames } from '../helpers/classnames';
|
|
6
6
|
|
|
7
|
+
function hasContent(value) {
|
|
8
|
+
return value !== null && value !== void 0;
|
|
9
|
+
}
|
|
7
10
|
const Button = ({
|
|
8
|
-
|
|
11
|
+
mode = "default",
|
|
12
|
+
rank = "default",
|
|
13
|
+
density = "default",
|
|
14
|
+
loading = false,
|
|
9
15
|
icon,
|
|
10
16
|
className = "",
|
|
11
17
|
disabled = false,
|
|
12
18
|
children,
|
|
13
19
|
...props
|
|
14
20
|
}) => {
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
const hasIcon = hasContent(icon);
|
|
22
|
+
const hasChildren = hasContent(children);
|
|
23
|
+
const isIconOnly = hasIcon && !hasChildren;
|
|
24
|
+
const isDisabled = disabled || loading;
|
|
25
|
+
const classes = classnames(
|
|
26
|
+
"button",
|
|
27
|
+
className,
|
|
28
|
+
{
|
|
29
|
+
"button--primary": rank === "primary",
|
|
30
|
+
"button--link": rank === "link",
|
|
31
|
+
"button--compact": density === "compact",
|
|
32
|
+
"button--toolbar": mode === "toolbar",
|
|
33
|
+
"button--disabled": isDisabled,
|
|
34
|
+
"button--loading": loading,
|
|
35
|
+
"button--icon-only": isIconOnly
|
|
36
|
+
}
|
|
37
|
+
);
|
|
21
38
|
let resolvedIcon = icon;
|
|
22
39
|
if (isValidElement(icon) && icon.type === Icon) {
|
|
23
40
|
const iconElement = icon;
|
|
24
|
-
resolvedIcon = cloneElement(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
41
|
+
resolvedIcon = cloneElement(
|
|
42
|
+
iconElement,
|
|
43
|
+
{
|
|
44
|
+
size: iconElement.props.size ?? "base",
|
|
45
|
+
className: classnames(
|
|
46
|
+
"button__icon",
|
|
47
|
+
iconElement.props.className
|
|
48
|
+
),
|
|
49
|
+
"aria-hidden": iconElement.props["aria-hidden"] ?? true,
|
|
50
|
+
focusable: iconElement.props.focusable ?? false
|
|
51
|
+
}
|
|
52
|
+
);
|
|
30
53
|
}
|
|
54
|
+
const resolvedAriaBusy = loading ? true : props["aria-busy"];
|
|
31
55
|
return /* @__PURE__ */ jsxs(
|
|
32
56
|
"button",
|
|
33
57
|
{
|
|
34
|
-
className: classes,
|
|
35
|
-
disabled,
|
|
36
58
|
...props,
|
|
59
|
+
className: classes,
|
|
60
|
+
disabled: isDisabled,
|
|
61
|
+
"aria-busy": resolvedAriaBusy,
|
|
37
62
|
children: [
|
|
38
63
|
resolvedIcon,
|
|
39
64
|
children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/button/button.tsx"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/button/button.tsx"],"names":[],"mappings":";;;;;;AA6DA,SAAS,WACP,KAAA,EAIA;AACA,EAAA,OAAO,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;AACrC;AAEA,MAAM,SAAgC,CAAC;AAAA,EACrC,IAAA,GAAO,SAAA;AAAA,EACP,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,IAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,WAAW,QAAQ,CAAA;AAEvC,EAAA,MAAM,UAAA,GACJ,WAAW,CAAC,WAAA;AAEd,EAAA,MAAM,aACJ,QAAA,IAAY,OAAA;AAEd,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,mBACE,IAAA,KAAS,SAAA;AAAA,MACX,gBACE,IAAA,KAAS,MAAA;AAAA,MACX,mBACE,OAAA,KAAY,SAAA;AAAA,MACd,mBACE,IAAA,KAAS,SAAA;AAAA,MACX,kBAAA,EACE,UAAA;AAAA,MACF,iBAAA,EACE,OAAA;AAAA,MACF,mBAAA,EACE;AAAA;AACJ,GACF;AAEA,EAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,EAAA,IACE,cAAA,CAAe,IAAI,CAAA,IACnB,IAAA,CAAK,SAAS,IAAA,EACd;AACA,IAAA,MAAM,WAAA,GACJ,IAAA;AAEF,IAAA,YAAA,GAAe,YAAA;AAAA,MACb,WAAA;AAAA,MACA;AAAA,QACE,IAAA,EACE,WAAA,CAAY,KAAA,CAAM,IAAA,IAClB,MAAA;AAAA,QACF,SAAA,EAAW,UAAA;AAAA,UACT,cAAA;AAAA,UACA,YAAY,KAAA,CAAM;AAAA,SACpB;AAAA,QACA,aAAA,EACE,WAAA,CAAY,KAAA,CACV,aACF,CAAA,IAAK,IAAA;AAAA,QACP,SAAA,EACE,WAAA,CAAY,KAAA,CACT,SAAA,IAAa;AAAA;AACpB,KACF;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GACJ,OAAA,GACI,IAAA,GACA,KAAA,CAAM,WAAW,CAAA;AAEvB,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAU,UAAA;AAAA,MACV,WAAA,EAAW,gBAAA;AAAA,MAEV,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,IAAO,cAAA,GAAQ","file":"button.js","sourcesContent":["import React, {\n cloneElement,\n isValidElement,\n type ReactElement,\n} from 'react';\n\nimport './button.css';\nimport Icon, { type IconProps } from '../../icons/icon';\nimport { classnames } from '../helpers/classnames';\n\nexport type ButtonRank =\n | 'default'\n | 'primary'\n | 'link';\n\nexport type ButtonDensity =\n | 'default'\n | 'compact';\n\ntype ButtonNativeProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n>;\n\ninterface ButtonSharedProps\n extends ButtonNativeProps {\n density?: ButtonDensity;\n loading?: boolean;\n}\n\ntype RegularButtonContentProps =\n | {\n children: React.ReactNode;\n icon?: React.ReactNode;\n }\n | {\n children?: never;\n icon: React.ReactNode;\n 'aria-label': string;\n };\n\ntype RegularButtonProps =\n ButtonSharedProps &\n RegularButtonContentProps & {\n mode?: 'default';\n rank?: ButtonRank;\n };\n\ntype ToolbarButtonProps =\n ButtonSharedProps & {\n mode: 'toolbar';\n icon: React.ReactNode;\n children?: never;\n rank?: never;\n 'aria-label': string;\n };\n\nexport type ButtonProps =\n | RegularButtonProps\n | ToolbarButtonProps;\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\nconst Button: React.FC<ButtonProps> = ({\n mode = 'default',\n rank = 'default',\n density = 'default',\n loading = false,\n icon,\n className = '',\n disabled = false,\n children,\n ...props\n}) => {\n const hasIcon = hasContent(icon);\n const hasChildren = hasContent(children);\n\n const isIconOnly =\n hasIcon && !hasChildren;\n\n const isDisabled =\n disabled || loading;\n\n const classes = classnames(\n 'button',\n className,\n {\n 'button--primary':\n rank === 'primary',\n 'button--link':\n rank === 'link',\n 'button--compact':\n density === 'compact',\n 'button--toolbar':\n mode === 'toolbar',\n 'button--disabled':\n isDisabled,\n 'button--loading':\n loading,\n 'button--icon-only':\n isIconOnly,\n },\n );\n\n let resolvedIcon = icon;\n\n if (\n isValidElement(icon) &&\n icon.type === Icon\n ) {\n const iconElement =\n icon as ReactElement<IconProps>;\n\n resolvedIcon = cloneElement(\n iconElement,\n {\n size:\n iconElement.props.size ??\n 'base',\n className: classnames(\n 'button__icon',\n iconElement.props.className,\n ),\n 'aria-hidden':\n iconElement.props[\n 'aria-hidden'\n ] ?? true,\n focusable:\n iconElement.props\n .focusable ?? false,\n },\n );\n }\n\n const resolvedAriaBusy =\n loading\n ? true\n : props['aria-busy'];\n\n return (\n <button\n {...props}\n className={classes}\n disabled={isDisabled}\n aria-busy={resolvedAriaBusy}\n >\n {resolvedIcon}\n {children}\n </button>\n );\n};\n\nexport default Button;\n"]}
|
|
@@ -90,6 +90,9 @@ const FlipList = ({
|
|
|
90
90
|
...props,
|
|
91
91
|
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flip-list__items", children: items.map((item, itemIndex) => {
|
|
92
92
|
const isOpen = resolvedOpenItemId === item.id;
|
|
93
|
+
const hasStatus = hasContent(
|
|
94
|
+
item.status
|
|
95
|
+
);
|
|
93
96
|
const hasMeta = hasContent(
|
|
94
97
|
item.meta
|
|
95
98
|
);
|
|
@@ -118,8 +121,11 @@ const FlipList = ({
|
|
|
118
121
|
"aria-controls": contentId,
|
|
119
122
|
onClick: () => toggleItem(item.id),
|
|
120
123
|
children: [
|
|
121
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-
|
|
122
|
-
|
|
124
|
+
hasStatus && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__status", children: item.status }),
|
|
125
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flip-list__main", children: [
|
|
126
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__title", children: item.title }),
|
|
127
|
+
hasMeta && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__meta", children: item.meta })
|
|
128
|
+
] })
|
|
123
129
|
]
|
|
124
130
|
}
|
|
125
131
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/flip-list/flip-list.tsx"],"names":["React","classnames","jsx","jsxs"],"mappings":";;;;;;;;;;;
|
|
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 status?: 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 * Currently opened item in controlled mode.\n *\n * `null` means that all items are closed.\n *\n * When this prop is provided, FlipList does not\n * own the opened-item state.\n */\n openId?: React.Key | null;\n\n /**\n * Item opened during the initial render\n * in uncontrolled mode.\n *\n * Later changes to this prop do not control\n * the component state.\n */\n defaultOpenId?: React.Key;\n\n /**\n * Called when the user requests a change\n * of the opened item.\n *\n * Receives the item id when an item is opened,\n * and `null` when the currently opened item\n * is closed.\n */\n onOpenChange?: (\n id: React.Key | null,\n ) => void;\n\n /**\n * Scrolls the item that is open during\n * the initial render into view once.\n *\n * In uncontrolled mode, the initial item comes\n * from `defaultOpenId`.\n *\n * In controlled mode, the initial item comes\n * from `openId`.\n *\n * Later state changes never trigger scrolling.\n */\n scrollToInitialOpen?: 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 normalizeOpenItemId(\n items: FlipListItem[],\n openId: OpenItemId | undefined,\n): OpenItemId {\n if (\n openId === null ||\n openId === undefined\n ) {\n return null;\n }\n\n const hasMatchingItem = items.some(\n (item) => item.id === openId,\n );\n\n return hasMatchingItem\n ? openId\n : null;\n}\n\nconst FlipList: React.FC<FlipListProps> = ({\n items,\n openId,\n defaultOpenId,\n onOpenChange,\n scrollToInitialOpen = false,\n className = '',\n ...props\n}) => {\n const componentId = React.useId();\n\n const isControlled =\n openId !== undefined;\n\n const initialOpenItemIdRef =\n React.useRef<OpenItemId>(\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : defaultOpenId,\n ),\n );\n\n const shouldScrollInitiallyRef =\n React.useRef(scrollToInitialOpen);\n\n const initialOpenItemRef =\n React.useRef<HTMLDivElement | null>(\n null,\n );\n\n const hasScrolledInitiallyRef =\n React.useRef(false);\n\n const [\n uncontrolledOpenItemId,\n setUncontrolledOpenItemId,\n ] = React.useState<OpenItemId>(() =>\n normalizeOpenItemId(\n items,\n defaultOpenId,\n ),\n );\n\n const resolvedOpenItemId =\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : uncontrolledOpenItemId,\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 const nextOpenItemId =\n resolvedOpenItemId === itemId\n ? null\n : itemId;\n\n if (!isControlled) {\n setUncontrolledOpenItemId(\n nextOpenItemId,\n );\n }\n\n onOpenChange?.(nextOpenItemId);\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 resolvedOpenItemId === item.id;\n\n const hasStatus = hasContent(\n item.status,\n );\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 {hasStatus && (\n <span className=\"flip-list__status\">\n {item.status}\n </span>\n )}\n\n <span className=\"flip-list__main\">\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 </span>\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;\n"]}
|
|
@@ -133,9 +133,8 @@
|
|
|
133
133
|
|
|
134
134
|
/* size */
|
|
135
135
|
display: flex;
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
gap: var(--flip-list-trigger-column-gap);
|
|
136
|
+
flex-direction: column;
|
|
137
|
+
align-items: stretch;
|
|
139
138
|
width: 100%;
|
|
140
139
|
min-width: 0;
|
|
141
140
|
max-width: 100%;
|
|
@@ -170,6 +169,53 @@
|
|
|
170
169
|
/* motion */
|
|
171
170
|
}
|
|
172
171
|
|
|
172
|
+
.flip-list__status {
|
|
173
|
+
/* color */
|
|
174
|
+
|
|
175
|
+
/* typography */
|
|
176
|
+
|
|
177
|
+
/* size */
|
|
178
|
+
--flip-list-status-gap:
|
|
179
|
+
var(--margin-tag);
|
|
180
|
+
|
|
181
|
+
display: block;
|
|
182
|
+
align-self: flex-start;
|
|
183
|
+
min-width: 0;
|
|
184
|
+
max-width: 100%;
|
|
185
|
+
margin:
|
|
186
|
+
0
|
|
187
|
+
0
|
|
188
|
+
var(--flip-list-status-gap)
|
|
189
|
+
0;
|
|
190
|
+
|
|
191
|
+
/* border */
|
|
192
|
+
|
|
193
|
+
/* depth */
|
|
194
|
+
|
|
195
|
+
/* motion */
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.flip-list__main {
|
|
199
|
+
/* color */
|
|
200
|
+
|
|
201
|
+
/* typography */
|
|
202
|
+
|
|
203
|
+
/* size */
|
|
204
|
+
display: flex;
|
|
205
|
+
align-items: flex-start;
|
|
206
|
+
justify-content: space-between;
|
|
207
|
+
gap: var(--flip-list-trigger-column-gap);
|
|
208
|
+
width: 100%;
|
|
209
|
+
min-width: 0;
|
|
210
|
+
max-width: 100%;
|
|
211
|
+
|
|
212
|
+
/* border */
|
|
213
|
+
|
|
214
|
+
/* depth */
|
|
215
|
+
|
|
216
|
+
/* motion */
|
|
217
|
+
}
|
|
218
|
+
|
|
173
219
|
.flip-list__title {
|
|
174
220
|
/* color */
|
|
175
221
|
color: inherit;
|
|
@@ -84,6 +84,9 @@ const FlipList = ({
|
|
|
84
84
|
...props,
|
|
85
85
|
children: /* @__PURE__ */ jsx("div", { className: "flip-list__items", children: items.map((item, itemIndex) => {
|
|
86
86
|
const isOpen = resolvedOpenItemId === item.id;
|
|
87
|
+
const hasStatus = hasContent(
|
|
88
|
+
item.status
|
|
89
|
+
);
|
|
87
90
|
const hasMeta = hasContent(
|
|
88
91
|
item.meta
|
|
89
92
|
);
|
|
@@ -112,8 +115,11 @@ const FlipList = ({
|
|
|
112
115
|
"aria-controls": contentId,
|
|
113
116
|
onClick: () => toggleItem(item.id),
|
|
114
117
|
children: [
|
|
115
|
-
/* @__PURE__ */ jsx("span", { className: "flip-
|
|
116
|
-
|
|
118
|
+
hasStatus && /* @__PURE__ */ jsx("span", { className: "flip-list__status", children: item.status }),
|
|
119
|
+
/* @__PURE__ */ jsxs("span", { className: "flip-list__main", children: [
|
|
120
|
+
/* @__PURE__ */ jsx("span", { className: "flip-list__title", children: item.title }),
|
|
121
|
+
hasMeta && /* @__PURE__ */ jsx("span", { className: "flip-list__meta", children: item.meta })
|
|
122
|
+
] })
|
|
117
123
|
]
|
|
118
124
|
}
|
|
119
125
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/flip-list/flip-list.tsx"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/flip-list/flip-list.tsx"],"names":[],"mappings":"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","file":"flip-list.js","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 status?: 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 * Currently opened item in controlled mode.\n *\n * `null` means that all items are closed.\n *\n * When this prop is provided, FlipList does not\n * own the opened-item state.\n */\n openId?: React.Key | null;\n\n /**\n * Item opened during the initial render\n * in uncontrolled mode.\n *\n * Later changes to this prop do not control\n * the component state.\n */\n defaultOpenId?: React.Key;\n\n /**\n * Called when the user requests a change\n * of the opened item.\n *\n * Receives the item id when an item is opened,\n * and `null` when the currently opened item\n * is closed.\n */\n onOpenChange?: (\n id: React.Key | null,\n ) => void;\n\n /**\n * Scrolls the item that is open during\n * the initial render into view once.\n *\n * In uncontrolled mode, the initial item comes\n * from `defaultOpenId`.\n *\n * In controlled mode, the initial item comes\n * from `openId`.\n *\n * Later state changes never trigger scrolling.\n */\n scrollToInitialOpen?: 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 normalizeOpenItemId(\n items: FlipListItem[],\n openId: OpenItemId | undefined,\n): OpenItemId {\n if (\n openId === null ||\n openId === undefined\n ) {\n return null;\n }\n\n const hasMatchingItem = items.some(\n (item) => item.id === openId,\n );\n\n return hasMatchingItem\n ? openId\n : null;\n}\n\nconst FlipList: React.FC<FlipListProps> = ({\n items,\n openId,\n defaultOpenId,\n onOpenChange,\n scrollToInitialOpen = false,\n className = '',\n ...props\n}) => {\n const componentId = React.useId();\n\n const isControlled =\n openId !== undefined;\n\n const initialOpenItemIdRef =\n React.useRef<OpenItemId>(\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : defaultOpenId,\n ),\n );\n\n const shouldScrollInitiallyRef =\n React.useRef(scrollToInitialOpen);\n\n const initialOpenItemRef =\n React.useRef<HTMLDivElement | null>(\n null,\n );\n\n const hasScrolledInitiallyRef =\n React.useRef(false);\n\n const [\n uncontrolledOpenItemId,\n setUncontrolledOpenItemId,\n ] = React.useState<OpenItemId>(() =>\n normalizeOpenItemId(\n items,\n defaultOpenId,\n ),\n );\n\n const resolvedOpenItemId =\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : uncontrolledOpenItemId,\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 const nextOpenItemId =\n resolvedOpenItemId === itemId\n ? null\n : itemId;\n\n if (!isControlled) {\n setUncontrolledOpenItemId(\n nextOpenItemId,\n );\n }\n\n onOpenChange?.(nextOpenItemId);\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 resolvedOpenItemId === item.id;\n\n const hasStatus = hasContent(\n item.status,\n );\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 {hasStatus && (\n <span className=\"flip-list__status\">\n {item.status}\n </span>\n )}\n\n <span className=\"flip-list__main\">\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 </span>\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;\n"]}
|
package/components/index.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var button = require('./button/button');
|
|
4
|
-
var buttonIcon = require('./button-icon/button-icon');
|
|
5
4
|
var input = require('./input/input');
|
|
6
5
|
var textarea = require('./textarea/textarea');
|
|
7
6
|
var select = require('./select/select');
|
|
@@ -33,7 +32,6 @@ var avatarUpload = require('./avatar-upload/avatar-upload');
|
|
|
33
32
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
34
33
|
|
|
35
34
|
var button__default = /*#__PURE__*/_interopDefault(button);
|
|
36
|
-
var buttonIcon__default = /*#__PURE__*/_interopDefault(buttonIcon);
|
|
37
35
|
var input__default = /*#__PURE__*/_interopDefault(input);
|
|
38
36
|
var textarea__default = /*#__PURE__*/_interopDefault(textarea);
|
|
39
37
|
var select__default = /*#__PURE__*/_interopDefault(select);
|
|
@@ -67,10 +65,6 @@ Object.defineProperty(exports, "Button", {
|
|
|
67
65
|
enumerable: true,
|
|
68
66
|
get: function () { return button__default.default; }
|
|
69
67
|
});
|
|
70
|
-
Object.defineProperty(exports, "ButtonIcon", {
|
|
71
|
-
enumerable: true,
|
|
72
|
-
get: function () { return buttonIcon__default.default; }
|
|
73
|
-
});
|
|
74
68
|
Object.defineProperty(exports, "Input", {
|
|
75
69
|
enumerable: true,
|
|
76
70
|
get: function () { return input__default.default; }
|
package/components/index.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export { default as Button } from './button/button';
|
|
2
2
|
export type { ButtonProps } from './button/button';
|
|
3
|
-
export { default as ButtonIcon } from './button-icon/button-icon';
|
|
4
|
-
export type { ButtonIconProps } from './button-icon/button-icon';
|
|
5
3
|
export { default as Input } from './input/input';
|
|
6
4
|
export type { InputProps } from './input/input';
|
|
7
5
|
export { default as Textarea } from './textarea/textarea';
|