remote dev pull and resolved conflicts

This commit is contained in:
Shekar Siri 2022-09-27 13:37:39 +05:30
parent d22fa1efc1
commit 9b6be7e580
19 changed files with 282 additions and 109 deletions

View file

@ -0,0 +1,71 @@
import React from 'react';
import { NavLink, withRouter } from 'react-router-dom';
import {
sessions,
metrics,
assist,
client,
dashboard,
withSiteId,
CLIENT_DEFAULT_TAB,
} from 'App/routes';
import SiteDropdown from '../SiteDropdown';
import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG';
import styles from '../header.module.css';
const DASHBOARD_PATH = dashboard();
const METRICS_PATH = metrics();
const SESSIONS_PATH = sessions();
const ASSIST_PATH = assist();
interface Props {
siteId: any;
}
function DefaultMenuView(props: Props) {
const { siteId } = props;
return (
<div className="flex items-center">
<NavLink to={withSiteId(SESSIONS_PATH, props.siteId)}>
<div className="relative select-none">
<div className="px-4 py-2">
<AnimatedSVG name={ICONS.LOGO_SMALL} size="30" />
</div>
<div className="absolute bottom-0" style={{ fontSize: '7px', right: '5px' }}>
v{window.env.VERSION}
</div>
</div>
</NavLink>
<SiteDropdown />
{/* <div className={ styles.divider } /> */}
<NavLink
to={withSiteId(SESSIONS_PATH, siteId)}
className={styles.nav}
activeClassName={styles.active}
>
{'Sessions'}
</NavLink>
<NavLink
to={withSiteId(ASSIST_PATH, siteId)}
className={styles.nav}
activeClassName={styles.active}
>
{'Assist'}
</NavLink>
<NavLink
to={withSiteId(DASHBOARD_PATH, siteId)}
className={styles.nav}
activeClassName={styles.active}
isActive={(_, location) => {
return (
location.pathname.includes(DASHBOARD_PATH) || location.pathname.includes(METRICS_PATH)
);
}}
>
<span>{'Dashboards'}</span>
</NavLink>
</div>
);
}
export default DefaultMenuView;

View file

@ -0,0 +1 @@
export { default } from './DefaultMenuView'

View file

@ -29,6 +29,9 @@ import { fetchListActive as fetchMetadata } from 'Duck/customField';
import { useStore } from 'App/mstore';
import { useObserver } from 'mobx-react-lite';
import UserMenu from './UserMenu';
import SettingsMenu from './SettingsMenu';
import DefaultMenuView from './DefaultMenuView';
import PreferencesView from './PreferencesView';
const DASHBOARD_PATH = dashboard();
const ALERTS_PATH = alerts();
@ -48,11 +51,12 @@ const Header = (props) => {
showAlerts = false,
} = props;
const name = account.get('name').split(' ')[0];
const name = account.get('name');
const [hideDiscover, setHideDiscover] = useState(false);
const { userStore, notificationStore } = useStore();
const initialDataFetched = useObserver(() => userStore.initialDataFetched);
let activeSite = null;
const isPreferences = window.location.pathname.includes('/client/');
const onAccountClick = () => {
props.history.push(CLIENT_PATH);
@ -78,50 +82,13 @@ const Header = (props) => {
}, [siteId]);
return (
<div className={cn(styles.header)} style={{ height: '50px' }}>
<NavLink to={withSiteId(SESSIONS_PATH, siteId)}>
<div className="relative select-none">
<div className="px-4 py-2">
<AnimatedSVG name={ICONS.LOGO_SMALL} size="30" />
</div>
<div className="absolute bottom-0" style={{ fontSize: '7px', right: '5px' }}>
v{window.env.VERSION}
</div>
</div>
</NavLink>
<SiteDropdown />
{/* <div className={ styles.divider } /> */}
<NavLink
to={withSiteId(SESSIONS_PATH, siteId)}
className={styles.nav}
activeClassName={styles.active}
>
{'Sessions'}
</NavLink>
<NavLink
to={withSiteId(ASSIST_PATH, siteId)}
className={styles.nav}
activeClassName={styles.active}
>
{'Assist'}
</NavLink>
<NavLink
to={ withSiteId(DASHBOARD_PATH, siteId) }
className={ styles.nav }
activeClassName={ styles.active }
isActive={ (_, location) => {
return location.pathname.includes(DASHBOARD_PATH)
|| location.pathname.includes(METRICS_PATH)
|| location.pathname.includes(ALERTS_PATH)
}}
>
<span>{'Dashboards'}</span>
</NavLink>
<div
className={cn(styles.header, 'fixed w-full bg-white flex justify-between')}
style={{ height: '50px' }}
>
{!isPreferences && <DefaultMenuView siteId={siteId} />}
{isPreferences && <PreferencesView />}
<div className={styles.right}>
{/* <Announcements /> */}
{/* <div className={ styles.divider } /> */}
{boardingCompletion < 100 && !hideDiscover && (
<React.Fragment>
<OnboardingExplore onComplete={() => setHideDiscover(true)} />
@ -129,10 +96,14 @@ const Header = (props) => {
)}
<Notifications />
<Popup content={`Preferences`}>
<NavLink to={CLIENT_PATH} className={styles.headerIcon}>
<Icon name="gear-fill" size="20" />
</NavLink>
<Popup content={`Preferences`} disabled>
<div className="group relative">
<NavLink to={CLIENT_PATH} className={styles.headerIcon}>
<Icon name="gear-fill" size="20" />
</NavLink>
<SettingsMenu className="invisible group-hover:visible" account={account} />
</div>
</Popup>
<div className={cn(styles.userDetails, 'group cursor-pointer')}>
@ -144,8 +115,10 @@ const Header = (props) => {
<UserMenu className="invisible group-hover:visible" />
</div>
{<ErrorGenPanel />}
</div>
{<ErrorGenPanel />}
{showAlerts && <Alerts />}
</div>
);

View file

@ -24,13 +24,17 @@ function NewProjectButton(props: Props) {
};
return (
<div
className={cn('flex items-center justify-center py-3 cursor-pointer hover:bg-active-blue ', { disabled: !canAddProject })}
onClick={onClick}
>
<Icon name="plus" size={12} className="mr-2" color="teal" />
<span className="color-teal">Add New Project</span>
</div>
<li onClick={onClick}>
<Icon name="folder-plus" size="16" color="teal" />
<span className="ml-3 color-teal">Add Project</span>
</li>
// <div
// className={cn('flex items-center justify-center py-3 cursor-pointer hover:bg-active-blue ', { disabled: !canAddProject })}
// onClick={onClick}
// >
// <Icon name="plus" size={12} className="mr-2" color="teal" />
// <span className="color-teal">Add New Project</span>
// </div>
);
}

View file

@ -0,0 +1,28 @@
import React from 'react';
import { Icon } from 'UI';
import { withRouter } from 'react-router-dom';
import ProjectCodeSnippet from 'App/components/Onboarding/components/OnboardingTabs/ProjectCodeSnippet';
interface Props {
history: any;
}
function PreferencesView(props: Props) {
const onExit = () => {
props.history.push('/');
};
return (
<>
<div className="flex items-center p-3 cursor-pointer text-lg ml-1" onClick={onExit}>
<Icon name="arrow-bar-left" color="teal" size="18" />
<span className="color-teal ml-2">Exit Preferences</span>
</div>
<div className="flex items-center p-3">
<Icon name="info-circle" size="16" color="gray-dark" />
<span className="ml-2">Changes applied at organization level</span>
</div>
</>
);
}
export default withRouter(PreferencesView);

View file

@ -0,0 +1 @@
export { default } from './PreferencesView';

View file

@ -0,0 +1,66 @@
import React from 'react';
import cn from 'classnames';
import { Icon } from 'UI';
import { CLIENT_TABS, client as clientRoute } from 'App/routes';
import { withRouter, RouteComponentProps } from 'react-router';
interface Props {
history: any;
className: string;
account: any;
}
function SettingsMenu(props: RouteComponentProps<Props>) {
const { history, account, className }: any = props;
const isAdmin = account.admin || account.superAdmin;
const navigateTo = (path: any) => {
switch (path) {
case 'projects':
return history.push(clientRoute(CLIENT_TABS.SITES));
case 'team':
return history.push(clientRoute(CLIENT_TABS.MANAGE_USERS));
case 'metadata':
return history.push(clientRoute(CLIENT_TABS.CUSTOM_FIELDS));
case 'webhooks':
return history.push(clientRoute(CLIENT_TABS.WEBHOOKS));
case 'integrations':
return history.push(clientRoute(CLIENT_TABS.INTEGRATIONS));
case 'notifications':
return history.push(clientRoute(CLIENT_TABS.NOTIFICATIONS));
}
};
return (
<div
style={{ width: '150px' }}
className={cn(className, 'absolute right-0 top-0 bg-white border mt-14')}
>
{isAdmin && (
<>
<MenuItem onClick={() => navigateTo('projects')} label="Projects" icon="folder2" />
<MenuItem onClick={() => navigateTo('team')} label="Team" icon="users" />
</>
)}
<MenuItem onClick={() => navigateTo('metadata')} label="Metadata" icon="tags" />
<MenuItem onClick={() => navigateTo('webhooks')} label="Webhooks" icon="link-45deg" />
<MenuItem onClick={() => navigateTo('integrations')} label="Integrations" icon="puzzle" />
<MenuItem
onClick={() => navigateTo('notifications')}
label="Notifications"
icon="bell-slash"
/>
</div>
);
}
export default withRouter(SettingsMenu);
function MenuItem({ onClick, label, icon }: any) {
return (
<div
className="border-t p-3 cursor-pointer flex items-center hover:bg-active-blue"
onClick={onClick}
>
<Icon name={icon} size="16" />
<button className="ml-2">{label}</button>
</div>
);
}

View file

@ -0,0 +1 @@
export { default } from './SettingsMenu';

View file

@ -3,7 +3,6 @@ import { connect } from 'react-redux';
import { setSiteId } from 'Duck/site';
import { withRouter } from 'react-router-dom';
import { hasSiteId, siteChangeAvaliable } from 'App/routes';
import { STATUS_COLOR_MAP, GREEN } from 'Types/site';
import { Icon } from 'UI';
import { pushNewSite } from 'Duck/user';
import { init } from 'Duck/site';
@ -13,7 +12,6 @@ import { clearSearch } from 'Duck/search';
import { clearSearch as clearSearchLive } from 'Duck/liveSearch';
import { fetchListActive as fetchIntegrationVariables } from 'Duck/customField';
import { withStore } from 'App/mstore';
import AnimatedSVG, { ICONS } from '../shared/AnimatedSVG/AnimatedSVG';
import NewProjectButton from './NewProjectButton';
@withStore
@ -63,37 +61,27 @@ export default class SiteDropdown extends React.PureComponent {
account,
location: { pathname },
} = this.props;
const { showProductModal } = this.state;
const isAdmin = account.admin || account.superAdmin;
const activeSite = sites.find((s) => s.id == siteId);
const disabled = !siteChangeAvaliable(pathname);
const showCurrent = hasSiteId(pathname) || siteChangeAvaliable(pathname);
// const canAddSites = isAdmin && account.limits.projects && account.limits.projects.remaining !== 0;
return (
<div className={styles.wrapper}>
{showCurrent ? (
activeSite && activeSite.status === GREEN ? (
<AnimatedSVG name={ICONS.SIGNAL_GREEN} size="10" />
) : (
<AnimatedSVG name={ICONS.SIGNAL_RED} size="10" />
)
) : (
<Icon name="window-alt" size="14" marginRight="10" />
)}
<div className={cn(styles.currentSite, 'ml-2')}>{showCurrent && activeSite ? activeSite.host : 'All Projects'}</div>
<Icon className={styles.drodownIcon} color="gray-light" name="chevron-down" size="16" />
<div className={styles.menu}>
<ul data-can-disable={disabled}>
{!showCurrent && <li>{'Project selection is not applicable.'}</li>}
{isAdmin && (
<NewProjectButton onClick={this.newSite} isAdmin={isAdmin} />
)}
{sites.map((site) => (
<li key={site.id} onClick={() => this.switchSite(site.id)}>
<div className="w-2 h-2 rounded-full mr-3" style={{ backgroundColor: STATUS_COLOR_MAP[site.status] }} />
{site.host}
<Icon name="folder2" size="16" />
<span className="ml-3">{site.host}</span>
</li>
))}
</ul>
<NewProjectButton onClick={this.newSite} isAdmin={isAdmin} />
</div>
</div>
);

View file

@ -1,9 +1,11 @@
import React from 'react';
import { withRouter } from 'react-router-dom';
import { withRouter, RouteComponentProps } from 'react-router-dom';
import { connect } from 'react-redux';
import { logout } from 'Duck/user';
import { client, CLIENT_DEFAULT_TAB } from 'App/routes';
import { Icon } from 'UI';
import cn from 'classnames';
import { getInitials } from 'App/utils';
const CLIENT_PATH = client(CLIENT_DEFAULT_TAB);
@ -11,43 +13,45 @@ interface Props {
history: any;
onLogoutClick: any;
className: string;
account: any;
}
function UserMenu(props: Props) {
function UserMenu(props: RouteComponentProps<Props>) {
const { account, history, className, onLogoutClick }: any = props;
const onAccountClick = () => {
props.history.push(CLIENT_PATH);
history.push(CLIENT_PATH);
};
return (
<div style={{ width: '250px' }} className={cn(props.className, "absolute right-0 top-0 bg-white border mt-14 shadow")}>
<div
style={{ width: '250px' }}
className={cn(className, 'absolute right-0 top-0 bg-white border mt-14')}
>
<div className="flex items-center p-3">
<div className="w-10 h-10 bg-tealx rounded-full flex items-center justify-center mr-2 color-white">
SS
{getInitials(account.name)}
</div>
<div>
<div className="color-teal font-medium leading-none">User Name</div>
<div className="color-gray-medium">Admin - admin@gmail.com</div>
<div className="color-teal font-medium leading-none">{account.name}</div>
<div className="color-gray-medium">{account.superAdmin ? 'Super Admin' : (account.admin ? 'Admin' : 'Member') } - {account.email}</div>
</div>
</div>
<div className="border-t">
<button onClick={onAccountClick}>{'Account'}</button>
<div className="border-t flex items-center hover:bg-active-blue p-3" onClick={onAccountClick}>
<Icon name="user-circle" size="16" />
<button className="ml-2">{'Account'}</button>
</div>
<div className="border-t">
<button onClick={props.onLogoutClick}>{'Logout'}</button>
<div className="border-t flex items-center hover:bg-active-blue p-3" onClick={onLogoutClick}>
<Icon name="door-closed" size="16" />
<button className="ml-2">{'Logout'}</button>
</div>
</div>
);
}
export default withRouter(
connect(
(state: any) => ({
// account: state.getIn([ 'user', 'account' ]),
// siteId: state.getIn([ 'site', 'siteId' ]),
// sites: state.getIn([ 'site', 'list' ]),
// showAlerts: state.getIn([ 'dashboard', 'showAlerts' ]),
// boardingCompletion: state.getIn([ 'dashboard', 'boardingCompletion' ])
}),
{ onLogoutClick: logout }
)(UserMenu)
);
export default connect(
(state: any) => ({
account: state.getIn(['user', 'account']),
}),
{ onLogoutClick: logout }
)(withRouter(UserMenu)) as React.FunctionComponent<RouteComponentProps<Props>>;
// export default UserMenu;

View file

@ -4,13 +4,13 @@
$height: 50px;
.header {
position: fixed;
width: 100%;
display: flex;
justify-content: space-between;
/* position: fixed; */
/* width: 100%; */
/* display: flex; */
/* justify-content: space-between; */
border-bottom: solid thin $gray-light;
/* padding: 0 15px; */
background: $white;
/* background: $white; */
z-index: $header;
}
@ -45,7 +45,7 @@ $height: 50px;
}
.right {
margin-left: auto;
/* margin-left: auto; */
position: relative;
cursor: default;
display: flex;
@ -101,7 +101,7 @@ $height: 50px;
border-top: 1px solid $gray-light;
}
}
& a, & button {
/* & a, & button {
color: $gray-darkest;
display: block;
cursor: pointer;
@ -112,7 +112,7 @@ $height: 50px;
&:hover {
background-color: $gray-lightest;
}
}
} */
}
.userIcon {

View file

@ -7,9 +7,14 @@
justify-content: flex-start;
position: relative;
user-select: none;
border: solid thin transparent;
height: 30px;
border-radius: 3px;
margin: 10px;
&:hover {
background-color: $gray-lightest;
background-color: $active-blue;
/* border: solid thin $active-blue-border; */
& .drodownIcon {
transform: rotate(180deg);
transition: all 0.2s;
@ -39,11 +44,12 @@
& .menu {
display: none;
position: absolute;
top: 50px;
top: 28px;
left: -1px;
background-color: white;
min-width: 200px;
z-index: 2;
border-radius: 3px;
border: 1px solid $gray-light;
}
@ -68,9 +74,13 @@
&:hover {
background-color: $gray-lightest;
transition: all 0.2s;
color: $teal;
svg {
fill: $teal;
}
}
&:first-child {
border-top: 1px solid $gray-light;
/* border-top: 1px solid $gray-light; */
}
}
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-bar-left" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M12.5 15a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5zM10 8a.5.5 0 0 1-.5.5H3.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L3.707 7.5H9.5a.5.5 0 0 1 .5.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 352 B

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-bell-slash" viewBox="0 0 16 16">
<path d="M5.164 14H15c-.299-.199-.557-.553-.78-1-.9-1.8-1.22-5.12-1.22-6 0-.264-.02-.523-.06-.776l-.938.938c.02.708.157 2.154.457 3.58.161.767.377 1.566.663 2.258H6.164l-1 1zm5.581-9.91a3.986 3.986 0 0 0-1.948-1.01L8 2.917l-.797.161A4.002 4.002 0 0 0 4 7c0 .628-.134 2.197-.459 3.742-.05.238-.105.479-.166.718l-1.653 1.653c.02-.037.04-.074.059-.113C2.679 11.2 3 7.88 3 7c0-2.42 1.72-4.44 4.005-4.901a1 1 0 1 1 1.99 0c.942.19 1.788.645 2.457 1.284l-.707.707zM10 15a2 2 0 1 1-4 0h4zm-9.375.625a.53.53 0 0 0 .75.75l14.75-14.75a.53.53 0 0 0-.75-.75L.625 15.625z"/>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-door-closed" viewBox="0 0 16 16">
<path d="M3 2a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v13h1.5a.5.5 0 0 1 0 1h-13a.5.5 0 0 1 0-1H3V2zm1 13h8V2H4v13z"/>
<path d="M9 9a1 1 0 1 0 2 0 1 1 0 0 0-2 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 271 B

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-folder-plus" viewBox="0 0 16 16">
<path d="m.5 3 .04.87a1.99 1.99 0 0 0-.342 1.311l.637 7A2 2 0 0 0 2.826 14H9v-1H2.826a1 1 0 0 1-.995-.91l-.637-7A1 1 0 0 1 2.19 4h11.62a1 1 0 0 1 .996 1.09L14.54 8h1.005l.256-2.819A2 2 0 0 0 13.81 3H9.828a2 2 0 0 1-1.414-.586l-.828-.828A2 2 0 0 0 6.172 1H2.5a2 2 0 0 0-2 2zm5.672-1a1 1 0 0 1 .707.293L7.586 3H2.19c-.24 0-.47.042-.683.12L1.5 2.98a1 1 0 0 1 1-.98h3.672z"/>
<path d="M13.5 10a.5.5 0 0 1 .5.5V12h1.5a.5.5 0 1 1 0 1H14v1.5a.5.5 0 1 1-1 0V13h-1.5a.5.5 0 0 1 0-1H13v-1.5a.5.5 0 0 1 .5-.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 619 B

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-folder2" viewBox="0 0 16 16">
<path d="M1 3.5A1.5 1.5 0 0 1 2.5 2h2.764c.958 0 1.76.56 2.311 1.184C7.985 3.648 8.48 4 9 4h4.5A1.5 1.5 0 0 1 15 5.5v7a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 1 12.5v-9zM2.5 3a.5.5 0 0 0-.5.5V6h12v-.5a.5.5 0 0 0-.5-.5H9c-.964 0-1.71-.629-2.174-1.154C6.374 3.334 5.82 3 5.264 3H2.5zM14 7H2v5.5a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5V7z"/>
</svg>

After

Width:  |  Height:  |  Size: 446 B

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-puzzle" viewBox="0 0 16 16">
<path d="M3.112 3.645A1.5 1.5 0 0 1 4.605 2H7a.5.5 0 0 1 .5.5v.382c0 .696-.497 1.182-.872 1.469a.459.459 0 0 0-.115.118.113.113 0 0 0-.012.025L6.5 4.5v.003l.003.01c.004.01.014.028.036.053a.86.86 0 0 0 .27.194C7.09 4.9 7.51 5 8 5c.492 0 .912-.1 1.19-.24a.86.86 0 0 0 .271-.194.213.213 0 0 0 .039-.063v-.009a.112.112 0 0 0-.012-.025.459.459 0 0 0-.115-.118c-.375-.287-.872-.773-.872-1.469V2.5A.5.5 0 0 1 9 2h2.395a1.5 1.5 0 0 1 1.493 1.645L12.645 6.5h.237c.195 0 .42-.147.675-.48.21-.274.528-.52.943-.52.568 0 .947.447 1.154.862C15.877 6.807 16 7.387 16 8s-.123 1.193-.346 1.638c-.207.415-.586.862-1.154.862-.415 0-.733-.246-.943-.52-.255-.333-.48-.48-.675-.48h-.237l.243 2.855A1.5 1.5 0 0 1 11.395 14H9a.5.5 0 0 1-.5-.5v-.382c0-.696.497-1.182.872-1.469a.459.459 0 0 0 .115-.118.113.113 0 0 0 .012-.025L9.5 11.5v-.003a.214.214 0 0 0-.039-.064.859.859 0 0 0-.27-.193C8.91 11.1 8.49 11 8 11c-.491 0-.912.1-1.19.24a.859.859 0 0 0-.271.194.214.214 0 0 0-.039.063v.003l.001.006a.113.113 0 0 0 .012.025c.016.027.05.068.115.118.375.287.872.773.872 1.469v.382a.5.5 0 0 1-.5.5H4.605a1.5 1.5 0 0 1-1.493-1.645L3.356 9.5h-.238c-.195 0-.42.147-.675.48-.21.274-.528.52-.943.52-.568 0-.947-.447-1.154-.862C.123 9.193 0 8.613 0 8s.123-1.193.346-1.638C.553 5.947.932 5.5 1.5 5.5c.415 0 .733.246.943.52.255.333.48.48.675.48h.238l-.244-2.855zM4.605 3a.5.5 0 0 0-.498.55l.001.007.29 3.4A.5.5 0 0 1 3.9 7.5h-.782c-.696 0-1.182-.497-1.469-.872a.459.459 0 0 0-.118-.115.112.112 0 0 0-.025-.012L1.5 6.5h-.003a.213.213 0 0 0-.064.039.86.86 0 0 0-.193.27C1.1 7.09 1 7.51 1 8c0 .491.1.912.24 1.19.07.14.14.225.194.271a.213.213 0 0 0 .063.039H1.5l.006-.001a.112.112 0 0 0 .025-.012.459.459 0 0 0 .118-.115c.287-.375.773-.872 1.469-.872H3.9a.5.5 0 0 1 .498.542l-.29 3.408a.5.5 0 0 0 .497.55h1.878c-.048-.166-.195-.352-.463-.557-.274-.21-.52-.528-.52-.943 0-.568.447-.947.862-1.154C6.807 10.123 7.387 10 8 10s1.193.123 1.638.346c.415.207.862.586.862 1.154 0 .415-.246.733-.52.943-.268.205-.415.39-.463.557h1.878a.5.5 0 0 0 .498-.55l-.001-.007-.29-3.4A.5.5 0 0 1 12.1 8.5h.782c.696 0 1.182.497 1.469.872.05.065.091.099.118.115.013.008.021.01.025.012a.02.02 0 0 0 .006.001h.003a.214.214 0 0 0 .064-.039.86.86 0 0 0 .193-.27c.14-.28.24-.7.24-1.191 0-.492-.1-.912-.24-1.19a.86.86 0 0 0-.194-.271.215.215 0 0 0-.063-.039H14.5l-.006.001a.113.113 0 0 0-.025.012.459.459 0 0 0-.118.115c-.287.375-.773.872-1.469.872H12.1a.5.5 0 0 1-.498-.543l.29-3.407a.5.5 0 0 0-.497-.55H9.517c.048.166.195.352.463.557.274.21.52.528.52.943 0 .568-.447.947-.862 1.154C9.193 5.877 8.613 6 8 6s-1.193-.123-1.638-.346C5.947 5.447 5.5 5.068 5.5 4.5c0-.415.246-.733.52-.943.268-.205.415-.39.463-.557H4.605z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB