@snack-uikit/card 0.4.9-preview-85c5f47b.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +322 -0
- package/LICENSE +201 -0
- package/README.md +46 -0
- package/dist/components/Card/Card.d.ts +36 -0
- package/dist/components/Card/Card.js +36 -0
- package/dist/components/Card/constants.d.ts +5 -0
- package/dist/components/Card/constants.js +7 -0
- package/dist/components/Card/index.d.ts +1 -0
- package/dist/components/Card/index.js +1 -0
- package/dist/components/Card/styles.module.css +142 -0
- package/dist/components/Footer/components/Action/Action.d.ts +11 -0
- package/dist/components/Footer/components/Action/Action.js +22 -0
- package/dist/components/Footer/components/Action/index.d.ts +1 -0
- package/dist/components/Footer/components/Action/index.js +1 -0
- package/dist/components/Footer/components/Action/styles.module.css +7 -0
- package/dist/components/Footer/components/CallToAction/CallToAction.d.ts +11 -0
- package/dist/components/Footer/components/CallToAction/CallToAction.js +20 -0
- package/dist/components/Footer/components/CallToAction/index.d.ts +1 -0
- package/dist/components/Footer/components/CallToAction/index.js +1 -0
- package/dist/components/Footer/components/CallToAction/styles.module.css +22 -0
- package/dist/components/Footer/components/Dimension/Dimension.d.ts +12 -0
- package/dist/components/Footer/components/Dimension/Dimension.js +10 -0
- package/dist/components/Footer/components/Dimension/constants.d.ts +4 -0
- package/dist/components/Footer/components/Dimension/constants.js +6 -0
- package/dist/components/Footer/components/Dimension/index.d.ts +1 -0
- package/dist/components/Footer/components/Dimension/index.js +1 -0
- package/dist/components/Footer/components/Dimension/styles.module.css +27 -0
- package/dist/components/Footer/components/Promo/Promo.d.ts +18 -0
- package/dist/components/Footer/components/Promo/Promo.js +25 -0
- package/dist/components/Footer/components/Promo/index.d.ts +1 -0
- package/dist/components/Footer/components/Promo/index.js +1 -0
- package/dist/components/Footer/components/Promo/styles.module.css +6 -0
- package/dist/components/Footer/components/index.d.ts +3 -0
- package/dist/components/Footer/components/index.js +3 -0
- package/dist/components/Footer/index.d.ts +11 -0
- package/dist/components/Footer/index.js +6 -0
- package/dist/components/FunctionBadge/FunctionBadge.d.ts +9 -0
- package/dist/components/FunctionBadge/FunctionBadge.js +23 -0
- package/dist/components/FunctionBadge/constants.d.ts +2 -0
- package/dist/components/FunctionBadge/constants.js +5 -0
- package/dist/components/FunctionBadge/index.d.ts +1 -0
- package/dist/components/FunctionBadge/index.js +1 -0
- package/dist/components/FunctionBadge/styles.module.css +39 -0
- package/dist/components/Header/Header.d.ts +21 -0
- package/dist/components/Header/Header.js +28 -0
- package/dist/components/Header/constants.d.ts +8 -0
- package/dist/components/Header/constants.js +10 -0
- package/dist/components/Header/index.d.ts +1 -0
- package/dist/components/Header/index.js +1 -0
- package/dist/components/Header/styles.module.css +34 -0
- package/dist/components/Image/Image.d.ts +17 -0
- package/dist/components/Image/Image.js +7 -0
- package/dist/components/Image/constants.d.ts +5 -0
- package/dist/components/Image/constants.js +6 -0
- package/dist/components/Image/index.d.ts +1 -0
- package/dist/components/Image/index.js +1 -0
- package/dist/components/Image/styles.module.css +27 -0
- package/dist/components/index.d.ts +20 -0
- package/dist/components/index.js +10 -0
- package/dist/constants.d.ts +16 -0
- package/dist/constants.js +17 -0
- package/dist/context.d.ts +14 -0
- package/dist/context.js +13 -0
- package/dist/helperComponents/Check/Check.d.ts +5 -0
- package/dist/helperComponents/Check/Check.js +8 -0
- package/dist/helperComponents/Check/index.d.ts +1 -0
- package/dist/helperComponents/Check/index.js +1 -0
- package/dist/helperComponents/Check/styles.module.css +16 -0
- package/dist/helperComponents/Emblem/Emblem.d.ts +11 -0
- package/dist/helperComponents/Emblem/Emblem.js +17 -0
- package/dist/helperComponents/Emblem/index.d.ts +1 -0
- package/dist/helperComponents/Emblem/index.js +1 -0
- package/dist/helperComponents/Emblem/styled.module.css +21 -0
- package/dist/helperComponents/FunctionBadgeWrapper/FunctionBadgeWrapper.d.ts +6 -0
- package/dist/helperComponents/FunctionBadgeWrapper/FunctionBadgeWrapper.js +8 -0
- package/dist/helperComponents/FunctionBadgeWrapper/index.d.ts +1 -0
- package/dist/helperComponents/FunctionBadgeWrapper/index.js +1 -0
- package/dist/helperComponents/FunctionBadgeWrapper/styles.module.css +26 -0
- package/dist/helperComponents/PromoBadge/PromoBadge.d.ts +4 -0
- package/dist/helperComponents/PromoBadge/PromoBadge.js +7 -0
- package/dist/helperComponents/PromoBadge/index.d.ts +1 -0
- package/dist/helperComponents/PromoBadge/index.js +1 -0
- package/dist/helperComponents/PromoBadge/styles.module.css +8 -0
- package/dist/helperComponents/index.d.ts +4 -0
- package/dist/helperComponents/index.js +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +46 -0
- package/src/components/Card/Card.tsx +121 -0
- package/src/components/Card/constants.ts +10 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Card/styles.module.scss +181 -0
- package/src/components/Footer/components/Action/Action.tsx +39 -0
- package/src/components/Footer/components/Action/index.ts +1 -0
- package/src/components/Footer/components/Action/styles.module.scss +10 -0
- package/src/components/Footer/components/CallToAction/CallToAction.tsx +25 -0
- package/src/components/Footer/components/CallToAction/index.ts +1 -0
- package/src/components/Footer/components/CallToAction/styles.module.scss +27 -0
- package/src/components/Footer/components/Dimension/Dimension.tsx +50 -0
- package/src/components/Footer/components/Dimension/constants.ts +8 -0
- package/src/components/Footer/components/Dimension/index.ts +1 -0
- package/src/components/Footer/components/Dimension/styles.module.scss +31 -0
- package/src/components/Footer/components/Promo/Promo.tsx +40 -0
- package/src/components/Footer/components/Promo/index.ts +1 -0
- package/src/components/Footer/components/Promo/styles.module.scss +8 -0
- package/src/components/Footer/components/index.ts +3 -0
- package/src/components/Footer/index.ts +20 -0
- package/src/components/FunctionBadge/FunctionBadge.tsx +79 -0
- package/src/components/FunctionBadge/constants.ts +6 -0
- package/src/components/FunctionBadge/index.ts +1 -0
- package/src/components/FunctionBadge/styles.module.scss +48 -0
- package/src/components/Header/Header.tsx +79 -0
- package/src/components/Header/constants.ts +13 -0
- package/src/components/Header/index.ts +1 -0
- package/src/components/Header/styles.module.scss +39 -0
- package/src/components/Image/Image.tsx +18 -0
- package/src/components/Image/constants.ts +5 -0
- package/src/components/Image/index.ts +1 -0
- package/src/components/Image/styles.module.scss +38 -0
- package/src/components/index.ts +28 -0
- package/src/constants.ts +17 -0
- package/src/context.ts +27 -0
- package/src/helperComponents/Check/Check.tsx +20 -0
- package/src/helperComponents/Check/index.ts +1 -0
- package/src/helperComponents/Check/styles.module.scss +17 -0
- package/src/helperComponents/Emblem/Emblem.tsx +44 -0
- package/src/helperComponents/Emblem/index.ts +1 -0
- package/src/helperComponents/Emblem/styled.module.scss +20 -0
- package/src/helperComponents/FunctionBadgeWrapper/FunctionBadgeWrapper.tsx +23 -0
- package/src/helperComponents/FunctionBadgeWrapper/index.ts +1 -0
- package/src/helperComponents/FunctionBadgeWrapper/styles.module.scss +30 -0
- package/src/helperComponents/PromoBadge/PromoBadge.tsx +16 -0
- package/src/helperComponents/PromoBadge/index.ts +1 -0
- package/src/helperComponents/PromoBadge/styles.module.scss +10 -0
- package/src/helperComponents/index.ts +4 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Mode } from './constants';
|
|
2
|
+
export type ImageProps = {
|
|
3
|
+
/** Путь до картинки */
|
|
4
|
+
src: string;
|
|
5
|
+
/** Описание картинки */
|
|
6
|
+
alt: string;
|
|
7
|
+
} /** Image mode */ & ({
|
|
8
|
+
mode?: Mode.Little | Mode.Middle;
|
|
9
|
+
hideFading?: never;
|
|
10
|
+
} | {
|
|
11
|
+
mode: Mode.Background;
|
|
12
|
+
hideFading?: boolean;
|
|
13
|
+
});
|
|
14
|
+
export declare function Image({ src, alt, mode, hideFading }: ImageProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare namespace Image {
|
|
16
|
+
var modes: typeof Mode;
|
|
17
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Mode } from './constants';
|
|
3
|
+
import styles from './styles.module.css';
|
|
4
|
+
export function Image({ src, alt, mode = Mode.Little, hideFading }) {
|
|
5
|
+
return _jsx("img", { src: src, alt: alt, "data-mode": mode, className: styles.image, "data-fading": !hideFading || undefined });
|
|
6
|
+
}
|
|
7
|
+
Image.modes = Mode;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Image';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Image';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
.image{
|
|
2
|
+
display:block;
|
|
3
|
+
box-sizing:border-box;
|
|
4
|
+
width:100%;
|
|
5
|
+
height:auto;
|
|
6
|
+
-o-object-fit:cover;
|
|
7
|
+
object-fit:cover;
|
|
8
|
+
}
|
|
9
|
+
.image[data-mode=little]{
|
|
10
|
+
height:var(--size-card-image-litte, 144px);
|
|
11
|
+
}
|
|
12
|
+
.image[data-mode=middle]{
|
|
13
|
+
height:var(--size-card-image-middle, 240px);
|
|
14
|
+
}
|
|
15
|
+
.image[data-mode=background]{
|
|
16
|
+
position:absolute;
|
|
17
|
+
top:0;
|
|
18
|
+
left:0;
|
|
19
|
+
width:100%;
|
|
20
|
+
height:100%;
|
|
21
|
+
-o-object-fit:cover;
|
|
22
|
+
object-fit:cover;
|
|
23
|
+
}
|
|
24
|
+
.image[data-mode=background][data-fading]{
|
|
25
|
+
-webkit-mask-image:var(--gradient-linear-mask-90deg, linear-gradient(90deg, rgba(253, 253, 253, 0) 0%, rgba(253, 253, 253, 0.0784313725) 33%, #fdfdfd 100%));
|
|
26
|
+
mask-image:var(--gradient-linear-mask-90deg, linear-gradient(90deg, rgba(253, 253, 253, 0) 0%, rgba(253, 253, 253, 0.0784313725) 33%, #fdfdfd 100%));
|
|
27
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Card as CardComponent, CardProps } from './Card';
|
|
2
|
+
import { Footer } from './Footer';
|
|
3
|
+
import { FunctionBadge, FunctionBadgeProps as FunctionBadgeComponentProps } from './FunctionBadge';
|
|
4
|
+
import { Header, HeaderProps as HeaderComponentProps } from './Header';
|
|
5
|
+
import { Image, ImageProps as ImageComponentProps } from './Image';
|
|
6
|
+
export declare const Card: typeof CardComponent & {
|
|
7
|
+
Header: typeof Header;
|
|
8
|
+
Image: typeof Image;
|
|
9
|
+
Footer: typeof Footer;
|
|
10
|
+
FunctionBadge: typeof FunctionBadge;
|
|
11
|
+
};
|
|
12
|
+
export { type CardProps };
|
|
13
|
+
export declare namespace Card {
|
|
14
|
+
type HeaderProps = HeaderComponentProps;
|
|
15
|
+
type ImageProps = ImageComponentProps;
|
|
16
|
+
type FooterActionProps = Footer.ActionProps;
|
|
17
|
+
type FooterPromoProps = Footer.PromoProps;
|
|
18
|
+
type FooterCallToActionProps = Footer.CallToActionProps;
|
|
19
|
+
type FunctionBadgeProps = FunctionBadgeComponentProps;
|
|
20
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Card as CardComponent } from './Card';
|
|
2
|
+
import { Footer } from './Footer';
|
|
3
|
+
import { FunctionBadge } from './FunctionBadge';
|
|
4
|
+
import { Header } from './Header';
|
|
5
|
+
import { Image } from './Image';
|
|
6
|
+
export const Card = CardComponent;
|
|
7
|
+
Card.Header = Header;
|
|
8
|
+
Card.Footer = Footer;
|
|
9
|
+
Card.Image = Image;
|
|
10
|
+
Card.FunctionBadge = FunctionBadge;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare enum Size {
|
|
2
|
+
M = "m",
|
|
3
|
+
L = "l"
|
|
4
|
+
}
|
|
5
|
+
export declare const TEST_IDS: {
|
|
6
|
+
promoBadge: string;
|
|
7
|
+
functionBadge: string;
|
|
8
|
+
droplist: string;
|
|
9
|
+
option: string;
|
|
10
|
+
check: string;
|
|
11
|
+
emblemPicture: string;
|
|
12
|
+
emblemIcon: string;
|
|
13
|
+
title: string;
|
|
14
|
+
description: string;
|
|
15
|
+
metadata: string;
|
|
16
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export var Size;
|
|
2
|
+
(function (Size) {
|
|
3
|
+
Size["M"] = "m";
|
|
4
|
+
Size["L"] = "l";
|
|
5
|
+
})(Size || (Size = {}));
|
|
6
|
+
export const TEST_IDS = {
|
|
7
|
+
promoBadge: 'card__promo-badge',
|
|
8
|
+
functionBadge: 'card__function-badge',
|
|
9
|
+
droplist: 'card__function-badge__droplist',
|
|
10
|
+
option: 'card__function-badge__option',
|
|
11
|
+
check: 'card__check',
|
|
12
|
+
emblemPicture: 'card__header__emblem-picture',
|
|
13
|
+
emblemIcon: 'card__header__emblem-icon',
|
|
14
|
+
title: 'card__header__title',
|
|
15
|
+
description: 'card__header__description',
|
|
16
|
+
metadata: 'card__header__metadata',
|
|
17
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { Size } from './constants';
|
|
3
|
+
type CardContextValue = {
|
|
4
|
+
size: Size;
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare const CardContext: import("react").Context<CardContextValue>;
|
|
8
|
+
export declare function useCardContext(): CardContextValue;
|
|
9
|
+
type FunctionBadgeContextValue = {
|
|
10
|
+
visible?: boolean;
|
|
11
|
+
setVisible?(v: boolean): void;
|
|
12
|
+
};
|
|
13
|
+
export declare const FunctionBadgeContext: import("react").Context<FunctionBadgeContextValue>;
|
|
14
|
+
export {};
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { Size } from './constants';
|
|
3
|
+
export const CardContext = createContext({
|
|
4
|
+
size: Size.M,
|
|
5
|
+
disabled: false,
|
|
6
|
+
});
|
|
7
|
+
export function useCardContext() {
|
|
8
|
+
return useContext(CardContext);
|
|
9
|
+
}
|
|
10
|
+
export const FunctionBadgeContext = createContext({
|
|
11
|
+
visible: false,
|
|
12
|
+
setVisible: () => { },
|
|
13
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import { CheckSVG } from '@snack-uikit/icons';
|
|
4
|
+
import { TEST_IDS } from '../../constants';
|
|
5
|
+
import styles from './styles.module.css';
|
|
6
|
+
export function Check({ className }) {
|
|
7
|
+
return (_jsx("div", Object.assign({ className: styles.checkWrapper }, { children: _jsx("div", Object.assign({ className: cn(styles.checkContainer, className), "data-test-id": TEST_IDS.check }, { children: _jsx(CheckSVG, { size: 16 }) })) })));
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Check';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Check';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
.checkWrapper{
|
|
2
|
+
padding-top:var(--space-card-padding-check-badge, 6px);
|
|
3
|
+
padding-left:var(--space-card-padding-check-badge, 6px);
|
|
4
|
+
position:absolute;
|
|
5
|
+
top:0;
|
|
6
|
+
left:0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.checkContainer{
|
|
10
|
+
width:var(--size-card-check, 16px);
|
|
11
|
+
height:var(--size-card-check, 16px);
|
|
12
|
+
border-radius:var(--radius-card-check, 12px);
|
|
13
|
+
display:flex;
|
|
14
|
+
align-items:center;
|
|
15
|
+
justify-content:center;
|
|
16
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IconPredefinedProps } from '@snack-uikit/icon-predefined';
|
|
2
|
+
type PictureProps = {
|
|
3
|
+
src: string;
|
|
4
|
+
alt: string;
|
|
5
|
+
};
|
|
6
|
+
export type EmblemProps = PictureProps | Pick<IconPredefinedProps, 'icon' | 'decor' | 'appearance'>;
|
|
7
|
+
export declare function Emblem(props: EmblemProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare namespace Emblem {
|
|
9
|
+
var appearances: typeof import("@snack-uikit/icon-predefined/dist/constants").Appearance;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { IconPredefined } from '@snack-uikit/icon-predefined';
|
|
3
|
+
import { TEST_IDS } from '../../constants';
|
|
4
|
+
import { useCardContext } from '../../context';
|
|
5
|
+
import styles from './styled.module.css';
|
|
6
|
+
function isPictureProps(props) {
|
|
7
|
+
return 'src' in props && 'alt' in props;
|
|
8
|
+
}
|
|
9
|
+
export function Emblem(props) {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const { size } = useCardContext();
|
|
12
|
+
if (isPictureProps(props)) {
|
|
13
|
+
return (_jsx("img", { src: props.src, alt: props.alt, "data-size": size || undefined, className: styles.img, "data-test-id": TEST_IDS.emblemPicture }));
|
|
14
|
+
}
|
|
15
|
+
return (_jsx(IconPredefined, { icon: props.icon, appearance: (_a = props.appearance) !== null && _a !== void 0 ? _a : IconPredefined.appearances.Primary, decor: (_b = props.decor) !== null && _b !== void 0 ? _b : true, size: size, "data-test-id": TEST_IDS.emblemIcon }));
|
|
16
|
+
}
|
|
17
|
+
Emblem.appearances = IconPredefined.appearances;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Emblem';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Emblem';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
.img{
|
|
2
|
+
overflow:hidden;
|
|
3
|
+
flex-shrink:0;
|
|
4
|
+
box-sizing:border-box;
|
|
5
|
+
-o-object-fit:cover;
|
|
6
|
+
object-fit:cover;
|
|
7
|
+
border-color:var(--sys-neutral-decor-disabled, #e7e7e7);
|
|
8
|
+
border-style:solid;
|
|
9
|
+
}
|
|
10
|
+
.img[data-size=m]{
|
|
11
|
+
width:var(--size-card-picture-m, 40px);
|
|
12
|
+
height:var(--size-card-picture-m, 40px);
|
|
13
|
+
border-width:var(--border-width-card-picture, 1px);
|
|
14
|
+
border-radius:var(--radius-card-picture, 8px);
|
|
15
|
+
}
|
|
16
|
+
.img[data-size=l]{
|
|
17
|
+
width:var(--size-card-picture-l, 80px);
|
|
18
|
+
height:var(--size-card-picture-l, 80px);
|
|
19
|
+
border-width:var(--border-width-card-picture, 1px);
|
|
20
|
+
border-radius:var(--radius-card-picture, 8px);
|
|
21
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { FunctionBadgeContext } from '../../context';
|
|
4
|
+
import styles from './styles.module.css';
|
|
5
|
+
export function FunctionBadgeWrapper({ children, className }) {
|
|
6
|
+
const [visible, setVisible] = useState(false);
|
|
7
|
+
return (_jsx(FunctionBadgeContext.Provider, Object.assign({ value: { visible, setVisible } }, { children: _jsx("div", Object.assign({ className: className, "data-visible": visible || undefined, tabIndex: -1 }, { children: _jsx("div", Object.assign({ className: styles.functionBadge }, { children: _jsx("div", Object.assign({ className: styles.functionRow }, { children: children })) })) })) })));
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './FunctionBadgeWrapper';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './FunctionBadgeWrapper';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
.functionBadge{
|
|
2
|
+
padding-top:var(--space-card-gap-m, 8px);
|
|
3
|
+
padding-right:var(--space-card-gap-m, 8px);
|
|
4
|
+
position:absolute;
|
|
5
|
+
top:0;
|
|
6
|
+
right:0;
|
|
7
|
+
box-sizing:border-box;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.functionRow{
|
|
11
|
+
position:relative;
|
|
12
|
+
}
|
|
13
|
+
.functionRow::before{
|
|
14
|
+
width:var(--size-card-function-badge-function-row, 32px);
|
|
15
|
+
height:var(--size-card-function-badge-function-row, 32px);
|
|
16
|
+
border-radius:var(--radius-card-button, 12px);
|
|
17
|
+
opacity:var(--opacity-card-transparent-background, 0.8);
|
|
18
|
+
content:"";
|
|
19
|
+
position:absolute;
|
|
20
|
+
top:0;
|
|
21
|
+
left:0;
|
|
22
|
+
width:100%;
|
|
23
|
+
height:100%;
|
|
24
|
+
background-color:var(--sys-neutral-background1-level, #f9f9f9);
|
|
25
|
+
box-shadow:var(--box-shadow-elevation-level2, 0px 0px 4px 0px rgba(0, 0, 0, 0.0392156863), 0px 4px 8px 0px rgba(0, 0, 0, 0.0392156863));
|
|
26
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { PromoTag } from '@snack-uikit/promo-tag';
|
|
3
|
+
import { TEST_IDS } from '../../constants';
|
|
4
|
+
import styles from './styles.module.css';
|
|
5
|
+
export function PromoBadge({ text }) {
|
|
6
|
+
return (_jsx("div", Object.assign({ className: styles.promoBadge }, { children: _jsx(PromoTag, { appearance: PromoTag.appearances.Primary, text: text, "data-test-id": TEST_IDS.promoBadge }) })));
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PromoBadge';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PromoBadge';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components';
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@snack-uikit/card",
|
|
3
|
+
"publishConfig": {
|
|
4
|
+
"access": "public"
|
|
5
|
+
},
|
|
6
|
+
"title": "Card",
|
|
7
|
+
"version": "0.4.9-preview-85c5f47b.0",
|
|
8
|
+
"sideEffects": [
|
|
9
|
+
"*.css",
|
|
10
|
+
"*.woff",
|
|
11
|
+
"*.woff2"
|
|
12
|
+
],
|
|
13
|
+
"description": "Card",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"module": "./dist/index.js",
|
|
16
|
+
"homepage": "https://github.com/cloud-ru-tech/snack-uikit/tree/master/packages/card",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/cloud-ru-tech/snack-uikit.git",
|
|
20
|
+
"directory": "packages/card"
|
|
21
|
+
},
|
|
22
|
+
"author": "Nikita Ershov <niershov@cloud.ru>",
|
|
23
|
+
"contributors": [
|
|
24
|
+
"Nikita Ershov <niershov@cloud.ru>"
|
|
25
|
+
],
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"src",
|
|
29
|
+
"./CHANGELOG.md",
|
|
30
|
+
"./LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"license": "Apache-2.0",
|
|
33
|
+
"scripts": {},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@snack-uikit/button": "0.13.7-preview-85c5f47b.0",
|
|
36
|
+
"@snack-uikit/droplist": "0.10.13-preview-85c5f47b.0",
|
|
37
|
+
"@snack-uikit/icon-predefined": "0.2.6-preview-85c5f47b.0",
|
|
38
|
+
"@snack-uikit/icons": "0.18.2-preview-85c5f47b.0",
|
|
39
|
+
"@snack-uikit/promo-tag": "0.2.6-preview-85c5f47b.0",
|
|
40
|
+
"@snack-uikit/truncate-string": "0.2.17-preview-85c5f47b.0",
|
|
41
|
+
"@snack-uikit/typography": "0.4.5-preview-85c5f47b.0",
|
|
42
|
+
"@snack-uikit/utils": "2.0.2-preview-85c5f47b.0",
|
|
43
|
+
"classnames": "2.3.2"
|
|
44
|
+
},
|
|
45
|
+
"gitHead": "6a7eef41d780d945f64f791448eaa72b9e0ae72d"
|
|
46
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import cn from 'classnames';
|
|
2
|
+
import { KeyboardEvent, ReactElement, ReactNode, useCallback, useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
import { Typography } from '@snack-uikit/typography';
|
|
5
|
+
import { extractSupportProps, WithSupportProps } from '@snack-uikit/utils';
|
|
6
|
+
|
|
7
|
+
import { Size } from '../../constants';
|
|
8
|
+
import { CardContext } from '../../context';
|
|
9
|
+
import { Check, FunctionBadgeWrapper, PromoBadge } from '../../helperComponents';
|
|
10
|
+
import { HeaderProps } from '../Header';
|
|
11
|
+
import { BODY_TEXT_SIZE_MAP, TRIGGER_CLICK_KEY_CODES } from './constants';
|
|
12
|
+
import styles from './styles.module.scss';
|
|
13
|
+
|
|
14
|
+
export type CardProps = WithSupportProps<{
|
|
15
|
+
/** Управление состоянием интерактивности */
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/** Управление состоянием выбран/не выбран */
|
|
18
|
+
checked?: boolean;
|
|
19
|
+
/** Управление состоянием наличия обводки */
|
|
20
|
+
outline?: boolean;
|
|
21
|
+
/** Отображение галочки для режима массового выделения карточек */
|
|
22
|
+
multipleSelection?: boolean;
|
|
23
|
+
/** Колбек на клик по карточке */
|
|
24
|
+
onClick?(): void;
|
|
25
|
+
/** Размер */
|
|
26
|
+
size?: Size;
|
|
27
|
+
/** Текст для PromoBadge */
|
|
28
|
+
promoBadge?: string;
|
|
29
|
+
/** Вложенный контент */
|
|
30
|
+
children?: ReactNode;
|
|
31
|
+
/** Вложенный Header */
|
|
32
|
+
header?: ReactElement<HeaderProps>;
|
|
33
|
+
/** Вложенный Footer */
|
|
34
|
+
footer?: ReactNode;
|
|
35
|
+
/** Вложенный Image */
|
|
36
|
+
image?: ReactNode;
|
|
37
|
+
/** Вложенный FunctionBadge */
|
|
38
|
+
functionBadge?: ReactNode;
|
|
39
|
+
/** CSS-класс для элемента с контентом */
|
|
40
|
+
className?: string;
|
|
41
|
+
}>;
|
|
42
|
+
|
|
43
|
+
export function Card({
|
|
44
|
+
onClick,
|
|
45
|
+
disabled = false,
|
|
46
|
+
checked,
|
|
47
|
+
outline,
|
|
48
|
+
multipleSelection = false,
|
|
49
|
+
size = Size.M,
|
|
50
|
+
children,
|
|
51
|
+
header,
|
|
52
|
+
footer,
|
|
53
|
+
functionBadge,
|
|
54
|
+
promoBadge,
|
|
55
|
+
image,
|
|
56
|
+
className,
|
|
57
|
+
...rest
|
|
58
|
+
}: CardProps) {
|
|
59
|
+
const localRef = useRef<HTMLDivElement>(null);
|
|
60
|
+
|
|
61
|
+
const onKeyDown = useCallback(
|
|
62
|
+
(e: KeyboardEvent<HTMLDivElement>) => {
|
|
63
|
+
if (e.target === localRef.current) {
|
|
64
|
+
if (TRIGGER_CLICK_KEY_CODES.includes(e.code)) {
|
|
65
|
+
onClick?.();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
[onClick],
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<CardContext.Provider value={{ size, disabled }}>
|
|
74
|
+
{/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}
|
|
75
|
+
<div
|
|
76
|
+
ref={localRef}
|
|
77
|
+
className={cn(styles.card, className)}
|
|
78
|
+
{...extractSupportProps(rest)}
|
|
79
|
+
onClick={onClick}
|
|
80
|
+
data-disabled={disabled || undefined}
|
|
81
|
+
data-checked={checked || undefined}
|
|
82
|
+
data-outline={outline || undefined}
|
|
83
|
+
data-pointer={onClick ? true : undefined}
|
|
84
|
+
// eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
|
|
85
|
+
tabIndex={0}
|
|
86
|
+
onKeyDown={onKeyDown}
|
|
87
|
+
>
|
|
88
|
+
{image}
|
|
89
|
+
|
|
90
|
+
{promoBadge && <PromoBadge text={promoBadge} />}
|
|
91
|
+
|
|
92
|
+
<div className={styles.composition} tabIndex={-1}>
|
|
93
|
+
{!disabled && functionBadge && (
|
|
94
|
+
<FunctionBadgeWrapper className={styles.functionBadgeWrapper}>{functionBadge}</FunctionBadgeWrapper>
|
|
95
|
+
)}
|
|
96
|
+
|
|
97
|
+
<div className={styles.contentWrapper}>
|
|
98
|
+
<div className={styles.content} data-size={size}>
|
|
99
|
+
{header || null}
|
|
100
|
+
|
|
101
|
+
<Typography
|
|
102
|
+
family={Typography.families.Sans}
|
|
103
|
+
size={BODY_TEXT_SIZE_MAP[size]}
|
|
104
|
+
role={Typography.roles.Body}
|
|
105
|
+
className={styles.body}
|
|
106
|
+
>
|
|
107
|
+
{children}
|
|
108
|
+
</Typography>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
{footer && <div className={styles.footer}>{footer}</div>}
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
{!disabled && checked && multipleSelection && <Check className={styles.check} />}
|
|
116
|
+
</div>
|
|
117
|
+
</CardContext.Provider>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
Card.sizes = Size;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Typography } from '@snack-uikit/typography';
|
|
2
|
+
|
|
3
|
+
import { Size } from '../../constants';
|
|
4
|
+
|
|
5
|
+
export const BODY_TEXT_SIZE_MAP = {
|
|
6
|
+
[Size.M]: Typography.sizes.M,
|
|
7
|
+
[Size.L]: Typography.sizes.L,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const TRIGGER_CLICK_KEY_CODES = ['Enter', 'Space'];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Card';
|