@onewelcome/react-lib-components 2.0.0 → 2.2.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 (42) hide show
  1. package/dist/cjs/Button/IconButton.cjs.js +1 -1
  2. package/dist/cjs/DataGrid/DataGridActions/DataGridColumnsToggle.cjs.js +1 -1
  3. package/dist/cjs/Form/Checkbox/Checkbox.cjs.js +1 -1
  4. package/dist/cjs/Form/Input/Input.cjs.js +1 -1
  5. package/dist/cjs/Form/Toggle/Toggle.cjs.js +1 -1
  6. package/dist/cjs/Icon/Icon.cjs.js +1 -1
  7. package/dist/cjs/Icon/Icon.module.cjs.js +1 -1
  8. package/dist/cjs/components/Form/Checkbox/Checkbox.d.ts +2 -3
  9. package/dist/cjs/components/Form/Input/Input.d.ts +6 -5
  10. package/dist/cjs/components/Form/Toggle/Toggle.d.ts +2 -2
  11. package/dist/cjs/components/Icon/Icon.d.ts +1 -0
  12. package/dist/cjs/interfaces.d.ts +2 -0
  13. package/dist/esm/Button/IconButton.esm.js +1 -1
  14. package/dist/esm/DataGrid/DataGridActions/DataGridColumnsToggle.esm.js +1 -1
  15. package/dist/esm/Form/Checkbox/Checkbox.esm.js +1 -1
  16. package/dist/esm/Form/Input/Input.esm.js +1 -1
  17. package/dist/esm/Form/Toggle/Toggle.esm.js +1 -1
  18. package/dist/esm/Icon/Icon.esm.js +1 -1
  19. package/dist/esm/Icon/Icon.module.esm.js +1 -1
  20. package/dist/esm/components/Form/Checkbox/Checkbox.d.ts +2 -3
  21. package/dist/esm/components/Form/Input/Input.d.ts +6 -5
  22. package/dist/esm/components/Form/Toggle/Toggle.d.ts +2 -2
  23. package/dist/esm/components/Icon/Icon.d.ts +1 -0
  24. package/dist/esm/interfaces.d.ts +2 -0
  25. package/package.json +1 -1
  26. package/src/components/Button/IconButton.tsx +1 -1
  27. package/src/components/DataGrid/DataGridActions/DataGridColumnsToggle.tsx +2 -3
  28. package/src/components/DataGrid/DataGridBody/__snapshots__/DataGridBody.test.tsx.snap +4 -0
  29. package/src/components/Form/Checkbox/Checkbox.test.tsx +16 -5
  30. package/src/components/Form/Checkbox/Checkbox.tsx +5 -17
  31. package/src/components/Form/Input/Input.test.tsx +16 -0
  32. package/src/components/Form/Input/Input.tsx +20 -10
  33. package/src/components/Form/Toggle/Toggle.test.tsx +10 -8
  34. package/src/components/Form/Toggle/Toggle.tsx +28 -24
  35. package/src/components/Icon/Icon.module.scss +9 -4
  36. package/src/components/Icon/Icon.tsx +1 -0
  37. package/src/font/icomoon.eot +0 -0
  38. package/src/font/icomoon.svg +1 -0
  39. package/src/font/icomoon.ttf +0 -0
  40. package/src/font/icomoon.woff +0 -0
  41. package/src/font/selection.json +1 -1
  42. package/src/interfaces.ts +8 -0
@@ -1,12 +1,13 @@
1
- import React, { ComponentPropsWithRef } from "react";
1
+ import React, { ComponentPropsWithRef, ReactNode } from "react";
2
2
  import { FormElement } from "../form.interfaces";
3
+ import { MergeElementProps } from "../../../interfaces";
3
4
  export declare const dateTypes: readonly ["date", "time", "datetime-local"];
4
5
  export type Type = "text" | "email" | "file" | "number" | "password" | "search" | "tel" | "url" | "hidden" | (typeof dateTypes)[number];
5
- export interface Props extends ComponentPropsWithRef<"input">, FormElement {
6
+ export type Props = MergeElementProps<"input", FormElement & {
6
7
  wrapperProps?: ComponentPropsWithRef<"div">;
7
8
  labeledBy?: string;
8
9
  type: Type;
9
- suffix?: string;
10
- prefix?: string;
11
- }
10
+ suffix?: ReactNode;
11
+ prefix?: ReactNode;
12
+ }>;
12
13
  export declare const Input: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<HTMLInputElement>>;
@@ -1,6 +1,6 @@
1
1
  import React, { ComponentPropsWithRef } from "react";
2
2
  import { Props as CheckboxProps } from "../Checkbox/Checkbox";
3
- export interface Props extends ComponentPropsWithRef<"input">, Omit<CheckboxProps, "indeterminate" | "errorMessage" | "error" | "children" | "label"> {
4
- children: string;
3
+ export interface Props extends ComponentPropsWithRef<"input">, Omit<CheckboxProps, "indeterminate" | "errorMessage" | "error" | "label"> {
4
+ label?: string | React.ReactElement;
5
5
  }
6
6
  export declare const Toggle: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<HTMLInputElement>>;
@@ -25,6 +25,7 @@ export declare enum Icons {
25
25
  Equal = "equal",
26
26
  Error = "error-circle",
27
27
  Eye = "eye",
28
+ EyeBlocked = "eye-blocked",
28
29
  Filter = "filter",
29
30
  FilterAlt = "filter-alt",
30
31
  FilterAltArrow = "filter-alt-arrow",
@@ -1,4 +1,6 @@
1
+ import React from "react";
1
2
  export type DataAttributeKey = `data-${string}`;
2
3
  export interface KeyValuePair {
3
4
  [dataAttribute: DataAttributeKey]: unknown;
4
5
  }
6
+ export type MergeElementProps<T extends React.ElementType, P> = Omit<React.ComponentPropsWithRef<T>, keyof P> & P;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "homepage": "http://onewelcome.github.io/react-lib-components",
3
3
  "name": "@onewelcome/react-lib-components",
4
- "version": "2.0.0",
4
+ "version": "2.2.0",
5
5
  "license": "Apache-2.0",
6
6
  "author": "OneWelcome B.V.",
7
7
  "main": "dist/cjs/src/index.cjs.js",
@@ -47,7 +47,7 @@ export const IconButtonComponent: ForwardRefRenderFunction<HTMLButtonElement, Pr
47
47
  }
48
48
 
49
49
  return (
50
- <BaseButton {...rest} ref={ref} className={iconButtonClasses.join(" ")}>
50
+ <BaseButton {...rest} ref={ref} title={title} className={iconButtonClasses.join(" ")}>
51
51
  <Fragment>
52
52
  {children}
53
53
  <span className={readyclasses["sr-only"]}>{title}</span>
@@ -58,9 +58,8 @@ const DataGridColumnsToggleComponent: ForwardRefRenderFunction<HTMLDivElement, P
58
58
  name={item.name}
59
59
  checked={!item.hidden}
60
60
  onChange={() => onToggleClicked(item.name)}
61
- >
62
- {item.headline}
63
- </Toggle>
61
+ label={item.headline}
62
+ />
64
63
  ));
65
64
 
66
65
  const handleBackdropClick = () => onClose();
@@ -48,6 +48,7 @@ exports[`DataGridBody should render renders without crashing 1`] = `
48
48
  class="button icon-button text default button-m"
49
49
  id="consent_menu_Paweł"
50
50
  tabindex="0"
51
+ title="Actions for Paweł"
51
52
  type="button"
52
53
  >
53
54
  <span
@@ -111,6 +112,7 @@ exports[`DataGridBody should render renders without crashing 1`] = `
111
112
  class="button icon-button text default button-m"
112
113
  id="consent_menu_Michał"
113
114
  tabindex="0"
115
+ title="Actions for Michał"
114
116
  type="button"
115
117
  >
116
118
  <span
@@ -174,6 +176,7 @@ exports[`DataGridBody should render renders without crashing 1`] = `
174
176
  class="button icon-button text default button-m"
175
177
  id="consent_menu_Daniel"
176
178
  tabindex="0"
179
+ title="Actions for Daniel"
177
180
  type="button"
178
181
  >
179
182
  <span
@@ -237,6 +240,7 @@ exports[`DataGridBody should render renders without crashing 1`] = `
237
240
  class="button icon-button text default button-m"
238
241
  id="consent_menu_Jasha"
239
242
  tabindex="0"
243
+ title="Actions for Jasha"
240
244
  type="button"
241
245
  >
242
246
  <span
@@ -159,7 +159,7 @@ describe("Checkbox should have proper attributes", () => {
159
159
  it("should have a correctly linked label element", () => {
160
160
  const { checkbox, container } = createCheckbox(defaultParams => ({
161
161
  ...defaultParams,
162
- children: "Label"
162
+ label: "Label"
163
163
  }));
164
164
 
165
165
  const id = checkbox.getAttribute("id");
@@ -168,6 +168,19 @@ describe("Checkbox should have proper attributes", () => {
168
168
  expect(label).toBeTruthy();
169
169
  expect(label).toHaveTextContent("Label");
170
170
  });
171
+
172
+ it("should have a react element as label", () => {
173
+ const { checkbox, container } = createCheckbox(defaultParams => ({
174
+ ...defaultParams,
175
+ label: <span>Label element</span>
176
+ }));
177
+
178
+ const id = checkbox.getAttribute("id");
179
+ const label = container.querySelector(`label[for=${id}]`);
180
+
181
+ expect(label).toBeTruthy();
182
+ expect(label).toHaveTextContent("Label element");
183
+ });
171
184
  });
172
185
 
173
186
  describe("Checkbox should be interactive", () => {
@@ -207,7 +220,6 @@ describe("missing attributes gets us errors", () => {
207
220
  // @ts-ignore: mandatory props (test for non-typescript react projects)
208
221
  createCheckbox(defaultParams => ({
209
222
  ...defaultParams,
210
- name: "testing",
211
223
  children: <Checkbox name="test">Test</Checkbox>
212
224
  }));
213
225
  } catch (e: any) {
@@ -215,7 +227,7 @@ describe("missing attributes gets us errors", () => {
215
227
  }
216
228
 
217
229
  const expected =
218
- "If you pass Checkboxes as a child component (to create nested checkbox tree) you need to pass a label to the parent checkbox.";
230
+ "If you have nested checkboxes you have to manage the indeterminate state by passing a boolean to the `indeterminate` prop.";
219
231
 
220
232
  expect(actual).toEqual(expected);
221
233
 
@@ -264,8 +276,7 @@ describe("missing attributes gets us errors", () => {
264
276
  actual = e.message;
265
277
  }
266
278
 
267
- const expected =
268
- "Please make sure to pass either a string or more Checkbox components as a child of your Checkbox component.";
279
+ const expected = "Please pass a 'name' prop to your <Checkbox> component.";
269
280
 
270
281
  expect(actual).toEqual(expected);
271
282
 
@@ -31,11 +31,10 @@ import {
31
31
  } from "../FormSelectorWrapper/FormSelectorWrapper";
32
32
  import { FormSelector } from "../form.interfaces";
33
33
 
34
- const isToggle = (children: ReactNode) => (children as ReactElement)?.props?.["data-toggle"];
34
+ const isToggle = (children: ReactNode) => !!(children as ReactElement)?.props?.["data-toggle"];
35
35
 
36
36
  export interface Props extends ComponentPropsWithRef<"input">, FormSelector {
37
- children: ReactNode;
38
- label?: string;
37
+ label?: string | React.ReactElement;
39
38
  indeterminate?: boolean;
40
39
  helperProps?: FormHelperTextProps;
41
40
  formSelectorWrapperProps?: FormSelectorWrapperProps;
@@ -85,24 +84,13 @@ const CheckboxComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
85
84
  }, []);
86
85
 
87
86
  const determineLabel = () => {
87
+ // this should be temporary, for backwards compatibility;
88
+ // once the components implementing checkboxes in microfrontends are updated, only label should be returned
88
89
  if (label) {
89
90
  return label;
90
- } else if (children === undefined) {
91
- throw new Error(
92
- "Please make sure to pass either a string or more Checkbox components as a child of your Checkbox component."
93
- );
94
- }
95
-
96
- if (
97
- typeof children === "string" ||
98
- (typeof children === "object" && (children as ReactElement).type === "span")
99
- ) {
91
+ } else if (typeof children === "string") {
100
92
  return children;
101
93
  }
102
-
103
- throw new Error(
104
- "If you pass Checkboxes as a child component (to create nested checkbox tree) you need to pass a label to the parent checkbox."
105
- );
106
94
  };
107
95
 
108
96
  const renderNestedCheckboxes = () => (
@@ -227,6 +227,22 @@ describe("It should render prefix and suffix ", () => {
227
227
  expect(getByText(suffix)).toBeDefined();
228
228
  });
229
229
 
230
+ it("renders prefix and suffix when they are elements", () => {
231
+ const prefix = <span data-testid="prefix">http://</span>;
232
+ const suffix = <span data-testid="suffix">.com</span>;
233
+ const { getByTestId } = createInput(defaultParams => ({
234
+ ...defaultParams,
235
+ prefix,
236
+ suffix
237
+ }));
238
+
239
+ const prefixElement = getByTestId("prefix");
240
+ const suffixElement = getByTestId("suffix");
241
+
242
+ expect(prefixElement).toBeInTheDocument();
243
+ expect(suffixElement).toBeInTheDocument();
244
+ });
245
+
230
246
  it("error icon should be visible with suffix", () => {
231
247
  const suffix = ".com";
232
248
  const { input, getByText } = createInput(defaultParams => ({
@@ -20,12 +20,14 @@ import React, {
20
20
  Ref,
21
21
  useEffect,
22
22
  useRef,
23
- useState
23
+ useState,
24
+ ReactNode
24
25
  } from "react";
25
26
  import classes from "./Input.module.scss";
26
27
  import readyclasses from "../../../readyclasses.module.scss";
27
28
  import { FormElement } from "../form.interfaces";
28
29
  import { useDetermineStatusIcon } from "../../../hooks/useDetermineStatusIcon";
30
+ import { MergeElementProps } from "../../../interfaces";
29
31
 
30
32
  export const dateTypes = ["date", "time", "datetime-local"] as const;
31
33
 
@@ -41,13 +43,16 @@ export type Type =
41
43
  | "hidden"
42
44
  | (typeof dateTypes)[number];
43
45
 
44
- export interface Props extends ComponentPropsWithRef<"input">, FormElement {
45
- wrapperProps?: ComponentPropsWithRef<"div">;
46
- labeledBy?: string;
47
- type: Type;
48
- suffix?: string;
49
- prefix?: string;
50
- }
46
+ export type Props = MergeElementProps<
47
+ "input",
48
+ FormElement & {
49
+ wrapperProps?: ComponentPropsWithRef<"div">;
50
+ labeledBy?: string;
51
+ type: Type;
52
+ suffix?: ReactNode;
53
+ prefix?: ReactNode;
54
+ }
55
+ >;
51
56
 
52
57
  const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
53
58
  {
@@ -80,6 +85,10 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
80
85
 
81
86
  const inputClassNames = [classes["input"]];
82
87
 
88
+ const renderElement = (el: ReactNode) => {
89
+ return typeof el === "string" ? <span>{el}</span> : el;
90
+ };
91
+
83
92
  (dateTypes as ReadonlyArray<string>).includes(type) &&
84
93
  inputClassNames.push(classes["shrink-width-for-date-icon"]);
85
94
  className && inputClassNames.push(className);
@@ -107,7 +116,7 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
107
116
  >
108
117
  {prefix && (
109
118
  <div data-prefix className={classes["prefix"]}>
110
- <span>{prefix}</span>
119
+ {renderElement(prefix)}
111
120
  </div>
112
121
  )}
113
122
  <input
@@ -131,9 +140,10 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
131
140
  {icon}
132
141
  {suffix && (
133
142
  <div ref={suffixRef} data-suffix className={classes["suffix"]}>
134
- <span>{suffix}</span>
143
+ {renderElement(suffix)}
135
144
  </div>
136
145
  )}
146
+
137
147
  <span className={outlineClasses.join(" ")}></span>
138
148
  </div>
139
149
  );
@@ -17,10 +17,12 @@
17
17
  import React, { useRef, useEffect } from "react";
18
18
  import { Toggle, Props } from "./Toggle";
19
19
  import { render } from "@testing-library/react";
20
+ import { Checkbox } from "../Checkbox/Checkbox";
20
21
 
21
22
  const defaultParams: Props = {
22
- children: "label",
23
- name: "example toggle"
23
+ children: "Helper text",
24
+ name: "example toggle",
25
+ label: "Label"
24
26
  };
25
27
 
26
28
  const createToggle = (params?: (defaultParams: Props) => Props) => {
@@ -28,11 +30,7 @@ const createToggle = (params?: (defaultParams: Props) => Props) => {
28
30
  if (params) {
29
31
  parameters = params(defaultParams);
30
32
  }
31
- const queries = render(
32
- <Toggle {...parameters} data-testid="toggle">
33
- toggle content
34
- </Toggle>
35
- );
33
+ const queries = render(<Toggle {...parameters} data-testid="toggle"></Toggle>);
36
34
  const toggle = queries.getByTestId("toggle");
37
35
 
38
36
  return {
@@ -72,7 +70,11 @@ describe("ref should work", () => {
72
70
  }
73
71
  }, [ref]);
74
72
 
75
- return <Toggle {...defaultParams} data-ref="testing" ref={ref} />;
73
+ return (
74
+ <Toggle {...defaultParams} data-ref="testing" ref={ref}>
75
+ test label
76
+ </Toggle>
77
+ );
76
78
  };
77
79
 
78
80
  const refCheck = (ref: React.RefObject<HTMLElement>) => {
@@ -20,33 +20,37 @@ import classes from "./Toggle.module.scss";
20
20
 
21
21
  export interface Props
22
22
  extends ComponentPropsWithRef<"input">,
23
- Omit<CheckboxProps, "indeterminate" | "errorMessage" | "error" | "children" | "label"> {
24
- children: string;
23
+ Omit<CheckboxProps, "indeterminate" | "errorMessage" | "error" | "label"> {
24
+ label?: string | React.ReactElement;
25
25
  }
26
26
 
27
27
  const ToggleComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
28
- { children, checked, disabled, helperProps, ...rest }: Props,
28
+ { checked, disabled, helperProps, className, label, ...rest }: Props,
29
29
  ref
30
- ) => (
31
- <div className={classes["toggle-wrapper"]}>
32
- <Checkbox
33
- {...rest}
34
- ref={ref}
35
- checked={checked}
36
- className={classes["checkbox"]}
37
- helperProps={{ className: classes["toggle-helper"], ...helperProps }}
38
- disabled={disabled}
39
- label={children}
40
- >
41
- <span
42
- data-toggle
43
- aria-hidden="true"
44
- className={`${classes["toggle"]} ${checked ? classes["checked"] : ""} ${
45
- disabled ? classes["disabled"] : ""
46
- } `}
47
- ></span>
48
- </Checkbox>
49
- </div>
50
- );
30
+ ) => {
31
+ const classNames = [classes["toggle-wrapper"]];
32
+ className && classNames.push(className);
33
+ return (
34
+ <div className={classNames.join(" ")}>
35
+ <Checkbox
36
+ {...rest}
37
+ ref={ref}
38
+ checked={checked}
39
+ className={classes["checkbox"]}
40
+ helperProps={{ className: classes["toggle-helper"], ...helperProps }}
41
+ disabled={disabled}
42
+ label={label}
43
+ >
44
+ <span
45
+ data-toggle="true"
46
+ aria-hidden="true"
47
+ className={`${classes["toggle"]} ${checked ? classes["checked"] : ""} ${
48
+ disabled ? classes["disabled"] : ""
49
+ } `}
50
+ ></span>
51
+ </Checkbox>
52
+ </div>
53
+ );
54
+ };
51
55
 
52
56
  export const Toggle = React.forwardRef(ToggleComponent);
@@ -16,10 +16,10 @@
16
16
 
17
17
  @font-face {
18
18
  font-family: "icomoon";
19
- src: url("../../font/icomoon.eot?9c63pa");
20
- src: url("../../font/icomoon.eot?9c63pa#iefix") format("embedded-opentype"),
21
- url("../../font/icomoon.ttf?9c63pa") format("truetype"),
22
- url("../../font/icomoon.woff?9c63pa") format("woff");
19
+ src: url("../../font/icomoon.eot?ywvhmn");
20
+ src: url("../../font/icomoon.eot?ywvhmn#iefix") format("embedded-opentype"),
21
+ url("../../font/icomoon.ttf?ywvhmn") format("truetype"),
22
+ url("../../font/icomoon.woff?ywvhmn") format("woff");
23
23
  font-weight: normal;
24
24
  font-style: normal;
25
25
  font-display: block;
@@ -312,3 +312,8 @@
312
312
  content: "\e93f";
313
313
  @include fontProperties();
314
314
  }
315
+
316
+ .icon-eye-blocked:before {
317
+ content: "\e9d1";
318
+ @include fontProperties();
319
+ }
@@ -43,6 +43,7 @@ export enum Icons {
43
43
  Equal = "equal",
44
44
  Error = "error-circle",
45
45
  Eye = "eye",
46
+ EyeBlocked = "eye-blocked",
46
47
  Filter = "filter",
47
48
  FilterAlt = "filter-alt",
48
49
  FilterAltArrow = "filter-alt-arrow",
Binary file
@@ -74,4 +74,5 @@
74
74
  <glyph unicode="&#xe941;" glyph-name="file-outline" d="M597.333 874.667h-341.333c-46.933 0-85.333-38.4-85.333-85.333v-682.667c0-46.933 38.4-85.333 85.333-85.333h512c46.933 0 85.333 38.4 85.333 85.333v512l-256 256zM768 106.667h-512v682.667h298.667v-213.333h213.333v-469.333z" />
75
75
  <glyph unicode="&#xe942;" glyph-name="file-upload-outline" d="M597.333 874.667l256-256v-512c0-47.128-38.205-85.333-85.333-85.333v0h-512c-47.128 0-85.333 38.205-85.333 85.333v0 682.667c0 47.128 38.205 85.333 85.333 85.333v0h341.333zM768 106.667v469.333h-213.333v213.333h-298.667v-682.667h512zM512 448l170.667-170.667h-106.667v-128h-128v128h-106.667l170.667 170.667z" />
76
76
  <glyph unicode="&#xe943;" glyph-name="file-download-outline" d="M597.333 874.667l256-256v-512c0-47.128-38.205-85.333-85.333-85.333v0h-512c-47.128 0-85.333 38.205-85.333 85.333v0 682.667c0 47.128 38.205 85.333 85.333 85.333v0h341.333zM768 106.667v469.333h-213.333v213.333h-298.667v-682.667h512zM512 149.333l-170.667 170.667h106.667v128h128v-128h106.667l-170.667-170.667z" />
77
+ <glyph unicode="&#xe9d1;" glyph-name="eye-blocked" d="M945.942 945.942c-18.746 18.744-49.136 18.744-67.882 0l-202.164-202.164c-51.938 15.754-106.948 24.222-163.896 24.222-223.318 0-416.882-130.042-512-320 41.122-82.124 100.648-153.040 173.022-207.096l-158.962-158.962c-18.746-18.746-18.746-49.136 0-67.882 9.372-9.374 21.656-14.060 33.94-14.060s24.568 4.686 33.942 14.058l864 864c18.744 18.746 18.744 49.138 0 67.884zM416 640c42.24 0 78.082-27.294 90.92-65.196l-121.724-121.724c-37.902 12.838-65.196 48.68-65.196 90.92 0 53.020 42.98 96 96 96zM110.116 448c38.292 60.524 89.274 111.924 149.434 150.296 3.918 2.5 7.876 4.922 11.862 7.3-9.962-27.328-15.412-56.822-15.412-87.596 0-54.89 17.286-105.738 46.7-147.418l-60.924-60.924c-52.446 36.842-97.202 83.882-131.66 138.342zM768 518c0 27.166-4.256 53.334-12.102 77.898l-321.808-321.808c24.568-7.842 50.742-12.090 77.91-12.090 141.382 0 256 114.618 256 256zM830.026 670.026l-69.362-69.362c1.264-0.786 2.53-1.568 3.786-2.368 60.162-38.374 111.142-89.774 149.434-150.296-38.292-60.522-89.274-111.922-149.436-150.296-75.594-48.218-162.89-73.704-252.448-73.704-38.664 0-76.902 4.76-113.962 14.040l-76.894-76.894c59.718-21.462 123.95-33.146 190.856-33.146 223.31 0 416.876 130.042 512 320-45.022 89.916-112.118 166.396-193.974 222.026z" />
77
78
  </font></defs></svg>
Binary file
Binary file