@codecademy/codebytes 0.6.1 → 0.6.3-alpha.e74dd5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/MonacoEditor/colorsDark.d.ts +32 -0
  3. package/{src/MonacoEditor/colorsDark.ts → dist/MonacoEditor/colorsDark.js} +8 -16
  4. package/dist/MonacoEditor/index.d.ts +7 -0
  5. package/dist/MonacoEditor/index.js +42 -0
  6. package/dist/MonacoEditor/theme.d.ts +2 -0
  7. package/dist/MonacoEditor/theme.js +122 -0
  8. package/dist/MonacoEditor/types.d.ts +1 -0
  9. package/dist/MonacoEditor/types.js +0 -0
  10. package/dist/__tests__/codebyte-test.d.ts +1 -0
  11. package/dist/__tests__/codebyte-test.js +195 -0
  12. package/dist/__tests__/editor-test.d.ts +1 -0
  13. package/dist/__tests__/editor-test.js +147 -0
  14. package/dist/__tests__/helpers-test.d.ts +1 -0
  15. package/dist/__tests__/helpers-test.js +117 -0
  16. package/dist/__tests__/language-selection-test.d.ts +1 -0
  17. package/dist/__tests__/language-selection-test.js +15 -0
  18. package/dist/__tests__/mocks.d.ts +0 -0
  19. package/dist/__tests__/mocks.js +13 -0
  20. package/dist/api.d.ts +12 -0
  21. package/dist/api.js +39 -0
  22. package/dist/codeByteEditor.d.ts +13 -0
  23. package/dist/codeByteEditor.js +134 -0
  24. package/dist/consts.d.ts +23 -0
  25. package/dist/consts.js +34 -0
  26. package/dist/drawers.d.ts +6 -0
  27. package/dist/drawers.js +148 -0
  28. package/dist/editor.d.ts +13 -0
  29. package/dist/editor.js +189 -0
  30. package/dist/helpers/index.d.ts +15 -0
  31. package/dist/helpers/index.js +29 -0
  32. package/{src/index.ts → dist/index.d.ts} +0 -0
  33. package/dist/index.js +2 -0
  34. package/dist/languageSelection.d.ts +6 -0
  35. package/dist/languageSelection.js +22 -0
  36. package/dist/libs/eventTracking.d.ts +1 -0
  37. package/dist/libs/eventTracking.js +11 -0
  38. package/{src → dist}/theme.d.ts +0 -0
  39. package/dist/types.d.ts +14 -0
  40. package/dist/types.js +0 -0
  41. package/package.json +7 -3
  42. package/babel.config.js +0 -15
  43. package/jest.config.js +0 -1
  44. package/src/MonacoEditor/index.tsx +0 -56
  45. package/src/MonacoEditor/theme.ts +0 -64
  46. package/src/MonacoEditor/types.ts +0 -1
  47. package/src/__tests__/codebyte-test.tsx +0 -197
  48. package/src/__tests__/editor-test.tsx +0 -113
  49. package/src/__tests__/helpers-test.tsx +0 -121
  50. package/src/__tests__/language-selection-test.tsx +0 -14
  51. package/src/__tests__/mocks.ts +0 -8
  52. package/src/api.ts +0 -28
  53. package/src/codeByteEditor.tsx +0 -118
  54. package/src/consts.ts +0 -64
  55. package/src/drawers.tsx +0 -132
  56. package/src/editor.tsx +0 -160
  57. package/src/helpers/index.ts +0 -41
  58. package/src/languageSelection.tsx +0 -26
  59. package/src/libs/eventTracking.ts +0 -18
  60. package/src/types.ts +0 -15
  61. package/tsconfig.json +0 -8
package/dist/editor.js ADDED
@@ -0,0 +1,189 @@
1
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
2
+ import _styled from "@emotion/styled/base";
3
+
4
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
5
+
6
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
7
+
8
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
9
+
10
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
11
+
12
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
13
+
14
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
15
+
16
+ function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
17
+
18
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
19
+
20
+ function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
21
+
22
+ import { FillButton, FlexBox, Spinner, TextButton, ToolTip } from '@codecademy/gamut';
23
+ import { CopyIcon } from '@codecademy/gamut-icons';
24
+ import React, { useState } from 'react';
25
+ import { postSnippet } from './api';
26
+ import { Drawers } from './drawers';
27
+ import { trackClick } from './helpers';
28
+ import { SimpleMonacoEditor } from './MonacoEditor';
29
+
30
+ var Output = _styled("pre", {
31
+ target: "e1lzxy8e1",
32
+ label: "Output"
33
+ })("width:100%;height:100%;margin:0;padding:0 1rem;font-family:Monaco;font-size:0.875rem;overflow:auto;", function (_ref) {
34
+ var hasError = _ref.hasError,
35
+ theme = _ref.theme;
36
+ return "\n color: ".concat(hasError ? theme.colors.orange : theme.colors.white, ";\n background-color: ").concat(theme.colors['navy-900'], ";\n");
37
+ }, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCZ0QiLCJmaWxlIjoiLi4vc3JjL2VkaXRvci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGaWxsQnV0dG9uLFxuICBGbGV4Qm94LFxuICBTcGlubmVyLFxuICBUZXh0QnV0dG9uLFxuICBUb29sVGlwLFxufSBmcm9tICdAY29kZWNhZGVteS9nYW11dCc7XG5pbXBvcnQgeyBDb3B5SWNvbiB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LWljb25zJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgcG9zdFNuaXBwZXQgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlT3B0aW9uIH0gZnJvbSAnLi9jb25zdHMnO1xuaW1wb3J0IHsgRHJhd2VycyB9IGZyb20gJy4vZHJhd2Vycyc7XG5pbXBvcnQgeyB0cmFja0NsaWNrIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFNpbXBsZU1vbmFjb0VkaXRvciB9IGZyb20gJy4vTW9uYWNvRWRpdG9yJztcbmltcG9ydCB7IENvZGVieXRlc0NoYW5nZUhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgT3V0cHV0ID0gc3R5bGVkLnByZTx7IGhhc0Vycm9yOiBib29sZWFuIH0+YFxuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgMXJlbTtcbiAgZm9udC1mYW1pbHk6IE1vbmFjbztcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gICR7KHsgaGFzRXJyb3IsIHRoZW1lIH0pID0+IGBcbiAgY29sb3I6ICR7aGFzRXJyb3IgPyB0aGVtZS5jb2xvcnMub3JhbmdlIDogdGhlbWUuY29sb3JzLndoaXRlfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHt0aGVtZS5jb2xvcnNbJ25hdnktOTAwJ119O1xuYH1cbmA7XG5cbmNvbnN0IENvcHlJY29uU3R5bGVkID0gc3R5bGVkKENvcHlJY29uKWBcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG5gO1xuXG5jb25zdCBET0NLRVJfU0lHVEVSTSA9IDE0MztcblxudHlwZSBFZGl0b3JQcm9wcyA9IHtcbiAgaGlkZUNvcHlCdXR0b246IGJvb2xlYW47XG4gIGxhbmd1YWdlOiBMYW5ndWFnZU9wdGlvbjtcbiAgdGV4dDogc3RyaW5nO1xuICBvbkNoYW5nZTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgc25pcHBldHNCYXNlVXJsPzogc3RyaW5nO1xuICBvbkNvcHk/OiBDb2RlYnl0ZXNDaGFuZ2VIYW5kbGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IEVkaXRvcjogUmVhY3QuRkM8RWRpdG9yUHJvcHM+ID0gKHtcbiAgbGFuZ3VhZ2UsXG4gIHRleHQsXG4gIGhpZGVDb3B5QnV0dG9uLFxuICBvbkNoYW5nZSxcbiAgb25Db3B5LFxuICBzbmlwcGV0c0Jhc2VVcmwsXG59KSA9PiB7XG4gIGNvbnN0IFtvdXRwdXQsIHNldE91dHB1dF0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSB1c2VTdGF0ZTwncmVhZHknIHwgJ3dhaXRpbmcnIHwgJ2Vycm9yJz4oJ3JlYWR5Jyk7XG4gIGNvbnN0IFtpc0NvZGVCeXRlQ29waWVkLCBzZXRJc0NvZGVCeXRlQ29waWVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgb25Db3B5Q2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0NvZGVCeXRlQ29waWVkKSB7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkXG4gICAgICAgIC53cml0ZVRleHQodGV4dClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLmNhdGNoKCgpID0+IGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5JykpO1xuICAgICAgc2V0SXNDb2RlQnl0ZUNvcGllZCh0cnVlKTtcbiAgICAgIG9uQ29weT8uKHRleHQsIGxhbmd1YWdlKTtcbiAgICAgIHRyYWNrQ2xpY2soJ2NvcHknKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQgPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0T3V0cHV0KG1lc3NhZ2UpO1xuICAgIHNldFN0YXR1cygnZXJyb3InKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBjb2RlOiB0ZXh0LFxuICAgIH07XG4gICAgc2V0U3RhdHVzKCd3YWl0aW5nJyk7XG4gICAgc2V0T3V0cHV0KCcnKTtcbiAgICB0cmFja0NsaWNrKCdydW4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RTbmlwcGV0KGRhdGEsIHNuaXBwZXRzQmFzZVVybCk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RkZXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQocmVzcG9uc2Uuc3RkZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXhpdF9jb2RlID09PSBET0NLRVJfU0lHVEVSTSkge1xuICAgICAgICBzZXRFcnJvclN0YXR1c0FuZE91dHB1dChcbiAgICAgICAgICAnWW91ciBjb2RlIHRvb2sgdG9vIGxvbmcgdG8gcmV0dXJuIGEgcmVzdWx0LiBEb3VibGUgY2hlY2sgeW91ciBjb2RlIGZvciBhbnkgaXNzdWVzIGFuZCB0cnkgYWdhaW4hJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5leGl0X2NvZGUgIT09IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE91dHB1dChyZXNwb25zZS5zdGRvdXQpO1xuICAgICAgICBzZXRTdGF0dXMoJ3JlYWR5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldEVycm9yU3RhdHVzQW5kT3V0cHV0KCdFcnJvcjogJyArIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERyYXdlcnNcbiAgICAgICAgbGVmdENoaWxkPXtcbiAgICAgICAgICA8U2ltcGxlTW9uYWNvRWRpdG9yXG4gICAgICAgICAgICB2YWx1ZT17dGV4dH1cbiAgICAgICAgICAgIGxhbmd1YWdlPXtsYW5ndWFnZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0Q2hpbGQ9e1xuICAgICAgICAgIDxPdXRwdXQgaGFzRXJyb3I9e3N0YXR1cyA9PT0gJ2Vycm9yJ30gYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICB7b3V0cHV0fVxuICAgICAgICAgIDwvT3V0cHV0PlxuICAgICAgICB9XG4gICAgICAvPlxuICAgICAgPEZsZXhCb3hcbiAgICAgICAganVzdGlmeUNvbnRlbnQ9e2hpZGVDb3B5QnV0dG9uID8gJ2ZsZXgtZW5kJyA6ICdzcGFjZS1iZXR3ZWVuJ31cbiAgICAgICAgcGw9ezh9XG4gICAgICA+XG4gICAgICAgIHshaGlkZUNvcHlCdXR0b24gPyAoXG4gICAgICAgICAgPFRvb2xUaXBcbiAgICAgICAgICAgIGlkPVwiY29kZWJ5dGUtY29waWVkXCJcbiAgICAgICAgICAgIGFsaWdubWVudD1cInRvcC1yaWdodFwiXG4gICAgICAgICAgICBtb2RlPVwiZGFya1wiXG4gICAgICAgICAgICB0YXJnZXQ9e1xuICAgICAgICAgICAgICA8VGV4dEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ29weUNsaWNrfVxuICAgICAgICAgICAgICAgIG9uQmx1cj17KCkgPT4gc2V0SXNDb2RlQnl0ZUNvcGllZChmYWxzZSl9XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJjb3B5LWNvZGVieXRlLWJ0blwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q29weUljb25TdHlsZWQgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz4gQ29weSBDb2RlYnl0ZVxuICAgICAgICAgICAgICA8L1RleHRCdXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2lzQ29kZUJ5dGVDb3BpZWQgPyAoXG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiY29weS1jb25maXJtYXRpb24tdG9vbHRpcFwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgIENvcGllZCFcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJjb3B5LXByb21wdC10b29sdGlwXCI+XG4gICAgICAgICAgICAgICAgQ29weSB0byB5b3VyIGNsaXBib2FyZFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVG9vbFRpcD5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxGaWxsQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAge3N0YXR1cyA9PT0gJ3dhaXRpbmcnID8gPFNwaW5uZXIgLz4gOiAnUnVuJ31cbiAgICAgICAgPC9GaWxsQnV0dG9uPlxuICAgICAgPC9GbGV4Qm94PlxuICAgIDwvPlxuICApO1xufTtcbiJdfQ== */"));
38
+
39
+ var CopyIconStyled = /*#__PURE__*/_styled(CopyIcon, {
40
+ target: "e1lzxy8e0",
41
+ label: "CopyIconStyled"
42
+ })(process.env.NODE_ENV === "production" ? {
43
+ name: "u7ytkp",
44
+ styles: "margin-right:0.5rem"
45
+ } : {
46
+ name: "u7ytkp",
47
+ styles: "margin-right:0.5rem",
48
+ map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdDdUMiLCJmaWxlIjoiLi4vc3JjL2VkaXRvci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGaWxsQnV0dG9uLFxuICBGbGV4Qm94LFxuICBTcGlubmVyLFxuICBUZXh0QnV0dG9uLFxuICBUb29sVGlwLFxufSBmcm9tICdAY29kZWNhZGVteS9nYW11dCc7XG5pbXBvcnQgeyBDb3B5SWNvbiB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LWljb25zJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgcG9zdFNuaXBwZXQgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlT3B0aW9uIH0gZnJvbSAnLi9jb25zdHMnO1xuaW1wb3J0IHsgRHJhd2VycyB9IGZyb20gJy4vZHJhd2Vycyc7XG5pbXBvcnQgeyB0cmFja0NsaWNrIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFNpbXBsZU1vbmFjb0VkaXRvciB9IGZyb20gJy4vTW9uYWNvRWRpdG9yJztcbmltcG9ydCB7IENvZGVieXRlc0NoYW5nZUhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgT3V0cHV0ID0gc3R5bGVkLnByZTx7IGhhc0Vycm9yOiBib29sZWFuIH0+YFxuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgMXJlbTtcbiAgZm9udC1mYW1pbHk6IE1vbmFjbztcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gICR7KHsgaGFzRXJyb3IsIHRoZW1lIH0pID0+IGBcbiAgY29sb3I6ICR7aGFzRXJyb3IgPyB0aGVtZS5jb2xvcnMub3JhbmdlIDogdGhlbWUuY29sb3JzLndoaXRlfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHt0aGVtZS5jb2xvcnNbJ25hdnktOTAwJ119O1xuYH1cbmA7XG5cbmNvbnN0IENvcHlJY29uU3R5bGVkID0gc3R5bGVkKENvcHlJY29uKWBcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG5gO1xuXG5jb25zdCBET0NLRVJfU0lHVEVSTSA9IDE0MztcblxudHlwZSBFZGl0b3JQcm9wcyA9IHtcbiAgaGlkZUNvcHlCdXR0b246IGJvb2xlYW47XG4gIGxhbmd1YWdlOiBMYW5ndWFnZU9wdGlvbjtcbiAgdGV4dDogc3RyaW5nO1xuICBvbkNoYW5nZTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgc25pcHBldHNCYXNlVXJsPzogc3RyaW5nO1xuICBvbkNvcHk/OiBDb2RlYnl0ZXNDaGFuZ2VIYW5kbGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IEVkaXRvcjogUmVhY3QuRkM8RWRpdG9yUHJvcHM+ID0gKHtcbiAgbGFuZ3VhZ2UsXG4gIHRleHQsXG4gIGhpZGVDb3B5QnV0dG9uLFxuICBvbkNoYW5nZSxcbiAgb25Db3B5LFxuICBzbmlwcGV0c0Jhc2VVcmwsXG59KSA9PiB7XG4gIGNvbnN0IFtvdXRwdXQsIHNldE91dHB1dF0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSB1c2VTdGF0ZTwncmVhZHknIHwgJ3dhaXRpbmcnIHwgJ2Vycm9yJz4oJ3JlYWR5Jyk7XG4gIGNvbnN0IFtpc0NvZGVCeXRlQ29waWVkLCBzZXRJc0NvZGVCeXRlQ29waWVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgb25Db3B5Q2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0NvZGVCeXRlQ29waWVkKSB7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkXG4gICAgICAgIC53cml0ZVRleHQodGV4dClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLmNhdGNoKCgpID0+IGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5JykpO1xuICAgICAgc2V0SXNDb2RlQnl0ZUNvcGllZCh0cnVlKTtcbiAgICAgIG9uQ29weT8uKHRleHQsIGxhbmd1YWdlKTtcbiAgICAgIHRyYWNrQ2xpY2soJ2NvcHknKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQgPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0T3V0cHV0KG1lc3NhZ2UpO1xuICAgIHNldFN0YXR1cygnZXJyb3InKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBjb2RlOiB0ZXh0LFxuICAgIH07XG4gICAgc2V0U3RhdHVzKCd3YWl0aW5nJyk7XG4gICAgc2V0T3V0cHV0KCcnKTtcbiAgICB0cmFja0NsaWNrKCdydW4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RTbmlwcGV0KGRhdGEsIHNuaXBwZXRzQmFzZVVybCk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RkZXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQocmVzcG9uc2Uuc3RkZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXhpdF9jb2RlID09PSBET0NLRVJfU0lHVEVSTSkge1xuICAgICAgICBzZXRFcnJvclN0YXR1c0FuZE91dHB1dChcbiAgICAgICAgICAnWW91ciBjb2RlIHRvb2sgdG9vIGxvbmcgdG8gcmV0dXJuIGEgcmVzdWx0LiBEb3VibGUgY2hlY2sgeW91ciBjb2RlIGZvciBhbnkgaXNzdWVzIGFuZCB0cnkgYWdhaW4hJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5leGl0X2NvZGUgIT09IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE91dHB1dChyZXNwb25zZS5zdGRvdXQpO1xuICAgICAgICBzZXRTdGF0dXMoJ3JlYWR5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldEVycm9yU3RhdHVzQW5kT3V0cHV0KCdFcnJvcjogJyArIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERyYXdlcnNcbiAgICAgICAgbGVmdENoaWxkPXtcbiAgICAgICAgICA8U2ltcGxlTW9uYWNvRWRpdG9yXG4gICAgICAgICAgICB2YWx1ZT17dGV4dH1cbiAgICAgICAgICAgIGxhbmd1YWdlPXtsYW5ndWFnZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0Q2hpbGQ9e1xuICAgICAgICAgIDxPdXRwdXQgaGFzRXJyb3I9e3N0YXR1cyA9PT0gJ2Vycm9yJ30gYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICB7b3V0cHV0fVxuICAgICAgICAgIDwvT3V0cHV0PlxuICAgICAgICB9XG4gICAgICAvPlxuICAgICAgPEZsZXhCb3hcbiAgICAgICAganVzdGlmeUNvbnRlbnQ9e2hpZGVDb3B5QnV0dG9uID8gJ2ZsZXgtZW5kJyA6ICdzcGFjZS1iZXR3ZWVuJ31cbiAgICAgICAgcGw9ezh9XG4gICAgICA+XG4gICAgICAgIHshaGlkZUNvcHlCdXR0b24gPyAoXG4gICAgICAgICAgPFRvb2xUaXBcbiAgICAgICAgICAgIGlkPVwiY29kZWJ5dGUtY29waWVkXCJcbiAgICAgICAgICAgIGFsaWdubWVudD1cInRvcC1yaWdodFwiXG4gICAgICAgICAgICBtb2RlPVwiZGFya1wiXG4gICAgICAgICAgICB0YXJnZXQ9e1xuICAgICAgICAgICAgICA8VGV4dEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ29weUNsaWNrfVxuICAgICAgICAgICAgICAgIG9uQmx1cj17KCkgPT4gc2V0SXNDb2RlQnl0ZUNvcGllZChmYWxzZSl9XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJjb3B5LWNvZGVieXRlLWJ0blwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q29weUljb25TdHlsZWQgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz4gQ29weSBDb2RlYnl0ZVxuICAgICAgICAgICAgICA8L1RleHRCdXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2lzQ29kZUJ5dGVDb3BpZWQgPyAoXG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiY29weS1jb25maXJtYXRpb24tdG9vbHRpcFwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgIENvcGllZCFcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJjb3B5LXByb21wdC10b29sdGlwXCI+XG4gICAgICAgICAgICAgICAgQ29weSB0byB5b3VyIGNsaXBib2FyZFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVG9vbFRpcD5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxGaWxsQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAge3N0YXR1cyA9PT0gJ3dhaXRpbmcnID8gPFNwaW5uZXIgLz4gOiAnUnVuJ31cbiAgICAgICAgPC9GaWxsQnV0dG9uPlxuICAgICAgPC9GbGV4Qm94PlxuICAgIDwvPlxuICApO1xufTtcbiJdfQ== */",
49
+ toString: _EMOTION_STRINGIFIED_CSS_ERROR__
50
+ });
51
+
52
+ var DOCKER_SIGTERM = 143;
53
+ export var Editor = function Editor(_ref2) {
54
+ var language = _ref2.language,
55
+ text = _ref2.text,
56
+ hideCopyButton = _ref2.hideCopyButton,
57
+ onChange = _ref2.onChange,
58
+ onCopy = _ref2.onCopy,
59
+ snippetsBaseUrl = _ref2.snippetsBaseUrl;
60
+
61
+ var _useState = useState(''),
62
+ _useState2 = _slicedToArray(_useState, 2),
63
+ output = _useState2[0],
64
+ setOutput = _useState2[1];
65
+
66
+ var _useState3 = useState('ready'),
67
+ _useState4 = _slicedToArray(_useState3, 2),
68
+ status = _useState4[0],
69
+ setStatus = _useState4[1];
70
+
71
+ var _useState5 = useState(false),
72
+ _useState6 = _slicedToArray(_useState5, 2),
73
+ isCodeByteCopied = _useState6[0],
74
+ setIsCodeByteCopied = _useState6[1];
75
+
76
+ var onCopyClick = function onCopyClick() {
77
+ if (!isCodeByteCopied) {
78
+ navigator.clipboard.writeText(text) // eslint-disable-next-line no-console
79
+ ["catch"](function () {
80
+ return console.error('Failed to copy');
81
+ });
82
+ setIsCodeByteCopied(true);
83
+ onCopy === null || onCopy === void 0 ? void 0 : onCopy(text, language);
84
+ trackClick('copy');
85
+ }
86
+ };
87
+
88
+ var setErrorStatusAndOutput = function setErrorStatusAndOutput(message) {
89
+ setOutput(message);
90
+ setStatus('error');
91
+ };
92
+
93
+ var handleSubmit = /*#__PURE__*/function () {
94
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
95
+ var data, response;
96
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
97
+ while (1) {
98
+ switch (_context.prev = _context.next) {
99
+ case 0:
100
+ if (!(text.trim().length === 0)) {
101
+ _context.next = 2;
102
+ break;
103
+ }
104
+
105
+ return _context.abrupt("return");
106
+
107
+ case 2:
108
+ data = {
109
+ language: language,
110
+ code: text
111
+ };
112
+ setStatus('waiting');
113
+ setOutput('');
114
+ trackClick('run');
115
+ _context.prev = 6;
116
+ _context.next = 9;
117
+ return postSnippet(data, snippetsBaseUrl);
118
+
119
+ case 9:
120
+ response = _context.sent;
121
+
122
+ if (response.stderr.length > 0) {
123
+ setErrorStatusAndOutput(response.stderr);
124
+ } else if (response.exit_code === DOCKER_SIGTERM) {
125
+ setErrorStatusAndOutput('Your code took too long to return a result. Double check your code for any issues and try again!');
126
+ } else if (response.exit_code !== 0) {
127
+ setErrorStatusAndOutput('An unknown error occured.');
128
+ } else {
129
+ setOutput(response.stdout);
130
+ setStatus('ready');
131
+ }
132
+
133
+ _context.next = 16;
134
+ break;
135
+
136
+ case 13:
137
+ _context.prev = 13;
138
+ _context.t0 = _context["catch"](6);
139
+ setErrorStatusAndOutput('Error: ' + _context.t0);
140
+
141
+ case 16:
142
+ case "end":
143
+ return _context.stop();
144
+ }
145
+ }
146
+ }, _callee, null, [[6, 13]]);
147
+ }));
148
+
149
+ return function handleSubmit() {
150
+ return _ref3.apply(this, arguments);
151
+ };
152
+ }();
153
+
154
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Drawers, {
155
+ leftChild: /*#__PURE__*/React.createElement(SimpleMonacoEditor, {
156
+ value: text,
157
+ language: language,
158
+ onChange: onChange
159
+ }),
160
+ rightChild: /*#__PURE__*/React.createElement(Output, {
161
+ hasError: status === 'error',
162
+ "aria-live": "polite"
163
+ }, output)
164
+ }), /*#__PURE__*/React.createElement(FlexBox, {
165
+ justifyContent: hideCopyButton ? 'flex-end' : 'space-between',
166
+ pl: 8
167
+ }, !hideCopyButton ? /*#__PURE__*/React.createElement(ToolTip, {
168
+ id: "codebyte-copied",
169
+ alignment: "top-right",
170
+ mode: "dark",
171
+ target: /*#__PURE__*/React.createElement(TextButton, {
172
+ variant: "secondary",
173
+ onClick: onCopyClick,
174
+ onBlur: function onBlur() {
175
+ return setIsCodeByteCopied(false);
176
+ },
177
+ "data-testid": "copy-codebyte-btn"
178
+ }, /*#__PURE__*/React.createElement(CopyIconStyled, {
179
+ "aria-hidden": "true"
180
+ }), " Copy Codebyte")
181
+ }, isCodeByteCopied ? /*#__PURE__*/React.createElement("span", {
182
+ "data-testid": "copy-confirmation-tooltip",
183
+ role: "alert"
184
+ }, "Copied!") : /*#__PURE__*/React.createElement("span", {
185
+ "data-testid": "copy-prompt-tooltip"
186
+ }, "Copy to your clipboard")) : null, /*#__PURE__*/React.createElement(FillButton, {
187
+ onClick: handleSubmit
188
+ }, status === 'waiting' ? /*#__PURE__*/React.createElement(Spinner, null) : 'Run')));
189
+ };
@@ -0,0 +1,15 @@
1
+ export declare type CodebyteOptions = {
2
+ clientName: string;
3
+ parentPage: string;
4
+ renderMode: string;
5
+ };
6
+ export declare enum CodebytesParams {
7
+ Language = "lang",
8
+ Text = "text",
9
+ CopyMode = "copy-mode",
10
+ ClientName = "client-name",
11
+ Page = "page",
12
+ Mode = "mode"
13
+ }
14
+ export declare const getOptions: () => CodebyteOptions;
15
+ export declare const trackClick: (target: string) => void;
@@ -0,0 +1,29 @@
1
+ import { trackUserClick } from '../libs/eventTracking';
2
+ export var CodebytesParams;
3
+
4
+ (function (CodebytesParams) {
5
+ CodebytesParams["Language"] = "lang";
6
+ CodebytesParams["Text"] = "text";
7
+ CodebytesParams["CopyMode"] = "copy-mode";
8
+ CodebytesParams["ClientName"] = "client-name";
9
+ CodebytesParams["Page"] = "page";
10
+ CodebytesParams["Mode"] = "mode";
11
+ })(CodebytesParams || (CodebytesParams = {}));
12
+
13
+ export var getOptions = function getOptions() {
14
+ var currentUri = new URL(window.location.href);
15
+ return {
16
+ clientName: currentUri.searchParams.get(CodebytesParams.ClientName) || 'Unknown',
17
+ parentPage: currentUri.searchParams.get(CodebytesParams.Page) || document.referrer,
18
+ renderMode: currentUri.searchParams.get(CodebytesParams.Mode) || ''
19
+ };
20
+ };
21
+ export var trackClick = function trackClick(target) {
22
+ var options = getOptions();
23
+ var page_name = options.renderMode ? "".concat(options.clientName, "_").concat(options.renderMode) : options.clientName;
24
+ trackUserClick({
25
+ page_name: page_name,
26
+ context: options.parentPage,
27
+ target: target
28
+ });
29
+ };
File without changes
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './codeByteEditor';
2
+ export { LanguageOption, LanguageOptions } from './consts';
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { LanguageOption } from './consts';
3
+ export declare type LanguageSelectionProps = {
4
+ onChange: (newLanguage: LanguageOption) => void;
5
+ };
6
+ export declare const LanguageSelection: React.FC<LanguageSelectionProps>;
@@ -0,0 +1,22 @@
1
+ import { Select, Text } from '@codecademy/gamut';
2
+ import { ColorMode } from '@codecademy/gamut-styles';
3
+ import React from 'react';
4
+ import { LanguageOptions } from './consts';
5
+ export var LanguageSelection = function LanguageSelection(_ref) {
6
+ var _onChange = _ref.onChange;
7
+ return /*#__PURE__*/React.createElement(ColorMode, {
8
+ mode: "dark",
9
+ flex: 1,
10
+ px: 16,
11
+ pt: 48
12
+ }, /*#__PURE__*/React.createElement(Text, {
13
+ mb: 16
14
+ }, "Which language do you want to code in?"), /*#__PURE__*/React.createElement(Select, {
15
+ id: "language-select",
16
+ "aria-label": "Select a language",
17
+ options: LanguageOptions,
18
+ onChange: function onChange(e) {
19
+ return _onChange(e.target.value);
20
+ }
21
+ }));
22
+ };
@@ -0,0 +1 @@
1
+ export declare const trackUserClick: (data: import("@codecademy/tracking").UserClickData) => void, trackUserVisit: (data: import("@codecademy/tracking").UserVisitData) => void, trackUserImpression: (data: import("@codecademy/tracking").UserImpressionData) => void;
@@ -0,0 +1,11 @@
1
+ import { createTracker } from '@codecademy/tracking';
2
+ var IS_DEV = process.env.NODE_ENV === 'development'; // TODO: confirm tracking details and implementation DISC-447
3
+
4
+ var tracker = createTracker({
5
+ apiBaseUrl: typeof window === 'undefined' ? 'https://www.codecademy.com' : window.location.origin,
6
+ verbose: IS_DEV
7
+ });
8
+ var trackUserClick = tracker.click,
9
+ trackUserVisit = tracker.visit,
10
+ trackUserImpression = tracker.impression;
11
+ export { trackUserClick, trackUserVisit, trackUserImpression };
File without changes
@@ -0,0 +1,14 @@
1
+ import { LanguageOption } from './consts';
2
+ export interface CodebytesChangeHandler {
3
+ (text: string, language: LanguageOption): void;
4
+ }
5
+ export interface CodeByteEditorProps {
6
+ text?: string;
7
+ language?: LanguageOption;
8
+ hideCopyButton?: boolean;
9
+ onCopy?: CodebytesChangeHandler;
10
+ isIFrame?: boolean;
11
+ snippetsBaseUrl?: string;
12
+ onEdit?: CodebytesChangeHandler;
13
+ onLanguageChange?: CodebytesChangeHandler;
14
+ }
package/dist/types.js ADDED
File without changes
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@codecademy/codebytes",
3
3
  "description": "Codebytes Code Editor",
4
- "version": "0.6.1",
4
+ "version": "0.6.3-alpha.e74dd5.0",
5
5
  "author": "Codecademy Engineering <dev@codecademy.com>",
6
6
  "sideEffects": [
7
7
  "**/*.css",
@@ -16,6 +16,7 @@
16
16
  "url": "git@github.com:Codecademy/client-modules.git"
17
17
  },
18
18
  "peerDependencies": {
19
+ "@codecademy/tracking": "0.18.0",
19
20
  "react": ">=16.8.1",
20
21
  "react-dom": ">=16.8.1"
21
22
  },
@@ -23,7 +24,6 @@
23
24
  "@codecademy/gamut": "*",
24
25
  "@codecademy/gamut-icons": "*",
25
26
  "@codecademy/gamut-styles": "*",
26
- "@codecademy/tracking": "0.18.0",
27
27
  "@codecademy/variance": "*",
28
28
  "@emotion/react": "^11.4.0",
29
29
  "@emotion/styled": "^11.3.0",
@@ -45,6 +45,7 @@
45
45
  "license": "MIT",
46
46
  "devDependencies": {
47
47
  "@codecademy/gamut-tests": "*",
48
+ "@codecademy/tracking": "0.18.0",
48
49
  "@emotion/jest": "^11.3.0",
49
50
  "@testing-library/dom": "^7.31.2",
50
51
  "@testing-library/react": "^11.0.4",
@@ -57,5 +58,8 @@
57
58
  "publishConfig": {
58
59
  "access": "public"
59
60
  },
60
- "gitHead": "42fa1970877fa986d8796841120048166c0e6494"
61
+ "files": [
62
+ "dist/**"
63
+ ],
64
+ "gitHead": "298fb5cbf2aea93bd38e779ad9323c42f6e3bec8"
61
65
  }
package/babel.config.js DELETED
@@ -1,15 +0,0 @@
1
- module.exports = {
2
- presets: ['codecademy', '@babel/preset-typescript'],
3
- plugins: [
4
- [
5
- '@emotion',
6
- {
7
- sourceMap: true,
8
- autoLabel: 'always',
9
- labelFormat: '[local]',
10
- },
11
- ],
12
- ],
13
- include: ['./src/**/*'],
14
- ignore: ['__tests__', './**/*.d.ts'],
15
- };
package/jest.config.js DELETED
@@ -1 +0,0 @@
1
- module.exports = require('../../jest.config.base')('codebytes');
@@ -1,56 +0,0 @@
1
- // DO NOT CHANGE ANYTHING HERE
2
- // This component is part of the Codebytes MVP and only includes basic configuration around theming
3
- // We are working on a monaco package in client-modules that has more configuration around themes and languages
4
- // Monaco as a shared package RFC https://www.notion.so/codecademy/Monaco-editor-as-a-shared-package-1f4484db165b4abc8394c3556451ef6a
5
-
6
- import ReactMonacoEditor, { OnMount } from '@monaco-editor/react';
7
- import { editor } from 'monaco-editor/esm/vs/editor/editor.api';
8
- import React, { useCallback, useRef } from 'react';
9
- import ResizeObserver from 'react-resize-observer';
10
-
11
- import { dark } from './theme';
12
- import { Monaco } from './types';
13
-
14
- export type SimpleMonacoEditorProps = {
15
- value: string;
16
- language: string;
17
- onChange?: (value: string) => void;
18
- };
19
-
20
- type ThemedEditor = Parameters<OnMount>[0];
21
-
22
- export const SimpleMonacoEditor: React.FC<SimpleMonacoEditorProps> = ({
23
- value,
24
- language,
25
- onChange,
26
- }) => {
27
- const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);
28
- const editorWillMount = useCallback(
29
- (editor: ThemedEditor, monaco: Monaco) => {
30
- editorRef.current = editor;
31
- monaco.editor.defineTheme('dark', dark);
32
- monaco.editor.setTheme('dark');
33
- },
34
- []
35
- );
36
- return (
37
- <>
38
- <ResizeObserver
39
- onResize={({ height, width }) => {
40
- editorRef.current?.layout({
41
- height,
42
- width,
43
- });
44
- }}
45
- />
46
- <ReactMonacoEditor
47
- onMount={editorWillMount}
48
- onChange={onChange}
49
- options={{ minimap: { enabled: false } }}
50
- theme="vs-dark"
51
- value={value}
52
- language={language}
53
- />
54
- </>
55
- );
56
- };
@@ -1,64 +0,0 @@
1
- // DO NOT CHANGE ANYTHING HERE
2
- // This file is part of the Codebytes MVP and only includes basic configuration around theming for the SimpleMonacoEditor component
3
- // We are working on a monaco package in client-modules that has more configuration around themes and languages
4
- // Monaco as a shared package RFC https://www.notion.so/codecademy/Monaco-editor-as-a-shared-package-1f4484db165b4abc8394c3556451ef6a
5
-
6
- import type * as monaco from 'monaco-editor';
7
-
8
- import * as darkColors from './colorsDark';
9
-
10
- const c = (color: string) => color.substr(1);
11
-
12
- const theme = ({
13
- ui,
14
- syntax,
15
- }: {
16
- ui: darkColors.UIColors;
17
- syntax: darkColors.SyntaxColors;
18
- }): monaco.editor.IStandaloneThemeData => ({
19
- base: 'vs-dark',
20
- inherit: true,
21
- rules: [
22
- // Base
23
- { token: '', foreground: c(syntax.basic) },
24
- { token: 'regexp', foreground: c(syntax.regexp) },
25
- { token: 'annotation', foreground: c(syntax.annotation) },
26
- { token: 'type', foreground: c(syntax.annotation) },
27
- { token: 'doctype', foreground: c(syntax.comment) },
28
- { token: 'delimiter', foreground: c(syntax.decoration) },
29
- { token: 'invalid', foreground: c(syntax.invalid) },
30
- { token: 'emphasis', fontStyle: 'italic' },
31
- { token: 'strong', fontStyle: 'bold' },
32
- { token: 'variable', foreground: c(syntax.variable) },
33
- { token: 'variable.predefined', foreground: c(syntax.variable) },
34
- { token: 'constant', foreground: c(syntax.constant) },
35
- { token: 'comment', foreground: c(syntax.comment) },
36
- { token: 'number', foreground: c(syntax.number) },
37
- { token: 'number.hex', foreground: c(syntax.number) },
38
- { token: 'keyword.directive', foreground: c(syntax.comment) },
39
- { token: 'include', foreground: c(syntax.comment) },
40
- { token: 'key', foreground: c(syntax.property) },
41
- { token: 'attribute.name', foreground: c(syntax.attribute) },
42
- { token: 'attribute.name-numeric', foreground: c(syntax.string) },
43
- { token: 'attribute.value', foreground: c(syntax.property) },
44
- { token: 'attribute.value.number', foreground: c(syntax.number) },
45
- { token: 'string', foreground: c(syntax.string) },
46
- { token: 'string.yaml', foreground: c(syntax.string) },
47
- { token: 'tag', foreground: c(syntax.tag) },
48
- { token: 'tag.id.jade', foreground: c(syntax.tag) },
49
- { token: 'tag.class.jade', foreground: c(syntax.tag) },
50
- { token: 'metatag', foreground: c(syntax.comment) },
51
- { token: 'attribute.value.unit', foreground: c(syntax.string) },
52
- { token: 'keyword', foreground: c(syntax.keyword) },
53
- { token: 'keyword.flow', foreground: c(syntax.keyword) },
54
- ],
55
- colors: {
56
- 'editor.background': ui.background,
57
- 'editor.foreground': ui.text,
58
- 'editorIndentGuide.background': ui.indent.inactive,
59
- 'editorIndentGuide.activeBackground': ui.indent.active,
60
- 'editorWhitespace.foreground': syntax.comment,
61
- },
62
- });
63
-
64
- export const dark = theme(darkColors);
@@ -1 +0,0 @@
1
- export type Monaco = typeof import('monaco-editor');