Merge "Use --deemphasized-text-color in context expander"
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
index 3779402..61df877 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
@@ -87,7 +87,7 @@
     </style>
     <style include="gr-form-styles"></style>
     <fieldset id="section"
-        class$="gr-form-styles [[_computeSectionClass(editing, _editingRef, _deleted)]]">
+        class$="gr-form-styles [[_computeSectionClass(editing, canUpload, ownerOf, _editingRef, _deleted)]]">
       <div id="mainContainer">
         <div class="header">
           <div class="name">
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
index 4574e11..6fb7b0e 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
@@ -54,6 +54,8 @@
         value: false,
         observer: '_handleEditingChanged',
       },
+      canUpload: Boolean,
+      ownerOf: Array,
       _originalId: String,
       _editingRef: {
         type: Boolean,
@@ -214,9 +216,13 @@
       this.$.editRefInput.focus();
     },
 
-    _computeSectionClass(editing, editingRef, deleted) {
+    _isEditEnabled(canUpload, ownerOf, sectionId) {
+      return canUpload || ownerOf.indexOf(sectionId) >= 0;
+    },
+
+    _computeSectionClass(editing, canUpload, ownerOf, editingRef, deleted) {
       const classList = [];
-      if (editing) {
+      if (editing && this._isEditEnabled(canUpload, ownerOf, this.section.id)) {
         classList.push('editing');
       }
       if (editingRef) {
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
index ad401b8..21a426f 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
@@ -272,26 +272,37 @@
 
       test('_computeSectionClass', () => {
         let editingRef = false;
+        let canUpload = false;
+        let ownerOf = [];
         let editing = false;
         let deleted = false;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            '');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), '');
 
         editing = true;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), '');
+
+        ownerOf = ['refs/*'];
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing');
+
+        ownerOf = [];
+        canUpload = true;
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing');
 
         editingRef = true;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing editingRef');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing editingRef');
 
         deleted = true;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing editingRef deleted');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing editingRef deleted');
 
         editingRef = false;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing deleted');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing deleted');
       });
 
       test('_computeEditBtnClass', () => {
@@ -356,6 +367,8 @@
           assert.isFalse(element.$.section.classList.contains('deleted'));
           assert.isTrue(element.$.editBtn.classList.contains('global'));
           element.editing = true;
+          element.canUpload = true;
+          element.ownerOf = [];
           assert.equal(getComputedStyle(element.$.editBtn).display, 'none');
         });
       });
@@ -382,6 +395,9 @@
           assert.isFalse(element.$.section.classList.contains('deleted'));
           assert.isFalse(element.$.editBtn.classList.contains('global'));
           element.editing = true;
+          element.canUpload = true;
+          element.ownerOf = [];
+          flushAsynchronousOperations();
           assert.notEqual(getComputedStyle(element.$.editBtn).display, 'none');
         });
 
@@ -440,6 +456,8 @@
         });
 
         test('edit section reference', () => {
+          element.canUpload = true;
+          element.ownerOf = [];
           element.section = {id: 'refs/for/bar', value: {permissions: {}}};
           assert.isFalse(element.$.section.classList.contains('editing'));
           element.editing = true;
@@ -486,6 +504,8 @@
 
         test('remove section', () => {
           element.editing = true;
+          element.canUpload = true;
+          element.ownerOf = [];
           assert.isFalse(element._deleted);
           assert.isNotOk(element.section.value.deleted);
           MockInteractions.tap(element.$.deleteBtn);
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
index 4df4efd..f718806 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
@@ -38,7 +38,8 @@
       #inheritsFrom,
       #editInheritFromInput,
       .editing #inheritFromName,
-      .weblinks{
+      .weblinks,
+      .editing .invisible{
         display: none;
       }
       #inheritsFrom.show {
@@ -97,9 +98,14 @@
             on-tap="_handleEdit">[[_editOrCancel(_editing)]]</gr-button>
         <gr-button id="saveBtn"
             primary
+            class$="[[_computeSaveBtnClass(_ownerOf)]]"
+            on-tap="_handleSave"
+            disabled$="[[!_modified]]">Save</gr-button>
+        <gr-button id="saveReviewBtn"
+            primary
+            class$="[[_computeSaveReviewBtnClass(_canUpload)]]"
             on-tap="_handleSaveForReview"
-            disabled$="[[!_modified]]">
-              Save for review</gr-button>
+            disabled$="[[!_modified]]">Save for review</gr-button>
         <template
             is="dom-repeat"
             items="{{_sections}}"
@@ -110,7 +116,9 @@
               capabilities="[[_capabilities]]"
               section="{{section}}"
               labels="[[_labels]]"
+              can-upload="[[_canUpload]]"
               editing="[[_editing]]"
+              owner-of="[[_ownerOf]]"
               groups="[[_groups]]"
               on-added-section-removed="_handleAddedSectionRemoved"></gr-access-section>
         </template>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
index b9d6a66..24d0c62 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
@@ -135,12 +135,18 @@
     _repoChanged(repo) {
       if (!repo) { return Promise.resolve(); }
 
+      return this._reload(repo);
+    },
+
+    _reload(repo) {
       const promises = [];
 
       const errFn = response => {
         this.fire('page-error', {response});
       };
 
+      this._editing = false;
+
       // Always reset sections when a project changes.
       this._sections = [];
       promises.push(this.$.restAPI.getRepoAccessRights(repo, errFn)
@@ -386,7 +392,7 @@
           .editReference();
     },
 
-    _handleSaveForReview() {
+    _getObjforSave() {
       const addRemoveObj = this._computeAddAndRemove();
       // If there are no changes, don't actually save.
       if (!Object.keys(addRemoveObj.add).length &&
@@ -403,19 +409,33 @@
       if (addRemoveObj.parent) {
         obj.parent = addRemoveObj.parent;
       }
-      return this.$.restAPI.setProjectAccessRightsForReview(this.repo, obj)
+      return obj;
+    },
+
+    _handleSave() {
+      const obj = this._getObjforSave();
+      if (!obj) { return; }
+      return this.$.restAPI.setRepoAccessRights(this.repo, obj)
+          .then(() => {
+            this._reload(this.repo);
+          });
+    },
+
+    _handleSaveForReview() {
+      const obj = this._getObjforSave();
+      if (!obj) { return; }
+      return this.$.restAPI.setRepoAccessRightsForReview(this.repo, obj)
           .then(change => {
             Gerrit.Nav.navigateToChange(change);
           });
     },
 
-    _computeShowSaveClass(editing) {
-      if (!editing) { return ''; }
-      return 'visible';
+    _computeSaveReviewBtnClass(canUpload) {
+      return !canUpload ? 'invisible' : '';
     },
 
-    _computeEditingClass(editing) {
-      return editing ? 'editing': '';
+    _computeSaveBtnClass(ownerOf) {
+      return ownerOf.length < 0 ? 'invisible' : '';
     },
 
     _computeMainClass(ownerOf, canUpload, editing) {
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
index 8771550..e5b0a25 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
@@ -119,6 +119,8 @@
       repoStub = sandbox.stub(element.$.restAPI, 'getRepo').returns(
           Promise.resolve(repoRes));
       element._loading = false;
+      element._ownerOf = [];
+      element._canUpload = false;
     });
 
     teardown(() => {
@@ -258,8 +260,9 @@
     });
 
     suite('with defined sections', () => {
-      const testEditSaveCancelBtns = () => {
+      const testEditSaveCancelBtns = (shouldShowSave, shouldShowSaveReview) => {
         // Edit button is visible and Save button is hidden.
+        assert.equal(getComputedStyle(element.$.saveReviewBtn).display, 'none');
         assert.equal(getComputedStyle(element.$.saveBtn).display, 'none');
         assert.notEqual(getComputedStyle(element.$.editBtn).display, 'none');
         assert.equal(element.$.editBtn.innerText, 'EDIT');
@@ -278,14 +281,26 @@
         // Edit button changes to Cancel button, and Save button is visible but
         // disabled.
         assert.equal(element.$.editBtn.innerText, 'CANCEL');
-        assert.notEqual(getComputedStyle(element.$.saveBtn).display, 'none');
-        assert.isTrue(element.$.saveBtn.disabled);
+        if (shouldShowSaveReview) {
+          assert.notEqual(getComputedStyle(element.$.saveReviewBtn).display,
+              'none');
+          assert.isTrue(element.$.saveReviewBtn.disabled);
+        }
+        if (shouldShowSave) {
+          assert.notEqual(getComputedStyle(element.$.saveBtn).display, 'none');
+          assert.isTrue(element.$.saveBtn.disabled);
+        }
         assert.notEqual(getComputedStyle(element.$$('#editInheritFromInput'))
             .display, 'none');
 
         // Save button should be enabled after access is modified
         element.fire('access-modified');
-        assert.isFalse(element.$.saveBtn.disabled);
+        if (shouldShowSaveReview) {
+          assert.isFalse(element.$.saveReviewBtn.disabled);
+        }
+        if (shouldShowSave) {
+          assert.isFalse(element.$.saveBtn.disabled);
+        }
       };
 
       setup(() => {
@@ -308,19 +323,25 @@
         assert.equal(element._sections.length, 0);
       });
 
-      test('button visibility for non admin', () => {
-        assert.equal(getComputedStyle(element.$.saveBtn).display, 'none');
+      test('button visibility for non ref owner', () => {
+        assert.equal(getComputedStyle(element.$.saveReviewBtn).display, 'none');
         assert.equal(getComputedStyle(element.$.editBtn).display, 'none');
       });
 
-      test('button visibility for non admin with upload privilege', () => {
+      test('button visibility for non ref owner with upload privilege', () => {
         element._canUpload = true;
-        testEditSaveCancelBtns();
+        testEditSaveCancelBtns(false, true);
       });
 
-      test('button visibility for admin', () => {
+      test('button visibility for ref owner', () => {
         element._ownerOf = ['refs/for/*'];
-        testEditSaveCancelBtns();
+        testEditSaveCancelBtns(true, false);
+      });
+
+      test('button visibility for ref owner and upload', () => {
+        element._ownerOf = ['refs/for/*'];
+        element._canUpload = true;
+        testEditSaveCancelBtns(true, false);
       });
 
       test('_handleAccessModified called with event fired', () => {
@@ -342,7 +363,7 @@
 
       test('_handleSaveForReview', () => {
         const saveStub =
-            sandbox.stub(element.$.restAPI, 'setProjectAccessRightsForReview');
+            sandbox.stub(element.$.restAPI, 'setRepoAccessRightsForReview');
         sandbox.stub(element, '_computeAddAndRemove').returns({
           add: {},
           remove: {},
@@ -1046,7 +1067,7 @@
             Promise.resolve(JSON.parse(JSON.stringify(accessRes))));
         sandbox.stub(Gerrit.Nav, 'navigateToChange');
         const saveForReviewStub = sandbox.stub(element.$.restAPI,
-            'setProjectAccessRightsForReview')
+            'setRepoAccessRightsForReview')
             .returns(Promise.resolve({_number: 1}));
 
         element.repo = 'test-repo';
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index da7a16a..487d8c8 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -368,9 +368,11 @@
               </label>
             </div>
             <div class="editFileControls showOnEdit">
-              <gr-edit-file-controls
-                  class$="[[_computeClass('', file.__path)]]"
-                  file-path="[[file.__path]]"></gr-edit-file-controls>
+              <template is="dom-if" if="[[editMode]]">
+                <gr-edit-file-controls
+                    class$="[[_computeClass('', file.__path)]]"
+                    file-path="[[file.__path]]"></gr-edit-file-controls>
+              </template>
             </div>
             <div class="show-hide">
               <label class="show-hide" data-path$="[[file.__path]]"
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
index 3f656ae..df3f04f 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
@@ -1542,12 +1542,17 @@
     });
 
     test('editing actions', () => {
+      // Edit controls are guarded behind a dom-if initially and not rendered.
+      assert.isNotOk(Polymer.dom(element.root)
+          .querySelector('gr-edit-file-controls'));
+
       element.editMode = true;
+      flushAsynchronousOperations();
+
+      // Commit message should not have edit controls.
       const editControls =
           Polymer.dom(element.root).querySelectorAll('.row:not(.header)')
             .map(row => row.querySelector('gr-edit-file-controls'));
-
-      // Commit message should not have edit controls.
       assert.isTrue(editControls[0].classList.contains('invisible'));
     });
 
diff --git a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
index 3209d63..633530f 100644
--- a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
+++ b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
@@ -29,9 +29,6 @@
         position: absolute;
         white-space: nowrap;
       }
-      #tooltip {
-        --tooltip-background-color: rgba(22, 22, 22, .9);
-      }
     </style>
     <gr-tooltip
         id="tooltip"
diff --git a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
index b47d5a4..5817fb7 100644
--- a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
+++ b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
@@ -29,7 +29,7 @@
        * HOW THEY ARE USED IN THE CODE.
        */
       :host([toast]) {
-        background-color: #333;
+        background-color: var(--tooltip-background-color);
         bottom: 1.25rem;
         border-radius: 3px;
         box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
@@ -45,6 +45,7 @@
         transform: translateY(0);
       }
       .text {
+        color: var(--tooltip-text-color);
         display: inline-block;
         max-height: 10rem;
         max-width: 80vw;
@@ -52,7 +53,7 @@
         word-break: break-all;
       }
       .action {
-        color: #a1c2fa;
+        color: var(--link-color);
         font-family: var(--font-family-bold);
         margin-left: 1em;
         text-decoration: none;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
index 42bfc6a..d9fdc59 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
@@ -351,6 +351,16 @@
       return Gerrit.awaitPluginsLoaded();
     });
 
+    test('plugin install errors shows toasts', () => {
+      const alertStub = sandbox.stub();
+      document.addEventListener('show-alert', alertStub);
+      Gerrit._setPluginsCount(1);
+      Gerrit.install(() => {}, '0.0pre-alpha');
+      return Gerrit.awaitPluginsLoaded().then(() => {
+        assert.isTrue(alertStub.calledOnce);
+      });
+    });
+
     test('installGwt calls _pluginInstalled', () => {
       sandbox.stub(Gerrit, '_pluginInstalled');
       Gerrit.installGwt('http://test.com/plugins/testplugin/static/test.js');
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
index 60e07e0..ef20206 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
@@ -34,7 +34,7 @@
     CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK: 'change-metadata-item',
   };
 
-  const PLUGIN_LOADING_TIMEOUT_MS = 10000;
+  const PLUGIN_LOADING_TIMEOUT_MS = 60000;
 
   let _restAPI;
   const getRestAPI = () => {
@@ -552,11 +552,6 @@
   };
 
   Gerrit._pluginLoadingTimeout = function() {
-    document.dispatchEvent(new CustomEvent('show-alert', {
-      detail: {
-        message: 'Plugins loading timeout. Check the console for errors.',
-      },
-    }));
     console.error(`Failed to load plugins: ${Object.keys(_pluginsPending)}`);
     Gerrit._setPluginsPending([]);
   };
@@ -580,7 +575,12 @@
   };
 
   Gerrit._pluginInstallError = function(message) {
-    console.log(`Plugin install error: ${message}`);
+    document.dispatchEvent(new CustomEvent('show-alert', {
+      detail: {
+        message: `Plugin install error: ${message}`,
+      },
+    }));
+    console.info(`Plugin install error: ${message}`);
     Gerrit._setPluginsCount(_pluginsPendingCount - 1);
   };
 
diff --git a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
index 909cb9a..9ccff600 100644
--- a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
+++ b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
@@ -35,9 +35,7 @@
     _handleBodyScroll() {
       if (this._headerHeight === undefined) {
         let top = this._getOffsetTop(this);
-        // Don't want to include the element that wraps around the nav, start
-        // with its parent.
-        for (let offsetParent = this._getOffsetParent(this.offsetParent);
+        for (let offsetParent = this.offsetParent;
            offsetParent;
            offsetParent = this._getOffsetParent(offsetParent)) {
           top += this._getOffsetTop(offsetParent);
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
index a9fd05c..b5e7e40 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
@@ -1228,7 +1228,7 @@
           repoInfo);
     },
 
-    setProjectAccessRightsForReview(projectName, projectInfo) {
+    setRepoAccessRightsForReview(projectName, projectInfo) {
       return this.send(
           'PUT', `/projects/${encodeURIComponent(projectName)}/access:review`,
           projectInfo).then(response => this.getResponseObject(response));
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
index 12a8f1c..9947d61 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
@@ -25,9 +25,9 @@
         --gr-tooltip-arrow-size: .5em;
         --gr-tooltip-arrow-center-offset: 0;
 
-        background-color: var(--tooltip-background-color, #333);
+        background-color: var(--tooltip-background-color);
         box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
-        color: #fff;
+        color: var(--tooltip-text-color);
         font-size: var(--font-size-small);
         position: absolute;
         z-index: 1000;
@@ -53,11 +53,11 @@
         width: 0;
       }
       .arrowPositionAbove {
-        border-top: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color, #333);
+        border-top: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color);
         bottom: -var(--gr-tooltip-arrow-size);
       }
       .arrowPositionBelow {
-        border-bottom: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color, #333);
+        border-bottom: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color);
         top: -var(--gr-tooltip-arrow-size);
       }
     </style>
diff --git a/polygerrit-ui/app/styles/app-theme.html b/polygerrit-ui/app/styles/app-theme.html
index 64af9dc..70395e2 100644
--- a/polygerrit-ui/app/styles/app-theme.html
+++ b/polygerrit-ui/app/styles/app-theme.html
@@ -87,6 +87,9 @@
 
   --edit-mode-background-color: #ebf5fb;
 
+  --tooltip-background-color: #333;
+  --tooltip-text-color: #fff;
+
   --syntax-default-color: var(--primary-text-color);
   --syntax-meta-color: #FF1717;
   --syntax-keyword-color: #9E0069;