@jis3r/icons 2.2.0 → 2.4.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.
- package/dist/icons/message-circle-code.svelte +109 -0
- package/dist/icons/message-circle-code.svelte.d.ts +4 -0
- package/dist/icons/message-circle-dashed.svelte +81 -0
- package/dist/icons/message-circle-dashed.svelte.d.ts +4 -0
- package/dist/icons/message-circle-heart.svelte +96 -0
- package/dist/icons/message-circle-heart.svelte.d.ts +4 -0
- package/dist/icons/message-circle-x.svelte +109 -0
- package/dist/icons/message-circle-x.svelte.d.ts +4 -0
- package/dist/icons/message-square-code.svelte +112 -0
- package/dist/icons/message-square-code.svelte.d.ts +4 -0
- package/dist/icons/message-square-dashed.svelte +82 -0
- package/dist/icons/message-square-dashed.svelte.d.ts +4 -0
- package/dist/icons/message-square-dot.svelte +89 -0
- package/dist/icons/message-square-dot.svelte.d.ts +4 -0
- package/dist/icons/message-square-heart.svelte +99 -0
- package/dist/icons/message-square-heart.svelte.d.ts +4 -0
- package/dist/icons/message-square-quote.svelte +106 -0
- package/dist/icons/message-square-quote.svelte.d.ts +4 -0
- package/dist/icons/message-square-x.svelte +109 -0
- package/dist/icons/message-square-x.svelte.d.ts +4 -0
- package/dist/icons/redo-dot.svelte +1 -1
- package/dist/icons/redo.svelte +1 -1
- package/dist/icons/standalone-props.d.ts +6 -0
- package/dist/icons/standalone-props.js +14 -0
- package/dist/icons/undo-dot.svelte +1 -1
- package/dist/icons/undo.svelte +1 -1
- package/dist/icons/user-check.svelte +46 -3
- package/dist/icons/user-pen.svelte +46 -2
- package/dist/icons/user-x.svelte +124 -0
- package/dist/icons/user-x.svelte.d.ts +4 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +11 -0
- package/package.json +3 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { IconProps } from './types.js';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
color = 'currentColor',
|
|
6
|
+
size = 24,
|
|
7
|
+
strokeWidth = 2,
|
|
8
|
+
animate = false,
|
|
9
|
+
class: className = ''
|
|
10
|
+
}: IconProps = $props();
|
|
11
|
+
|
|
12
|
+
function handleMouseEnter() {
|
|
13
|
+
if (animate) return;
|
|
14
|
+
animate = true;
|
|
15
|
+
setTimeout(() => {
|
|
16
|
+
animate = false;
|
|
17
|
+
}, 800);
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<div class={className} aria-label="message-square-heart" role="img" onmouseenter={handleMouseEnter}>
|
|
22
|
+
<svg
|
|
23
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
+
width={size}
|
|
25
|
+
height={size}
|
|
26
|
+
viewBox="0 0 24 24"
|
|
27
|
+
fill="none"
|
|
28
|
+
stroke={color}
|
|
29
|
+
stroke-width={strokeWidth}
|
|
30
|
+
stroke-linecap="round"
|
|
31
|
+
stroke-linejoin="round"
|
|
32
|
+
class:animate
|
|
33
|
+
>
|
|
34
|
+
<g class="message-square-heart-group">
|
|
35
|
+
<path
|
|
36
|
+
d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
|
|
37
|
+
class="message-square-heart-path1"
|
|
38
|
+
/>
|
|
39
|
+
<path
|
|
40
|
+
d="M14.8 7.5a1.84 1.84 0 0 0-2.6 0l-.2.3-.3-.3a1.84 1.84 0 1 0-2.4 2.8L12 13l2.7-2.7c.9-.9.8-2.1.1-2.8"
|
|
41
|
+
class="message-square-heart-path2"
|
|
42
|
+
/>
|
|
43
|
+
</g>
|
|
44
|
+
</svg>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
div {
|
|
49
|
+
display: inline-block;
|
|
50
|
+
}
|
|
51
|
+
.message-square-heart-group {
|
|
52
|
+
transform-origin: bottom left;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.message-square-heart-path2 {
|
|
56
|
+
transform-origin: center;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.animate .message-square-heart-group {
|
|
60
|
+
animation: messageSquareHeartGroupAnimation 0.8s ease-in-out;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.animate .message-square-heart-path2 {
|
|
64
|
+
animation: messageSquareHeartPath2Animation 0.8s ease-in-out;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@keyframes messageSquareHeartGroupAnimation {
|
|
68
|
+
0% {
|
|
69
|
+
transform: rotate(0deg);
|
|
70
|
+
}
|
|
71
|
+
40% {
|
|
72
|
+
transform: rotate(8deg);
|
|
73
|
+
}
|
|
74
|
+
60% {
|
|
75
|
+
transform: rotate(-8deg);
|
|
76
|
+
}
|
|
77
|
+
80% {
|
|
78
|
+
transform: rotate(2deg);
|
|
79
|
+
}
|
|
80
|
+
100% {
|
|
81
|
+
transform: rotate(0deg);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@keyframes messageSquareHeartPath2Animation {
|
|
86
|
+
0% {
|
|
87
|
+
transform: scale(1);
|
|
88
|
+
}
|
|
89
|
+
25% {
|
|
90
|
+
transform: scale(0.7);
|
|
91
|
+
}
|
|
92
|
+
50% {
|
|
93
|
+
transform: scale(1.1);
|
|
94
|
+
}
|
|
95
|
+
100% {
|
|
96
|
+
transform: scale(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
</style>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { IconProps } from './types.js';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
color = 'currentColor',
|
|
6
|
+
size = 24,
|
|
7
|
+
strokeWidth = 2,
|
|
8
|
+
animate = false,
|
|
9
|
+
class: className = ''
|
|
10
|
+
}: IconProps = $props();
|
|
11
|
+
|
|
12
|
+
function handleMouseEnter() {
|
|
13
|
+
if (animate) return;
|
|
14
|
+
animate = true;
|
|
15
|
+
setTimeout(() => {
|
|
16
|
+
animate = false;
|
|
17
|
+
}, 800);
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<div class={className} aria-label="message-square-quote" role="img" onmouseenter={handleMouseEnter}>
|
|
22
|
+
<svg
|
|
23
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
+
width={size}
|
|
25
|
+
height={size}
|
|
26
|
+
viewBox="0 0 24 24"
|
|
27
|
+
fill="none"
|
|
28
|
+
stroke={color}
|
|
29
|
+
stroke-width={strokeWidth}
|
|
30
|
+
stroke-linecap="round"
|
|
31
|
+
stroke-linejoin="round"
|
|
32
|
+
class:animate
|
|
33
|
+
>
|
|
34
|
+
<g class="message-square-quote-group">
|
|
35
|
+
<path
|
|
36
|
+
d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
|
|
37
|
+
class="message-square-quote-path1"
|
|
38
|
+
/>
|
|
39
|
+
<path d="M8 12a2 2 0 0 0 2-2V8H8" class="message-square-quote-path2" />
|
|
40
|
+
<path d="M14 12a2 2 0 0 0 2-2V8h-2" class="message-square-quote-path3" />
|
|
41
|
+
</g>
|
|
42
|
+
</svg>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<style>
|
|
46
|
+
div {
|
|
47
|
+
display: inline-block;
|
|
48
|
+
}
|
|
49
|
+
.message-square-quote-group {
|
|
50
|
+
transform-origin: bottom left;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.animate .message-square-quote-group {
|
|
54
|
+
animation: messageSquareQuoteGroupAnimation 0.8s ease-in-out;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.animate .message-square-quote-path2 {
|
|
58
|
+
animation: messageSquareQuotePath2Animation 0.6s ease-in-out;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.animate .message-square-quote-path3 {
|
|
62
|
+
animation: messageSquareQuotePath3Animation 0.6s ease-in-out;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@keyframes messageSquareQuoteGroupAnimation {
|
|
66
|
+
0% {
|
|
67
|
+
transform: rotate(0deg);
|
|
68
|
+
}
|
|
69
|
+
40% {
|
|
70
|
+
transform: rotate(8deg);
|
|
71
|
+
}
|
|
72
|
+
60% {
|
|
73
|
+
transform: rotate(-8deg);
|
|
74
|
+
}
|
|
75
|
+
80% {
|
|
76
|
+
transform: rotate(2deg);
|
|
77
|
+
}
|
|
78
|
+
100% {
|
|
79
|
+
transform: rotate(0deg);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@keyframes messageSquareQuotePath2Animation {
|
|
84
|
+
0% {
|
|
85
|
+
transform: translate(0, 0);
|
|
86
|
+
}
|
|
87
|
+
50% {
|
|
88
|
+
transform: translate(1.5px, -0.5px);
|
|
89
|
+
}
|
|
90
|
+
100% {
|
|
91
|
+
transform: translate(0, 0);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@keyframes messageSquareQuotePath3Animation {
|
|
96
|
+
0% {
|
|
97
|
+
transform: translate(0, 0);
|
|
98
|
+
}
|
|
99
|
+
50% {
|
|
100
|
+
transform: translate(1px, -0.5px);
|
|
101
|
+
}
|
|
102
|
+
100% {
|
|
103
|
+
transform: translate(0, 0);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
</style>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { IconProps } from './types.js';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
color = 'currentColor',
|
|
6
|
+
size = 24,
|
|
7
|
+
strokeWidth = 2,
|
|
8
|
+
animate = false,
|
|
9
|
+
class: className = ''
|
|
10
|
+
}: IconProps = $props();
|
|
11
|
+
|
|
12
|
+
function handleMouseEnter() {
|
|
13
|
+
if (animate) return;
|
|
14
|
+
animate = true;
|
|
15
|
+
setTimeout(() => {
|
|
16
|
+
animate = false;
|
|
17
|
+
}, 800);
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<div class={className} aria-label="message-square-x" role="img" onmouseenter={handleMouseEnter}>
|
|
22
|
+
<svg
|
|
23
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
+
width={size}
|
|
25
|
+
height={size}
|
|
26
|
+
viewBox="0 0 24 24"
|
|
27
|
+
fill="none"
|
|
28
|
+
stroke={color}
|
|
29
|
+
stroke-width={strokeWidth}
|
|
30
|
+
stroke-linecap="round"
|
|
31
|
+
stroke-linejoin="round"
|
|
32
|
+
class="message-square-x-icon"
|
|
33
|
+
>
|
|
34
|
+
<g class="message-square-x-group" class:animate>
|
|
35
|
+
<path
|
|
36
|
+
d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"
|
|
37
|
+
/>
|
|
38
|
+
<path d="m14.5 8.5-5 5" class="diagonal-1" />
|
|
39
|
+
<path d="m9.5 8.5 5 5" class="diagonal-2" />
|
|
40
|
+
</g>
|
|
41
|
+
</svg>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<style>
|
|
45
|
+
div {
|
|
46
|
+
display: inline-block;
|
|
47
|
+
}
|
|
48
|
+
.message-square-x-icon {
|
|
49
|
+
overflow: visible;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.message-square-x-group {
|
|
53
|
+
transform-origin: bottom left;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.message-square-x-group.animate {
|
|
57
|
+
animation: messageSquareAnimation 0.8s ease-in-out;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.diagonal-1,
|
|
61
|
+
.diagonal-2 {
|
|
62
|
+
stroke-dasharray: 7.1;
|
|
63
|
+
stroke-dashoffset: 0;
|
|
64
|
+
transition: stroke-dashoffset 0.15s ease-out;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.message-square-x-group.animate .diagonal-1 {
|
|
68
|
+
opacity: 0;
|
|
69
|
+
animation: lineAnimation 0.3s ease-out forwards;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.message-square-x-group.animate .diagonal-2 {
|
|
73
|
+
opacity: 0;
|
|
74
|
+
animation: lineAnimation 0.3s ease-out 0.25s forwards;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@keyframes messageSquareAnimation {
|
|
78
|
+
0% {
|
|
79
|
+
transform: rotate(0deg);
|
|
80
|
+
}
|
|
81
|
+
40% {
|
|
82
|
+
transform: rotate(8deg);
|
|
83
|
+
}
|
|
84
|
+
60% {
|
|
85
|
+
transform: rotate(-8deg);
|
|
86
|
+
}
|
|
87
|
+
80% {
|
|
88
|
+
transform: rotate(2deg);
|
|
89
|
+
}
|
|
90
|
+
100% {
|
|
91
|
+
transform: rotate(0deg);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@keyframes lineAnimation {
|
|
96
|
+
0% {
|
|
97
|
+
opacity: 0;
|
|
98
|
+
stroke-dashoffset: 7.1;
|
|
99
|
+
}
|
|
100
|
+
15% {
|
|
101
|
+
opacity: 1;
|
|
102
|
+
stroke-dashoffset: 7.1;
|
|
103
|
+
}
|
|
104
|
+
100% {
|
|
105
|
+
opacity: 1;
|
|
106
|
+
stroke-dashoffset: 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
</style>
|
package/dist/icons/redo.svelte
CHANGED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared replacement for icon source when inlining IconProps (e.g. standalone snippets, registry).
|
|
3
|
+
* Keep in sync with src/lib/icons/types.ts when IconProps changes.
|
|
4
|
+
*/
|
|
5
|
+
export const ICON_PROPS_IMPORT: RegExp;
|
|
6
|
+
export const INLINED_ICON_PROPS: "interface IconProps {\n\t\tcolor?: string;\n\t\tsize?: number;\n\t\tstrokeWidth?: number;\n\t\tanimate?: boolean;\n\t\tclass?: string;\n\t}\n\n";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared replacement for icon source when inlining IconProps (e.g. standalone snippets, registry).
|
|
3
|
+
* Keep in sync with src/lib/icons/types.ts when IconProps changes.
|
|
4
|
+
*/
|
|
5
|
+
export const ICON_PROPS_IMPORT = /import type \{ IconProps \} from '\.\/types\.js';\n\n?/;
|
|
6
|
+
export const INLINED_ICON_PROPS = `interface IconProps {
|
|
7
|
+
color?: string;
|
|
8
|
+
size?: number;
|
|
9
|
+
strokeWidth?: number;
|
|
10
|
+
animate?: boolean;
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
`;
|
package/dist/icons/undo.svelte
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
animate = true;
|
|
15
15
|
setTimeout(() => {
|
|
16
16
|
animate = false;
|
|
17
|
-
},
|
|
17
|
+
}, 600);
|
|
18
18
|
}
|
|
19
19
|
</script>
|
|
20
20
|
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
class="user-check-icon"
|
|
33
33
|
class:animate
|
|
34
34
|
>
|
|
35
|
-
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
|
|
36
|
-
<circle cx="9" cy="7" r="4" />
|
|
35
|
+
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" class="user-path" />
|
|
36
|
+
<circle cx="9" cy="7" r="4" class="user-circle" />
|
|
37
37
|
<polyline points="16 11 18 13 22 9" class="check-path" />
|
|
38
38
|
</svg>
|
|
39
39
|
</div>
|
|
@@ -55,6 +55,49 @@
|
|
|
55
55
|
.user-check-icon.animate .check-path {
|
|
56
56
|
animation: checkAnimation 0.5s ease-out backwards;
|
|
57
57
|
}
|
|
58
|
+
.user-path,
|
|
59
|
+
.user-circle {
|
|
60
|
+
transition: transform 0.6s ease-in-out;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.user-check-icon.animate .user-path {
|
|
64
|
+
animation: pathBounce 0.6s ease-in-out;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.user-check-icon.animate .user-circle {
|
|
68
|
+
animation: circleBounce 0.6s ease-in-out;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@keyframes pathBounce {
|
|
72
|
+
0% {
|
|
73
|
+
transform: translateY(0);
|
|
74
|
+
}
|
|
75
|
+
33% {
|
|
76
|
+
transform: translateY(2px);
|
|
77
|
+
}
|
|
78
|
+
66% {
|
|
79
|
+
transform: translateY(-2px);
|
|
80
|
+
}
|
|
81
|
+
100% {
|
|
82
|
+
transform: translateY(0);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@keyframes circleBounce {
|
|
87
|
+
0% {
|
|
88
|
+
transform: translateY(0);
|
|
89
|
+
}
|
|
90
|
+
33% {
|
|
91
|
+
transform: translateY(4px);
|
|
92
|
+
}
|
|
93
|
+
66% {
|
|
94
|
+
transform: translateY(-2px);
|
|
95
|
+
}
|
|
96
|
+
100% {
|
|
97
|
+
transform: translateY(0);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
58
101
|
@keyframes checkAnimation {
|
|
59
102
|
0% {
|
|
60
103
|
stroke-dashoffset: 9;
|
|
@@ -30,14 +30,15 @@
|
|
|
30
30
|
stroke-linecap="round"
|
|
31
31
|
stroke-linejoin="round"
|
|
32
32
|
class="user-pen-icon"
|
|
33
|
+
class:animate
|
|
33
34
|
>
|
|
34
|
-
<path d="M11.5 15H7a4 4 0 0 0-4 4v2" />
|
|
35
|
+
<path d="M11.5 15H7a4 4 0 0 0-4 4v2" class="user-path" />
|
|
35
36
|
<path
|
|
36
37
|
d="M21.378 16.626a1 1 0 0 0-3.004-3.004l-4.01 4.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z"
|
|
37
38
|
class="pen"
|
|
38
39
|
class:animate
|
|
39
40
|
/>
|
|
40
|
-
<circle cx="10" cy="7" r="4" />
|
|
41
|
+
<circle cx="10" cy="7" r="4" class="user-circle" />
|
|
41
42
|
</svg>
|
|
42
43
|
</div>
|
|
43
44
|
|
|
@@ -58,6 +59,49 @@
|
|
|
58
59
|
animation: penWiggle 0.5s ease-in-out 2;
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
.user-path,
|
|
63
|
+
.user-circle {
|
|
64
|
+
transition: transform 0.6s ease-in-out;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.user-pen-icon.animate .user-path {
|
|
68
|
+
animation: pathBounce 0.6s ease-in-out;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.user-pen-icon.animate .user-circle {
|
|
72
|
+
animation: circleBounce 0.6s ease-in-out;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@keyframes pathBounce {
|
|
76
|
+
0% {
|
|
77
|
+
transform: translateY(0);
|
|
78
|
+
}
|
|
79
|
+
33% {
|
|
80
|
+
transform: translateY(2px);
|
|
81
|
+
}
|
|
82
|
+
66% {
|
|
83
|
+
transform: translateY(-2px);
|
|
84
|
+
}
|
|
85
|
+
100% {
|
|
86
|
+
transform: translateY(0);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@keyframes circleBounce {
|
|
91
|
+
0% {
|
|
92
|
+
transform: translateY(0);
|
|
93
|
+
}
|
|
94
|
+
33% {
|
|
95
|
+
transform: translateY(4px);
|
|
96
|
+
}
|
|
97
|
+
66% {
|
|
98
|
+
transform: translateY(-2px);
|
|
99
|
+
}
|
|
100
|
+
100% {
|
|
101
|
+
transform: translateY(0);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
61
105
|
@keyframes penWiggle {
|
|
62
106
|
0%,
|
|
63
107
|
100% {
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { IconProps } from './types.js';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
color = 'currentColor',
|
|
6
|
+
size = 24,
|
|
7
|
+
strokeWidth = 2,
|
|
8
|
+
animate = false,
|
|
9
|
+
class: className = ''
|
|
10
|
+
}: IconProps = $props();
|
|
11
|
+
|
|
12
|
+
function handleMouseEnter() {
|
|
13
|
+
if (animate) return;
|
|
14
|
+
animate = true;
|
|
15
|
+
setTimeout(() => {
|
|
16
|
+
animate = false;
|
|
17
|
+
}, 600);
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<div class={className} aria-label="user-x" role="img" onmouseenter={handleMouseEnter}>
|
|
22
|
+
<svg
|
|
23
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
+
width={size}
|
|
25
|
+
height={size}
|
|
26
|
+
viewBox="0 0 24 24"
|
|
27
|
+
fill="none"
|
|
28
|
+
stroke={color}
|
|
29
|
+
stroke-width={strokeWidth}
|
|
30
|
+
stroke-linecap="round"
|
|
31
|
+
stroke-linejoin="round"
|
|
32
|
+
class="user-x-icon"
|
|
33
|
+
class:animate
|
|
34
|
+
>
|
|
35
|
+
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" class="user-path" />
|
|
36
|
+
<circle cx="9" cy="7" r="4" class="user-circle" />
|
|
37
|
+
<line x1="22" x2="17" y1="8" y2="13" class="diagonal-1" />
|
|
38
|
+
<line x1="17" x2="22" y1="8" y2="13" class="diagonal-2" />
|
|
39
|
+
</svg>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<style>
|
|
43
|
+
div {
|
|
44
|
+
display: inline-block;
|
|
45
|
+
}
|
|
46
|
+
.user-x-icon {
|
|
47
|
+
overflow: visible;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.user-path,
|
|
51
|
+
.user-circle {
|
|
52
|
+
transition: transform 0.6s ease-in-out;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.user-x-icon.animate .user-path {
|
|
56
|
+
animation: pathBounce 0.6s ease-in-out;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.user-x-icon.animate .user-circle {
|
|
60
|
+
animation: circleBounce 0.6s ease-in-out;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.diagonal-1,
|
|
64
|
+
.diagonal-2 {
|
|
65
|
+
stroke-dasharray: 7.1;
|
|
66
|
+
stroke-dashoffset: 0;
|
|
67
|
+
transition: stroke-dashoffset 0.15s ease-out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.user-x-icon.animate .diagonal-1 {
|
|
71
|
+
opacity: 0;
|
|
72
|
+
animation: lineAnimation 0.3s ease-out forwards;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.user-x-icon.animate .diagonal-2 {
|
|
76
|
+
opacity: 0;
|
|
77
|
+
animation: lineAnimation 0.3s ease-out 0.25s forwards;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@keyframes pathBounce {
|
|
81
|
+
0% {
|
|
82
|
+
transform: translateY(0);
|
|
83
|
+
}
|
|
84
|
+
33% {
|
|
85
|
+
transform: translateY(2px);
|
|
86
|
+
}
|
|
87
|
+
66% {
|
|
88
|
+
transform: translateY(-2px);
|
|
89
|
+
}
|
|
90
|
+
100% {
|
|
91
|
+
transform: translateY(0);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@keyframes circleBounce {
|
|
96
|
+
0% {
|
|
97
|
+
transform: translateY(0);
|
|
98
|
+
}
|
|
99
|
+
33% {
|
|
100
|
+
transform: translateY(4px);
|
|
101
|
+
}
|
|
102
|
+
66% {
|
|
103
|
+
transform: translateY(-2px);
|
|
104
|
+
}
|
|
105
|
+
100% {
|
|
106
|
+
transform: translateY(0);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@keyframes lineAnimation {
|
|
111
|
+
0% {
|
|
112
|
+
opacity: 0;
|
|
113
|
+
stroke-dashoffset: 7.1;
|
|
114
|
+
}
|
|
115
|
+
15% {
|
|
116
|
+
opacity: 1;
|
|
117
|
+
stroke-dashoffset: 7.1;
|
|
118
|
+
}
|
|
119
|
+
100% {
|
|
120
|
+
opacity: 1;
|
|
121
|
+
stroke-dashoffset: 0;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
</style>
|