@hugeicons/angular 1.0.10 → 1.0.12
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 +13 -0
- package/README.md +8 -8
- package/dist/README.md +8 -8
- package/dist/components/hugeicons-icon.component.d.ts +21 -5
- package/dist/components/svg-children.directive.d.ts +22 -0
- package/dist/esm2022/components/hugeicons-icon.component.mjs +81 -55
- package/dist/esm2022/components/svg-children.directive.mjs +44 -0
- package/dist/esm2022/lib/svg-attributes.mjs +67 -0
- package/dist/esm2022/lib/types.mjs +1 -1
- package/dist/fesm2022/hugeicons-angular.mjs +187 -54
- package/dist/fesm2022/hugeicons-angular.mjs.map +1 -1
- package/dist/lib/svg-attributes.d.ts +16 -0
- package/dist/lib/types.d.ts +3 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
# @hugeicons/angular
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## 1.0.12
|
|
5
|
+
|
|
6
|
+
### Patch Changes
|
|
7
|
+
|
|
8
|
+
- Fixed icons rendering incompletely: every icon element is now rendered with its real tag (`circle`, `ellipse`, `rect`, … — previously all were drawn as `<path>`, e.g. `User02Icon` had no head) ([#35](https://github.com/hugeicons/hugeicons/issues/35))
|
|
9
|
+
- All icon attributes are now applied (`stroke-linecap`, `stroke-linejoin`, `clip-rule`, `transform`, …); stroke icons no longer render blank without a `strokeWidth` input
|
|
10
|
+
- Rendering is generic, like `@hugeicons/react`: any SVG element and attribute in the icon data is supported, with React's attribute naming (`strokeWidth` → `stroke-width`, `gradientTransform` kept, `xlinkHref` → `xlink:href`)
|
|
11
|
+
- Added `primaryColor`, `secondaryColor` and `disableSecondaryOpacity` inputs for bulk/duotone icons, matching `@hugeicons/react`
|
|
12
|
+
- Binding `undefined` to `size` or `color` now falls back to the defaults (24, `currentColor`), as in React
|
|
13
|
+
- Secondary (opacity) layers are now drawn first, the same order as `@hugeicons/react`; DOM order changes for bulk/duotone/twotone icons (update DOM snapshots if you have them)
|
|
14
|
+
- Verified pixel- and DOM-identical to `@hugeicons/react` for every icon in all 11 packages; works with SSR and hydration on Angular 17.1+
|
|
15
|
+
|
|
16
|
+
|
|
4
17
|
## 1.0.9
|
|
5
18
|
|
|
6
19
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -6,18 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
## What is Hugeicons?
|
|
8
8
|
|
|
9
|
-
Hugeicons is a large icon set for modern web and mobile apps. The free package includes
|
|
9
|
+
Hugeicons is a large icon set for modern web and mobile apps. The free package includes 6,000+ Stroke Rounded icons. The Pro package provides 60,000+ icons across 10 styles.
|
|
10
10
|
|
|
11
11
|
## How It Works
|
|
12
12
|
|
|
13
13
|
This package (`@hugeicons/angular`) is a **rendering library** - it provides the `HugeiconsIconComponent` that displays icons in your Angular app. The icons themselves come from separate icon packages:
|
|
14
14
|
|
|
15
|
-
- **Free icons**: `@hugeicons/core-free-icons` (
|
|
16
|
-
- **Pro icons**: `@hugeicons-pro/core-*` packages (
|
|
15
|
+
- **Free icons**: `@hugeicons/core-free-icons` (6,000+ icons)
|
|
16
|
+
- **Pro icons**: `@hugeicons-pro/core-*` packages (60,000+ icons, requires license)
|
|
17
17
|
|
|
18
18
|
### Key Highlights
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
19
|
+
- **6,000+ Free Icons**: Stroke Rounded set for unlimited personal and commercial projects
|
|
20
|
+
- **60,000+ Pro Icons, 10 Styles**: Stroke, Solid, Bulk, Duotone, and Twotone families for sharp, rounded, and standard needs with richer variants
|
|
21
21
|
- **Pixel Perfect Grid**: Built on a 24x24 grid for crisp rendering at any size
|
|
22
22
|
- **Customizable**: Easily adjust colors, sizes, and styles to match your design needs
|
|
23
23
|
- **Tree Shaking Ready**: Named exports keep bundles lean in modern bundlers
|
|
@@ -213,7 +213,7 @@ The library supports all modern browsers.
|
|
|
213
213
|
|
|
214
214
|
## Pro Version
|
|
215
215
|
|
|
216
|
-
> **Want access to
|
|
216
|
+
> **Want access to 60,000+ icons and 10 unique styles?**
|
|
217
217
|
> Check out our [Pro Version](https://hugeicons.com/pricing) and visit our [docs](https://hugeicons.com/docs) for detailed documentation.
|
|
218
218
|
|
|
219
219
|
### Available Pro Styles
|
|
@@ -238,8 +238,8 @@ The code in this package (`@hugeicons/angular`) is licensed under the MIT Licens
|
|
|
238
238
|
This package only provides rendering utilities. It does not include or grant any rights to Hugeicons icon assets. Using Pro icon styles requires a valid Hugeicons Pro license.
|
|
239
239
|
|
|
240
240
|
Hugeicons icon packs are licensed separately:
|
|
241
|
-
- **Free icon packs
|
|
242
|
-
- **Pro icon packs (`@hugeicons-pro/*`)**: require a paid Hugeicons Pro license and are governed by the Hugeicons
|
|
241
|
+
- **Free icon packs** (`@hugeicons/core-free-icons`): MIT License. The `LICENSE.md` ships in the package.
|
|
242
|
+
- **Pro icon packs (`@hugeicons-pro/*`)**: require a paid Hugeicons Pro license and are governed by the [Hugeicons License Agreement](https://hugeicons.com/license-agreement) (summary in the package's `PRO-LICENSE.md`).
|
|
243
243
|
|
|
244
244
|
|
|
245
245
|
## Related
|
package/dist/README.md
CHANGED
|
@@ -6,18 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
## What is Hugeicons?
|
|
8
8
|
|
|
9
|
-
Hugeicons is a large icon set for modern web and mobile apps. The free package includes
|
|
9
|
+
Hugeicons is a large icon set for modern web and mobile apps. The free package includes 6,000+ Stroke Rounded icons. The Pro package provides 60,000+ icons across 10 styles.
|
|
10
10
|
|
|
11
11
|
## How It Works
|
|
12
12
|
|
|
13
13
|
This package (`@hugeicons/angular`) is a **rendering library** - it provides the `HugeiconsIconComponent` that displays icons in your Angular app. The icons themselves come from separate icon packages:
|
|
14
14
|
|
|
15
|
-
- **Free icons**: `@hugeicons/core-free-icons` (
|
|
16
|
-
- **Pro icons**: `@hugeicons-pro/core-*` packages (
|
|
15
|
+
- **Free icons**: `@hugeicons/core-free-icons` (6,000+ icons)
|
|
16
|
+
- **Pro icons**: `@hugeicons-pro/core-*` packages (60,000+ icons, requires license)
|
|
17
17
|
|
|
18
18
|
### Key Highlights
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
19
|
+
- **6,000+ Free Icons**: Stroke Rounded set for unlimited personal and commercial projects
|
|
20
|
+
- **60,000+ Pro Icons, 10 Styles**: Stroke, Solid, Bulk, Duotone, and Twotone families for sharp, rounded, and standard needs with richer variants
|
|
21
21
|
- **Pixel Perfect Grid**: Built on a 24x24 grid for crisp rendering at any size
|
|
22
22
|
- **Customizable**: Easily adjust colors, sizes, and styles to match your design needs
|
|
23
23
|
- **Tree Shaking Ready**: Named exports keep bundles lean in modern bundlers
|
|
@@ -213,7 +213,7 @@ The library supports all modern browsers.
|
|
|
213
213
|
|
|
214
214
|
## Pro Version
|
|
215
215
|
|
|
216
|
-
> **Want access to
|
|
216
|
+
> **Want access to 60,000+ icons and 10 unique styles?**
|
|
217
217
|
> Check out our [Pro Version](https://hugeicons.com/pricing) and visit our [docs](https://hugeicons.com/docs) for detailed documentation.
|
|
218
218
|
|
|
219
219
|
### Available Pro Styles
|
|
@@ -238,8 +238,8 @@ The code in this package (`@hugeicons/angular`) is licensed under the MIT Licens
|
|
|
238
238
|
This package only provides rendering utilities. It does not include or grant any rights to Hugeicons icon assets. Using Pro icon styles requires a valid Hugeicons Pro license.
|
|
239
239
|
|
|
240
240
|
Hugeicons icon packs are licensed separately:
|
|
241
|
-
- **Free icon packs
|
|
242
|
-
- **Pro icon packs (`@hugeicons-pro/*`)**: require a paid Hugeicons Pro license and are governed by the Hugeicons
|
|
241
|
+
- **Free icon packs** (`@hugeicons/core-free-icons`): MIT License. The `LICENSE.md` ships in the package.
|
|
242
|
+
- **Pro icon packs (`@hugeicons-pro/*`)**: require a paid Hugeicons Pro license and are governed by the [Hugeicons License Agreement](https://hugeicons.com/license-agreement) (summary in the package's `PRO-LICENSE.md`).
|
|
243
243
|
|
|
244
244
|
|
|
245
245
|
## Related
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { IconSvgObject } from
|
|
1
|
+
import { IconSvgObject } from "../lib/types";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* One SVG child of an icon: the icon data's props (React-style camelCase names)
|
|
5
|
+
* plus `tag`, the element name. The named fields are the ones 1.0.11 exposed.
|
|
6
|
+
*/
|
|
3
7
|
interface PathData {
|
|
4
|
-
|
|
5
|
-
|
|
8
|
+
tag: string;
|
|
9
|
+
d?: string;
|
|
10
|
+
fill?: string;
|
|
6
11
|
opacity?: string;
|
|
7
12
|
fillRule?: string;
|
|
8
13
|
stroke?: string;
|
|
9
|
-
strokeWidth?: number;
|
|
14
|
+
strokeWidth?: number | string;
|
|
15
|
+
[prop: string]: unknown;
|
|
10
16
|
}
|
|
11
17
|
export declare class HugeiconsIconComponent {
|
|
12
18
|
readonly size: import("@angular/core").InputSignal<string | number>;
|
|
@@ -17,8 +23,18 @@ export declare class HugeiconsIconComponent {
|
|
|
17
23
|
readonly color: import("@angular/core").InputSignal<string>;
|
|
18
24
|
readonly iconClass: import("@angular/core").InputSignal<string>;
|
|
19
25
|
readonly showAlt: import("@angular/core").InputSignal<boolean>;
|
|
26
|
+
readonly primaryColor: import("@angular/core").InputSignal<string>;
|
|
27
|
+
readonly secondaryColor: import("@angular/core").InputSignal<string>;
|
|
28
|
+
readonly disableSecondaryOpacity: import("@angular/core").InputSignal<boolean>;
|
|
29
|
+
readonly resolvedSize: import("@angular/core").Signal<string | number>;
|
|
30
|
+
readonly mainColor: import("@angular/core").Signal<string>;
|
|
31
|
+
/** Stroke width/color forced by the strokeWidth input, applied to the svg and every child. */
|
|
32
|
+
readonly strokeOverride: import("@angular/core").Signal<{
|
|
33
|
+
strokeWidth: number;
|
|
34
|
+
stroke: string;
|
|
35
|
+
}>;
|
|
20
36
|
readonly paths: import("@angular/core").Signal<PathData[]>;
|
|
21
37
|
static ɵfac: i0.ɵɵFactoryDeclaration<HugeiconsIconComponent, never>;
|
|
22
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<HugeiconsIconComponent, "hugeicons-icon", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "absoluteStrokeWidth": { "alias": "absoluteStrokeWidth"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "altIcon": { "alias": "altIcon"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "iconClass": { "alias": "class"; "required": false; "isSignal": true; }; "showAlt": { "alias": "showAlt"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
38
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HugeiconsIconComponent, "hugeicons-icon", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "absoluteStrokeWidth": { "alias": "absoluteStrokeWidth"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "altIcon": { "alias": "altIcon"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "iconClass": { "alias": "class"; "required": false; "isSignal": true; }; "showAlt": { "alias": "showAlt"; "required": false; "isSignal": true; }; "primaryColor": { "alias": "primaryColor"; "required": false; "isSignal": true; }; "secondaryColor": { "alias": "secondaryColor"; "required": false; "isSignal": true; }; "disableSecondaryOpacity": { "alias": "disableSecondaryOpacity"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
23
39
|
}
|
|
24
40
|
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { OnChanges } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/** One icon child: an SVG tag name plus React-style props. */
|
|
4
|
+
export interface SvgChildNode {
|
|
5
|
+
tag: string;
|
|
6
|
+
[prop: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Renders icon children into the host <svg>, with any tag and any attribute, the way
|
|
10
|
+
* React's createElement does. A template can't bind a dynamic tag name, so the nodes
|
|
11
|
+
* are built through Renderer2. It runs in ngOnChanges, i.e. synchronously during
|
|
12
|
+
* change detection, so the icon is in the DOM right after detectChanges() and in
|
|
13
|
+
* server-rendered HTML. Any children already present (e.g. from SSR) are replaced.
|
|
14
|
+
*/
|
|
15
|
+
export declare class HugeiconsSvgChildrenDirective implements OnChanges {
|
|
16
|
+
hugeiconsSvgChildren: readonly SvgChildNode[];
|
|
17
|
+
private readonly host;
|
|
18
|
+
private readonly renderer;
|
|
19
|
+
ngOnChanges(): void;
|
|
20
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HugeiconsSvgChildrenDirective, never>;
|
|
21
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<HugeiconsSvgChildrenDirective, "svg[hugeiconsSvgChildren]", never, { "hugeiconsSvgChildren": { "alias": "hugeiconsSvgChildren"; "required": true; }; }, {}, never, never, true, never>;
|
|
22
|
+
}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import { Component, ChangeDetectionStrategy, computed, input } from
|
|
1
|
+
import { Component, ChangeDetectionStrategy, computed, input, } from "@angular/core";
|
|
2
|
+
import { HugeiconsSvgChildrenDirective } from "./svg-children.directive";
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* 1.0.11 wrote fill="none" on every child it rendered (always path, circle, ellipse or
|
|
6
|
+
* rect). Kept for those tags so CSS such as `svg { fill: ... }` behaves as before;
|
|
7
|
+
* any other tag is left untouched, like React.
|
|
8
|
+
*/
|
|
9
|
+
const LEGACY_FILL_NONE_TAGS = new Set(["path", "circle", "ellipse", "rect"]);
|
|
3
10
|
export class HugeiconsIconComponent {
|
|
4
11
|
// Signal inputs - modern Angular 17.1+ approach
|
|
5
12
|
size = input(24);
|
|
@@ -7,87 +14,106 @@ export class HugeiconsIconComponent {
|
|
|
7
14
|
absoluteStrokeWidth = input(false);
|
|
8
15
|
icon = input.required();
|
|
9
16
|
altIcon = input(undefined);
|
|
10
|
-
color = input(
|
|
11
|
-
iconClass = input(
|
|
17
|
+
color = input("currentColor");
|
|
18
|
+
iconClass = input("", { alias: "class" });
|
|
12
19
|
showAlt = input(false);
|
|
20
|
+
primaryColor = input(undefined);
|
|
21
|
+
secondaryColor = input(undefined);
|
|
22
|
+
disableSecondaryOpacity = input(false);
|
|
23
|
+
// Like React's default props: an explicitly bound `undefined` still falls back to the default
|
|
24
|
+
resolvedSize = computed(() => this.size() ?? 24);
|
|
25
|
+
mainColor = computed(() => this.primaryColor() || (this.color() ?? "currentColor"));
|
|
26
|
+
/** Stroke width/color forced by the strokeWidth input, applied to the svg and every child. */
|
|
27
|
+
strokeOverride = computed(() => {
|
|
28
|
+
const strokeWidthValue = this.strokeWidth();
|
|
29
|
+
if (strokeWidthValue === undefined) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
const strokeWidth = this.absoluteStrokeWidth()
|
|
33
|
+
? (Number(strokeWidthValue) * 24) / Number(this.resolvedSize())
|
|
34
|
+
: strokeWidthValue;
|
|
35
|
+
return { strokeWidth, stroke: "currentColor" };
|
|
36
|
+
});
|
|
13
37
|
// Computed signal for reactive path updates
|
|
14
38
|
paths = computed(() => {
|
|
15
39
|
const currentIcon = this.showAlt() && this.altIcon() ? this.altIcon() : this.icon();
|
|
16
40
|
if (!currentIcon || !Array.isArray(currentIcon)) {
|
|
17
41
|
return [];
|
|
18
42
|
}
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
43
|
+
const strokeOverride = this.strokeOverride();
|
|
44
|
+
const mainColor = this.mainColor();
|
|
45
|
+
const secondaryColor = this.secondaryColor();
|
|
46
|
+
const disableSecondaryOpacity = this.disableSecondaryOpacity();
|
|
47
|
+
// Same ordering as @hugeicons/react: secondary (opacity) layers first
|
|
48
|
+
return [...currentIcon]
|
|
49
|
+
.sort(([, a], [, b]) => {
|
|
50
|
+
const hasOpacityA = a["opacity"] !== undefined;
|
|
51
|
+
const hasOpacityB = b["opacity"] !== undefined;
|
|
52
|
+
return hasOpacityB ? 1 : hasOpacityA ? -1 : 0;
|
|
53
|
+
})
|
|
54
|
+
.map(([tag, rawAttrs]) => {
|
|
55
|
+
const attrs = rawAttrs;
|
|
56
|
+
const isSecondary = attrs["opacity"] !== undefined;
|
|
57
|
+
const colorProps = secondaryColor
|
|
58
|
+
? {
|
|
59
|
+
[attrs["stroke"] !== undefined ? "stroke" : "fill"]: isSecondary
|
|
60
|
+
? secondaryColor
|
|
61
|
+
: mainColor,
|
|
62
|
+
}
|
|
63
|
+
: {};
|
|
64
|
+
return {
|
|
65
|
+
...attrs,
|
|
66
|
+
tag,
|
|
67
|
+
fill: attrs["fill"] ||
|
|
68
|
+
(LEGACY_FILL_NONE_TAGS.has(tag) ? "none" : undefined),
|
|
69
|
+
...strokeOverride,
|
|
70
|
+
...colorProps,
|
|
71
|
+
opacity: isSecondary && !disableSecondaryOpacity
|
|
72
|
+
? attrs["opacity"]
|
|
73
|
+
: undefined,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
35
76
|
});
|
|
36
77
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
37
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
78
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.12", type: HugeiconsIconComponent, isStandalone: true, selector: "hugeicons-icon", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, absoluteStrokeWidth: { classPropertyName: "absoluteStrokeWidth", publicName: "absoluteStrokeWidth", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, altIcon: { classPropertyName: "altIcon", publicName: "altIcon", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, iconClass: { classPropertyName: "iconClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, showAlt: { classPropertyName: "showAlt", publicName: "showAlt", isSignal: true, isRequired: false, transformFunction: null }, primaryColor: { classPropertyName: "primaryColor", publicName: "primaryColor", isSignal: true, isRequired: false, transformFunction: null }, secondaryColor: { classPropertyName: "secondaryColor", publicName: "secondaryColor", isSignal: true, isRequired: false, transformFunction: null }, disableSecondaryOpacity: { classPropertyName: "disableSecondaryOpacity", publicName: "disableSecondaryOpacity", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: inline-flex; align-items: center; justify-content: center;" }, ngImport: i0, template: `
|
|
38
79
|
<svg
|
|
39
|
-
[attr.width]="
|
|
40
|
-
[attr.height]="
|
|
80
|
+
[attr.width]="resolvedSize()"
|
|
81
|
+
[attr.height]="resolvedSize()"
|
|
41
82
|
viewBox="0 0 24 24"
|
|
42
83
|
fill="none"
|
|
43
|
-
[attr.color]="
|
|
84
|
+
[attr.color]="mainColor()"
|
|
85
|
+
[attr.stroke]="strokeOverride()?.stroke"
|
|
86
|
+
[attr.stroke-width]="strokeOverride()?.strokeWidth"
|
|
44
87
|
[class]="iconClass()"
|
|
45
88
|
xmlns="http://www.w3.org/2000/svg"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
[attr.d]="path.d"
|
|
50
|
-
[attr.fill]="path.fill"
|
|
51
|
-
[attr.opacity]="path.opacity"
|
|
52
|
-
[attr.fill-rule]="path.fillRule"
|
|
53
|
-
[attr.stroke]="path.stroke"
|
|
54
|
-
[attr.stroke-width]="path.strokeWidth"
|
|
55
|
-
/>
|
|
56
|
-
}
|
|
57
|
-
</svg>
|
|
58
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
89
|
+
[hugeiconsSvgChildren]="paths()"
|
|
90
|
+
></svg>
|
|
91
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: HugeiconsSvgChildrenDirective, selector: "svg[hugeiconsSvgChildren]", inputs: ["hugeiconsSvgChildren"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
59
92
|
}
|
|
60
93
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsIconComponent, decorators: [{
|
|
61
94
|
type: Component,
|
|
62
95
|
args: [{
|
|
63
|
-
selector:
|
|
96
|
+
selector: "hugeicons-icon",
|
|
64
97
|
standalone: true,
|
|
98
|
+
imports: [HugeiconsSvgChildrenDirective],
|
|
65
99
|
template: `
|
|
66
100
|
<svg
|
|
67
|
-
[attr.width]="
|
|
68
|
-
[attr.height]="
|
|
101
|
+
[attr.width]="resolvedSize()"
|
|
102
|
+
[attr.height]="resolvedSize()"
|
|
69
103
|
viewBox="0 0 24 24"
|
|
70
104
|
fill="none"
|
|
71
|
-
[attr.color]="
|
|
105
|
+
[attr.color]="mainColor()"
|
|
106
|
+
[attr.stroke]="strokeOverride()?.stroke"
|
|
107
|
+
[attr.stroke-width]="strokeOverride()?.strokeWidth"
|
|
72
108
|
[class]="iconClass()"
|
|
73
109
|
xmlns="http://www.w3.org/2000/svg"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
<path
|
|
77
|
-
[attr.d]="path.d"
|
|
78
|
-
[attr.fill]="path.fill"
|
|
79
|
-
[attr.opacity]="path.opacity"
|
|
80
|
-
[attr.fill-rule]="path.fillRule"
|
|
81
|
-
[attr.stroke]="path.stroke"
|
|
82
|
-
[attr.stroke-width]="path.strokeWidth"
|
|
83
|
-
/>
|
|
84
|
-
}
|
|
85
|
-
</svg>
|
|
110
|
+
[hugeiconsSvgChildren]="paths()"
|
|
111
|
+
></svg>
|
|
86
112
|
`,
|
|
87
113
|
host: {
|
|
88
|
-
style:
|
|
114
|
+
style: "display: inline-flex; align-items: center; justify-content: center;",
|
|
89
115
|
},
|
|
90
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
116
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
91
117
|
}]
|
|
92
118
|
}] });
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVnZWljb25zLWljb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaHVnZWljb25zLWljb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUEwQ3BGLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsZ0RBQWdEO0lBQ3ZDLElBQUksR0FBRyxLQUFLLENBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLFdBQVcsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELG1CQUFtQixHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBaUIsQ0FBQztJQUN2QyxPQUFPLEdBQUcsS0FBSyxDQUE0QixTQUFTLENBQUMsQ0FBQztJQUN0RCxLQUFLLEdBQUcsS0FBSyxDQUFTLGNBQWMsQ0FBQyxDQUFDO0lBQ3RDLFNBQVMsR0FBRyxLQUFLLENBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEQsT0FBTyxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV6Qyw0Q0FBNEM7SUFDbkMsS0FBSyxHQUFHLFFBQVEsQ0FBYSxHQUFHLEVBQUU7UUFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFckYsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDL0MsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVDLE1BQU0scUJBQXFCLEdBQUcsZ0JBQWdCLEtBQUssU0FBUztZQUMxRCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3pCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN2QixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsTUFBTSxXQUFXLEdBQUcscUJBQXFCLEtBQUssU0FBUztZQUNyRCxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRTtZQUNoRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU07WUFDN0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDekIsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDM0IsR0FBRyxXQUFXO1NBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQzt3R0FyQ1Esc0JBQXNCOzRGQUF0QixzQkFBc0IsZ3NDQTNCdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVDs7NEZBTVUsc0JBQXNCO2tCQTlCbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQ7b0JBQ0QsSUFBSSxFQUFFO3dCQUNKLEtBQUssRUFBRSxxRUFBcUU7cUJBQzdFO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIGNvbXB1dGVkLCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWNvblN2Z09iamVjdCB9IGZyb20gJy4uL2xpYi90eXBlcyc7XG5cbmludGVyZmFjZSBQYXRoRGF0YSB7XG4gIGQ6IHN0cmluZztcbiAgZmlsbDogc3RyaW5nO1xuICBvcGFjaXR5Pzogc3RyaW5nO1xuICBmaWxsUnVsZT86IHN0cmluZztcbiAgc3Ryb2tlPzogc3RyaW5nO1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaHVnZWljb25zLWljb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzdmdcbiAgICAgIFthdHRyLndpZHRoXT1cInNpemUoKVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwic2l6ZSgpXCJcbiAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgW2F0dHIuY29sb3JdPVwiY29sb3IoKVwiXG4gICAgICBbY2xhc3NdPVwiaWNvbkNsYXNzKClcIlxuICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgPlxuICAgICAgQGZvciAocGF0aCBvZiBwYXRocygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBbYXR0ci5kXT1cInBhdGguZFwiXG4gICAgICAgICAgW2F0dHIuZmlsbF09XCJwYXRoLmZpbGxcIlxuICAgICAgICAgIFthdHRyLm9wYWNpdHldPVwicGF0aC5vcGFjaXR5XCJcbiAgICAgICAgICBbYXR0ci5maWxsLXJ1bGVdPVwicGF0aC5maWxsUnVsZVwiXG4gICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInBhdGguc3Ryb2tlXCJcbiAgICAgICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwicGF0aC5zdHJva2VXaWR0aFwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgPC9zdmc+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICBzdHlsZTogJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnXG4gIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEh1Z2VpY29uc0ljb25Db21wb25lbnQge1xuICAvLyBTaWduYWwgaW5wdXRzIC0gbW9kZXJuIEFuZ3VsYXIgMTcuMSsgYXBwcm9hY2hcbiAgcmVhZG9ubHkgc2l6ZSA9IGlucHV0PHN0cmluZyB8IG51bWJlcj4oMjQpO1xuICByZWFkb25seSBzdHJva2VXaWR0aCA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgYWJzb2x1dGVTdHJva2VXaWR0aCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaWNvbiA9IGlucHV0LnJlcXVpcmVkPEljb25TdmdPYmplY3Q+KCk7XG4gIHJlYWRvbmx5IGFsdEljb24gPSBpbnB1dDxJY29uU3ZnT2JqZWN0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBjb2xvciA9IGlucHV0PHN0cmluZz4oJ2N1cnJlbnRDb2xvcicpO1xuICByZWFkb25seSBpY29uQ2xhc3MgPSBpbnB1dDxzdHJpbmc+KCcnLCB7IGFsaWFzOiAnY2xhc3MnIH0pO1xuICByZWFkb25seSBzaG93QWx0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIENvbXB1dGVkIHNpZ25hbCBmb3IgcmVhY3RpdmUgcGF0aCB1cGRhdGVzXG4gIHJlYWRvbmx5IHBhdGhzID0gY29tcHV0ZWQ8UGF0aERhdGFbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRJY29uID0gdGhpcy5zaG93QWx0KCkgJiYgdGhpcy5hbHRJY29uKCkgPyB0aGlzLmFsdEljb24oKSEgOiB0aGlzLmljb24oKTtcblxuICAgIGlmICghY3VycmVudEljb24gfHwgIUFycmF5LmlzQXJyYXkoY3VycmVudEljb24pKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Ryb2tlV2lkdGhWYWx1ZSA9IHRoaXMuc3Ryb2tlV2lkdGgoKTtcbiAgICBjb25zdCBjYWxjdWxhdGVkU3Ryb2tlV2lkdGggPSBzdHJva2VXaWR0aFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgID8gKHRoaXMuYWJzb2x1dGVTdHJva2VXaWR0aCgpIFxuICAgICAgICAgID8gKE51bWJlcihzdHJva2VXaWR0aFZhbHVlKSAqIDI0KSAvIE51bWJlcih0aGlzLnNpemUoKSkgXG4gICAgICAgICAgOiBzdHJva2VXaWR0aFZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzdHJva2VQcm9wcyA9IGNhbGN1bGF0ZWRTdHJva2VXaWR0aCAhPT0gdW5kZWZpbmVkIFxuICAgICAgPyB7IHN0cm9rZVdpZHRoOiBjYWxjdWxhdGVkU3Ryb2tlV2lkdGgsIHN0cm9rZTogJ2N1cnJlbnRDb2xvcicgfSBcbiAgICAgIDoge307XG5cbiAgICByZXR1cm4gY3VycmVudEljb24ubWFwKChbXywgYXR0cnNdKSA9PiAoe1xuICAgICAgZDogYXR0cnNbJ2QnXSxcbiAgICAgIGZpbGw6IGF0dHJzWydmaWxsJ10gfHwgJ25vbmUnLFxuICAgICAgb3BhY2l0eTogYXR0cnNbJ29wYWNpdHknXSxcbiAgICAgIGZpbGxSdWxlOiBhdHRyc1snZmlsbFJ1bGUnXSxcbiAgICAgIC4uLnN0cm9rZVByb3BzXG4gICAgfSkpO1xuICB9KTtcbn0iXX0=
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVnZWljb25zLWljb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaHVnZWljb25zLWljb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLFFBQVEsRUFDUixLQUFLLEdBQ04sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBaUJ6RTs7OztHQUlHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUEwQjdFLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsZ0RBQWdEO0lBQ3ZDLElBQUksR0FBRyxLQUFLLENBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLFdBQVcsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELG1CQUFtQixHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBaUIsQ0FBQztJQUN2QyxPQUFPLEdBQUcsS0FBSyxDQUE0QixTQUFTLENBQUMsQ0FBQztJQUN0RCxLQUFLLEdBQUcsS0FBSyxDQUFTLGNBQWMsQ0FBQyxDQUFDO0lBQ3RDLFNBQVMsR0FBRyxLQUFLLENBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEQsT0FBTyxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNoQyxZQUFZLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUNwRCxjQUFjLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUN0RCx1QkFBdUIsR0FBRyxLQUFLLENBQVUsS0FBSyxD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UCxPQUFPO2dCQUNMLEdBQUcsS0FBSztnQkFDUixHQUFHO2dCQUNILElBQUksRUFDRCxLQUFLLENBQUMsTUFBTSxDQUF3QjtvQkFDckMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUN2RCxHQUFHLGNBQWM7Z0JBQ2pCLEdBQUcsVUFBVTtnQkFDYixPQUFPLEVBQ0wsV0FBVyxJQUFJLENBQUMsdUJBQXVCO29CQUNyQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDLFNBQVM7YUFDSixDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7d0dBOUVRLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDhvREFwQnZCOzs7Ozs7Ozs7Ozs7O0dBYVQsNERBZFMsNkJBQTZCOzs0RkFxQjVCLHNCQUFzQjtrQkF4QmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLDZCQUE2QixDQUFDO29CQUN4QyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7R0FhVDtvQkFDRCxJQUFJLEVBQUU7d0JBQ0osS0FBSyxFQUNILHFFQUFxRTtxQkFDeEU7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSWNvblN2Z09iamVjdCB9IGZyb20gXCIuLi9saWIvdHlwZXNcIjtcbmltcG9ydCB7IEh1Z2VpY29uc1N2Z0NoaWxkcmVuRGlyZWN0aXZlIH0gZnJvbSBcIi4vc3ZnLWNoaWxkcmVuLmRpcmVjdGl2ZVwiO1xuXG4vKipcbiAqIE9uZSBTVkcgY2hpbGQgb2YgYW4gaWNvbjogdGhlIGljb24gZGF0YSdzIHByb3BzIChSZWFjdC1zdHlsZSBjYW1lbENhc2UgbmFtZXMpXG4gKiBwbHVzIGB0YWdgLCB0aGUgZWxlbWVudCBuYW1lLiBUaGUgbmFtZWQgZmllbGRzIGFyZSB0aGUgb25lcyAxLjAuMTEgZXhwb3NlZC5cbiAqL1xuaW50ZXJmYWNlIFBhdGhEYXRhIHtcbiAgdGFnOiBzdHJpbmc7XG4gIGQ/OiBzdHJpbmc7XG4gIGZpbGw/OiBzdHJpbmc7XG4gIG9wYWNpdHk/OiBzdHJpbmc7XG4gIGZpbGxSdWxlPzogc3RyaW5nO1xuICBzdHJva2U/OiBzdHJpbmc7XG4gIHN0cm9rZVdpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICBbcHJvcDogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiAxLjAuMTEgd3JvdGUgZmlsbD1cIm5vbmVcIiBvbiBldmVyeSBjaGlsZCBpdCByZW5kZXJlZCAoYWx3YXlzIHBhdGgsIGNpcmNsZSwgZWxsaXBzZSBvclxuICogcmVjdCkuIEtlcHQgZm9yIHRob3NlIHRhZ3Mgc28gQ1NTIHN1Y2ggYXMgYHN2ZyB7IGZpbGw6IC4uLiB9YCBiZWhhdmVzIGFzIGJlZm9yZTtcbiAqIGFueSBvdGhlciB0YWcgaXMgbGVmdCB1bnRvdWNoZWQsIGxpa2UgUmVhY3QuXG4gKi9cbmNvbnN0IExFR0FDWV9GSUxMX05PTkVfVEFHUyA9IG5ldyBTZXQoW1wicGF0aFwiLCBcImNpcmNsZVwiLCBcImVsbGlwc2VcIiwgXCJyZWN0XCJdKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImh1Z2VpY29ucy1pY29uXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtIdWdlaWNvbnNTdmdDaGlsZHJlbkRpcmVjdGl2ZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2Z1xuICAgICAgW2F0dHIud2lkdGhdPVwicmVzb2x2ZWRTaXplKClcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlc29sdmVkU2l6ZSgpXCJcbiAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgW2F0dHIuY29sb3JdPVwibWFpbkNvbG9yKClcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cInN0cm9rZU92ZXJyaWRlKCk/LnN0cm9rZVwiXG4gICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwic3Ryb2tlT3ZlcnJpZGUoKT8uc3Ryb2tlV2lkdGhcIlxuICAgICAgW2NsYXNzXT1cImljb25DbGFzcygpXCJcbiAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgW2h1Z2VpY29uc1N2Z0NoaWxkcmVuXT1cInBhdGhzKClcIlxuICAgID48L3N2Zz5cbiAgYCxcbiAgaG9zdDoge1xuICAgIHN0eWxlOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIsXG4gIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBIdWdlaWNvbnNJY29uQ29tcG9uZW50IHtcbiAgLy8gU2lnbmFsIGlucHV0cyAtIG1vZGVybiBBbmd1bGFyIDE3LjErIGFwcHJvYWNoXG4gIHJlYWRvbmx5IHNpemUgPSBpbnB1dDxzdHJpbmcgfCBudW1iZXI+KDI0KTtcbiAgcmVhZG9ubHkgc3Ryb2tlV2lkdGggPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGFic29sdXRlU3Ryb2tlV2lkdGggPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGljb24gPSBpbnB1dC5yZXF1aXJlZDxJY29uU3ZnT2JqZWN0PigpO1xuICByZWFkb25seSBhbHRJY29uID0gaW5wdXQ8SWNvblN2Z09iamVjdCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgY29sb3IgPSBpbnB1dDxzdHJpbmc+KFwiY3VycmVudENvbG9yXCIpO1xuICByZWFkb25seSBpY29uQ2xhc3MgPSBpbnB1dDxzdHJpbmc+KFwiXCIsIHsgYWxpYXM6IFwiY2xhc3NcIiB9KTtcbiAgcmVhZG9ubHkgc2hvd0FsdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgcHJpbWFyeUNvbG9yID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBzZWNvbmRhcnlDb2xvciA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGlzYWJsZVNlY29uZGFyeU9wYWNpdHkgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gTGlrZSBSZWFjdCdzIGRlZmF1bHQgcHJvcHM6IGFuIGV4cGxpY2l0bHkgYm91bmQgYHVuZGVmaW5lZGAgc3RpbGwgZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdFxuICByZWFkb25seSByZXNvbHZlZFNpemUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNpemUoKSA/PyAyNCk7XG4gIHJlYWRvbmx5IG1haW5Db2xvciA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMucHJpbWFyeUNvbG9yKCkgfHwgKHRoaXMuY29sb3IoKSA/PyBcImN1cnJlbnRDb2xvclwiKSxcbiAgKTtcblxuICAvKiogU3Ryb2tlIHdpZHRoL2NvbG9yIGZvcmNlZCBieSB0aGUgc3Ryb2tlV2lkdGggaW5wdXQsIGFwcGxpZWQgdG8gdGhlIHN2ZyBhbmQgZXZlcnkgY2hpbGQuICovXG4gIHJlYWRvbmx5IHN0cm9rZU92ZXJyaWRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoVmFsdWUgPSB0aGlzLnN0cm9rZVdpZHRoKCk7XG4gICAgaWYgKHN0cm9rZVdpZHRoVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSB0aGlzLmFic29sdXRlU3Ryb2tlV2lkdGgoKVxuICAgICAgPyAoTnVtYmVyKHN0cm9rZVdpZHRoVmFsdWUpICogMjQpIC8gTnVtYmVyKHRoaXMucmVzb2x2ZWRTaXplKCkpXG4gICAgICA6IHN0cm9rZVdpZHRoVmFsdWU7XG4gICAgcmV0dXJuIHsgc3Ryb2tlV2lkdGgsIHN0cm9rZTogXCJjdXJyZW50Q29sb3JcIiB9O1xuICB9KTtcblxuICAvLyBDb21wdXRlZCBzaWduYWwgZm9yIHJlYWN0aXZlIHBhdGggdXBkYXRlc1xuICByZWFkb25seSBwYXRocyA9IGNvbXB1dGVkPFBhdGhEYXRhW10+KCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50SWNvbiA9XG4gICAgICB0aGlzLnNob3dBbHQoKSAmJiB0aGlzLmFsdEljb24oKSA/IHRoaXMuYWx0SWNvbigpISA6IHRoaXMuaWNvbigpO1xuXG4gICAgaWYgKCFjdXJyZW50SWNvbiB8fCAhQXJyYXkuaXNBcnJheShjdXJyZW50SWNvbikpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJva2VPdmVycmlkZSA9IHRoaXMuc3Ryb2tlT3ZlcnJpZGUoKTtcbiAgICBjb25zdCBtYWluQ29sb3IgPSB0aGlzLm1haW5Db2xvcigpO1xuICAgIGNvbnN0IHNlY29uZGFyeUNvbG9yID0gdGhpcy5zZWNvbmRhcnlDb2xvcigpO1xuICAgIGNvbnN0IGRpc2FibGVTZWNvbmRhcnlPcGFjaXR5ID0gdGhpcy5kaXNhYmxlU2Vjb25kYXJ5T3BhY2l0eSgpO1xuXG4gICAgLy8gU2FtZSBvcmRlcmluZyBhcyBAaHVnZWljb25zL3JlYWN0OiBzZWNvbmRhcnkgKG9wYWNpdHkpIGxheWVycyBmaXJzdFxuICAgIHJldHVybiBbLi4uY3VycmVudEljb25dXG4gICAgICAuc29ydCgoWywgYV0sIFssIGJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc09wYWNpdHlBID0gYVtcIm9wYWNpdHlcIl0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaGFzT3BhY2l0eUIgPSBiW1wib3BhY2l0eVwiXSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gaGFzT3BhY2l0eUIgPyAxIDogaGFzT3BhY2l0eUEgPyAtMSA6IDA7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3RhZywgcmF3QXR0cnNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJzID0gcmF3QXR0cnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGlzU2Vjb25kYXJ5ID0gYXR0cnNbXCJvcGFjaXR5XCJdICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNvbG9yUHJvcHMgPSBzZWNvbmRhcnlDb2xvclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBbYXR0cnNbXCJzdHJva2VcIl0gIT09IHVuZGVmaW5lZCA/IFwic3Ryb2tlXCIgOiBcImZpbGxcIl06IGlzU2Vjb25kYXJ5XG4gICAgICAgICAgICAgICAgPyBzZWNvbmRhcnlDb2xvclxuICAgICAgICAgICAgICAgIDogbWFpbkNvbG9yLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge307XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hdHRycyxcbiAgICAgICAgICB0YWcsXG4gICAgICAgICAgZmlsbDpcbiAgICAgICAgICAgIChhdHRyc1tcImZpbGxcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgKExFR0FDWV9GSUxMX05PTkVfVEFHUy5oYXModGFnKSA/IFwibm9uZVwiIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAuLi5zdHJva2VPdmVycmlkZSxcbiAgICAgICAgICAuLi5jb2xvclByb3BzLFxuICAgICAgICAgIG9wYWNpdHk6XG4gICAgICAgICAgICBpc1NlY29uZGFyeSAmJiAhZGlzYWJsZVNlY29uZGFyeU9wYWNpdHlcbiAgICAgICAgICAgICAgPyBhdHRyc1tcIm9wYWNpdHlcIl1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0gYXMgUGF0aERhdGE7XG4gICAgICB9KTtcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Directive, ElementRef, Input, Renderer2, inject, } from "@angular/core";
|
|
2
|
+
import { toSvgAttribute } from "../lib/svg-attributes";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Renders icon children into the host <svg>, with any tag and any attribute, the way
|
|
6
|
+
* React's createElement does. A template can't bind a dynamic tag name, so the nodes
|
|
7
|
+
* are built through Renderer2. It runs in ngOnChanges, i.e. synchronously during
|
|
8
|
+
* change detection, so the icon is in the DOM right after detectChanges() and in
|
|
9
|
+
* server-rendered HTML. Any children already present (e.g. from SSR) are replaced.
|
|
10
|
+
*/
|
|
11
|
+
export class HugeiconsSvgChildrenDirective {
|
|
12
|
+
hugeiconsSvgChildren;
|
|
13
|
+
host = inject(ElementRef);
|
|
14
|
+
renderer = inject(Renderer2);
|
|
15
|
+
ngOnChanges() {
|
|
16
|
+
const svg = this.host.nativeElement;
|
|
17
|
+
while (svg.firstChild) {
|
|
18
|
+
this.renderer.removeChild(svg, svg.firstChild);
|
|
19
|
+
}
|
|
20
|
+
for (const { tag, ...props } of this.hugeiconsSvgChildren ?? []) {
|
|
21
|
+
const child = this.renderer.createElement(tag, "svg");
|
|
22
|
+
for (const [prop, value] of Object.entries(props)) {
|
|
23
|
+
const attribute = toSvgAttribute(prop, value);
|
|
24
|
+
if (attribute) {
|
|
25
|
+
this.renderer.setAttribute(child, attribute.name, attribute.value, attribute.namespace ?? undefined);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
this.renderer.appendChild(svg, child);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsSvgChildrenDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
32
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: HugeiconsSvgChildrenDirective, isStandalone: true, selector: "svg[hugeiconsSvgChildren]", inputs: { hugeiconsSvgChildren: "hugeiconsSvgChildren" }, usesOnChanges: true, ngImport: i0 });
|
|
33
|
+
}
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsSvgChildrenDirective, decorators: [{
|
|
35
|
+
type: Directive,
|
|
36
|
+
args: [{
|
|
37
|
+
selector: "svg[hugeiconsSvgChildren]",
|
|
38
|
+
standalone: true,
|
|
39
|
+
}]
|
|
40
|
+
}], propDecorators: { hugeiconsSvgChildren: [{
|
|
41
|
+
type: Input,
|
|
42
|
+
args: [{ required: true }]
|
|
43
|
+
}] } });
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLWNoaWxkcmVuLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N2Zy1jaGlsZHJlbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUVMLFNBQVMsRUFDVCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQVF2RDs7Ozs7O0dBTUc7QUFLSCxNQUFNLE9BQU8sNkJBQTZCO0lBQ2Isb0JBQW9CLENBQTJCO0lBRXpELElBQUksR0FBOEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUMsV0FBVztRQUNULE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRXBDLE9BQU8sR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsRUFBRTtZQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzlDLElBQUksU0FBUyxFQUFFO29CQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUN4QixLQUFLLEVBQ0wsU0FBUyxDQUFDLElBQUksRUFDZCxTQUFTLENBQUMsS0FBSyxFQUNmLFNBQVMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUNqQyxDQUFDO2lCQUNIO2FBQ0Y7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO3dHQTVCVSw2QkFBNkI7NEZBQTdCLDZCQUE2Qjs7NEZBQTdCLDZCQUE2QjtrQkFKekMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBRTRCLG9CQUFvQjtzQkFBOUMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFJlbmRlcmVyMixcbiAgaW5qZWN0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgdG9TdmdBdHRyaWJ1dGUgfSBmcm9tIFwiLi4vbGliL3N2Zy1hdHRyaWJ1dGVzXCI7XG5cbi8qKiBPbmUgaWNvbiBjaGlsZDogYW4gU1ZHIHRhZyBuYW1lIHBsdXMgUmVhY3Qtc3R5bGUgcHJvcHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFN2Z0NoaWxkTm9kZSB7XG4gIHRhZzogc3RyaW5nO1xuICBbcHJvcDogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGljb24gY2hpbGRyZW4gaW50byB0aGUgaG9zdCA8c3ZnPiwgd2l0aCBhbnkgdGFnIGFuZCBhbnkgYXR0cmlidXRlLCB0aGUgd2F5XG4gKiBSZWFjdCdzIGNyZWF0ZUVsZW1lbnQgZG9lcy4gQSB0ZW1wbGF0ZSBjYW4ndCBiaW5kIGEgZHluYW1pYyB0YWcgbmFtZSwgc28gdGhlIG5vZGVzXG4gKiBhcmUgYnVpbHQgdGhyb3VnaCBSZW5kZXJlcjIuIEl0IHJ1bnMgaW4gbmdPbkNoYW5nZXMsIGkuZS4gc3luY2hyb25vdXNseSBkdXJpbmdcbiAqIGNoYW5nZSBkZXRlY3Rpb24sIHNvIHRoZSBpY29uIGlzIGluIHRoZSBET00gcmlnaHQgYWZ0ZXIgZGV0ZWN0Q2hhbmdlcygpIGFuZCBpblxuICogc2VydmVyLXJlbmRlcmVkIEhUTUwuIEFueSBjaGlsZHJlbiBhbHJlYWR5IHByZXNlbnQgKGUuZy4gZnJvbSBTU1IpIGFyZSByZXBsYWNlZC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcInN2Z1todWdlaWNvbnNTdmdDaGlsZHJlbl1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgSHVnZWljb25zU3ZnQ2hpbGRyZW5EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBodWdlaWNvbnNTdmdDaGlsZHJlbiE6IHJlYWRvbmx5IFN2Z0NoaWxkTm9kZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogRWxlbWVudFJlZjxTVkdTVkdFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50O1xuXG4gICAgd2hpbGUgKHN2Zy5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHN2Zywgc3ZnLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgeyB0YWcsIC4uLnByb3BzIH0gb2YgdGhpcy5odWdlaWNvbnNTdmdDaGlsZHJlbiA/PyBbXSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQodGFnLCBcInN2Z1wiKTtcbiAgICAgIGZvciAoY29uc3QgW3Byb3AsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gdG9TdmdBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xuICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZS5uYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlLnZhbHVlLFxuICAgICAgICAgICAgYXR0cmlidXRlLm5hbWVzcGFjZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzdmcsIGNoaWxkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps the React-style prop names used by the icon data (strokeWidth, fillRule, xlinkHref …)
|
|
3
|
+
* to real SVG attribute names, following the same rules as React DOM:
|
|
4
|
+
* - names that SVG itself spells in camelCase (viewBox, gradientTransform …) are kept as-is
|
|
5
|
+
* - xlink / xml prefixed names get their namespace
|
|
6
|
+
* - every other camelCase name becomes kebab-case (strokeLinecap → stroke-linecap)
|
|
7
|
+
* - names that are already kebab-case or lowercase pass through unchanged
|
|
8
|
+
*/
|
|
9
|
+
/** SVG attributes whose canonical spelling is camelCase. */
|
|
10
|
+
const CAMEL_CASE_ATTRIBUTES = new Set([
|
|
11
|
+
'allowReorder', 'attributeName', 'attributeType', 'autoReverse', 'baseFrequency',
|
|
12
|
+
'baseProfile', 'calcMode', 'clipPathUnits', 'contentScriptType', 'contentStyleType',
|
|
13
|
+
'diffuseConstant', 'edgeMode', 'externalResourcesRequired', 'filterRes', 'filterUnits',
|
|
14
|
+
'glyphRef', 'gradientTransform', 'gradientUnits', 'kernelMatrix', 'kernelUnitLength',
|
|
15
|
+
'keyPoints', 'keySplines', 'keyTimes', 'lengthAdjust', 'limitingConeAngle', 'markerHeight',
|
|
16
|
+
'markerUnits', 'markerWidth', 'maskContentUnits', 'maskUnits', 'numOctaves', 'pathLength',
|
|
17
|
+
'patternContentUnits', 'patternTransform', 'patternUnits', 'pointsAtX', 'pointsAtY',
|
|
18
|
+
'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'refX', 'refY',
|
|
19
|
+
'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'specularConstant',
|
|
20
|
+
'specularExponent', 'spreadMethod', 'startOffset', 'stdDeviation', 'stitchTiles',
|
|
21
|
+
'surfaceScale', 'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textLength',
|
|
22
|
+
'viewBox', 'viewTarget', 'xChannelSelector', 'yChannelSelector', 'zoomAndPan',
|
|
23
|
+
]);
|
|
24
|
+
/** Namespaced attributes, as Renderer2 expects them: a namespace key plus the local name. */
|
|
25
|
+
const NAMESPACED_ATTRIBUTES = {
|
|
26
|
+
xlinkActuate: { name: 'actuate', namespace: 'xlink' },
|
|
27
|
+
xlinkArcrole: { name: 'arcrole', namespace: 'xlink' },
|
|
28
|
+
xlinkHref: { name: 'href', namespace: 'xlink' },
|
|
29
|
+
xlinkRole: { name: 'role', namespace: 'xlink' },
|
|
30
|
+
xlinkShow: { name: 'show', namespace: 'xlink' },
|
|
31
|
+
xlinkTitle: { name: 'title', namespace: 'xlink' },
|
|
32
|
+
xlinkType: { name: 'type', namespace: 'xlink' },
|
|
33
|
+
xmlBase: { name: 'base', namespace: 'xml' },
|
|
34
|
+
xmlLang: { name: 'lang', namespace: 'xml' },
|
|
35
|
+
xmlSpace: { name: 'space', namespace: 'xml' },
|
|
36
|
+
xmlnsXlink: { name: 'xlink', namespace: 'xmlns' },
|
|
37
|
+
};
|
|
38
|
+
/** Props React consumes itself and never writes to the DOM. */
|
|
39
|
+
const IGNORED_PROPS = new Set(['key', 'ref', 'children', 'dangerouslySetInnerHTML']);
|
|
40
|
+
export function toSvgAttribute(prop, value) {
|
|
41
|
+
if (IGNORED_PROPS.has(prop) || value === undefined || value === null || value === false) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === 'function' || typeof value === 'object') {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const stringValue = value === true ? '' : String(value);
|
|
48
|
+
if (prop === 'className') {
|
|
49
|
+
return { name: 'class', namespace: null, value: stringValue };
|
|
50
|
+
}
|
|
51
|
+
if (prop === 'htmlFor') {
|
|
52
|
+
return { name: 'for', namespace: null, value: stringValue };
|
|
53
|
+
}
|
|
54
|
+
const namespaced = NAMESPACED_ATTRIBUTES[prop];
|
|
55
|
+
if (namespaced) {
|
|
56
|
+
return { name: namespaced.name, namespace: namespaced.namespace, value: stringValue };
|
|
57
|
+
}
|
|
58
|
+
if (CAMEL_CASE_ATTRIBUTES.has(prop) || !/[A-Z]/.test(prop)) {
|
|
59
|
+
return { name: prop, namespace: null, value: stringValue };
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
name: prop.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`),
|
|
63
|
+
namespace: null,
|
|
64
|
+
value: stringValue,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLWF0dHJpYnV0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3N2Zy1hdHRyaWJ1dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCw0REFBNEQ7QUFDNUQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNwQyxjQUFjLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZTtJQUNoRixhQUFhLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0I7SUFDbkYsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLDJCQUEyQixFQUFFLFdBQVcsRUFBRSxhQUFhO0lBQ3RGLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQjtJQUNwRixXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsY0FBYztJQUMxRixhQUFhLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWTtJQUN6RixxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVc7SUFDbkYsV0FBVyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUNyRixhQUFhLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQjtJQUN4RixrQkFBa0IsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxhQUFhO0lBQ2hGLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZO0lBQ25GLFNBQVMsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWTtDQUM5RSxDQUFDLENBQUM7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Q0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDaEUsU0FBUyxFQUFFLElBQUk7UUFDZixLQUFLLEVBQUUsV0FBVztLQUNuQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFwcyB0aGUgUmVhY3Qtc3R5bGUgcHJvcCBuYW1lcyB1c2VkIGJ5IHRoZSBpY29uIGRhdGEgKHN0cm9rZVdpZHRoLCBmaWxsUnVsZSwgeGxpbmtIcmVmIOKApilcbiAqIHRvIHJlYWwgU1ZHIGF0dHJpYnV0ZSBuYW1lcywgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIGFzIFJlYWN0IERPTTpcbiAqIC0gbmFtZXMgdGhhdCBTVkcgaXRzZWxmIHNwZWxscyBpbiBjYW1lbENhc2UgKHZpZXdCb3gsIGdyYWRpZW50VHJhbnNmb3JtIOKApikgYXJlIGtlcHQgYXMtaXNcbiAqIC0geGxpbmsgLyB4bWwgcHJlZml4ZWQgbmFtZXMgZ2V0IHRoZWlyIG5hbWVzcGFjZVxuICogLSBldmVyeSBvdGhlciBjYW1lbENhc2UgbmFtZSBiZWNvbWVzIGtlYmFiLWNhc2UgKHN0cm9rZUxpbmVjYXAg4oaSIHN0cm9rZS1saW5lY2FwKVxuICogLSBuYW1lcyB0aGF0IGFyZSBhbHJlYWR5IGtlYmFiLWNhc2Ugb3IgbG93ZXJjYXNlIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWRcbiAqL1xuXG4vKiogU1ZHIGF0dHJpYnV0ZXMgd2hvc2UgY2Fub25pY2FsIHNwZWxsaW5nIGlzIGNhbWVsQ2FzZS4gKi9cbmNvbnN0IENBTUVMX0NBU0VfQVRUUklCVVRFUyA9IG5ldyBTZXQoW1xuICAnYWxsb3dSZW9yZGVyJywgJ2F0dHJpYnV0ZU5hbWUnLCAnYXR0cmlidXRlVHlwZScsICdhdXRvUmV2ZXJzZScsICdiYXNlRnJlcXVlbmN5JyxcbiAgJ2Jhc2VQcm9maWxlJywgJ2NhbGNNb2RlJywgJ2NsaXBQYXRoVW5pdHMnLCAnY29udGVudFNjcmlwdFR5cGUnLCAnY29udGVudFN0eWxlVHlwZScsXG4gICdkaWZmdXNlQ29uc3RhbnQnLCAnZWRnZU1vZGUnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmaWx0ZXJSZXMnLCAnZmlsdGVyVW5pdHMnLFxuICAnZ2x5cGhSZWYnLCAnZ3JhZGllbnRUcmFuc2Zvcm0nLCAnZ3JhZGllbnRVbml0cycsICdrZXJuZWxNYXRyaXgnLCAna2VybmVsVW5pdExlbmd0aCcsXG4gICdrZXlQb2ludHMnLCAna2V5U3BsaW5lcycsICdrZXlUaW1lcycsICdsZW5ndGhBZGp1c3QnLCAnbGltaXRpbmdDb25lQW5nbGUnLCAnbWFya2VySGVpZ2h0JyxcbiAgJ21hcmtlclVuaXRzJywgJ21hcmtlcldpZHRoJywgJ21hc2tDb250ZW50VW5pdHMnLCAnbWFza1VuaXRzJywgJ251bU9jdGF2ZXMnLCAncGF0aExlbmd0aCcsXG4gICdwYXR0ZXJuQ29udGVudFVuaXRzJywgJ3BhdHRlcm5UcmFuc2Zvcm0nLCAncGF0dGVyblVuaXRzJywgJ3BvaW50c0F0WCcsICdwb2ludHNBdFknLFxuICAncG9pbnRzQXRaJywgJ3ByZXNlcnZlQWxwaGEnLCAncHJlc2VydmVBc3BlY3RSYXRpbycsICdwcmltaXRpdmVVbml0cycsICdyZWZYJywgJ3JlZlknLFxuICAncmVwZWF0Q291bnQnLCAncmVwZWF0RHVyJywgJ3JlcXVpcmVkRXh0ZW5zaW9ucycsICdyZXF1aXJlZEZlYXR1cmVzJywgJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICAnc3BlY3VsYXJFeHBvbmVudCcsICdzcHJlYWRNZXRob2QnLCAnc3RhcnRPZmZzZXQnLCAnc3RkRGV2aWF0aW9uJywgJ3N0aXRjaFRpbGVzJyxcbiAgJ3N1cmZhY2VTY2FsZScsICdzeXN0ZW1MYW5ndWFnZScsICd0YWJsZVZhbHVlcycsICd0YXJnZXRYJywgJ3RhcmdldFknLCAndGV4dExlbmd0aCcsXG4gICd2aWV3Qm94JywgJ3ZpZXdUYXJnZXQnLCAneENoYW5uZWxTZWxlY3RvcicsICd5Q2hhbm5lbFNlbGVjdG9yJywgJ3pvb21BbmRQYW4nLFxuXSk7XG5cbi8qKiBOYW1lc3BhY2VkIGF0dHJpYnV0ZXMsIGFzIFJlbmRlcmVyMiBleHBlY3RzIHRoZW06IGEgbmFtZXNwYWNlIGtleSBwbHVzIHRoZSBsb2NhbCBuYW1lLiAqL1xuY29uc3QgTkFNRVNQQUNFRF9BVFRSSUJVVEVTOiBSZWNvcmQ8c3RyaW5nLCB7IG5hbWU6IHN0cmluZzsgbmFtZXNwYWNlOiBzdHJpbmcgfT4gPSB7XG4gIHhsaW5rQWN0dWF0ZTogeyBuYW1lOiAnYWN0dWF0ZScsIG5hbWVzcGFjZTogJ3hsaW5rJyB9LFxuICB4bGlua0FyY3JvbGU6IHsgbmFtZTogJ2FyY3JvbGUnLCBuYW1lc3BhY2U6ICd4bGluaycgfSxcbiAgeGxpbmtIcmVmOiB7IG5hbWU6ICdocmVmJywgbmFtZXNwYWNlOiAneGxpbmsnIH0sXG4gIHhsaW5rUm9sZTogeyBuYW1lOiAncm9sZScsIG5hbWVzcGFjZTogJ3hsaW5rJyB9LFxuICB4bGlua1Nob3c6IHsgbmFtZTogJ3Nob3cnLCBuYW1lc3BhY2U6ICd4bGluaycgfSxcbiAgeGxpbmtUaXRsZTogeyBuYW1lOiAndGl0bGUnLCBuYW1lc3BhY2U6ICd4bGluaycgfSxcbiAgeGxpbmtUeXBlOiB7IG5hbWU6ICd0eXBlJywgbmFtZXNwYWNlOiAneGxpbmsnIH0sXG4gIHhtbEJhc2U6IHsgbmFtZTogJ2Jhc2UnLCBuYW1lc3BhY2U6ICd4bWwnIH0sXG4gIHhtbExhbmc6IHsgbmFtZTogJ2xhbmcnLCBuYW1lc3BhY2U6ICd4bWwnIH0sXG4gIHhtbFNwYWNlOiB7IG5hbWU6ICdzcGFjZScsIG5hbWVzcGFjZTogJ3htbCcgfSxcbiAgeG1sbnNYbGluazogeyBuYW1lOiAneGxpbmsnLCBuYW1lc3BhY2U6ICd4bWxucycgfSxcbn07XG5cbi8qKiBQcm9wcyBSZWFjdCBjb25zdW1lcyBpdHNlbGYgYW5kIG5ldmVyIHdyaXRlcyB0byB0aGUgRE9NLiAqL1xuY29uc3QgSUdOT1JFRF9QUk9QUyA9IG5ldyBTZXQoWydrZXknLCAncmVmJywgJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJ10pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN2Z0F0dHJpYnV0ZSB7XG4gIC8qKiBMb2NhbCBhdHRyaWJ1dGUgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBSZW5kZXJlcjIgbmFtZXNwYWNlIGtleSAoeGxpbmssIHhtbCwgeG1sbnMpIG9yIG51bGwgKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCBudWxsO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdmdBdHRyaWJ1dGUocHJvcDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFN2Z0F0dHJpYnV0ZSB8IG51bGwge1xuICBpZiAoSUdOT1JFRF9QUk9QUy5oYXMocHJvcCkgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdHJpbmdWYWx1ZSA9IHZhbHVlID09PSB0cnVlID8gJycgOiBTdHJpbmcodmFsdWUpO1xuXG4gIGlmIChwcm9wID09PSAnY2xhc3NOYW1lJykge1xuICAgIHJldHVybiB7IG5hbWU6ICdjbGFzcycsIG5hbWVzcGFjZTogbnVsbCwgdmFsdWU6IHN0cmluZ1ZhbHVlIH07XG4gIH1cbiAgaWYgKHByb3AgPT09ICdodG1sRm9yJykge1xuICAgIHJldHVybiB7IG5hbWU6ICdmb3InLCBuYW1lc3BhY2U6IG51bGwsIHZhbHVlOiBzdHJpbmdWYWx1ZSB9O1xuICB9XG4gIGNvbnN0IG5hbWVzcGFjZWQgPSBOQU1FU1BBQ0VEX0FUVFJJQlVURVNbcHJvcF07XG4gIGlmIChuYW1lc3BhY2VkKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogbmFtZXNwYWNlZC5uYW1lLCBuYW1lc3BhY2U6IG5hbWVzcGFjZWQubmFtZXNwYWNlLCB2YWx1ZTogc3RyaW5nVmFsdWUgfTtcbiAgfVxuICBpZiAoQ0FNRUxfQ0FTRV9BVFRSSUJVVEVTLmhhcyhwcm9wKSB8fCAhL1tBLVpdLy50ZXN0KHByb3ApKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogcHJvcCwgbmFtZXNwYWNlOiBudWxsLCB2YWx1ZTogc3RyaW5nVmFsdWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6IHByb3AucmVwbGFjZSgvW0EtWl0vZywgKGNoYXIpID0+IGAtJHtjaGFyLnRvTG93ZXJDYXNlKCl9YCksXG4gICAgbmFtZXNwYWNlOiBudWxsLFxuICAgIHZhbHVlOiBzdHJpbmdWYWx1ZSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU1ZHIHBhdGggYXR0cmlidXRlcyAtIHN0cmljdCB2ZXJzaW9uIHdpdGggcmVxdWlyZWQgZCBwcm9wZXJ0eSAqL1xuZXhwb3J0IGludGVyZmFjZSBTdmdQYXRoQXR0cmlidXRlcyB7XG4gIGQ6IHN0cmluZztcbiAgZmlsbD86IHN0cmluZztcbiAgb3BhY2l0eT86IHN0cmluZztcbiAgZmlsbFJ1bGU/OiAnbm9uemVybycgfCAnZXZlbm9kZCc7XG4gIHN0cm9rZT86IHN0cmluZztcbiAgc3Ryb2tlV2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0cm9rZUxpbmVjYXA/OiAnYnV0dCcgfCAncm91bmQnIHwgJ3NxdWFyZSc7XG4gIHN0cm9rZUxpbmVqb2luPzogJ21pdGVyJyB8ICdyb3VuZCcgfCAnYmV2ZWwnO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKiogTG9vc2UgcGF0aCBhdHRyaWJ1dGVzIHR5cGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBpY29uIGRhdGEgcGFja2FnZXMgKi9cbmV4cG9ydCB0eXBlIExvb3NlU3ZnUGF0aEF0dHJpYnV0ZXMgPSB7XG4gIGQ/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbn07XG5cbi8qKiBJY29uIFNWRyBvYmplY3QgdHlwZSAtIGFjY2VwdHMgYm90aCBzdHJpY3QgYW5kIGxvb3NlIHBhdGggYXR0cmlidXRlIGZvcm1hdHMgKi9cbmV4cG9ydCB0eXBlIEljb25TdmdPYmplY3QgPSByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgU3ZnUGF0aEF0dHJpYnV0ZXMgfCBMb29zZVN2Z1BhdGhBdHRyaWJ1dGVzXSlbXTtcblxuZXhwb3J0IHR5cGUgSWNvbk5hbWUgPSBzdHJpbmc7XG5cbi8qKiBJY29uIHN0eWxlIHZhcmlhbnRzICovXG5leHBvcnQgdHlwZSBJY29uU3R5bGUgPSBcbiAgfCAnc3Ryb2tlLXJvdW5kZWQnXG4gIHwgJ3N0cm9rZS1zaGFycCdcbiAgfCAnc3Ryb2tlLXN0YW5kYXJkJ1xuICB8ICdzb2xpZC1yb3VuZGVkJ1xuICB8ICdzb2xpZC1zaGFycCdcbiAgfCAnc29saWQtc3RhbmRhcmQnXG4gIHwgJ2J1bGstcm91bmRlZCdcbiAgfCAnZHVvdG9uZS1yb3VuZGVkJ1xuICB8ICdkdW90b25lLXN0YW5kYXJkJ1xuICB8ICd0d290b25lLXJvdW5kZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEljb25NZXRhZGF0YSB7XG4gIG5hbWU6IEljb25OYW1lO1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgcGFjazogc3RyaW5nO1xuICBzdHlsZT86IEljb25TdHlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJY29uRGF0YSB7XG4gIGljb246IEljb25TdmdPYmplY3Q7XG4gIG1ldGFkYXRhOiBJY29uTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHVnZWljb25zUHJvcHMge1xuICBzaXplPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbiAgYWJzb2x1dGVTdHJva2VXaWR0aD86IGJvb2xlYW47XG4gIGljb246IEljb25TdmdPYmplY3Q7XG4gIGFsdEljb24/OiBJY29uU3ZnT2JqZWN0O1xuICBjb2xvcj86IHN0cmluZztcbiAgY2xhc3M/OiBzdHJpbmc7XG4gIHNob3dBbHQ/
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU1ZHIHBhdGggYXR0cmlidXRlcyAtIHN0cmljdCB2ZXJzaW9uIHdpdGggcmVxdWlyZWQgZCBwcm9wZXJ0eSAqL1xuZXhwb3J0IGludGVyZmFjZSBTdmdQYXRoQXR0cmlidXRlcyB7XG4gIGQ6IHN0cmluZztcbiAgZmlsbD86IHN0cmluZztcbiAgb3BhY2l0eT86IHN0cmluZztcbiAgZmlsbFJ1bGU/OiAnbm9uemVybycgfCAnZXZlbm9kZCc7XG4gIHN0cm9rZT86IHN0cmluZztcbiAgc3Ryb2tlV2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0cm9rZUxpbmVjYXA/OiAnYnV0dCcgfCAncm91bmQnIHwgJ3NxdWFyZSc7XG4gIHN0cm9rZUxpbmVqb2luPzogJ21pdGVyJyB8ICdyb3VuZCcgfCAnYmV2ZWwnO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKiogTG9vc2UgcGF0aCBhdHRyaWJ1dGVzIHR5cGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBpY29uIGRhdGEgcGFja2FnZXMgKi9cbmV4cG9ydCB0eXBlIExvb3NlU3ZnUGF0aEF0dHJpYnV0ZXMgPSB7XG4gIGQ/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbn07XG5cbi8qKiBJY29uIFNWRyBvYmplY3QgdHlwZSAtIGFjY2VwdHMgYm90aCBzdHJpY3QgYW5kIGxvb3NlIHBhdGggYXR0cmlidXRlIGZvcm1hdHMgKi9cbmV4cG9ydCB0eXBlIEljb25TdmdPYmplY3QgPSByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgU3ZnUGF0aEF0dHJpYnV0ZXMgfCBMb29zZVN2Z1BhdGhBdHRyaWJ1dGVzXSlbXTtcblxuZXhwb3J0IHR5cGUgSWNvbk5hbWUgPSBzdHJpbmc7XG5cbi8qKiBJY29uIHN0eWxlIHZhcmlhbnRzICovXG5leHBvcnQgdHlwZSBJY29uU3R5bGUgPSBcbiAgfCAnc3Ryb2tlLXJvdW5kZWQnXG4gIHwgJ3N0cm9rZS1zaGFycCdcbiAgfCAnc3Ryb2tlLXN0YW5kYXJkJ1xuICB8ICdzb2xpZC1yb3VuZGVkJ1xuICB8ICdzb2xpZC1zaGFycCdcbiAgfCAnc29saWQtc3RhbmRhcmQnXG4gIHwgJ2J1bGstcm91bmRlZCdcbiAgfCAnZHVvdG9uZS1yb3VuZGVkJ1xuICB8ICdkdW90b25lLXN0YW5kYXJkJ1xuICB8ICd0d290b25lLXJvdW5kZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEljb25NZXRhZGF0YSB7XG4gIG5hbWU6IEljb25OYW1lO1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgcGFjazogc3RyaW5nO1xuICBzdHlsZT86IEljb25TdHlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJY29uRGF0YSB7XG4gIGljb246IEljb25TdmdPYmplY3Q7XG4gIG1ldGFkYXRhOiBJY29uTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHVnZWljb25zUHJvcHMge1xuICBzaXplPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbiAgYWJzb2x1dGVTdHJva2VXaWR0aD86IGJvb2xlYW47XG4gIGljb246IEljb25TdmdPYmplY3Q7XG4gIGFsdEljb24/OiBJY29uU3ZnT2JqZWN0O1xuICBjb2xvcj86IHN0cmluZztcbiAgY2xhc3M/OiBzdHJpbmc7XG4gIHNob3dBbHQ/OiBib29sZWFuO1xuICBwcmltYXJ5Q29sb3I/OiBzdHJpbmc7XG4gIHNlY29uZGFyeUNvbG9yPzogc3RyaW5nO1xuICBkaXNhYmxlU2Vjb25kYXJ5T3BhY2l0eT86IGJvb2xlYW47XG59ICJdfQ==
|
|
@@ -1,6 +1,120 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, Renderer2, Input, Directive, input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Maps the React-style prop names used by the icon data (strokeWidth, fillRule, xlinkHref …)
|
|
6
|
+
* to real SVG attribute names, following the same rules as React DOM:
|
|
7
|
+
* - names that SVG itself spells in camelCase (viewBox, gradientTransform …) are kept as-is
|
|
8
|
+
* - xlink / xml prefixed names get their namespace
|
|
9
|
+
* - every other camelCase name becomes kebab-case (strokeLinecap → stroke-linecap)
|
|
10
|
+
* - names that are already kebab-case or lowercase pass through unchanged
|
|
11
|
+
*/
|
|
12
|
+
/** SVG attributes whose canonical spelling is camelCase. */
|
|
13
|
+
const CAMEL_CASE_ATTRIBUTES = new Set([
|
|
14
|
+
'allowReorder', 'attributeName', 'attributeType', 'autoReverse', 'baseFrequency',
|
|
15
|
+
'baseProfile', 'calcMode', 'clipPathUnits', 'contentScriptType', 'contentStyleType',
|
|
16
|
+
'diffuseConstant', 'edgeMode', 'externalResourcesRequired', 'filterRes', 'filterUnits',
|
|
17
|
+
'glyphRef', 'gradientTransform', 'gradientUnits', 'kernelMatrix', 'kernelUnitLength',
|
|
18
|
+
'keyPoints', 'keySplines', 'keyTimes', 'lengthAdjust', 'limitingConeAngle', 'markerHeight',
|
|
19
|
+
'markerUnits', 'markerWidth', 'maskContentUnits', 'maskUnits', 'numOctaves', 'pathLength',
|
|
20
|
+
'patternContentUnits', 'patternTransform', 'patternUnits', 'pointsAtX', 'pointsAtY',
|
|
21
|
+
'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'refX', 'refY',
|
|
22
|
+
'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'specularConstant',
|
|
23
|
+
'specularExponent', 'spreadMethod', 'startOffset', 'stdDeviation', 'stitchTiles',
|
|
24
|
+
'surfaceScale', 'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textLength',
|
|
25
|
+
'viewBox', 'viewTarget', 'xChannelSelector', 'yChannelSelector', 'zoomAndPan',
|
|
26
|
+
]);
|
|
27
|
+
/** Namespaced attributes, as Renderer2 expects them: a namespace key plus the local name. */
|
|
28
|
+
const NAMESPACED_ATTRIBUTES = {
|
|
29
|
+
xlinkActuate: { name: 'actuate', namespace: 'xlink' },
|
|
30
|
+
xlinkArcrole: { name: 'arcrole', namespace: 'xlink' },
|
|
31
|
+
xlinkHref: { name: 'href', namespace: 'xlink' },
|
|
32
|
+
xlinkRole: { name: 'role', namespace: 'xlink' },
|
|
33
|
+
xlinkShow: { name: 'show', namespace: 'xlink' },
|
|
34
|
+
xlinkTitle: { name: 'title', namespace: 'xlink' },
|
|
35
|
+
xlinkType: { name: 'type', namespace: 'xlink' },
|
|
36
|
+
xmlBase: { name: 'base', namespace: 'xml' },
|
|
37
|
+
xmlLang: { name: 'lang', namespace: 'xml' },
|
|
38
|
+
xmlSpace: { name: 'space', namespace: 'xml' },
|
|
39
|
+
xmlnsXlink: { name: 'xlink', namespace: 'xmlns' },
|
|
40
|
+
};
|
|
41
|
+
/** Props React consumes itself and never writes to the DOM. */
|
|
42
|
+
const IGNORED_PROPS = new Set(['key', 'ref', 'children', 'dangerouslySetInnerHTML']);
|
|
43
|
+
function toSvgAttribute(prop, value) {
|
|
44
|
+
if (IGNORED_PROPS.has(prop) || value === undefined || value === null || value === false) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (typeof value === 'function' || typeof value === 'object') {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const stringValue = value === true ? '' : String(value);
|
|
51
|
+
if (prop === 'className') {
|
|
52
|
+
return { name: 'class', namespace: null, value: stringValue };
|
|
53
|
+
}
|
|
54
|
+
if (prop === 'htmlFor') {
|
|
55
|
+
return { name: 'for', namespace: null, value: stringValue };
|
|
56
|
+
}
|
|
57
|
+
const namespaced = NAMESPACED_ATTRIBUTES[prop];
|
|
58
|
+
if (namespaced) {
|
|
59
|
+
return { name: namespaced.name, namespace: namespaced.namespace, value: stringValue };
|
|
60
|
+
}
|
|
61
|
+
if (CAMEL_CASE_ATTRIBUTES.has(prop) || !/[A-Z]/.test(prop)) {
|
|
62
|
+
return { name: prop, namespace: null, value: stringValue };
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
name: prop.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`),
|
|
66
|
+
namespace: null,
|
|
67
|
+
value: stringValue,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Renders icon children into the host <svg>, with any tag and any attribute, the way
|
|
73
|
+
* React's createElement does. A template can't bind a dynamic tag name, so the nodes
|
|
74
|
+
* are built through Renderer2. It runs in ngOnChanges, i.e. synchronously during
|
|
75
|
+
* change detection, so the icon is in the DOM right after detectChanges() and in
|
|
76
|
+
* server-rendered HTML. Any children already present (e.g. from SSR) are replaced.
|
|
77
|
+
*/
|
|
78
|
+
class HugeiconsSvgChildrenDirective {
|
|
79
|
+
hugeiconsSvgChildren;
|
|
80
|
+
host = inject(ElementRef);
|
|
81
|
+
renderer = inject(Renderer2);
|
|
82
|
+
ngOnChanges() {
|
|
83
|
+
const svg = this.host.nativeElement;
|
|
84
|
+
while (svg.firstChild) {
|
|
85
|
+
this.renderer.removeChild(svg, svg.firstChild);
|
|
86
|
+
}
|
|
87
|
+
for (const { tag, ...props } of this.hugeiconsSvgChildren ?? []) {
|
|
88
|
+
const child = this.renderer.createElement(tag, "svg");
|
|
89
|
+
for (const [prop, value] of Object.entries(props)) {
|
|
90
|
+
const attribute = toSvgAttribute(prop, value);
|
|
91
|
+
if (attribute) {
|
|
92
|
+
this.renderer.setAttribute(child, attribute.name, attribute.value, attribute.namespace ?? undefined);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
this.renderer.appendChild(svg, child);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsSvgChildrenDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
99
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: HugeiconsSvgChildrenDirective, isStandalone: true, selector: "svg[hugeiconsSvgChildren]", inputs: { hugeiconsSvgChildren: "hugeiconsSvgChildren" }, usesOnChanges: true, ngImport: i0 });
|
|
100
|
+
}
|
|
101
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsSvgChildrenDirective, decorators: [{
|
|
102
|
+
type: Directive,
|
|
103
|
+
args: [{
|
|
104
|
+
selector: "svg[hugeiconsSvgChildren]",
|
|
105
|
+
standalone: true,
|
|
106
|
+
}]
|
|
107
|
+
}], propDecorators: { hugeiconsSvgChildren: [{
|
|
108
|
+
type: Input,
|
|
109
|
+
args: [{ required: true }]
|
|
110
|
+
}] } });
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 1.0.11 wrote fill="none" on every child it rendered (always path, circle, ellipse or
|
|
114
|
+
* rect). Kept for those tags so CSS such as `svg { fill: ... }` behaves as before;
|
|
115
|
+
* any other tag is left untouched, like React.
|
|
116
|
+
*/
|
|
117
|
+
const LEGACY_FILL_NONE_TAGS = new Set(["path", "circle", "ellipse", "rect"]);
|
|
4
118
|
class HugeiconsIconComponent {
|
|
5
119
|
// Signal inputs - modern Angular 17.1+ approach
|
|
6
120
|
size = input(24);
|
|
@@ -8,87 +122,106 @@ class HugeiconsIconComponent {
|
|
|
8
122
|
absoluteStrokeWidth = input(false);
|
|
9
123
|
icon = input.required();
|
|
10
124
|
altIcon = input(undefined);
|
|
11
|
-
color = input(
|
|
12
|
-
iconClass = input(
|
|
125
|
+
color = input("currentColor");
|
|
126
|
+
iconClass = input("", { alias: "class" });
|
|
13
127
|
showAlt = input(false);
|
|
128
|
+
primaryColor = input(undefined);
|
|
129
|
+
secondaryColor = input(undefined);
|
|
130
|
+
disableSecondaryOpacity = input(false);
|
|
131
|
+
// Like React's default props: an explicitly bound `undefined` still falls back to the default
|
|
132
|
+
resolvedSize = computed(() => this.size() ?? 24);
|
|
133
|
+
mainColor = computed(() => this.primaryColor() || (this.color() ?? "currentColor"));
|
|
134
|
+
/** Stroke width/color forced by the strokeWidth input, applied to the svg and every child. */
|
|
135
|
+
strokeOverride = computed(() => {
|
|
136
|
+
const strokeWidthValue = this.strokeWidth();
|
|
137
|
+
if (strokeWidthValue === undefined) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
const strokeWidth = this.absoluteStrokeWidth()
|
|
141
|
+
? (Number(strokeWidthValue) * 24) / Number(this.resolvedSize())
|
|
142
|
+
: strokeWidthValue;
|
|
143
|
+
return { strokeWidth, stroke: "currentColor" };
|
|
144
|
+
});
|
|
14
145
|
// Computed signal for reactive path updates
|
|
15
146
|
paths = computed(() => {
|
|
16
147
|
const currentIcon = this.showAlt() && this.altIcon() ? this.altIcon() : this.icon();
|
|
17
148
|
if (!currentIcon || !Array.isArray(currentIcon)) {
|
|
18
149
|
return [];
|
|
19
150
|
}
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
151
|
+
const strokeOverride = this.strokeOverride();
|
|
152
|
+
const mainColor = this.mainColor();
|
|
153
|
+
const secondaryColor = this.secondaryColor();
|
|
154
|
+
const disableSecondaryOpacity = this.disableSecondaryOpacity();
|
|
155
|
+
// Same ordering as @hugeicons/react: secondary (opacity) layers first
|
|
156
|
+
return [...currentIcon]
|
|
157
|
+
.sort(([, a], [, b]) => {
|
|
158
|
+
const hasOpacityA = a["opacity"] !== undefined;
|
|
159
|
+
const hasOpacityB = b["opacity"] !== undefined;
|
|
160
|
+
return hasOpacityB ? 1 : hasOpacityA ? -1 : 0;
|
|
161
|
+
})
|
|
162
|
+
.map(([tag, rawAttrs]) => {
|
|
163
|
+
const attrs = rawAttrs;
|
|
164
|
+
const isSecondary = attrs["opacity"] !== undefined;
|
|
165
|
+
const colorProps = secondaryColor
|
|
166
|
+
? {
|
|
167
|
+
[attrs["stroke"] !== undefined ? "stroke" : "fill"]: isSecondary
|
|
168
|
+
? secondaryColor
|
|
169
|
+
: mainColor,
|
|
170
|
+
}
|
|
171
|
+
: {};
|
|
172
|
+
return {
|
|
173
|
+
...attrs,
|
|
174
|
+
tag,
|
|
175
|
+
fill: attrs["fill"] ||
|
|
176
|
+
(LEGACY_FILL_NONE_TAGS.has(tag) ? "none" : undefined),
|
|
177
|
+
...strokeOverride,
|
|
178
|
+
...colorProps,
|
|
179
|
+
opacity: isSecondary && !disableSecondaryOpacity
|
|
180
|
+
? attrs["opacity"]
|
|
181
|
+
: undefined,
|
|
182
|
+
};
|
|
183
|
+
});
|
|
36
184
|
});
|
|
37
185
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
186
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.12", type: HugeiconsIconComponent, isStandalone: true, selector: "hugeicons-icon", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, absoluteStrokeWidth: { classPropertyName: "absoluteStrokeWidth", publicName: "absoluteStrokeWidth", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, altIcon: { classPropertyName: "altIcon", publicName: "altIcon", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, iconClass: { classPropertyName: "iconClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, showAlt: { classPropertyName: "showAlt", publicName: "showAlt", isSignal: true, isRequired: false, transformFunction: null }, primaryColor: { classPropertyName: "primaryColor", publicName: "primaryColor", isSignal: true, isRequired: false, transformFunction: null }, secondaryColor: { classPropertyName: "secondaryColor", publicName: "secondaryColor", isSignal: true, isRequired: false, transformFunction: null }, disableSecondaryOpacity: { classPropertyName: "disableSecondaryOpacity", publicName: "disableSecondaryOpacity", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: inline-flex; align-items: center; justify-content: center;" }, ngImport: i0, template: `
|
|
39
187
|
<svg
|
|
40
|
-
[attr.width]="
|
|
41
|
-
[attr.height]="
|
|
188
|
+
[attr.width]="resolvedSize()"
|
|
189
|
+
[attr.height]="resolvedSize()"
|
|
42
190
|
viewBox="0 0 24 24"
|
|
43
191
|
fill="none"
|
|
44
|
-
[attr.color]="
|
|
192
|
+
[attr.color]="mainColor()"
|
|
193
|
+
[attr.stroke]="strokeOverride()?.stroke"
|
|
194
|
+
[attr.stroke-width]="strokeOverride()?.strokeWidth"
|
|
45
195
|
[class]="iconClass()"
|
|
46
196
|
xmlns="http://www.w3.org/2000/svg"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
[attr.d]="path.d"
|
|
51
|
-
[attr.fill]="path.fill"
|
|
52
|
-
[attr.opacity]="path.opacity"
|
|
53
|
-
[attr.fill-rule]="path.fillRule"
|
|
54
|
-
[attr.stroke]="path.stroke"
|
|
55
|
-
[attr.stroke-width]="path.strokeWidth"
|
|
56
|
-
/>
|
|
57
|
-
}
|
|
58
|
-
</svg>
|
|
59
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
197
|
+
[hugeiconsSvgChildren]="paths()"
|
|
198
|
+
></svg>
|
|
199
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: HugeiconsSvgChildrenDirective, selector: "svg[hugeiconsSvgChildren]", inputs: ["hugeiconsSvgChildren"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
60
200
|
}
|
|
61
201
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HugeiconsIconComponent, decorators: [{
|
|
62
202
|
type: Component,
|
|
63
203
|
args: [{
|
|
64
|
-
selector:
|
|
204
|
+
selector: "hugeicons-icon",
|
|
65
205
|
standalone: true,
|
|
206
|
+
imports: [HugeiconsSvgChildrenDirective],
|
|
66
207
|
template: `
|
|
67
208
|
<svg
|
|
68
|
-
[attr.width]="
|
|
69
|
-
[attr.height]="
|
|
209
|
+
[attr.width]="resolvedSize()"
|
|
210
|
+
[attr.height]="resolvedSize()"
|
|
70
211
|
viewBox="0 0 24 24"
|
|
71
212
|
fill="none"
|
|
72
|
-
[attr.color]="
|
|
213
|
+
[attr.color]="mainColor()"
|
|
214
|
+
[attr.stroke]="strokeOverride()?.stroke"
|
|
215
|
+
[attr.stroke-width]="strokeOverride()?.strokeWidth"
|
|
73
216
|
[class]="iconClass()"
|
|
74
217
|
xmlns="http://www.w3.org/2000/svg"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
<path
|
|
78
|
-
[attr.d]="path.d"
|
|
79
|
-
[attr.fill]="path.fill"
|
|
80
|
-
[attr.opacity]="path.opacity"
|
|
81
|
-
[attr.fill-rule]="path.fillRule"
|
|
82
|
-
[attr.stroke]="path.stroke"
|
|
83
|
-
[attr.stroke-width]="path.strokeWidth"
|
|
84
|
-
/>
|
|
85
|
-
}
|
|
86
|
-
</svg>
|
|
218
|
+
[hugeiconsSvgChildren]="paths()"
|
|
219
|
+
></svg>
|
|
87
220
|
`,
|
|
88
221
|
host: {
|
|
89
|
-
style:
|
|
222
|
+
style: "display: inline-flex; align-items: center; justify-content: center;",
|
|
90
223
|
},
|
|
91
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
224
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
92
225
|
}]
|
|
93
226
|
}] });
|
|
94
227
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hugeicons-angular.mjs","sources":["../../src/components/hugeicons-icon.component.ts","../../src/hugeicons-angular.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { IconSvgObject } from '../lib/types';\n\ninterface PathData {\n d: string;\n fill: string;\n opacity?: string;\n fillRule?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\n@Component({\n selector: 'hugeicons-icon',\n standalone: true,\n template: `\n <svg\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n [attr.color]=\"color()\"\n [class]=\"iconClass()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n @for (path of paths(); track $index) {\n <path\n [attr.d]=\"path.d\"\n [attr.fill]=\"path.fill\"\n [attr.opacity]=\"path.opacity\"\n [attr.fill-rule]=\"path.fillRule\"\n [attr.stroke]=\"path.stroke\"\n [attr.stroke-width]=\"path.strokeWidth\"\n />\n }\n </svg>\n `,\n host: {\n style: 'display: inline-flex; align-items: center; justify-content: center;'\n },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class HugeiconsIconComponent {\n // Signal inputs - modern Angular 17.1+ approach\n readonly size = input<string | number>(24);\n readonly strokeWidth = input<number | undefined>(undefined);\n readonly absoluteStrokeWidth = input<boolean>(false);\n readonly icon = input.required<IconSvgObject>();\n readonly altIcon = input<IconSvgObject | undefined>(undefined);\n readonly color = input<string>('currentColor');\n readonly iconClass = input<string>('', { alias: 'class' });\n readonly showAlt = input<boolean>(false);\n\n // Computed signal for reactive path updates\n readonly paths = computed<PathData[]>(() => {\n const currentIcon = this.showAlt() && this.altIcon() ? this.altIcon()! : this.icon();\n\n if (!currentIcon || !Array.isArray(currentIcon)) {\n return [];\n }\n\n const strokeWidthValue = this.strokeWidth();\n const calculatedStrokeWidth = strokeWidthValue !== undefined\n ? (this.absoluteStrokeWidth() \n ? (Number(strokeWidthValue) * 24) / Number(this.size()) \n : strokeWidthValue)\n : undefined;\n\n const strokeProps = calculatedStrokeWidth !== undefined \n ? { strokeWidth: calculatedStrokeWidth, stroke: 'currentColor' } \n : {};\n\n return currentIcon.map(([_, attrs]) => ({\n d: attrs['d'],\n fill: attrs['fill'] || 'none',\n opacity: attrs['opacity'],\n fillRule: attrs['fillRule'],\n ...strokeProps\n }));\n });\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hugeicons-angular.mjs","sources":["../../src/lib/svg-attributes.ts","../../src/components/svg-children.directive.ts","../../src/components/hugeicons-icon.component.ts","../../src/hugeicons-angular.ts"],"sourcesContent":["/**\n * Maps the React-style prop names used by the icon data (strokeWidth, fillRule, xlinkHref …)\n * to real SVG attribute names, following the same rules as React DOM:\n * - names that SVG itself spells in camelCase (viewBox, gradientTransform …) are kept as-is\n * - xlink / xml prefixed names get their namespace\n * - every other camelCase name becomes kebab-case (strokeLinecap → stroke-linecap)\n * - names that are already kebab-case or lowercase pass through unchanged\n */\n\n/** SVG attributes whose canonical spelling is camelCase. */\nconst CAMEL_CASE_ATTRIBUTES = new Set([\n 'allowReorder', 'attributeName', 'attributeType', 'autoReverse', 'baseFrequency',\n 'baseProfile', 'calcMode', 'clipPathUnits', 'contentScriptType', 'contentStyleType',\n 'diffuseConstant', 'edgeMode', 'externalResourcesRequired', 'filterRes', 'filterUnits',\n 'glyphRef', 'gradientTransform', 'gradientUnits', 'kernelMatrix', 'kernelUnitLength',\n 'keyPoints', 'keySplines', 'keyTimes', 'lengthAdjust', 'limitingConeAngle', 'markerHeight',\n 'markerUnits', 'markerWidth', 'maskContentUnits', 'maskUnits', 'numOctaves', 'pathLength',\n 'patternContentUnits', 'patternTransform', 'patternUnits', 'pointsAtX', 'pointsAtY',\n 'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'refX', 'refY',\n 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'specularConstant',\n 'specularExponent', 'spreadMethod', 'startOffset', 'stdDeviation', 'stitchTiles',\n 'surfaceScale', 'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textLength',\n 'viewBox', 'viewTarget', 'xChannelSelector', 'yChannelSelector', 'zoomAndPan',\n]);\n\n/** Namespaced attributes, as Renderer2 expects them: a namespace key plus the local name. */\nconst NAMESPACED_ATTRIBUTES: Record<string, { name: string; namespace: string }> = {\n xlinkActuate: { name: 'actuate', namespace: 'xlink' },\n xlinkArcrole: { name: 'arcrole', namespace: 'xlink' },\n xlinkHref: { name: 'href', namespace: 'xlink' },\n xlinkRole: { name: 'role', namespace: 'xlink' },\n xlinkShow: { name: 'show', namespace: 'xlink' },\n xlinkTitle: { name: 'title', namespace: 'xlink' },\n xlinkType: { name: 'type', namespace: 'xlink' },\n xmlBase: { name: 'base', namespace: 'xml' },\n xmlLang: { name: 'lang', namespace: 'xml' },\n xmlSpace: { name: 'space', namespace: 'xml' },\n xmlnsXlink: { name: 'xlink', namespace: 'xmlns' },\n};\n\n/** Props React consumes itself and never writes to the DOM. */\nconst IGNORED_PROPS = new Set(['key', 'ref', 'children', 'dangerouslySetInnerHTML']);\n\nexport interface SvgAttribute {\n /** Local attribute name */\n name: string;\n /** Renderer2 namespace key (xlink, xml, xmlns) or null */\n namespace: string | null;\n value: string;\n}\n\nexport function toSvgAttribute(prop: string, value: unknown): SvgAttribute | null {\n if (IGNORED_PROPS.has(prop) || value === undefined || value === null || value === false) {\n return null;\n }\n if (typeof value === 'function' || typeof value === 'object') {\n return null;\n }\n const stringValue = value === true ? '' : String(value);\n\n if (prop === 'className') {\n return { name: 'class', namespace: null, value: stringValue };\n }\n if (prop === 'htmlFor') {\n return { name: 'for', namespace: null, value: stringValue };\n }\n const namespaced = NAMESPACED_ATTRIBUTES[prop];\n if (namespaced) {\n return { name: namespaced.name, namespace: namespaced.namespace, value: stringValue };\n }\n if (CAMEL_CASE_ATTRIBUTES.has(prop) || !/[A-Z]/.test(prop)) {\n return { name: prop, namespace: null, value: stringValue };\n }\n return {\n name: prop.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`),\n namespace: null,\n value: stringValue,\n };\n}\n","import {\n Directive,\n ElementRef,\n Input,\n OnChanges,\n Renderer2,\n inject,\n} from \"@angular/core\";\nimport { toSvgAttribute } from \"../lib/svg-attributes\";\n\n/** One icon child: an SVG tag name plus React-style props. */\nexport interface SvgChildNode {\n tag: string;\n [prop: string]: unknown;\n}\n\n/**\n * Renders icon children into the host <svg>, with any tag and any attribute, the way\n * React's createElement does. A template can't bind a dynamic tag name, so the nodes\n * are built through Renderer2. It runs in ngOnChanges, i.e. synchronously during\n * change detection, so the icon is in the DOM right after detectChanges() and in\n * server-rendered HTML. Any children already present (e.g. from SSR) are replaced.\n */\n@Directive({\n selector: \"svg[hugeiconsSvgChildren]\",\n standalone: true,\n})\nexport class HugeiconsSvgChildrenDirective implements OnChanges {\n @Input({ required: true }) hugeiconsSvgChildren!: readonly SvgChildNode[];\n\n private readonly host: ElementRef<SVGSVGElement> = inject(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n ngOnChanges(): void {\n const svg = this.host.nativeElement;\n\n while (svg.firstChild) {\n this.renderer.removeChild(svg, svg.firstChild);\n }\n\n for (const { tag, ...props } of this.hugeiconsSvgChildren ?? []) {\n const child = this.renderer.createElement(tag, \"svg\");\n for (const [prop, value] of Object.entries(props)) {\n const attribute = toSvgAttribute(prop, value);\n if (attribute) {\n this.renderer.setAttribute(\n child,\n attribute.name,\n attribute.value,\n attribute.namespace ?? undefined,\n );\n }\n }\n this.renderer.appendChild(svg, child);\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n computed,\n input,\n} from \"@angular/core\";\nimport { IconSvgObject } from \"../lib/types\";\nimport { HugeiconsSvgChildrenDirective } from \"./svg-children.directive\";\n\n/**\n * One SVG child of an icon: the icon data's props (React-style camelCase names)\n * plus `tag`, the element name. The named fields are the ones 1.0.11 exposed.\n */\ninterface PathData {\n tag: string;\n d?: string;\n fill?: string;\n opacity?: string;\n fillRule?: string;\n stroke?: string;\n strokeWidth?: number | string;\n [prop: string]: unknown;\n}\n\n/**\n * 1.0.11 wrote fill=\"none\" on every child it rendered (always path, circle, ellipse or\n * rect). Kept for those tags so CSS such as `svg { fill: ... }` behaves as before;\n * any other tag is left untouched, like React.\n */\nconst LEGACY_FILL_NONE_TAGS = new Set([\"path\", \"circle\", \"ellipse\", \"rect\"]);\n\n@Component({\n selector: \"hugeicons-icon\",\n standalone: true,\n imports: [HugeiconsSvgChildrenDirective],\n template: `\n <svg\n [attr.width]=\"resolvedSize()\"\n [attr.height]=\"resolvedSize()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n [attr.color]=\"mainColor()\"\n [attr.stroke]=\"strokeOverride()?.stroke\"\n [attr.stroke-width]=\"strokeOverride()?.strokeWidth\"\n [class]=\"iconClass()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n [hugeiconsSvgChildren]=\"paths()\"\n ></svg>\n `,\n host: {\n style:\n \"display: inline-flex; align-items: center; justify-content: center;\",\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HugeiconsIconComponent {\n // Signal inputs - modern Angular 17.1+ approach\n readonly size = input<string | number>(24);\n readonly strokeWidth = input<number | undefined>(undefined);\n readonly absoluteStrokeWidth = input<boolean>(false);\n readonly icon = input.required<IconSvgObject>();\n readonly altIcon = input<IconSvgObject | undefined>(undefined);\n readonly color = input<string>(\"currentColor\");\n readonly iconClass = input<string>(\"\", { alias: \"class\" });\n readonly showAlt = input<boolean>(false);\n readonly primaryColor = input<string | undefined>(undefined);\n readonly secondaryColor = input<string | undefined>(undefined);\n readonly disableSecondaryOpacity = input<boolean>(false);\n\n // Like React's default props: an explicitly bound `undefined` still falls back to the default\n readonly resolvedSize = computed(() => this.size() ?? 24);\n readonly mainColor = computed(\n () => this.primaryColor() || (this.color() ?? \"currentColor\"),\n );\n\n /** Stroke width/color forced by the strokeWidth input, applied to the svg and every child. */\n readonly strokeOverride = computed(() => {\n const strokeWidthValue = this.strokeWidth();\n if (strokeWidthValue === undefined) {\n return undefined;\n }\n const strokeWidth = this.absoluteStrokeWidth()\n ? (Number(strokeWidthValue) * 24) / Number(this.resolvedSize())\n : strokeWidthValue;\n return { strokeWidth, stroke: \"currentColor\" };\n });\n\n // Computed signal for reactive path updates\n readonly paths = computed<PathData[]>(() => {\n const currentIcon =\n this.showAlt() && this.altIcon() ? this.altIcon()! : this.icon();\n\n if (!currentIcon || !Array.isArray(currentIcon)) {\n return [];\n }\n\n const strokeOverride = this.strokeOverride();\n const mainColor = this.mainColor();\n const secondaryColor = this.secondaryColor();\n const disableSecondaryOpacity = this.disableSecondaryOpacity();\n\n // Same ordering as @hugeicons/react: secondary (opacity) layers first\n return [...currentIcon]\n .sort(([, a], [, b]) => {\n const hasOpacityA = a[\"opacity\"] !== undefined;\n const hasOpacityB = b[\"opacity\"] !== undefined;\n return hasOpacityB ? 1 : hasOpacityA ? -1 : 0;\n })\n .map(([tag, rawAttrs]) => {\n const attrs = rawAttrs as Record<string, unknown>;\n const isSecondary = attrs[\"opacity\"] !== undefined;\n const colorProps = secondaryColor\n ? {\n [attrs[\"stroke\"] !== undefined ? \"stroke\" : \"fill\"]: isSecondary\n ? secondaryColor\n : mainColor,\n }\n : {};\n\n return {\n ...attrs,\n tag,\n fill:\n (attrs[\"fill\"] as string | undefined) ||\n (LEGACY_FILL_NONE_TAGS.has(tag) ? \"none\" : undefined),\n ...strokeOverride,\n ...colorProps,\n opacity:\n isSecondary && !disableSecondaryOpacity\n ? attrs[\"opacity\"]\n : undefined,\n } as PathData;\n });\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps the React-style prop names used by the icon data (strokeWidth, fillRule, xlinkHref …)
|
|
3
|
+
* to real SVG attribute names, following the same rules as React DOM:
|
|
4
|
+
* - names that SVG itself spells in camelCase (viewBox, gradientTransform …) are kept as-is
|
|
5
|
+
* - xlink / xml prefixed names get their namespace
|
|
6
|
+
* - every other camelCase name becomes kebab-case (strokeLinecap → stroke-linecap)
|
|
7
|
+
* - names that are already kebab-case or lowercase pass through unchanged
|
|
8
|
+
*/
|
|
9
|
+
export interface SvgAttribute {
|
|
10
|
+
/** Local attribute name */
|
|
11
|
+
name: string;
|
|
12
|
+
/** Renderer2 namespace key (xlink, xml, xmlns) or null */
|
|
13
|
+
namespace: string | null;
|
|
14
|
+
value: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function toSvgAttribute(prop: string, value: unknown): SvgAttribute | null;
|
package/dist/lib/types.d.ts
CHANGED