Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Lens] Chart switch redesign #187475

Merged
merged 50 commits into from
Sep 5, 2024
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
1d6907f
adding a border for workspace panel, moving to boxesVertical for laye…
mbondyra Jul 3, 2024
c51b103
reorder and flatten visualizations positions
mbondyra Jul 3, 2024
6f5b7f6
add deprecated section for legacy metric
mbondyra Jul 3, 2024
06c32e6
add descriptions
mbondyra Jul 3, 2024
c7994ed
redesign chart switch
mbondyra Jul 4, 2024
ee5220a
redesign add layer
mbondyra Jul 4, 2024
97fc4bd
gauge
mbondyra Jul 11, 2024
8c0b8b3
adding partition changes
mbondyra Jul 11, 2024
54ec813
xy
mbondyra Jul 11, 2024
73c6a30
wip
mbondyra Jul 14, 2024
60c884a
compatibleSubtypes
mbondyra Jul 16, 2024
311947f
gauge and pie
mbondyra Aug 1, 2024
2ff6955
percentage -> bar
mbondyra Aug 1, 2024
a384e8d
adding autoFocus https://github.com/elastic/kibana/pull/191213/files
mbondyra Aug 26, 2024
5d0bffb
correct the vis dimensions
mbondyra Aug 27, 2024
063cb59
code review p1
mbondyra Aug 27, 2024
4c01997
padding fix
mbondyra Aug 28, 2024
f8a4687
divider fix
mbondyra Aug 28, 2024
c427714
fix flipping orientation
mbondyra Aug 28, 2024
3d2b1ae
Merge commit 'dda6cd9d9e892cb328c40125c00d173ce71e16d4' into lens/cha…
mbondyra Aug 28, 2024
1d703c4
Merge branch 'main' into lens/chart_switch_redesign
mbondyra Aug 28, 2024
9681afa
Merge commit '358845ef45e74e2cbe9e28fd0eab8a91a9396778' into lens/cha…
mbondyra Aug 28, 2024
f379275
simplify icons for gauge
mbondyra Aug 28, 2024
fcde6fd
fix i18n
mbondyra Aug 28, 2024
fc8c741
optimize icons
mbondyra Aug 29, 2024
80fc5ac
icon optimization
mbondyra Aug 29, 2024
aa6dfed
description bigger
mbondyra Aug 29, 2024
adab691
gauge and icon fixed
mbondyra Aug 29, 2024
b088966
Add layer button fixes
mbondyra Aug 29, 2024
87e1adb
[Lens] Chart switch redesign no stacked
mbondyra Aug 28, 2024
8cb1347
horizontal bar
mbondyra Aug 29, 2024
92eae1f
Merge commit 'be8de5370cc5af56b8c37a12a54b346bd56905b2' into lens/cha…
mbondyra Aug 29, 2024
a863fb5
test correction
mbondyra Aug 29, 2024
88740a1
simplify paddings
mbondyra Aug 29, 2024
b4d7f0f
toolbar popovers paddings
mbondyra Aug 29, 2024
903a711
add layer hardcoded values removed
mbondyra Aug 29, 2024
af42238
i18n
mbondyra Aug 29, 2024
2ad0c43
i18n
mbondyra Aug 29, 2024
a2b187c
fix popover
mbondyra Aug 30, 2024
d8fed3e
chart switch refactor
mbondyra Aug 30, 2024
e58c5c3
Merge commit '50e46291f8e18dbd90c77b8938a41206b6bf122f' into lens/cha…
mbondyra Sep 1, 2024
14e0c1f
CR
mbondyra Sep 1, 2024
5435f50
i18n
mbondyra Sep 1, 2024
b89d264
Merge commit '1a92a4ba136dc0e3488c06b25d1c96ec01c638cc' into lens/cha…
mbondyra Sep 3, 2024
ff8642f
copy changes
mbondyra Sep 3, 2024
2b8f60d
fix suggestions
mbondyra Sep 3, 2024
14b1f7a
revert
mbondyra Sep 3, 2024
529b174
make the change only for xy
mbondyra Sep 4, 2024
7b2a121
Merge commit 'c5242d7e5bc3a9b4123dfb83e49a568abd3e440d' into lens/cha…
mbondyra Sep 4, 2024
725e266
Merge commit '7cb2a59be5d7c1d6066180a7765c05c777dbbd33' into lens/cha…
mbondyra Sep 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/management/rollups/create_and_manage_rollups.asciidoc
mbondyra marked this conversation as resolved.
Show resolved Hide resolved
mbondyra marked this conversation as resolved.
Show resolved Hide resolved
mbondyra marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a couple of questions, in particular related to the new "stacking" behaviour cc @teresaalvarezsoler @MichaelMarcialis :

  • Why the limiting the "stacking" only to those layers with a breakdown dimension?
    • My concern is mostly related to a configuration with single layer with multiple metrics which can benefit for having both stacked and unstacked modes
  • Why introducing the new concept of stacking layers?
    • So far the stacking behaviour was "per layer" with implicit stacking behaviour: i.e. both layers are stacked? Then it's a global stacked. One layer amongst the config is unstacked? Then stack all the others together and keep the unstacked separate.
    • With the new double stacking control (per layer + on the appearance popover when multiple layers) it is not easy to reproduce the last behaviour - while it is possible to produce new ones 🤔
  • I have some concern over the discoverability of the new stacking layers control. I found out about it only looking at the mockups, otherwise I would not watch for it over there.
    I think that the combination of "hide when not useful" pattern combined for both per layer stacked control and in the popover makes it a bit harder to discover this new feature. While I agree to not make the UI too complex, in this case probably it can be an exception?
    • and perhaps also a good opportunity to put some explanation/info about the new stacking behaviour?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dej611 good points

My concern is mostly related to a configuration with single layer with multiple metrics which can benefit for having both stacked and unstacked modes

This is a very good point and definitely a reason to always show the stacking options.

Why introducing the new concept of stacking layers? With the new double stacking control (per layer + on the appearance popover when multiple layers) it is not easy to reproduce the last behaviour

I agree with the issues for this. We may even hit some backward compatibility issues.

I have some concern over the discoverability of the new stacking layers control.

I also had similar concerns when I was testing it.

@MichaelMarcialis IMO these are strong reasons to always show the stacking options when there is a bar or area chart regardless of whether there is a breakdown dimension. I fully agree with Marco the gains of showing options when they are most relevant to keep the UI cleaner doesn't compensate the lost of functionality for the edge cases mentioned above and the discoverability issues. Any reasons why we shouldn't do it?

Copy link
Contributor

@MichaelMarcialis MichaelMarcialis Aug 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@teresaalvarezsoler: This is a pretty dense topic, so I'd be happy to jump on a Zoom if ya'll want to discuss in person.

In short, I was attempting to accommodate for all possible cases in my designs, including the possibility that users might desire to create a visualization comprised two layers where both layers have stacked breakdowns but the layers themselves are not stacked. In order to do that, we would need to distinguish between layer-level breakdown stacking and visualization-level layer stacking (thus the layer and toolbar controls).

If ya'll are comfortable with not accommodating for such edge cases, then I think I'd be OK with what @dej611 is proposing for the sake of further simplification. Thoughts?

MichaelMarcialis marked this conversation as resolved.
Show resolved Hide resolved
mbondyra marked this conversation as resolved.
Show resolved Hide resolved
mbondyra marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ as your source to see both the raw and rolled up data.
[role="screenshot"]
mbondyra marked this conversation as resolved.
Show resolved Hide resolved
image::images/management-create-rollup-bar-chart.png[Create visualization of rolled up data]

. Select *Bar vertical stacked* in the chart type dropdown.
. Select *Bar* in the chart type dropdown.

. Add the `@timestamp` field to the *Horizontal axis*.

Expand Down
9 changes: 9 additions & 0 deletions packages/kbn-chart-icons/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,19 @@ export {
EuiIconLegend,
IconRegionMap,
IconChartHeatmap,
IconChartGauge,
IconChartHorizontalBullet,
IconChartHorizontalBulletSimple,
IconDonutHoleLarge,
IconDonutHoleMedium,
IconDonutHoleSmall,
IconChartVerticalBullet,
IconChartVerticalBulletSimple,
IconChartGaugeSemiCircle,
IconChartGaugeSemiCircleSimple,
IconChartGaugeArc,
IconChartGaugeArcSimple,
IconChartGaugeCircle,
IconChartGaugeCircleSimple,
IconChartTagcloud,
} from './src/assets';
11 changes: 11 additions & 0 deletions packages/kbn-chart-icons/src/__stories__/icons.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,12 @@ import {
EuiIconLegend,
IconRegionMap,
IconChartHeatmap,
IconChartGauge,
IconChartHorizontalBullet,
IconChartVerticalBullet,
IconDonutHoleLarge,
IconDonutHoleMedium,
IconDonutHoleSmall,
} from '../..';

export default {
Expand Down Expand Up @@ -183,10 +187,17 @@ const IconsArray: Array<{
title: 'IconChartHorizontalBullet',
Component: IconChartHorizontalBullet,
},
{
title: 'IconChartGauge',
Component: IconChartGauge,
},
{
title: 'IconChartVerticalBullet',
Component: IconChartVerticalBullet,
},
{ title: 'IconDonutHoleLarge', Component: IconDonutHoleLarge },
{ title: 'IconDonutHoleMedium', Component: IconDonutHoleMedium },
{ title: 'IconDonutHoleSmall', Component: IconDonutHoleSmall },
];

interface RootComponentProps {
Expand Down
35 changes: 35 additions & 0 deletions packages/kbn-chart-icons/src/assets/chart_gauge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';
import { colors } from './common_styles';

export const IconChartGauge = ({ title, titleId, ...props }: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="30"
height="22"
viewBox="0 0 30 22"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}
<path
className={colors.subdued}
d="M1 13a1 1 0 00-1 1v2a1 1 0 102 0v-1h5v1a1 1 0 102 0v-1h5v1a1 1 0 102 0v-1h5v1a1 1 0 102 0v-1h5v1a1 1 0 102 0v-2a1 1 0 00-1-1H1z"
/>
<path
className={colors.accent}
d="M0 6a1 1 0 011-1h24a1 1 0 011 1v4a1 1 0 01-1 1H1a1 1 0 01-1-1V6z"
/>
</svg>
);
};
35 changes: 35 additions & 0 deletions packages/kbn-chart-icons/src/assets/chart_gauge_arc_simple.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconChartGaugeArcSimple = ({
title,
titleId,
...props
}: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}
<path
fillRule="evenodd"
clipRule="evenodd"
d="M12.0962 3.90381C9.55779 1.3654 5.44221 1.3654 2.90381 3.90381C0.484359 6.32325 0.370973 10.1755 2.56365 12.7292L3.61091 11.682C3.80617 11.4867 4.12276 11.4867 4.31802 11.682C4.51328 11.8772 4.51328 12.1938 4.31802 12.3891L2.90381 13.8033C2.70854 13.9986 2.39196 13.9986 2.1967 13.8033C-0.732233 10.8744 -0.732233 6.12563 2.1967 3.1967C5.12563 0.267767 9.87437 0.267767 12.8033 3.1967C15.7322 6.12563 15.7322 10.8744 12.8033 13.8033C12.608 13.9986 12.2915 13.9986 12.0962 13.8033L10.682 12.3891C10.4867 12.1938 10.4867 11.8772 10.682 11.682C10.8772 11.4867 11.1938 11.4867 11.3891 11.682L12.4364 12.7292C14.629 10.1755 14.5156 6.32325 12.0962 3.90381Z"
/>
</svg>
);
};
35 changes: 35 additions & 0 deletions packages/kbn-chart-icons/src/assets/chart_gauge_circle_simple.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconChartGaugeCircleSimple = ({
title,
titleId,
...props
}: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}
<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.5 1C3.91015 1 1 3.91015 1 7.5C1 11.0899 3.91015 14 7.5 14C11.0899 14 14 11.0899 14 7.5C14 3.91015 11.0899 1 7.5 1ZM0 7.5C0 3.35786 3.35786 0 7.5 0C11.6421 0 15 3.35786 15 7.5C15 11.6421 11.6421 15 7.5 15C3.35786 15 0 11.6421 0 7.5Z"
/>
</svg>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconChartGaugeSemiCircleSimple = ({
title,
titleId,
...props
}: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}
<path
fillRule="evenodd"
clipRule="evenodd"
d="M1.01894 11H2.5C2.77614 11 3 11.2239 3 11.5C3 11.7761 2.77614 12 2.5 12H0.5C0.223858 12 0 11.7761 0 11.5C0 7.35786 3.35786 4 7.5 4C11.6421 4 15 7.35786 15 11.5C15 11.7761 14.7761 12 14.5 12H12.5C12.2239 12 12 11.7761 12 11.5C12 11.2239 12.2239 11 12.5 11H13.9811C13.7257 7.64378 10.9216 5 7.5 5C4.07839 5 1.27426 7.64378 1.01894 11Z"
/>
</svg>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconChartHorizontalBulletSimple = ({
title,
titleId,
...props
}: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}
<path
fillRule="evenodd"
clipRule="evenodd"
d="M0 7.5C0 7.22386 0.223858 7 0.5 7H15.5C15.7761 7 16 7.22386 16 7.5V9.5C16 9.77614 15.7761 10 15.5 10C15.2239 10 15 9.77614 15 9.5V8H1V9.5C1 9.77614 0.776142 10 0.5 10C0.223858 10 0 9.77614 0 9.5V7.5Z"
/>
</svg>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconChartVerticalBulletSimple = ({
title,
titleId,
...props
}: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}
<path
fillRule="evenodd"
clipRule="evenodd"
d="M0 7.5C0 7.22386 0.223858 7 0.5 7H15.5C15.7761 7 16 7.22386 16 7.5V9.5C16 9.77614 15.7761 10 15.5 10C15.2239 10 15 9.77614 15 9.5V8H1V9.5C1 9.77614 0.776142 10 0.5 10C0.223858 10 0 9.77614 0 9.5V7.5Z"
/>
</svg>
);
};
39 changes: 39 additions & 0 deletions packages/kbn-chart-icons/src/assets/donut_hole_large.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconDonutHoleLarge = ({ title, titleId, ...props }: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}

<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.5 3C5.01472 3 3 5.01472 3 7.5C3 9.98528 5.01472 12 7.5 12C9.98528 12 12 9.98528 12 7.5C12 5.01472 9.98528 3 7.5 3ZM4 7.5C4 5.567 5.567 4 7.5 4C9.433 4 11 5.567 11 7.5C11 9.433 9.433 11 7.5 11C5.567 11 4 9.433 4 7.5Z"
fill="#343741"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.5 0C3.35786 0 0 3.35786 0 7.5C0 11.6421 3.35786 15 7.5 15C11.6421 15 15 11.6421 15 7.5C15 3.35786 11.6421 0 7.5 0ZM1 7.5C1 3.91015 3.91015 1 7.5 1C11.0899 1 14 3.91015 14 7.5C14 11.0899 11.0899 14 7.5 14C3.91015 14 1 11.0899 1 7.5Z"
fill="#343741"
/>
</svg>
);
};
39 changes: 39 additions & 0 deletions packages/kbn-chart-icons/src/assets/donut_hole_medium.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconDonutHoleMedium = ({ title, titleId, ...props }: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}

<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.5 4C5.567 4 4 5.567 4 7.5C4 9.433 5.567 11 7.5 11C9.433 11 11 9.433 11 7.5C11 5.567 9.433 4 7.5 4ZM5 7.5C5 6.11929 6.11929 5 7.5 5C8.88071 5 10 6.11929 10 7.5C10 8.88071 8.88071 10 7.5 10C6.11929 10 5 8.88071 5 7.5Z"
fill="#343741"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.5 0C3.35786 0 0 3.35786 0 7.5C0 11.6421 3.35786 15 7.5 15C11.6421 15 15 11.6421 15 7.5C15 3.35786 11.6421 0 7.5 0ZM1 7.5C1 3.91015 3.91015 1 7.5 1C11.0899 1 14 3.91015 14 7.5C14 11.0899 11.0899 14 7.5 14C3.91015 14 1 11.0899 1 7.5Z"
fill="#343741"
/>
</svg>
);
};
39 changes: 39 additions & 0 deletions packages/kbn-chart-icons/src/assets/donut_hole_small.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import React from 'react';
import type { EuiIconProps } from '@elastic/eui';

export const IconDonutHoleSmall = ({ title, titleId, ...props }: Omit<EuiIconProps, 'type'>) => {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-labelledby={titleId}
{...props}
>
{title ? <title id={titleId}>{title}</title> : null}

<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.5 5C6.11929 5 5 6.11929 5 7.5C5 8.88071 6.11929 10 7.5 10C8.88071 10 10 8.88071 10 7.5C10 6.11929 8.88071 5 7.5 5ZM6 7.5C6 6.67157 6.67157 6 7.5 6C8.32843 6 9 6.67157 9 7.5C9 8.32843 8.32843 9 7.5 9C6.67157 9 6 8.32843 6 7.5Z"
fill="#343741"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.5 0C3.35786 0 0 3.35786 0 7.5C0 11.6421 3.35786 15 7.5 15C11.6421 15 15 11.6421 15 7.5C15 3.35786 11.6421 0 7.5 0ZM1 7.5C1 3.91015 3.91015 1 7.5 1C11.0899 1 14 3.91015 14 7.5C14 11.0899 11.0899 14 7.5 14C3.91015 14 1 11.0899 1 7.5Z"
fill="#343741"
/>
</svg>
);
};
Loading