]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-19345 - Update list issues for MIUI
authorKevin Silva <kevin.silva@sonarsource.com>
Mon, 5 Jun 2023 08:15:49 +0000 (10:15 +0200)
committersonartech <sonartech@sonarsource.com>
Fri, 9 Jun 2023 20:03:09 +0000 (20:03 +0000)
23 files changed:
server/sonar-web/design-system/src/components/InputSelect.tsx
server/sonar-web/src/main/js/apps/coding-rules/components/StandardFacet.tsx
server/sonar-web/src/main/js/apps/issues/__tests__/IssuesApp-it.tsx
server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.tsx
server/sonar-web/src/main/js/apps/issues/components/IssueHeader.tsx
server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx
server/sonar-web/src/main/js/apps/issues/components/ListItem.tsx
server/sonar-web/src/main/js/apps/issues/components/TagsSelect.tsx
server/sonar-web/src/main/js/apps/issues/issues-subnavigation/IssueLocationsCrossFile.tsx
server/sonar-web/src/main/js/apps/issues/issues-subnavigation/IssueLocationsNavigator.tsx
server/sonar-web/src/main/js/apps/issues/issues-subnavigation/SubnavigationIssuesList.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/ListStyleFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/StandardFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ListStyleFacet-test.tsx
server/sonar-web/src/main/js/components/SourceViewer/__tests__/SourceViewer-it.tsx
server/sonar-web/src/main/js/components/SourceViewer/styles.css
server/sonar-web/src/main/js/components/issue/components/IssueActionsBar.tsx
server/sonar-web/src/main/js/components/issue/components/IssueAssign.tsx
server/sonar-web/src/main/js/components/issue/components/IssueMessage.tsx
server/sonar-web/src/main/js/components/issue/components/IssueSeverity.tsx
server/sonar-web/src/main/js/components/issue/components/IssueTransition.tsx
server/sonar-web/src/main/js/components/issue/components/IssueType.tsx
server/sonar-web/src/main/js/components/issue/components/IssueView.tsx

index bac391c1716495d9a10c53b7c922bc0662533fae..906203174dd2d28b3203ca9f143dcd680ac98062 100644 (file)
@@ -127,10 +127,9 @@ export function InputSelect<
             'sw-absolut sw-box-border sw-rounded-2 sw-overflow-hidden',
             isDisabled && 'sw-pointer-events-none sw-cursor-not-allowed'
           ),
-        menu: () => 'sw-z-dropdown-menu',
         option: ({ isDisabled }) =>
           classNames(
-            'sw-py-2 sw-px-3 sw-cursor-pointer',
+            'it__select-option sw-py-2 sw-px-3 sw-cursor-pointer',
             isDisabled && 'sw-pointer-events-none sw-cursor-not-allowed'
           ),
         ...props.classNames,
index 2e63ec94faec79389edd0fd597043679a2adabce..28f61ce9234e5a2c5a0551c964db582fa080539d 100644 (file)
@@ -378,7 +378,7 @@ export class StandardFacet extends React.PureComponent<Props, State> {
             <FacetItemsList labelledby={this.getFacetHeaderId(SecurityStandard.SONARSOURCE)}>
               {selectedBelowLimit.map((item) => (
                 <FacetItem
-                  active={true}
+                  active
                   key={item}
                   name={renderSonarSourceSecurityCategory(this.state.standards, item)}
                   onClick={this.handleSonarSourceSecurityItemClick}
index 336135bf760c94904fbcd8eb0969bf7f53e900c9..dc72fc139bbff3f487b021bbace9e13374a79e80 100644 (file)
@@ -209,10 +209,10 @@ describe('issues app', () => {
       const user = userEvent.setup();
       renderIssueApp();
 
-      await user.click(await ui.issueItem5.find());
+      await user.click(await ui.issueItemAction5.find());
       expect(ui.projectIssueItem6.getAll()).toHaveLength(2); // there will be 2 buttons one in concise issue and other in code viewer
 
-      await user.click(ui.issueItemAction6.get());
+      await user.click(ui.projectIssueItem6.getAll()[1]);
       expect(screen.getByRole('heading', { level: 1, name: 'Second issue' })).toBeInTheDocument();
     });
 
index 5e47667161a50edc1eeeeb8063b3f44de7a5626a..9ca54897266520fa8b01a86abd0c0d01da9fbbcb 100644 (file)
@@ -483,7 +483,7 @@ export default class BulkChangeModal extends React.PureComponent<Props, State> {
             ? translate('bulk_change')
             : translateWithParameters('issue_bulk_change.form.title', issues.length)
         }
-        isScrollable={true}
+        isScrollable
         loading={submitting}
         body={this.renderForm()}
         primaryButton={
index 91a9824f9ac199481b595497e1f0a134191af230..8f61c516b0a7ede4c3a4538a8fbf3eb0d6e318f4 100644 (file)
@@ -150,7 +150,7 @@ export default class IssueHeader extends React.PureComponent<Props, State> {
             aria-label={translate('permalink')}
             className="sw-ml-1 sw-align-bottom"
             copyValue={getPathUrlAsString(issueUrl, false)}
-            discreet={true}
+            discreet
           />
         </div>
         <div className="sw-flex sw-items-center sw-justify-between">
index 215becb13daa082481d0ce86d7845f18ed12aca5..2e578793b04361bf014c80d40017c93453c2d35e 100644 (file)
@@ -1129,7 +1129,7 @@ export class App extends React.PureComponent<Props, State> {
             }}
             loading={loadingMore}
             total={paging.total}
-            useMIUIButtons={true}
+            useMIUIButtons
           />
         )}
 
index db287f5c81d73cd42289234161584577ea1858c3..f0b1af18a55dad36a0e4afe8a2abe181bb6752c8 100644 (file)
@@ -17,8 +17,6 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import styled from '@emotion/styled';
-import { themeBorder, themeColor } from 'design-system';
 import * as React from 'react';
 import Issue from '../../../components/issue/Issue';
 import { BranchLike } from '../../../types/branch-like';
@@ -39,22 +37,6 @@ interface Props {
 }
 
 export default class ListItem extends React.PureComponent<Props> {
-  nodeRef: HTMLLIElement | null = null;
-
-  componentDidMount() {
-    const { selected } = this.props;
-    if (this.nodeRef && selected) {
-      this.nodeRef.scrollIntoView({ block: 'center', inline: 'center' });
-    }
-  }
-
-  componentDidUpdate(prevProps: Props) {
-    const { selected } = this.props;
-    if (!prevProps.selected && selected && this.nodeRef) {
-      this.nodeRef.scrollIntoView({ block: 'center', inline: 'center' });
-    }
-  }
-
   handleFilter = (property: string, issue: TypeIssue) => {
     const { onFilterChange } = this.props;
 
@@ -104,38 +86,17 @@ export default class ListItem extends React.PureComponent<Props> {
     const { branchLike, issue } = this.props;
 
     return (
-      <IssueItem ref={(node) => (this.nodeRef = node)}>
-        <Issue
-          branchLike={branchLike}
-          checked={this.props.checked}
-          issue={issue}
-          onChange={this.props.onChange}
-          onCheck={this.props.onCheck}
-          onClick={this.props.onClick}
-          onPopupToggle={this.props.onPopupToggle}
-          openPopup={this.props.openPopup}
-          selected={this.props.selected}
-        />
-      </IssueItem>
+      <Issue
+        branchLike={branchLike}
+        checked={this.props.checked}
+        issue={issue}
+        onChange={this.props.onChange}
+        onCheck={this.props.onCheck}
+        onClick={this.props.onClick}
+        onPopupToggle={this.props.onPopupToggle}
+        openPopup={this.props.openPopup}
+        selected={this.props.selected}
+      />
     );
   }
 }
-
-const IssueItem = styled.li`
-  box-sizing: border-box;
-  border: ${themeBorder('default', 'transparent')};
-  border-top: ${themeBorder('default')};
-  outline: none;
-
-  &.selected {
-    border: ${themeBorder('default', 'tableRowSelected')};
-  }
-
-  &:hover {
-    background: ${themeColor('tableRowHover')};
-  }
-
-  &:last-child {
-    border-bottom: ${themeBorder('default')};
-  }
-`;
index 19a5d7dffd6a954a94e29631203066f2a1921444..7956a5947aeda178755309e1b1c8980530a9e24b 100644 (file)
@@ -63,7 +63,7 @@ export default function TagsSelect(props: Props) {
 
   return (
     <Dropdown
-      allowResizing={true}
+      allowResizing
       closeOnClick={false}
       id="tag-selector"
       overlay={
index aa65b8079573829f77b6b2f1acd67974d8cd2425..816aa0253690102c71b4f3556e2889619c9e2ca2 100644 (file)
@@ -172,9 +172,9 @@ export default class IssueLocationsCrossFile extends PureComponent<Props, State>
           {this.renderGroup(firstGroup, 0, { onlyFirst: true })}
           <div>
             <ExpandLink
-              blurAfterClick={true}
+              blurAfterClick
               onClick={this.handleMoreLocationsClick}
-              preventDefault={true}
+              preventDefault
               to={{}}
             >
               {translateWithParameters(
index 8cfadabd40e3934a439cb49a7adc2104aeed8420..bfcf853f0ad20cf323ca96eba8cdb18df9c329ea 100644 (file)
@@ -126,7 +126,7 @@ export default function IssueLocationsNavigator(props: Props) {
             </ExecutionFlowAccordion>
           ))}
         </div>
-        <IssueLocationsNavigatorKeyboardHint showLeftRightHint={true} />
+        <IssueLocationsNavigatorKeyboardHint showLeftRightHint />
       </>
     );
   }
index 675540f90c4db6986a2ad9172a9241d719ac6dde..4366881c23b7022051419e4871cb4fe7e066c6fb 100644 (file)
@@ -95,7 +95,7 @@ export default function SubnavigationIssuesList(props: Props) {
           loadMore={props.fetchMoreIssues}
           loading={loadingMore}
           total={paging.total}
-          useMIUIButtons={true}
+          useMIUIButtons
         />
       )}
     </StyledWrapper>
index 1c617479e6dc6f12003a114962fa58d52ceaf3c3..721d3ce48357b906dac1483561e4a09eeed4800d 100644 (file)
@@ -311,7 +311,7 @@ export class ListStyleFacet<S> extends React.Component<Props<S>, State<S>> {
             <FacetItemsList labelledby={this.getFacetHeaderId(property)}>
               {selectedBelowLimit.map((item) => (
                 <FacetItem
-                  active={true}
+                  active
                   className="it__search-navigator-facet"
                   key={item}
                   name={this.props.renderFacetItem(item)}
@@ -399,7 +399,7 @@ export class ListStyleFacet<S> extends React.Component<Props<S>, State<S>> {
             loadMoreAriaLabel={showMoreAriaLabel}
             ready={!searching}
             total={searchPaging.total}
-            useMIUIButtons={true}
+            useMIUIButtons
           />
         )}
       </>
index 14094df81047213aeff67f09df0c97c19428c9ca..0fba1b26538c04ce611b6d9641bdb4fea4f56d49 100644 (file)
@@ -474,7 +474,7 @@ export class StandardFacet extends React.PureComponent<Props, State> {
             className="it__search-navigator-facet-box it__search-navigator-facet-header"
             data-property={property}
             id={this.getFacetHeaderId(property)}
-            inner={true}
+            inner
             key={property}
             name={translate(`issues.facet.${name}`)}
             open={open}
@@ -489,7 +489,7 @@ export class StandardFacet extends React.PureComponent<Props, State> {
           fetching={fetchingCwe}
           getFacetItemText={(item) => renderCWECategory(this.state.standards, item)}
           getSearchResultText={(item) => renderCWECategory(this.state.standards, item)}
-          inner={true}
+          inner
           loadSearchResultCount={this.loadCWESearchResultCount}
           onChange={this.props.onChange}
           onSearch={this.handleCWESearch}
@@ -521,7 +521,7 @@ export class StandardFacet extends React.PureComponent<Props, State> {
         count={count}
         countLabel={translateWithParameters('x_selected', count)}
         data-property={this.property}
-        hasEmbeddedFacets={true}
+        hasEmbeddedFacets
         id={this.getFacetHeaderId(this.property)}
         name={translate('issues.facet', this.property)}
         onClear={this.handleClear}
index 7d701f6f9cf4786ee0d09f1f662df8ad5e68a76a..9f5b8a0e040249cbc17c936799bf4a93237fe127 100644 (file)
@@ -200,7 +200,7 @@ function shallowRender(props: Partial<Props<string>> = {}) {
       onChange={jest.fn()}
       onSearch={jest.fn()}
       onToggle={jest.fn()}
-      open={true}
+      open
       property="foo"
       searchPlaceholder="search for foo..."
       stats={{ a: 10, b: 8, c: 1 }}
index 0ec779075fb4b13da6821a792d3dcfec4fb32e71..731a881f3a2eafbff8ddcc1f50b984ced2951de1 100644 (file)
@@ -272,21 +272,6 @@ it('should show issue indicator', async () => {
       name: 'source_viewer.issues_on_line.X_issues_of_type_Y.source_viewer.issues_on_line.show.2.issue.type.BUG.plural',
     })
   );
-  const firstIssueBox = issueRow.getByRole('link', { name: 'First Issue' });
-  const secondIssueBox = issueRow.getByRole('link', { name: 'Second Issue' });
-  expect(firstIssueBox).toBeInTheDocument();
-  expect(secondIssueBox).toBeInTheDocument();
-  expect(
-    issueRow.getByRole('button', {
-      name: 'source_viewer.issues_on_line.X_issues_of_type_Y.source_viewer.issues_on_line.hide.2.issue.type.BUG.plural',
-    })
-  ).toBeInTheDocument();
-
-  await user.click(firstIssueBox);
-  expect(onIssueSelect).toHaveBeenCalledWith('first-issue');
-
-  await user.click(secondIssueBox);
-  expect(onIssueSelect).toHaveBeenCalledWith('second-issue');
 });
 
 it('should show coverage information', async () => {
index 114cb08b1fcc4dcfe55d27ffcc0308cd5c59e65d..63cef19ca70805a41135a9788d8fae7505697e05 100644 (file)
@@ -23,7 +23,6 @@
   border: 1px solid var(--gray80);
   box-sizing: border-box;
   background-color: #fff;
-  overflow: hidden;
 }
 
 .source-table {
index 4716deb8354532b0384699f2ce694b31ddbacb80..3230d4c9621c6bc0ad3662e9fc0bf2df9835c882 100644 (file)
@@ -123,8 +123,10 @@ export default function IssueActionsBar(props: Props) {
   );
 
   return (
-    <div className="sw-flex sw-flex-wrap sw-items-center sw-justify-between">
-      <ul className="sw-flex sw-items-center sw-gap-3 sw-body-sm">
+    <div
+      className={classNames(className, 'sw-flex sw-flex-wrap sw-items-center sw-justify-between')}
+    >
+      <ul className="it__issue-header-actions sw-flex sw-items-center sw-gap-3 sw-body-sm">
         <li>
           <IssueType canSetType={canSetType} issue={issue} setIssueProperty={setIssueProperty} />
         </li>
@@ -199,7 +201,7 @@ export default function IssueActionsBar(props: Props) {
                 </>
               </Tooltip>
             </IssueMetaListItem>
-            <SeparatorCircleIcon aria-hidden={true} as="li" />
+            <SeparatorCircleIcon aria-hidden as="li" />
           </>
         )}
 
@@ -209,7 +211,7 @@ export default function IssueActionsBar(props: Props) {
               <CommentIcon aria-label={translate('issue.comment.formlink')} />
               {issue.comments?.length}
             </IssueMetaListItem>
-            <SeparatorCircleIcon aria-hidden={true} as="li" />
+            <SeparatorCircleIcon aria-hidden as="li" />
           </>
         )}
         {showLine && isDefined(issue.textRange) && (
@@ -219,7 +221,7 @@ export default function IssueActionsBar(props: Props) {
                 {translateWithParameters('issue.ncloc_x.short', issue.textRange.endLine)}
               </IssueMetaListItem>
             </Tooltip>
-            <SeparatorCircleIcon aria-hidden={true} as="li" />
+            <SeparatorCircleIcon aria-hidden as="li" />
           </>
         )}
         {issue.effort && (
@@ -227,7 +229,7 @@ export default function IssueActionsBar(props: Props) {
             <IssueMetaListItem className={issueMetaListItemClassNames}>
               {translateWithParameters('issue.x_effort', issue.effort)}
             </IssueMetaListItem>
-            <SeparatorCircleIcon aria-hidden={true} as="li" />
+            <SeparatorCircleIcon aria-hidden as="li" />
           </>
         )}
         <IssueMetaListItem className={issueMetaListItemClassNames}>
index f0d7e17b4a7a357ff3e8cf4c4736dd3ff3a4150c..3b40a482240c304b7a070b07674382adcc983c5c 100644 (file)
@@ -134,6 +134,7 @@ export default function IssueAssignee(props: Props) {
   return (
     <SearchSelectDropdown
       size="medium"
+      className="it__issue-assign"
       controlAriaLabel={
         assinedUser
           ? translateWithParameters('issue.assign.assigned_to_x_click_to_change', assinedUser)
index 458b2f9363ce24b9d340f5a54e778237605a3a54..45993e6e6923b1d6306773df41713a4e0108d283 100644 (file)
@@ -24,7 +24,6 @@ import { translate } from '../../../helpers/l10n';
 import { getComponentIssuesUrl } from '../../../helpers/urls';
 import { BranchLike } from '../../../types/branch-like';
 import { Issue } from '../../../types/types';
-import Link from '../../common/Link';
 import { IssueMessageHighlighting } from '../IssueMessageHighlighting';
 
 export interface IssueMessageProps {
@@ -50,7 +49,7 @@ export default function IssueMessage(props: IssueMessageProps) {
   return (
     <>
       {props.onClick ? (
-        <StandoutLink onClick={props.onClick} preventDefault to={{}}>
+        <StandoutLink onClick={props.onClick} className="it__issue-message" preventDefault to={{}}>
           <IssueMessageHighlighting message={message} messageFormattings={messageFormattings} />
         </StandoutLink>
       ) : (
@@ -60,14 +59,14 @@ export default function IssueMessage(props: IssueMessageProps) {
       )}
 
       {displayWhyIsThisAnIssue && (
-        <Link
+        <StandoutLink
           aria-label={translate('issue.why_this_issue.long')}
-          className="spacer-right"
           target="_blank"
+          className="sw-ml-2"
           to={whyIsThisAnIssueUrl}
         >
           {translate('issue.why_this_issue')}
-        </Link>
+        </StandoutLink>
       )}
     </>
   );
index e9698a11dd6f834b631c9b29f833e96406fb4648..7d3b33a823045cd158161e2d38cec9e22afb5e86 100644 (file)
@@ -58,7 +58,7 @@ export default class IssueSeverity extends React.PureComponent<Props> {
     const typesOptions = SEVERITY.map((severity) => ({
       label: translate('severity', severity),
       value: severity,
-      Icon: <SeverityIcon severity={severity} aria-hidden={true} />,
+      Icon: <SeverityIcon severity={severity} aria-hidden />,
     }));
 
     if (this.props.canSetSeverity) {
@@ -69,7 +69,7 @@ export default class IssueSeverity extends React.PureComponent<Props> {
             translate('severity', issue.severity)
           )}
           menuIsOpen={this.props.isOpen && this.props.canSetSeverity}
-          className="js-issue-type"
+          className="it__issue-severity"
           options={typesOptions}
           onMenuClose={this.handleClose}
           onMenuOpen={() => this.toggleSetSeverity(true)}
@@ -81,11 +81,7 @@ export default class IssueSeverity extends React.PureComponent<Props> {
 
     return (
       <span className="sw-flex sw-items-center sw-gap-1">
-        <SeverityIcon
-          className="little-spacer-right"
-          severity={issue.severity}
-          aria-hidden={true}
-        />
+        <SeverityIcon className="little-spacer-right" severity={issue.severity} aria-hidden />
         {translate('severity', issue.severity)}
       </span>
     );
index 233656ae3d09b9079734cbbe8d4b981c54dd0c5b..a6b505c716dd0c42c7ecd8268e6edadb27974a17 100644 (file)
@@ -70,7 +70,7 @@ export default class IssueTransition extends React.PureComponent<Props> {
             translate('issue.status', issue.status)
           )}
           size="medium"
-          className="js-issue-transition"
+          className="it__issue-transition"
           components={{
             SingleValue: <
               V,
index a31fb07582087c06f61e59a9ec5bc0e13acbea58..2607dad09fc167ebf75a26cc99137f0f95da907e 100644 (file)
@@ -56,7 +56,7 @@ export default class IssueType extends React.PureComponent<Props> {
             'issue.type.type_x_click_to_change',
             translate('issue.type', issue.type)
           )}
-          className="js-issue-type"
+          className="it__issue-type"
           options={typesOptions}
           setValue={this.setType}
           value={issue.type}
index bc8723d827f493c44ed62eb403d72eb2e3e9f24e..96713af892a1f1cb8d095f6c4c788ac84526ef01 100644 (file)
@@ -17,8 +17,9 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+import styled from '@emotion/styled';
 import classNames from 'classnames';
-import { Checkbox } from 'design-system';
+import { Checkbox, themeBorder, themeColor } from 'design-system';
 import * as React from 'react';
 import { deleteIssueComment, editIssueComment } from '../../../api/issues';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
@@ -43,6 +44,22 @@ interface Props {
 }
 
 export default class IssueView extends React.PureComponent<Props> {
+  nodeRef: HTMLLIElement | null = null;
+
+  componentDidMount() {
+    const { selected } = this.props;
+    if (this.nodeRef && selected) {
+      this.nodeRef.scrollIntoView({ block: 'center', inline: 'center' });
+    }
+  }
+
+  componentDidUpdate(prevProps: Props) {
+    const { selected } = this.props;
+    if (!prevProps.selected && selected && this.nodeRef) {
+      this.nodeRef.scrollIntoView({ block: 'center', inline: 'center' });
+    }
+  }
+
   handleCheck = () => {
     if (this.props.onCheck) {
       this.props.onCheck(this.props.issue.key);
@@ -75,13 +92,21 @@ export default class IssueView extends React.PureComponent<Props> {
 
     const hasCheckbox = this.props.onCheck != null;
 
-    const issueClass = classNames('sw-py-3 sw-flex sw-items-center sw-justify-between sw-w-full ', {
-      'no-click': this.props.onClick === undefined,
-      selected: this.props.selected,
-    });
+    const issueClass = classNames(
+      'it__issue-item sw-py-3 sw-flex sw-items-center sw-justify-between sw-w-full ',
+      {
+        'no-click': this.props.onClick === undefined,
+        selected: this.props.selected,
+      }
+    );
 
     return (
-      <div className={issueClass} role="region" aria-label={issue.message}>
+      <IssueItem
+        className={issueClass}
+        role="region"
+        aria-label={issue.message}
+        ref={(node) => (this.nodeRef = node)}
+      >
         <div className="sw-flex sw-w-full sw-px-2 sw-gap-4">
           {hasCheckbox && (
             <Checkbox
@@ -107,11 +132,11 @@ export default class IssueView extends React.PureComponent<Props> {
               onAssign={this.props.onAssign}
               onChange={this.props.onChange}
               togglePopup={this.props.togglePopup}
-              showComments={true}
+              showComments
             />
           </div>
         </div>
-      </div>
+      </IssueItem>
     );
   }
 }
@@ -124,3 +149,24 @@ function isClickable(node: HTMLElement | undefined | null): boolean {
   const tagName = (node.tagName || '').toUpperCase();
   return clickableTags.includes(tagName) || isClickable(node.parentElement);
 }
+
+const IssueItem = styled.li`
+  box-sizing: border-box;
+  border: ${themeBorder('default', 'transparent')};
+  border-top: ${themeBorder('default')};
+  outline: none;
+
+  &:last-child {
+    border-bottom: ${themeBorder('default')};
+  }
+
+  &.selected {
+    border: ${themeBorder('default', 'tableRowSelected')};
+    &:last-child {
+    }
+  }
+
+  &:hover {
+    background: ${themeColor('tableRowHover')};
+  }
+`;