@crowdin/app-project-module 0.17.5 → 0.17.7

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 (79) hide show
  1. package/README.md +1 -0
  2. package/out/handlers/crowdin-file-progress.d.ts +4 -0
  3. package/out/handlers/crowdin-file-progress.js +22 -0
  4. package/out/handlers/crowdin-files.d.ts +4 -0
  5. package/out/handlers/crowdin-files.js +31 -0
  6. package/out/handlers/crowdin-project.d.ts +4 -0
  7. package/out/handlers/crowdin-project.js +22 -0
  8. package/out/handlers/crowdin-update.d.ts +4 -0
  9. package/out/handlers/crowdin-update.js +26 -0
  10. package/out/handlers/custom-file-format/download.d.ts +4 -0
  11. package/out/handlers/custom-file-format/download.js +32 -0
  12. package/out/handlers/custom-file-format/process.d.ts +4 -0
  13. package/out/handlers/custom-file-format/process.js +139 -0
  14. package/out/handlers/custom-mt/translate.d.ts +4 -0
  15. package/out/handlers/custom-mt/translate.js +42 -0
  16. package/out/handlers/install.d.ts +4 -0
  17. package/out/handlers/install.js +45 -0
  18. package/out/handlers/integration-data.d.ts +4 -0
  19. package/out/handlers/integration-data.js +21 -0
  20. package/out/handlers/integration-login.d.ts +4 -0
  21. package/out/handlers/integration-login.js +30 -0
  22. package/out/handlers/integration-logout.d.ts +4 -0
  23. package/out/handlers/integration-logout.js +23 -0
  24. package/out/handlers/integration-update.d.ts +4 -0
  25. package/out/handlers/integration-update.js +25 -0
  26. package/out/handlers/main.d.ts +4 -0
  27. package/out/handlers/main.js +64 -0
  28. package/out/handlers/manifest.d.ts +3 -0
  29. package/out/handlers/manifest.js +126 -0
  30. package/out/handlers/oauth-login.d.ts +4 -0
  31. package/out/handlers/oauth-login.js +69 -0
  32. package/out/handlers/settings-save.d.ts +4 -0
  33. package/out/handlers/settings-save.js +21 -0
  34. package/out/handlers/subscription-info.d.ts +3 -0
  35. package/out/handlers/subscription-info.js +15 -0
  36. package/out/handlers/subscription-paid.d.ts +4 -0
  37. package/out/handlers/subscription-paid.js +22 -0
  38. package/out/handlers/sync-settings-save.d.ts +4 -0
  39. package/out/handlers/sync-settings-save.js +29 -0
  40. package/out/handlers/sync-settings.d.ts +4 -0
  41. package/out/handlers/sync-settings.js +27 -0
  42. package/out/handlers/uninstall.d.ts +4 -0
  43. package/out/handlers/uninstall.js +27 -0
  44. package/out/index.d.ts +5 -0
  45. package/out/index.js +191 -0
  46. package/out/logo.png +0 -0
  47. package/out/middlewares/crowdin-client.d.ts +10 -0
  48. package/out/middlewares/crowdin-client.js +88 -0
  49. package/out/middlewares/integration-credentials.d.ts +4 -0
  50. package/out/middlewares/integration-credentials.js +39 -0
  51. package/out/middlewares/json-response.d.ts +2 -0
  52. package/out/middlewares/json-response.js +7 -0
  53. package/out/middlewares/ui-module.d.ts +4 -0
  54. package/out/middlewares/ui-module.js +39 -0
  55. package/out/models/index.d.ts +544 -0
  56. package/out/models/index.js +41 -0
  57. package/out/static/css/styles.css +57 -0
  58. package/out/static/js/main.js +130 -0
  59. package/out/static/js/polyfills/fetch.js +494 -0
  60. package/out/static/js/polyfills/promise.js +375 -0
  61. package/out/storage/index.d.ts +22 -0
  62. package/out/storage/index.js +319 -0
  63. package/out/util/connection.d.ts +10 -0
  64. package/out/util/connection.js +211 -0
  65. package/out/util/cron.d.ts +3 -0
  66. package/out/util/cron.js +103 -0
  67. package/out/util/defaults.d.ts +5 -0
  68. package/out/util/defaults.js +153 -0
  69. package/out/util/index.d.ts +11 -0
  70. package/out/util/index.js +105 -0
  71. package/out/views/install.handlebars +16 -0
  72. package/out/views/login.handlebars +115 -0
  73. package/out/views/main.handlebars +471 -0
  74. package/out/views/oauth.handlebars +4 -0
  75. package/out/views/partials/head.handlebars +20 -0
  76. package/out/views/subscription.handlebars +26 -0
  77. package/package.json +1 -1
  78. package/.github/workflows/basic.yml +0 -39
  79. package/.github/workflows/publish.yml +0 -34
@@ -0,0 +1,544 @@
1
+ import Crowdin, { LanguagesModel, SourceFilesModel, SourceStringsModel } from '@crowdin/crowdin-api-client';
2
+ import { JwtPayload } from '@crowdin/crowdin-apps-functions';
3
+ import { Request } from 'express';
4
+ export interface Config extends ImagePath {
5
+ /**
6
+ * client id that we received when registering the app
7
+ */
8
+ clientId: string;
9
+ /**
10
+ * client secret that we received when registering the app
11
+ */
12
+ clientSecret: string;
13
+ /**
14
+ * Secret to encrypt/decrypt credentials (by default @clientSecret will be used)
15
+ */
16
+ cryptoSecret?: string;
17
+ /**
18
+ * https url where an app is reachable from the internet (e.g. the one that ngrok generates for us)
19
+ */
20
+ baseUrl: string;
21
+ /**
22
+ * define Crowdin API url (e.g. to work against local Crowdin server)
23
+ */
24
+ crowdinBaseUrl?: string;
25
+ /**
26
+ * Set of scopes requested by this app (default 'project')
27
+ */
28
+ scopes?: Scope[];
29
+ /**
30
+ * app name
31
+ */
32
+ name: string;
33
+ /**
34
+ * app identifier
35
+ */
36
+ identifier: string;
37
+ /**
38
+ * app description
39
+ */
40
+ description: string;
41
+ /**
42
+ * port where to start express application
43
+ */
44
+ port?: number;
45
+ /**
46
+ * folder where module will create sqlite db file to persist credentials (e.g. {@example __dirname})
47
+ */
48
+ dbFolder: string;
49
+ /**
50
+ * integration module logic
51
+ */
52
+ projectIntegration?: IntegrationLogic & ImagePath;
53
+ /**
54
+ * custom file format module logic
55
+ */
56
+ customFileFormat?: CustomFileFormatLogic;
57
+ /**
58
+ * custom MT module logic
59
+ */
60
+ customMT?: CustomMTLogic;
61
+ /**
62
+ * resources module
63
+ */
64
+ profileResourcesMenu?: UiModule & ImagePath;
65
+ /**
66
+ * organization-menu module
67
+ */
68
+ organizationMenu?: UiModule & ImagePath;
69
+ /**
70
+ * editor-right-panel module
71
+ */
72
+ editorRightPanel?: EditorPanels;
73
+ /**
74
+ * project menu module
75
+ */
76
+ projectMenu?: UiModule;
77
+ /**
78
+ * tools module
79
+ */
80
+ projectTools?: UiModule & ImagePath;
81
+ /**
82
+ * reports module
83
+ */
84
+ projectReports?: UiModule & ImagePath;
85
+ /**
86
+ * Uninstall hook for cleanup logic
87
+ */
88
+ onUninstall?: (organization: string) => Promise<void>;
89
+ /**
90
+ * Error interceptor (can be used to log error in centralized place)
91
+ */
92
+ onError?: (error: any) => void;
93
+ /**
94
+ * Configuration to log everything that are happening in the app
95
+ */
96
+ logger?: Logger;
97
+ /**
98
+ * Configuration of app pricing
99
+ */
100
+ pricing?: Pricing;
101
+ }
102
+ export declare enum Scope {
103
+ ALL_SCOPES = "all",
104
+ NOTIFICATIONS = "notification",
105
+ TRANSLATION_MEMORIES = "tm",
106
+ MACHINE_TRANSLATION_ENGINES = "mt",
107
+ GLOSSARIES = "glossary",
108
+ PROJECTS = "project",
109
+ TASKS = "project.task",
110
+ REPORTS = "project.report",
111
+ TRANSLATION_STATUS = "project.status",
112
+ SOURCE_FILES_AND_STRINGS = "project.source",
113
+ WEBHOOKS = "project.webhook",
114
+ TRANSLATIONS = "project.translation",
115
+ SCREENSHOTS = "project.screenshot"
116
+ }
117
+ export interface IntegrationLogic {
118
+ /**
119
+ * Customize your app login form
120
+ */
121
+ loginForm: LoginForm;
122
+ /**
123
+ * Define login process via OAuth2 protocol
124
+ */
125
+ oauthLogin?: OAuthLogin;
126
+ /**
127
+ * name of the root folder in Crowdin where files from integration will be stored, default your app name, will be ignored in case if {@link withRootFolder} is false
128
+ */
129
+ appFolderName?: string;
130
+ /**
131
+ * flag that defines if the app should have a dedicated root folder in Crowdin files, default 'false'
132
+ */
133
+ withRootFolder?: boolean;
134
+ /**
135
+ * function which will be used to check connection with integration service
136
+ */
137
+ checkConnection?: (apiCredentials: any) => Promise<void>;
138
+ /**
139
+ * function to get crowdin files that are related with this integration
140
+ */
141
+ getCrowdinFiles?: (projectId: number, client: Crowdin, appRootFolder?: SourceFilesModel.Directory, config?: any) => Promise<TreeItem[]>;
142
+ /**
143
+ * function to get data from integration
144
+ */
145
+ getIntegrationFiles: (apiCredentials: any, config?: any) => Promise<TreeItem[]>;
146
+ /**
147
+ * function to update crowdin files (e.g. pull integration data to crowdin source files)
148
+ */
149
+ updateCrowdin: (projectId: number, client: Crowdin, apiCredentials: any, request: IntegrationFile[], appRootFolder?: SourceFilesModel.Directory, config?: any) => Promise<void>;
150
+ /**
151
+ * function to update integration content (e.g. load crowdin translations and push them to integration service)
152
+ */
153
+ updateIntegration: (projectId: number, client: Crowdin, apiCredentials: any, request: UpdateIntegrationRequest, appRootFolder?: SourceFilesModel.Directory, config?: any) => Promise<void>;
154
+ /**
155
+ * function to define configuration(settings) modal for you app (by default app will not have any custom settings)
156
+ */
157
+ getConfiguration?: (projectId: number, client: Crowdin, apiCredentials: any) => Promise<ConfigurationModalEntity[]>;
158
+ /**
159
+ * flag to turn on auto reload of the tree whenever user updates the configuration
160
+ */
161
+ reloadOnConfigSave?: boolean;
162
+ /**
163
+ * define info modal (help section) for you app (by default app will not have own info section)
164
+ */
165
+ infoModal?: {
166
+ title: string;
167
+ content: string;
168
+ };
169
+ /**
170
+ * background jobs that will be executed for each crowdin project and user
171
+ */
172
+ cronJobs?: CronJob[];
173
+ withCronSync?: {
174
+ crowdin: boolean;
175
+ integration: boolean;
176
+ };
177
+ withWebhookSync?: {
178
+ crowdin: boolean;
179
+ integration: boolean;
180
+ };
181
+ }
182
+ export declare type ConfigurationModalEntity = ConfigurationField | ConfigurationDelimeter;
183
+ export interface ConfigurationField {
184
+ key: string;
185
+ label: string;
186
+ type: 'text' | 'checkbox' | 'select';
187
+ helpText?: string;
188
+ /**
189
+ * only for select
190
+ */
191
+ isMulti?: boolean;
192
+ /**
193
+ * only for select
194
+ */
195
+ options?: {
196
+ label: string;
197
+ value: string;
198
+ }[];
199
+ }
200
+ export interface ConfigurationDelimeter {
201
+ label: string;
202
+ }
203
+ export interface LoginForm {
204
+ fields: FormField[];
205
+ }
206
+ export interface OAuthLogin {
207
+ /**
208
+ * Authorization url (e.g. https://github.com/login/oauth/authorize or https://accounts.google.com/o/oauth2/v2/auth)
209
+ */
210
+ authorizationUrl: string;
211
+ /**
212
+ * Access token url (e.g. https://github.com/login/oauth/access_token)
213
+ */
214
+ accessTokenUrl: string;
215
+ /**
216
+ * Url to refresh token, default will use {@link accessTokenUrl}. Needed when {@link refresh} is enabled
217
+ */
218
+ refreshTokenUrl?: string;
219
+ /**
220
+ * The scopes of access, usually expressed as a list of space-delimited, case-sensitive strings
221
+ */
222
+ scope?: string;
223
+ /**
224
+ * Client id
225
+ */
226
+ clientId: string;
227
+ /**
228
+ * Client secret
229
+ */
230
+ clientSecret: string;
231
+ /**
232
+ * default '/oauth/code'
233
+ */
234
+ redirectUriRoute?: string;
235
+ /**
236
+ * request/response fields mapping
237
+ */
238
+ fieldsMapping?: {
239
+ /**
240
+ * default 'client_id'
241
+ */
242
+ clientId?: string;
243
+ /**
244
+ * default 'client_secret'
245
+ */
246
+ clientSecret?: string;
247
+ /**
248
+ * default 'scope'
249
+ */
250
+ scope?: string;
251
+ /**
252
+ * default 'redirect_uri'
253
+ */
254
+ redirectUri?: string;
255
+ /**
256
+ * default 'code'
257
+ */
258
+ code: string;
259
+ /**
260
+ * default 'access_token'
261
+ */
262
+ accessToken?: string;
263
+ /**
264
+ * default 'refresh_token'
265
+ */
266
+ refreshToken?: string;
267
+ /**
268
+ * default 'expires_in'
269
+ */
270
+ expiresIn?: string;
271
+ };
272
+ /**
273
+ * default 'false' which means that the access token has no expiration date
274
+ */
275
+ refresh?: boolean;
276
+ /**
277
+ * Additional URL parameters for authorizarion url
278
+ */
279
+ extraAutorizationUrlParameters?: {
280
+ [key: string]: string;
281
+ };
282
+ /**
283
+ * Additional parameters for access token request
284
+ */
285
+ extraAccessTokenParameters?: {
286
+ [key: string]: any;
287
+ };
288
+ /**
289
+ * Additional parameters for refresh token request
290
+ */
291
+ extraRefreshTokenParameters?: {
292
+ [key: string]: any;
293
+ };
294
+ /**
295
+ * Override to implement request for retrieving access token (and refresh token if 'refresh' is enabled)
296
+ */
297
+ performGetTokenRequest?: (code: string) => Promise<any>;
298
+ /**
299
+ * Override to implement request for refreshing token (only if 'refresh' is enabled)
300
+ */
301
+ performRefreshTokenRequest?: (currentCredentials: any) => Promise<any>;
302
+ }
303
+ export interface FormField {
304
+ key: string;
305
+ helpText?: string;
306
+ helpTextHtml?: string;
307
+ label: string;
308
+ type?: 'text' | 'password' | 'checkbox';
309
+ }
310
+ export declare type TreeItem = File | Folder;
311
+ export interface File {
312
+ id: string;
313
+ name: string;
314
+ type: SourceFilesModel.FileType;
315
+ parentId?: string;
316
+ }
317
+ export interface Folder {
318
+ id: string;
319
+ name: string;
320
+ parentId?: string;
321
+ }
322
+ export interface IntegrationRequest extends CrowdinClientRequest {
323
+ integrationCredentials: any;
324
+ integrationSettings?: any;
325
+ }
326
+ export interface CrowdinClientRequest extends Request {
327
+ crowdinApiClient: Crowdin;
328
+ crowdinContext: CrowdinContextInfo;
329
+ subscriptionInfo?: SubscriptionInfo;
330
+ }
331
+ export interface CrowdinCredentials {
332
+ id: string;
333
+ appSecret: string;
334
+ domain?: string;
335
+ userId: number;
336
+ organizationId: number;
337
+ baseUrl: string;
338
+ accessToken: string;
339
+ refreshToken: string;
340
+ expire: string;
341
+ type: AccountType;
342
+ }
343
+ export declare enum AccountType {
344
+ NORMAL = "normal",
345
+ ENTERPRISE = "enterprise"
346
+ }
347
+ export interface CrowdinContextInfo {
348
+ jwtPayload: JwtPayload;
349
+ crowdinId: string;
350
+ clientId: string;
351
+ }
352
+ export declare enum SubscriptionInfoType {
353
+ TRIAL = "trial",
354
+ SUBSCRIPTION = "subscription"
355
+ }
356
+ export interface SubscriptionInfo {
357
+ expired: boolean;
358
+ subscribeLink?: string;
359
+ daysLeft?: number;
360
+ type?: SubscriptionInfoType;
361
+ }
362
+ export interface IntegrationCredentials {
363
+ id: string;
364
+ credentials: any;
365
+ crowdinId: string;
366
+ config?: any;
367
+ }
368
+ export interface IntegrationFile {
369
+ id: string;
370
+ name: string;
371
+ type: SourceFilesModel.FileType;
372
+ parentId: string;
373
+ }
374
+ export interface UpdateIntegrationRequest {
375
+ [fileId: string]: string[];
376
+ }
377
+ export interface CronJob {
378
+ task: (projectId: number, client: Crowdin, apiCredentials: any, appRootFolder?: SourceFilesModel.Directory, config?: any) => Promise<void>;
379
+ expression: string;
380
+ }
381
+ export interface CustomFileFormatLogic {
382
+ /**
383
+ * The type parameter value for a custom file format. Used for a custom format file upload via API.
384
+ */
385
+ type: string;
386
+ /**
387
+ * Folder where larger file will be temporary stored (default "{@link dbFolder}/custom-file-format")
388
+ */
389
+ filesFolder?: string;
390
+ /**
391
+ * This parameter is used to combine the content of multiple languages into one request when uploading and downloading translations in your Crowdin project.
392
+ */
393
+ multilingual?: boolean;
394
+ /**
395
+ * Contains fileName and/or fileContent regular expressions used to detect file type when uploading a new source file via UI (or via API without specified type parameter). If the file matches regular expressions, it's labeled as a custom format file.
396
+ */
397
+ signaturePatterns?: SignaturePatterns;
398
+ /**
399
+ * Flag to automatically upload translations
400
+ */
401
+ autoUploadTranslations?: boolean;
402
+ /**
403
+ * Enable strings export
404
+ */
405
+ stringsExport?: boolean;
406
+ /**
407
+ * File extensions (used for strings export)
408
+ */
409
+ extensions?: string[];
410
+ /**
411
+ * Enable custom srx
412
+ */
413
+ customSrxSupported?: boolean;
414
+ /**
415
+ * Used for initial source file upload, source file update, and translation upload
416
+ */
417
+ parseFile?: (fileContent: string | object, req: Omit<ProcessFileRequest, 'jobType' | 'file'>, client: Crowdin, context: CrowdinContextInfo, projectId: number) => Promise<ParseFileResponse>;
418
+ /**
419
+ * Used for translation download
420
+ */
421
+ buildFile?: (fileContent: string | object, req: Omit<ProcessFileRequest, 'jobType' | 'file'>, strings: ProcessFileString[], client: Crowdin, context: CrowdinContextInfo, projectId: number) => Promise<BuildFileResponse>;
422
+ /**
423
+ * Used for strings export
424
+ */
425
+ exportStrings?: (req: Omit<ProcessFileRequest, 'jobType'>, strings: ProcessFileString[], client: Crowdin, context: CrowdinContextInfo, projectId: number) => Promise<BuildFileResponse>;
426
+ }
427
+ export interface SignaturePatterns {
428
+ fileName?: string;
429
+ fileContent?: string;
430
+ }
431
+ export interface ProcessFileRequest {
432
+ jobType: ProcessFileJobType;
433
+ file: ProcessFileRecord;
434
+ sourceLanguage: LanguagesModel.Language;
435
+ targetLanguages: LanguagesModel.Language[];
436
+ strings: ProcessFileString[];
437
+ stringsUrl: string;
438
+ }
439
+ export interface ProcessFileRecord {
440
+ content?: string;
441
+ contentUrl?: string;
442
+ path?: string;
443
+ id?: number;
444
+ name?: string;
445
+ }
446
+ export declare enum ProcessFileJobType {
447
+ PARSE_FILE = "parse-file",
448
+ BUILD_FILE = "build-file"
449
+ }
450
+ export interface ParseFileResponse {
451
+ previewFile?: string;
452
+ strings?: ProcessFileString[];
453
+ error?: string;
454
+ }
455
+ export interface BuildFileResponse {
456
+ contentFile: string;
457
+ error?: string;
458
+ }
459
+ export interface ProcessFileString {
460
+ previewId?: number;
461
+ id: number;
462
+ identifier: string;
463
+ context?: string;
464
+ customData?: string;
465
+ maxLength?: number;
466
+ isHidden?: boolean;
467
+ hasPlurals?: boolean;
468
+ labels?: string[];
469
+ text: string | SourceStringsModel.PluralText;
470
+ translations?: StringTranslations;
471
+ }
472
+ export interface StringTranslations {
473
+ [language: string]: {
474
+ text: string | SourceStringsModel.PluralText;
475
+ };
476
+ }
477
+ export interface CustomMTLogic {
478
+ translate: (client: Crowdin, context: CrowdinContextInfo, projectId: number, source: string, target: string, strings: string[]) => Promise<string[]>;
479
+ validate?: (client: Crowdin) => Promise<void>;
480
+ }
481
+ export interface CustomMTRequest {
482
+ strings: string[];
483
+ }
484
+ export interface UiModule {
485
+ /**
486
+ * path to ui folder (e.g. {@example join(__dirname, 'public')})
487
+ */
488
+ uiPath: string;
489
+ /**
490
+ * page name (default index.html)
491
+ */
492
+ fileName?: string;
493
+ }
494
+ export interface EditorPanels extends UiModule {
495
+ /**
496
+ * The Editor's mode list where the module will be available.
497
+ */
498
+ modes: EditorPanelsMode[];
499
+ }
500
+ export declare enum EditorPanelsMode {
501
+ ASSETS = "assets",
502
+ REVIEW = "review",
503
+ TRANSLATE = "TRANSLATE",
504
+ PROOFREAD = "proofread"
505
+ }
506
+ export interface CrowdinAppUtilities {
507
+ saveMetadata: (id: string, metadata: any) => Promise<void>;
508
+ getMetadata: (id: string) => Promise<any | undefined>;
509
+ deleteMetadata: (id: string) => Promise<void>;
510
+ /**
511
+ * Settings that users manage in the integration module
512
+ */
513
+ getUserSettings: (clientId: string) => Promise<any | undefined>;
514
+ establishCrowdinConnection: (jwtToken: string) => Promise<{
515
+ context: CrowdinContextInfo;
516
+ client?: Crowdin;
517
+ }>;
518
+ }
519
+ export interface IntegrationSyncSettings {
520
+ id: string;
521
+ files?: any;
522
+ integrationId: string;
523
+ crowdinId: string;
524
+ provider: string;
525
+ }
526
+ interface ImagePath {
527
+ /**
528
+ * path to app logo (e.g. {@example join(__dirname, 'logo.png')})
529
+ */
530
+ imagePath?: string;
531
+ }
532
+ export interface Logger {
533
+ enabled: boolean;
534
+ log?: (message: string) => void;
535
+ }
536
+ export interface Pricing {
537
+ planType: 'free' | 'recurring';
538
+ trial?: number;
539
+ trialCrowdin?: number;
540
+ trialEnterprise?: number;
541
+ cachingSeconds?: number;
542
+ infoDisplayDaysThreshold?: number;
543
+ }
544
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditorPanelsMode = exports.ProcessFileJobType = exports.SubscriptionInfoType = exports.AccountType = exports.Scope = void 0;
4
+ var Scope;
5
+ (function (Scope) {
6
+ Scope["ALL_SCOPES"] = "all";
7
+ Scope["NOTIFICATIONS"] = "notification";
8
+ Scope["TRANSLATION_MEMORIES"] = "tm";
9
+ Scope["MACHINE_TRANSLATION_ENGINES"] = "mt";
10
+ Scope["GLOSSARIES"] = "glossary";
11
+ Scope["PROJECTS"] = "project";
12
+ Scope["TASKS"] = "project.task";
13
+ Scope["REPORTS"] = "project.report";
14
+ Scope["TRANSLATION_STATUS"] = "project.status";
15
+ Scope["SOURCE_FILES_AND_STRINGS"] = "project.source";
16
+ Scope["WEBHOOKS"] = "project.webhook";
17
+ Scope["TRANSLATIONS"] = "project.translation";
18
+ Scope["SCREENSHOTS"] = "project.screenshot";
19
+ })(Scope = exports.Scope || (exports.Scope = {}));
20
+ var AccountType;
21
+ (function (AccountType) {
22
+ AccountType["NORMAL"] = "normal";
23
+ AccountType["ENTERPRISE"] = "enterprise";
24
+ })(AccountType = exports.AccountType || (exports.AccountType = {}));
25
+ var SubscriptionInfoType;
26
+ (function (SubscriptionInfoType) {
27
+ SubscriptionInfoType["TRIAL"] = "trial";
28
+ SubscriptionInfoType["SUBSCRIPTION"] = "subscription";
29
+ })(SubscriptionInfoType = exports.SubscriptionInfoType || (exports.SubscriptionInfoType = {}));
30
+ var ProcessFileJobType;
31
+ (function (ProcessFileJobType) {
32
+ ProcessFileJobType["PARSE_FILE"] = "parse-file";
33
+ ProcessFileJobType["BUILD_FILE"] = "build-file";
34
+ })(ProcessFileJobType = exports.ProcessFileJobType || (exports.ProcessFileJobType = {}));
35
+ var EditorPanelsMode;
36
+ (function (EditorPanelsMode) {
37
+ EditorPanelsMode["ASSETS"] = "assets";
38
+ EditorPanelsMode["REVIEW"] = "review";
39
+ EditorPanelsMode["TRANSLATE"] = "TRANSLATE";
40
+ EditorPanelsMode["PROOFREAD"] = "proofread";
41
+ })(EditorPanelsMode = exports.EditorPanelsMode || (exports.EditorPanelsMode = {}));
@@ -0,0 +1,57 @@
1
+ .i_w {
2
+ padding: 16px 24px;
3
+ max-width: 1420px;
4
+ margin: 0 auto;
5
+ }
6
+
7
+ .center {
8
+ text-align: center;
9
+ min-height: calc(100vh - 64px);
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: space-around;
13
+ }
14
+
15
+ .box-center {
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ }
20
+
21
+ .top {
22
+ text-align: right;
23
+ margin-bottom: 10px;
24
+ }
25
+
26
+ .login {
27
+ margin-bottom: 10px;
28
+ }
29
+
30
+ .login img {
31
+ max-width: 70px;
32
+ max-height: 70px;
33
+ width: auto;
34
+ height: auto;
35
+ }
36
+
37
+ .login crowdin-input {
38
+ margin-bottom: 8px;
39
+ display: block;
40
+ }
41
+
42
+ .login .inputs {
43
+ margin-bottom: 24px;
44
+ text-align: left;
45
+ }
46
+
47
+ .login crowdin-h4 {
48
+ margin: 8px 0 16px;
49
+ }
50
+
51
+ .ml-1 {
52
+ margin-left: 8px;
53
+ }
54
+
55
+ .m-0 {
56
+ margin: 0;
57
+ }