Skip to content

Commit 6d4162b

Browse files
ggazzotassoevan
andcommitted
feat: UI Kit (#95)
* Remove :invalid pseudoclass from InputBox.Option (#94) * ui-kit draft * typescript lib * abstract classes * stories * Add useStylingProvider hook * Add Grid prototype * better code * Fix wrong modifier class * Fix gutters * Delete old grid code * splited into 2 packages * alpha CI * Fix fuselage-hooks dependencies * Remove unnecessary configuration for ui-kit * Fix React version in fuselage * Fix dependencies * Fix Divider style * circle * circle CI * input fixes * moved to files * fix context * fix again * test * again * fix context * create avatar * Don't minify CSS on Storybook (#109) * improve chip * chore: Jest results (#108) * refactor: Atomic styles (#111) * Refactor Divider component * Add missing Loki references * Deprecate some placeholder selectors * Add tile atoms * Fix stylelint errors * Add button atom styles * Add input atom styles * Add prototype of selection button atom styles * Rewrite some mixins * Simplify selection button styles * full select component * Select and MultiSelect done * fix selects * autocomplete * finish select and multiselect * fix components * Update typographic mixins * Remove some properties from box style * Refactor Chip * Refactor typographic components * Deprecate Text component * Add a new Skeleton component * Deprecate Text.Skeleton * Deprecate some typographic mixins * Add inline rich text styles * Fix Skeleton animation * Add some rich text styles * Expand rich text styles * Add prototypes for essential rich text elements * Fix pre with code style * Rearrange Box stories * Add variations of links * Fix InputBox borders * Update dependencies * Add "Data Display" story kind * Add support for more props on PropsContext * Add prototype of Table component * Format some prop values * fix CI Co-authored-by: Tasso Evangelista <tassoevan7@gmail.com>
1 parent e81d0a0 commit 6d4162b

File tree

394 files changed

+5418
-1807
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

394 files changed

+5418
-1807
lines changed

.circleci/config.yml

+35
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,26 @@ jobs:
5959
- run:
6060
name: Publish package
6161
command: yarn lerna publish from-package --yes
62+
publish-alpha:
63+
docker:
64+
- image: circleci/node:10.15
65+
working_directory: ~/repo
66+
steps:
67+
- attach_workspace:
68+
at: ~/repo
69+
- run:
70+
name: Authenticate with registry
71+
command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc
72+
- run:
73+
name: Publish package
74+
command: |
75+
export CIRCLE_PR_NUMBER="${CIRCLE_PR_NUMBER:-${CIRCLE_PULL_REQUEST##*/}}"
76+
if [[ -z $CIRCLE_PR_NUMBER ]]; then
77+
exit 0
78+
fi;
79+
yarn lerna version --conventional-commits --yes
80+
yarn lerna publish --canary --preid $CIRCLE_PR_NUMBER --dist-tag $CIRCLE_PR_NUMBER --yes
81+
6282
6383
publish-next:
6484
docker:
@@ -112,3 +132,18 @@ workflows:
112132
filters:
113133
branches:
114134
only: develop
135+
- publish-alpha:
136+
requires:
137+
- hold
138+
filters:
139+
branches:
140+
only: /feature*/
141+
- hold:
142+
type: approval
143+
requires:
144+
- build
145+
filters:
146+
branches:
147+
ignore:
148+
- master
149+
- develop

lerna.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
],
88
"command": {
99
"version": {
10-
"allowBranch": "master"
10+
"allowBranch": ["master", "feature*"]
1111
}
1212
}
1313
}

packages/fuselage-hooks/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"jest": "^24.9.0",
5050
"lint-staged": "^9.4.2",
5151
"react": "^16.12.0",
52+
"react-dom": "^16.12.0",
5253
"rollup": "^1.27.9",
5354
"rollup-plugin-babel": "^4.3.3",
5455
"rollup-plugin-commonjs": "^10.1.0",
@@ -57,7 +58,7 @@
5758
},
5859
"peerDependencies": {
5960
"invariant": "^2.2.4",
60-
"react": "^16.10.2"
61+
"react": "^16.12.0"
6162
},
6263
"publishConfig": {
6364
"access": "public"

packages/fuselage-ui-kit/.eslintrc.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const path = require('path');
2+
3+
module.exports = {
4+
extends: ['@rocket.chat/eslint-config'],
5+
plugins: ['react'],
6+
parser: 'babel-eslint',
7+
parserOptions:{
8+
"ecmaVersion": 11,
9+
"sourceType": "module",
10+
"allowImportExportEverywhere": true
11+
},
12+
rules: {
13+
indent: ['error', 2],
14+
'import/order': ['error', {
15+
'newlines-between': 'always',
16+
groups: ['builtin', 'external', 'internal', ['parent', 'sibling', 'index']]
17+
}],
18+
'jsx-quotes': ['error', 'prefer-single'],
19+
'react/jsx-uses-react': 'error',
20+
'react/jsx-uses-vars': 'error',
21+
'react/jsx-no-undef': 'error',
22+
'react/jsx-fragments': ['error', 'syntax'],
23+
},
24+
settings: {
25+
react: {
26+
version: 'detect',
27+
},
28+
},
29+
'env': {
30+
'jest': true,
31+
},
32+
};

packages/fuselage-ui-kit/.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/dist/*
2+
/storybook-static/
3+
/bundle-report.html
4+
/.storybook/jest-results.json
5+
/.out
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"sourceType": "unambiguous",
3+
"presets": [
4+
[
5+
"@babel/preset-env",
6+
{
7+
"targets": {
8+
"browsers": [
9+
"Chrome >= 59",
10+
"FireFox >= 44",
11+
"Safari >= 7",
12+
"Explorer 11",
13+
"last 4 Edge versions"
14+
]
15+
}
16+
}
17+
],
18+
"@babel/preset-react"
19+
],
20+
"plugins": [
21+
"@babel/plugin-proposal-class-properties",
22+
]
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import '@storybook/addon-actions/register';
2+
import '@storybook/addon-backgrounds/register';
3+
import '@storybook/addon-docs/register';
4+
import '@storybook/addon-jest/register';
5+
import '@storybook/addon-knobs/register';
6+
import '@storybook/addon-options/register';
7+
import '@storybook/addon-viewport/register';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { DocsPage, DocsContainer } from '@storybook/addon-docs/blocks';
2+
import { withTests } from '@storybook/addon-jest';
3+
import { INITIAL_VIEWPORTS } from '@storybook/addon-viewport';
4+
import { addDecorator, addParameters, configure } from '@storybook/react';
5+
import { create } from '@storybook/theming';
6+
import 'loki/configure-react';
7+
8+
import manifest from '../package.json';
9+
import results from './jest-results.json';
10+
11+
addParameters({
12+
backgrounds: [
13+
{
14+
name: 'black',
15+
value: 'black',
16+
},
17+
],
18+
docs: {
19+
container: DocsContainer,
20+
page: DocsPage,
21+
},
22+
options: {
23+
theme: create({
24+
base: 'light',
25+
brandTitle: manifest.name,
26+
brandImage: 'https://rocket.chat/images/default/logo--dark.svg',
27+
brandUrl: manifest.homepage,
28+
gridCellSize: 8,
29+
}),
30+
panelPosition: 'right',
31+
hierarchySeparator: /\//,
32+
hierarchyRootSeparator: /\|/,
33+
// storySort: ([, a], [, b]) => {
34+
// const roots = ['Fuselage', 'Buttons', 'Forms', 'Typography'];
35+
// const getRootIndex = ({ kind }) => roots.findIndex((root) => kind.startsWith(`${ root }|`));
36+
// return getRootIndex(a) - getRootIndex(b);
37+
// },
38+
},
39+
viewport: {
40+
viewports: {
41+
xs: {
42+
name: 'xs',
43+
styles: {
44+
width: '320px',
45+
height: '90%',
46+
},
47+
type: 'desktop',
48+
},
49+
sm: {
50+
name: 'sm',
51+
styles: {
52+
width: '600px',
53+
height: '90%',
54+
},
55+
type: 'desktop',
56+
},
57+
md: {
58+
name: 'md',
59+
styles: {
60+
width: '768px',
61+
height: '90%',
62+
},
63+
type: 'desktop',
64+
},
65+
lg: {
66+
name: 'lg',
67+
styles: {
68+
width: '1024px',
69+
height: '90%',
70+
},
71+
type: 'desktop',
72+
},
73+
xl: {
74+
name: 'xl',
75+
styles: {
76+
width: '1440px',
77+
height: '90%',
78+
},
79+
type: 'desktop',
80+
},
81+
...INITIAL_VIEWPORTS,
82+
},
83+
},
84+
});
85+
86+
addDecorator(withTests({ results }));
87+
88+
configure(() => {
89+
require('@rocket.chat/icons/dist/rocketchat.css');
90+
const componentStories = require.context('../src', true, /stories(\/index)?\.(md|js|ts)x?$/);
91+
92+
return [
93+
...componentStories.keys().map(componentStories)
94+
].filter((module) => module.default && module.default.title);
95+
}, module);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":26,"numPassedTests":32,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":26,"numTotalTests":32,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1574699845664,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"},{"ancestorTitles":["Skeleton"],"failureMessages":[],"fullName":"Skeleton renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699848722,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Text/spec.js","startTime":1574699847368,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"},{"ancestorTitles":["Skeleton"],"failureMessages":[],"fullName":"Skeleton renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699848727,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Paragraph/spec.js","startTime":1574699847364,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"},{"ancestorTitles":["Accordion.Item"],"failureMessages":[],"fullName":"Accordion.Item renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699848741,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Accordion/spec.js","startTime":1574699847394,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699848786,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/TelephoneInput/spec.js","startTime":1574699847410,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"},{"ancestorTitles":["Skeleton"],"failureMessages":[],"fullName":"Skeleton renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699848858,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Headline/spec.js","startTime":1574699847447,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"},{"ancestorTitles":["Skeleton"],"failureMessages":[],"fullName":"Skeleton renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849006,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/InputBox/spec.js","startTime":1574699847551,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"},{"ancestorTitles":["Skeleton"],"failureMessages":[],"fullName":"Skeleton renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849014,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Subtitle/spec.js","startTime":1574699847569,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849159,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Callout/spec.js","startTime":1574699848749,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849163,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/RadioButton/spec.js","startTime":1574699848756,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849178,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/ToggleSwitch/spec.js","startTime":1574699848767,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849249,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/SearchInput/spec.js","startTime":1574699848856,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849279,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/UrlInput/spec.js","startTime":1574699848904,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849379,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/TextAreaInput/spec.js","startTime":1574699849033,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849450,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/PasswordInput/spec.js","startTime":1574699849050,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849492,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Icon/spec.js","startTime":1574699849175,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849497,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/SelectInput/spec.js","startTime":1574699849175,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849512,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/EmailInput/spec.js","startTime":1574699849194,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849598,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/ButtonGroup/spec.js","startTime":1574699849266,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849644,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/TextInput/spec.js","startTime":1574699849297,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849731,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/FieldGroup/spec.js","startTime":1574699849396,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849814,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/CheckBox/spec.js","startTime":1574699849466,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849816,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Label/spec.js","startTime":1574699849505,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849827,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Button/spec.js","startTime":1574699849511,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849850,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Field/spec.js","startTime":1574699849529,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849888,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Tile/spec.js","startTime":1574699849611,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"failureMessages":[],"fullName":"renders without crashing","location":null,"status":"passed","title":"renders without crashing"}],"endTime":1574699849928,"message":"","name":"/Users/guilhermegazzo/dev/Rocket.Chat.Fuselage/packages/fuselage/src/components/Box/spec.js","startTime":1574699849658,"status":"passed","summary":""}],"wasInterrupted":false}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<style>
2+
body {
3+
margin: 0;
4+
padding: 1rem;
5+
}
6+
</style>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
'use strict';
2+
3+
const createCompiler = require('@storybook/addon-docs/mdx-compiler-plugin');
4+
5+
module.exports = async ({ config, mode }) => {
6+
const jsRule = config.module.rules.find(({ test }) => test.test('index.js'));
7+
jsRule.include = [
8+
...jsRule.include,
9+
/node_modules\/loki/,
10+
];
11+
delete jsRule.exclude;
12+
config.resolve.extensions.push(".ts");
13+
14+
// config.module.rules.push({
15+
// test: /\.svg$/,
16+
// loader: "svg-url-loader"
17+
// });
18+
19+
config.module.rules.push({
20+
test: /\.scss$/,
21+
use: [
22+
'style-loader/useable',
23+
{
24+
loader: 'css-loader',
25+
options: {
26+
importLoaders: 2,
27+
},
28+
},
29+
{
30+
loader: 'postcss-loader',
31+
options: {
32+
ident: 'postcss',
33+
plugins: () => [
34+
require('postcss-custom-properties')(),
35+
require('autoprefixer')(),
36+
require('cssnano'),
37+
],
38+
},
39+
},
40+
'sass-loader',
41+
],
42+
});
43+
44+
config.module.rules.push({
45+
test: /\.mdx$/,
46+
use: [
47+
'babel-loader',
48+
{
49+
loader: '@mdx-js/loader',
50+
options: {
51+
compilers: [createCompiler({})],
52+
},
53+
},
54+
],
55+
});
56+
57+
config.module.rules.push({
58+
test: /(stories|story)\.[tj]sx?$/,
59+
loader: require.resolve('@storybook/source-loader'),
60+
exclude: [/node_modules/],
61+
enforce: 'pre',
62+
});
63+
64+
config.module.rules.push({
65+
test: /\.ts$/,
66+
loader: 'ts-loader',
67+
options:{ configFile: '../tsconfig.json'} ,
68+
exclude: /node_modules/,
69+
});
70+
return config;
71+
};

packages/fuselage-ui-kit/README.md

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# `@rocket.chat/ui-kit`
2+
3+
> TODO: description
4+
5+
## Usage
6+
7+
```
8+
const uiKit = require('@rocket.chat/ui-kit');
9+
10+
// TODO: DEMONSTRATE API
11+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
// const uiKit = require('..');
4+
5+
describe('@rocket.chat/fuselage-ui-kit', () => {
6+
it('needs tests');
7+
});
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = {
2+
presets: [
3+
'@babel/preset-env',
4+
'@babel/preset-react',
5+
],
6+
plugins: [
7+
'@babel/plugin-proposal-class-properties',
8+
],
9+
};

0 commit comments

Comments
 (0)