@edvisor/product-language 0.1.1 → 0.2.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 +139 -0
- package/.storybook/main.js +57 -0
- package/.storybook/manager.js +7 -0
- package/.storybook/preview-head.html +1 -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 +22 -10
- package/project.json +85 -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 +3 -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.stories.tsx +16 -0
- package/src/lib/components/badge/badge.test.tsx +29 -0
- package/src/lib/components/badge/badge.tsx +31 -0
- package/src/lib/components/badge/index.ts +1 -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 +163 -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 +240 -0
- package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
- package/src/lib/components/checkbox/checkbox.tsx +124 -0
- package/src/lib/components/checkbox/components/components.tsx +59 -0
- package/src/lib/components/checkbox/index.tsx +1 -0
- package/src/lib/components/checkbox/stories/checkbox.stories.mdx +54 -0
- package/src/lib/components/checkbox/stories/components.tsx +36 -0
- package/src/lib/components/checkbox/stories/index.tsx +1 -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 +50 -0
- package/src/lib/components/index.ts +14 -0
- package/src/lib/components/input-field/components/index.ts +2 -0
- package/src/lib/components/input-field/components/labeled-input.tsx +61 -0
- package/src/lib/components/input-field/components/stepper.tsx +59 -0
- package/src/lib/components/input-field/index.ts +6 -0
- package/src/lib/components/input-field/input-field.test.tsx +108 -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 +334 -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 +51 -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 +55 -0
- package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
- package/src/lib/components/molecules/button/button-flags.tsx +235 -0
- package/src/lib/components/molecules/button/button.test.tsx +77 -0
- package/src/lib/components/molecules/button/button.tsx +231 -0
- package/src/lib/components/molecules/button/index.tsx +1 -0
- package/src/lib/components/molecules/button/stories/button.stories.mdx +104 -0
- package/src/lib/components/molecules/button/stories/components.tsx +86 -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 +50 -0
- package/src/lib/components/molecules/input-checkbox/stories/components.tsx +36 -0
- package/src/lib/components/molecules/input-checkbox/stories/index.tsx +1 -0
- package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +51 -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 +53 -0
- package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +126 -0
- package/src/lib/components/organisms/multi-choice-list/stories/index.tsx +1 -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 +67 -0
- package/src/lib/components/spinner/stories/components.tsx +8 -0
- package/src/lib/components/spinner/stories/spinner.stories.mdx +42 -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 +40 -0
- package/src/lib/components/typography/index.ts +1 -0
- package/src/lib/components/typography/storybook/components.tsx +256 -0
- package/src/lib/components/typography/storybook/typography.stories.mdx +88 -0
- package/src/lib/components/typography/typography.test.tsx +93 -0
- package/src/lib/components/typography/typography.tsx +57 -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 +94 -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 +159 -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/index.tsx +1 -0
- package/src/lib/foundations/typography/text-aspect-flags.ts +54 -0
- package/src/lib/foundations/typography/typography.tsx +97 -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/{lib/helpers/numbers.d.ts → src/lib/helpers/numbers.ts} +53 -41
- package/src/lib/helpers/safe-navigation.ts +34 -0
- package/src/lib/helpers/slots.tsx +76 -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/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,94 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax */
|
|
2
|
+
import { Hex } from '@helpers'
|
|
3
|
+
|
|
4
|
+
export type ColorPalette = {
|
|
5
|
+
[key in string]: Hex
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const WHITE = '#FFFFFF' as const
|
|
9
|
+
export const BLACK = '#000000' as const
|
|
10
|
+
|
|
11
|
+
export const GRAY = {
|
|
12
|
+
50: '#F9FAFB',
|
|
13
|
+
100: '#F3F4F6',
|
|
14
|
+
200: '#E5E7EB',
|
|
15
|
+
300: '#D1D5DB',
|
|
16
|
+
400: '#9CA3AF',
|
|
17
|
+
500: '#6B7280',
|
|
18
|
+
600: '#46505D',
|
|
19
|
+
700: '#374151',
|
|
20
|
+
800: '#1F2937',
|
|
21
|
+
900: '#111827',
|
|
22
|
+
} as const
|
|
23
|
+
|
|
24
|
+
export const BLUE = {
|
|
25
|
+
50: '#F0F6FF',
|
|
26
|
+
100: '#DBEAFE',
|
|
27
|
+
200: '#BFDBFE',
|
|
28
|
+
300: '#93C5FD',
|
|
29
|
+
400: '#60A5FA',
|
|
30
|
+
500: '#3B82F6',
|
|
31
|
+
600: '#2563EB',
|
|
32
|
+
700: '#1D4ED8',
|
|
33
|
+
800: '#1E40AF',
|
|
34
|
+
900: '#1E3A8A',
|
|
35
|
+
} as const
|
|
36
|
+
|
|
37
|
+
export const GREEN = {
|
|
38
|
+
50: '#F1FEF8',
|
|
39
|
+
100: '#D1FAE5',
|
|
40
|
+
200: '#A7F3D0',
|
|
41
|
+
300: '#6EE7B7',
|
|
42
|
+
400: '#34D399',
|
|
43
|
+
500: '#10B981',
|
|
44
|
+
600: '#059669',
|
|
45
|
+
700: '#047857',
|
|
46
|
+
800: '#065F46',
|
|
47
|
+
900: '#064E3B',
|
|
48
|
+
} as const
|
|
49
|
+
|
|
50
|
+
export const ORANGE = {
|
|
51
|
+
50: '#FFFAF5',
|
|
52
|
+
100: '#FFEDD5',
|
|
53
|
+
200: '#FED7AA',
|
|
54
|
+
300: '#FDBA74',
|
|
55
|
+
400: '#FB923C',
|
|
56
|
+
500: '#F97316',
|
|
57
|
+
600: '#EA580C',
|
|
58
|
+
700: '#C2410C',
|
|
59
|
+
800: '#9A3412',
|
|
60
|
+
900: '#7C2D12',
|
|
61
|
+
} as const
|
|
62
|
+
|
|
63
|
+
export const RED = {
|
|
64
|
+
50: '#FEF6F6',
|
|
65
|
+
100: '#FEE2E2',
|
|
66
|
+
200: '#FECACA',
|
|
67
|
+
300: '#FCA5A5', // @TODO we should update the current structure with the figma updates
|
|
68
|
+
3300: '#FEF6F6',
|
|
69
|
+
400: '#F87171',
|
|
70
|
+
500: '#EF4444',
|
|
71
|
+
600: '#DC2626',
|
|
72
|
+
700: '#B91C1C',
|
|
73
|
+
800: '#991B1B',
|
|
74
|
+
900: '#7F1D1D',
|
|
75
|
+
} as const
|
|
76
|
+
|
|
77
|
+
export const SHADES = {
|
|
78
|
+
White: WHITE,
|
|
79
|
+
Black: BLACK,
|
|
80
|
+
} as const
|
|
81
|
+
|
|
82
|
+
export const BRAND = {
|
|
83
|
+
Brand: '#0792D4',
|
|
84
|
+
} as const
|
|
85
|
+
|
|
86
|
+
type ValuesOf<T> = T[keyof T]
|
|
87
|
+
|
|
88
|
+
export type COLOR = ValuesOf<typeof BRAND>
|
|
89
|
+
| ValuesOf<typeof BLUE>
|
|
90
|
+
| ValuesOf<typeof SHADES>
|
|
91
|
+
| ValuesOf<typeof RED>
|
|
92
|
+
| ValuesOf<typeof ORANGE>
|
|
93
|
+
| ValuesOf<typeof GREEN>
|
|
94
|
+
| ValuesOf<typeof GRAY>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './base-palette'
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Canvas, Meta, Story } from '@storybook/addon-docs';
|
|
2
|
+
import { Card, AlertBanner } from '@components'
|
|
3
|
+
import { Background, Surface, Borders } from './color-guidelines'
|
|
4
|
+
import {
|
|
5
|
+
BackgroundStory,
|
|
6
|
+
SurfaceStory,
|
|
7
|
+
BordersStory,
|
|
8
|
+
} from './color-guidelines.stories.tsx'
|
|
9
|
+
|
|
10
|
+
<Meta title="Foundations/ColorSystem"/>
|
|
11
|
+
|
|
12
|
+
# Color Guidelines
|
|
13
|
+
|
|
14
|
+
The Color Guidelines give names and functions to the colors defined in out base palette.
|
|
15
|
+
|
|
16
|
+
All colors used in our app are namespaced according to their context in which they should be used (eg the background color is namespaces by "Background") and named after their role within the namespace (eg `Background.Default`, the default background color).
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { Background, Critical } from '@foundations'
|
|
20
|
+
|
|
21
|
+
// the default background color
|
|
22
|
+
const color = Background.Default
|
|
23
|
+
|
|
24
|
+
// the color of a critical surface
|
|
25
|
+
const color = Surface.Critical
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Examples
|
|
29
|
+
|
|
30
|
+
What follow are guidelines for the usage of each color.
|
|
31
|
+
|
|
32
|
+
<BackgroundStory />
|
|
33
|
+
|
|
34
|
+
The background color is used to define negative space in our app. Note the grey background surrounding the Card below.
|
|
35
|
+
|
|
36
|
+
<Canvas>
|
|
37
|
+
<div style={{ padding: '24px', background: Background.Default }}>
|
|
38
|
+
<Card heading='Heading'>
|
|
39
|
+
Body
|
|
40
|
+
</Card>
|
|
41
|
+
</div>
|
|
42
|
+
</Canvas>
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
<SurfaceStory />
|
|
47
|
+
|
|
48
|
+
Surfaces make up the positive space in our app. We call them surfaces because you can put things on them, typically text and other UI elements. The Card you saw in the example above used `Surface.Default`. The Card below also uses `Surface.Default` for its background, but the alert-banner inside the card is using `Surface.Info`.
|
|
49
|
+
|
|
50
|
+
<Canvas>
|
|
51
|
+
<div style={{ padding: '24px', background: Background.Default }}>
|
|
52
|
+
<Card heading='Heading'>
|
|
53
|
+
<Card.AlertBanner>Some helpful info</Card.AlertBanner>
|
|
54
|
+
Body
|
|
55
|
+
</Card>
|
|
56
|
+
</div>
|
|
57
|
+
</Canvas>
|
|
58
|
+
|
|
59
|
+
Colorful surfaces such as `Surface.Critical` are used to draw the eye to important information:
|
|
60
|
+
|
|
61
|
+
<Canvas>
|
|
62
|
+
<AlertBanner>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</AlertBanner>
|
|
63
|
+
<AlertBanner info>There will be a raffle later today</AlertBanner>
|
|
64
|
+
<AlertBanner success>You won! You won the raffle!</AlertBanner>
|
|
65
|
+
<AlertBanner warning>Please put down your weapon.</AlertBanner>
|
|
66
|
+
<AlertBanner critical>Please put down your weapon. You have twenty seconds to comply.</AlertBanner>
|
|
67
|
+
</Canvas>
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
<BordersStory />
|
|
72
|
+
|
|
73
|
+
Borders surround an element, be it a Card or a Button. The color of a border is typically chosen to complement the surface color, and is named the same as the surface it complements.
|
|
74
|
+
|
|
75
|
+
<Canvas>
|
|
76
|
+
<div style={{ padding: '24px', background: Background.Default }}>
|
|
77
|
+
<div style={{ background: Surface.Critical.Subdued, border: `1px solid ${Borders.Critical.Subdued}`, borderRadius: '6px', padding: '24px' }}>
|
|
78
|
+
Oh Oh
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</Canvas>
|
|
82
|
+
|
|
83
|
+
# Roadmap
|
|
84
|
+
- Add new subdoad colors
|
|
85
|
+
- Add boarder styles colors
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
import { Flex, Heading2 } from '@components'
|
|
3
|
+
import { FC, Hex, isDefined, Nothing, isEmpty, isNil } from '@helpers'
|
|
4
|
+
import { StoryComponent, talesOf } from '@stories'
|
|
5
|
+
import { Margin } from 'foundations/spacing/spacing-guidelines'
|
|
6
|
+
|
|
7
|
+
import { BLACK, BLUE, BRAND, ColorPalette, GRAY, GREEN, ORANGE, RED, SHADES, WHITE } from '../base-palette'
|
|
8
|
+
import { ColorSquare } from '../components'
|
|
9
|
+
import { Background, Surface, Borders, Focused, Text, Icons, Interactive, Actions } from './color-guidelines'
|
|
10
|
+
|
|
11
|
+
export const BackgroundStory: FC = () => {
|
|
12
|
+
return (
|
|
13
|
+
<SemanticCategory
|
|
14
|
+
name={'Background'}
|
|
15
|
+
subCategories={[
|
|
16
|
+
{ name: '', palette: Background },
|
|
17
|
+
]}
|
|
18
|
+
/>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const SurfaceStory: FC = () => {
|
|
23
|
+
return (
|
|
24
|
+
<SemanticCategory
|
|
25
|
+
name={'Surface'}
|
|
26
|
+
subCategories={[
|
|
27
|
+
{ name: '', palette: Surface.Default },
|
|
28
|
+
{ name: 'Selected', palette: Surface.Selected },
|
|
29
|
+
{ name: 'Critical', palette: Surface.Critical },
|
|
30
|
+
{ name: 'Warning', palette: Surface.Warning },
|
|
31
|
+
{ name: 'Success', palette: Surface.Success },
|
|
32
|
+
{ name: 'Highlight', palette: Surface.Highlight },
|
|
33
|
+
{ name: 'Neutral', palette: Surface.Neutral },
|
|
34
|
+
]}
|
|
35
|
+
/>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const BordersStory: FC = () => {
|
|
40
|
+
return (
|
|
41
|
+
<SemanticCategory
|
|
42
|
+
name={'Borders'}
|
|
43
|
+
subCategories={[
|
|
44
|
+
{ name: '', border: Surface.Default.Default, palette: Borders.Default },
|
|
45
|
+
{ name: 'Critical', border: Surface.Critical.Subdued, palette: Borders.Critical },
|
|
46
|
+
{ name: 'Warning', border: Surface.Warning.Subdued, palette: Borders.Warning },
|
|
47
|
+
{ name: 'Success', border: Surface.Success.Subdued, palette: Borders.Success },
|
|
48
|
+
{ name: 'Highlight', border: Surface.Highlight.Subdued, palette: Borders.Highlight },
|
|
49
|
+
]}
|
|
50
|
+
/>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const FocusedStory: FC = () => {
|
|
55
|
+
return (
|
|
56
|
+
<SemanticCategory
|
|
57
|
+
name={'Focused'}
|
|
58
|
+
subCategories={[
|
|
59
|
+
{ name: '', palette: Focused, border: Background.Default },
|
|
60
|
+
]}
|
|
61
|
+
/>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const TextStory: FC = () => {
|
|
66
|
+
const { Default, Subdued, Light, Critical, Success, OnPrimary, OnCritical } =
|
|
67
|
+
Text
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<SemanticCategory
|
|
71
|
+
name={'Text'}
|
|
72
|
+
subCategories={[
|
|
73
|
+
{ name: '', palette: { Default, Subdued, Light } },
|
|
74
|
+
{ name: '', palette: { Critical, Success } },
|
|
75
|
+
{ name: '', palette: { OnPrimary, OnCritical } },
|
|
76
|
+
]}
|
|
77
|
+
/>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const IconsStory: FC = () => {
|
|
82
|
+
const { Default, Subdued, Hover, Pressed, Disabled, Critical, Success, Warning, Highlight, OnPrimary, OnCritical } =
|
|
83
|
+
Icons
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<SemanticCategory
|
|
87
|
+
name={'Icons'}
|
|
88
|
+
subCategories={[
|
|
89
|
+
{ name: '', palette: { Default, Subdued, Hover, Pressed, Disabled } },
|
|
90
|
+
{ name: '', palette: { Critical, Warning, Success, Highlight } },
|
|
91
|
+
{ name: '', palette: { OnPrimary, OnCritical } },
|
|
92
|
+
]}
|
|
93
|
+
/>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const InteractionsStory: FC = () => {
|
|
98
|
+
return (
|
|
99
|
+
<SemanticCategory
|
|
100
|
+
name={'Interactions'}
|
|
101
|
+
subCategories={[
|
|
102
|
+
{ name: '', palette: Interactive.Default },
|
|
103
|
+
{ name: 'Subtle', palette: Interactive.Subtle },
|
|
104
|
+
]}
|
|
105
|
+
/>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const ActionsStory: FC = () => {
|
|
110
|
+
return (
|
|
111
|
+
<SemanticCategory
|
|
112
|
+
name={'Actions'}
|
|
113
|
+
subCategories={[
|
|
114
|
+
{ name: 'Primary', palette: Actions.Primary },
|
|
115
|
+
{ name: 'Secondary', palette: Actions.Secondary },
|
|
116
|
+
{ name: 'Critical', palette: Actions.Critical },
|
|
117
|
+
{ name: 'Secondary Critical', palette: Actions.SecondaryCritical },
|
|
118
|
+
]}
|
|
119
|
+
/>
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const Story: StoryComponent = () => {
|
|
124
|
+
return (
|
|
125
|
+
<>
|
|
126
|
+
<BackgroundStory />
|
|
127
|
+
<SurfaceStory />
|
|
128
|
+
<BordersStory />
|
|
129
|
+
<FocusedStory />
|
|
130
|
+
<TextStory />
|
|
131
|
+
<IconsStory />
|
|
132
|
+
<InteractionsStory />
|
|
133
|
+
<ActionsStory />
|
|
134
|
+
</>
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const SemanticCategoryHeading = styled(Heading2)`
|
|
139
|
+
margin-bottom: ${Margin.xl};
|
|
140
|
+
`
|
|
141
|
+
|
|
142
|
+
const COLOR_SYSTEM = { GRAY, BLUE, GREEN, ORANGE, RED, SHADES, BRAND } as const
|
|
143
|
+
|
|
144
|
+
function getColorId (color: Hex) {
|
|
145
|
+
if (color === WHITE) {
|
|
146
|
+
return 'white'
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (color === BLACK) {
|
|
150
|
+
return 'black'
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const colorHex = color.slice(0, 7)
|
|
154
|
+
const fadeHex = color.slice(7, 9)
|
|
155
|
+
|
|
156
|
+
const colorId = Object.keys(COLOR_SYSTEM).reduce((acc, COLOR_NAME) => {
|
|
157
|
+
const COLOR = COLOR_SYSTEM[COLOR_NAME as keyof typeof COLOR_SYSTEM]
|
|
158
|
+
const id = Object.keys(COLOR).find((_id) => COLOR[_id as keyof typeof COLOR] === colorHex)
|
|
159
|
+
|
|
160
|
+
if (isDefined(id)) {
|
|
161
|
+
return `${COLOR_NAME.toLowerCase()}-${id}`
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return acc
|
|
165
|
+
}, undefined as string | undefined)
|
|
166
|
+
|
|
167
|
+
if (isNil(colorId)) {
|
|
168
|
+
return color
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (isEmpty(fadeHex)) {
|
|
172
|
+
return colorId
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return `${colorId} - ${toPercentage(fadeHex)}`
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// convert a hex string like 1E to a percentage
|
|
179
|
+
// by dividing out of 255
|
|
180
|
+
function toPercentage (hex: string) {
|
|
181
|
+
const dec = parseInt(hex, 16)
|
|
182
|
+
|
|
183
|
+
return dec === 0 ? '' : `${Math.round((dec / 255) * 100)}%`
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
interface ISemanticCategoryProps {
|
|
187
|
+
name: string
|
|
188
|
+
subCategories: {
|
|
189
|
+
name: string,
|
|
190
|
+
palette: ColorPalette,
|
|
191
|
+
border?: Hex,
|
|
192
|
+
}[]
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** a semantic group is a kind of categorization based on meaning */
|
|
196
|
+
const SemanticCategory: FC<ISemanticCategoryProps> = (props) => {
|
|
197
|
+
return (
|
|
198
|
+
<>
|
|
199
|
+
<SemanticCategoryHeading>{props.name}</SemanticCategoryHeading>
|
|
200
|
+
<Flex>
|
|
201
|
+
{props.subCategories.map((subCategory, index) => {
|
|
202
|
+
|
|
203
|
+
return (
|
|
204
|
+
<div key={index}>
|
|
205
|
+
{Object.keys(subCategory.palette).map((name) => {
|
|
206
|
+
if (name === 'border') {
|
|
207
|
+
return <Nothing />
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const hex = subCategory.palette[name]
|
|
211
|
+
const colorId = getColorId(hex)
|
|
212
|
+
|
|
213
|
+
return (
|
|
214
|
+
<ColorSquare
|
|
215
|
+
key={`${subCategory.name} ${name}`}
|
|
216
|
+
colorId={colorId}
|
|
217
|
+
name={`${subCategory.name} ${name}`}
|
|
218
|
+
hex={hex}
|
|
219
|
+
border={subCategory.border}
|
|
220
|
+
/>
|
|
221
|
+
)
|
|
222
|
+
})}
|
|
223
|
+
</div>
|
|
224
|
+
)
|
|
225
|
+
})}
|
|
226
|
+
</Flex>
|
|
227
|
+
</>
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
talesOf(__filename, module, Story)
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { clamp, concatHex, Hex, toHex } from '@helpers'
|
|
2
|
+
import { GRAY, RED, ORANGE, GREEN, BLUE, WHITE } from '../base-palette'
|
|
3
|
+
|
|
4
|
+
export const Background = {
|
|
5
|
+
Default: GRAY[100],
|
|
6
|
+
} as const
|
|
7
|
+
|
|
8
|
+
export const Surface = {
|
|
9
|
+
Default: {
|
|
10
|
+
Default: WHITE,
|
|
11
|
+
Subdued: GRAY[50],
|
|
12
|
+
Hover: GRAY[100],
|
|
13
|
+
Pressed: GRAY[200],
|
|
14
|
+
Depressed: GRAY[200],
|
|
15
|
+
Inverse: GRAY[800],
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
Selected: {
|
|
19
|
+
Default: BLUE[50],
|
|
20
|
+
Hover: BLUE[100],
|
|
21
|
+
Pressed: BLUE[200],
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
Critical: {
|
|
25
|
+
Default: RED[200],
|
|
26
|
+
Subdued: RED[50],
|
|
27
|
+
Hover: RED[50],
|
|
28
|
+
Pressed: RED[100],
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
Warning: {
|
|
32
|
+
Default: ORANGE[200],
|
|
33
|
+
Subdued: ORANGE[50],
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
Success: {
|
|
37
|
+
Default: GREEN[200],
|
|
38
|
+
Subdued: GREEN[50],
|
|
39
|
+
Depressed: GREEN[500],
|
|
40
|
+
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
Highlight: {
|
|
44
|
+
Default: BLUE[200],
|
|
45
|
+
Subdued: BLUE[50],
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
Neutral: {
|
|
49
|
+
Default: GRAY[200],
|
|
50
|
+
Subdued: GRAY[100],
|
|
51
|
+
Hover: GRAY[300],
|
|
52
|
+
Pressed: GRAY[400],
|
|
53
|
+
},
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const Borders = {
|
|
57
|
+
Default: {
|
|
58
|
+
Default: GRAY[300],
|
|
59
|
+
Subdued: GRAY[200],
|
|
60
|
+
Light: WHITE,
|
|
61
|
+
Dark: GRAY[400],
|
|
62
|
+
},
|
|
63
|
+
Critical: {
|
|
64
|
+
Default: RED[600],
|
|
65
|
+
Subdued: RED[300],
|
|
66
|
+
},
|
|
67
|
+
Warning: {
|
|
68
|
+
Subdued: ORANGE[300],
|
|
69
|
+
},
|
|
70
|
+
Success: {
|
|
71
|
+
Subdued: GREEN[300],
|
|
72
|
+
},
|
|
73
|
+
Highlight: {
|
|
74
|
+
Default: BLUE[600],
|
|
75
|
+
Subdued: BLUE[300],
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const Focused = {
|
|
80
|
+
Default: BLUE[400],
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const Text = {
|
|
84
|
+
Default: GRAY[800],
|
|
85
|
+
Subdued: GRAY[500],
|
|
86
|
+
Light: GRAY[400],
|
|
87
|
+
Critical: RED[600],
|
|
88
|
+
Success: GREEN[600],
|
|
89
|
+
OnPrimary: WHITE,
|
|
90
|
+
OnCritical: WHITE,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export const Icons = {
|
|
94
|
+
Default: GRAY[500],
|
|
95
|
+
Subdued: GRAY[400],
|
|
96
|
+
Hover: GRAY[800],
|
|
97
|
+
Pressed: GRAY[600],
|
|
98
|
+
Disabled: GRAY[300],
|
|
99
|
+
Critical: RED[600],
|
|
100
|
+
Warning: ORANGE[500],
|
|
101
|
+
Success: GREEN[600],
|
|
102
|
+
Highlight: BLUE[600],
|
|
103
|
+
OnPrimary: WHITE,
|
|
104
|
+
OnCritical: WHITE,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const Interactive = {
|
|
108
|
+
Default: {
|
|
109
|
+
Default: BLUE[600],
|
|
110
|
+
Hover: BLUE[800],
|
|
111
|
+
Pressed: BLUE[800],
|
|
112
|
+
Disabled: GRAY[400],
|
|
113
|
+
},
|
|
114
|
+
Subtle: {
|
|
115
|
+
Default: GRAY[800],
|
|
116
|
+
Hover: GRAY[800],
|
|
117
|
+
Pressed: GRAY[800],
|
|
118
|
+
Disabled: GRAY[400],
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function addOpacity(hex: Hex, opacity: number): Hex {
|
|
123
|
+
const opacityHex = toHex(clamp(0, Math.floor(0xFF * opacity), 0xFF), 2)
|
|
124
|
+
|
|
125
|
+
return concatHex(hex, opacityHex)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** in order for disabled to appear light gray on any background
|
|
129
|
+
* we have to give a darker gray some opacity */
|
|
130
|
+
const DisabledGray = addOpacity(GRAY[800], 0.06)
|
|
131
|
+
const PressedGray = addOpacity(GRAY[800], 0.12)
|
|
132
|
+
|
|
133
|
+
export const Actions = {
|
|
134
|
+
Primary: {
|
|
135
|
+
Default: BLUE[600],
|
|
136
|
+
Hover: BLUE[700],
|
|
137
|
+
Pressed: BLUE[800],
|
|
138
|
+
Disabled: DisabledGray,
|
|
139
|
+
},
|
|
140
|
+
Secondary: {
|
|
141
|
+
Default: WHITE,
|
|
142
|
+
Hover: DisabledGray,
|
|
143
|
+
Pressed: PressedGray,
|
|
144
|
+
Depressed: GRAY[500],
|
|
145
|
+
Disabled: DisabledGray,
|
|
146
|
+
},
|
|
147
|
+
Critical: {
|
|
148
|
+
Default: RED[600],
|
|
149
|
+
Hover: RED[500],
|
|
150
|
+
Pressed: RED[700],
|
|
151
|
+
Disabled: DisabledGray,
|
|
152
|
+
},
|
|
153
|
+
SecondaryCritical: {
|
|
154
|
+
Default: WHITE,
|
|
155
|
+
Hover: RED[500],
|
|
156
|
+
Pressed: RED[700],
|
|
157
|
+
Disabled: DisabledGray,
|
|
158
|
+
},
|
|
159
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './color-guidelines'
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
|
|
3
|
+
import { FC, Hex, isDefined } from '@helpers'
|
|
4
|
+
import { Flex, SpaceBetween } from '@components'
|
|
5
|
+
|
|
6
|
+
import { GRAY, WHITE } from '../base-palette'
|
|
7
|
+
import { Caption, Label1 } from 'components/typography'
|
|
8
|
+
import { Margin } from '../../spacing'
|
|
9
|
+
|
|
10
|
+
function isPale (color: string) {
|
|
11
|
+
return color === WHITE || color === GRAY[50] || color === GRAY[100]
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** a ColorSample is a rectangular area with a uniform color */
|
|
15
|
+
const ColorSample = styled.div<{ color: string; border?: Hex }>`
|
|
16
|
+
${({ border, color }) =>
|
|
17
|
+
isDefined(border) ? '' : `background-color: ${color};` }
|
|
18
|
+
${({ border, color }) =>
|
|
19
|
+
isDefined(border) ? `border: 1px solid ${color};` : ''}
|
|
20
|
+
${({ border, color }) =>
|
|
21
|
+
!isDefined(border) && isPale(color) ? `border: 1px solid ${GRAY[200]};` : ''}
|
|
22
|
+
|
|
23
|
+
height: 40px;
|
|
24
|
+
border-radius: 4px;
|
|
25
|
+
`
|
|
26
|
+
|
|
27
|
+
const RectangularColorSample = styled(ColorSample)`
|
|
28
|
+
max-width: 122px;
|
|
29
|
+
margin-bottom: ${Margin.xxs};
|
|
30
|
+
`
|
|
31
|
+
|
|
32
|
+
const SquareColorSample = styled(ColorSample)`
|
|
33
|
+
width: 40px;
|
|
34
|
+
flex-shrink: 0;
|
|
35
|
+
margin-right: ${Margin.s};
|
|
36
|
+
border-radius: 6px;
|
|
37
|
+
|
|
38
|
+
${({ border, color }) =>
|
|
39
|
+
isDefined(border) ? `background-color: ${border};` : `background-color: ${color};` }
|
|
40
|
+
${({ border, color }) =>
|
|
41
|
+
isDefined(border) ? `border: 1px solid ${color};` : `border: 2px solid ${WHITE};`}
|
|
42
|
+
`
|
|
43
|
+
|
|
44
|
+
interface IColorRectangleProps {
|
|
45
|
+
name: string
|
|
46
|
+
hex: Hex
|
|
47
|
+
border?: Hex
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const ColorRectangle: FC<IColorRectangleProps> = (props) => {
|
|
51
|
+
return (
|
|
52
|
+
<div>
|
|
53
|
+
<RectangularColorSample color={props.hex} border={props.border} />
|
|
54
|
+
<SpaceBetween>
|
|
55
|
+
<Caption>{props.name}</Caption>
|
|
56
|
+
<Caption subdued>{props.hex}</Caption>
|
|
57
|
+
</SpaceBetween>
|
|
58
|
+
</div>
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const ColorFrame = styled(Flex)`
|
|
63
|
+
margin-bottom: ${Margin.l};
|
|
64
|
+
margin-right: ${Margin.xxl};
|
|
65
|
+
`
|
|
66
|
+
|
|
67
|
+
const Details = styled(Flex)`
|
|
68
|
+
justify-content: center;
|
|
69
|
+
`
|
|
70
|
+
|
|
71
|
+
const ColorName = styled(Label1)`
|
|
72
|
+
white-space: nowrap;
|
|
73
|
+
margin-bottom: ${Margin.xxxs};
|
|
74
|
+
`
|
|
75
|
+
|
|
76
|
+
const ColorId = styled(Caption)`
|
|
77
|
+
white-space: nowrap;
|
|
78
|
+
`
|
|
79
|
+
|
|
80
|
+
interface IColorSquareProps {
|
|
81
|
+
name: string,
|
|
82
|
+
colorId: string
|
|
83
|
+
hex: Hex,
|
|
84
|
+
/** if true the color will only show in the border
|
|
85
|
+
* rather than as a fill color */
|
|
86
|
+
border?: Hex,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const ColorSquare: FC<IColorSquareProps> = (props) => {
|
|
90
|
+
return (
|
|
91
|
+
<ColorFrame>
|
|
92
|
+
<SquareColorSample color={props.hex} border={props.border} />
|
|
93
|
+
<Details column>
|
|
94
|
+
<ColorName emphasis>{props.name}</ColorName>
|
|
95
|
+
<ColorId subdued>{props.colorId}</ColorId>
|
|
96
|
+
</Details>
|
|
97
|
+
</ColorFrame>
|
|
98
|
+
)
|
|
99
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './color-sample'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './color-guidelines'
|