@hyalo/angular 0.0.0-stage → 0.1.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.
Files changed (83) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +32 -3
  4. package/fesm2022/hyalo-angular-accordion.mjs +230 -0
  5. package/fesm2022/hyalo-angular-accordion.mjs.map +1 -0
  6. package/fesm2022/hyalo-angular-button.mjs +203 -0
  7. package/fesm2022/hyalo-angular-button.mjs.map +1 -0
  8. package/fesm2022/hyalo-angular-card.mjs +221 -0
  9. package/fesm2022/hyalo-angular-card.mjs.map +1 -0
  10. package/fesm2022/hyalo-angular-choice.mjs +788 -0
  11. package/fesm2022/hyalo-angular-choice.mjs.map +1 -0
  12. package/fesm2022/hyalo-angular-dialog.mjs +571 -0
  13. package/fesm2022/hyalo-angular-dialog.mjs.map +1 -0
  14. package/fesm2022/hyalo-angular-field.mjs +312 -0
  15. package/fesm2022/hyalo-angular-field.mjs.map +1 -0
  16. package/fesm2022/hyalo-angular-icon.mjs +343 -0
  17. package/fesm2022/hyalo-angular-icon.mjs.map +1 -0
  18. package/fesm2022/hyalo-angular-interaction.mjs +455 -0
  19. package/fesm2022/hyalo-angular-interaction.mjs.map +1 -0
  20. package/fesm2022/hyalo-angular-navbar.mjs +343 -0
  21. package/fesm2022/hyalo-angular-navbar.mjs.map +1 -0
  22. package/fesm2022/hyalo-angular-overlay.mjs +94 -0
  23. package/fesm2022/hyalo-angular-overlay.mjs.map +1 -0
  24. package/fesm2022/hyalo-angular-popover-overlay-kit-6wPwnxln.mjs +3 -0
  25. package/fesm2022/hyalo-angular-popover.mjs +487 -0
  26. package/fesm2022/hyalo-angular-popover.mjs.map +1 -0
  27. package/fesm2022/hyalo-angular-segmented.mjs +223 -0
  28. package/fesm2022/hyalo-angular-segmented.mjs.map +1 -0
  29. package/fesm2022/hyalo-angular-select.mjs +464 -0
  30. package/fesm2022/hyalo-angular-select.mjs.map +1 -0
  31. package/fesm2022/hyalo-angular-tabs.mjs +324 -0
  32. package/fesm2022/hyalo-angular-tabs.mjs.map +1 -0
  33. package/fesm2022/hyalo-angular-theme.mjs +94 -0
  34. package/fesm2022/hyalo-angular-theme.mjs.map +1 -0
  35. package/fesm2022/hyalo-angular-toast.mjs +322 -0
  36. package/fesm2022/hyalo-angular-toast.mjs.map +1 -0
  37. package/fesm2022/hyalo-angular.mjs +473 -0
  38. package/fesm2022/hyalo-angular.mjs.map +1 -0
  39. package/package.json +133 -3
  40. package/styles/hyalo-core.css +25 -0
  41. package/styles/hyalo.css +17 -0
  42. package/styles/overlays/dialog.css +9 -0
  43. package/styles/overlays/popover.css +9 -0
  44. package/styles/overlays/select.css +9 -0
  45. package/styles/overlays/toast.css +8 -0
  46. package/styles/palettes/aurora.css +47 -0
  47. package/styles/palettes/ember.css +47 -0
  48. package/styles/palettes/graphite.css +47 -0
  49. package/styles/palettes/ocean.css +47 -0
  50. package/styles/palettes/orchid.css +47 -0
  51. package/styles/palettes/rose.css +47 -0
  52. package/styles/parts/card.css +49 -0
  53. package/styles/parts/dialog.css +116 -0
  54. package/styles/parts/drawer.css +124 -0
  55. package/styles/parts/field.css +36 -0
  56. package/styles/parts/glass.css +137 -0
  57. package/styles/parts/motion.css +82 -0
  58. package/styles/parts/navbar.css +55 -0
  59. package/styles/parts/popover.css +27 -0
  60. package/styles/parts/presence.css +55 -0
  61. package/styles/parts/reset.css +42 -0
  62. package/styles/parts/select.css +46 -0
  63. package/styles/parts/themes.css +105 -0
  64. package/styles/parts/toast.css +128 -0
  65. package/styles/parts/tokens.css +151 -0
  66. package/styles/parts/typography.css +64 -0
  67. package/types/hyalo-angular-accordion.d.ts +74 -0
  68. package/types/hyalo-angular-button.d.ts +88 -0
  69. package/types/hyalo-angular-card.d.ts +61 -0
  70. package/types/hyalo-angular-choice.d.ts +259 -0
  71. package/types/hyalo-angular-dialog.d.ts +170 -0
  72. package/types/hyalo-angular-field.d.ts +135 -0
  73. package/types/hyalo-angular-icon.d.ts +122 -0
  74. package/types/hyalo-angular-interaction.d.ts +131 -0
  75. package/types/hyalo-angular-navbar.d.ts +110 -0
  76. package/types/hyalo-angular-overlay.d.ts +31 -0
  77. package/types/hyalo-angular-popover.d.ts +142 -0
  78. package/types/hyalo-angular-segmented.d.ts +79 -0
  79. package/types/hyalo-angular-select.d.ts +130 -0
  80. package/types/hyalo-angular-tabs.d.ts +102 -0
  81. package/types/hyalo-angular-theme.d.ts +46 -0
  82. package/types/hyalo-angular-toast.d.ts +79 -0
  83. package/types/hyalo-angular.d.ts +345 -0
@@ -0,0 +1,343 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, Directive, ElementRef, Injectable, InjectionToken, Renderer2, computed, effect, inject, input, isDevMode } from "@angular/core";
3
+ const HY_BUILTIN_ICONS = {
4
+ x: { node: [["path", { d: "M18 6 6 18" }], ["path", { d: "m6 6 12 12" }]] },
5
+ check: { node: [["path", { d: "M20 6 9 17l-5-5" }]] },
6
+ minus: { node: [["path", { d: "M5 12h14" }]] },
7
+ "chevron-down": { node: [["path", { d: "m6 9 6 6 6-6" }]] },
8
+ "chevron-end": {
9
+ node: [["path", { d: "m9 18 6-6-6-6" }]],
10
+ mirrorRtl: true
11
+ },
12
+ menu: { node: [
13
+ ["path", { d: "M4 5h16" }],
14
+ ["path", { d: "M4 12h16" }],
15
+ ["path", { d: "M4 19h16" }]
16
+ ] },
17
+ info: { node: [
18
+ ["circle", {
19
+ cx: 12,
20
+ cy: 12,
21
+ r: 10
22
+ }],
23
+ ["path", { d: "M12 16v-4" }],
24
+ ["path", { d: "M12 8h.01" }]
25
+ ] },
26
+ success: { node: [["circle", {
27
+ cx: 12,
28
+ cy: 12,
29
+ r: 10
30
+ }], ["path", { d: "m16 9-5.5 5.5L8 12" }]] },
31
+ warning: { node: [
32
+ ["path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }],
33
+ ["path", { d: "M12 9v4" }],
34
+ ["path", { d: "M12 17h.01" }]
35
+ ] },
36
+ danger: { node: [
37
+ ["circle", {
38
+ cx: 12,
39
+ cy: 12,
40
+ r: 10
41
+ }],
42
+ ["path", { d: "M12 8v4" }],
43
+ ["path", { d: "M12 16h.01" }]
44
+ ] },
45
+ spinner: { node: [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }]] }
46
+ };
47
+ const HY_ICONS = new InjectionToken("HY_ICONS");
48
+ function provideHyaloIcons(icons) {
49
+ return {
50
+ provide: HY_ICONS,
51
+ multi: true,
52
+ useValue: icons
53
+ };
54
+ }
55
+ function isDef(value) {
56
+ return !Array.isArray(value);
57
+ }
58
+ var HyIconRegistry = class HyIconRegistry {
59
+ icons = new Map(Object.entries(HY_BUILTIN_ICONS));
60
+ sets = inject(HY_ICONS, { optional: true }) ?? [];
61
+ constructor() {
62
+ for (const set of this.sets) for (const [name, icon] of Object.entries(set)) this.register(name, icon);
63
+ }
64
+ register(name, icon) {
65
+ this.icons.set(name, isDef(icon) ? icon : { node: icon });
66
+ }
67
+ get(name) {
68
+ return this.icons.get(name);
69
+ }
70
+ lookup(name, sets) {
71
+ if (sets && sets !== this.sets) for (const set of [...sets].reverse()) {
72
+ const icon = Object.hasOwn(set, name) ? set[name] : void 0;
73
+ if (icon) return isDef(icon) ? icon : { node: icon };
74
+ }
75
+ return this.get(name);
76
+ }
77
+ static ɵfac = i0.ɵɵngDeclareFactory({
78
+ minVersion: "12.0.0",
79
+ version: "22.2.3",
80
+ ngImport: i0,
81
+ type: HyIconRegistry,
82
+ deps: [],
83
+ target: i0.ɵɵFactoryTarget.Injectable
84
+ });
85
+ static ɵprov = i0.ɵɵngDeclareInjectable({
86
+ minVersion: "12.0.0",
87
+ version: "22.2.3",
88
+ ngImport: i0,
89
+ type: HyIconRegistry,
90
+ providedIn: "root"
91
+ });
92
+ };
93
+ i0.ɵɵngDeclareClassMetadata({
94
+ minVersion: "12.0.0",
95
+ version: "22.2.3",
96
+ ngImport: i0,
97
+ type: HyIconRegistry,
98
+ decorators: [{
99
+ type: Injectable,
100
+ args: [{ providedIn: "root" }]
101
+ }],
102
+ ctorParameters: () => []
103
+ });
104
+ const SAFE_ATTRS = /* @__PURE__ */ new Set([
105
+ "d",
106
+ "cx",
107
+ "cy",
108
+ "r",
109
+ "rx",
110
+ "ry",
111
+ "x",
112
+ "y",
113
+ "x1",
114
+ "x2",
115
+ "y1",
116
+ "y2",
117
+ "width",
118
+ "height",
119
+ "points",
120
+ "fill",
121
+ "stroke",
122
+ "stroke-width",
123
+ "opacity",
124
+ "transform"
125
+ ]);
126
+ var HyIconAttrs = class HyIconAttrs {
127
+ el = inject(ElementRef).nativeElement;
128
+ renderer = inject(Renderer2);
129
+ hyIconAttrs = input.required(...ngDevMode ? [{ debugName: "hyIconAttrs" }] : /* istanbul ignore next */ []);
130
+ constructor() {
131
+ let applied = /* @__PURE__ */ new Set();
132
+ effect(() => {
133
+ const next = /* @__PURE__ */ new Set();
134
+ for (const [name, value] of Object.entries(this.hyIconAttrs())) {
135
+ if (!SAFE_ATTRS.has(name)) continue;
136
+ this.renderer.setAttribute(this.el, name, String(value));
137
+ next.add(name);
138
+ }
139
+ for (const name of applied) if (!next.has(name)) this.renderer.removeAttribute(this.el, name);
140
+ applied = next;
141
+ });
142
+ }
143
+ static ɵfac = i0.ɵɵngDeclareFactory({
144
+ minVersion: "12.0.0",
145
+ version: "22.2.3",
146
+ ngImport: i0,
147
+ type: HyIconAttrs,
148
+ deps: [],
149
+ target: i0.ɵɵFactoryTarget.Directive
150
+ });
151
+ static ɵdir = i0.ɵɵngDeclareDirective({
152
+ minVersion: "17.1.0",
153
+ version: "22.2.3",
154
+ type: HyIconAttrs,
155
+ isStandalone: true,
156
+ selector: "[hyIconAttrs]",
157
+ inputs: { hyIconAttrs: {
158
+ classPropertyName: "hyIconAttrs",
159
+ publicName: "hyIconAttrs",
160
+ isSignal: true,
161
+ isRequired: true,
162
+ transformFunction: null
163
+ } },
164
+ ngImport: i0
165
+ });
166
+ };
167
+ i0.ɵɵngDeclareClassMetadata({
168
+ minVersion: "12.0.0",
169
+ version: "22.2.3",
170
+ ngImport: i0,
171
+ type: HyIconAttrs,
172
+ decorators: [{
173
+ type: Directive,
174
+ args: [{ selector: "[hyIconAttrs]" }]
175
+ }],
176
+ ctorParameters: () => [],
177
+ propDecorators: { hyIconAttrs: [{
178
+ type: i0.Input,
179
+ args: [{
180
+ isSignal: true,
181
+ alias: "hyIconAttrs",
182
+ required: true
183
+ }]
184
+ }] }
185
+ });
186
+ var HyIcon = class HyIcon {
187
+ registry = inject(HyIconRegistry);
188
+ sets = inject(HY_ICONS, { optional: true });
189
+ name = input(...ngDevMode ? [void 0, { debugName: "name" }] : /* istanbul ignore next */ []);
190
+ icon = input(...ngDevMode ? [void 0, { debugName: "icon" }] : /* istanbul ignore next */ []);
191
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
192
+ size = input(...ngDevMode ? [void 0, { debugName: "size" }] : /* istanbul ignore next */ []);
193
+ strokeWidth = input(1.75, ...ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []);
194
+ def = computed(() => {
195
+ const icon = this.icon();
196
+ if (icon) return Array.isArray(icon) ? { node: icon } : icon;
197
+ const name = this.name();
198
+ const found = name ? this.registry.lookup(name, this.sets) : void 0;
199
+ if (name && !found && isDevMode()) console.warn(`[hyalo] Unknown icon "${name}". Register it with provideHyaloIcons().`);
200
+ return found;
201
+ }, ...ngDevMode ? [{ debugName: "def" }] : /* istanbul ignore next */ []);
202
+ static ɵfac = i0.ɵɵngDeclareFactory({
203
+ minVersion: "12.0.0",
204
+ version: "22.2.3",
205
+ ngImport: i0,
206
+ type: HyIcon,
207
+ deps: [],
208
+ target: i0.ɵɵFactoryTarget.Component
209
+ });
210
+ static ɵcmp = i0.ɵɵngDeclareComponent({
211
+ minVersion: "17.0.0",
212
+ version: "22.2.3",
213
+ type: HyIcon,
214
+ isStandalone: true,
215
+ selector: "hy-icon",
216
+ inputs: {
217
+ name: {
218
+ classPropertyName: "name",
219
+ publicName: "name",
220
+ isSignal: true,
221
+ isRequired: false,
222
+ transformFunction: null
223
+ },
224
+ icon: {
225
+ classPropertyName: "icon",
226
+ publicName: "icon",
227
+ isSignal: true,
228
+ isRequired: false,
229
+ transformFunction: null
230
+ },
231
+ label: {
232
+ classPropertyName: "label",
233
+ publicName: "label",
234
+ isSignal: true,
235
+ isRequired: false,
236
+ transformFunction: null
237
+ },
238
+ size: {
239
+ classPropertyName: "size",
240
+ publicName: "size",
241
+ isSignal: true,
242
+ isRequired: false,
243
+ transformFunction: null
244
+ },
245
+ strokeWidth: {
246
+ classPropertyName: "strokeWidth",
247
+ publicName: "strokeWidth",
248
+ isSignal: true,
249
+ isRequired: false,
250
+ transformFunction: null
251
+ }
252
+ },
253
+ host: {
254
+ properties: {
255
+ "attr.role": "label() ? \"img\" : null",
256
+ "attr.aria-label": "label() || null",
257
+ "attr.aria-hidden": "label() ? null : \"true\"",
258
+ "attr.data-mirror-rtl": "def()?.mirrorRtl || null",
259
+ "style.--hy-icon-size": "size()"
260
+ },
261
+ classAttribute: "hy-icon"
262
+ },
263
+ ngImport: i0,
264
+ template: "<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n [attr.stroke-width]=\"strokeWidth()\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n focusable=\"false\"\r\n>\r\n @for (child of def()?.node; track $index) {\r\n @switch (child[0]) {\r\n @case ('path') {\r\n <svg:path [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('circle') {\r\n <svg:circle [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('line') {\r\n <svg:line [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('rect') {\r\n <svg:rect [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('polyline') {\r\n <svg:polyline [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('polygon') {\r\n <svg:polygon [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('ellipse') {\r\n <svg:ellipse [hyIconAttrs]=\"child[1]\" />\r\n }\r\n }\r\n }\r\n</svg>\r\n",
265
+ styles: [":host{display:inline-flex;flex:none;inline-size:var(--hy-icon-size, 1.25em);block-size:var(--hy-icon-size, 1.25em);vertical-align:middle}svg{inline-size:100%;block-size:100%}:host-context([dir=\"rtl\"])[data-mirror-rtl] svg{transform:scaleX(-1)}\n"],
266
+ dependencies: [{
267
+ kind: "directive",
268
+ type: HyIconAttrs,
269
+ selector: "[hyIconAttrs]",
270
+ inputs: ["hyIconAttrs"]
271
+ }],
272
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
273
+ });
274
+ };
275
+ i0.ɵɵngDeclareClassMetadata({
276
+ minVersion: "12.0.0",
277
+ version: "22.2.3",
278
+ ngImport: i0,
279
+ type: HyIcon,
280
+ decorators: [{
281
+ type: Component,
282
+ args: [{
283
+ selector: "hy-icon",
284
+ imports: [HyIconAttrs],
285
+ changeDetection: ChangeDetectionStrategy.OnPush,
286
+ host: {
287
+ class: "hy-icon",
288
+ "[attr.role]": "label() ? \"img\" : null",
289
+ "[attr.aria-label]": "label() || null",
290
+ "[attr.aria-hidden]": "label() ? null : \"true\"",
291
+ "[attr.data-mirror-rtl]": "def()?.mirrorRtl || null",
292
+ "[style.--hy-icon-size]": "size()"
293
+ },
294
+ template: "<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n [attr.stroke-width]=\"strokeWidth()\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n focusable=\"false\"\r\n>\r\n @for (child of def()?.node; track $index) {\r\n @switch (child[0]) {\r\n @case ('path') {\r\n <svg:path [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('circle') {\r\n <svg:circle [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('line') {\r\n <svg:line [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('rect') {\r\n <svg:rect [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('polyline') {\r\n <svg:polyline [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('polygon') {\r\n <svg:polygon [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('ellipse') {\r\n <svg:ellipse [hyIconAttrs]=\"child[1]\" />\r\n }\r\n }\r\n }\r\n</svg>\r\n",
295
+ styles: [":host{display:inline-flex;flex:none;inline-size:var(--hy-icon-size, 1.25em);block-size:var(--hy-icon-size, 1.25em);vertical-align:middle}svg{inline-size:100%;block-size:100%}:host-context([dir=\"rtl\"])[data-mirror-rtl] svg{transform:scaleX(-1)}\n"]
296
+ }]
297
+ }],
298
+ propDecorators: {
299
+ name: [{
300
+ type: i0.Input,
301
+ args: [{
302
+ isSignal: true,
303
+ alias: "name",
304
+ required: false
305
+ }]
306
+ }],
307
+ icon: [{
308
+ type: i0.Input,
309
+ args: [{
310
+ isSignal: true,
311
+ alias: "icon",
312
+ required: false
313
+ }]
314
+ }],
315
+ label: [{
316
+ type: i0.Input,
317
+ args: [{
318
+ isSignal: true,
319
+ alias: "label",
320
+ required: false
321
+ }]
322
+ }],
323
+ size: [{
324
+ type: i0.Input,
325
+ args: [{
326
+ isSignal: true,
327
+ alias: "size",
328
+ required: false
329
+ }]
330
+ }],
331
+ strokeWidth: [{
332
+ type: i0.Input,
333
+ args: [{
334
+ isSignal: true,
335
+ alias: "strokeWidth",
336
+ required: false
337
+ }]
338
+ }]
339
+ }
340
+ });
341
+ export { HY_BUILTIN_ICONS, HY_ICONS, HyIcon, HyIconAttrs, HyIconRegistry, provideHyaloIcons };
342
+
343
+ //# sourceMappingURL=hyalo-angular-icon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyalo-angular-icon.mjs","names":[],"sources":["../../../projects/hyalo/icon/icons.ts","../../../projects/hyalo/icon/registry.ts","../../../projects/hyalo/icon/icon.ts","../../../projects/hyalo/icon/icon.html"],"sourcesContent":["/**\r\n * Icon data in the same shape Lucide uses (`IconNode`), so any Lucide icon\r\n * can be registered as is:\r\n *\r\n * ```ts\r\n * import { ArrowRight } from 'lucide';\r\n * provideHyaloIcons({ 'arrow-right': ArrowRight })\r\n * ```\r\n *\r\n * Icons are data, not SVG strings, so nothing is ever parsed as HTML.\r\n */\r\nexport type HyIconNode = readonly (readonly [string, Readonly<Record<string, string | number>>])[];\r\n\r\n/** An icon plus how it behaves in right-to-left layouts. */\r\nexport interface HyIconDef {\r\n readonly node: HyIconNode;\r\n /** Mirror the icon in RTL. Set it for icons that point somewhere, like arrows. */\r\n readonly mirrorRtl?: boolean;\r\n}\r\n\r\n/*\r\n * The few icons the kit uses itself. Paths are from Lucide (ISC license,\r\n * Copyright (c) Lucide Icons and Contributors), https://lucide.dev.\r\n */\r\nexport const HY_BUILTIN_ICONS: Readonly<Record<string, HyIconDef>> = {\r\n x: {\r\n node: [\r\n ['path', { d: 'M18 6 6 18' }],\r\n ['path', { d: 'm6 6 12 12' }],\r\n ],\r\n },\r\n check: { node: [['path', { d: 'M20 6 9 17l-5-5' }]] },\r\n minus: { node: [['path', { d: 'M5 12h14' }]] },\r\n 'chevron-down': { node: [['path', { d: 'm6 9 6 6 6-6' }]] },\r\n 'chevron-end': { node: [['path', { d: 'm9 18 6-6-6-6' }]], mirrorRtl: true },\r\n menu: {\r\n node: [\r\n ['path', { d: 'M4 5h16' }],\r\n ['path', { d: 'M4 12h16' }],\r\n ['path', { d: 'M4 19h16' }],\r\n ],\r\n },\r\n info: {\r\n node: [\r\n ['circle', { cx: 12, cy: 12, r: 10 }],\r\n ['path', { d: 'M12 16v-4' }],\r\n ['path', { d: 'M12 8h.01' }],\r\n ],\r\n },\r\n success: {\r\n node: [\r\n ['circle', { cx: 12, cy: 12, r: 10 }],\r\n ['path', { d: 'm16 9-5.5 5.5L8 12' }],\r\n ],\r\n },\r\n warning: {\r\n node: [\r\n ['path', { d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3' }],\r\n ['path', { d: 'M12 9v4' }],\r\n ['path', { d: 'M12 17h.01' }],\r\n ],\r\n },\r\n danger: {\r\n node: [\r\n ['circle', { cx: 12, cy: 12, r: 10 }],\r\n ['path', { d: 'M12 8v4' }],\r\n ['path', { d: 'M12 16h.01' }],\r\n ],\r\n },\r\n spinner: { node: [['path', { d: 'M21 12a9 9 0 1 1-6.219-8.56' }]] },\r\n};\r\n","import { Injectable, InjectionToken, Provider, inject } from '@angular/core';\r\nimport { HY_BUILTIN_ICONS, type HyIconDef, type HyIconNode } from './icons';\r\n\r\ntype HyIconSet = Readonly<Record<string, HyIconDef | HyIconNode>>;\r\n\r\n/** Icons added with {@link provideHyaloIcons}. Collected from every provider. */\r\nexport const HY_ICONS = new InjectionToken<readonly HyIconSet[]>('HY_ICONS');\r\n\r\n/**\r\n * Registers icons by name. Only the icons you import end up in the bundle.\r\n *\r\n * ```ts\r\n * provideHyaloIcons({ search: Search, 'arrow-end': { node: ArrowRight, mirrorRtl: true } })\r\n * ```\r\n *\r\n * Works in `app.config.ts` and in a route's or component's `providers`.\r\n * Icons from the nearest provider win over app-wide ones.\r\n */\r\nexport function provideHyaloIcons(\r\n icons: Readonly<Record<string, HyIconDef | HyIconNode>>,\r\n): Provider {\r\n return { provide: HY_ICONS, multi: true, useValue: icons };\r\n}\r\n\r\nfunction isDef(value: HyIconDef | HyIconNode): value is HyIconDef {\r\n return !Array.isArray(value);\r\n}\r\n\r\n/** Looks up icons by name: built-ins first, then registered sets in order. */\r\n@Injectable({ providedIn: 'root' })\r\nexport class HyIconRegistry {\r\n private readonly icons = new Map<string, HyIconDef>(Object.entries(HY_BUILTIN_ICONS));\r\n private readonly sets = inject(HY_ICONS, { optional: true }) ?? [];\r\n\r\n constructor() {\r\n for (const set of this.sets) {\r\n for (const [name, icon] of Object.entries(set)) this.register(name, icon);\r\n }\r\n }\r\n\r\n /** Adds or replaces an icon at runtime. */\r\n register(name: string, icon: HyIconDef | HyIconNode): void {\r\n this.icons.set(name, isDef(icon) ? icon : { node: icon });\r\n }\r\n\r\n /** Returns the icon, or undefined when the name is unknown. */\r\n get(name: string): HyIconDef | undefined {\r\n return this.icons.get(name);\r\n }\r\n\r\n /**\r\n * @internal Looks in sets from a route or component injector first. This\r\n * registry lives in the root injector, so it never sees those itself.\r\n */\r\n lookup(name: string, sets: readonly HyIconSet[] | null): HyIconDef | undefined {\r\n if (sets && sets !== this.sets) {\r\n for (const set of [...sets].reverse()) {\r\n const icon = Object.hasOwn(set, name) ? set[name] : undefined;\r\n if (icon) return isDef(icon) ? icon : { node: icon };\r\n }\r\n }\r\n return this.get(name);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n} from '@angular/core';\r\nimport type { HyIconDef, HyIconNode } from './icons';\r\nimport { HY_ICONS, HyIconRegistry } from './registry';\r\n\r\nconst SAFE_ATTRS = new Set([\r\n 'd',\r\n 'cx',\r\n 'cy',\r\n 'r',\r\n 'rx',\r\n 'ry',\r\n 'x',\r\n 'y',\r\n 'x1',\r\n 'x2',\r\n 'y1',\r\n 'y2',\r\n 'width',\r\n 'height',\r\n 'points',\r\n 'fill',\r\n 'stroke',\r\n 'stroke-width',\r\n 'opacity',\r\n 'transform',\r\n]);\r\n\r\n/** Copies whitelisted geometry attributes onto an SVG child element. */\r\n@Directive({ selector: '[hyIconAttrs]' })\r\nexport class HyIconAttrs {\r\n private readonly el = inject(ElementRef).nativeElement as SVGElement;\r\n private readonly renderer = inject(Renderer2);\r\n readonly hyIconAttrs = input.required<Readonly<Record<string, string | number>>>();\r\n\r\n constructor() {\r\n let applied = new Set<string>();\r\n effect(() => {\r\n const next = new Set<string>();\r\n for (const [name, value] of Object.entries(this.hyIconAttrs())) {\r\n if (!SAFE_ATTRS.has(name)) continue;\r\n this.renderer.setAttribute(this.el, name, String(value));\r\n next.add(name);\r\n }\r\n // A swapped icon may not use every attribute the previous one did.\r\n for (const name of applied) {\r\n if (!next.has(name)) this.renderer.removeAttribute(this.el, name);\r\n }\r\n applied = next;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * An SVG icon from the registry, or passed in directly.\r\n *\r\n * ```html\r\n * <hy-icon name=\"check\" />\r\n * <hy-icon [icon]=\"ArrowRight\" label=\"Next\" />\r\n * ```\r\n *\r\n * Icons are decorative (`aria-hidden`) unless `label` is set, in which case\r\n * they get `role=\"img\"` and that label. The size follows the font size.\r\n */\r\n@Component({\r\n selector: 'hy-icon',\r\n imports: [HyIconAttrs],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'hy-icon',\r\n '[attr.role]': 'label() ? \"img\" : null',\r\n '[attr.aria-label]': 'label() || null',\r\n '[attr.aria-hidden]': 'label() ? null : \"true\"',\r\n '[attr.data-mirror-rtl]': 'def()?.mirrorRtl || null',\r\n '[style.--hy-icon-size]': 'size()',\r\n },\r\n templateUrl: './icon.html',\r\n styleUrl: './icon.css',\r\n})\r\nexport class HyIcon {\r\n private readonly registry = inject(HyIconRegistry);\r\n private readonly sets = inject(HY_ICONS, { optional: true });\r\n\r\n /** Registered icon name. */\r\n readonly name = input<string>();\r\n /** Icon data, used instead of `name`. */\r\n readonly icon = input<HyIconDef | HyIconNode>();\r\n /** Accessible name. Leave empty for decorative icons. */\r\n readonly label = input<string>();\r\n /** Any CSS length. Defaults to 1.25em. */\r\n readonly size = input<string>();\r\n /** Stroke width in viewBox units. */\r\n readonly strokeWidth = input(1.75);\r\n\r\n protected readonly def = computed<HyIconDef | undefined>(() => {\r\n const icon = this.icon();\r\n if (icon) return Array.isArray(icon) ? { node: icon as HyIconNode } : (icon as HyIconDef);\r\n const name = this.name();\r\n const found = name ? this.registry.lookup(name, this.sets) : undefined;\r\n if (name && !found && isDevMode()) {\r\n console.warn(`[hyalo] Unknown icon \"${name}\". Register it with provideHyaloIcons().`); // eslint-disable-line no-console\r\n }\r\n return found;\r\n });\r\n}\r\n","<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n [attr.stroke-width]=\"strokeWidth()\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n focusable=\"false\"\r\n>\r\n @for (child of def()?.node; track $index) {\r\n @switch (child[0]) {\r\n @case ('path') {\r\n <svg:path [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('circle') {\r\n <svg:circle [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('line') {\r\n <svg:line [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('rect') {\r\n <svg:rect [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('polyline') {\r\n <svg:polyline [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('polygon') {\r\n <svg:polygon [hyIconAttrs]=\"child[1]\" />\r\n }\r\n @case ('ellipse') {\r\n <svg:ellipse [hyIconAttrs]=\"child[1]\" />\r\n }\r\n }\r\n }\r\n</svg>\r\n"],"mappings":"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"}