@24i/bigscreen-sdk 1.0.4-alpha.2098 → 1.0.4-alpha.2106

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 (139) hide show
  1. package/package.json +5 -5
  2. package/packages/create-package/dist/createPackage.js +66 -0
  3. package/packages/create-package/dist/createPackage.js.map +1 -0
  4. package/packages/create-package/dist/index.js +5 -0
  5. package/packages/create-package/dist/index.js.map +1 -0
  6. package/packages/create-package/dist/questionnaire/questions.js +35 -0
  7. package/packages/create-package/dist/questionnaire/questions.js.map +1 -0
  8. package/packages/create-package/dist/settings/Settings.js +10 -0
  9. package/packages/create-package/dist/settings/Settings.js.map +1 -0
  10. package/packages/create-package/dist/types.js +3 -0
  11. package/packages/create-package/dist/types.js.map +1 -0
  12. package/packages/developer-tools/src/EnvironmentSelection/EnvironmentList.tsx +7 -12
  13. package/packages/developer-tools/src/EnvironmentSelection/EnvironmentListItem.tsx +27 -14
  14. package/packages/developer-tools/src/EnvironmentSelection/sizes.1080.ts +3 -7
  15. package/packages/developer-tools/src/EnvironmentSelection/sizes.ts +3 -7
  16. package/packages/developer-tools/src/EnvironmentSelection/styles/EnvironmentSelection.scss +24 -4
  17. package/packages/developer-tools/src/EnvironmentSelection/styles/_sizes.1080.scss +1 -1
  18. package/packages/developer-tools/src/EnvironmentSelection/styles/_sizes.scss +2 -2
  19. package/packages/driver-base/src/loadObject.ts +1 -1
  20. package/packages/focus/src/Layout/Base.tsx +0 -1
  21. package/packages/focus/src/Layout/Horizontal.ts +3 -13
  22. package/packages/focus/src/Layout/Matrix.tsx +24 -3
  23. package/packages/focus/src/Layout/__test__/isRtl.spec.ts +23 -0
  24. package/packages/focus/src/Layout/isRtl.ts +12 -0
  25. package/packages/focus/src/Layout/types.ts +1 -0
  26. package/packages/jsx/src/forwardRef.ts +2 -2
  27. package/packages/keyboard/src/AndroidKeyboard/Keyboard.tsx +7 -0
  28. package/packages/keyboard/src/DefaultKeyboard/Keyboard.tsx +1 -0
  29. package/packages/keyboard/src/KeyboardBase.tsx +1 -0
  30. package/packages/keyboard/src/MobiKeyboard/Keyboard.tsx +11 -0
  31. package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.tsx +9 -0
  32. package/packages/keyboard/src/WhitelabelNumericKeyboard/NumericKeyboard.tsx +3 -0
  33. package/packages/mouse-navigation/src/ArrowNavigation/index.tsx +1 -1
  34. package/packages/rnv-build-engine/dist/src/constants/buildSchemes.js +14 -0
  35. package/packages/rnv-build-engine/dist/src/constants/index.js +7 -0
  36. package/packages/rnv-build-engine/dist/src/constants/platforms.js +14 -0
  37. package/packages/rnv-build-engine/dist/src/engine.js +94 -0
  38. package/packages/rnv-build-engine/dist/src/index.js +26 -0
  39. package/packages/rnv-build-engine/dist/src/resolvers/index.js +29 -0
  40. package/packages/rnv-build-engine/dist/src/resolvers/resolveBaseUrl.js +31 -0
  41. package/packages/rnv-build-engine/dist/src/resolvers/resolveBuildFileExtension.js +12 -0
  42. package/packages/rnv-build-engine/dist/src/resolvers/resolveBuildFileName.js +36 -0
  43. package/packages/rnv-build-engine/dist/src/resolvers/resolveBuildVersion.js +42 -0
  44. package/packages/rnv-build-engine/dist/src/resolvers/resolveBuildVersionOffset.js +34 -0
  45. package/packages/rnv-build-engine/dist/src/resolvers/resolveDeployLocations.js +79 -0
  46. package/packages/rnv-build-engine/dist/src/resolvers/resolveGenericRnvConfig.js +47 -0
  47. package/packages/rnv-build-engine/dist/src/resolvers/resolveHbbtvDeployConfig.js +13 -0
  48. package/packages/rnv-build-engine/dist/src/resolvers/resolveHbbtvDeployUrl.js +11 -0
  49. package/packages/rnv-build-engine/dist/src/resolvers/resolveHbbtvRemoteBuildDirRelativePath.js +24 -0
  50. package/packages/rnv-build-engine/dist/src/resolvers/resolveSupportedPlatforms.js +5 -0
  51. package/packages/rnv-build-engine/dist/src/resolvers/resolveUsedFlavours.js +23 -0
  52. package/packages/rnv-build-engine/dist/src/resolvers/resolveZippedPlatformBuildsRelativeFilePath.js +14 -0
  53. package/packages/rnv-build-engine/dist/src/scripts/buildAllWithScheme.js +25 -0
  54. package/packages/rnv-build-engine/dist/src/scripts/generateDeployUrls/formatTableDataSpaces.js +30 -0
  55. package/packages/rnv-build-engine/dist/src/scripts/generateDeployUrls/generateDeployUrls.js +90 -0
  56. package/packages/rnv-build-engine/dist/src/scripts/generateDeployUrls/index.js +4 -0
  57. package/packages/rnv-build-engine/dist/src/scripts/generateDeployUrls/makeTableDataByScheme.js +63 -0
  58. package/packages/rnv-build-engine/dist/src/scripts/gitReleaser/afterVersionBump.js +18 -0
  59. package/packages/rnv-build-engine/dist/src/scripts/gitReleaser/beforeVersionBump.js +12 -0
  60. package/packages/rnv-build-engine/dist/src/scripts/gitReleaser/checkReleaseNotes.js +16 -0
  61. package/packages/rnv-build-engine/dist/src/scripts/gitReleaser/pushRelease.js +31 -0
  62. package/packages/rnv-build-engine/dist/src/scripts/gitReleaser/pushReleaseCandidate.js +6 -0
  63. package/packages/rnv-build-engine/dist/src/scripts/gitReleaser/pushReleaseNotes.js +37 -0
  64. package/packages/rnv-build-engine/dist/src/scripts/release/deleteSourceMaps.js +11 -0
  65. package/packages/rnv-build-engine/dist/src/scripts/release/deployToAppCenter.js +83 -0
  66. package/packages/rnv-build-engine/dist/src/scripts/release/githubRelease.js +128 -0
  67. package/packages/rnv-build-engine/dist/src/scripts/release/notifySlack/generateWebhoook.js +65 -0
  68. package/packages/rnv-build-engine/dist/src/scripts/release/notifySlack/makePayload.js +85 -0
  69. package/packages/rnv-build-engine/dist/src/scripts/release/notifySlack/notifySlack.js +44 -0
  70. package/packages/rnv-build-engine/dist/src/scripts/release/notifySlack/slackBlockKitBuilder.js +39 -0
  71. package/packages/rnv-build-engine/dist/src/scripts/release/sentryRelease.js +85 -0
  72. package/packages/rnv-build-engine/dist/src/scripts/release/urlsMarkdown.js +62 -0
  73. package/packages/rnv-build-engine/dist/src/scripts/releaseAllWithScheme.js +79 -0
  74. package/packages/rnv-build-engine/dist/src/scripts/utils/cmdUtils.js +12 -0
  75. package/packages/rnv-build-engine/dist/src/scripts/utils/fsUtils.js +33 -0
  76. package/packages/rnv-build-engine/dist/src/scripts/utils/generateIcons.js +29 -0
  77. package/packages/rnv-build-engine/dist/src/scripts/utils/gitUtils.js +78 -0
  78. package/packages/rnv-build-engine/dist/src/scripts/utils/index.js +27 -0
  79. package/packages/rnv-build-engine/dist/src/scripts/utils/stringUtils.js +5 -0
  80. package/packages/rnv-build-engine/dist/src/sdks/index.js +42 -0
  81. package/packages/rnv-build-engine/dist/src/sdks/sdk-tizen/index.js +13 -0
  82. package/packages/rnv-build-engine/dist/src/sdks/sdk-tizen/sdkTizen.js +168 -0
  83. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/index.js +14 -0
  84. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/registerSdkPath.js +14 -0
  85. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/sdk-installer/index.js +5 -0
  86. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/sdk-installer/sdkInstaller.js +37 -0
  87. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/sdk-installer/services/clean.js +11 -0
  88. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/sdk-installer/services/download.js +76 -0
  89. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/sdk-installer/services/index.js +11 -0
  90. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/sdk-installer/services/install.js +23 -0
  91. package/packages/rnv-build-engine/dist/src/sdks/sdk-utils/sdk-installer/services/unzip.js +12 -0
  92. package/packages/rnv-build-engine/dist/src/sdks/sdk-webos/index.js +13 -0
  93. package/packages/rnv-build-engine/dist/src/sdks/sdk-webos/sdkWebos.js +80 -0
  94. package/packages/rnv-build-engine/dist/src/sdks/sdk-webpack/index.js +13 -0
  95. package/packages/rnv-build-engine/dist/src/sdks/sdk-webpack/sdkWebpack.js +6 -0
  96. package/packages/rnv-build-engine/dist/src/sdks/sdk-xbox/index.js +13 -0
  97. package/packages/rnv-build-engine/dist/src/sdks/sdk-xbox/sdkXbox.js +221 -0
  98. package/packages/rnv-build-engine/dist/src/tasks/deploy/aswS3/aws.js +22 -0
  99. package/packages/rnv-build-engine/dist/src/tasks/deploy/aswS3/deployS3.js +71 -0
  100. package/packages/rnv-build-engine/dist/src/tasks/deploy/hbbtv/deployHbbtv.js +94 -0
  101. package/packages/rnv-build-engine/dist/src/tasks/engineTasks.js +24 -0
  102. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.build.js +91 -0
  103. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.configure.js +42 -0
  104. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.configureSoft.js +30 -0
  105. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.deploy.js +40 -0
  106. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.hooks.run.js +70 -0
  107. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.package.js +18 -0
  108. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.platform.configure.js +37 -0
  109. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.project.configure.js +116 -0
  110. package/packages/rnv-build-engine/dist/src/tasks/task.rnv.start.js +73 -0
  111. package/packages/rnv-build-engine/dist/src/types/c.js +2 -0
  112. package/packages/rnv-build-engine/dist/src/types/constants.js +2 -0
  113. package/packages/rnv-build-engine/dist/src/types/index.js +2 -0
  114. package/packages/rnv-build-engine/dist/src/utils/forEachSupportedPlatformFlavour.js +24 -0
  115. package/packages/rnv-build-engine/dist/src/utils/generatePngSpriteMap.js +78 -0
  116. package/packages/rnv-build-engine/dist/src/utils/generateSvgSpriteMap.js +113 -0
  117. package/packages/rnv-build-engine/dist/src/utils/mergeSvgAndPngIcons.js +65 -0
  118. package/packages/rnv-build-engine/dist/src/utils/replaceRelevantStringsInConfig/index.js +5 -0
  119. package/packages/rnv-build-engine/dist/src/utils/replaceRelevantStringsInConfig/replaceRelevantStringsInConfig.js +31 -0
  120. package/packages/rnv-build-engine/dist/src/utils/replaceRelevantStringsInConfig/replaceTemplateString.js +40 -0
  121. package/packages/rnv-build-engine/dist/src/utils/zipBuildsByPlatforms.js +61 -0
  122. package/packages/rnv-build-engine/dist/templates/platforms/_shared/template.js +87 -0
  123. package/packages/rnv-build-engine/dist/templates/platforms/_shared/utils/extendSass.js +29 -0
  124. package/packages/rnv-build-engine/dist/templates/platforms/_shared/utils/joinStrings.js +5 -0
  125. package/packages/rnv-build-engine/dist/templates/platforms/_shared/webpack.base.js +234 -0
  126. package/packages/rnv-build-engine/dist/templates/platforms/_shared/webpack.config.dev.js +6 -0
  127. package/packages/rnv-build-engine/dist/templates/platforms/_shared/webpack.config.prod.js +6 -0
  128. package/packages/rnv-build-engine/dist/templates/platforms/_shared/webpack.extend.js +8 -0
  129. package/packages/rnv-build-engine/dist/templates/platforms/_shared/webpackConfigAdapter.js +100 -0
  130. package/packages/rnv-build-engine/dist/templates/platforms/_shared/webpackPlatformProps.js +8 -0
  131. package/packages/rnv-build-engine/dist/templates/platforms/hbbtv/webpackPlatformProps.js +24 -0
  132. package/packages/rnv-build-engine/dist/templates/platforms/tizen/project/.project +24 -0
  133. package/packages/rnv-build-engine/dist/templates/platforms/tizen/project/.tproject +12 -0
  134. package/packages/rnv-build-engine/dist/templates/platforms/tizen/project/config.xml +17 -0
  135. package/packages/rnv-build-engine/dist/templates/platforms/webos/project/.project +35 -0
  136. package/packages/rnv-build-engine/dist/templates/platforms/webos/project/appinfo.json +19 -0
  137. package/packages/rnv-build-engine/dist/templates/platforms/webos/webpackPlatformProps.js +8 -0
  138. package/packages/types-bigscreen-jsx/index.d.ts +1 -1
  139. package/packages/utils/src/textUtils.ts +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@24i/bigscreen-sdk",
3
- "version": "1.0.4-alpha.2098",
3
+ "version": "1.0.4-alpha.2106",
4
4
  "description": "SmartApps BIGscreen SDK monorepo",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -57,7 +57,7 @@
57
57
  "@types/jest": "^28.1.6",
58
58
  "@types/minimist": "^1.2.2",
59
59
  "@types/node": "^18.6.3",
60
- "@types/react": "^18.0.15",
60
+ "@types/react": "^18.0.18",
61
61
  "babel-jest": "^28.1.2",
62
62
  "chalk": "^4.1.2",
63
63
  "coveralls": "^3.1.0",
@@ -71,12 +71,12 @@
71
71
  "jest-environment-jsdom": "^28.1.2",
72
72
  "minimist": "^1.2.6",
73
73
  "patch-package": "^6.2.1",
74
- "sass": "^1.54.0",
74
+ "sass": "^1.54.8",
75
75
  "sass-true": "^6.1.0",
76
- "ts-jest": "^28.0.7",
76
+ "ts-jest": "^28.0.8",
77
77
  "ts-node": "^10.8.2",
78
78
  "tsconfig-paths-jest": "0.0.1",
79
- "typescript": "^4.7.2"
79
+ "typescript": "^4.8.2"
80
80
  },
81
81
  "exports": {
82
82
  "./adobe-heartbeat": "./packages/adobe-heartbeat/src/index.ts",
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.main = void 0;
5
+ const path = require("path");
6
+ const fs = require("fs");
7
+ const fse = require("fs-extra");
8
+ const chalk = require("chalk");
9
+ const minimist = require("minimist");
10
+ const questions_1 = require("./questionnaire/questions");
11
+ const Settings_1 = require("./settings/Settings");
12
+ async function isDirectoryEmpty(dirPath) {
13
+ const files = await fs.promises.readdir(dirPath);
14
+ return !files.length;
15
+ }
16
+ async function copyTemplateFiles(templateDir, targetDir) {
17
+ return fse.copy(templateDir, targetDir);
18
+ }
19
+ function updatePackageJsonFile(filePath, options) {
20
+ let data = fs.readFileSync(filePath, 'utf8');
21
+ const keywords = options.keywords.map((word) => `"${word}"`).join(', ');
22
+ data = data.replace(/("name": ")(.*)(")/, `$1${options.name}$3`);
23
+ data = data.replace(/("version": ")(.*)(")/, `$1${options.version}$3`);
24
+ data = data.replace(/("description": ")(.*)(")/, `$1${options.description}$3`);
25
+ data = data.replace(/("keywords": \[)(.*)(\])/, `$1${keywords}$3`);
26
+ data = data.replace(/("author": ")(.*)(")/, `$1${options.author}$3`);
27
+ fs.writeFileSync(filePath, data);
28
+ }
29
+ function parseArguments(rawArgv) {
30
+ const argv = minimist(rawArgv.slice(2));
31
+ const dirName = argv._[0];
32
+ if (!dirName) {
33
+ console.error('Error: Missing package name');
34
+ process.exit(1);
35
+ }
36
+ return {
37
+ dirName,
38
+ };
39
+ }
40
+ async function main() {
41
+ const { dirName: destDirName } = parseArguments(process.argv);
42
+ const destDir = path.join(process.cwd(), 'packages/', destDirName);
43
+ if (fs.existsSync(destDir)) {
44
+ console.error(`Error: Target directory "${destDir}" already exists`);
45
+ process.exit(1);
46
+ }
47
+ fs.mkdirSync(destDir, { recursive: true });
48
+ const isDirEmpty = await isDirectoryEmpty(destDir);
49
+ if (!isDirEmpty) {
50
+ console.error(`Error: Target directory "${destDir}" is not empty.`);
51
+ process.exit(1);
52
+ }
53
+ const settings = Object.assign({}, Settings_1.Settings);
54
+ settings.name = `${Settings_1.Settings.name}${destDirName}`.toLowerCase();
55
+ const details = await (0, questions_1.promptPackageDetails)(settings);
56
+ const templateDir = path.join(__dirname, '..', 'templates/typescript');
57
+ await copyTemplateFiles(templateDir, destDir);
58
+ const packageJsonFile = path.join(destDir, 'package.json');
59
+ updatePackageJsonFile(packageJsonFile, details);
60
+ const docsSymlinkTarget = path.join('../../../packages/', destDirName, '/README.md');
61
+ const docsSymlinkPath = path.join(process.cwd(), 'docs/packages/', destDirName, '/README.md');
62
+ await fse.ensureSymlink(docsSymlinkTarget, docsSymlinkPath);
63
+ console.log(`${chalk.green('Success')}, package has been initialized!`);
64
+ }
65
+ exports.main = main;
66
+ //# sourceMappingURL=createPackage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPackage.js","sourceRoot":"","sources":["../src/createPackage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const createPackage_1 = require("./createPackage");
4
+ (0, createPackage_1.main)();
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,mDAAuC;AAEvC,IAAA,oBAAI,GAAE,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.promptPackageDetails = void 0;
4
+ const inquirer = require("inquirer");
5
+ async function promptPackageDetails(defaultValues) {
6
+ return inquirer.prompt([
7
+ {
8
+ type: 'input',
9
+ name: 'name',
10
+ message: 'Package name:',
11
+ default: defaultValues.name,
12
+ }, {
13
+ type: 'input',
14
+ name: 'version',
15
+ message: 'Version:',
16
+ default: defaultValues.version,
17
+ }, {
18
+ type: 'input',
19
+ name: 'description',
20
+ message: 'Description:',
21
+ }, {
22
+ type: 'input',
23
+ name: 'keywords',
24
+ message: 'Keywords:',
25
+ filter: (ans) => ans.split(/[\s,]+/),
26
+ }, {
27
+ type: 'input',
28
+ name: 'author',
29
+ message: 'Author:',
30
+ default: defaultValues.author,
31
+ },
32
+ ]);
33
+ }
34
+ exports.promptPackageDetails = promptPackageDetails;
35
+ //# sourceMappingURL=questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/questionnaire/questions.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAWrC,KAAK,UAAU,oBAAoB,CAAC,aAA4C;IAC5E,OAAO,QAAQ,CAAC,MAAM,CAAC;QACnB;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,aAAa,CAAC,IAAI;SAC9B,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,aAAa,CAAC,OAAO;SACjC,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,cAAc;SAC1B,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;SACvC,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,aAAa,CAAC,MAAM;SAChC;KACJ,CAAC,CAAC;AACP,CAAC;AAEQ,oDAAoB"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Settings = void 0;
4
+ const Settings = {
5
+ name: '@24i/smartapps-bigscreen-',
6
+ version: '0.0.1',
7
+ author: '24i',
8
+ };
9
+ exports.Settings = Settings;
10
+ //# sourceMappingURL=Settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/settings/Settings.ts"],"names":[],"mappings":";;;AAAA,MAAM,QAAQ,GAAG;IACb,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,KAAK;CAChB,CAAC;AAEO,4BAAQ"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -1,7 +1,6 @@
1
1
  import { Component, createRef, Reference } from '@24i/bigscreen-sdk/jsx';
2
2
  import { stopEvent } from '@24i/bigscreen-sdk/utils';
3
3
  import { BasicList } from '@24i/bigscreen-sdk/list/Basic';
4
- import { device } from '@24i/bigscreen-sdk/device';
5
4
  import { BACK } from '@24i/bigscreen-sdk/device/keymap';
6
5
  import { reloadApp } from '../utils/reload';
7
6
  import { EnvironmentListItem } from './EnvironmentListItem';
@@ -25,14 +24,12 @@ export class EnvironmentList extends Component<Props> {
25
24
  getPaddingTop() {
26
25
  const { data } = this.props;
27
26
  const {
28
- visibleItems, height, listItemHeight, listItemMargin, defaultPaddingTop,
27
+ paddingCountThreshold, height, scrollStep, defaultPaddingTop,
29
28
  } = sizes;
30
- if (data.length < visibleItems) {
31
- return Math.round(
32
- (height - (listItemHeight + (listItemMargin * 2)) * data.length) / 2,
33
- );
34
- }
35
- return defaultPaddingTop;
29
+ if (data.length > paddingCountThreshold) return defaultPaddingTop;
30
+ return Math.round(
31
+ (height - scrollStep * data.length) / 2,
32
+ );
36
33
  }
37
34
 
38
35
  onKeyDown = (event: KeyboardEvent) => {
@@ -40,8 +37,6 @@ export class EnvironmentList extends Component<Props> {
40
37
  stopEvent(event);
41
38
  const { onClose } = this.props;
42
39
  onClose();
43
- } else if (device.isDirectionalArrow(event)) {
44
- stopEvent(event); // No leaking out. Might result in something focusing below the modal
45
40
  }
46
41
  };
47
42
 
@@ -57,7 +52,7 @@ export class EnvironmentList extends Component<Props> {
57
52
 
58
53
  render() {
59
54
  const { data, leadingEllipses } = this.props;
60
- const { visibleItems, firstScrollStep, scrollStep } = sizes;
55
+ const { visibleItems, scrollStep } = sizes;
61
56
  return (
62
57
  <div
63
58
  ref={this.div}
@@ -86,7 +81,7 @@ export class EnvironmentList extends Component<Props> {
86
81
  );
87
82
  }}
88
83
  visibleItems={visibleItems}
89
- firstScrollStep={firstScrollStep}
84
+ firstScrollStep={scrollStep}
90
85
  scrollStep={scrollStep}
91
86
  />
92
87
  </div>
@@ -3,8 +3,12 @@ import { getDisplayToggler } from '@24i/bigscreen-sdk/utils/displayToggler';
3
3
  import { Item } from '@24i/bigscreen-sdk/list/interface';
4
4
  import { Interactable } from '@24i/bigscreen-sdk/interactable';
5
5
  import { trimWithLeadingEllipsis } from '@24i/bigscreen-sdk/utils/textUtils';
6
+ import { addClass } from '@24i/bigscreen-sdk/utils/addClass';
7
+ import { removeClass } from '@24i/bigscreen-sdk/utils/removeClass';
6
8
  import { ItemData } from './types';
7
9
 
10
+ const ACTIVE_CLASS = 'active';
11
+
8
12
  type Props = {
9
13
  onPress: (environment: string) => void,
10
14
  leadingEllipses?: boolean;
@@ -13,7 +17,7 @@ type Props = {
13
17
  export class EnvironmentListItem extends Component<Props> implements Item<ItemData> {
14
18
  itemRef = createRef<HTMLDivElement>();
15
19
 
16
- labelRef = createRef<HTMLSpanElement>();
20
+ labelRef = createRef<HTMLDivElement>();
17
21
 
18
22
  value: string;
19
23
 
@@ -53,11 +57,16 @@ export class EnvironmentListItem extends Component<Props> implements Item<ItemDa
53
57
  }
54
58
  }
55
59
 
56
- updateData({ label, value }: ItemData) {
60
+ updateData({ label, value, active }: ItemData) {
57
61
  if (value !== this.value) {
58
62
  this.value = value;
59
63
  setText(this.labelRef, label);
60
64
  this.trimRows();
65
+ if (active) {
66
+ addClass(this.itemRef, ACTIVE_CLASS);
67
+ } else {
68
+ removeClass(this.itemRef, ACTIVE_CLASS);
69
+ }
61
70
  }
62
71
  }
63
72
 
@@ -66,27 +75,31 @@ export class EnvironmentListItem extends Component<Props> implements Item<ItemDa
66
75
  }
67
76
 
68
77
  render() {
69
- const { active, label, leadingEllipses: ellipses } = this.props;
78
+ const { active, label, leadingEllipses } = this.props;
79
+ const itemEllipsesClass = `${
80
+ leadingEllipses ? 'leading-ellipses-list-item' : 'normal-ellipses-list-item'
81
+ }`;
82
+ const activeClass = `${active ? ACTIVE_CLASS : ''}`;
70
83
  return (
71
84
  <Interactable
72
85
  ref={this.itemRef}
73
- className={`environment-list-item ${ellipses ? 'leading-ellipses-list-item' : ''}`}
86
+ className={`environment-list-item ${itemEllipsesClass} ${activeClass}`}
74
87
  onPress={this.onPress}
75
88
  >
76
- { active
77
- && (
78
- <span
79
- className={`checkmark ${ellipses ? 'leading-ellipses-checkmark' : ''}`}
80
- />
81
- )}
82
-
83
- <span
84
- className={`label ${active ? 'active' : ''}`}
89
+ {active && (
90
+ <div
91
+ className={
92
+ `checkmark ${leadingEllipses ? 'leading-ellipses-checkmark' : ''}`
93
+ }
94
+ />
95
+ )}
96
+ <div
97
+ className="label"
85
98
  ref={this.labelRef}
86
99
  dir="auto"
87
100
  >
88
101
  {label}
89
- </span>
102
+ </div>
90
103
  </Interactable>
91
104
  );
92
105
  }
@@ -1,9 +1,5 @@
1
1
  export const height = 1080;
2
- export const defaultPaddingTop = 10;
3
-
4
- export const listItemHeight = 80;
5
- export const listItemMargin = 16;
6
-
7
- export const visibleItems = 11;
8
- export const firstScrollStep = 112;
2
+ export const defaultPaddingTop = 92;
3
+ export const paddingCountThreshold = 8;
4
+ export const visibleItems = 10;
9
5
  export const scrollStep = 112;
@@ -1,9 +1,5 @@
1
1
  export const height = 720;
2
- export const defaultPaddingTop = 7;
3
-
4
- export const listItemHeight = 53;
5
- export const listItemMargin = 11;
6
-
7
- export const visibleItems = 11;
8
- export const firstScrollStep = 75;
2
+ export const defaultPaddingTop = 61;
3
+ export const paddingCountThreshold = 8;
4
+ export const visibleItems = 10;
9
5
  export const scrollStep = 75;
@@ -1,3 +1,5 @@
1
+ @import '@24i/bigscreen-sdk/sass-utils/ellipsis';
2
+
1
3
  @mixin mask-svg-icon($icon-url) {
2
4
  -webkit-mask-image: url($icon-url);
3
5
  -webkit-mask-size: $checkmark-size;
@@ -41,6 +43,7 @@
41
43
  padding-right: $environment-config-name-padding-right;
42
44
  line-height: $environment-config-name-height;
43
45
  height: $environment-config-name-height;
46
+ white-space: nowrap;
44
47
  }
45
48
  }
46
49
 
@@ -83,6 +86,7 @@
83
86
  background-color: #fff;
84
87
  height: $checkmark-size;
85
88
  width: $checkmark-size;
89
+ visibility: hidden;
86
90
  }
87
91
 
88
92
  .leading-ellipses-checkmark {
@@ -95,10 +99,6 @@
95
99
  font-size: $label-font-size;
96
100
  font-weight: 400;
97
101
  color: #8f8f8f;
98
-
99
- &.active {
100
- color: #fff;
101
- }
102
102
  }
103
103
 
104
104
  &:focus {
@@ -108,10 +108,30 @@
108
108
  color: #fff;
109
109
  }
110
110
  }
111
+
112
+ &.active {
113
+ .checkmark {
114
+ visibility: visible;
115
+ }
116
+
117
+ .label {
118
+ color: #fff;
119
+ }
120
+ }
121
+
122
+ &.display-none {
123
+ visibility: hidden;
124
+ }
111
125
  }
112
126
 
113
127
  .leading-ellipses-list-item {
114
128
  height: auto;
115
129
  }
130
+
131
+ .normal-ellipses-list-item {
132
+ .label {
133
+ @include ellipsis;
134
+ }
135
+ }
116
136
  }
117
137
  }
@@ -14,7 +14,7 @@ $environment-list-width: 479px;
14
14
 
15
15
  $environment-list-item-border-radius: 40px;
16
16
  $environment-list-item-padding: 16px 34px;
17
- $environment-list-item-margin: 16px 71px;
17
+ $environment-list-item-margin: 16px 0 16px 71px;
18
18
  $environment-list-item-line-height: 48px;
19
19
  $environment-list-item-height: 80px;
20
20
 
@@ -14,9 +14,9 @@ $environment-list-width: 319px;
14
14
 
15
15
  $environment-list-item-border-radius: 27px;
16
16
  $environment-list-item-padding: 11px 23px;
17
- $environment-list-item-margin: 11px 47px;
17
+ $environment-list-item-margin: 11px 0 11px 47px;
18
18
  $environment-list-item-line-height: 32px;
19
- $environment-list-item-height: 53px;
19
+ $environment-list-item-height: 54px;
20
20
 
21
21
  $checkmark-top: 13px;
22
22
  $checkmark-left: -48px;
@@ -19,7 +19,7 @@ export const loadObject = <T extends HTMLObjectElement>(
19
19
  object.type = type;
20
20
  forEach(Object.entries(attributes), ([name, value]) => {
21
21
  if (name === 'style') {
22
- object.style.cssText = value;
22
+ object.style.cssText = value as string;
23
23
  } else {
24
24
  // @ts-ignore - skipping readonly check
25
25
  object[name] = value;
@@ -9,7 +9,6 @@ export type Props = SharedProps & {
9
9
  focusableChildren: Array<Reference>,
10
10
  onFocusChanged?: (focused: Reference, index: number) => any,
11
11
  onBeforeFocusChange?: (focused: Reference, index: number) => any,
12
- dir?: 'auto' | 'ltr' | 'rtl',
13
12
  };
14
13
 
15
14
  export interface ILayout {
@@ -1,19 +1,9 @@
1
1
  import { LEFT, RIGHT } from '@24i/bigscreen-sdk/device/keymap';
2
- import { isRtl } from '@24i/bigscreen-sdk/i18n';
3
- import { getLayoutBase, ILayout, Props } from './Base';
4
-
5
- const isHorizontalRtl = (dir: Props['dir']) => {
6
- switch (dir) {
7
- case 'rtl': return true;
8
- case 'ltr': return false;
9
- case 'auto':
10
- default:
11
- return isRtl();
12
- }
13
- };
2
+ import { getLayoutBase, ILayout } from './Base';
3
+ import { isRtl } from './isRtl';
14
4
 
15
5
  const onKeyDown = (e: KeyboardEvent, layout: ILayout) => {
16
- if (!isHorizontalRtl(layout.props.dir)) {
6
+ if (!isRtl(layout.props.dir)) {
17
7
  if (LEFT.is(e)) layout.backward(e);
18
8
  if (RIGHT.is(e)) layout.forward(e);
19
9
  } else {
@@ -1,8 +1,10 @@
1
1
  import { Component, Reference, createRef, DeclareProps } from '@24i/bigscreen-sdk/jsx';
2
2
  import { device } from '@24i/bigscreen-sdk/device';
3
+ import { LEFT, RIGHT } from '@24i/bigscreen-sdk/device/keymap';
3
4
  import { noop } from '@24i/bigscreen-sdk/utils/noop';
4
5
  import { stopEvent } from '@24i/bigscreen-sdk/utils/stopEvent';
5
6
  import { IFocusable } from '../IFocusable';
7
+ import { isRtl } from './isRtl';
6
8
  import { Errors, hasValidDomRef } from './constants';
7
9
  import { SharedProps } from './types';
8
10
 
@@ -34,7 +36,8 @@ export class Matrix extends Component<Props> implements IFocusable {
34
36
  onFocusChanged: noop,
35
37
  onBeforeFocusChange: noop,
36
38
  circular: CircularDirection.NONE,
37
- };
39
+ dir: 'auto',
40
+ } as const;
38
41
 
39
42
  declare props: DeclareProps<Props, typeof Matrix.defaultProps>;
40
43
 
@@ -56,9 +59,9 @@ export class Matrix extends Component<Props> implements IFocusable {
56
59
 
57
60
  onKeyDown = (e: KeyboardEvent) => {
58
61
  let newIndex: Index2D | null = null;
59
- if (device.isDirectionLeft(e)) {
62
+ if (this.isDirectionLeft(e)) {
60
63
  newIndex = this.moveHorizontaly('left');
61
- } else if (device.isDirectionRight(e)) {
64
+ } else if (this.isDirectionRight(e)) {
62
65
  newIndex = this.moveHorizontaly('right');
63
66
  } else if (device.isDirectionUp(e)) {
64
67
  newIndex = this.moveVerticaly('up');
@@ -109,6 +112,24 @@ export class Matrix extends Component<Props> implements IFocusable {
109
112
  return false;
110
113
  }
111
114
 
115
+ isDirectionLeft(event: KeyboardEvent) {
116
+ const { dir } = this.props;
117
+ const rtl = isRtl(dir);
118
+ return (
119
+ (!rtl && LEFT.is(event))
120
+ || (rtl && RIGHT.is(event))
121
+ );
122
+ }
123
+
124
+ isDirectionRight(event: KeyboardEvent) {
125
+ const { dir } = this.props;
126
+ const rtl = isRtl(dir);
127
+ return (
128
+ (!rtl && RIGHT.is(event))
129
+ || (rtl && LEFT.is(event))
130
+ );
131
+ }
132
+
112
133
  moveForwards = (isCircular: boolean) => (x: number, length: number) => {
113
134
  if (x === length - 1) {
114
135
  return isCircular ? 0 : length - 1;
@@ -0,0 +1,23 @@
1
+ import * as i18n from '@24i/bigscreen-sdk/i18n';
2
+ import { isRtl } from '../isRtl';
3
+ import { SharedProps } from '../types';
4
+
5
+ describe('isRtl', () => {
6
+ const mockIsRtl = jest.spyOn(i18n, 'isRtl');
7
+
8
+ it.each([
9
+ { focusDir: 'ltr', langDir: 'ltr', expectedIsRtl: false },
10
+ { focusDir: 'rtl', langDir: 'ltr', expectedIsRtl: true },
11
+ { focusDir: 'auto', langDir: 'ltr', expectedIsRtl: false },
12
+ { focusDir: undefined, langDir: 'ltr', expectedIsRtl: false },
13
+ { focusDir: 'ltr', langDir: 'rtl', expectedIsRtl: false },
14
+ { focusDir: 'rtl', langDir: 'rtl', expectedIsRtl: true },
15
+ { focusDir: 'auto', langDir: 'rtl', expectedIsRtl: true },
16
+ { focusDir: undefined, langDir: 'rtl', expectedIsRtl: true },
17
+ ])('should for $focusDir focus and $langDir language return $expectedIsRtl', ({
18
+ focusDir, langDir, expectedIsRtl,
19
+ }) => {
20
+ mockIsRtl.mockReturnValue(langDir === 'rtl');
21
+ expect(isRtl(focusDir as SharedProps['dir'])).toBe(expectedIsRtl);
22
+ });
23
+ });
@@ -0,0 +1,12 @@
1
+ import { isRtl as isLangRtl } from '@24i/bigscreen-sdk/i18n';
2
+ import { SharedProps } from './types';
3
+
4
+ export const isRtl = (dir: SharedProps['dir']) => {
5
+ switch (dir) {
6
+ case 'rtl': return true;
7
+ case 'ltr': return false;
8
+ case 'auto':
9
+ default:
10
+ return isLangRtl();
11
+ }
12
+ };
@@ -3,4 +3,5 @@ import { Reference, Children } from '@24i/bigscreen-sdk/jsx';
3
3
  export type SharedProps = {
4
4
  domRef: Reference<HTMLElement>,
5
5
  children?: Children,
6
+ dir?: 'auto' | 'ltr' | 'rtl',
6
7
  };
@@ -1,6 +1,6 @@
1
- import { ForwardedRefComponent, FunctionComponentWithRef } from './types';
1
+ import { ForwardedRefComponent, FunctionComponentWithRef, Props } from './types';
2
2
 
3
- export const forwardRef = <T>(
3
+ export const forwardRef = <T extends Props>(
4
4
  reffedComponent: FunctionComponentWithRef<T>,
5
5
  ): ForwardedRefComponent<T> => {
6
6
  (reffedComponent as ForwardedRefComponent<T>).isForwardedRef = true;
@@ -71,6 +71,7 @@ export class Keyboard extends QwertyKeyboardBase {
71
71
  ref={this.matrix}
72
72
  domRef={this.keyboardWrapper}
73
73
  matrix={this.focusMatrices.normal}
74
+ dir="ltr"
74
75
  >
75
76
  <div className={`${KEYBOARD_ROW} row-numbers`}>
76
77
  {map(NORMAL[0], this.generateKey)}
@@ -96,6 +97,7 @@ export class Keyboard extends QwertyKeyboardBase {
96
97
  ref={this.keyRefs.special}
97
98
  className="key key-special"
98
99
  onPress={this.onSpecial}
100
+ dir="auto"
99
101
  >
100
102
  {texts.toSpecialLayout}
101
103
  </Interactable>
@@ -103,6 +105,7 @@ export class Keyboard extends QwertyKeyboardBase {
103
105
  ref={this.keyRefs.shift}
104
106
  className="key key-shift"
105
107
  onPress={() => this.onShift()}
108
+ dir="auto"
106
109
  >
107
110
  {texts.shift}
108
111
  </Interactable>
@@ -131,6 +134,7 @@ export class Keyboard extends QwertyKeyboardBase {
131
134
  ref={this.keyRefs.done}
132
135
  className="key key-done"
133
136
  onPress={() => this.onDone()}
137
+ dir="auto"
134
138
  >
135
139
  {texts.done}
136
140
  </Interactable>
@@ -158,6 +162,7 @@ export class Keyboard extends QwertyKeyboardBase {
158
162
  ref={this.matrix}
159
163
  domRef={this.keyboardWrapper}
160
164
  matrix={this.focusMatrices.special}
165
+ dir="ltr"
161
166
  >
162
167
  <div className={`${KEYBOARD_ROW} row-numbers`}>
163
168
  {map(SPECIAL[0], this.generateKey)}
@@ -186,6 +191,7 @@ export class Keyboard extends QwertyKeyboardBase {
186
191
  ref={this.keyRefs.special}
187
192
  className="key key-special"
188
193
  onPress={this.onQWERTY}
194
+ dir="auto"
189
195
  >
190
196
  {texts.toNormalLayout}
191
197
  </Interactable>
@@ -215,6 +221,7 @@ export class Keyboard extends QwertyKeyboardBase {
215
221
  ref={this.keyRefs.done}
216
222
  className="key key-done"
217
223
  onPress={() => this.onDone()}
224
+ dir="auto"
218
225
  >
219
226
  {texts.done}
220
227
  </Interactable>
@@ -69,6 +69,7 @@ export class Keyboard extends KeyboardBase<Layouts, Props> {
69
69
  ref={this.matrix}
70
70
  domRef={this.keyboardWrapper}
71
71
  matrix={this.focusMatrices.normal}
72
+ dir="ltr"
72
73
  >
73
74
  <div className={`${KEYBOARD_ROW} row-numbers`}>
74
75
  {map(NUMBERS, this.generateKey)}