@edvisor/product-language 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +12 -0
- package/.eslintrc.json +147 -0
- package/.storybook/main.js +57 -0
- package/.storybook/manager.js +7 -0
- package/.storybook/preview.js +15 -0
- package/.storybook/tsconfig.json +30 -0
- package/jest.config.ts +15 -0
- package/jest.setup.ts +2 -0
- package/package.json +21 -10
- package/project.json +96 -0
- package/src/README.md +61 -0
- package/src/assets/svg/example_icon.svg +3 -0
- package/src/assets/svg/example_icon_white.svg +3 -0
- package/src/assets/svg/spinner.svg +3 -0
- package/src/assets/svg/spinner_white.svg +3 -0
- package/src/helpers/index.ts +4 -0
- package/src/helpers/playground.ts +16 -0
- package/src/helpers/talesOf.tsx +42 -0
- package/src/index.ts +2 -0
- package/src/lib/components/README.md +49 -0
- package/src/lib/components/alert-banner/alert-banner.tsx +34 -0
- package/src/lib/components/alert-banner/alert-level-flags.ts +77 -0
- package/src/lib/components/alert-banner/index.ts +1 -0
- package/src/lib/components/badge/badge-type-flags.ts +72 -0
- package/src/lib/components/badge/badge.test.tsx +29 -0
- package/src/lib/components/badge/badge.tsx +22 -0
- package/src/lib/components/badge/index.ts +1 -0
- package/src/lib/components/badge/stories/badge.stories.mdx +44 -0
- package/src/lib/components/badge/stories/components.tsx +49 -0
- package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx} +17 -7
- package/src/lib/components/card/atoms/index.ts +1 -0
- package/src/lib/components/card/card.test.tsx +162 -0
- package/src/lib/components/card/card.tsx +78 -0
- package/src/lib/components/card/components/card-alert-banner-slot.tsx +16 -0
- package/src/lib/components/card/components/card-controls-slot.tsx +19 -0
- package/src/lib/components/card/components/card-section-slot.tsx +51 -0
- package/src/lib/components/card/components/index.ts +3 -0
- package/src/lib/components/card/index.ts +2 -0
- package/src/lib/components/card/molecules/index.ts +1 -0
- package/src/lib/components/card/molecules/left-right-card.test.tsx +89 -0
- package/src/lib/components/card/molecules/left-right-card.tsx +63 -0
- package/src/lib/components/card/storybook/card.stories.mdx +100 -0
- package/src/lib/components/card/storybook/components.tsx +223 -0
- package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
- package/src/lib/components/checkbox/checkbox.tsx +63 -0
- package/src/lib/components/checkbox/helpers.tsx +100 -0
- package/src/lib/components/checkbox/index.tsx +1 -0
- package/src/lib/components/checkbox/stories/checkbox.stories.mdx +57 -0
- package/src/lib/components/checkbox/stories/components.tsx +84 -0
- package/src/lib/components/divider/divider-type-flags.tsx +37 -0
- package/src/lib/components/divider/divider.test.tsx +34 -0
- package/src/lib/components/divider/divider.tsx +37 -0
- package/src/lib/components/divider/index.tsx +1 -0
- package/src/lib/components/divider/stories/components.tsx +13 -0
- package/src/lib/components/divider/stories/divider.stories.mdx +44 -0
- package/src/lib/components/flag/flag-size-flags.tsx +55 -0
- package/src/lib/components/flag/flag.list.tsx +788 -0
- package/src/lib/components/flag/flag.test.tsx +65 -0
- package/src/lib/components/flag/flag.tsx +97 -0
- package/src/lib/components/flag/index.tsx +1 -0
- package/src/lib/components/flag/stories/components.tsx +403 -0
- package/src/lib/components/flag/stories/flag.stories.mdx +48 -0
- package/src/lib/components/flag/stories/playGround-select.tsx +145 -0
- package/src/lib/components/icon/icon-list.tsx +135 -0
- package/src/lib/components/icon/icon.test.tsx +48 -0
- package/src/lib/components/icon/icon.tsx +181 -0
- package/src/lib/components/icon/index.tsx +1 -0
- package/src/lib/components/icon/stories/components.tsx +282 -0
- package/src/lib/components/icon/stories/icon.stories.mdx +65 -0
- package/src/lib/components/index.ts +19 -0
- package/src/lib/components/input-field/components/index.ts +2 -0
- package/src/lib/components/input-field/components/labeled-input.tsx +54 -0
- package/src/lib/components/input-field/components/stepper.tsx +60 -0
- package/src/lib/components/input-field/index.ts +6 -0
- package/src/lib/components/input-field/input-field.test.tsx +107 -0
- package/src/lib/components/input-field/input-field.tsx +126 -0
- package/src/lib/components/input-field/input-number.tsx +41 -0
- package/src/lib/components/input-field/input-text.tsx +30 -0
- package/src/lib/components/input-field/storybook/components.tsx +327 -0
- package/src/lib/components/input-field/storybook/input-field.stories.mdx +113 -0
- package/src/lib/components/layout/flex.tsx +22 -0
- package/src/lib/components/layout/grid-layout.tsx +40 -0
- package/src/lib/components/layout/index.ts +3 -0
- package/src/lib/components/layout/left-right-layout.tsx +67 -0
- package/src/lib/components/link/index.ts +1 -0
- package/src/lib/components/link/link.test.tsx +29 -0
- package/src/lib/components/link/link.tsx +56 -0
- package/src/lib/components/link/storybook/link.stories.mdx +52 -0
- package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +55 -0
- package/src/lib/components/molecules/avatar/avatar.test.tsx +114 -0
- package/src/lib/components/molecules/avatar/avatar.tsx +80 -0
- package/src/lib/components/molecules/avatar/index.tsx +1 -0
- package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +52 -0
- package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
- package/src/lib/components/molecules/button/button-flags.tsx +340 -0
- package/src/lib/components/molecules/button/button.test.tsx +77 -0
- package/src/lib/components/molecules/button/button.tsx +214 -0
- package/src/lib/components/molecules/button/index.tsx +1 -0
- package/src/lib/components/molecules/button/stories/button.stories.mdx +105 -0
- package/src/lib/components/molecules/button/stories/components.tsx +84 -0
- package/src/lib/components/molecules/index.ts +3 -0
- package/src/lib/components/molecules/input-checkbox/index.tsx +1 -0
- package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +34 -0
- package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +49 -0
- package/src/lib/components/molecules/input-checkbox/stories/components.tsx +53 -0
- package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +49 -0
- package/src/lib/components/organisms/index.ts +1 -0
- package/src/lib/components/organisms/multi-choice-list/index.tsx +1 -0
- package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +33 -0
- package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +52 -0
- package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +124 -0
- package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +99 -0
- package/src/lib/components/spinner/index.tsx +1 -0
- package/src/lib/components/spinner/spinner-size-flags.tsx +39 -0
- package/src/lib/components/spinner/spinner.test.tsx +31 -0
- package/src/lib/components/spinner/spinner.tsx +54 -0
- package/src/lib/components/spinner/stories/components.tsx +39 -0
- package/src/lib/components/spinner/stories/spinner.stories.mdx +35 -0
- package/src/lib/components/tabs/components/index.ts +1 -0
- package/src/lib/components/tabs/components/tab.tsx +62 -0
- package/src/lib/components/tabs/index.tsx +1 -0
- package/src/lib/components/tabs/storybook/components.tsx +282 -0
- package/src/lib/components/tabs/storybook/tabs.stories.mdx +97 -0
- package/src/lib/components/tabs/tabs.test.tsx +86 -0
- package/src/lib/components/tabs/tabs.tsx +101 -0
- package/src/lib/components/tag/components/close-button.tsx +85 -0
- package/src/lib/components/tag/components/index.ts +2 -0
- package/src/lib/components/tag/components/tag-label.tsx +44 -0
- package/src/lib/components/tag/index.tsx +1 -0
- package/src/lib/components/tag/stories/components.tsx +86 -0
- package/src/lib/components/tag/stories/tag.stories.mdx +42 -0
- package/src/lib/components/tag/tag.test.tsx +36 -0
- package/src/lib/components/tag/tag.tsx +33 -0
- package/src/lib/components/thumbnail/index.tsx +1 -0
- package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +34 -0
- package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +41 -0
- package/src/lib/components/thumbnail/thumbnail.test.tsx +51 -0
- package/src/lib/components/thumbnail/thumbnail.tsx +45 -0
- package/src/lib/components/typography/index.ts +1 -0
- package/src/lib/components/typography/storybook/components.tsx +288 -0
- package/src/lib/components/typography/storybook/typography.stories.mdx +90 -0
- package/src/lib/components/typography/typography.test.tsx +97 -0
- package/src/lib/components/typography/typography.tsx +99 -0
- package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +123 -0
- package/src/lib/foundations/color-system/base-palette/base-palette.ts +93 -0
- package/src/lib/foundations/color-system/base-palette/index.ts +1 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +85 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +231 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +160 -0
- package/src/lib/foundations/color-system/color-guidelines/index.ts +1 -0
- package/src/lib/foundations/color-system/components/color-sample.tsx +99 -0
- package/src/lib/foundations/color-system/components/index.ts +1 -0
- package/src/lib/foundations/color-system/index.ts +1 -0
- package/src/lib/foundations/index.ts +4 -0
- package/src/lib/foundations/shadows/components.tsx +59 -0
- package/src/lib/foundations/shadows/index.ts +1 -0
- package/src/lib/foundations/shadows/shadows.stories.mdx +71 -0
- package/src/lib/foundations/shadows/shadows.tsx +47 -0
- package/src/lib/foundations/spacing/index.ts +1 -0
- package/src/lib/foundations/spacing/spacing-guidelines.ts +24 -0
- package/src/lib/foundations/spacing/spacing.stories.mdx +51 -0
- package/src/lib/foundations/spacing/spacing.ts +18 -0
- package/src/lib/foundations/typography/constants.ts +25 -0
- package/src/lib/foundations/typography/fonts.ts +205 -0
- package/src/lib/foundations/typography/index.tsx +1 -0
- package/src/lib/foundations/typography/text-aspect-flags.ts +61 -0
- package/src/lib/foundations/typography/typography.tsx +102 -0
- package/src/lib/helpers/generic-types.ts +44 -0
- package/src/lib/helpers/index.ts +6 -0
- package/src/lib/helpers/nothing.tsx +18 -0
- package/src/lib/helpers/numbers.ts +67 -0
- package/src/lib/helpers/safe-navigation.ts +44 -0
- package/src/lib/helpers/slots.test.tsx +98 -0
- package/src/lib/helpers/slots.tsx +157 -0
- package/src/lib/helpers/strings.test.ts +47 -0
- package/src/lib/helpers/strings.ts +16 -0
- package/tsconfig.json +35 -0
- package/tsconfig.lib.json +28 -0
- package/tsconfig.spec.json +21 -0
- package/index.d.ts +0 -2
- package/index.js +0 -6078
- package/lib/components/alert-banner/alert-banner.d.ts +0 -11
- package/lib/components/alert-banner/alert-level-flags.d.ts +0 -13
- package/lib/components/alert-banner/index.d.ts +0 -1
- package/lib/components/badge/badge-type-flags.d.ts +0 -18
- package/lib/components/badge/badge.d.ts +0 -5
- package/lib/components/badge/index.d.ts +0 -1
- package/lib/components/card/atoms/index.d.ts +0 -1
- package/lib/components/card/card.d.ts +0 -14
- package/lib/components/card/components/card-alert-banner-slot.d.ts +0 -5
- package/lib/components/card/components/card-controls-slot.d.ts +0 -4
- package/lib/components/card/components/card-section-slot.d.ts +0 -11
- package/lib/components/card/components/index.d.ts +0 -3
- package/lib/components/card/index.d.ts +0 -2
- package/lib/components/card/molecules/index.d.ts +0 -1
- package/lib/components/card/molecules/left-right-card.d.ts +0 -16
- package/lib/components/checkbox/checkbox.d.ts +0 -11
- package/lib/components/checkbox/components/components.d.ts +0 -12
- package/lib/components/checkbox/index.d.ts +0 -1
- package/lib/components/divider/divider-type-flags.d.ts +0 -9
- package/lib/components/divider/divider.d.ts +0 -7
- package/lib/components/divider/index.d.ts +0 -1
- package/lib/components/index.d.ts +0 -12
- package/lib/components/input-field/components/index.d.ts +0 -2
- package/lib/components/input-field/components/labeled-input.d.ts +0 -11
- package/lib/components/input-field/components/stepper.d.ts +0 -7
- package/lib/components/input-field/index.d.ts +0 -3
- package/lib/components/input-field/input-field.d.ts +0 -25
- package/lib/components/input-field/input-number.d.ts +0 -18
- package/lib/components/input-field/input-text.d.ts +0 -14
- package/lib/components/layout/flex.d.ts +0 -16
- package/lib/components/layout/grid-layout.d.ts +0 -11
- package/lib/components/layout/index.d.ts +0 -3
- package/lib/components/layout/left-right-layout.d.ts +0 -70
- package/lib/components/link/index.d.ts +0 -1
- package/lib/components/link/link.d.ts +0 -14
- package/lib/components/molecules/avatar/avatar-size-flags.d.ts +0 -12
- package/lib/components/molecules/avatar/avatar.d.ts +0 -12
- package/lib/components/molecules/avatar/index.d.ts +0 -1
- package/lib/components/molecules/button/button-flags.d.ts +0 -39
- package/lib/components/molecules/button/button.d.ts +0 -24
- package/lib/components/molecules/button/index.d.ts +0 -1
- package/lib/components/molecules/index.d.ts +0 -3
- package/lib/components/molecules/input-checkbox/index.d.ts +0 -1
- package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +0 -8
- package/lib/components/organisms/index.d.ts +0 -1
- package/lib/components/organisms/multi-choice-list/index.d.ts +0 -1
- package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +0 -11
- package/lib/components/spinner/index.d.ts +0 -1
- package/lib/components/spinner/spinner-size-flags.d.ts +0 -10
- package/lib/components/spinner/spinner.d.ts +0 -9
- package/lib/components/thumbnail/index.d.ts +0 -1
- package/lib/components/thumbnail/thumbnail-size-flags.d.ts +0 -10
- package/lib/components/thumbnail/thumbnail.d.ts +0 -9
- package/lib/components/typography/index.d.ts +0 -1
- package/lib/components/typography/typography.d.ts +0 -23
- package/lib/foundations/color-system/base-palette/base-palette.d.ts +0 -77
- package/lib/foundations/color-system/base-palette/index.d.ts +0 -1
- package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +0 -131
- package/lib/foundations/color-system/color-guidelines/index.d.ts +0 -1
- package/lib/foundations/color-system/components/color-sample.d.ts +0 -17
- package/lib/foundations/color-system/components/index.d.ts +0 -1
- package/lib/foundations/color-system/index.d.ts +0 -1
- package/lib/foundations/index.d.ts +0 -4
- package/lib/foundations/shadows/components.d.ts +0 -8
- package/lib/foundations/shadows/index.d.ts +0 -1
- package/lib/foundations/shadows/shadows.d.ts +0 -8
- package/lib/foundations/spacing/index.d.ts +0 -1
- package/lib/foundations/spacing/spacing-guidelines.d.ts +0 -22
- package/lib/foundations/spacing/spacing.d.ts +0 -18
- package/lib/foundations/typography/constants.d.ts +0 -22
- package/lib/foundations/typography/index.d.ts +0 -1
- package/lib/foundations/typography/text-aspect-flags.d.ts +0 -14
- package/lib/foundations/typography/typography.d.ts +0 -19
- package/lib/helpers/generic-types.d.ts +0 -21
- package/lib/helpers/index.d.ts +0 -6
- package/lib/helpers/nothing.d.ts +0 -8
- package/lib/helpers/numbers.d.ts +0 -41
- package/lib/helpers/safe-navigation.d.ts +0 -14
- package/lib/helpers/slots.d.ts +0 -8
- package/lib/helpers/strings.d.ts +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
import { FC, Hex, PropsWithChildren } from '@helpers'
|
|
3
|
+
import { AlertLevelProps, getBackgroundColor, getBorderColor } from './alert-level-flags'
|
|
4
|
+
import { Padding } from '@foundations'
|
|
5
|
+
import { CardFrame } from 'components/card/atoms'
|
|
6
|
+
|
|
7
|
+
interface IAlertBannerProps extends PropsWithChildren {
|
|
8
|
+
/** @TODO can we get some examples of alert banner in card from figma? */
|
|
9
|
+
inCard?: boolean
|
|
10
|
+
dismissible?: boolean
|
|
11
|
+
className?: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type AlertBannerProps = IAlertBannerProps & AlertLevelProps
|
|
15
|
+
|
|
16
|
+
const InCardFrame = styled(CardFrame).attrs({ as: 'div' })<{ background: Hex, border: Hex }>`
|
|
17
|
+
display: inline-block;
|
|
18
|
+
padding: ${Padding.m};
|
|
19
|
+
width: fill-available;
|
|
20
|
+
|
|
21
|
+
background: ${({ background }) => background};
|
|
22
|
+
border: 1px solid ${({ border }) => border};
|
|
23
|
+
`
|
|
24
|
+
|
|
25
|
+
export const AlertBanner: FC<AlertBannerProps> = (props) => {
|
|
26
|
+
const background = getBackgroundColor(props)
|
|
27
|
+
const border = getBorderColor(props)
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<InCardFrame background={background} border={border} className={props.className}>
|
|
31
|
+
{props.children}
|
|
32
|
+
</InCardFrame>
|
|
33
|
+
)
|
|
34
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// this file was generated, but it is safe to modify
|
|
2
|
+
import { Borders, Surface } from '@foundations'
|
|
3
|
+
import { bitwiseOr, Hex, MappedEnum, RequireOnlyOne, PropsWithChildren } from '@helpers'
|
|
4
|
+
|
|
5
|
+
const enum AlertLevel {
|
|
6
|
+
neutral = 1,
|
|
7
|
+
info = 2,
|
|
8
|
+
success = 4,
|
|
9
|
+
warning = 8,
|
|
10
|
+
critical = 16,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
type AlertLevels<T> = MappedEnum<typeof AlertLevel, T>
|
|
14
|
+
|
|
15
|
+
function toAlertLevel(n: number): AlertLevel {
|
|
16
|
+
switch (n) {
|
|
17
|
+
case AlertLevel.neutral:
|
|
18
|
+
return AlertLevel.neutral
|
|
19
|
+
case AlertLevel.info:
|
|
20
|
+
return AlertLevel.info
|
|
21
|
+
case AlertLevel.success:
|
|
22
|
+
return AlertLevel.success
|
|
23
|
+
case AlertLevel.warning:
|
|
24
|
+
return AlertLevel.warning
|
|
25
|
+
case AlertLevel.critical:
|
|
26
|
+
return AlertLevel.critical
|
|
27
|
+
default:
|
|
28
|
+
return AlertLevel.neutral
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type AlertLevelProps = Partial<RequireOnlyOne<AlertLevels<boolean>>> &
|
|
33
|
+
PropsWithChildren
|
|
34
|
+
|
|
35
|
+
const AlertLevelBackgroundColors = {
|
|
36
|
+
[AlertLevel.neutral]: Surface.Neutral.Subdued,
|
|
37
|
+
[AlertLevel.info]: Surface.Highlight.Subdued,
|
|
38
|
+
[AlertLevel.success]: Surface.Success.Subdued,
|
|
39
|
+
[AlertLevel.warning]: Surface.Warning.Subdued,
|
|
40
|
+
[AlertLevel.critical]: Surface.Critical.Subdued,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const AlertLevelBorderColors = {
|
|
44
|
+
[AlertLevel.neutral]: Borders.Default.Default,
|
|
45
|
+
[AlertLevel.info]: Borders.Highlight.Subdued,
|
|
46
|
+
[AlertLevel.success]: Borders.Success.Subdued,
|
|
47
|
+
[AlertLevel.warning]: Borders.Warning.Subdued,
|
|
48
|
+
[AlertLevel.critical]: Borders.Critical.Subdued,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function getBackgroundColor(props: AlertLevelProps): Hex {
|
|
52
|
+
return AlertLevelBackgroundColors[
|
|
53
|
+
toAlertLevel(
|
|
54
|
+
bitwiseOr([
|
|
55
|
+
props.neutral,
|
|
56
|
+
props.info,
|
|
57
|
+
props.success,
|
|
58
|
+
props.warning,
|
|
59
|
+
props.critical,
|
|
60
|
+
])
|
|
61
|
+
)
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function getBorderColor(props: AlertLevelProps): Hex {
|
|
66
|
+
return AlertLevelBorderColors[
|
|
67
|
+
toAlertLevel(
|
|
68
|
+
bitwiseOr([
|
|
69
|
+
props.neutral,
|
|
70
|
+
props.info,
|
|
71
|
+
props.success,
|
|
72
|
+
props.warning,
|
|
73
|
+
props.critical,
|
|
74
|
+
])
|
|
75
|
+
)
|
|
76
|
+
]
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './alert-banner'
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// this file was generated, but it is safe to modify
|
|
2
|
+
import { Hex, PropsWithChildren } from '@helpers'
|
|
3
|
+
import { Surface } from '@foundations'
|
|
4
|
+
|
|
5
|
+
const enum BadgeType {
|
|
6
|
+
neutral = 1,
|
|
7
|
+
info = 2,
|
|
8
|
+
success = 4,
|
|
9
|
+
warning = 8,
|
|
10
|
+
critical = 16,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<
|
|
14
|
+
T,
|
|
15
|
+
Exclude<keyof T, Keys>
|
|
16
|
+
> &
|
|
17
|
+
{
|
|
18
|
+
[K in Keys]-?: Required<Pick<T, K>> &
|
|
19
|
+
Partial<Record<Exclude<Keys, K>, undefined>>;
|
|
20
|
+
}[Keys];
|
|
21
|
+
|
|
22
|
+
export type MappedEnum<E, T> = {
|
|
23
|
+
[key in keyof E]: T;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type BadgeTypes<T> = MappedEnum<typeof BadgeType, T>
|
|
27
|
+
|
|
28
|
+
function toBadgeType(n: number): BadgeType {
|
|
29
|
+
switch (n) {
|
|
30
|
+
case BadgeType.neutral:
|
|
31
|
+
return BadgeType.neutral
|
|
32
|
+
case BadgeType.info:
|
|
33
|
+
return BadgeType.info
|
|
34
|
+
case BadgeType.success:
|
|
35
|
+
return BadgeType.success
|
|
36
|
+
case BadgeType.warning:
|
|
37
|
+
return BadgeType.warning
|
|
38
|
+
case BadgeType.critical:
|
|
39
|
+
return BadgeType.critical
|
|
40
|
+
default:
|
|
41
|
+
return BadgeType.neutral
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const BadgeTypeColors = {
|
|
46
|
+
[BadgeType.neutral]: Surface.Neutral.Default,
|
|
47
|
+
[BadgeType.info]: Surface.Highlight.Default,
|
|
48
|
+
[BadgeType.success]: Surface.Success.Default,
|
|
49
|
+
[BadgeType.warning]: Surface.Warning.Default,
|
|
50
|
+
[BadgeType.critical]: Surface.Critical.Default,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export type BadgeTypeProps = Partial<RequireOnlyOne<BadgeTypes<boolean>>> &
|
|
54
|
+
PropsWithChildren
|
|
55
|
+
|
|
56
|
+
function bitwiseOr(flags: unknown[]): number {
|
|
57
|
+
return flags.reduce((mask: number, flag, i) => mask | (Number(flag) << i), 0)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function getColor(props: BadgeTypeProps): Hex {
|
|
61
|
+
return BadgeTypeColors[
|
|
62
|
+
toBadgeType(
|
|
63
|
+
bitwiseOr([
|
|
64
|
+
props.neutral,
|
|
65
|
+
props.info,
|
|
66
|
+
props.success,
|
|
67
|
+
props.warning,
|
|
68
|
+
props.critical,
|
|
69
|
+
])
|
|
70
|
+
)
|
|
71
|
+
]
|
|
72
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { render } from '@testing-library/react'
|
|
2
|
+
import { Badge } from './badge'
|
|
3
|
+
|
|
4
|
+
describe('Badge', () => {
|
|
5
|
+
it('should render Neutral Badge successfully', () => {
|
|
6
|
+
const { baseElement } = render(<Badge neutral>Neutral</Badge>)
|
|
7
|
+
expect(baseElement).toBeTruthy()
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
it('should render Informational Badge successfully', () => {
|
|
11
|
+
const { baseElement } = render(<Badge info>Informational</Badge>)
|
|
12
|
+
expect(baseElement).toBeTruthy()
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('should render Warning Badge successfully', () => {
|
|
16
|
+
const { baseElement } = render(<Badge warning>Warning</Badge>)
|
|
17
|
+
expect(baseElement).toBeTruthy()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should render Success Badge successfully', () => {
|
|
21
|
+
const { baseElement } = render(<Badge success>Success</Badge>)
|
|
22
|
+
expect(baseElement).toBeTruthy()
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('should render Critical Badge successfully', () => {
|
|
26
|
+
const { baseElement } = render(<Badge critical>Critical</Badge>)
|
|
27
|
+
expect(baseElement).toBeTruthy()
|
|
28
|
+
})
|
|
29
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
import { Padding } from '@foundations'
|
|
3
|
+
import { BadgeTypeProps, getColor } from './badge-type-flags'
|
|
4
|
+
import { FC, PropsWithChildren } from '@helpers'
|
|
5
|
+
import { Label } from 'components/typography'
|
|
6
|
+
|
|
7
|
+
const BadgeFrame = styled(Label)<{color: string}>`
|
|
8
|
+
background: ${props => props.color};
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items:center;
|
|
11
|
+
padding: ${Padding.xxxs} ${Padding.xs};
|
|
12
|
+
border-radius:10px;
|
|
13
|
+
height: fit-content;
|
|
14
|
+
`
|
|
15
|
+
|
|
16
|
+
type IBadgeProps = BadgeTypeProps & PropsWithChildren
|
|
17
|
+
|
|
18
|
+
export const Badge: FC<IBadgeProps> = (props) => {
|
|
19
|
+
const color = getColor(props)
|
|
20
|
+
|
|
21
|
+
return <BadgeFrame color={color}>{props.children}</BadgeFrame>
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './badge'
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Badge } from '../badge'
|
|
2
|
+
import { Meta } from '@storybook/addon-docs'
|
|
3
|
+
import { BadgeExample } from './components'
|
|
4
|
+
|
|
5
|
+
<Meta
|
|
6
|
+
title="Components/Badge"
|
|
7
|
+
component={Badge}
|
|
8
|
+
/>
|
|
9
|
+
|
|
10
|
+
# Badge
|
|
11
|
+
|
|
12
|
+
This is an atom.
|
|
13
|
+
|
|
14
|
+
For more details, check out the component page on [Figma](https://www.figma.com/file/ue1CurHfZ426o2T2l8Dk64/Edvisor-Product-Language?node-id=1008%3A1257)
|
|
15
|
+
|
|
16
|
+
## How to use
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { Badge } from '@edvisor/product-language'
|
|
20
|
+
|
|
21
|
+
<Badge>Contents</Badge>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Attitudes
|
|
25
|
+
|
|
26
|
+
The badge can be rendered with various attitudes.
|
|
27
|
+
|
|
28
|
+
<BadgeExample />
|
|
29
|
+
|
|
30
|
+
## API
|
|
31
|
+
|
|
32
|
+
| Name | Type | Description |
|
|
33
|
+
| ----------- | --------- | ------------------------- |
|
|
34
|
+
| `neutral?` | `boolean` | renders the neutral badge |
|
|
35
|
+
| `info?` | `boolean` | renders the info badge |
|
|
36
|
+
| `warning?` | `boolean` | renders the info warning |
|
|
37
|
+
| `success?` | `boolean` | renders the info success |
|
|
38
|
+
| `critical?` | `boolean` | renders the info critical |
|
|
39
|
+
|
|
40
|
+
## Changelog
|
|
41
|
+
|
|
42
|
+
### [0.0.0]
|
|
43
|
+
- adopt the preferred storybook style
|
|
44
|
+
- removed a containing div, adjusted styles to match figma
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Margin } from '@foundations'
|
|
2
|
+
import { Flex } from 'components/layout'
|
|
3
|
+
import { Heading1 } from 'components/typography'
|
|
4
|
+
import { Playground } from 'storybook-addon-jarle-monaco'
|
|
5
|
+
import styled from 'styled-components'
|
|
6
|
+
import { Badge } from '../badge'
|
|
7
|
+
|
|
8
|
+
const Heading = styled(Heading1)`
|
|
9
|
+
margin-bottom: ${Margin.none};
|
|
10
|
+
margin-right: ${Margin.s};
|
|
11
|
+
`
|
|
12
|
+
|
|
13
|
+
const Header = styled(Flex)`
|
|
14
|
+
margin-bottom: ${Margin.l};
|
|
15
|
+
align-items: center;
|
|
16
|
+
`
|
|
17
|
+
|
|
18
|
+
export const BadgeExample = () => (
|
|
19
|
+
<Playground
|
|
20
|
+
code={`
|
|
21
|
+
<>
|
|
22
|
+
<Header>
|
|
23
|
+
<Heading>Booking #1123</Heading>
|
|
24
|
+
<Badge warning>Pending</Badge>
|
|
25
|
+
</Header>
|
|
26
|
+
<Header>
|
|
27
|
+
<Heading>Booking #1124</Heading>
|
|
28
|
+
<Badge success>Accepted</Badge>
|
|
29
|
+
</Header>
|
|
30
|
+
<Header>
|
|
31
|
+
<Heading>Booking #1125</Heading>
|
|
32
|
+
<Badge info>Processing</Badge>
|
|
33
|
+
</Header>
|
|
34
|
+
<Header>
|
|
35
|
+
<Heading>Booking #1126</Heading>
|
|
36
|
+
<Badge critical>Declined</Badge>
|
|
37
|
+
</Header>
|
|
38
|
+
</>
|
|
39
|
+
`}
|
|
40
|
+
providerProps={{
|
|
41
|
+
renderAsComponent: true,
|
|
42
|
+
scope: {
|
|
43
|
+
Badge,
|
|
44
|
+
Heading,
|
|
45
|
+
Header,
|
|
46
|
+
},
|
|
47
|
+
}}
|
|
48
|
+
/>
|
|
49
|
+
)
|
package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx}
RENAMED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
|
|
2
|
+
import styled from 'styled-components'
|
|
3
|
+
import { Surface, Margin } from '@foundations'
|
|
4
|
+
|
|
5
|
+
/** this is the frame that is used to implement the Card component
|
|
6
|
+
* importantly it does not have any padding, which means it can be
|
|
7
|
+
* used to implement a broader range of components than just the card.
|
|
8
|
+
*
|
|
9
|
+
* We might use it to implement the AlertBanner, or put a table in it.
|
|
10
|
+
*/
|
|
11
|
+
export const CardFrame = styled.section`
|
|
12
|
+
background: ${Surface.Default.Default};
|
|
13
|
+
max-width: 1024px;
|
|
14
|
+
|
|
15
|
+
border-radius: 6px;
|
|
16
|
+
margin-bottom: ${Margin.m};
|
|
17
|
+
`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './card-frame'
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { Margin } from '@foundations'
|
|
2
|
+
import { render, screen } from '@testing-library/react'
|
|
3
|
+
import userEvent from '@testing-library/user-event'
|
|
4
|
+
import styled from 'styled-components'
|
|
5
|
+
|
|
6
|
+
import { Card } from './card'
|
|
7
|
+
|
|
8
|
+
describe('Card', () => {
|
|
9
|
+
it('renders with the heading', () => {
|
|
10
|
+
render(
|
|
11
|
+
<Card heading='Heading'>Contents</Card>
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
expect(screen.getByRole('heading')).toBeInTheDocument()
|
|
15
|
+
expect(screen.getByText('Heading')).toBeInTheDocument()
|
|
16
|
+
expect(screen.getByText('Contents')).toBeInTheDocument()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
it('renders without the heading', () => {
|
|
20
|
+
render(
|
|
21
|
+
<Card>Contents</Card>
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
expect(screen.queryByRole('heading')).not.toBeInTheDocument()
|
|
25
|
+
expect(screen.getByText('Contents')).toBeInTheDocument()
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* this test just ensures that the programmer did not
|
|
30
|
+
* forget to add className? to the props and then pass
|
|
31
|
+
* it to the wrapping element so that users downstream
|
|
32
|
+
* can style the component
|
|
33
|
+
*/
|
|
34
|
+
it('accepts styles', () => {
|
|
35
|
+
const NiceCard = styled(Card)`
|
|
36
|
+
margin-bottom: ${Margin.l};
|
|
37
|
+
`
|
|
38
|
+
|
|
39
|
+
const { container } = render(<NiceCard>Contents</NiceCard>)
|
|
40
|
+
|
|
41
|
+
expect(container.firstChild).toHaveStyle(`margin-bottom: ${Margin.l}`)
|
|
42
|
+
expect(screen.getByText('Contents')).toBeInTheDocument()
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
describe('slots', () => {
|
|
46
|
+
it('renders no regions if it has no headings', () => {
|
|
47
|
+
render(
|
|
48
|
+
<Card>Contents</Card>
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
expect(screen.queryByRole('region')).not.toBeInTheDocument()
|
|
52
|
+
expect(screen.getByText('Contents')).toBeInTheDocument()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('renders one region if the card has a heading', () => {
|
|
56
|
+
render(
|
|
57
|
+
<Card heading='Heading'>Contents</Card>
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
expect(screen.getByRole('region')).toBeInTheDocument()
|
|
61
|
+
expect(screen.getAllByRole('region').length).toBe(1)
|
|
62
|
+
expect(screen.getByText('Contents')).toBeInTheDocument()
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('renders one region per heading', () => {
|
|
66
|
+
render(
|
|
67
|
+
<Card heading='Heading'>
|
|
68
|
+
<Card.Section heading='Subheading 1'>Section 1</Card.Section>
|
|
69
|
+
<Card.Section heading='Subheading 2'>Section 2</Card.Section>
|
|
70
|
+
<Card.Section>Section 3</Card.Section>
|
|
71
|
+
<Card.Section>Section 4</Card.Section>
|
|
72
|
+
</Card>
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
expect(screen.getAllByRole('region').length).toBe(3)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('renders all the given sections', () => {
|
|
79
|
+
render(
|
|
80
|
+
<Card heading='Heading'>
|
|
81
|
+
<Card.Section heading='Subheading 1'>Section 1</Card.Section>
|
|
82
|
+
<Card.Section heading='Subheading 2'>Section 2</Card.Section>
|
|
83
|
+
<Card.Section>Section 3</Card.Section>
|
|
84
|
+
<Card.Section>Section 4</Card.Section>
|
|
85
|
+
</Card>
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
expect(screen.getByText('Section 1')).toBeInTheDocument()
|
|
89
|
+
expect(screen.getByText('Section 2')).toBeInTheDocument()
|
|
90
|
+
expect(screen.getByText('Section 3')).toBeInTheDocument()
|
|
91
|
+
expect(screen.getByText('Section 4')).toBeInTheDocument()
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('does not render plain children if you give it sections', () => {
|
|
95
|
+
render(
|
|
96
|
+
<Card>
|
|
97
|
+
<Card.Section>Section 1</Card.Section>
|
|
98
|
+
<div data-testid='plain-children'>PLAIN CHILDREN</div>
|
|
99
|
+
</Card>
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
expect(screen.getByText('Section 1')).toBeInTheDocument()
|
|
103
|
+
expect(screen.queryByTestId('plain-children')).not.toBeInTheDocument()
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('renders the heading actions if there is a heading', () => {
|
|
107
|
+
render(
|
|
108
|
+
<Card heading='Heading'>
|
|
109
|
+
<Card.Section>Section 1</Card.Section>
|
|
110
|
+
<Card.HeadingAction>
|
|
111
|
+
<button>Click Me</button>
|
|
112
|
+
</Card.HeadingAction>
|
|
113
|
+
</Card>
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
expect(screen.getByRole('button')).toBeInTheDocument()
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('does not render heading actions if there is no heading', () => {
|
|
120
|
+
render(
|
|
121
|
+
<Card>
|
|
122
|
+
<Card.Section>Section 1</Card.Section>
|
|
123
|
+
<Card.HeadingAction>
|
|
124
|
+
<button>Click Me</button>
|
|
125
|
+
</Card.HeadingAction>
|
|
126
|
+
</Card>
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
expect(screen.queryByRole('button')).not.toBeInTheDocument()
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it('renders the controls when they are provided', () => {
|
|
133
|
+
render(
|
|
134
|
+
<Card heading='Heading'>
|
|
135
|
+
<Card.Section>Section 1</Card.Section>
|
|
136
|
+
<Card.Controls>
|
|
137
|
+
<button>Click Me</button>
|
|
138
|
+
</Card.Controls>
|
|
139
|
+
</Card>
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
expect(screen.getByRole('button')).toBeInTheDocument()
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('does not stop the user from clicking the controls', async () => {
|
|
146
|
+
const handleClick = jest.fn()
|
|
147
|
+
|
|
148
|
+
render(
|
|
149
|
+
<Card heading='Heading'>
|
|
150
|
+
<Card.Section>Section 1</Card.Section>
|
|
151
|
+
<Card.Controls>
|
|
152
|
+
<button onClick={handleClick}>Click Me</button>
|
|
153
|
+
</Card.Controls>
|
|
154
|
+
</Card>
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
await userEvent.click(screen.getByText('Click Me'))
|
|
158
|
+
|
|
159
|
+
expect(handleClick).toHaveBeenCalledTimes(1)
|
|
160
|
+
})
|
|
161
|
+
})
|
|
162
|
+
})
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
import { isDefined, isEmpty, getSlots, getOtherChildren, FC, PropsWithChildren, If, getSlot, toKebabCase } from '@helpers'
|
|
3
|
+
import { Padding, Margin, shadow } from '@foundations'
|
|
4
|
+
import { CardFrame as CardFrameBase } from './atoms'
|
|
5
|
+
import { Heading3 } from 'components/typography'
|
|
6
|
+
import { SpaceBetween } from 'components/layout'
|
|
7
|
+
import { CardAlertBannerSlot, CardControlsSlot, CardHeadingActionSlot, CardSectionSlot } from './components'
|
|
8
|
+
import { HTMLAttributes } from 'react'
|
|
9
|
+
|
|
10
|
+
const CardHeading = styled(SpaceBetween)`
|
|
11
|
+
margin: ${Margin.none} ${Margin.l} ${Margin.none} ${Margin.l};
|
|
12
|
+
padding-top: ${Padding.l};
|
|
13
|
+
`
|
|
14
|
+
|
|
15
|
+
/** remove the margin bottom here since the frame handles it */
|
|
16
|
+
const CardHeadingText = styled(Heading3)`
|
|
17
|
+
margin-bottom: ${Margin.none};
|
|
18
|
+
`
|
|
19
|
+
|
|
20
|
+
const CardFrame = styled(CardFrameBase)`
|
|
21
|
+
${shadow};
|
|
22
|
+
|
|
23
|
+
> section:nth-of-type(1) {
|
|
24
|
+
border: none;
|
|
25
|
+
}
|
|
26
|
+
`
|
|
27
|
+
|
|
28
|
+
export interface ICardProps extends HTMLAttributes<HTMLDivElement>, PropsWithChildren {
|
|
29
|
+
heading?: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const SubComponents = {
|
|
33
|
+
Section: CardSectionSlot,
|
|
34
|
+
Controls: CardControlsSlot,
|
|
35
|
+
HeadingAction: CardHeadingActionSlot,
|
|
36
|
+
AlertBanner: CardAlertBannerSlot,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const Card: FC<ICardProps, typeof SubComponents> = (props) => {
|
|
40
|
+
const { children, heading, ...htmlProps } = props
|
|
41
|
+
|
|
42
|
+
const sections = getSlots(CardSectionSlot, children)
|
|
43
|
+
const controls = getSlot(CardControlsSlot, children)
|
|
44
|
+
const headingAction = getSlot(CardHeadingActionSlot, children)
|
|
45
|
+
const alertBanners = getSlots(CardAlertBannerSlot, children)
|
|
46
|
+
const otherChildren = getOtherChildren(children)
|
|
47
|
+
|
|
48
|
+
const headingId = isDefined(heading)
|
|
49
|
+
? toKebabCase(heading)
|
|
50
|
+
: undefined
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<CardFrame
|
|
54
|
+
aria-labelledby={headingId}
|
|
55
|
+
{...htmlProps}
|
|
56
|
+
>
|
|
57
|
+
<If is={alertBanners}>{alertBanners}</If>
|
|
58
|
+
<If is={heading}>
|
|
59
|
+
<CardHeading>
|
|
60
|
+
<CardHeadingText id={headingId}>{heading}</CardHeadingText>
|
|
61
|
+
<If is={headingAction}>{headingAction}</If>
|
|
62
|
+
</CardHeading>
|
|
63
|
+
</If>
|
|
64
|
+
{isEmpty(sections) ? (
|
|
65
|
+
<CardSectionSlot>{otherChildren}</CardSectionSlot>
|
|
66
|
+
) : (
|
|
67
|
+
sections
|
|
68
|
+
)}
|
|
69
|
+
<If is={controls}>{controls}</If>
|
|
70
|
+
</CardFrame>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** export the slots and some sub-components */
|
|
75
|
+
Card.Section = CardSectionSlot
|
|
76
|
+
Card.Controls = CardControlsSlot
|
|
77
|
+
Card.HeadingAction = CardHeadingActionSlot
|
|
78
|
+
Card.AlertBanner = CardAlertBannerSlot
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
import { Slot } from '@helpers'
|
|
3
|
+
import { Margin } from '@foundations'
|
|
4
|
+
import { AlertBanner, AlertBannerProps } from 'components/alert-banner'
|
|
5
|
+
|
|
6
|
+
const CardAlertBanner = styled(AlertBanner)`
|
|
7
|
+
margin: ${Margin.l} ${Margin.l} ${Margin.none} ${Margin.l};
|
|
8
|
+
`
|
|
9
|
+
|
|
10
|
+
export class CardAlertBannerSlot extends Slot<AlertBannerProps> {
|
|
11
|
+
override render () {
|
|
12
|
+
return (
|
|
13
|
+
<CardAlertBanner {...this.props}>{this.props.children}</CardAlertBanner>
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
import { Slot, PropsWithChildren } from '@helpers'
|
|
3
|
+
import { Padding } from '@foundations'
|
|
4
|
+
import { Flex } from 'components/layout'
|
|
5
|
+
|
|
6
|
+
const ControlsFrame = styled(Flex)`
|
|
7
|
+
justify-content: end;
|
|
8
|
+
padding: ${Padding.none} ${Padding.l} ${Padding.l} ${Padding.l};
|
|
9
|
+
`
|
|
10
|
+
|
|
11
|
+
export class CardControlsSlot extends Slot<PropsWithChildren> {
|
|
12
|
+
override render () {
|
|
13
|
+
return (
|
|
14
|
+
<ControlsFrame>
|
|
15
|
+
{this.props.children}
|
|
16
|
+
</ControlsFrame>
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
}
|