@edvisor/product-language 0.1.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/README.md +33 -0
- package/jest.config.ts +15 -0
- package/jest.setup.ts +2 -0
- package/package.json +30 -0
- package/project.json +75 -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/src/lib/components/card/atoms/card-frame.tsx +17 -0
- 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/src/lib/helpers/numbers.ts +53 -0
- 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/.babelrc
ADDED
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"],
|
|
3
|
+
"ignorePatterns": ["!**/*"],
|
|
4
|
+
"plugins": [
|
|
5
|
+
"no-null"
|
|
6
|
+
],
|
|
7
|
+
"overrides": [
|
|
8
|
+
{
|
|
9
|
+
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
|
|
10
|
+
"rules": {
|
|
11
|
+
"semi": ["error", "never"],
|
|
12
|
+
"quotes": ["error", "single"],
|
|
13
|
+
"no-console": "warn",
|
|
14
|
+
"react/jsx-no-useless-fragment": ["warn", { "allowExpressions": true }],
|
|
15
|
+
"no-null/no-null": 2,
|
|
16
|
+
"no-duplicate-case": "warn",
|
|
17
|
+
"no-restricted-syntax": [
|
|
18
|
+
"error",
|
|
19
|
+
{
|
|
20
|
+
"selector": "ImportDeclaration[source.value=/[^@]foundations/i]",
|
|
21
|
+
"message": "Import from @foundations instead of using a relative path"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"selector": "ImportDeclaration[source.value=/react/i] ImportSpecifier[imported.name=/FC/]",
|
|
25
|
+
"message": "Use `import { FC } from '@helpers'` instead"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"selector": "ImportDeclaration[source.value=/react/i] ImportSpecifier[imported.name=/PropsWithChildren/]",
|
|
29
|
+
"message": "Use `import { PropsWithChildren } from '@helpers'` instead"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"selector": "ImportDeclaration[source.value=/react/i] ImportSpecifier[imported.name=/forwardRef/]",
|
|
33
|
+
"message": "Use `import { forwardRef } from '@helpers'` instead"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"selector": "Literal[value=/#[a-zA-Z0-9]{1,6}/i]",
|
|
37
|
+
"message": "No hex literals, please import constants from @foundations"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"selector": "Literal[value=/padding.*: ([0-9]|')/i]",
|
|
41
|
+
"message": "No hex literals, please import constants from @foundations"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"selector": "TemplateElement[value.cooked=/#[a-zA-Z0-9]{1,6}/i]",
|
|
45
|
+
"message": "No hex literals, please import constants from @foundations"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"selector": "TemplateElement[value.cooked=/padding.*: ([0-9]|')/i]",
|
|
49
|
+
"message": "No ad-hoc padding, please import { Padding } from '@foundations'"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"selector": "TemplateElement[value.cooked=/margin.*: ([0-9]|')/i]",
|
|
53
|
+
"message": "No ad-hoc margins, please import { Margin } from '@foundations'"
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"files": ["*.ts", "*.tsx"],
|
|
60
|
+
"parserOptions": {
|
|
61
|
+
"project": ["packages/product-language/tsconfig.*?.json", "packages/product-language/.storybook/tsconfig.json"]
|
|
62
|
+
},
|
|
63
|
+
"rules": {
|
|
64
|
+
"no-shadow": "off",
|
|
65
|
+
"@typescript-eslint/no-shadow": "warn",
|
|
66
|
+
"@typescript-eslint/no-explicit-any": "error",
|
|
67
|
+
"@typescript-eslint/no-invalid-void-type": "error",
|
|
68
|
+
"@typescript-eslint/ban-types": ["error", {
|
|
69
|
+
"types": {
|
|
70
|
+
"null": "Use 'undefined' instead of 'null'",
|
|
71
|
+
"React.FC": "Use `import { FC } from '@helpers'` instead",
|
|
72
|
+
"React.PropsWithChildren": "Use `import { PropsWithChildren } from '@helpers'` instead",
|
|
73
|
+
"React.forwardRef": "Use `import { forwardRef } from '@helpers'` instead"
|
|
74
|
+
}
|
|
75
|
+
}],
|
|
76
|
+
"@typescript-eslint/strict-boolean-expressions": ["error", {
|
|
77
|
+
"allowString": false,
|
|
78
|
+
"allowNumber": false,
|
|
79
|
+
"allowNullableObject": false
|
|
80
|
+
}]
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"files": ["*.tsx"],
|
|
85
|
+
"parserOptions": {
|
|
86
|
+
"project": ["packages/product-language/tsconfig.*?.json"]
|
|
87
|
+
},
|
|
88
|
+
"rules": {
|
|
89
|
+
"no-restricted-syntax": [
|
|
90
|
+
"error",
|
|
91
|
+
{
|
|
92
|
+
"selector": "FunctionDeclaration[id.name=/^[A-Z]/]",
|
|
93
|
+
"message": "Components should be declared `const MyComponent: FC<IProps> = (props) => {`"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"selector": "ImportDeclaration[source.value=/[^@]foundations/i]",
|
|
97
|
+
"message": "Import from @foundations instead of using a relative path"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"selector": "ImportDeclaration[source.value=/react/i] ImportSpecifier[imported.name=/FC/]",
|
|
101
|
+
"message": "Use `import { FC } from '@helpers'` instead"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"selector": "ImportDeclaration[source.value=/react/i] ImportSpecifier[imported.name=/PropsWithChildren/]",
|
|
105
|
+
"message": "Use `import { Props } from '@helpers'` instead"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"selector": "ImportDeclaration[source.value=/react/i] ImportSpecifier[imported.name=/forwardRef/]",
|
|
109
|
+
"message": "Use `import { forwardRef } from '@helpers'` instead"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"selector": "Literal[value=/#[a-zA-Z0-9]{1,6}/i]",
|
|
113
|
+
"message": "No hex literals, please import constants from @foundations"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"selector": "Literal[value=/padding.*: ([0-9]|')/i]",
|
|
117
|
+
"message": "No hex literals, please import constants from @foundations"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"selector": "TemplateElement[value.cooked=/#[a-zA-Z0-9]{1,6}/i]",
|
|
121
|
+
"message": "No hex literals, please import constants from @foundations"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"selector": "TemplateElement[value.cooked=/padding.*: ([0-9]|')/i]",
|
|
125
|
+
"message": "No ad-hoc padding, please import { Padding } from '@foundations'"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"selector": "TemplateElement[value.cooked=/margin.*: ([0-9]|')/i]",
|
|
129
|
+
"message": "No ad-hoc margins, please import { Margin } from '@foundations'"
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"files": ["*.js", "*.jsx"],
|
|
136
|
+
"rules": {}
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const rootMain = require('../../../.storybook/main')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
const webpack = require('webpack')
|
|
4
|
+
|
|
5
|
+
// we can't import from our design-system here
|
|
6
|
+
// so I'm replicating the constant
|
|
7
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
8
|
+
const backgroundDefault = '#F3F4F6'
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
...rootMain,
|
|
12
|
+
|
|
13
|
+
core: { ...rootMain.core, builder: 'webpack5' },
|
|
14
|
+
|
|
15
|
+
stories: [
|
|
16
|
+
...rootMain.stories,
|
|
17
|
+
'../src/lib/**/*.stories.mdx',
|
|
18
|
+
'../src/lib/**/*.stories.@(js|jsx|ts|tsx)',
|
|
19
|
+
],
|
|
20
|
+
addons: [...rootMain.addons, '@nrwl/react/plugins/storybook'],
|
|
21
|
+
staticDirs: [{from: '../src/assets', to:'/public'}],
|
|
22
|
+
webpackFinal: async (config, { configType }) => {
|
|
23
|
+
// apply any global webpack configs that might have been specified in .storybook/main.js
|
|
24
|
+
if (rootMain.webpackFinal) {
|
|
25
|
+
config = await rootMain.webpackFinal(config, { configType })
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
config.plugins.push(
|
|
29
|
+
new webpack.ProvidePlugin({
|
|
30
|
+
Buffer: ['buffer', 'Buffer'],
|
|
31
|
+
}),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
config.module.rules.push({
|
|
35
|
+
test: /\.(png|woff|woff2|eot|ttf|svg)$/,
|
|
36
|
+
use: [
|
|
37
|
+
{
|
|
38
|
+
loader: require.resolve('file-loader'),
|
|
39
|
+
options: {
|
|
40
|
+
name: '[name].[ext]'
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
include: path.resolve(__dirname, '../')
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
return config
|
|
48
|
+
},
|
|
49
|
+
previewHead: (head) => `
|
|
50
|
+
${head}
|
|
51
|
+
<style>
|
|
52
|
+
html, body {
|
|
53
|
+
background: ${backgroundDefault};
|
|
54
|
+
}
|
|
55
|
+
</style>
|
|
56
|
+
`,
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,300;0,400;0,500;1,300&display=swap%7CLato:400,700" media="all"></link>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { liveDecorator } from 'storybook-addon-jarle-monaco'
|
|
2
|
+
|
|
3
|
+
export const parameters = {
|
|
4
|
+
actions: { argTypesRegex: '^on[A-Z].*' },
|
|
5
|
+
controls: {
|
|
6
|
+
matchers: {
|
|
7
|
+
color: /(background|color)$/i,
|
|
8
|
+
date: /Date$/,
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const decorators = [
|
|
14
|
+
liveDecorator
|
|
15
|
+
]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"emitDecoratorMetadata": true,
|
|
5
|
+
"outDir": "",
|
|
6
|
+
"noEmit": true
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"../../../node_modules/@nrwl/react/typings/styled-jsx.d.ts",
|
|
10
|
+
"../../../node_modules/@nrwl/react/typings/cssmodule.d.ts",
|
|
11
|
+
"../../../node_modules/@nrwl/react/typings/image.d.ts"
|
|
12
|
+
],
|
|
13
|
+
|
|
14
|
+
"exclude": [
|
|
15
|
+
"../**/*.spec.ts",
|
|
16
|
+
"../**/*.spec.js",
|
|
17
|
+
"../**/*.spec.tsx",
|
|
18
|
+
"../**/*.spec.jsx"
|
|
19
|
+
],
|
|
20
|
+
"include": [
|
|
21
|
+
"../src/**/storybook/*",
|
|
22
|
+
"../src/**/stories/*",
|
|
23
|
+
"../src/**/*.stories.ts",
|
|
24
|
+
"../src/**/*.stories.js",
|
|
25
|
+
"../src/**/*.stories.jsx",
|
|
26
|
+
"../src/**/*.stories.tsx",
|
|
27
|
+
"../src/**/*.stories.mdx",
|
|
28
|
+
"*.js"
|
|
29
|
+
]
|
|
30
|
+
}
|
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# product-language
|
|
2
|
+
|
|
3
|
+
This library was generated with [Nx](https://nx.dev).
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Storybook Guidelines
|
|
8
|
+
|
|
9
|
+
Bellow there are some goals to drive our way to build the design system stories with Storybook
|
|
10
|
+
|
|
11
|
+
- The structure on Figma and Storybook needs to stay with the same names (consistency is the key). Please tell us if you detect some structure that aren't following that
|
|
12
|
+
|
|
13
|
+
- Developers from the engineering team shouldn't need to open the code on their editors in order to understand and see how the things is working
|
|
14
|
+
- The stories page from each component should be clear with what they have and what they don't have. In that case, use (or add) those information on Changelog (Roadmap)section
|
|
15
|
+
|
|
16
|
+
- Components pages should be small and easy to understand. Don't be afraid to create a lot of pages to same component with their variations
|
|
17
|
+
- Display only the props that can change the component behavior/display
|
|
18
|
+
|
|
19
|
+
- Display best practices thinking on developers usage (if the situation required that)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
- Incrementally, we should have some pages that can render something nearly the mockups world, in order to make easy to figure out the components working together
|
|
23
|
+
|
|
24
|
+
### Foundations Pages
|
|
25
|
+
Bellow there are some goals about the Foundations pages
|
|
26
|
+
|
|
27
|
+
- Explain the guidelines and the fundamentals from a Design Perspective
|
|
28
|
+
- Can teach developers people to learn about how the design works
|
|
29
|
+
- This kind of pages don't need to show code/how to use
|
|
30
|
+
|
|
31
|
+
## Running unit tests
|
|
32
|
+
|
|
33
|
+
Run `nx test product-language` to execute the unit tests via [Jest](https://jestjs.io).
|
package/jest.config.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
export default {
|
|
3
|
+
displayName: 'product-language',
|
|
4
|
+
preset: '../../jest.preset.js',
|
|
5
|
+
transform: {
|
|
6
|
+
'^.+\\.[tj]sx?$': 'babel-jest',
|
|
7
|
+
},
|
|
8
|
+
moduleNameMapper: {
|
|
9
|
+
'^.+\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)$': '<rootDir>/fileTransformer.js',
|
|
10
|
+
'^.+\\.(css)$': 'identity-obj-proxy',//we can remove if we dont have css files
|
|
11
|
+
},
|
|
12
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
|
13
|
+
coverageDirectory: '../../coverage/packages/product-language',
|
|
14
|
+
setupFilesAfterEnv: ['./jest.setup.ts'],
|
|
15
|
+
};
|
package/jest.setup.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@edvisor/product-language",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Edvisor.io product-language components",
|
|
5
|
+
"repository": "https://github.com/edvisor-io/front-end/",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"release": "release-it --disable-metrics"
|
|
8
|
+
},
|
|
9
|
+
"peerDependencies": {
|
|
10
|
+
"release": "*"
|
|
11
|
+
},
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"@types/jest-axe": "^3.5.4"
|
|
14
|
+
},
|
|
15
|
+
"release-it": {
|
|
16
|
+
"git": {
|
|
17
|
+
"commitMessage": "chore: release ${version}",
|
|
18
|
+
"tagName": "v${version}"
|
|
19
|
+
},
|
|
20
|
+
"github": {
|
|
21
|
+
"release": true
|
|
22
|
+
},
|
|
23
|
+
"npm": {
|
|
24
|
+
"publish": true
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"registry": "https://registry.npmjs.org"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
3
|
+
"sourceRoot": "packages/product-language/src",
|
|
4
|
+
"projectType": "library",
|
|
5
|
+
"tags": [],
|
|
6
|
+
"targets": {
|
|
7
|
+
"build": {
|
|
8
|
+
"executor": "@nrwl/web:rollup",
|
|
9
|
+
"outputs": ["{options.outputPath}"],
|
|
10
|
+
"options": {
|
|
11
|
+
"outputPath": "dist/packages/product-language",
|
|
12
|
+
"tsConfig": "packages/product-language/tsconfig.lib.json",
|
|
13
|
+
"project": "packages/product-language/package.json",
|
|
14
|
+
"entryFile": "packages/product-language/src/index.ts",
|
|
15
|
+
"external": ["react/jsx-runtime"],
|
|
16
|
+
"rollupConfig": "@nrwl/react/plugins/bundle-rollup",
|
|
17
|
+
"compiler": "babel",
|
|
18
|
+
"assets": [
|
|
19
|
+
{
|
|
20
|
+
"glob": "packages/product-language/README.md",
|
|
21
|
+
"input": ".",
|
|
22
|
+
"output": "."
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"lint": {
|
|
28
|
+
"executor": "@nrwl/linter:eslint",
|
|
29
|
+
"outputs": ["{options.outputFile}"],
|
|
30
|
+
"options": {
|
|
31
|
+
"lintFilePatterns": ["packages/product-language/**/*.{ts,tsx,js,jsx}"]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"test": {
|
|
35
|
+
"executor": "@nrwl/jest:jest",
|
|
36
|
+
"outputs": ["coverage/packages/product-language"],
|
|
37
|
+
"options": {
|
|
38
|
+
"jestConfig": "packages/product-language/jest.config.ts",
|
|
39
|
+
"passWithNoTests": true
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"storybook": {
|
|
43
|
+
"executor": "@nrwl/storybook:storybook",
|
|
44
|
+
"options": {
|
|
45
|
+
"uiFramework": "@storybook/react",
|
|
46
|
+
"tsConfig": "packages/product-language/tsconfig.storybook.json",
|
|
47
|
+
"port": 4400,
|
|
48
|
+
"config": {
|
|
49
|
+
"configFolder": "packages/product-language/.storybook"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"configurations": {
|
|
53
|
+
"ci": {
|
|
54
|
+
"quiet": true
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"build-storybook": {
|
|
59
|
+
"executor": "@nrwl/storybook:build",
|
|
60
|
+
"outputs": ["{options.outputPath}"],
|
|
61
|
+
"options": {
|
|
62
|
+
"uiFramework": "@storybook/react",
|
|
63
|
+
"outputPath": "dist/storybook/product-language",
|
|
64
|
+
"config": {
|
|
65
|
+
"configFolder": "packages/product-language/.storybook"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"configurations": {
|
|
69
|
+
"ci": {
|
|
70
|
+
"quiet": true
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M14.3751 15.6444H1.62507C1.12228 15.6444 0.714355 16.0527 0.714355 16.5559C0.714355 17.0902 1.12228 17.5 1.62507 17.5H14.3751C14.8779 17.5 15.2858 17.0917 15.2858 16.5885C15.2858 16.0846 14.8798 15.6444 14.3751 15.6444ZM12.1932 7.16719L8.91078 10.6583V1.41451C8.91078 0.908303 8.50476 0.5 8.00007 0.5C7.49538 0.5 7.08936 0.908304 7.08936 1.41147V10.6552L3.80585 7.16719C3.62674 6.97366 3.38503 6.8788 3.14293 6.8788C2.91882 6.8788 2.69478 6.96068 2.51909 7.12681C2.15268 7.47095 2.13507 8.04777 2.47996 8.41433L7.33711 13.5788C7.68098 13.9467 8.31916 13.9467 8.66296 13.5788L13.5201 8.41433C13.8652 8.04766 13.8474 7.47099 13.481 7.12681C13.1152 6.78013 12.5385 6.76496 12.1932 7.16719Z" fill="#6B7280"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M14.3751 15.6444H1.62507C1.12228 15.6444 0.714355 16.0527 0.714355 16.5559C0.714355 17.0902 1.12228 17.5 1.62507 17.5H14.3751C14.8779 17.5 15.2858 17.0917 15.2858 16.5885C15.2858 16.0846 14.8798 15.6444 14.3751 15.6444ZM12.1932 7.16719L8.91078 10.6583V1.41451C8.91078 0.908303 8.50476 0.5 8.00007 0.5C7.49538 0.5 7.08936 0.908304 7.08936 1.41147V10.6552L3.80585 7.16719C3.62674 6.97366 3.38503 6.8788 3.14293 6.8788C2.91882 6.8788 2.69478 6.96068 2.51909 7.12681C2.15268 7.47095 2.13507 8.04777 2.47996 8.41433L7.33711 13.5788C7.68098 13.9467 8.31916 13.9467 8.66296 13.5788L13.5201 8.41433C13.8652 8.04766 13.8474 7.47099 13.481 7.12681C13.1152 6.78013 12.5385 6.76496 12.1932 7.16719Z" fill="white"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M9 2.09302C5.18538 2.09302 2.09302 5.18538 2.09302 9C2.09302 12.8146 5.18538 15.907 9 15.907C9.57797 15.907 10.0465 16.3755 10.0465 16.9535C10.0465 17.5315 9.57797 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C11.5884 0 13.9229 1.09405 15.5635 2.84196C15.959 3.26339 15.938 3.92567 15.5166 4.3212C15.0951 4.71674 14.4329 4.69575 14.0373 4.27432C12.7759 2.93035 10.9866 2.09302 9 2.09302Z" fill="#6B7280"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M9 2.09302C5.18538 2.09302 2.09302 5.18538 2.09302 9C2.09302 12.8146 5.18538 15.907 9 15.907C9.57797 15.907 10.0465 16.3755 10.0465 16.9535C10.0465 17.5315 9.57797 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0C11.5884 0 13.9229 1.09405 15.5635 2.84196C15.959 3.26339 15.938 3.92567 15.5166 4.3212C15.0951 4.71674 14.4329 4.69575 14.0373 4.27432C12.7759 2.93035 10.9866 2.09302 9 2.09302Z" fill="white"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { storiesOf as _storiesOf } from '@storybook/react'
|
|
2
|
+
import { StoryFn } from '@storybook/addons'
|
|
3
|
+
import { isDefined, isNil } from '@helpers'
|
|
4
|
+
import { StoryFnReactReturnType } from '@storybook/react/dist/ts3.9/client/preview/types'
|
|
5
|
+
|
|
6
|
+
const DIRECTORY_BASE_PATH = 'packages/product-language/src/lib/'
|
|
7
|
+
|
|
8
|
+
const getStoryPath = (filepath: string) => {
|
|
9
|
+
const path = filepath.split('/')
|
|
10
|
+
|
|
11
|
+
return isDefined(path)
|
|
12
|
+
? path
|
|
13
|
+
.slice(0, path.length - 1) // remove the filename
|
|
14
|
+
.join('/')
|
|
15
|
+
.replace(DIRECTORY_BASE_PATH, '') // remove the base path
|
|
16
|
+
: 'misc'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function getStoryTitle (filepath: string, storyName? : string): string {
|
|
20
|
+
const path = filepath.split('/')
|
|
21
|
+
|
|
22
|
+
const nameFromPath = isDefined(path) ? path.pop()?.split('.').shift() : undefined
|
|
23
|
+
|
|
24
|
+
if (isNil(nameFromPath)) return 'Base'
|
|
25
|
+
|
|
26
|
+
if (isDefined(storyName)) return `${nameFromPath}/${storyName}`
|
|
27
|
+
|
|
28
|
+
return nameFromPath
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type StoryComponent = StoryFn<StoryFnReactReturnType>
|
|
32
|
+
|
|
33
|
+
export function talesOf (filepath: string, module: NodeModule, Storybook?: StoryComponent, storyName?: string) {
|
|
34
|
+
if (isNil(Storybook)) {
|
|
35
|
+
return _storiesOf(getStoryPath(filepath), module)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const title = getStoryTitle(filepath, storyName)
|
|
39
|
+
|
|
40
|
+
return _storiesOf(getStoryPath(filepath), module)
|
|
41
|
+
.add(title, Storybook)
|
|
42
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Components
|
|
2
|
+
==========
|
|
3
|
+
|
|
4
|
+
This folder contains the components that will be exported from the Product Language and used in the front-end.
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
/src
|
|
8
|
+
/lib
|
|
9
|
+
/components
|
|
10
|
+
/alert-banner
|
|
11
|
+
/card
|
|
12
|
+
index.ts
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The index.ts file is a manifest and anything in the manifest will be available the clients.
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/src
|
|
19
|
+
/lib
|
|
20
|
+
/components
|
|
21
|
+
/alert-banner
|
|
22
|
+
/card
|
|
23
|
+
/components
|
|
24
|
+
/helpers
|
|
25
|
+
index.tsx
|
|
26
|
+
card.tsx
|
|
27
|
+
card.stories.tsx
|
|
28
|
+
card.spec.ts
|
|
29
|
+
index.ts
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
inside of any component, like `card` you will find another index.ts file. This is a manifest and it should only declare the main file of the component as an export:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
export * from './card'
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
None of the specs, stories, sub-components, helpers, or any other kind of thing should appear in the manifest. Using manifests like this allows us to give each component a rich eco-system of helpers and sub-components without needing to move everything to a global scope.
|
|
39
|
+
|
|
40
|
+
For example, here is a helper in card/helpers.ts
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
// this is not a real helper, just an example
|
|
44
|
+
export function makeCardTitle (title: string) {
|
|
45
|
+
return `Card: ${title}`
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
This helper is obviously tightly coupled to the card "concern". It should not be declared in a global helpers file, that wouldn't make sense and it would lower cohesion in the app. In addition, it should not be exported from the manifest, since it is not intended for the client to use it.
|
|
@@ -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'
|