@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.
Files changed (230) hide show
  1. package/.babelrc +12 -0
  2. package/.eslintrc.json +139 -0
  3. package/.storybook/main.js +57 -0
  4. package/.storybook/manager.js +7 -0
  5. package/.storybook/preview-head.html +1 -0
  6. package/.storybook/preview.js +15 -0
  7. package/.storybook/tsconfig.json +30 -0
  8. package/jest.config.ts +15 -0
  9. package/jest.setup.ts +2 -0
  10. package/package.json +22 -10
  11. package/project.json +85 -0
  12. package/src/assets/svg/example_icon.svg +3 -0
  13. package/src/assets/svg/example_icon_white.svg +3 -0
  14. package/src/assets/svg/spinner.svg +3 -0
  15. package/src/assets/svg/spinner_white.svg +3 -0
  16. package/src/helpers/index.ts +3 -0
  17. package/src/helpers/talesOf.tsx +42 -0
  18. package/src/index.ts +2 -0
  19. package/src/lib/components/README.md +49 -0
  20. package/src/lib/components/alert-banner/alert-banner.tsx +34 -0
  21. package/src/lib/components/alert-banner/alert-level-flags.ts +77 -0
  22. package/src/lib/components/alert-banner/index.ts +1 -0
  23. package/src/lib/components/badge/badge-type-flags.ts +72 -0
  24. package/src/lib/components/badge/badge.stories.tsx +16 -0
  25. package/src/lib/components/badge/badge.test.tsx +29 -0
  26. package/src/lib/components/badge/badge.tsx +31 -0
  27. package/src/lib/components/badge/index.ts +1 -0
  28. package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx} +17 -7
  29. package/src/lib/components/card/atoms/index.ts +1 -0
  30. package/src/lib/components/card/card.test.tsx +163 -0
  31. package/src/lib/components/card/card.tsx +78 -0
  32. package/src/lib/components/card/components/card-alert-banner-slot.tsx +16 -0
  33. package/src/lib/components/card/components/card-controls-slot.tsx +19 -0
  34. package/src/lib/components/card/components/card-section-slot.tsx +51 -0
  35. package/src/lib/components/card/components/index.ts +3 -0
  36. package/src/lib/components/card/index.ts +2 -0
  37. package/src/lib/components/card/molecules/index.ts +1 -0
  38. package/src/lib/components/card/molecules/left-right-card.test.tsx +89 -0
  39. package/src/lib/components/card/molecules/left-right-card.tsx +63 -0
  40. package/src/lib/components/card/storybook/card.stories.mdx +100 -0
  41. package/src/lib/components/card/storybook/components.tsx +240 -0
  42. package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
  43. package/src/lib/components/checkbox/checkbox.tsx +124 -0
  44. package/src/lib/components/checkbox/components/components.tsx +59 -0
  45. package/src/lib/components/checkbox/index.tsx +1 -0
  46. package/src/lib/components/checkbox/stories/checkbox.stories.mdx +54 -0
  47. package/src/lib/components/checkbox/stories/components.tsx +36 -0
  48. package/src/lib/components/checkbox/stories/index.tsx +1 -0
  49. package/src/lib/components/divider/divider-type-flags.tsx +37 -0
  50. package/src/lib/components/divider/divider.test.tsx +34 -0
  51. package/src/lib/components/divider/divider.tsx +37 -0
  52. package/src/lib/components/divider/index.tsx +1 -0
  53. package/src/lib/components/divider/stories/components.tsx +13 -0
  54. package/src/lib/components/divider/stories/divider.stories.mdx +50 -0
  55. package/src/lib/components/index.ts +14 -0
  56. package/src/lib/components/input-field/components/index.ts +2 -0
  57. package/src/lib/components/input-field/components/labeled-input.tsx +61 -0
  58. package/src/lib/components/input-field/components/stepper.tsx +59 -0
  59. package/src/lib/components/input-field/index.ts +6 -0
  60. package/src/lib/components/input-field/input-field.test.tsx +108 -0
  61. package/src/lib/components/input-field/input-field.tsx +126 -0
  62. package/src/lib/components/input-field/input-number.tsx +41 -0
  63. package/src/lib/components/input-field/input-text.tsx +30 -0
  64. package/src/lib/components/input-field/storybook/components.tsx +334 -0
  65. package/src/lib/components/input-field/storybook/input-field.stories.mdx +113 -0
  66. package/src/lib/components/layout/flex.tsx +22 -0
  67. package/src/lib/components/layout/grid-layout.tsx +40 -0
  68. package/src/lib/components/layout/index.ts +3 -0
  69. package/src/lib/components/layout/left-right-layout.tsx +67 -0
  70. package/src/lib/components/link/index.ts +1 -0
  71. package/src/lib/components/link/link.test.tsx +29 -0
  72. package/src/lib/components/link/link.tsx +56 -0
  73. package/src/lib/components/link/storybook/link.stories.mdx +51 -0
  74. package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +55 -0
  75. package/src/lib/components/molecules/avatar/avatar.test.tsx +114 -0
  76. package/src/lib/components/molecules/avatar/avatar.tsx +80 -0
  77. package/src/lib/components/molecules/avatar/index.tsx +1 -0
  78. package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +55 -0
  79. package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
  80. package/src/lib/components/molecules/button/button-flags.tsx +235 -0
  81. package/src/lib/components/molecules/button/button.test.tsx +77 -0
  82. package/src/lib/components/molecules/button/button.tsx +231 -0
  83. package/src/lib/components/molecules/button/index.tsx +1 -0
  84. package/src/lib/components/molecules/button/stories/button.stories.mdx +104 -0
  85. package/src/lib/components/molecules/button/stories/components.tsx +86 -0
  86. package/src/lib/components/molecules/index.ts +3 -0
  87. package/src/lib/components/molecules/input-checkbox/index.tsx +1 -0
  88. package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +34 -0
  89. package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +50 -0
  90. package/src/lib/components/molecules/input-checkbox/stories/components.tsx +36 -0
  91. package/src/lib/components/molecules/input-checkbox/stories/index.tsx +1 -0
  92. package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +51 -0
  93. package/src/lib/components/organisms/index.ts +1 -0
  94. package/src/lib/components/organisms/multi-choice-list/index.tsx +1 -0
  95. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +33 -0
  96. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +53 -0
  97. package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +126 -0
  98. package/src/lib/components/organisms/multi-choice-list/stories/index.tsx +1 -0
  99. package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +99 -0
  100. package/src/lib/components/spinner/index.tsx +1 -0
  101. package/src/lib/components/spinner/spinner-size-flags.tsx +39 -0
  102. package/src/lib/components/spinner/spinner.test.tsx +31 -0
  103. package/src/lib/components/spinner/spinner.tsx +67 -0
  104. package/src/lib/components/spinner/stories/components.tsx +8 -0
  105. package/src/lib/components/spinner/stories/spinner.stories.mdx +42 -0
  106. package/src/lib/components/thumbnail/index.tsx +1 -0
  107. package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +34 -0
  108. package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +41 -0
  109. package/src/lib/components/thumbnail/thumbnail.test.tsx +51 -0
  110. package/src/lib/components/thumbnail/thumbnail.tsx +40 -0
  111. package/src/lib/components/typography/index.ts +1 -0
  112. package/src/lib/components/typography/storybook/components.tsx +256 -0
  113. package/src/lib/components/typography/storybook/typography.stories.mdx +88 -0
  114. package/src/lib/components/typography/typography.test.tsx +93 -0
  115. package/src/lib/components/typography/typography.tsx +57 -0
  116. package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +123 -0
  117. package/src/lib/foundations/color-system/base-palette/base-palette.ts +94 -0
  118. package/src/lib/foundations/color-system/base-palette/index.ts +1 -0
  119. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +85 -0
  120. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +231 -0
  121. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +159 -0
  122. package/src/lib/foundations/color-system/color-guidelines/index.ts +1 -0
  123. package/src/lib/foundations/color-system/components/color-sample.tsx +99 -0
  124. package/src/lib/foundations/color-system/components/index.ts +1 -0
  125. package/src/lib/foundations/color-system/index.ts +1 -0
  126. package/src/lib/foundations/index.ts +4 -0
  127. package/src/lib/foundations/shadows/components.tsx +59 -0
  128. package/src/lib/foundations/shadows/index.ts +1 -0
  129. package/src/lib/foundations/shadows/shadows.stories.mdx +71 -0
  130. package/src/lib/foundations/shadows/shadows.tsx +47 -0
  131. package/src/lib/foundations/spacing/index.ts +1 -0
  132. package/src/lib/foundations/spacing/spacing-guidelines.ts +24 -0
  133. package/src/lib/foundations/spacing/spacing.stories.mdx +51 -0
  134. package/src/lib/foundations/spacing/spacing.ts +18 -0
  135. package/src/lib/foundations/typography/constants.ts +25 -0
  136. package/src/lib/foundations/typography/index.tsx +1 -0
  137. package/src/lib/foundations/typography/text-aspect-flags.ts +54 -0
  138. package/src/lib/foundations/typography/typography.tsx +97 -0
  139. package/src/lib/helpers/generic-types.ts +44 -0
  140. package/src/lib/helpers/index.ts +6 -0
  141. package/src/lib/helpers/nothing.tsx +18 -0
  142. package/{lib/helpers/numbers.d.ts → src/lib/helpers/numbers.ts} +53 -41
  143. package/src/lib/helpers/safe-navigation.ts +34 -0
  144. package/src/lib/helpers/slots.tsx +76 -0
  145. package/src/lib/helpers/strings.test.ts +47 -0
  146. package/src/lib/helpers/strings.ts +16 -0
  147. package/tsconfig.json +35 -0
  148. package/tsconfig.lib.json +28 -0
  149. package/tsconfig.spec.json +21 -0
  150. package/index.d.ts +0 -2
  151. package/index.js +0 -6078
  152. package/lib/components/alert-banner/alert-banner.d.ts +0 -11
  153. package/lib/components/alert-banner/alert-level-flags.d.ts +0 -13
  154. package/lib/components/alert-banner/index.d.ts +0 -1
  155. package/lib/components/badge/badge-type-flags.d.ts +0 -18
  156. package/lib/components/badge/badge.d.ts +0 -5
  157. package/lib/components/badge/index.d.ts +0 -1
  158. package/lib/components/card/atoms/index.d.ts +0 -1
  159. package/lib/components/card/card.d.ts +0 -14
  160. package/lib/components/card/components/card-alert-banner-slot.d.ts +0 -5
  161. package/lib/components/card/components/card-controls-slot.d.ts +0 -4
  162. package/lib/components/card/components/card-section-slot.d.ts +0 -11
  163. package/lib/components/card/components/index.d.ts +0 -3
  164. package/lib/components/card/index.d.ts +0 -2
  165. package/lib/components/card/molecules/index.d.ts +0 -1
  166. package/lib/components/card/molecules/left-right-card.d.ts +0 -16
  167. package/lib/components/checkbox/checkbox.d.ts +0 -11
  168. package/lib/components/checkbox/components/components.d.ts +0 -12
  169. package/lib/components/checkbox/index.d.ts +0 -1
  170. package/lib/components/divider/divider-type-flags.d.ts +0 -9
  171. package/lib/components/divider/divider.d.ts +0 -7
  172. package/lib/components/divider/index.d.ts +0 -1
  173. package/lib/components/index.d.ts +0 -12
  174. package/lib/components/input-field/components/index.d.ts +0 -2
  175. package/lib/components/input-field/components/labeled-input.d.ts +0 -11
  176. package/lib/components/input-field/components/stepper.d.ts +0 -7
  177. package/lib/components/input-field/index.d.ts +0 -3
  178. package/lib/components/input-field/input-field.d.ts +0 -25
  179. package/lib/components/input-field/input-number.d.ts +0 -18
  180. package/lib/components/input-field/input-text.d.ts +0 -14
  181. package/lib/components/layout/flex.d.ts +0 -16
  182. package/lib/components/layout/grid-layout.d.ts +0 -11
  183. package/lib/components/layout/index.d.ts +0 -3
  184. package/lib/components/layout/left-right-layout.d.ts +0 -70
  185. package/lib/components/link/index.d.ts +0 -1
  186. package/lib/components/link/link.d.ts +0 -14
  187. package/lib/components/molecules/avatar/avatar-size-flags.d.ts +0 -12
  188. package/lib/components/molecules/avatar/avatar.d.ts +0 -12
  189. package/lib/components/molecules/avatar/index.d.ts +0 -1
  190. package/lib/components/molecules/button/button-flags.d.ts +0 -39
  191. package/lib/components/molecules/button/button.d.ts +0 -24
  192. package/lib/components/molecules/button/index.d.ts +0 -1
  193. package/lib/components/molecules/index.d.ts +0 -3
  194. package/lib/components/molecules/input-checkbox/index.d.ts +0 -1
  195. package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +0 -8
  196. package/lib/components/organisms/index.d.ts +0 -1
  197. package/lib/components/organisms/multi-choice-list/index.d.ts +0 -1
  198. package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +0 -11
  199. package/lib/components/spinner/index.d.ts +0 -1
  200. package/lib/components/spinner/spinner-size-flags.d.ts +0 -10
  201. package/lib/components/spinner/spinner.d.ts +0 -9
  202. package/lib/components/thumbnail/index.d.ts +0 -1
  203. package/lib/components/thumbnail/thumbnail-size-flags.d.ts +0 -10
  204. package/lib/components/thumbnail/thumbnail.d.ts +0 -9
  205. package/lib/components/typography/index.d.ts +0 -1
  206. package/lib/components/typography/typography.d.ts +0 -23
  207. package/lib/foundations/color-system/base-palette/base-palette.d.ts +0 -77
  208. package/lib/foundations/color-system/base-palette/index.d.ts +0 -1
  209. package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +0 -131
  210. package/lib/foundations/color-system/color-guidelines/index.d.ts +0 -1
  211. package/lib/foundations/color-system/components/color-sample.d.ts +0 -17
  212. package/lib/foundations/color-system/components/index.d.ts +0 -1
  213. package/lib/foundations/color-system/index.d.ts +0 -1
  214. package/lib/foundations/index.d.ts +0 -4
  215. package/lib/foundations/shadows/components.d.ts +0 -8
  216. package/lib/foundations/shadows/index.d.ts +0 -1
  217. package/lib/foundations/shadows/shadows.d.ts +0 -8
  218. package/lib/foundations/spacing/index.d.ts +0 -1
  219. package/lib/foundations/spacing/spacing-guidelines.d.ts +0 -22
  220. package/lib/foundations/spacing/spacing.d.ts +0 -18
  221. package/lib/foundations/typography/constants.d.ts +0 -22
  222. package/lib/foundations/typography/index.d.ts +0 -1
  223. package/lib/foundations/typography/text-aspect-flags.d.ts +0 -14
  224. package/lib/foundations/typography/typography.d.ts +0 -19
  225. package/lib/helpers/generic-types.d.ts +0 -21
  226. package/lib/helpers/index.d.ts +0 -6
  227. package/lib/helpers/nothing.d.ts +0 -8
  228. package/lib/helpers/safe-navigation.d.ts +0 -14
  229. package/lib/helpers/slots.d.ts +0 -8
  230. 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'
@@ -0,0 +1,4 @@
1
+ export * from './color-system'
2
+ export * from './typography'
3
+ export * from './spacing'
4
+ export * from './shadows'