@redneckz/wildless-cms-uni-blocks 0.2.86 → 0.2.87

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 (111) hide show
  1. package/bundle/blocks.schema.json +1 -1
  2. package/bundle/bundle.umd.js +511 -446
  3. package/bundle/bundle.umd.min.js +1 -1
  4. package/dist/components/Accordion/AccordionBlocks.d.ts +3 -0
  5. package/dist/components/Accordion/AccordionBlocks.js +6 -0
  6. package/dist/components/Accordion/AccordionBlocks.js.map +1 -1
  7. package/dist/components/Accordion/AccordionContent.d.ts +14 -6
  8. package/dist/components/BaseTile/BaseTile.js +13 -3
  9. package/dist/components/BaseTile/BaseTile.js.map +1 -1
  10. package/dist/components/BaseTile/BaseTileProps.d.ts +10 -0
  11. package/dist/components/BenefitsBlock/BenefitsBlockContent.d.ts +1 -1
  12. package/dist/components/BlockContent.d.ts +3 -1
  13. package/dist/components/Blocks.d.ts +17 -14
  14. package/dist/components/Blocks.js +23 -17
  15. package/dist/components/Blocks.js.map +1 -1
  16. package/dist/components/Headline/Headline.d.ts +5 -0
  17. package/dist/components/Headline/Headline.js +9 -0
  18. package/dist/components/Headline/Headline.js.map +1 -0
  19. package/dist/components/Headline/HeadlineContent.d.ts +15 -0
  20. package/dist/components/Headline/HeadlineContent.js +2 -0
  21. package/dist/components/Headline/HeadlineContent.js.map +1 -0
  22. package/dist/components/LinkDocs/LinkDocs.d.ts +5 -0
  23. package/dist/components/LinkDocs/LinkDocs.js +42 -0
  24. package/dist/components/LinkDocs/LinkDocs.js.map +1 -0
  25. package/dist/components/LinkDocs/LinkDocsContent.d.ts +23 -0
  26. package/dist/components/LinkDocs/LinkDocsContent.js +2 -0
  27. package/dist/components/LinkDocs/LinkDocsContent.js.map +1 -0
  28. package/dist/components/MobileBlocks.d.ts +8 -6
  29. package/dist/components/MobileBlocks.js +10 -6
  30. package/dist/components/MobileBlocks.js.map +1 -1
  31. package/dist/components/PictureText/PictureText.d.ts +5 -0
  32. package/dist/components/PictureText/PictureText.js +14 -0
  33. package/dist/components/PictureText/PictureText.js.map +1 -0
  34. package/dist/components/PictureText/PictureTextContent.d.ts +11 -0
  35. package/dist/components/PictureText/PictureTextContent.js +2 -0
  36. package/dist/components/PictureText/PictureTextContent.js.map +1 -0
  37. package/dist/components/ProductGallery/ProductGalleryContent.d.ts +2 -2
  38. package/dist/ui-kit/Icon/IconProps.d.ts +22 -18
  39. package/dist/ui-kit/Icon/IconProps.js +20 -18
  40. package/dist/ui-kit/Icon/IconProps.js.map +1 -1
  41. package/lib/common.css +1 -1
  42. package/lib/components/Accordion/Accordion.fixture.d.ts +1 -0
  43. package/lib/components/Accordion/AccordionBlocks.d.ts +3 -0
  44. package/lib/components/Accordion/AccordionBlocks.js +6 -0
  45. package/lib/components/Accordion/AccordionBlocks.js.map +1 -1
  46. package/lib/components/Accordion/AccordionContent.d.ts +14 -6
  47. package/lib/components/BaseTile/BaseTile.js +13 -3
  48. package/lib/components/BaseTile/BaseTile.js.map +1 -1
  49. package/lib/components/BaseTile/BaseTileProps.d.ts +10 -0
  50. package/lib/components/BenefitsBlock/BenefitsBlockContent.d.ts +1 -1
  51. package/lib/components/BlockContent.d.ts +3 -1
  52. package/lib/components/Blocks.d.ts +17 -14
  53. package/lib/components/Blocks.js +23 -17
  54. package/lib/components/Blocks.js.map +1 -1
  55. package/lib/components/Headline/Headline.d.ts +5 -0
  56. package/lib/components/Headline/Headline.fixture.d.ts +7 -0
  57. package/lib/components/Headline/Headline.js +7 -0
  58. package/lib/components/Headline/Headline.js.map +1 -0
  59. package/lib/components/Headline/HeadlineContent.d.ts +15 -0
  60. package/lib/components/Headline/HeadlineContent.js +2 -0
  61. package/lib/components/Headline/HeadlineContent.js.map +1 -0
  62. package/lib/components/LinkDocs/LinkDocs.d.ts +5 -0
  63. package/lib/components/LinkDocs/LinkDocs.fixture.d.ts +12 -0
  64. package/lib/components/LinkDocs/LinkDocs.js +40 -0
  65. package/lib/components/LinkDocs/LinkDocs.js.map +1 -0
  66. package/lib/components/LinkDocs/LinkDocsContent.d.ts +23 -0
  67. package/lib/components/LinkDocs/LinkDocsContent.js +2 -0
  68. package/lib/components/LinkDocs/LinkDocsContent.js.map +1 -0
  69. package/lib/components/MobileBlocks.d.ts +8 -6
  70. package/lib/components/MobileBlocks.js +10 -6
  71. package/lib/components/MobileBlocks.js.map +1 -1
  72. package/lib/components/PictureText/PictureText.d.ts +5 -0
  73. package/lib/components/PictureText/PictureText.fixture.d.ts +4 -0
  74. package/lib/components/PictureText/PictureText.js +12 -0
  75. package/lib/components/PictureText/PictureText.js.map +1 -0
  76. package/lib/components/PictureText/PictureTextContent.d.ts +11 -0
  77. package/lib/components/PictureText/PictureTextContent.js +2 -0
  78. package/lib/components/PictureText/PictureTextContent.js.map +1 -0
  79. package/lib/components/ProductGallery/ProductGalleryContent.d.ts +2 -2
  80. package/lib/ui-kit/Icon/IconProps.d.ts +22 -18
  81. package/lib/ui-kit/Icon/IconProps.js +20 -18
  82. package/lib/ui-kit/Icon/IconProps.js.map +1 -1
  83. package/package.json +2 -2
  84. package/src/components/Accordion/Accordion.fixture.tsx +104 -3
  85. package/src/components/Accordion/AccordionBlocks.tsx +6 -0
  86. package/src/components/Accordion/AccordionContent.ts +18 -6
  87. package/src/components/BaseTile/BaseTile.tsx +19 -5
  88. package/src/components/BaseTile/BaseTileProps.ts +11 -0
  89. package/src/components/BenefitsBlock/BenefitsBlockContent.ts +1 -1
  90. package/src/components/BlockContent.ts +15 -11
  91. package/src/components/Blocks.ts +23 -17
  92. package/src/components/ContentPage/ContentPage.page.json +88 -2
  93. package/src/components/Headline/Headline.example.json +6 -0
  94. package/src/components/Headline/Headline.fixture.tsx +42 -0
  95. package/src/components/Headline/Headline.tsx +15 -0
  96. package/src/components/Headline/HeadlineContent.ts +18 -0
  97. package/src/components/LinkDocs/LinkDocs.fixture.tsx +51 -0
  98. package/src/components/LinkDocs/LinkDocs.tsx +81 -0
  99. package/src/components/LinkDocs/LinkDocsContent.ts +26 -0
  100. package/src/components/MobileBlocks.ts +10 -6
  101. package/src/components/PictureText/PictureText.example.json +20 -0
  102. package/src/components/PictureText/PictureText.fixture.tsx +36 -0
  103. package/src/components/PictureText/PictureText.tsx +45 -0
  104. package/src/components/PictureText/PictureTextContent.ts +13 -0
  105. package/src/components/ProductGallery/ProductGalleryContent.ts +2 -2
  106. package/src/icons/DiscountShape.svg +7 -0
  107. package/src/icons/DocIcon.svg +1 -1
  108. package/src/icons/DocumentText.svg +6 -0
  109. package/src/ui-kit/Icon/IconProps.ts +4 -0
  110. package/src/icons/MinusIcon.svg +0 -1
  111. package/src/icons/PlusIcon.svg +0 -1
@@ -0,0 +1,81 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import type { UniBlockProps } from '../../types';
3
+ import { Icon } from '../../ui-kit/Icon/Icon';
4
+ import { Title } from '../../ui-kit/Title/Title';
5
+ import { AlignType } from '../BaseTile/BaseTileProps';
6
+ import type { LinkColumnsMode, LinkDocsContent } from './LinkDocsContent';
7
+
8
+ const titleAlignStyleMap: Record<AlignType, string> = {
9
+ left: 'text-left',
10
+ center: 'text-center',
11
+ right: 'text-right',
12
+ };
13
+
14
+ const titleMarginsStyleMap: Record<LinkColumnsMode, string> = {
15
+ double: 'mb-8',
16
+ single: '',
17
+ };
18
+
19
+ const linkColumnsModeStyleMap: Record<LinkColumnsMode, string> = {
20
+ double: 'gap-x-5 gap-y-[26px] flex-wrap',
21
+ single: 'gap-3.5 flex-col',
22
+ };
23
+
24
+ export interface LinkDocsProps extends LinkDocsContent, UniBlockProps {}
25
+
26
+ export const LinkDocs = JSX<LinkDocsProps>(
27
+ ({ className, title, align, documents, icon, columnsMode = 'double' }) => {
28
+ const containerClasses = linkColumnsModeStyleMap[columnsMode];
29
+
30
+ return (
31
+ <section className={`font-sans p-[50px] bg-white ${className}`}>
32
+ {title && (
33
+ <Title
34
+ className={`font-medium m-0 ${titleMarginsStyleMap[columnsMode]} ${
35
+ titleAlignStyleMap[align ?? 'center']
36
+ }`}
37
+ >
38
+ {title}
39
+ </Title>
40
+ )}
41
+ <div className={`flex ${containerClasses}`} role="list">
42
+ {documents?.length
43
+ ? documents.map(({ text, fileSize, ...linkProps }) => (
44
+ <a
45
+ className={`group flex items-center text-sm
46
+ text-sm font-sans align-middle items-center text-primary-text no-underline group hover:text-primary-main
47
+ ${columnsMode === 'double' ? 'basis-[calc(50%-20px)]' : ''}`}
48
+ role="listitem"
49
+ {...linkProps}
50
+ >
51
+ {icon && <Icon className="mr-3.5" name={icon} width="24px" height="24px" />}
52
+ <span>
53
+ {text}
54
+ <span className="text-secondary-text group-hover:text-primary-main">
55
+ {linkProps?.href && formatSuffix(getExtFromHref(linkProps.href), fileSize)}
56
+ </span>
57
+ </span>
58
+ </a>
59
+ ))
60
+ : null}
61
+ </div>
62
+ </section>
63
+ );
64
+ },
65
+ );
66
+
67
+ const getExtFromHref = (href: string) => {
68
+ if (!href) return '';
69
+
70
+ const lastChunk = href.split('.').pop();
71
+ if (!lastChunk || lastChunk.includes('/')) return '';
72
+
73
+ return lastChunk;
74
+ };
75
+
76
+ const formatSuffix = (ext?: string, fileSize?: string) => {
77
+ const prefix = ext || fileSize ? ',' : '';
78
+ const extension = ext ? ` ${ext}` : '';
79
+ const size = fileSize ? ` (${fileSize})` : '';
80
+ return prefix + extension + size;
81
+ };
@@ -0,0 +1,26 @@
1
+ import { LinkProps } from '../../model/LinkProps';
2
+ import type { IconName } from '../../ui-kit/Icon/IconProps';
3
+ import { BaseTileCommonProps } from '../BaseTile/BaseTileProps';
4
+
5
+ /** @title Режим отображения списка */
6
+ export type LinkColumnsMode = 'single' | 'double';
7
+
8
+ /**
9
+ * @title Элемент списка
10
+ */
11
+ export interface LinkDocsItem extends LinkProps {
12
+ /** @title размер файла */
13
+ fileSize?: string;
14
+ }
15
+
16
+ /**
17
+ * @title Список документов
18
+ */
19
+ export interface LinkDocsContent extends Pick<BaseTileCommonProps, 'align' | 'title'> {
20
+ /** @title Название иконки */
21
+ icon?: IconName;
22
+ /** @title Список */
23
+ documents?: LinkDocsItem[];
24
+ /** @title Отображение списка */
25
+ columnsMode?: LinkColumnsMode;
26
+ }
@@ -2,7 +2,9 @@ import { ExchangeRateTile } from './ExchangeRateTile/ExchangeRateTile';
2
2
  import { Footer } from './Footer/Footer.mobile';
3
3
  import { Gallery } from './Gallery/Gallery.mobile';
4
4
  import { Header } from './Header/Header';
5
+ import { Headline } from './Headline/Headline';
5
6
  import { MobileAppTile } from './MobileAppTile/MobileAppTile';
7
+ import { PictureText } from './PictureText/PictureText';
6
8
  import { Placeholder } from './Placeholder/Placeholder';
7
9
  import { ProductBlock } from './ProductBlock/ProductBlock.mobile';
8
10
  import { ProductTile } from './ProductTile/ProductTile';
@@ -10,16 +12,18 @@ import { TextBlock } from './TextBlock/TextBlock';
10
12
  import { Tile } from './Tile/Tile';
11
13
 
12
14
  export const MobileBlocks = {
13
- Header,
15
+ ExchangeRateTile,
14
16
  Footer,
17
+ Gallery,
18
+ Header,
19
+ Headline,
20
+ MobileAppTile,
21
+ PictureText,
15
22
  Placeholder,
16
- Tile,
17
- ProductTile,
18
23
  ProductBlock,
24
+ ProductTile,
19
25
  TextBlock,
20
- ExchangeRateTile,
21
- MobileAppTile,
22
- Gallery,
26
+ Tile,
23
27
  // TODO StepsBlock,
24
28
  // TODO BenefitsBlock,
25
29
  // TODO ProductGallery
@@ -0,0 +1,20 @@
1
+ {
2
+ "title": "Продукт",
3
+ "description": "Описание",
4
+ "image": {
5
+ "format": "webp",
6
+ "size": {
7
+ "width": 300
8
+ }
9
+ },
10
+ "benefits": [
11
+ {
12
+ "label": "Преимущество №1",
13
+ "icon": "DocumentText"
14
+ },
15
+ {
16
+ "label": "Преимущество №2",
17
+ "icon": "DiscountShape"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,36 @@
1
+ import { context } from '../../setup-fixture';
2
+
3
+ import { PictureText } from './PictureText';
4
+ import type { Picture } from '../../model/Picture';
5
+
6
+ const image: Picture = {
7
+ src: 'legal-support-business.png',
8
+ format: 'webp',
9
+ size: {
10
+ width: 200,
11
+ height: 200,
12
+ },
13
+ alt: 'Варианты потребительского кредита',
14
+ };
15
+
16
+ export default {
17
+ default: (
18
+ <PictureText
19
+ context={context}
20
+ title={'Варианты потребительского кредита'}
21
+ benefits={[
22
+ {
23
+ label: 'Кредит по одному документу',
24
+ description: 'До 300 тыс ₽ по упрощённой процедуре получения кредита',
25
+ icon: 'DocumentText',
26
+ },
27
+ {
28
+ label: 'Кредит на общих условиях',
29
+ description: 'До 5 млн ₽ на общих условиях получения кредита',
30
+ icon: 'DiscountShape',
31
+ },
32
+ ]}
33
+ image={image}
34
+ />
35
+ ),
36
+ };
@@ -0,0 +1,45 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import type { UniBlockProps } from '../../types';
3
+ import type { PictureTextContent } from './PictureTextContent';
4
+
5
+ import { Icon } from '../../ui-kit/Icon/Icon';
6
+ import { Img } from '../../ui-kit/Img';
7
+ import { Title } from '../../ui-kit/Title/Title';
8
+ import { Benefit } from '../BenefitsBlock/BenefitsBlockContent';
9
+
10
+ export interface PictureTextProps extends PictureTextContent, UniBlockProps {}
11
+
12
+ export const PictureText = JSX<PictureTextProps>(({ className, title, image, benefits }) => {
13
+ return (
14
+ <section className={`relative font-sans text-primary-text bg-white p-14 ${className}`}>
15
+ <Title className="font-medium m-0 text-center">{title}</Title>
16
+ <div className={'flex justify-center mt-9'}>
17
+ {image?.src && <Img className="mr-6" image={image} />}
18
+ {benefits?.length ? (
19
+ <div className="flex flex-col">{benefits.map(renderBenefit)}</div>
20
+ ) : null}
21
+ </div>
22
+ </section>
23
+ );
24
+ });
25
+
26
+ function renderBenefit(benefit: Benefit, i: number) {
27
+ return (
28
+ <div key={String(i)} className="flex flex-row mb-8">
29
+ {benefit.icon && (
30
+ <Icon
31
+ className="w-[48px] h-[48px] bg-main rounded-full box-border p-[12px]"
32
+ name={benefit.icon}
33
+ width="48"
34
+ height="48"
35
+ />
36
+ )}
37
+ <div className="flex gap-1 flex-col h-full ml-5 max-w-[490px]">
38
+ <div className="font-medium text-primary-text text-xl m-0">{benefit.label}</div>
39
+ {benefit.description && (
40
+ <div className="font-normal text-sm text-secondary-text">{benefit.description}</div>
41
+ )}
42
+ </div>
43
+ </div>
44
+ );
45
+ }
@@ -0,0 +1,13 @@
1
+ import type { BaseTileCommonProps } from '../BaseTile/BaseTileProps';
2
+ import type { Benefit } from '../BenefitsBlock/BenefitsBlockContent';
3
+
4
+ /**
5
+ * @title Картинка с текстом
6
+ */
7
+ export interface PictureTextContent
8
+ extends Pick<BaseTileCommonProps, 'title' | 'description' | 'image'> {
9
+ /**
10
+ * @title Список преимуществ
11
+ */
12
+ benefits?: Benefit[];
13
+ }
@@ -11,7 +11,7 @@ interface ProductGalleryNav {
11
11
  /**
12
12
  * @title Слайд
13
13
  */
14
- export interface ProductSlideContent {
14
+ export interface ProductSlide {
15
15
  nav: ProductGalleryNav;
16
16
  /** @title Содержимое слайда */
17
17
  productBlock: ProductBlockInnerCommonProps;
@@ -27,5 +27,5 @@ export interface ProductGalleryContent {
27
27
  */
28
28
  duration?: number;
29
29
  /** @title Слайды */
30
- slides?: ProductSlideContent[];
30
+ slides?: ProductSlide[];
31
31
  }
@@ -0,0 +1,7 @@
1
+ <svg id="icon" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M14.6599 20.01L13.1399 21.53C12.5199 22.15 11.4999 22.15 10.8799 21.53L9.3599 20.01C9.0999 19.75 8.58992 19.54 8.22992 19.54H6.0799C5.1999 19.54 4.47992 18.8199 4.47992 17.9399V15.79C4.47992 15.43 4.26992 14.92 4.00992 14.66L2.4899 13.14C1.8699 12.52 1.8699 11.5 2.4899 10.88L4.00992 9.35999C4.26992 9.09999 4.47992 8.58998 4.47992 8.22998V6.07996C4.47992 5.19996 5.1999 4.47998 6.0799 4.47998" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M9.33984 3.9899L10.8598 2.46988C11.4798 1.84988 12.4998 1.84988 13.1198 2.46988L14.6399 3.9899C14.8999 4.2499 15.4098 4.45987 15.7698 4.45987H17.9199C18.7999 4.45987 19.5198 5.17997 19.5198 6.05997V8.20987C19.5198 8.56987 19.7298 9.07988 19.9898 9.33988L21.5099 10.8599C22.1299 11.4799 22.1299 12.4999 21.5099 13.1199L19.9898 14.6399C19.7298 14.8999 19.5198 15.4099 19.5198 15.7699V17.92C19.5198 18.8 18.7999 19.5199 17.9199 19.5199" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
4
+ <path d="M9 15L15 9" stroke="#42AB44" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path d="M14.4945 14.5H14.5035" stroke="#42AB44" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
6
+ <path d="M9.49451 9.5H9.50349" stroke="#42AB44" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
7
+ </svg>
@@ -1,4 +1,4 @@
1
- <svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
1
+ <svg id="icon" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
2
  <path fill-rule="evenodd" clip-rule="evenodd" d="M9.809 2.759A2.813 2.813 0 0 1 11.742 2h5.524C18.776 2 20 3.16 20 4.59v13.82c0 1.43-1.224 2.59-2.734 2.59H6.734C5.224 21 4 19.84 4 18.41v-5.95c0-.477.408-.864.911-.864.504 0 .912.387.912.864v5.95c0 .476.408.863.911.863h10.532c.503 0 .911-.387.911-.864V4.591c0-.477-.408-.864-.911-.864h-5.367v4.03c0 .955-.816 1.728-1.823 1.728H4.911c-.368 0-.7-.21-.842-.533a.83.83 0 0 1 .198-.941l5.542-5.252Zm.267 2.19L7.112 7.758h2.964v-2.81Z" fill="#1C1C1C" />
3
3
  <rect x="8" y="12" width="8" height="2" rx="1" fill="#42AB44" />
4
4
  <rect x="8" y="15" width="5" height="2" rx="1" fill="#42AB44" />
@@ -0,0 +1,6 @@
1
+ <svg id="icon" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M3 7C3 4 4.5 2 8 2H16C19.5 2 21 4 21 7V17C21 20 19.5 22 16 22H8C4.5 22 3 20 3 17V11.02" stroke="#1C1C1C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M14.5 4.5V6.5C14.5 7.6 15.4 8.5 16.5 8.5H18.5" stroke="#1C1C1C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
4
+ <path d="M8 13H12" stroke="#42AB44" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path d="M8 17H16" stroke="#42AB44" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
6
+ </svg>
@@ -7,7 +7,9 @@ export enum IconMap {
7
7
  'CalendarIcon',
8
8
  'ClockIcon',
9
9
  'ComfortableCompIcon',
10
+ 'DiscountShape',
10
11
  'DocIcon',
12
+ 'DocumentText',
11
13
  'DollarIcon',
12
14
  'EmptyWalletIcon',
13
15
  'EuroIcon',
@@ -35,7 +37,9 @@ export enum IconMap {
35
37
  * "Календарь",
36
38
  * "Часы",
37
39
  * "Кресло",
40
+ * "Скидка",
38
41
  * "Документ",
42
+ * "Документ с текстом"
39
43
  * "Доллар",
40
44
  * "Кошелек",
41
45
  * "Евро",
@@ -1 +0,0 @@
1
- <svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15 12h5M4 12h7" stroke="#42AB44" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
@@ -1 +0,0 @@
1
- <svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 18V6M15 12h5M4 12h7M12 20V4" stroke="#42AB44" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>