@animateicons/angular 0.0.0-stage → 0.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.
- package/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +74 -2
- package/THIRD_PARTY_NOTICES.md +81 -0
- package/fesm2022/animateicons-angular-huge.mjs +1 -0
- package/fesm2022/animateicons-angular-lucide.mjs +1 -0
- package/fesm2022/animateicons-angular.mjs +183 -0
- package/fesm2022/animateicons-angular.mjs.map +1 -0
- package/package.json +56 -5
- package/types/animateicons-angular-huge.d.ts +1 -0
- package/types/animateicons-angular-lucide.d.ts +1 -0
- package/types/animateicons-angular.d.ts +46 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# @animateicons/angular
|
|
2
|
+
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
- Added 330 Lucide icons to the `lucide` subpath, so there are now 1500 (999 Lucide and 501 Huge). The same set as `@animateicons/react` 0.13.0, for example `ArrowBigDown`, `MonitorCheck`, `MapPinPlus`, `CalendarSync` and `StarHalf`.
|
|
6
|
+
- Shields now tilt on their bottom tip like they took a hit, and `Database` and `DatabaseBackup` drop a small record into the open top, the same as in React.
|
|
7
|
+
- Requires `@animateicons/vanilla` 0.2.0. No API changes.
|
|
8
|
+
|
|
9
|
+
## 0.1.0
|
|
10
|
+
|
|
11
|
+
- First release. The standalone `AnimateIcons` component with signal inputs, and 1170 animated icons (669 Lucide and 501 Huge) as data from the `lucide` and `huge` subpaths.
|
|
12
|
+
- Supports Angular 20, 21 and 22, zoneless apps and zone.js apps, and renders the icon at rest on the server. Plays the same animations as `@animateicons/react`.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Avijit Dey
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,75 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @animateicons/angular
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
1170 animated SVG icons for Angular. One standalone component with signal inputs, server rendering and zoneless support. The same motion as [`@animateicons/react`](https://www.npmjs.com/package/@animateicons/react).
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@animateicons/angular)
|
|
6
|
+
[](./LICENSE)
|
|
7
|
+
|
|
8
|
+
Docs: [animateicons.in/icons/docs/angular](https://animateicons.in/icons/docs/angular). Browse every icon at [animateicons.in](https://animateicons.in).
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm i @animateicons/angular
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Works with Angular 20, 21 and 22, with or without zone.js.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { Component } from "@angular/core";
|
|
22
|
+
import { AnimateIcons } from "@animateicons/angular";
|
|
23
|
+
import { BellRing } from "@animateicons/angular/lucide";
|
|
24
|
+
|
|
25
|
+
@Component({
|
|
26
|
+
selector: "app-example",
|
|
27
|
+
imports: [AnimateIcons],
|
|
28
|
+
template: `<animate-icons [icon]="bellRing" [size]="32" color="tomato" />`,
|
|
29
|
+
})
|
|
30
|
+
export class Example {
|
|
31
|
+
bellRing = BellRing;
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Icons are data, named after the icon in PascalCase (`bell-ring` is `BellRing`), and come from the `lucide` or `huge` subpath. The icon animates on hover. Server rendering outputs the whole icon at rest.
|
|
36
|
+
|
|
37
|
+
## Playing it yourself
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { Component, viewChild } from "@angular/core";
|
|
41
|
+
import { AnimateIcons } from "@animateicons/angular";
|
|
42
|
+
import { Bell } from "@animateicons/angular/lucide";
|
|
43
|
+
|
|
44
|
+
@Component({
|
|
45
|
+
selector: "app-bell-button",
|
|
46
|
+
imports: [AnimateIcons],
|
|
47
|
+
template: `
|
|
48
|
+
<button (click)="icon()?.startAnimation()">
|
|
49
|
+
<animate-icons [icon]="bell" [isAnimated]="false" />
|
|
50
|
+
</button>
|
|
51
|
+
`,
|
|
52
|
+
})
|
|
53
|
+
export class BellButton {
|
|
54
|
+
bell = Bell;
|
|
55
|
+
icon = viewChild(AnimateIcons);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`[isAnimated]="false"` turns hover off so the icon only plays when you call `startAnimation()`. The animation runs outside Angular's change detection, so hovering never re-checks your page.
|
|
60
|
+
|
|
61
|
+
## Inputs
|
|
62
|
+
|
|
63
|
+
| Input | Type | Default |
|
|
64
|
+
| ------------ | ---------- | -------------- |
|
|
65
|
+
| `icon` | `IconData` | required |
|
|
66
|
+
| `size` | `number` | `24` |
|
|
67
|
+
| `color` | `string` | `currentColor` |
|
|
68
|
+
| `duration` | `number` | `1` |
|
|
69
|
+
| `isAnimated` | `boolean` | `true` |
|
|
70
|
+
|
|
71
|
+
`duration` multiplies every duration and delay. With reduced motion turned on, hover does nothing and `startAnimation()` keeps the icon at rest.
|
|
72
|
+
|
|
73
|
+
## License
|
|
74
|
+
|
|
75
|
+
MIT. The icon shapes come from Lucide and Huge Icons, see [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md).
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
AnimateIcons icons are based on icon shapes from the projects below. Their licenses say the copyright notice must stay with copies of the icons, so the notices are included here.
|
|
4
|
+
|
|
5
|
+
## Lucide
|
|
6
|
+
|
|
7
|
+
Source: https://github.com/lucide-icons/lucide
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
ISC License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 Lucide Icons and Contributors
|
|
13
|
+
|
|
14
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
15
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
16
|
+
copyright notice and this permission notice appear in all copies.
|
|
17
|
+
|
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
19
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
20
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
21
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
22
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
23
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
24
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Feather
|
|
28
|
+
|
|
29
|
+
Some Lucide icons are derived from Feather (https://github.com/feathericons/feather). Lucide lists them in its license file: https://github.com/lucide-icons/lucide/blob/main/LICENSE
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
The MIT License (MIT)
|
|
33
|
+
|
|
34
|
+
Copyright (c) 2013-present Cole Bemis
|
|
35
|
+
|
|
36
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
37
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
38
|
+
in the Software without restriction, including without limitation the rights
|
|
39
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
40
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
41
|
+
furnished to do so, subject to the following conditions:
|
|
42
|
+
|
|
43
|
+
The above copyright notice and this permission notice shall be included in all
|
|
44
|
+
copies or substantial portions of the Software.
|
|
45
|
+
|
|
46
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
47
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
48
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
49
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
50
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
51
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
52
|
+
SOFTWARE.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Hugeicons
|
|
56
|
+
|
|
57
|
+
Source: https://github.com/hugeicons/hugeicons (the free `@hugeicons/core-free-icons` set)
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
MIT License
|
|
61
|
+
|
|
62
|
+
Copyright (c) 2025 Hugeicons
|
|
63
|
+
|
|
64
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
65
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
66
|
+
in the Software without restriction, including without limitation the rights
|
|
67
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
68
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
69
|
+
furnished to do so, subject to the following conditions:
|
|
70
|
+
|
|
71
|
+
The above copyright notice and this permission notice shall be included in all
|
|
72
|
+
copies or substantial portions of the Software.
|
|
73
|
+
|
|
74
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
75
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
76
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
77
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
78
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
79
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
80
|
+
SOFTWARE.
|
|
81
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@animateicons/vanilla/huge";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@animateicons/vanilla/lucide";
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, DOCUMENT, ElementRef, NgZone, afterRenderEffect, booleanAttribute, effect, inject, input, numberAttribute, signal } from "@angular/core";
|
|
3
|
+
import { attachIcon, renderIcon } from "@animateicons/vanilla";
|
|
4
|
+
var AnimateIcons = class AnimateIcons {
|
|
5
|
+
icon = input.required(...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
|
|
6
|
+
size = input(24, {
|
|
7
|
+
...ngDevMode ? { debugName: "size" } : /* istanbul ignore next */ {},
|
|
8
|
+
transform: numberAttribute
|
|
9
|
+
});
|
|
10
|
+
color = input(...ngDevMode ? [void 0, { debugName: "color" }] : /* istanbul ignore next */ []);
|
|
11
|
+
duration = input(1, {
|
|
12
|
+
...ngDevMode ? { debugName: "duration" } : /* istanbul ignore next */ {},
|
|
13
|
+
transform: numberAttribute
|
|
14
|
+
});
|
|
15
|
+
isAnimated = input(true, {
|
|
16
|
+
...ngDevMode ? { debugName: "isAnimated" } : /* istanbul ignore next */ {},
|
|
17
|
+
transform: booleanAttribute
|
|
18
|
+
});
|
|
19
|
+
host = inject(ElementRef).nativeElement;
|
|
20
|
+
document = inject(DOCUMENT);
|
|
21
|
+
zone = inject(NgZone);
|
|
22
|
+
svg = signal(void 0, ...ngDevMode ? [{ debugName: "svg" }] : /* istanbul ignore next */ []);
|
|
23
|
+
mounted;
|
|
24
|
+
constructor() {
|
|
25
|
+
effect(() => {
|
|
26
|
+
const svg = renderIcon(this.icon(), this.size(), this.document);
|
|
27
|
+
while (this.host.firstChild) this.host.removeChild(this.host.firstChild);
|
|
28
|
+
this.host.appendChild(svg);
|
|
29
|
+
this.svg.set(svg);
|
|
30
|
+
});
|
|
31
|
+
afterRenderEffect((onCleanup) => {
|
|
32
|
+
const svg = this.svg();
|
|
33
|
+
if (!svg) return;
|
|
34
|
+
const icon = this.icon();
|
|
35
|
+
const options = {
|
|
36
|
+
duration: this.duration(),
|
|
37
|
+
isAnimated: this.isAnimated()
|
|
38
|
+
};
|
|
39
|
+
const mounted = this.zone.runOutsideAngular(() => attachIcon(this.host, svg, icon, options));
|
|
40
|
+
this.mounted = mounted;
|
|
41
|
+
onCleanup(() => {
|
|
42
|
+
mounted.destroy();
|
|
43
|
+
if (this.mounted === mounted) this.mounted = void 0;
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
startAnimation() {
|
|
48
|
+
this.zone.runOutsideAngular(() => this.mounted?.startAnimation());
|
|
49
|
+
}
|
|
50
|
+
stopAnimation() {
|
|
51
|
+
this.zone.runOutsideAngular(() => this.mounted?.stopAnimation());
|
|
52
|
+
}
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
54
|
+
minVersion: "12.0.0",
|
|
55
|
+
version: "22.2.3",
|
|
56
|
+
ngImport: i0,
|
|
57
|
+
type: AnimateIcons,
|
|
58
|
+
deps: [],
|
|
59
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
60
|
+
});
|
|
61
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
62
|
+
minVersion: "17.1.0",
|
|
63
|
+
version: "22.2.3",
|
|
64
|
+
type: AnimateIcons,
|
|
65
|
+
isStandalone: true,
|
|
66
|
+
selector: "animate-icons",
|
|
67
|
+
inputs: {
|
|
68
|
+
icon: {
|
|
69
|
+
classPropertyName: "icon",
|
|
70
|
+
publicName: "icon",
|
|
71
|
+
isSignal: true,
|
|
72
|
+
isRequired: true,
|
|
73
|
+
transformFunction: null
|
|
74
|
+
},
|
|
75
|
+
size: {
|
|
76
|
+
classPropertyName: "size",
|
|
77
|
+
publicName: "size",
|
|
78
|
+
isSignal: true,
|
|
79
|
+
isRequired: false,
|
|
80
|
+
transformFunction: null
|
|
81
|
+
},
|
|
82
|
+
color: {
|
|
83
|
+
classPropertyName: "color",
|
|
84
|
+
publicName: "color",
|
|
85
|
+
isSignal: true,
|
|
86
|
+
isRequired: false,
|
|
87
|
+
transformFunction: null
|
|
88
|
+
},
|
|
89
|
+
duration: {
|
|
90
|
+
classPropertyName: "duration",
|
|
91
|
+
publicName: "duration",
|
|
92
|
+
isSignal: true,
|
|
93
|
+
isRequired: false,
|
|
94
|
+
transformFunction: null
|
|
95
|
+
},
|
|
96
|
+
isAnimated: {
|
|
97
|
+
classPropertyName: "isAnimated",
|
|
98
|
+
publicName: "isAnimated",
|
|
99
|
+
isSignal: true,
|
|
100
|
+
isRequired: false,
|
|
101
|
+
transformFunction: null
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
host: {
|
|
105
|
+
attributes: { "ngSkipHydration": "true" },
|
|
106
|
+
properties: {
|
|
107
|
+
"style.position": "'relative'",
|
|
108
|
+
"style.display": "'inline-flex'",
|
|
109
|
+
"style.color": "color()"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
ngImport: i0,
|
|
113
|
+
template: "",
|
|
114
|
+
isInline: true,
|
|
115
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
119
|
+
minVersion: "12.0.0",
|
|
120
|
+
version: "22.2.3",
|
|
121
|
+
ngImport: i0,
|
|
122
|
+
type: AnimateIcons,
|
|
123
|
+
decorators: [{
|
|
124
|
+
type: Component,
|
|
125
|
+
args: [{
|
|
126
|
+
selector: "animate-icons",
|
|
127
|
+
template: "",
|
|
128
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
129
|
+
host: {
|
|
130
|
+
ngSkipHydration: "true",
|
|
131
|
+
"[style.position]": "'relative'",
|
|
132
|
+
"[style.display]": "'inline-flex'",
|
|
133
|
+
"[style.color]": "color()"
|
|
134
|
+
}
|
|
135
|
+
}]
|
|
136
|
+
}],
|
|
137
|
+
ctorParameters: () => [],
|
|
138
|
+
propDecorators: {
|
|
139
|
+
icon: [{
|
|
140
|
+
type: i0.Input,
|
|
141
|
+
args: [{
|
|
142
|
+
isSignal: true,
|
|
143
|
+
alias: "icon",
|
|
144
|
+
required: true
|
|
145
|
+
}]
|
|
146
|
+
}],
|
|
147
|
+
size: [{
|
|
148
|
+
type: i0.Input,
|
|
149
|
+
args: [{
|
|
150
|
+
isSignal: true,
|
|
151
|
+
alias: "size",
|
|
152
|
+
required: false
|
|
153
|
+
}]
|
|
154
|
+
}],
|
|
155
|
+
color: [{
|
|
156
|
+
type: i0.Input,
|
|
157
|
+
args: [{
|
|
158
|
+
isSignal: true,
|
|
159
|
+
alias: "color",
|
|
160
|
+
required: false
|
|
161
|
+
}]
|
|
162
|
+
}],
|
|
163
|
+
duration: [{
|
|
164
|
+
type: i0.Input,
|
|
165
|
+
args: [{
|
|
166
|
+
isSignal: true,
|
|
167
|
+
alias: "duration",
|
|
168
|
+
required: false
|
|
169
|
+
}]
|
|
170
|
+
}],
|
|
171
|
+
isAnimated: [{
|
|
172
|
+
type: i0.Input,
|
|
173
|
+
args: [{
|
|
174
|
+
isSignal: true,
|
|
175
|
+
alias: "isAnimated",
|
|
176
|
+
required: false
|
|
177
|
+
}]
|
|
178
|
+
}]
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
export { AnimateIcons };
|
|
182
|
+
|
|
183
|
+
//# sourceMappingURL=animateicons-angular.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animateicons-angular.mjs","names":[],"sources":["../../src/animate-icons.ts"],"sourcesContent":["import {\n\tafterRenderEffect,\n\tbooleanAttribute,\n\tChangeDetectionStrategy,\n\tComponent,\n\tDOCUMENT,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tNgZone,\n\tnumberAttribute,\n\tsignal,\n} from \"@angular/core\";\nimport {\n\tattachIcon,\n\trenderIcon,\n\ttype IconControls,\n\ttype IconData,\n\ttype MountedIcon,\n} from \"@animateicons/vanilla\";\n\n@Component({\n\tselector: \"animate-icons\",\n\ttemplate: \"\",\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tngSkipHydration: \"true\",\n\t\t\"[style.position]\": \"'relative'\",\n\t\t\"[style.display]\": \"'inline-flex'\",\n\t\t\"[style.color]\": \"color()\",\n\t},\n})\nexport class AnimateIcons implements IconControls {\n\treadonly icon = input.required<IconData>();\n\treadonly size = input(24, { transform: numberAttribute });\n\treadonly color = input<string>();\n\treadonly duration = input(1, { transform: numberAttribute });\n\treadonly isAnimated = input(true, { transform: booleanAttribute });\n\n\tprivate readonly host: HTMLElement = inject(ElementRef).nativeElement;\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly zone = inject(NgZone);\n\tprivate readonly svg = signal<SVGSVGElement | undefined>(undefined);\n\tprivate mounted: MountedIcon | undefined;\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tconst svg = renderIcon(this.icon(), this.size(), this.document);\n\t\t\twhile (this.host.firstChild) this.host.removeChild(this.host.firstChild);\n\t\t\tthis.host.appendChild(svg);\n\t\t\tthis.svg.set(svg);\n\t\t});\n\n\t\tafterRenderEffect((onCleanup) => {\n\t\t\tconst svg = this.svg();\n\t\t\tif (!svg) return;\n\t\t\tconst icon = this.icon();\n\t\t\tconst options = {\n\t\t\t\tduration: this.duration(),\n\t\t\t\tisAnimated: this.isAnimated(),\n\t\t\t};\n\t\t\tconst mounted = this.zone.runOutsideAngular(() =>\n\t\t\t\tattachIcon(this.host, svg, icon, options),\n\t\t\t);\n\t\t\tthis.mounted = mounted;\n\t\t\tonCleanup(() => {\n\t\t\t\tmounted.destroy();\n\t\t\t\tif (this.mounted === mounted) this.mounted = undefined;\n\t\t\t});\n\t\t});\n\t}\n\n\tstartAnimation() {\n\t\tthis.zone.runOutsideAngular(() => this.mounted?.startAnimation());\n\t}\n\n\tstopAnimation() {\n\t\tthis.zone.runOutsideAngular(() => this.mounted?.stopAnimation());\n\t}\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,57 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
"name": "@animateicons/angular",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Animated SVG icons for Angular. One standalone component with signal inputs, server rendering and zoneless support, with the same motion as @animateicons/react.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Avijit Dey",
|
|
7
|
+
"homepage": "https://animateicons.in",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/Avijit07x/animateicons.git",
|
|
11
|
+
"directory": "angular"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/Avijit07x/animateicons/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"icons",
|
|
18
|
+
"animated icons",
|
|
19
|
+
"animated svg",
|
|
20
|
+
"angular icons",
|
|
21
|
+
"angular",
|
|
22
|
+
"standalone component",
|
|
23
|
+
"motion icons",
|
|
24
|
+
"svg icons",
|
|
25
|
+
"lucide animated",
|
|
26
|
+
"huge animated",
|
|
27
|
+
"free animated icons"
|
|
28
|
+
],
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@angular/core": "^20.0.0 || ^21.0.0 || ^22.0.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@animateicons/vanilla": "^0.2.0",
|
|
35
|
+
"tslib": "^2.8.1"
|
|
36
|
+
},
|
|
37
|
+
"module": "fesm2022/animateicons-angular.mjs",
|
|
38
|
+
"typings": "types/animateicons-angular.d.ts",
|
|
39
|
+
"exports": {
|
|
40
|
+
"./package.json": {
|
|
41
|
+
"default": "./package.json"
|
|
42
|
+
},
|
|
43
|
+
".": {
|
|
44
|
+
"types": "./types/animateicons-angular.d.ts",
|
|
45
|
+
"default": "./fesm2022/animateicons-angular.mjs"
|
|
46
|
+
},
|
|
47
|
+
"./huge": {
|
|
48
|
+
"types": "./types/animateicons-angular-huge.d.ts",
|
|
49
|
+
"default": "./fesm2022/animateicons-angular-huge.mjs"
|
|
50
|
+
},
|
|
51
|
+
"./lucide": {
|
|
52
|
+
"types": "./types/animateicons-angular-lucide.d.ts",
|
|
53
|
+
"default": "./fesm2022/animateicons-angular-lucide.mjs"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"type": "module"
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@animateicons/vanilla/huge";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@animateicons/vanilla/lucide";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { IconControls, IconControls as IconControls$1, IconData, IconData as IconData$1, IconLibrary, IconOptions } from "@animateicons/vanilla";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class AnimateIcons implements IconControls$1 {
|
|
4
|
+
readonly icon: import("@angular/core").InputSignal<IconData$1>;
|
|
5
|
+
readonly size: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
6
|
+
readonly color: import("@angular/core").InputSignal<string | undefined>;
|
|
7
|
+
readonly duration: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
8
|
+
readonly isAnimated: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
9
|
+
private readonly host;
|
|
10
|
+
private readonly document;
|
|
11
|
+
private readonly zone;
|
|
12
|
+
private readonly svg;
|
|
13
|
+
private mounted;
|
|
14
|
+
constructor();
|
|
15
|
+
startAnimation(): void;
|
|
16
|
+
stopAnimation(): void;
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AnimateIcons, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AnimateIcons, "animate-icons", never, {
|
|
19
|
+
"icon": {
|
|
20
|
+
"alias": "icon";
|
|
21
|
+
"required": true;
|
|
22
|
+
"isSignal": true;
|
|
23
|
+
};
|
|
24
|
+
"size": {
|
|
25
|
+
"alias": "size";
|
|
26
|
+
"required": false;
|
|
27
|
+
"isSignal": true;
|
|
28
|
+
};
|
|
29
|
+
"color": {
|
|
30
|
+
"alias": "color";
|
|
31
|
+
"required": false;
|
|
32
|
+
"isSignal": true;
|
|
33
|
+
};
|
|
34
|
+
"duration": {
|
|
35
|
+
"alias": "duration";
|
|
36
|
+
"required": false;
|
|
37
|
+
"isSignal": true;
|
|
38
|
+
};
|
|
39
|
+
"isAnimated": {
|
|
40
|
+
"alias": "isAnimated";
|
|
41
|
+
"required": false;
|
|
42
|
+
"isSignal": true;
|
|
43
|
+
};
|
|
44
|
+
}, {}, never, never, true, never>;
|
|
45
|
+
}
|
|
46
|
+
export type { IconControls, IconData, IconLibrary, IconOptions };
|