@cas-smartdesign/button 6.0.0 → 7.0.1

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.
@@ -4,6 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
7
+ <link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
7
8
  <style>
8
9
  .markdown-body {
9
10
  box-sizing: border-box;
@@ -12,10 +13,6 @@
12
13
  margin: 0 auto !important;
13
14
  padding-bottom: 45px;
14
15
  }
15
-
16
- sd-button {
17
- margin: 8px;
18
- }
19
16
  </style>
20
17
  <script type="module" crossorigin src="./doc.mjs"></script>
21
18
  <link rel="stylesheet" crossorigin href="./doc.css">
package/dist/docs/new.svg CHANGED
@@ -1,6 +1,3 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24">
2
- <g color="#000" fill="#1467ba">
3
- <path style="marker:none" overflow="visible" d="M0 11h23v1H0z"/>
4
- <path style="marker:none" overflow="visible" d="M11 23V0h1v23z"/>
5
- </g>
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M12 4.25a.75.75 0 0 1 .75.75v6.25H19a.75.75 0 0 1 0 1.5h-6.25V19a.75.75 0 0 1-1.5 0v-6.25H5a.75.75 0 0 1 0-1.5h6.25V5a.75.75 0 0 1 .75-.75" fill="currentColor"/>
6
3
  </svg>
@@ -1,5 +1,5 @@
1
1
  {
2
- "@cypress/vite-dev-server@7.2.1": {
2
+ "@cypress/vite-dev-server@7.3.2": {
3
3
  "licenses": "MIT",
4
4
  "repository": "https://github.com/cypress-io/cypress",
5
5
  "licenseUrl": "https://github.com/cypress-io/cypress/tree/develop/npm/vite-dev-server#readme"
@@ -19,6 +19,11 @@
19
19
  "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
20
20
  "licenseUrl": "https://unpkg.com/@types/postcss-prefix-selector@1.16.3/LICENSE"
21
21
  },
22
+ "@types/trusted-types@2.0.7": {
23
+ "licenses": "MIT",
24
+ "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
25
+ "licenseUrl": "https://unpkg.com/@types/trusted-types@2.0.7/LICENSE"
26
+ },
22
27
  "@types/yargs@17.0.35": {
23
28
  "licenses": "MIT",
24
29
  "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
@@ -49,6 +54,11 @@
49
54
  "repository": "https://github.com/cypress-io/cypress",
50
55
  "licenseUrl": "https://cypress.io"
51
56
  },
57
+ "dompurify@3.4.7": {
58
+ "licenses": "(MPL-2.0 OR Apache-2.0)",
59
+ "repository": "https://github.com/cure53/DOMPurify",
60
+ "licenseUrl": "https://unpkg.com/dompurify@3.4.7/LICENSE"
61
+ },
52
62
  "github-markdown-css@5.9.0": {
53
63
  "licenses": "MIT",
54
64
  "repository": "https://github.com/sindresorhus/github-markdown-css",
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@cas-smartdesign/button",
3
- "version": "6.0.0",
3
+ "version": "7.0.1",
4
4
  "description": "A button element which encloses the look and feel of the smartdesign button",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "files": [
7
7
  "dist",
8
+ "scss",
8
9
  "npm-third-party-licenses.json"
9
10
  ],
10
11
  "type": "module",
@@ -16,12 +17,21 @@
16
17
  "registry": "https://registry.npmjs.org/"
17
18
  },
18
19
  "dependencies": {
20
+ "@cas-smartdesign/image-embed": "^1.0.1",
19
21
  "@cas-smartdesign/element-base": "^6.0.0"
20
22
  },
21
23
  "devDependencies": {
22
- "@cas-smartdesign/element-preview": "^1.0.0",
24
+ "@cas-smartdesign/element-preview": "^1.1.0",
23
25
  "@cas-smartdesign/license-generator": "^1.10.0"
24
26
  },
27
+ "peerDependencies": {
28
+ "@cas-smartdesign/design-tokens": "^3.0.1"
29
+ },
30
+ "peerDependenciesMeta": {
31
+ "@cas-smartdesign/design-tokens": {
32
+ "optional": true
33
+ }
34
+ },
25
35
  "scripts": {
26
36
  "version": "pnpm version",
27
37
  "generate-declaration": "tsc -p tsconfig.types.json",
package/readme.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # @cas-smartdesign/button
2
2
 
3
- A button element which encloses the look and feel of the smartdesign button.
3
+ A button element which encloses the look and feel of the SmartDesign 3.0 button.
4
+
5
+ This element must be used together with the design tokens of SmartDesign.
6
+ For an independent application, make sure to include the @cas-smartdesign/design-tokens package.
7
+ For a web app / web widget, refer to the official documentation about design token usage.
4
8
 
5
9
  ## Attributes
6
10
 
@@ -12,11 +16,17 @@ A button element which encloses the look and feel of the smartdesign button.
12
16
  - Defines whether if the button is disabled. Note that it uses default disabled attribute, thus blocking pointer/mouse events.
13
17
  - `type`: string
14
18
  - Can be set to either `submit` or `reset` to make the button act like a HTML form button.
19
+ - `variant`: string
20
+ - Defines the visual style of the button. One of `primary`, `outline`, `standard`, `ghost`, `outline-danger`, `ghost-danger`, `selection` or `custom`. Defaults to `standard` when unset or set to an unknown value.
21
+ - `aria-pressed`: boolean
22
+ - Marks a `selection` button as selected (standard toggle-button semantics). When the variant is set to `selection` and the attribute is absent, the button initializes it to `false` so assistive tools announce it as a toggle; the consumer flips it to `true`/`false`.
15
23
 
16
24
  ## Properties
17
25
 
18
26
  - `disabled`: boolean
19
27
  - Makes the button looks like it is disabled & also prevents click events but used with a classname so mouse events are still triggered thus allowing for example tooltip usage in all browsers.
28
+ - `variant`: ButtonVariant
29
+ - Gets or sets the button's visual style (`primary`, `outline`, `standard`, `ghost`, `outline-danger`, `ghost-danger`, `selection` or `custom`). Reading it returns `standard` when the `variant` attribute is missing or invalid.
20
30
 
21
31
  ## CSS Custom Properties
22
32
 
@@ -24,5 +34,69 @@ A button element which encloses the look and feel of the smartdesign button.
24
34
  - Defines the value of margin-left, margin-right (default is 8px)
25
35
  - `--sd-button-max-icon-size`
26
36
  - Defines the value of max-width, max-height (default is 32px)
27
- - `--sd-button-border-radius`
28
- - Defines the border radius of the button
37
+
38
+ ### Colors & border
39
+
40
+ Each `variant` sets sensible defaults for these. Override them to fully customize a variant, or to style the `custom` variant which sets none of them itself. Each property falls back to a smartdesign design token when unset.
41
+
42
+ The `selection` variant additionally re-points these properties while selected (`[aria-pressed="true"]`): the background and border switch to the selection accent tokens, and the hover state is pinned to the selected colors so the selected look survives the cursor. To customize the selected appearance, set the same `--sd-button-*` properties under your own `[aria-pressed="true"]` selector.
43
+
44
+ For the `custom` variant you only need to set the two rest colors — `--sd-button-background-color` and `--sd-button-color`. The hover and pressed states are derived from them automatically (the background darkens, the text color is kept), so a minimal override stays coherent. You can still pin any individual state by setting its `--sd-button-*` property explicitly.
45
+
46
+ Mind the color contrast when relying on the derived states: because the background darkens while the text color is kept, a `--sd-button-color` that contrasts well against the rest background may fall below the required contrast ratio against the darker hover/pressed background. If the derived states do not meet your contrast requirements, set `--sd-button-color-hover` and `--sd-button-color-pressed` (and the matching background properties) explicitly.
47
+
48
+ - `--sd-button-background-color`
49
+ - Background color in the default (rest) state.
50
+ - `--sd-button-color`
51
+ - Foreground (text/icon) color in the default state.
52
+ - `--sd-button-border`
53
+ - The `border` shorthand applied to the button (e.g. `1px solid …`). Used by the `outline` variants.
54
+ - `--sd-button-background-color-hover`
55
+ - Background color on hover/focus.
56
+ - `--sd-button-color-hover`
57
+ - Foreground color on hover/focus.
58
+ - `--sd-button-border-color-hover`
59
+ - Border color on hover/focus (defaults to `transparent`).
60
+ - `--sd-button-background-color-pressed`
61
+ - Background color while pressed (`:active`).
62
+ - `--sd-button-color-pressed`
63
+ - Foreground color while pressed.
64
+ - `--sd-button-border-color-pressed`
65
+ - Border color while pressed (defaults to `transparent`).
66
+ - `--sd-button-background-color-disabled`
67
+ - Background color when disabled.
68
+ - `--sd-button-color-disabled`
69
+ - Foreground color when disabled.
70
+ - `--sd-button-border-color-disabled`
71
+ - Border color when disabled (defaults to `transparent`).
72
+
73
+ ## SCSS mixins
74
+
75
+ The package ships SCSS mixins so a consumer app can apply the SmartDesign button look to its own elements (e.g. a native `<button>`), reusing the exact same variant definitions as the web component.
76
+
77
+ ```scss
78
+ @use "@cas-smartdesign/button/scss/button" as sd-button;
79
+
80
+ button.cta {
81
+ @include sd-button.button(primary);
82
+ }
83
+
84
+ // compose if you only want the variant colors onto an already-laid-out element
85
+ .danger {
86
+ @include sd-button.appearance;
87
+ @include sd-button.variant("outline-danger");
88
+ }
89
+ ```
90
+
91
+ Available mixins:
92
+
93
+ - `button($variant: standard)` — full look (layout + colors + variant). The default `standard` needs no variant. For `selection` it also emits the selected-state rules under `[aria-pressed="true"]` (you manage the attribute yourself on a native element).
94
+ - `base` — structural styling only (layout, focus ring, disabled cursor), no colors.
95
+ - `appearance` — the color engine (rest + hover/focus + pressed + disabled), driven by the `--sd-button-*` properties.
96
+ - `variant($name)` — sets the `--sd-button-*` values for a named variant.
97
+ - `selection-checked` — the selected-state rules of the `selection` variant (under `[aria-pressed="true"]`); include it alongside `variant("selection")` when composing manually instead of using `button(selection)`.
98
+
99
+ Notes:
100
+
101
+ - Resolving `@use "@cas-smartdesign/button/scss/button"` requires the consumer's build to resolve packages in Sass.
102
+ - Themed colors resolve through the `@cas-smartdesign/design-tokens` CSS custom properties; without them, the built-in hex fallbacks apply. Consumers keep the same `--sd-button-*` override knobs documented above.
@@ -0,0 +1,85 @@
1
+ @use "config";
2
+
3
+ // Public SCSS API for consumer apps that want the SmartDesign button look on their
4
+ // own elements (e.g. a native <button>). Apply onto any selector:
5
+ //
6
+ // @use "@cas-smartdesign/button/scss/button" as sd-button;
7
+ // button.cta { @include sd-button.button(primary); }
8
+ // .danger { @include sd-button.button(outline-danger); }
9
+ //
10
+ // Themed colors resolve through @cas-smartdesign/design-tokens CSS custom
11
+ // properties; without them the hardcoded fallbacks apply. Consumers retain the
12
+ // same --sd-button-* override knobs as the web component.
13
+
14
+ // Structural styling (layout, focus ring, disabled cursor) — no colors.
15
+ @mixin base {
16
+ display: inline-flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ box-sizing: border-box;
20
+ vertical-align: middle;
21
+ min-height: 36px;
22
+ padding: var(--spacing-x3, 6px) var(--spacing-x4, 8px);
23
+ border-radius: var(--radius-s, 4px);
24
+ cursor: pointer;
25
+ user-select: none;
26
+ outline: none;
27
+
28
+ &:focus-visible {
29
+ outline: 1px solid var(--color-border-interaction-focus, #111);
30
+ outline-offset: var(--spacing-x1, 2px);
31
+ }
32
+
33
+ &:is(:disabled, [disabled], [aria-disabled="true"]) {
34
+ cursor: default;
35
+ }
36
+ }
37
+
38
+ // Color engine: paints rest + hover/focus + pressed + disabled states.
39
+ // The border lives on the element itself here (no ::after overlay), so the
40
+ // state border colors must too.
41
+ @mixin appearance {
42
+ @include config.state("base");
43
+ border: var(--sd-button-border, none);
44
+
45
+ &:is(:focus, :hover) {
46
+ @include config.state("hover", $border-on-after: false);
47
+ }
48
+
49
+ &:active {
50
+ @include config.state("pressed", $border-on-after: false);
51
+ }
52
+
53
+ &:is(:disabled, [disabled], [aria-disabled="true"]) {
54
+ @include config.state("disabled", $border-on-after: false);
55
+ }
56
+ }
57
+
58
+ // Just the --sd-button-* values for a variant (compose onto your own engine).
59
+ @mixin variant($name) {
60
+ @include config.variant-vars($name);
61
+ }
62
+
63
+ // Selected-state look of the `selection` variant, applied on [aria-pressed="true"].
64
+ // button(selection) emits this already; include it alongside variant("selection")
65
+ // when composing manually. You manage the aria-pressed attribute yourself.
66
+ @mixin selection-checked {
67
+ &[aria-pressed="true"] {
68
+ @include config.selection-checked-vars;
69
+ }
70
+ }
71
+
72
+ // Convenience: full button look in one call. `standard` needs no variant vars
73
+ // because it is exactly the neutral fallback the engine already paints.
74
+ @mixin button($variant: standard) {
75
+ @include base;
76
+ @include appearance;
77
+ @if $variant != standard {
78
+ @include config.variant-vars($variant);
79
+ }
80
+ // Selection is stateful: the selected look is driven by the standard
81
+ // aria-pressed attribute.
82
+ @if $variant == selection {
83
+ @include selection-checked;
84
+ }
85
+ }
@@ -0,0 +1,158 @@
1
+ @use "sass:map";
2
+
3
+ // Single source of truth shared by the component's shadow styles (../styles.scss)
4
+ // and the public mixins (_button.scss). Keep selector-agnostic: declarations only,
5
+ // callers provide the selector (`:host(...)` for the component, `&` for consumers).
6
+
7
+ // Neutral (standard variant) colors per interactive state. These are the fallbacks
8
+ // the engine paints with when no variant overrides the corresponding --sd-button-*.
9
+ $neutral: (
10
+ "base": (
11
+ "bg": var(--color-bg-action-neutral-default, #d4d4d4),
12
+ "fg": var(--color-fg-action-neutral-default, #111111),
13
+ ),
14
+ "hover": (
15
+ "bg": var(--color-bg-action-neutral-default-hover, #c6c6c6),
16
+ "fg": var(--color-fg-action-neutral-default-hover, #111111),
17
+ ),
18
+ "pressed": (
19
+ "bg": var(--color-bg-action-neutral-default-pressed, #b3b3b3),
20
+ "fg": var(--color-fg-action-neutral-default-pressed, #111111),
21
+ ),
22
+ "disabled": (
23
+ "bg": var(--color-bg-interaction-disabled, #e7e7e7),
24
+ "fg": var(--color-fg-interaction-disabled, #999999),
25
+ ),
26
+ );
27
+
28
+ // Custom variant rest colors: the consumer's --sd-button-* override, falling back
29
+ // to the neutral defaults the engine already paints. Used to derive coherent
30
+ // hover/pressed states so a minimal override (just rest bg + fg) is enough.
31
+ $_custom-bg: var(--sd-button-background-color, #{map.get(map.get($neutral, "base"), "bg")});
32
+ $_custom-fg: var(--sd-button-color, #{map.get(map.get($neutral, "base"), "fg")});
33
+
34
+ // Per-variant --sd-button-* values. Adding a variant is a single map entry.
35
+ $variants: (
36
+ "primary": (
37
+ "background-color": var(--color-bg-action-accent-default, #1467ba),
38
+ "color": var(--color-fg-interaction-on-color, #ffffff),
39
+ "background-color-hover": var(--color-bg-action-accent-default-hover, #0f4d8b),
40
+ "color-hover": var(--color-fg-interaction-on-color, #ffffff),
41
+ "background-color-pressed": var(--color-bg-action-accent-default-pressed, #0b3a69),
42
+ "color-pressed": var(--color-fg-interaction-on-color, #ffffff),
43
+ ),
44
+ "outline": (
45
+ "background-color": var(--color-bg-action-accent-weak, #e0ebf6),
46
+ "color": var(--color-fg-action-accent-default, #1467ba),
47
+ "border": 1px solid var(--color-border-action-accent-default, #1467ba),
48
+ "background-color-hover": var(--color-bg-action-accent-weak-hover, #d5e4f3),
49
+ "color-hover": var(--color-fg-action-accent-default-hover, #0f4d8b),
50
+ "border-color-hover": var(--color-border-action-accent-default-hover, #0f4d8b),
51
+ "background-color-pressed": var(--color-bg-action-accent-weak-pressed, #c7dbef),
52
+ "color-pressed": var(--color-fg-action-accent-default-pressed, #0b3a69),
53
+ "border-color-pressed": var(--color-border-action-accent-default-pressed, #0b3a69),
54
+ "background-color-disabled": transparent,
55
+ "border-color-disabled": var(--color-border-interaction-disabled, #c6c6c6),
56
+ ),
57
+ "ghost": (
58
+ "background-color": transparent,
59
+ "color": var(--color-fg-action-accent-default, #1467ba),
60
+ "background-color-hover": var(--color-bg-action-accent-weakest-hover, #e0ebf6),
61
+ "color-hover": var(--color-fg-action-accent-default-hover, #0f4d8b),
62
+ "background-color-pressed": var(--color-bg-action-accent-weakest-pressed, #c7dbef),
63
+ "color-pressed": var(--color-fg-action-accent-default-pressed, #0b3a69),
64
+ "background-color-disabled": transparent,
65
+ ),
66
+ "outline-danger": (
67
+ "background-color": var(--color-bg-action-danger-default, #fbdde0),
68
+ "color": var(--color-fg-action-danger-default, #a90014),
69
+ "border": 1px solid var(--color-border-action-danger-default, #a90014),
70
+ "background-color-hover": var(--color-bg-action-danger-default-hover, #fad2d6),
71
+ "color-hover": var(--color-fg-action-danger-default-hover, #7f000f),
72
+ "border-color-hover": var(--color-border-action-danger-default-hover, #7f000f),
73
+ "background-color-pressed": var(--color-bg-action-danger-default-pressed, #f8c3c9),
74
+ "color-pressed": var(--color-fg-action-danger-default-pressed, #5f000b),
75
+ "border-color-pressed": var(--color-border-action-danger-default-pressed, #5f000b),
76
+ "background-color-disabled": transparent,
77
+ "border-color-disabled": var(--color-border-interaction-disabled, #c6c6c6),
78
+ ),
79
+ "ghost-danger": (
80
+ "background-color": transparent,
81
+ "color": var(--color-fg-action-danger-default, #a90014),
82
+ "background-color-hover": var(--color-bg-action-danger-default-hover, #fad2d6),
83
+ "color-hover": var(--color-fg-action-danger-default-hover, #7f000f),
84
+ "background-color-pressed": var(--color-bg-action-danger-default-pressed, #f8c3c9),
85
+ "color-pressed": var(--color-fg-action-danger-default-pressed, #5f000b),
86
+ "background-color-disabled": transparent,
87
+ ),
88
+ // Toggle/selection look (segmented controls, filter chips): neutral at rest,
89
+ // accent colors when selected. The selected appearance is applied via
90
+ // selection-checked-vars on [aria-pressed="true"].
91
+ "selection": (
92
+ "background-color": var(--color-bg-selection-neutral-weakest, #ffffff),
93
+ "color": var(--color-fg-selection-neutral-default, #111111),
94
+ "border": 1px solid var(--color-border-selection-neutral-default, #999999),
95
+ "background-color-hover": var(--color-bg-selection-accent-weak-hover, #e0ebf6),
96
+ "color-hover": var(--color-fg-selection-neutral-default, #111111),
97
+ "border-color-hover": var(--color-border-selection-neutral-default, #999999),
98
+ "background-color-pressed": var(--color-bg-selection-accent-weak, #c7dbef),
99
+ "color-pressed": var(--color-fg-selection-neutral-default, #111111),
100
+ "border-color-pressed": var(--color-border-selection-accent-default, #1467ba),
101
+ "border-color-disabled": var(--color-border-interaction-disabled, #c6c6c6),
102
+ ),
103
+ // Sets no rest colors of its own — the consumer supplies --sd-button-background-color
104
+ // and --sd-button-color, and hover/pressed are derived from them automatically.
105
+ // Any state can still be pinned by overriding the matching --sd-button-* property.
106
+ "custom": (
107
+ "background-color-hover": color-mix(in oklab, $_custom-bg, var(--color-fg-default, #111111) 12%),
108
+ "color-hover": $_custom-fg,
109
+ "background-color-pressed": color-mix(in oklab, $_custom-bg, var(--color-fg-default, #111111) 22%),
110
+ "color-pressed": $_custom-fg,
111
+ ),
112
+ );
113
+
114
+ // Paint one interactive state: reads the public --sd-button-* override with the
115
+ // neutral token as fallback. `$state` is one of the $neutral keys.
116
+ // $border-on-after: the web component draws its border on the :host::after
117
+ // overlay; consumer elements (mixin API) carry a real border, so the state
118
+ // color must land on the element itself there.
119
+ @mixin state($state, $border-on-after: true) {
120
+ $suffix: "";
121
+ @if $state != "base" {
122
+ $suffix: "-#{$state}";
123
+ }
124
+ $colors: map.get($neutral, $state);
125
+ background-color: var(--sd-button-background-color#{$suffix}, #{map.get($colors, "bg")});
126
+ color: var(--sd-button-color#{$suffix}, #{map.get($colors, "fg")});
127
+ @if $state != "base" {
128
+ $border-color: var(--sd-button-border-color#{$suffix}, transparent);
129
+ @if $border-on-after {
130
+ &::after {
131
+ border-color: $border-color;
132
+ }
133
+ } @else {
134
+ border-color: $border-color;
135
+ }
136
+ }
137
+ }
138
+
139
+ // Selected appearance of the `selection` variant: re-points the same public
140
+ // --sd-button-* vars, pinning hover to the selected colors so the selected
141
+ // look survives the cursor. Pressed already matches the selected colors.
142
+ @mixin selection-checked-vars {
143
+ --sd-button-background-color: var(--color-bg-selection-accent-weak, #c7dbef);
144
+ --sd-button-border: 1px solid var(--color-border-selection-accent-default, #1467ba);
145
+ --sd-button-background-color-hover: var(--color-bg-selection-accent-weak, #c7dbef);
146
+ --sd-button-border-color-hover: var(--color-border-selection-accent-default, #1467ba);
147
+ }
148
+
149
+ // Emit the --sd-button-* assignments for a named variant.
150
+ @mixin variant-vars($name) {
151
+ $props: map.get($variants, $name);
152
+ @if $props == null {
153
+ @error "Unknown button variant '#{$name}'. Known: #{map.keys($variants)}.";
154
+ }
155
+ @each $prop, $value in $props {
156
+ --sd-button-#{$prop}: #{$value};
157
+ }
158
+ }
@@ -1 +0,0 @@
1
- import"./doc.mjs";document.querySelector(`#declarative-with-code`).addEventListener(`click`,e=>{e.currentTarget.innerText+=`!`,console.log(`Test!`)});
@@ -1,6 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24">
2
- <g color="#000" fill="#fff">
3
- <path style="marker:none" overflow="visible" d="M0 11h23v1H0z"/>
4
- <path style="marker:none" overflow="visible" d="M11 23V0h1v23z"/>
5
- </g>
6
- </svg>