devextreme-cli 1.2.19 → 1.2.23

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 (27) hide show
  1. package/package.json +5 -4
  2. package/src/applications/application.angular.js +1 -1
  3. package/src/applications/application.react.js +0 -5
  4. package/src/applications/application.vue.js +0 -3
  5. package/src/commands.json +5 -2
  6. package/src/templates/react/application/src/App.js +1 -1
  7. package/src/templates/react/application/src/Content.js +1 -1
  8. package/src/templates/react/application/src/UnauthenticatedContent.js +1 -1
  9. package/src/templates/react/application/src/app-info.js +4 -2
  10. package/src/templates/react/application/src/components/change-password-form/change-password-form.js +1 -1
  11. package/src/templates/react/application/src/components/create-account-form/create-account-form.js +1 -1
  12. package/src/templates/react/application/src/components/footer/footer.js +2 -2
  13. package/src/templates/react/application/src/components/header/header.js +37 -37
  14. package/src/templates/react/application/src/components/login-form/login-form.js +1 -1
  15. package/src/templates/react/application/src/components/reset-password-form/reset-password-form.js +1 -1
  16. package/src/templates/react/application/src/components/side-navigation-menu/side-navigation-menu.js +4 -4
  17. package/src/templates/react/application/src/components/user-panel/user-panel.js +1 -1
  18. package/src/templates/react/application/src/layouts/side-nav-inner-toolbar/side-nav-inner-toolbar.js +1 -1
  19. package/src/templates/react/application/src/layouts/side-nav-outer-toolbar/side-nav-outer-toolbar.js +1 -1
  20. package/src/templates/react/application/src/layouts/single-card/single-card.js +11 -10
  21. package/src/templates/react/sample-pages/home/home.js +47 -46
  22. package/src/templates/react/sample-pages/profile/profile.js +3 -3
  23. package/src/templates/react/sample-pages/tasks/tasks.js +70 -69
  24. package/src/templates/vue-v2/sample-pages/profile.vue +1 -1
  25. package/src/templates/vue-v3/sample-pages/profile.vue +1 -1
  26. package/src/themebuider.js +34 -57
  27. package/src/utility/latest-versions.js +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devextreme-cli",
3
- "version": "1.2.19",
3
+ "version": "1.2.23",
4
4
  "description": "DevExtreme CLI",
5
5
  "keywords": [
6
6
  "devexpress",
@@ -38,6 +38,7 @@
38
38
  "license": "MIT",
39
39
  "dependencies": {
40
40
  "@yarnpkg/lockfile": "^1.1.0",
41
+ "import-cwd": "^3.0.0",
41
42
  "ip": "^1.1.5",
42
43
  "less": "3.9.0",
43
44
  "minimist": "^1.2.0",
@@ -57,10 +58,10 @@
57
58
  "eslint-plugin-jest": "^22.5.1",
58
59
  "eslint-plugin-react": "^7.20.6",
59
60
  "eslint-plugin-react-hooks": "^4.1.0",
60
- "eslint-plugin-unused-imports": "^0.1.3",
61
+ "eslint-plugin-unused-imports": "^1.1.5",
61
62
  "eslint-plugin-vue": "^7.0.0-beta.2",
62
63
  "eslint-stylish": "^0.2.0",
63
- "jest": "^26.0.0",
64
+ "jest": "^27.3.1",
64
65
  "jest-image-snapshot": "^4.5.0",
65
66
  "puppeteer": "^2.1.1",
66
67
  "rimraf": "^2.6.3",
@@ -68,5 +69,5 @@
68
69
  "tree-kill-promise": "^1.0.3",
69
70
  "typescript": "^4.0.2"
70
71
  },
71
- "gitHead": "9a4fe8bbadbdc99b5e8e5f18654f5e9777fff058"
72
+ "gitHead": "777e8d2b209c52381f604bb395a5289c8cded7da"
72
73
  }
@@ -32,7 +32,7 @@ async function runSchematicCommand(schematicCommand, options, evaluatingOptions)
32
32
  }
33
33
 
34
34
  async function runNgCommand(commandArguments, evaluatingOptions) {
35
- const ngCommandArguments = await hasSutableNgCli() ? [] : ['-p', '@angular/cli'];
35
+ const ngCommandArguments = await hasSutableNgCli() ? [] : ['-p', '@angular/cli@12'];
36
36
 
37
37
  ngCommandArguments.push('ng', ...commandArguments);
38
38
  return runCommand('npx', ngCommandArguments, evaluatingOptions);
@@ -22,11 +22,6 @@ const preparePackageJsonForTemplate = (appPath, appName) => {
22
22
  { name: 'sass', version: '^1.34.1' },
23
23
  { name: 'devextreme-cli', version: latestVersions['devextreme-cli'], dev: true },
24
24
  { name: 'react-router-dom', version: '^5.0.0' },
25
-
26
- // TODO: return default react versions (remove next two lines)
27
- // when react@17 issue will be resolved (T969191)
28
- { name: 'react', version: '^16.2.0' },
29
- { name: 'react-dom', version: '^16.2.0' },
30
25
  ];
31
26
  const scripts = [
32
27
  { name: 'build-themes', value: 'devextreme build' },
@@ -41,9 +41,6 @@ const preparePackageJsonForTemplate = (appPath, appName, version) => {
41
41
  const indexVueRouter = nameDepends.indexOf('vue-router');
42
42
 
43
43
  dependencies[indexVueRouter].version = '^4.0.1';
44
-
45
- // NOTE v3 freezed because of 'class' attribute deleted
46
- dependencies.push({ name: 'vue', version: '3.0.11' });
47
44
  }
48
45
 
49
46
  const scripts = [
package/src/commands.json CHANGED
@@ -72,10 +72,13 @@
72
72
  "description": "Specifies target DevExtreme build or a tag that points to it (default value is 'latest')"
73
73
  }, {
74
74
  "name": "--widgets",
75
- "description": "Specifies a comma-separated list of widgets whose styles should be included in the resulting CSS file (available from DevExtreme v19.2.3). If this argument is not specified, styles used for all widgets are included"
75
+ "description": "Specifies a comma-separated list of widgets whose styles should be included in the resulting CSS file. If this argument is not specified, styles used for all widgets are included. Available from DevExtreme v19.2.3."
76
76
  }, {
77
77
  "name": "--remove-external-resources",
78
- "description": "When present, removes links to external resources, such as fonts. The theme will use local fallbacks instead."
78
+ "description": "When present, removes links to external resources, such as fonts. The theme will use local fallbacks instead. Available from DevExtreme v20.2.7."
79
+ }, {
80
+ "name": "--bootstrap-version",
81
+ "description": "Specifies Bootstrap version 4 or 5 if '--input-file' is a '.scss' file. Available from DevExtreme v21.1.5. Default value: 4."
79
82
  }]
80
83
  }, {
81
84
  "name": "export-theme-vars",
@@ -22,7 +22,7 @@ function App() {
22
22
  return <UnauthenticatedContent />;
23
23
  }
24
24
 
25
- export default function () {
25
+ export default function Root() {
26
26
  const screenSizeClass = useScreenSizeClass();
27
27
 
28
28
  return (
@@ -5,7 +5,7 @@ import routes from './app-routes';
5
5
  import { <%=layout%> as SideNavBarLayout } from './layouts';
6
6
  import { Footer } from './components';
7
7
 
8
- export default function() {
8
+ export default function Content() {
9
9
  return (
10
10
  <SideNavBarLayout title={appInfo.title}>
11
11
  <Switch>
@@ -3,7 +3,7 @@ import { Switch, Route, Redirect } from 'react-router-dom';
3
3
  import { SingleCard } from './layouts';
4
4
  import { LoginForm, ResetPasswordForm, ChangePasswordForm, CreateAccountForm } from './components';
5
5
 
6
- export default function () {
6
+ export default function UnauthenticatedContent() {
7
7
  return (
8
8
  <Switch>
9
9
  <Route exact path='/login' >
@@ -1,3 +1,5 @@
1
- export default {
2
- title: '<%=project%>'
1
+ const appInfo = {
2
+ title: '<%=project%>'
3
3
  };
4
+ export default appInfo;
5
+
@@ -12,7 +12,7 @@ import LoadIndicator from 'devextreme-react/load-indicator';
12
12
  import notify from 'devextreme/ui/notify';
13
13
  import { changePassword } from '../../api/auth';
14
14
 
15
- export default function (props) {
15
+ export default function ChangePasswordForm(props) {
16
16
  const history = useHistory();
17
17
  const [loading, setLoading] = useState(false);
18
18
  const formData = useRef({});
@@ -14,7 +14,7 @@ import LoadIndicator from 'devextreme-react/load-indicator';
14
14
  import { createAccount } from '../../api/auth';
15
15
  import './create-account-form.scss';
16
16
 
17
- export default function (props) {
17
+ export default function CreateAccountForm(props) {
18
18
  const history = useHistory();
19
19
  const [loading, setLoading] = useState(false);
20
20
  const formData = useRef({});
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import './footer.scss';
3
3
 
4
- export default ({ ...rest }) => {
4
+ export default function Footer({ ...rest }) {
5
5
  return <footer className={'footer'} {...rest} />;
6
- };
6
+ }
@@ -5,41 +5,41 @@ import UserPanel from '../user-panel/user-panel';
5
5
  import './header.scss';
6
6
  import { Template } from 'devextreme-react/core/template';
7
7
 
8
- export default ({ menuToggleEnabled, title, toggleMenu }) => (
9
- <header className={'header-component'}>
10
- <Toolbar className={'header-toolbar'}>
11
- <Item
12
- visible={menuToggleEnabled}
13
- location={'before'}
14
- widget={'dxButton'}
15
- cssClass={'menu-button'}
16
- >
17
- <Button icon="menu" stylingMode="text" onClick={toggleMenu} />
18
- </Item>
19
- <Item
20
- location={'before'}
21
- cssClass={'header-title'}
22
- text={title}
23
- visible={!!title}
24
- />
25
- <Item
26
- location={'after'}
27
- locateInMenu={'auto'}
28
- menuItemTemplate={'userPanelTemplate'}
29
- >
30
- <Button
31
- className={'user-button authorization'}
32
- width={210}
33
- height={'100%'}
34
- stylingMode={'text'}
8
+ export default function Header({ menuToggleEnabled, title, toggleMenu }) {
9
+ return (
10
+ <header className={'header-component'}>
11
+ <Toolbar className={'header-toolbar'}>
12
+ <Item
13
+ visible={menuToggleEnabled}
14
+ location={'before'}
15
+ widget={'dxButton'}
16
+ cssClass={'menu-button'}
35
17
  >
36
- <UserPanel menuMode={'context'} />
37
- </Button>
38
- </Item>
39
- <Template name={'userPanelTemplate'}>
40
- <UserPanel menuMode={'list'} />
41
- </Template>
42
- </Toolbar>
43
- </header>
44
- );
45
-
18
+ <Button icon="menu" stylingMode="text" onClick={toggleMenu} />
19
+ </Item>
20
+ <Item
21
+ location={'before'}
22
+ cssClass={'header-title'}
23
+ text={title}
24
+ visible={!!title}
25
+ />
26
+ <Item
27
+ location={'after'}
28
+ locateInMenu={'auto'}
29
+ menuItemTemplate={'userPanelTemplate'}
30
+ >
31
+ <Button
32
+ className={'user-button authorization'}
33
+ width={210}
34
+ height={'100%'}
35
+ stylingMode={'text'}
36
+ >
37
+ <UserPanel menuMode={'context'} />
38
+ </Button>
39
+ </Item>
40
+ <Template name={'userPanelTemplate'}>
41
+ <UserPanel menuMode={'list'} />
42
+ </Template>
43
+ </Toolbar>
44
+ </header>
45
+ )}
@@ -14,7 +14,7 @@ import { useAuth } from '../../contexts/auth';
14
14
 
15
15
  import './login-form.scss';
16
16
 
17
- export default function () {
17
+ export default function LoginForm() {
18
18
  const history = useHistory();
19
19
  const { signIn } = useAuth();
20
20
  const [loading, setLoading] = useState(false);
@@ -15,7 +15,7 @@ import './reset-password-form.scss';
15
15
 
16
16
  const notificationText = 'We\'ve sent a link to reset your password. Check your inbox.';
17
17
 
18
- export default function (props) {
18
+ export default function ResetPasswordForm(props) {
19
19
  const history = useHistory();
20
20
  const [loading, setLoading] = useState(false);
21
21
  const formData = useRef({});
@@ -7,7 +7,7 @@ import './side-navigation-menu.scss';
7
7
 
8
8
  import * as events from 'devextreme/events';
9
9
 
10
- export default function (props) {
10
+ export default function SideNavigationMenu(props) {
11
11
  const {
12
12
  children,
13
13
  selectedItemChanged,
@@ -17,12 +17,12 @@ export default function (props) {
17
17
  } = props;
18
18
 
19
19
  const { isLarge } = useScreenSize();
20
- function normalizePath () {
20
+ function normalizePath () {
21
21
  return navigation.map((item) => {
22
- if(item.path && !(/^\//.test(item.path))){
22
+ if(item.path && !(/^\//.test(item.path))){
23
23
  item.path = `/${item.path}`;
24
24
  }
25
- return {...item, expanded: isLarge};
25
+ return {...item, expanded: isLarge};
26
26
  });
27
27
  }
28
28
 
@@ -5,7 +5,7 @@ import List from 'devextreme-react/list';
5
5
  import { useAuth } from '../../contexts/auth';
6
6
  import './user-panel.scss';
7
7
 
8
- export default function ({ menuMode }) {
8
+ export default function UserPanel({ menuMode }) {
9
9
  const { user, signOut } = useAuth();
10
10
  const history = useHistory();
11
11
 
@@ -10,7 +10,7 @@ import { useScreenSize } from '../../utils/media-query';
10
10
  import { Template } from 'devextreme-react/core/template';
11
11
  import { useMenuPatch } from '../../utils/patches';
12
12
 
13
- export default function ({ title, children }) {
13
+ export default function SideNavInnerToolbar({ title, children }) {
14
14
  const scrollViewRef = useRef();
15
15
  const history = useHistory();
16
16
  const { isXSmall, isLarge } = useScreenSize();
@@ -8,7 +8,7 @@ import { useScreenSize } from '../../utils/media-query';
8
8
  import { Template } from 'devextreme-react/core/template';
9
9
  import { useMenuPatch } from '../../utils/patches';
10
10
 
11
- export default function ({ title, children }) {
11
+ export default function SideNavOuterToolbar({ title, children }) {
12
12
  const scrollViewRef = useRef();
13
13
  const history = useHistory();
14
14
  const { isXSmall, isLarge } = useScreenSize();
@@ -2,14 +2,15 @@ import React from 'react';
2
2
  import ScrollView from 'devextreme-react/scroll-view';
3
3
  import './single-card.scss';
4
4
 
5
- export default ({ title, description, children }) => (
6
- <ScrollView height={'100%'} width={'100%'} className={'with-footer single-card'}>
7
- <div className={'dx-card content'}>
8
- <div className={'header'}>
9
- <div className={'title'}>{title}</div>
10
- <div className={'description'}>{description}</div>
5
+ export default function SingleCard({ title, description, children }) {
6
+ return (
7
+ <ScrollView height={'100%'} width={'100%'} className={'with-footer single-card'}>
8
+ <div className={'dx-card content'}>
9
+ <div className={'header'}>
10
+ <div className={'title'}>{title}</div>
11
+ <div className={'description'}>{description}</div>
12
+ </div>
13
+ {children}
11
14
  </div>
12
- {children}
13
- </div>
14
- </ScrollView>
15
- );
15
+ </ScrollView>
16
+ )}
@@ -1,53 +1,54 @@
1
1
  import React from 'react';
2
2
  import './home.scss';
3
3
 
4
- export default () => (
5
- <React.Fragment>
6
- <h2 className={'content-block'}>Home</h2>
7
- <div className={'content-block'}>
8
- <div className={'dx-card responsive-paddings'}>
9
- <div className={'logos-container'}>
10
- <svg className={'devextreme-logo'} viewBox={'0 0 200 34'} fill={'none'} xmlns={'http://www.w3.org/2000/svg'}>
11
- <path d={'M21.269 16.6304C21.269 21.9331 20.1851 25.9907 18.0171 28.8032C15.8638 31.6011 12.7583 33 8.70068 33H0.834473V0.875977H9.42578C13.1611 0.875977 16.0688 2.26025 18.1489 5.02881C20.229 7.78271 21.269 11.6499 21.269 16.6304ZM15.1387 16.8062C15.1387 9.62842 13.1611 6.03955 9.20605 6.03955H6.81104V27.7705H8.74463C10.9272 27.7705 12.5386 26.8623 13.5786 25.0459C14.6187 23.2148 15.1387 20.4683 15.1387 16.8062ZM33.7504 33.4395C30.6889 33.4395 28.2719 32.3555 26.4994 30.1875C24.7416 28.0049 23.8627 24.9214 23.8627 20.937C23.8627 16.894 24.661 13.7373 26.2577 11.4668C27.8544 9.19629 30.081 8.06104 32.9374 8.06104C35.6034 8.06104 37.7055 9.03516 39.2436 10.9834C40.7816 12.917 41.5507 15.6343 41.5507 19.1353V22.2554H29.7953C29.8393 24.438 30.286 26.064 31.1356 27.1333C31.9853 28.188 33.1571 28.7153 34.6513 28.7153C36.5556 28.7153 38.5038 28.1221 40.496 26.9355V31.7476C38.621 32.8755 36.3725 33.4395 33.7504 33.4395ZM32.8935 12.5654C32.0585 12.5654 31.37 13.0122 30.828 13.9058C30.286 14.7847 29.9711 16.1543 29.8832 18.0146H35.8158C35.7865 16.2275 35.5155 14.8726 35.0028 13.9497C34.4901 13.0269 33.787 12.5654 32.8935 12.5654ZM48.429 33L42.035 8.52246H48.0994L51.2195 22.6948C51.3514 23.354 51.5052 24.3208 51.681 25.5952C51.8714 26.855 51.9886 27.7632 52.0325 28.3198H52.1204C52.1351 27.8804 52.1937 27.2505 52.2962 26.4302C52.4134 25.6099 52.5306 24.8555 52.6478 24.167C52.7649 23.4785 53.8929 18.2637 56.0315 8.52246H62.096L55.68 33H48.429ZM78.5324 33H64.0524V0.875977H78.5324V6.03955H70.029V13.686H77.9172V18.8716H70.029V27.7705H78.5324V33ZM86.1798 20.4976L80.0714 8.52246H86.1358L89.3878 15.9932L92.398 8.52246H98.4186L92.2662 20.4976L98.6822 33H92.5738L89.1021 25.1777L85.8722 33H79.7857L86.1798 20.4976ZM109.12 28.4956C109.94 28.4956 110.827 28.2905 111.779 27.8804V32.4507C110.827 33.1099 109.398 33.4395 107.494 33.4395C105.37 33.4395 103.795 32.8096 102.77 31.5498C101.745 30.2754 101.232 28.3711 101.232 25.8369V13.1587H98.8589V10.5439L101.913 8.43457L103.407 3.24902H107.143V8.52246H111.581V13.1587H107.143V26.0347C107.143 27.6753 107.802 28.4956 109.12 28.4956ZM124.744 8.06104C125.461 8.06104 126.164 8.1709 126.853 8.39062L126.172 14.0596C125.762 13.9131 125.227 13.8398 124.568 13.8398C123.147 13.8398 122.056 14.4038 121.294 15.5317C120.532 16.645 120.151 18.271 120.151 20.4097V33H114.307V8.52246H119.119L119.778 12.3457H119.975C120.62 10.8076 121.323 9.70898 122.085 9.0498C122.847 8.39062 123.733 8.06104 124.744 8.06104ZM137.598 33.4395C134.537 33.4395 132.12 32.3555 130.347 30.1875C128.59 28.0049 127.711 24.9214 127.711 20.937C127.711 16.894 128.509 13.7373 130.106 11.4668C131.702 9.19629 133.929 8.06104 136.785 8.06104C139.451 8.06104 141.554 9.03516 143.092 10.9834C144.63 12.917 145.399 15.6343 145.399 19.1353V22.2554H133.643C133.687 24.438 134.134 26.064 134.984 27.1333C135.833 28.188 137.005 28.7153 138.499 28.7153C140.404 28.7153 142.352 28.1221 144.344 26.9355V31.7476C142.469 32.8755 140.221 33.4395 137.598 33.4395ZM136.742 12.5654C135.907 12.5654 135.218 13.0122 134.676 13.9058C134.134 14.7847 133.819 16.1543 133.731 18.0146H139.664C139.635 16.2275 139.364 14.8726 138.851 13.9497C138.338 13.0269 137.635 12.5654 136.742 12.5654ZM172.668 33V18.4102C172.668 14.8213 171.781 13.0269 170.009 13.0269C168.72 13.0269 167.797 13.6714 167.24 14.9604C166.684 16.2349 166.405 18.2856 166.405 21.1128V33H160.517V18.4102C160.517 14.8213 159.616 13.0269 157.814 13.0269C156.554 13.0269 155.639 13.6641 155.068 14.9385C154.496 16.2129 154.211 18.3149 154.211 21.2446V33H148.366V8.52246H153.002L153.705 11.6646H154.079C154.665 10.4194 155.463 9.51123 156.474 8.93994C157.499 8.354 158.591 8.06104 159.748 8.06104C162.736 8.06104 164.728 9.47461 165.724 12.3018H165.944C167.189 9.47461 169.189 8.06104 171.943 8.06104C174.111 8.06104 175.751 8.82275 176.864 10.3462C177.992 11.8696 178.556 14.0962 178.556 17.0259V33H172.668ZM191.433 33.4395C188.372 33.4395 185.955 32.3555 184.182 30.1875C182.424 28.0049 181.546 24.9214 181.546 20.937C181.546 16.894 182.344 13.7373 183.941 11.4668C185.537 9.19629 187.764 8.06104 190.62 8.06104C193.286 8.06104 195.388 9.03516 196.926 10.9834C198.464 12.917 199.233 15.6343 199.233 19.1353V22.2554H187.478C187.522 24.438 187.969 26.064 188.818 27.1333C189.668 28.188 190.84 28.7153 192.334 28.7153C194.238 28.7153 196.187 28.1221 198.179 26.9355V31.7476C196.304 32.8755 194.055 33.4395 191.433 33.4395ZM190.576 12.5654C189.741 12.5654 189.053 13.0122 188.511 13.9058C187.969 14.7847 187.654 16.1543 187.566 18.0146H193.499C193.469 16.2275 193.198 14.8726 192.686 13.9497C192.173 13.0269 191.47 12.5654 190.576 12.5654Z'} fill={'#F05B41'} />
12
- </svg>
13
- <svg className ={'plus'} viewBox={'0 0 22 22'} fill={'none'} xmlns={'http://www.w3.org/2000/svg'}>
14
- <path d={'M21.6309 13.3433H13.1714V21.8027H8.73291V13.3433H0.229492V8.88281H8.73291V0.379395H13.1714V8.88281H21.6309V13.3433Z'} fill={'#BCBCBC'} />
15
- </svg>
16
- <svg className={'react-logo'} viewBox={'0 0 184 62'} xmlns={'http://www.w3.org/2000/svg'}>
17
- <circle fill={'#6FCEEF'} cx={'34.6'} cy={'30.4'} r={'6'} /><path fill={'#6FCEEF'} d={'M68.1,30.4c0-4.8-5.4-8.9-14-11.3c0.3-1.3,0.6-2.5,0.8-3.7c1.1-7-0.1-12-3.5-14c-3.4-2-8.3-0.6-13.9,3.9c-0.9,0.8-1.9,1.6-2.8,2.6C28.3,1.7,22-1,17.9,1.4c-4.1,2.4-5,9.1-2.8,17.7c-8.6,2.4-14,6.5-14,11.3s5.4,8.8,14,11.3c-2.2,8.6-1.4,15.3,2.8,17.7c1,0.6,2.2,0.9,3.4,0.9c3.8,0,8.5-2.7,13.4-7.4c0.9,0.9,1.9,1.8,2.8,2.6c3.9,3.2,7.5,4.8,10.5,4.8c1.2,0,2.4-0.3,3.4-0.9c4.1-2.4,5-9.1,2.8-17.7C62.7,39.3,68.1,35.2,68.1,30.4z M39.4,7.7c3.3-2.7,6.3-4.1,8.5-4.1c0.7,0,1.4,0.2,1.9,0.5c2.2,1.3,3,5.3,2.1,10.9c-0.2,1.1-0.4,2.3-0.7,3.5c-2.7-0.6-5.7-1.1-8.9-1.3c-1.8-2.6-3.7-4.9-5.6-7C37.6,9.2,38.5,8.4,39.4,7.7z M43.9,35.8c-1,1.8-2.1,3.5-3.2,5.1c-1.9,0.1-4,0.2-6.1,0.2c-2.1,0-4.1-0.1-6.1-0.2c-1.1-1.6-2.2-3.4-3.2-5.1c-1-1.8-2-3.6-2.8-5.4c0.8-1.8,1.8-3.5,2.8-5.4c1-1.8,2.1-3.5,3.2-5.1c1.9-0.1,4-0.2,6.1-0.2c2.1,0,4.1,0.1,6.1,0.2c1.1,1.6,2.2,3.3,3.2,5.1c1,1.8,2,3.6,2.8,5.4C45.9,32.2,44.9,34,43.9,35.8z M48.3,33.9c0.8,1.9,1.5,3.8,2,5.6c-1.8,0.4-3.8,0.8-5.9,1c0.7-1.1,1.3-2.1,2-3.3C47.2,36.2,47.8,35.1,48.3,33.9z M34.6,48.6c-1.3-1.4-2.6-2.9-3.8-4.5c1.2,0.1,2.5,0.1,3.8,0.1c1.3,0,2.6,0,3.8-0.1C37.2,45.7,35.9,47.2,34.6,48.6z M24.7,40.5c-2.1-0.3-4-0.6-5.9-1c0.6-1.8,1.2-3.6,2-5.6c0.6,1.1,1.2,2.2,1.8,3.3C23.4,38.4,24.1,39.5,24.7,40.5z M20.9,26.9c-0.8-1.9-1.5-3.8-2-5.6c1.8-0.4,3.8-0.8,5.9-1c-0.7,1.1-1.3,2.1-2,3.3C22.1,24.7,21.5,25.8,20.9,26.9z M34.6,12.2c1.3,1.4,2.5,2.9,3.8,4.6c-1.2-0.1-2.5-0.1-3.8-0.1c-1.3,0-2.5,0-3.8,0.1C32.1,15.2,33.4,13.6,34.6,12.2z M46.5,23.6c-0.6-1.1-1.3-2.2-2-3.2c2.1,0.3,4,0.6,5.8,1c-0.6,1.8-1.2,3.7-2,5.6C47.8,25.8,47.2,24.7,46.5,23.6z M19.4,4c0.5-0.3,1.2-0.5,1.9-0.5c2.8,0,6.9,2.3,11.3,6.5c-1.9,2.1-3.8,4.4-5.6,6.9c-3.2,0.3-6.2,0.7-8.9,1.3C16.2,11,16.8,5.5,19.4,4z M4.1,30.4c0-3,4.4-6.2,11.8-8.3c0.8,2.7,1.9,5.5,3.3,8.3c-1.3,2.9-2.4,5.7-3.3,8.3C8.6,36.7,4.1,33.4,4.1,30.4z M19.4,56.8c-2.6-1.5-3.2-6.9-1.3-14.4c2.7,0.6,5.7,1.1,8.9,1.3c1.8,2.5,3.7,4.9,5.6,7C27,56.1,22,58.3,19.4,56.8z M49.9,56.8c-2.2,1.3-6-0.1-10.5-3.7c-0.9-0.7-1.8-1.5-2.6-2.4c1.9-2,3.8-4.4,5.6-7c3.2-0.3,6.1-0.7,8.9-1.3C53.1,49.9,52.5,55.3,49.9,56.8z M53.3,38.8c-0.8-2.7-1.9-5.5-3.3-8.4c1.3-2.8,2.4-5.6,3.2-8.3c7.4,2.1,11.8,5.3,11.8,8.4C65.1,33.4,60.7,36.7,53.3,38.8z'} /><g><path fill={'#6FCEEF'} d={'M79.2,31.8v10.8h-5.4v-27H84c3.1,0,5.5,0.7,7.2,2.1c1.7,1.4,2.6,3.4,2.6,5.9c0,1.4-0.4,2.6-1.1,3.6c-0.7,1-1.8,1.8-3.2,2.4c1.6,0.5,2.7,1.3,3.4,2.4c0.7,1.1,1,2.5,1,4.1v2c0,0.8,0.1,1.5,0.3,2.4c0.2,0.8,0.6,1.4,1,1.8v0.4h-5.6c-0.5-0.4-0.8-1.1-1-2s-0.2-1.8-0.2-2.6v-1.9c0-1.3-0.4-2.4-1.1-3.1c-0.7-0.7-1.8-1.1-3.1-1.1H79.2z M79.2,27.7h4.7c1.5,0,2.7-0.3,3.4-1c0.7-0.6,1.1-1.6,1.1-2.9c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.9-1.1-3.3-1.1h-4.8V27.7z'} /><path fill={'#6FCEEF'} d={'M107.3,43c-2.9,0-5.2-0.9-6.9-2.8c-1.7-1.9-2.6-4.2-2.6-7.1v-0.7c0-3,0.8-5.4,2.5-7.4c1.6-1.9,3.8-2.9,6.6-2.9c2.7,0,4.8,0.8,6.3,2.4c1.5,1.6,2.2,3.8,2.2,6.6v3h-12l0,0.1c0.1,1.3,0.5,2.4,1.3,3.3c0.8,0.9,1.9,1.3,3.2,1.3c1.2,0,2.2-0.1,3-0.4c0.8-0.2,1.7-0.6,2.6-1.1l1.5,3.3c-0.8,0.7-1.9,1.2-3.2,1.7C110.4,42.8,109,43,107.3,43z M106.9,26.4c-1,0-1.8,0.4-2.4,1.2c-0.6,0.8-0.9,1.8-1.1,3l0.1,0.1h6.6v-0.5c0-1.2-0.3-2.1-0.8-2.8C108.8,26.7,108,26.4,106.9,26.4z'} /><path fill={'#6FCEEF'} d={'M130.4,42.6c-0.2-0.5-0.4-0.9-0.5-1.4c-0.1-0.5-0.2-1-0.3-1.6c-0.6,1-1.3,1.8-2.2,2.4c-0.9,0.6-2,1-3.3,1c-2.1,0-3.7-0.5-4.9-1.6c-1.1-1.1-1.7-2.6-1.7-4.4c0-2,0.8-3.5,2.3-4.6c1.5-1.1,3.7-1.6,6.6-1.6h3v-1.6c0-1-0.3-1.7-0.8-2.2c-0.5-0.5-1.3-0.8-2.2-0.8c-0.9,0-1.6,0.2-2,0.6c-0.5,0.4-0.7,1-0.7,1.8l-5.2,0l0-0.1c-0.1-1.7,0.6-3.2,2.2-4.4c1.6-1.2,3.6-1.8,6.1-1.8c2.4,0,4.3,0.6,5.8,1.8c1.5,1.2,2.2,3,2.2,5.2v8.3c0,0.9,0.1,1.8,0.2,2.7c0.1,0.8,0.4,1.7,0.7,2.5H130.4z M125.4,39c1,0,1.8-0.2,2.5-0.7c0.7-0.5,1.2-1,1.5-1.6v-2.8h-3c-1.2,0-2,0.3-2.6,0.9c-0.6,0.6-0.9,1.3-0.9,2.1c0,0.7,0.2,1.2,0.7,1.6S124.6,39,125.4,39z'} /><path fill={'#6FCEEF'} d={'M147.4,38.9c1,0,1.7-0.3,2.3-0.8c0.6-0.6,0.9-1.3,0.9-2.2h4.9l0.1,0.1c0,2-0.7,3.7-2.3,5.1c-1.6,1.4-3.5,2-5.9,2c-3,0-5.3-0.9-6.9-2.8c-1.6-1.9-2.4-4.3-2.4-7.3v-0.6c0-3,0.8-5.4,2.4-7.3c1.6-1.9,3.9-2.9,6.9-2.9c2.5,0,4.5,0.7,6,2.1c1.5,1.4,2.2,3.3,2.2,5.6l0,0.1h-4.9c0-1-0.3-1.9-0.9-2.6c-0.6-0.7-1.4-1-2.4-1c-1.4,0-2.4,0.6-3,1.7c-0.6,1.1-0.9,2.5-0.9,4.3v0.6c0,1.8,0.3,3.2,0.9,4.3C144.9,38.3,146,38.9,147.4,38.9z'} /><path fill={'#6FCEEF'} d={'M165.1,17.6v4.9h3.4v3.8h-3.4v10.2c0,0.8,0.2,1.3,0.5,1.7c0.3,0.3,0.8,0.5,1.3,0.5c0.3,0,0.5,0,0.7,0c0.2,0,0.4-0.1,0.7-0.2l0.5,3.9c-0.5,0.2-1.1,0.3-1.6,0.4c-0.5,0.1-1.1,0.1-1.7,0.1c-1.9,0-3.3-0.5-4.3-1.5c-1-1-1.5-2.7-1.5-4.9V26.4h-2.9v-3.8h2.9v-4.9H165.1z'} /></g>
18
- </svg>
19
- </div>
4
+ export default function Home() {
5
+ return (
6
+ <React.Fragment>
7
+ <h2 className={'content-block'}>Home</h2>
8
+ <div className={'content-block'}>
9
+ <div className={'dx-card responsive-paddings'}>
10
+ <div className={'logos-container'}>
11
+ <svg className={'devextreme-logo'} viewBox={'0 0 200 34'} fill={'none'} xmlns={'http://www.w3.org/2000/svg'}>
12
+ <path d={'M21.269 16.6304C21.269 21.9331 20.1851 25.9907 18.0171 28.8032C15.8638 31.6011 12.7583 33 8.70068 33H0.834473V0.875977H9.42578C13.1611 0.875977 16.0688 2.26025 18.1489 5.02881C20.229 7.78271 21.269 11.6499 21.269 16.6304ZM15.1387 16.8062C15.1387 9.62842 13.1611 6.03955 9.20605 6.03955H6.81104V27.7705H8.74463C10.9272 27.7705 12.5386 26.8623 13.5786 25.0459C14.6187 23.2148 15.1387 20.4683 15.1387 16.8062ZM33.7504 33.4395C30.6889 33.4395 28.2719 32.3555 26.4994 30.1875C24.7416 28.0049 23.8627 24.9214 23.8627 20.937C23.8627 16.894 24.661 13.7373 26.2577 11.4668C27.8544 9.19629 30.081 8.06104 32.9374 8.06104C35.6034 8.06104 37.7055 9.03516 39.2436 10.9834C40.7816 12.917 41.5507 15.6343 41.5507 19.1353V22.2554H29.7953C29.8393 24.438 30.286 26.064 31.1356 27.1333C31.9853 28.188 33.1571 28.7153 34.6513 28.7153C36.5556 28.7153 38.5038 28.1221 40.496 26.9355V31.7476C38.621 32.8755 36.3725 33.4395 33.7504 33.4395ZM32.8935 12.5654C32.0585 12.5654 31.37 13.0122 30.828 13.9058C30.286 14.7847 29.9711 16.1543 29.8832 18.0146H35.8158C35.7865 16.2275 35.5155 14.8726 35.0028 13.9497C34.4901 13.0269 33.787 12.5654 32.8935 12.5654ZM48.429 33L42.035 8.52246H48.0994L51.2195 22.6948C51.3514 23.354 51.5052 24.3208 51.681 25.5952C51.8714 26.855 51.9886 27.7632 52.0325 28.3198H52.1204C52.1351 27.8804 52.1937 27.2505 52.2962 26.4302C52.4134 25.6099 52.5306 24.8555 52.6478 24.167C52.7649 23.4785 53.8929 18.2637 56.0315 8.52246H62.096L55.68 33H48.429ZM78.5324 33H64.0524V0.875977H78.5324V6.03955H70.029V13.686H77.9172V18.8716H70.029V27.7705H78.5324V33ZM86.1798 20.4976L80.0714 8.52246H86.1358L89.3878 15.9932L92.398 8.52246H98.4186L92.2662 20.4976L98.6822 33H92.5738L89.1021 25.1777L85.8722 33H79.7857L86.1798 20.4976ZM109.12 28.4956C109.94 28.4956 110.827 28.2905 111.779 27.8804V32.4507C110.827 33.1099 109.398 33.4395 107.494 33.4395C105.37 33.4395 103.795 32.8096 102.77 31.5498C101.745 30.2754 101.232 28.3711 101.232 25.8369V13.1587H98.8589V10.5439L101.913 8.43457L103.407 3.24902H107.143V8.52246H111.581V13.1587H107.143V26.0347C107.143 27.6753 107.802 28.4956 109.12 28.4956ZM124.744 8.06104C125.461 8.06104 126.164 8.1709 126.853 8.39062L126.172 14.0596C125.762 13.9131 125.227 13.8398 124.568 13.8398C123.147 13.8398 122.056 14.4038 121.294 15.5317C120.532 16.645 120.151 18.271 120.151 20.4097V33H114.307V8.52246H119.119L119.778 12.3457H119.975C120.62 10.8076 121.323 9.70898 122.085 9.0498C122.847 8.39062 123.733 8.06104 124.744 8.06104ZM137.598 33.4395C134.537 33.4395 132.12 32.3555 130.347 30.1875C128.59 28.0049 127.711 24.9214 127.711 20.937C127.711 16.894 128.509 13.7373 130.106 11.4668C131.702 9.19629 133.929 8.06104 136.785 8.06104C139.451 8.06104 141.554 9.03516 143.092 10.9834C144.63 12.917 145.399 15.6343 145.399 19.1353V22.2554H133.643C133.687 24.438 134.134 26.064 134.984 27.1333C135.833 28.188 137.005 28.7153 138.499 28.7153C140.404 28.7153 142.352 28.1221 144.344 26.9355V31.7476C142.469 32.8755 140.221 33.4395 137.598 33.4395ZM136.742 12.5654C135.907 12.5654 135.218 13.0122 134.676 13.9058C134.134 14.7847 133.819 16.1543 133.731 18.0146H139.664C139.635 16.2275 139.364 14.8726 138.851 13.9497C138.338 13.0269 137.635 12.5654 136.742 12.5654ZM172.668 33V18.4102C172.668 14.8213 171.781 13.0269 170.009 13.0269C168.72 13.0269 167.797 13.6714 167.24 14.9604C166.684 16.2349 166.405 18.2856 166.405 21.1128V33H160.517V18.4102C160.517 14.8213 159.616 13.0269 157.814 13.0269C156.554 13.0269 155.639 13.6641 155.068 14.9385C154.496 16.2129 154.211 18.3149 154.211 21.2446V33H148.366V8.52246H153.002L153.705 11.6646H154.079C154.665 10.4194 155.463 9.51123 156.474 8.93994C157.499 8.354 158.591 8.06104 159.748 8.06104C162.736 8.06104 164.728 9.47461 165.724 12.3018H165.944C167.189 9.47461 169.189 8.06104 171.943 8.06104C174.111 8.06104 175.751 8.82275 176.864 10.3462C177.992 11.8696 178.556 14.0962 178.556 17.0259V33H172.668ZM191.433 33.4395C188.372 33.4395 185.955 32.3555 184.182 30.1875C182.424 28.0049 181.546 24.9214 181.546 20.937C181.546 16.894 182.344 13.7373 183.941 11.4668C185.537 9.19629 187.764 8.06104 190.62 8.06104C193.286 8.06104 195.388 9.03516 196.926 10.9834C198.464 12.917 199.233 15.6343 199.233 19.1353V22.2554H187.478C187.522 24.438 187.969 26.064 188.818 27.1333C189.668 28.188 190.84 28.7153 192.334 28.7153C194.238 28.7153 196.187 28.1221 198.179 26.9355V31.7476C196.304 32.8755 194.055 33.4395 191.433 33.4395ZM190.576 12.5654C189.741 12.5654 189.053 13.0122 188.511 13.9058C187.969 14.7847 187.654 16.1543 187.566 18.0146H193.499C193.469 16.2275 193.198 14.8726 192.686 13.9497C192.173 13.0269 191.47 12.5654 190.576 12.5654Z'} fill={'#F05B41'} />
13
+ </svg>
14
+ <svg className ={'plus'} viewBox={'0 0 22 22'} fill={'none'} xmlns={'http://www.w3.org/2000/svg'}>
15
+ <path d={'M21.6309 13.3433H13.1714V21.8027H8.73291V13.3433H0.229492V8.88281H8.73291V0.379395H13.1714V8.88281H21.6309V13.3433Z'} fill={'#BCBCBC'} />
16
+ </svg>
17
+ <svg className={'react-logo'} viewBox={'0 0 184 62'} xmlns={'http://www.w3.org/2000/svg'}>
18
+ <circle fill={'#6FCEEF'} cx={'34.6'} cy={'30.4'} r={'6'} /><path fill={'#6FCEEF'} d={'M68.1,30.4c0-4.8-5.4-8.9-14-11.3c0.3-1.3,0.6-2.5,0.8-3.7c1.1-7-0.1-12-3.5-14c-3.4-2-8.3-0.6-13.9,3.9c-0.9,0.8-1.9,1.6-2.8,2.6C28.3,1.7,22-1,17.9,1.4c-4.1,2.4-5,9.1-2.8,17.7c-8.6,2.4-14,6.5-14,11.3s5.4,8.8,14,11.3c-2.2,8.6-1.4,15.3,2.8,17.7c1,0.6,2.2,0.9,3.4,0.9c3.8,0,8.5-2.7,13.4-7.4c0.9,0.9,1.9,1.8,2.8,2.6c3.9,3.2,7.5,4.8,10.5,4.8c1.2,0,2.4-0.3,3.4-0.9c4.1-2.4,5-9.1,2.8-17.7C62.7,39.3,68.1,35.2,68.1,30.4z M39.4,7.7c3.3-2.7,6.3-4.1,8.5-4.1c0.7,0,1.4,0.2,1.9,0.5c2.2,1.3,3,5.3,2.1,10.9c-0.2,1.1-0.4,2.3-0.7,3.5c-2.7-0.6-5.7-1.1-8.9-1.3c-1.8-2.6-3.7-4.9-5.6-7C37.6,9.2,38.5,8.4,39.4,7.7z M43.9,35.8c-1,1.8-2.1,3.5-3.2,5.1c-1.9,0.1-4,0.2-6.1,0.2c-2.1,0-4.1-0.1-6.1-0.2c-1.1-1.6-2.2-3.4-3.2-5.1c-1-1.8-2-3.6-2.8-5.4c0.8-1.8,1.8-3.5,2.8-5.4c1-1.8,2.1-3.5,3.2-5.1c1.9-0.1,4-0.2,6.1-0.2c2.1,0,4.1,0.1,6.1,0.2c1.1,1.6,2.2,3.3,3.2,5.1c1,1.8,2,3.6,2.8,5.4C45.9,32.2,44.9,34,43.9,35.8z M48.3,33.9c0.8,1.9,1.5,3.8,2,5.6c-1.8,0.4-3.8,0.8-5.9,1c0.7-1.1,1.3-2.1,2-3.3C47.2,36.2,47.8,35.1,48.3,33.9z M34.6,48.6c-1.3-1.4-2.6-2.9-3.8-4.5c1.2,0.1,2.5,0.1,3.8,0.1c1.3,0,2.6,0,3.8-0.1C37.2,45.7,35.9,47.2,34.6,48.6z M24.7,40.5c-2.1-0.3-4-0.6-5.9-1c0.6-1.8,1.2-3.6,2-5.6c0.6,1.1,1.2,2.2,1.8,3.3C23.4,38.4,24.1,39.5,24.7,40.5z M20.9,26.9c-0.8-1.9-1.5-3.8-2-5.6c1.8-0.4,3.8-0.8,5.9-1c-0.7,1.1-1.3,2.1-2,3.3C22.1,24.7,21.5,25.8,20.9,26.9z M34.6,12.2c1.3,1.4,2.5,2.9,3.8,4.6c-1.2-0.1-2.5-0.1-3.8-0.1c-1.3,0-2.5,0-3.8,0.1C32.1,15.2,33.4,13.6,34.6,12.2z M46.5,23.6c-0.6-1.1-1.3-2.2-2-3.2c2.1,0.3,4,0.6,5.8,1c-0.6,1.8-1.2,3.7-2,5.6C47.8,25.8,47.2,24.7,46.5,23.6z M19.4,4c0.5-0.3,1.2-0.5,1.9-0.5c2.8,0,6.9,2.3,11.3,6.5c-1.9,2.1-3.8,4.4-5.6,6.9c-3.2,0.3-6.2,0.7-8.9,1.3C16.2,11,16.8,5.5,19.4,4z M4.1,30.4c0-3,4.4-6.2,11.8-8.3c0.8,2.7,1.9,5.5,3.3,8.3c-1.3,2.9-2.4,5.7-3.3,8.3C8.6,36.7,4.1,33.4,4.1,30.4z M19.4,56.8c-2.6-1.5-3.2-6.9-1.3-14.4c2.7,0.6,5.7,1.1,8.9,1.3c1.8,2.5,3.7,4.9,5.6,7C27,56.1,22,58.3,19.4,56.8z M49.9,56.8c-2.2,1.3-6-0.1-10.5-3.7c-0.9-0.7-1.8-1.5-2.6-2.4c1.9-2,3.8-4.4,5.6-7c3.2-0.3,6.1-0.7,8.9-1.3C53.1,49.9,52.5,55.3,49.9,56.8z M53.3,38.8c-0.8-2.7-1.9-5.5-3.3-8.4c1.3-2.8,2.4-5.6,3.2-8.3c7.4,2.1,11.8,5.3,11.8,8.4C65.1,33.4,60.7,36.7,53.3,38.8z'} /><g><path fill={'#6FCEEF'} d={'M79.2,31.8v10.8h-5.4v-27H84c3.1,0,5.5,0.7,7.2,2.1c1.7,1.4,2.6,3.4,2.6,5.9c0,1.4-0.4,2.6-1.1,3.6c-0.7,1-1.8,1.8-3.2,2.4c1.6,0.5,2.7,1.3,3.4,2.4c0.7,1.1,1,2.5,1,4.1v2c0,0.8,0.1,1.5,0.3,2.4c0.2,0.8,0.6,1.4,1,1.8v0.4h-5.6c-0.5-0.4-0.8-1.1-1-2s-0.2-1.8-0.2-2.6v-1.9c0-1.3-0.4-2.4-1.1-3.1c-0.7-0.7-1.8-1.1-3.1-1.1H79.2z M79.2,27.7h4.7c1.5,0,2.7-0.3,3.4-1c0.7-0.6,1.1-1.6,1.1-2.9c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.9-1.1-3.3-1.1h-4.8V27.7z'} /><path fill={'#6FCEEF'} d={'M107.3,43c-2.9,0-5.2-0.9-6.9-2.8c-1.7-1.9-2.6-4.2-2.6-7.1v-0.7c0-3,0.8-5.4,2.5-7.4c1.6-1.9,3.8-2.9,6.6-2.9c2.7,0,4.8,0.8,6.3,2.4c1.5,1.6,2.2,3.8,2.2,6.6v3h-12l0,0.1c0.1,1.3,0.5,2.4,1.3,3.3c0.8,0.9,1.9,1.3,3.2,1.3c1.2,0,2.2-0.1,3-0.4c0.8-0.2,1.7-0.6,2.6-1.1l1.5,3.3c-0.8,0.7-1.9,1.2-3.2,1.7C110.4,42.8,109,43,107.3,43z M106.9,26.4c-1,0-1.8,0.4-2.4,1.2c-0.6,0.8-0.9,1.8-1.1,3l0.1,0.1h6.6v-0.5c0-1.2-0.3-2.1-0.8-2.8C108.8,26.7,108,26.4,106.9,26.4z'} /><path fill={'#6FCEEF'} d={'M130.4,42.6c-0.2-0.5-0.4-0.9-0.5-1.4c-0.1-0.5-0.2-1-0.3-1.6c-0.6,1-1.3,1.8-2.2,2.4c-0.9,0.6-2,1-3.3,1c-2.1,0-3.7-0.5-4.9-1.6c-1.1-1.1-1.7-2.6-1.7-4.4c0-2,0.8-3.5,2.3-4.6c1.5-1.1,3.7-1.6,6.6-1.6h3v-1.6c0-1-0.3-1.7-0.8-2.2c-0.5-0.5-1.3-0.8-2.2-0.8c-0.9,0-1.6,0.2-2,0.6c-0.5,0.4-0.7,1-0.7,1.8l-5.2,0l0-0.1c-0.1-1.7,0.6-3.2,2.2-4.4c1.6-1.2,3.6-1.8,6.1-1.8c2.4,0,4.3,0.6,5.8,1.8c1.5,1.2,2.2,3,2.2,5.2v8.3c0,0.9,0.1,1.8,0.2,2.7c0.1,0.8,0.4,1.7,0.7,2.5H130.4z M125.4,39c1,0,1.8-0.2,2.5-0.7c0.7-0.5,1.2-1,1.5-1.6v-2.8h-3c-1.2,0-2,0.3-2.6,0.9c-0.6,0.6-0.9,1.3-0.9,2.1c0,0.7,0.2,1.2,0.7,1.6S124.6,39,125.4,39z'} /><path fill={'#6FCEEF'} d={'M147.4,38.9c1,0,1.7-0.3,2.3-0.8c0.6-0.6,0.9-1.3,0.9-2.2h4.9l0.1,0.1c0,2-0.7,3.7-2.3,5.1c-1.6,1.4-3.5,2-5.9,2c-3,0-5.3-0.9-6.9-2.8c-1.6-1.9-2.4-4.3-2.4-7.3v-0.6c0-3,0.8-5.4,2.4-7.3c1.6-1.9,3.9-2.9,6.9-2.9c2.5,0,4.5,0.7,6,2.1c1.5,1.4,2.2,3.3,2.2,5.6l0,0.1h-4.9c0-1-0.3-1.9-0.9-2.6c-0.6-0.7-1.4-1-2.4-1c-1.4,0-2.4,0.6-3,1.7c-0.6,1.1-0.9,2.5-0.9,4.3v0.6c0,1.8,0.3,3.2,0.9,4.3C144.9,38.3,146,38.9,147.4,38.9z'} /><path fill={'#6FCEEF'} d={'M165.1,17.6v4.9h3.4v3.8h-3.4v10.2c0,0.8,0.2,1.3,0.5,1.7c0.3,0.3,0.8,0.5,1.3,0.5c0.3,0,0.5,0,0.7,0c0.2,0,0.4-0.1,0.7-0.2l0.5,3.9c-0.5,0.2-1.1,0.3-1.6,0.4c-0.5,0.1-1.1,0.1-1.7,0.1c-1.9,0-3.3-0.5-4.3-1.5c-1-1-1.5-2.7-1.5-4.9V26.4h-2.9v-3.8h2.9v-4.9H165.1z'} /></g>
19
+ </svg>
20
+ </div>
21
+
22
+ <p>Thanks for using the DevExtreme React App Template.</p>
23
+ <p>
24
+ <span>This application was built using </span>
25
+ <a href={'https://create-react-app.dev/'} target={'_blank'} rel={'noopener noreferrer'}>Create React App</a>
26
+ <span> and </span>
27
+ <a href={'https://js.devexpress.com/Documentation/Guide/Common/DevExtreme_CLI/'} target={'_blank'} rel={'noopener noreferrer'}>DevExtreme CLI</a>
28
+ <span> and includes the following DevExtreme components:</span>
29
+ </p>
30
+ <ul>
31
+ <li><a href={'https://js.devexpress.com/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/'} target={'_blank'} rel={'noopener noreferrer'}>DataGrid</a></li>
32
+ <li><a href={'https://js.devexpress.com/Documentation/Guide/Widgets/Form/Overview/'} target={'_blank'} rel={'noopener noreferrer'}>Form</a></li>
33
+ <li><a href={'https://js.devexpress.com/Documentation/Guide/Widgets/Drawer/Getting_Started_with_Navigation_Drawer/'} target={'_blank'} rel={'noopener noreferrer'}>Drawer</a></li>
34
+ </ul>
20
35
 
21
- <p>Thanks for using the DevExtreme React App Template.</p>
22
- <p>
23
- <span>This application was built using </span>
24
- <a href={'https://create-react-app.dev/'} target={'_blank'} rel={'noopener noreferrer'}>Create React App</a>
25
- <span> and </span>
26
- <a href={'https://js.devexpress.com/Documentation/Guide/Common/DevExtreme_CLI/'} target={'_blank'} rel={'noopener noreferrer'}>DevExtreme CLI</a>
27
- <span> and includes the following DevExtreme components:</span>
28
- </p>
29
- <ul>
30
- <li><a href={'https://js.devexpress.com/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/'} target={'_blank'} rel={'noopener noreferrer'}>DataGrid</a></li>
31
- <li><a href={'https://js.devexpress.com/Documentation/Guide/Widgets/Form/Overview/'} target={'_blank'} rel={'noopener noreferrer'}>Form</a></li>
32
- <li><a href={'https://js.devexpress.com/Documentation/Guide/Widgets/Drawer/Getting_Started_with_Navigation_Drawer/'} target={'_blank'} rel={'noopener noreferrer'}>Drawer</a></li>
33
- </ul>
36
+ <p>To customize your DevExtreme React application further, please refer to the following help topics:</p>
34
37
 
35
- <p>To customize your DevExtreme React application further, please refer to the following help topics:</p>
36
-
37
- <ul>
38
- <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Layouts'} target={'_blank'} rel={'noopener noreferrer'}>Layouts</a></li>
39
- <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Add_a_New_View'} target={'_blank'} rel={'noopener noreferrer'}>Add a New View</a></li>
40
- <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Configure_the_Navigation_Menu'} target={'_blank'} rel={'noopener noreferrer'}>Configure the Navigation Menu</a></li>
41
- <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Configure_Themes'} target={'_blank'} rel={'noopener noreferrer'}>Configure Themes</a></li>
42
- </ul>
38
+ <ul>
39
+ <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Layouts'} target={'_blank'} rel={'noopener noreferrer'}>Layouts</a></li>
40
+ <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Add_a_New_View'} target={'_blank'} rel={'noopener noreferrer'}>Add a New View</a></li>
41
+ <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Configure_the_Navigation_Menu'} target={'_blank'} rel={'noopener noreferrer'}>Configure the Navigation Menu</a></li>
42
+ <li><a href={'https://js.devexpress.com/Documentation/Guide/React_Components/Application_Template/#Configure_Themes'} target={'_blank'} rel={'noopener noreferrer'}>Configure Themes</a></li>
43
+ </ul>
43
44
 
44
- <p>
45
- <span>For technical content related to DevExtreme React components, feel free to explore our </span>
46
- <a href="https://js.devexpress.com/documentation/" target="_blank" rel="noopener noreferrer">online documentation</a>
47
- <span> and </span>
48
- <a href="https://js.devexpress.com/Demos/Widgetsgallery/" target="_blank" rel="noopener noreferrer">technical demos</a>.
49
- </p>
45
+ <p>
46
+ <span>For technical content related to DevExtreme React components, feel free to explore our </span>
47
+ <a href="https://js.devexpress.com/documentation/" target="_blank" rel="noopener noreferrer">online documentation</a>
48
+ <span> and </span>
49
+ <a href="https://js.devexpress.com/Demos/Widgetsgallery/" target="_blank" rel="noopener noreferrer">technical demos</a>.
50
+ </p>
51
+ </div>
50
52
  </div>
51
- </div>
52
- </React.Fragment>
53
- );
53
+ </React.Fragment>
54
+ )}
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
2
2
  import './profile.scss';
3
3
  import Form from 'devextreme-react/form';
4
4
 
5
- export default () => {
5
+ export default function Profile() {
6
6
  const [notes, setNotes] = useState(
7
7
  'Sandra is a CPA and has been our controller since 2008. She loves to interact with staff so if you`ve not met her, be certain to say hi.\r\n\r\nSandra has 2 daughters both of whom are accomplished gymnasts.'
8
8
  );
@@ -13,7 +13,7 @@ export default () => {
13
13
  Prefix: 'Mrs.',
14
14
  Position: 'Controller',
15
15
  Picture: 'images/employees/06.png',
16
- BirthDate: new Date('1974/11/15'),
16
+ BirthDate: new Date('1974/11/5'),
17
17
  HireDate: new Date('2005/05/11'),
18
18
  Notes: notes,
19
19
  Address: '4600 N Virginia Rd.'
@@ -46,7 +46,7 @@ export default () => {
46
46
  </div>
47
47
  </React.Fragment>
48
48
  );
49
- };
49
+ }
50
50
 
51
51
  const colCountByScreen = {
52
52
  xs: 1,
@@ -8,78 +8,79 @@ import DataGrid, {
8
8
  Lookup
9
9
  } from 'devextreme-react/data-grid';
10
10
 
11
- export default () => (
12
- <React.Fragment>
13
- <h2 className={'content-block'}>Tasks</h2>
11
+ export default function Task() {
12
+ return (
13
+ <React.Fragment>
14
+ <h2 className={'content-block'}>Tasks</h2>
14
15
 
15
- <DataGrid
16
- className={'dx-card wide-card'}
17
- dataSource={dataSource}
18
- showBorders={false}
19
- focusedRowEnabled={true}
20
- defaultFocusedRowIndex={0}
21
- columnAutoWidth={true}
22
- columnHidingEnabled={true}
23
- >
24
- <Paging defaultPageSize={10} />
25
- <Pager showPageSizeSelector={true} showInfo={true} />
26
- <FilterRow visible={true} />
27
-
28
- <Column dataField={'Task_ID'} width={90} hidingPriority={2} />
29
- <Column
30
- dataField={'Task_Subject'}
31
- width={190}
32
- caption={'Subject'}
33
- hidingPriority={8}
34
- />
35
- <Column
36
- dataField={'Task_Status'}
37
- caption={'Status'}
38
- hidingPriority={6}
39
- />
40
- <Column
41
- dataField={'Task_Priority'}
42
- caption={'Priority'}
43
- hidingPriority={5}
16
+ <DataGrid
17
+ className={'dx-card wide-card'}
18
+ dataSource={dataSource}
19
+ showBorders={false}
20
+ focusedRowEnabled={true}
21
+ defaultFocusedRowIndex={0}
22
+ columnAutoWidth={true}
23
+ columnHidingEnabled={true}
44
24
  >
45
- <Lookup
46
- dataSource={priorities}
47
- valueExpr={'value'}
48
- displayExpr={'name'}
25
+ <Paging defaultPageSize={10} />
26
+ <Pager showPageSizeSelector={true} showInfo={true} />
27
+ <FilterRow visible={true} />
28
+
29
+ <Column dataField={'Task_ID'} width={90} hidingPriority={2} />
30
+ <Column
31
+ dataField={'Task_Subject'}
32
+ width={190}
33
+ caption={'Subject'}
34
+ hidingPriority={8}
35
+ />
36
+ <Column
37
+ dataField={'Task_Status'}
38
+ caption={'Status'}
39
+ hidingPriority={6}
40
+ />
41
+ <Column
42
+ dataField={'Task_Priority'}
43
+ caption={'Priority'}
44
+ hidingPriority={5}
45
+ >
46
+ <Lookup
47
+ dataSource={priorities}
48
+ valueExpr={'value'}
49
+ displayExpr={'name'}
50
+ />
51
+ </Column>
52
+ <Column
53
+ dataField={'ResponsibleEmployee.Employee_Full_Name'}
54
+ caption={'Assigned To'}
55
+ allowSorting={false}
56
+ hidingPriority={7}
57
+ />
58
+ <Column
59
+ dataField={'Task_Start_Date'}
60
+ caption={'Start Date'}
61
+ dataType={'date'}
62
+ hidingPriority={3}
63
+ />
64
+ <Column
65
+ dataField={'Task_Due_Date'}
66
+ caption={'Due Date'}
67
+ dataType={'date'}
68
+ hidingPriority={4}
69
+ />
70
+ <Column
71
+ dataField={'Task_Priority'}
72
+ caption={'Priority'}
73
+ name={'Priority'}
74
+ hidingPriority={1}
75
+ />
76
+ <Column
77
+ dataField={'Task_Completion'}
78
+ caption={'Completion'}
79
+ hidingPriority={0}
49
80
  />
50
- </Column>
51
- <Column
52
- dataField={'ResponsibleEmployee.Employee_Full_Name'}
53
- caption={'Assigned To'}
54
- allowSorting={false}
55
- hidingPriority={7}
56
- />
57
- <Column
58
- dataField={'Task_Start_Date'}
59
- caption={'Start Date'}
60
- dataType={'date'}
61
- hidingPriority={3}
62
- />
63
- <Column
64
- dataField={'Task_Due_Date'}
65
- caption={'Due Date'}
66
- dataType={'date'}
67
- hidingPriority={4}
68
- />
69
- <Column
70
- dataField={'Task_Priority'}
71
- caption={'Priority'}
72
- name={'Priority'}
73
- hidingPriority={1}
74
- />
75
- <Column
76
- dataField={'Task_Completion'}
77
- caption={'Completion'}
78
- hidingPriority={0}
79
- />
80
- </DataGrid>
81
- </React.Fragment>
82
- );
81
+ </DataGrid>
82
+ </React.Fragment>
83
+ )}
83
84
 
84
85
  const dataSource = {
85
86
  store: {
@@ -38,7 +38,7 @@ export default {
38
38
  Prefix: "Mrs.",
39
39
  Position: "Controller",
40
40
  Picture: picture,
41
- BirthDate: new Date("1974/11/15"),
41
+ BirthDate: new Date("1974/11/5"),
42
42
  HireDate: new Date("2005/05/11"),
43
43
  Notes:
44
44
 
@@ -38,7 +38,7 @@ export default {
38
38
  Prefix: "Mrs.",
39
39
  Position: "Controller",
40
40
  Picture: picture,
41
- BirthDate: new Date("1974/11/15"),
41
+ BirthDate: new Date("1974/11/5"),
42
42
  HireDate: new Date("2005/05/11"),
43
43
  Notes:
44
44
  "Sandra is a CPA and has been our controller since 2008. " +
@@ -2,6 +2,7 @@ const fs = require('fs');
2
2
  const path = require('path');
3
3
  const semver = require('semver');
4
4
  const stripBom = require('strip-bom');
5
+ const importCwd = require('import-cwd');
5
6
  const packageManager = require('./utility/package-manager');
6
7
  const lock = require('./utility/file-lock');
7
8
 
@@ -11,7 +12,7 @@ const commands = {
11
12
  BUILD_META: 'export-theme-meta'
12
13
  };
13
14
 
14
- const themeBuilderPackagePath = path.join(__dirname, '..', 'node_modules', 'devextreme-themebuilder');
15
+ const themeBuilderPackagePath = path.join(process.cwd(), 'node_modules', 'devextreme-themebuilder');
15
16
 
16
17
  const scssCompiler = {
17
18
  render: (scss) => {
@@ -44,7 +45,12 @@ const createPath = filePath => {
44
45
  };
45
46
 
46
47
  const readFile = fileName => new Promise((resolve, reject) => {
47
- fs.readFile(require.resolve(fileName), 'utf8', (error, data) => {
48
+ const fullFileName = path.normalize(path.join(
49
+ themeBuilderPackagePath,
50
+ '..',
51
+ fileName
52
+ ));
53
+ fs.readFile(fullFileName, 'utf8', (error, data) => {
48
54
  error ? reject(error) : resolve(data);
49
55
  });
50
56
  });
@@ -92,58 +98,31 @@ const getMeta = (fullMeta, base, filter, baseParametersList) => {
92
98
  let universalKey = key.replace('$', '@');
93
99
  if(base && baseParametersList.indexOf(universalKey) === -1) continue;
94
100
  if(filter && filter.length > 0 && filter.indexOf(universalKey) === -1) continue;
95
- result[universalKey] = fullMeta[key];
101
+ result[key] = fullMeta[key];
96
102
  }
97
103
 
98
104
  return result;
99
105
  };
100
106
 
101
- const installThemeBuilder = async version => {
102
- const packageJsonPath = path.join(themeBuilderPackagePath, 'package.json');
103
- const cwd = path.join(__dirname, '..');
104
- const npmrc = './.npmrc';
105
- const installationNpmrc = path.join(cwd, '.npmrc');
106
- let removeNpmrc = false;
107
-
108
- if(fs.existsSync(packageJsonPath) && require(packageJsonPath).version === version) {
109
- return;
107
+ const getInstalledPackageVersion = (packageName) => {
108
+ try {
109
+ return importCwd(`${packageName}/package.json`).version;
110
+ } catch(e) {
111
+ return null;
110
112
  }
113
+ };
111
114
 
112
- if(fs.existsSync(npmrc)) {
113
- removeNpmrc = true;
114
- fs.copyFileSync(npmrc, installationNpmrc);
115
+ const installThemeBuilder = async version => {
116
+ if(getInstalledPackageVersion('devextreme-themebuilder') === version) {
117
+ return;
115
118
  }
116
119
 
117
120
  await packageManager.installPackage(`devextreme-themebuilder@${version}`, {
118
- cwd,
121
+ cwd: process.cwd(),
119
122
  stdio: 'inherit'
120
123
  }, {
121
- npm: ['--no-save']
124
+ npm: ['--no-save', '--fund=false', '--package-lock=false', '--omit=dev', '--omit=optional']
122
125
  });
123
-
124
- if(removeNpmrc) {
125
- fs.unlinkSync(installationNpmrc);
126
- }
127
- };
128
-
129
- const getDevExtremeInfo = (dependencies) => {
130
- const keyValue = Object.keys(dependencies).find((key) => /devextreme@/.test(key));
131
-
132
- return dependencies[keyValue];
133
- };
134
-
135
- const getDevExtremeVersion = (cwd) => {
136
- const dependencies = packageManager.getDependencies({ cwd });
137
- const installedDevExtremePackageJson = path.join(cwd, 'node_modules', 'devextreme', 'package.json');
138
- const devextremeInfo = dependencies && (dependencies.devextreme || getDevExtremeInfo(dependencies));
139
-
140
- if(devextremeInfo) {
141
- return devextremeInfo.version;
142
- } else if(fs.existsSync(installedDevExtremePackageJson)) {
143
- return JSON.parse(fs.readFileSync(installedDevExtremePackageJson, 'utf8')).version;
144
- }
145
-
146
- return;
147
126
  };
148
127
 
149
128
  const setWidgetsOption = (options, version) => {
@@ -165,6 +144,7 @@ const getVarsFilter = (options) => {
165
144
 
166
145
  const runThemeBuilder = async rawOptions => {
167
146
  const options = await readInput(camelize(rawOptions));
147
+ const initialItems = options.items ? [...options.items] : [];
168
148
  options.reader = readFile;
169
149
  options.sassCompiler = scssCompiler;
170
150
  options.lessCompiler = require('less/lib/less-node');
@@ -177,7 +157,7 @@ const runThemeBuilder = async rawOptions => {
177
157
  options.lessCompiler.options['rootpath'] = options.assetsBasePath;
178
158
  }
179
159
 
180
- const version = options.version || getDevExtremeVersion(process.cwd()) || 'latest';
160
+ const version = options.version || getInstalledPackageVersion('devextreme') || 'latest';
181
161
 
182
162
  await lock.acquire();
183
163
 
@@ -190,8 +170,8 @@ const runThemeBuilder = async rawOptions => {
190
170
  return;
191
171
  }
192
172
 
193
- const themeBuilder = require('devextreme-themebuilder/modules/builder');
194
- const baseParameters = require('devextreme-themebuilder/modules/base-parameters');
173
+ const themeBuilder = importCwd('devextreme-themebuilder/modules/builder');
174
+ const baseParameters = importCwd('devextreme-themebuilder/modules/base-parameters');
195
175
 
196
176
  lock.release();
197
177
 
@@ -217,27 +197,24 @@ const runThemeBuilder = async rawOptions => {
217
197
  const metadata = getMeta(result.compiledMetadata, options.base, filter, baseParameters);
218
198
 
219
199
  for(const metadataKey in metadata) {
220
- const formatKey = options.fileFormat === 'scss' ? metadataKey.replace('@', '$') : metadataKey;
200
+ const formatKey = options.fileFormat === 'scss' ?
201
+ metadataKey.replace('@', '$') :
202
+ metadataKey.replace('$', '@'); // lgtm[js/incomplete-sanitization]
221
203
  content += formatKey + ': ' + metadata[metadataKey] + ';\n';
222
204
  }
223
205
  } else if(options.command === commands.BUILD_META) {
224
206
  const metadata = getMeta(result.compiledMetadata, options.base, filter, baseParameters);
225
- let exportedMeta = [];
226
-
227
- for(const metadataKey in metadata) {
228
- exportedMeta.push({ key: metadataKey, value: metadata[metadataKey] });
229
- }
230
207
 
231
208
  const meta = {
232
209
  baseTheme: [ options.themeName, options.colorScheme.replace(/-/g, '.') ].join('.'),
233
- items: exportedMeta,
234
- version: result.version
210
+ items: initialItems.filter(item => metadata[item.key]),
211
+ version: result.version,
212
+ removeExternalResources: !!options.removeExternalResources,
213
+ outputColorScheme: options.outColorScheme,
214
+ makeSwatch: !!options.makeSwatch,
215
+ widgets: options.widgets
235
216
  };
236
217
 
237
- if(result.widgets) {
238
- Object.assign(meta, { widgets: result.widgets });
239
- }
240
-
241
218
  content = JSON.stringify(meta, ' ', 4);
242
219
  }
243
220
 
@@ -260,5 +237,5 @@ const isThemeBuilderCommand = command => {
260
237
  module.exports = {
261
238
  run: runThemeBuilder,
262
239
  isThemeBuilderCommand,
263
- getDevExtremeVersion
240
+ getInstalledPackageVersion
264
241
  };
@@ -1,8 +1,8 @@
1
1
  const packageJson = require('../../package.json');
2
2
  module.exports = {
3
- 'devextreme': '^21.1.3',
4
- 'devextreme-react': '^21.1.3',
5
- 'devextreme-vue': '^21.1.3',
3
+ 'devextreme': '^21.2.4',
4
+ 'devextreme-react': '^21.2.4',
5
+ 'devextreme-vue': '^21.2.4',
6
6
  'devextreme-cli': packageJson.version,
7
7
  'devextreme-schematics': 'latest'
8
8
  };