@quikturn/logos-angular 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,528 @@
1
+ import { InjectionToken as L, makeEnvironmentProviders as M, assertInInjectionContext as V, inject as u, computed as n, Pipe as $, input as i, output as C, Component as k, contentChild as R, signal as p, ViewChild as E } from "@angular/core";
2
+ import { logoUrl as v, BASE_URL as S } from "@quikturn/logos";
3
+ import { CommonModule as T } from "@angular/common";
4
+ const g = new L(
5
+ "QUIKTURN_CONFIG"
6
+ );
7
+ function K(e) {
8
+ return M([
9
+ { provide: g, useValue: e }
10
+ ]);
11
+ }
12
+ function P(e) {
13
+ V(P);
14
+ const t = u(g, { optional: !0 });
15
+ return n(() => {
16
+ var s, r, l, c, d, h;
17
+ const o = ((s = e.token) == null ? void 0 : s.call(e)) ?? (t == null ? void 0 : t.token), a = ((r = e.baseUrl) == null ? void 0 : r.call(e)) ?? (t == null ? void 0 : t.baseUrl);
18
+ return v(e.domain(), {
19
+ token: o,
20
+ baseUrl: a,
21
+ size: (l = e.size) == null ? void 0 : l.call(e),
22
+ format: (c = e.format) == null ? void 0 : c.call(e),
23
+ greyscale: (d = e.greyscale) == null ? void 0 : d.call(e),
24
+ theme: (h = e.theme) == null ? void 0 : h.call(e)
25
+ });
26
+ });
27
+ }
28
+ var A = Object.getOwnPropertyDescriptor, F = (e, t, o, a) => {
29
+ for (var s = a > 1 ? void 0 : a ? A(t, o) : t, r = e.length - 1, l; r >= 0; r--)
30
+ (l = e[r]) && (s = l(s) || s);
31
+ return s;
32
+ };
33
+ let z = class {
34
+ constructor() {
35
+ this.config = u(g, { optional: !0 });
36
+ }
37
+ transform(e, t) {
38
+ var s, r;
39
+ const o = (t == null ? void 0 : t.token) ?? ((s = this.config) == null ? void 0 : s.token), a = (t == null ? void 0 : t.baseUrl) ?? ((r = this.config) == null ? void 0 : r.baseUrl);
40
+ return v(e, {
41
+ token: o,
42
+ baseUrl: a,
43
+ size: t == null ? void 0 : t.size,
44
+ format: t == null ? void 0 : t.format,
45
+ greyscale: t == null ? void 0 : t.greyscale,
46
+ theme: t == null ? void 0 : t.theme
47
+ });
48
+ }
49
+ };
50
+ z = F([
51
+ $({ name: "logoUrl", standalone: !0 })
52
+ ], z);
53
+ const U = /* @__PURE__ */ new Set();
54
+ function w(e) {
55
+ if (typeof window > "u" || !e || e.startsWith("sk_") || U.has(e)) return;
56
+ U.add(e);
57
+ const t = new Image();
58
+ t.src = `${S}/_beacon?token=${e}&page=${encodeURIComponent(location.href)}`;
59
+ }
60
+ function H(e) {
61
+ try {
62
+ const t = new URL(e, "https://placeholder.invalid");
63
+ return t.protocol === "https:" || t.protocol === "http:";
64
+ } catch {
65
+ return !1;
66
+ }
67
+ }
68
+ var D = Object.getOwnPropertyDescriptor, q = (e, t, o, a) => {
69
+ for (var s = a > 1 ? void 0 : a ? D(t, o) : t, r = e.length - 1, l; r >= 0; r--)
70
+ (l = e[r]) && (s = l(s) || s);
71
+ return s;
72
+ };
73
+ let _ = class {
74
+ constructor() {
75
+ this.config = u(g, { optional: !0 }), this.domain = i.required(), this.token = i(void 0), this.baseUrl = i(void 0), this.size = i(void 0), this.format = i(void 0), this.greyscale = i(void 0), this.theme = i(void 0), this.alt = i(void 0), this.href = i(void 0), this.cssClass = i(void 0, { alias: "class" }), this.loading = i("lazy"), this.imgError = C(), this.imgLoad = C(), this.effectiveToken = n(
76
+ () => {
77
+ var e;
78
+ return this.token() ?? ((e = this.config) == null ? void 0 : e.token) ?? "";
79
+ }
80
+ ), this.effectiveBaseUrl = n(
81
+ () => {
82
+ var e;
83
+ return this.baseUrl() ?? ((e = this.config) == null ? void 0 : e.baseUrl);
84
+ }
85
+ ), this.safeHref = n(() => {
86
+ const e = this.href();
87
+ return e && H(e) ? e : void 0;
88
+ }), this.src = n(
89
+ () => v(this.domain(), {
90
+ token: this.effectiveToken() || void 0,
91
+ size: this.size(),
92
+ format: this.format(),
93
+ greyscale: this.greyscale(),
94
+ theme: this.theme(),
95
+ baseUrl: this.effectiveBaseUrl()
96
+ })
97
+ ), this.altText = n(
98
+ () => this.alt() ?? `${this.domain()} logo`
99
+ );
100
+ }
101
+ ngOnInit() {
102
+ const e = this.effectiveToken();
103
+ e && w(e);
104
+ }
105
+ };
106
+ _ = q([
107
+ k({
108
+ selector: "quikturn-logo",
109
+ standalone: !0,
110
+ template: `
111
+ @if (safeHref()) {
112
+ <a [href]="safeHref()" target="_blank" rel="noopener noreferrer" [class]="cssClass()">
113
+ <img [src]="src()" [alt]="altText()" [attr.loading]="loading()" (error)="imgError.emit($event)" (load)="imgLoad.emit($event)" />
114
+ </a>
115
+ } @else if (cssClass()) {
116
+ <span [class]="cssClass()">
117
+ <img [src]="src()" [alt]="altText()" [attr.loading]="loading()" (error)="imgError.emit($event)" (load)="imgLoad.emit($event)" />
118
+ </span>
119
+ } @else {
120
+ <img [src]="src()" [alt]="altText()" [attr.loading]="loading()" (error)="imgError.emit($event)" (load)="imgLoad.emit($event)" />
121
+ }
122
+ `
123
+ })
124
+ ], _);
125
+ var j = Object.getOwnPropertyDescriptor, N = (e, t, o, a) => {
126
+ for (var s = a > 1 ? void 0 : a ? j(t, o) : t, r = e.length - 1, l; r >= 0; r--)
127
+ (l = e[r]) && (s = l(s) || s);
128
+ return s;
129
+ };
130
+ let I = class {
131
+ constructor() {
132
+ this.config = u(g, { optional: !0 }), this.domains = i(void 0), this.logos = i(void 0), this.token = i(void 0), this.baseUrl = i(void 0), this.columns = i(4), this.gap = i(24), this.logoSize = i(void 0), this.logoFormat = i(void 0), this.logoGreyscale = i(void 0), this.logoTheme = i(void 0), this.cssClass = i(void 0, { alias: "class" }), this.ariaLabel = i("Company logos"), this.customTemplate = R("renderItem"), this.effectiveToken = n(
133
+ () => {
134
+ var e;
135
+ return this.token() ?? ((e = this.config) == null ? void 0 : e.token) ?? "";
136
+ }
137
+ ), this.effectiveBaseUrl = n(
138
+ () => {
139
+ var e;
140
+ return this.baseUrl() ?? ((e = this.config) == null ? void 0 : e.baseUrl);
141
+ }
142
+ ), this.resolvedLogos = n(() => (this.logos() ?? (this.domains() ?? []).map((t) => ({ domain: t }))).map((t) => ({
143
+ domain: t.domain,
144
+ alt: t.alt ?? `${t.domain} logo`,
145
+ href: t.href && H(t.href) ? t.href : void 0,
146
+ url: v(t.domain, {
147
+ token: this.effectiveToken() || void 0,
148
+ size: t.size ?? this.logoSize(),
149
+ format: t.format ?? this.logoFormat(),
150
+ greyscale: t.greyscale ?? this.logoGreyscale(),
151
+ theme: t.theme ?? this.logoTheme(),
152
+ baseUrl: this.effectiveBaseUrl()
153
+ })
154
+ })));
155
+ }
156
+ ngOnInit() {
157
+ const e = this.effectiveToken();
158
+ e && w(e);
159
+ }
160
+ };
161
+ I = N([
162
+ k({
163
+ selector: "quikturn-logo-grid",
164
+ standalone: !0,
165
+ imports: [T],
166
+ template: `
167
+ <div
168
+ role="region"
169
+ [attr.aria-label]="ariaLabel()"
170
+ [class]="cssClass()"
171
+ [style.display]="'grid'"
172
+ [style.grid-template-columns]="'repeat(' + columns() + ', 1fr)'"
173
+ [style.gap.px]="gap()"
174
+ [style.align-items]="'center'"
175
+ [style.justify-items]="'center'"
176
+ >
177
+ @for (logo of resolvedLogos(); track logo.domain; let i = $index) {
178
+ @if (customTemplate()) {
179
+ <ng-container
180
+ [ngTemplateOutlet]="customTemplate()!"
181
+ [ngTemplateOutletContext]="{ $implicit: logo, index: i }"
182
+ ></ng-container>
183
+ } @else {
184
+ <div style="display: flex; align-items: center; justify-content: center;">
185
+ @if (logo.href) {
186
+ <a
187
+ [href]="logo.href"
188
+ target="_blank"
189
+ rel="noopener noreferrer"
190
+ [attr.aria-label]="logo.alt"
191
+ >
192
+ <img
193
+ [src]="logo.url"
194
+ [alt]="logo.alt"
195
+ loading="lazy"
196
+ style="max-width: 100%; height: auto; display: block;"
197
+ />
198
+ </a>
199
+ } @else {
200
+ <img
201
+ [src]="logo.url"
202
+ [alt]="logo.alt"
203
+ loading="lazy"
204
+ style="max-width: 100%; height: auto; display: block;"
205
+ />
206
+ }
207
+ </div>
208
+ }
209
+ }
210
+ </div>
211
+ `
212
+ })
213
+ ], I);
214
+ var B = Object.defineProperty, G = Object.getOwnPropertyDescriptor, x = (e, t, o, a) => {
215
+ for (var s = a > 1 ? void 0 : a ? G(t, o) : t, r = e.length - 1, l; r >= 0; r--)
216
+ (l = e[r]) && (s = (a ? l(t, o, s) : l(s)) || s);
217
+ return a && s && B(t, o, s), s;
218
+ };
219
+ const f = {
220
+ SMOOTH_TAU: 0.25,
221
+ MIN_COPIES: 2,
222
+ COPY_HEADROOM: 2
223
+ };
224
+ let b = class {
225
+ constructor() {
226
+ this.config = u(g, { optional: !0 }), this.domains = i(void 0), this.logos = i(void 0), this.token = i(void 0), this.baseUrl = i(void 0), this.speed = i(120), this.direction = i("left"), this.pauseOnHover = i(void 0), this.hoverSpeed = i(void 0), this.logoHeight = i(28), this.gap = i(32), this.width = i("100%"), this.fadeOut = i(!1), this.fadeOutColor = i("#ffffff"), this.scaleOnHover = i(!1), this.logoSize = i(void 0), this.logoFormat = i(void 0), this.logoGreyscale = i(void 0), this.logoTheme = i(void 0), this.cssClass = i(void 0, { alias: "class" }), this.ariaLabel = i("Company logos"), this.seqWidth = p(0), this.seqHeight = p(0), this.copyCount = p(f.MIN_COPIES), this.isHovered = p(!1), this.animationFrameId = null, this.currentVelocity = 0, this.offset = 0, this.resizeObserver = null, this.handleResize = () => this.updateDimensions(), this.effectiveToken = n(
227
+ () => {
228
+ var e;
229
+ return this.token() ?? ((e = this.config) == null ? void 0 : e.token) ?? "";
230
+ }
231
+ ), this.effectiveBaseUrl = n(
232
+ () => {
233
+ var e;
234
+ return this.baseUrl() ?? ((e = this.config) == null ? void 0 : e.baseUrl);
235
+ }
236
+ ), this.isVertical = n(
237
+ () => this.direction() === "up" || this.direction() === "down"
238
+ ), this.resolvedLogos = n(() => (this.logos() ?? (this.domains() ?? []).map((t) => ({ domain: t }))).map((t) => ({
239
+ domain: t.domain,
240
+ alt: t.alt ?? `${t.domain} logo`,
241
+ href: t.href,
242
+ url: v(t.domain, {
243
+ token: this.effectiveToken() || void 0,
244
+ size: t.size ?? this.logoSize(),
245
+ format: t.format ?? this.logoFormat(),
246
+ greyscale: t.greyscale ?? this.logoGreyscale(),
247
+ theme: t.theme ?? this.logoTheme(),
248
+ baseUrl: this.effectiveBaseUrl()
249
+ })
250
+ }))), this.cssWidth = n(() => {
251
+ const e = this.width();
252
+ return typeof e == "number" ? `${e}px` : e ?? "100%";
253
+ }), this.copyIndices = n(
254
+ () => Array.from({ length: this.copyCount() }, (e, t) => t)
255
+ ), this.targetVelocity = n(() => {
256
+ const e = Math.abs(this.speed()), t = this.isVertical() ? this.direction() === "up" ? 1 : -1 : this.direction() === "left" ? 1 : -1, o = this.speed() < 0 ? -1 : 1;
257
+ return e * t * o;
258
+ }), this.effectiveHoverSpeed = n(() => {
259
+ const e = this.hoverSpeed();
260
+ if (e !== void 0) return e;
261
+ if (this.pauseOnHover() === !0) return 0;
262
+ });
263
+ }
264
+ // ---------------------------------------------------------------------------
265
+ // Lifecycle
266
+ // ---------------------------------------------------------------------------
267
+ ngOnInit() {
268
+ const e = this.effectiveToken();
269
+ e && w(e);
270
+ }
271
+ ngAfterViewInit() {
272
+ var t;
273
+ this.updateDimensions(), this.trackImageLoads(), this.startAnimation();
274
+ const e = (t = this.containerRef) == null ? void 0 : t.nativeElement;
275
+ e && typeof window < "u" && (window.ResizeObserver ? (this.resizeObserver = new ResizeObserver(() => this.updateDimensions()), this.resizeObserver.observe(e)) : window.addEventListener("resize", this.handleResize));
276
+ }
277
+ ngOnDestroy() {
278
+ var e;
279
+ this.stopAnimation(), (e = this.resizeObserver) == null || e.disconnect(), this.resizeObserver = null, typeof window < "u" && window.removeEventListener("resize", this.handleResize);
280
+ }
281
+ // ---------------------------------------------------------------------------
282
+ // Hover handlers
283
+ // ---------------------------------------------------------------------------
284
+ handleMouseEnter() {
285
+ this.effectiveHoverSpeed() !== void 0 && this.isHovered.set(!0);
286
+ }
287
+ handleMouseLeave() {
288
+ this.effectiveHoverSpeed() !== void 0 && this.isHovered.set(!1);
289
+ }
290
+ // ---------------------------------------------------------------------------
291
+ // Animation
292
+ // ---------------------------------------------------------------------------
293
+ updateDimensions() {
294
+ var l, c, d;
295
+ const e = (l = this.containerRef) == null ? void 0 : l.nativeElement, t = (c = this.trackRef) == null ? void 0 : c.nativeElement;
296
+ if (!e || !t) return;
297
+ const o = t.querySelector("ul");
298
+ if (!o) return;
299
+ const a = o.getBoundingClientRect(), s = a.width, r = a.height;
300
+ if (this.isVertical()) {
301
+ const h = ((d = e.parentElement) == null ? void 0 : d.clientHeight) ?? 0;
302
+ if (h > 0 && (e.style.height = `${Math.ceil(h)}px`), r > 0) {
303
+ this.seqHeight.set(Math.ceil(r));
304
+ const m = e.clientHeight || h || r, O = Math.ceil(m / r) + f.COPY_HEADROOM;
305
+ this.copyCount.set(Math.max(f.MIN_COPIES, O));
306
+ }
307
+ } else if (s > 0) {
308
+ this.seqWidth.set(Math.ceil(s));
309
+ const h = e.clientWidth || 0, m = Math.ceil(h / s) + f.COPY_HEADROOM;
310
+ this.copyCount.set(Math.max(f.MIN_COPIES, m));
311
+ }
312
+ }
313
+ // INC-9: Track image load events before measuring
314
+ trackImageLoads() {
315
+ var s;
316
+ const e = (s = this.trackRef) == null ? void 0 : s.nativeElement;
317
+ if (!e) return;
318
+ const t = e.querySelectorAll("ul:first-child img");
319
+ if (t.length === 0) return;
320
+ let o = t.length;
321
+ const a = () => {
322
+ o--, o === 0 && this.updateDimensions();
323
+ };
324
+ t.forEach((r) => {
325
+ const l = r;
326
+ l.complete ? a() : (l.addEventListener("load", a, { once: !0 }), l.addEventListener("error", a, { once: !0 }));
327
+ });
328
+ }
329
+ startAnimation() {
330
+ var s, r;
331
+ const e = (s = this.trackRef) == null ? void 0 : s.nativeElement;
332
+ if (!e) return;
333
+ if (typeof window < "u" && ((r = window.matchMedia) == null ? void 0 : r.call(window, "(prefers-reduced-motion: reduce)").matches)) {
334
+ e.style.transform = "translate3d(0, 0, 0)";
335
+ return;
336
+ }
337
+ let o = null;
338
+ this.currentVelocity = this.targetVelocity();
339
+ const a = (l) => {
340
+ if (o === null) {
341
+ o = l, this.animationFrameId = requestAnimationFrame(a);
342
+ return;
343
+ }
344
+ const c = Math.min(Math.max(0, (l - o) / 1e3), 0.1);
345
+ o = l;
346
+ const d = this.effectiveHoverSpeed(), h = this.isHovered() && d !== void 0 ? d : this.targetVelocity(), m = f.SMOOTH_TAU, O = 1 - Math.exp(-c / m);
347
+ this.currentVelocity += (h - this.currentVelocity) * O, this.offset += this.currentVelocity * c;
348
+ const y = this.isVertical() ? this.seqHeight() : this.seqWidth();
349
+ y > 0 && (this.offset = (this.offset % y + y) % y), this.isVertical() ? e.style.transform = `translate3d(0, ${-this.offset}px, 0)` : e.style.transform = `translate3d(${-this.offset}px, 0, 0)`, this.animationFrameId = requestAnimationFrame(a);
350
+ };
351
+ this.animationFrameId = requestAnimationFrame(a);
352
+ }
353
+ stopAnimation() {
354
+ this.animationFrameId !== null && (cancelAnimationFrame(this.animationFrameId), this.animationFrameId = null);
355
+ }
356
+ };
357
+ x([
358
+ E("container")
359
+ ], b.prototype, "containerRef", 2);
360
+ x([
361
+ E("track")
362
+ ], b.prototype, "trackRef", 2);
363
+ b = x([
364
+ k({
365
+ selector: "quikturn-logo-carousel",
366
+ standalone: !0,
367
+ imports: [T],
368
+ template: `
369
+ <div
370
+ #container
371
+ role="region"
372
+ [attr.aria-label]="ariaLabel()"
373
+ [class]="cssClass()"
374
+ [style.position]="'relative'"
375
+ [style.overflow]="'hidden'"
376
+ [style.width]="isVertical() ? undefined : cssWidth()"
377
+ [style.height]="isVertical() ? '100%' : undefined"
378
+ >
379
+ @if (fadeOut()) {
380
+ @if (isVertical()) {
381
+ <div
382
+ aria-hidden="true"
383
+ data-testid="fade-overlay"
384
+ [style.position]="'absolute'"
385
+ [style.pointer-events]="'none'"
386
+ [style.z-index]="1"
387
+ [style.top]="'0'"
388
+ [style.left]="'0'"
389
+ [style.right]="'0'"
390
+ [style.height]="'clamp(24px, 8%, 120px)'"
391
+ [style.background]="
392
+ 'linear-gradient(to bottom, ' +
393
+ fadeOutColor() +
394
+ ' 0%, transparent 100%)'
395
+ "
396
+ ></div>
397
+ <div
398
+ aria-hidden="true"
399
+ data-testid="fade-overlay"
400
+ [style.position]="'absolute'"
401
+ [style.pointer-events]="'none'"
402
+ [style.z-index]="1"
403
+ [style.bottom]="'0'"
404
+ [style.left]="'0'"
405
+ [style.right]="'0'"
406
+ [style.height]="'clamp(24px, 8%, 120px)'"
407
+ [style.background]="
408
+ 'linear-gradient(to top, ' +
409
+ fadeOutColor() +
410
+ ' 0%, transparent 100%)'
411
+ "
412
+ ></div>
413
+ } @else {
414
+ <div
415
+ aria-hidden="true"
416
+ data-testid="fade-overlay"
417
+ [style.position]="'absolute'"
418
+ [style.pointer-events]="'none'"
419
+ [style.z-index]="1"
420
+ [style.top]="'0'"
421
+ [style.bottom]="'0'"
422
+ [style.left]="'0'"
423
+ [style.width]="'clamp(24px, 8%, 120px)'"
424
+ [style.background]="
425
+ 'linear-gradient(to right, ' +
426
+ fadeOutColor() +
427
+ ' 0%, transparent 100%)'
428
+ "
429
+ ></div>
430
+ <div
431
+ aria-hidden="true"
432
+ data-testid="fade-overlay"
433
+ [style.position]="'absolute'"
434
+ [style.pointer-events]="'none'"
435
+ [style.z-index]="1"
436
+ [style.top]="'0'"
437
+ [style.bottom]="'0'"
438
+ [style.right]="'0'"
439
+ [style.width]="'clamp(24px, 8%, 120px)'"
440
+ [style.background]="
441
+ 'linear-gradient(to left, ' +
442
+ fadeOutColor() +
443
+ ' 0%, transparent 100%)'
444
+ "
445
+ ></div>
446
+ }
447
+ }
448
+
449
+ <div
450
+ #track
451
+ [style.display]="'flex'"
452
+ [style.flex-direction]="isVertical() ? 'column' : 'row'"
453
+ [style.width]="isVertical() ? '100%' : 'max-content'"
454
+ [style.will-change]="'transform'"
455
+ [style.user-select]="'none'"
456
+ [style.position]="'relative'"
457
+ [style.z-index]="'0'"
458
+ (mouseenter)="handleMouseEnter()"
459
+ (mouseleave)="handleMouseLeave()"
460
+ >
461
+ @for (ci of copyIndices(); track ci) {
462
+ <ul
463
+ role="list"
464
+ [attr.aria-hidden]="ci > 0 ? 'true' : null"
465
+ [style.display]="'flex'"
466
+ [style.flex-direction]="isVertical() ? 'column' : 'row'"
467
+ [style.align-items]="'center'"
468
+ [style.list-style]="'none'"
469
+ [style.margin]="'0'"
470
+ [style.padding]="'0'"
471
+ >
472
+ @for (logo of resolvedLogos(); track logo.domain + '-' + ci + '-' + $index) {
473
+ <li
474
+ role="listitem"
475
+ [style.flex]="'none'"
476
+ [style.margin-right.px]="isVertical() ? 0 : gap()"
477
+ [style.margin-bottom.px]="isVertical() ? gap() : 0"
478
+ >
479
+ @if (logo.href) {
480
+ <a
481
+ [href]="logo.href"
482
+ target="_blank"
483
+ rel="noopener noreferrer"
484
+ [attr.aria-label]="logo.alt"
485
+ style="display: inline-flex; align-items: center; text-decoration: none"
486
+ >
487
+ <img
488
+ [src]="logo.url"
489
+ [alt]="logo.alt"
490
+ loading="lazy"
491
+ decoding="async"
492
+ [attr.draggable]="false"
493
+ [style.height.px]="logoHeight()"
494
+ style="width: auto; display: block; object-fit: contain"
495
+ />
496
+ </a>
497
+ } @else {
498
+ <span style="display: inline-flex; align-items: center">
499
+ <img
500
+ [src]="logo.url"
501
+ [alt]="logo.alt"
502
+ loading="lazy"
503
+ decoding="async"
504
+ [attr.draggable]="false"
505
+ [style.height.px]="logoHeight()"
506
+ style="width: auto; display: block; object-fit: contain"
507
+ />
508
+ </span>
509
+ }
510
+ </li>
511
+ }
512
+ </ul>
513
+ }
514
+ </div>
515
+ </div>
516
+ `
517
+ })
518
+ ], b);
519
+ export {
520
+ z as LogoUrlPipe,
521
+ g as QUIKTURN_CONFIG,
522
+ b as QuikturnLogoCarouselComponent,
523
+ _ as QuikturnLogoComponent,
524
+ I as QuikturnLogoGridComponent,
525
+ P as injectLogoUrl,
526
+ H as isValidHref,
527
+ K as provideQuikturnLogos
528
+ };
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@quikturn/logos-angular",
3
+ "version": "1.0.0",
4
+ "description": "Angular components for the Quikturn Logos API — standalone components with signal inputs",
5
+ "license": "MIT",
6
+ "author": "Quikturn",
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.mjs",
18
+ "types": "./dist/index.d.ts",
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/Quikturn-PowerPoint-Add-In/Logo-SDK.git",
25
+ "directory": "packages/angular"
26
+ },
27
+ "bugs": {
28
+ "url": "https://github.com/Quikturn-PowerPoint-Add-In/Logo-SDK/issues"
29
+ },
30
+ "homepage": "https://github.com/Quikturn-PowerPoint-Add-In/Logo-SDK/tree/main/packages/angular#readme",
31
+ "keywords": [
32
+ "quikturn",
33
+ "logos",
34
+ "angular",
35
+ "company-logos",
36
+ "brand-assets"
37
+ ],
38
+ "engines": {
39
+ "node": ">=20"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "LICENSE",
44
+ "README.md"
45
+ ],
46
+ "scripts": {
47
+ "build": "vite build",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
50
+ "typecheck": "tsc --noEmit -p tsconfig.lib.json",
51
+ "lint": "eslint src/ tests/"
52
+ },
53
+ "dependencies": {
54
+ "@quikturn/logos": "workspace:^"
55
+ },
56
+ "peerDependencies": {
57
+ "@angular/common": ">=17.0.0",
58
+ "@angular/core": ">=17.0.0"
59
+ },
60
+ "devDependencies": {
61
+ "@analogjs/vite-plugin-angular": "^1.15.0",
62
+ "@angular/build": "^19.2.19",
63
+ "@angular/common": "^19.0.0",
64
+ "@angular/compiler": "^19.0.0",
65
+ "@angular/compiler-cli": "^19.2.18",
66
+ "@angular/core": "^19.0.0",
67
+ "@angular/platform-browser": "^19.0.0",
68
+ "@angular/platform-browser-dynamic": "^19.0.0",
69
+ "@semantic-release/changelog": "^6.0.3",
70
+ "@semantic-release/git": "^10.0.1",
71
+ "jsdom": "^28.0.0",
72
+ "semantic-release": "^25.0.3",
73
+ "typescript": "^5.9.3",
74
+ "vite": "^6.0.0",
75
+ "vite-plugin-dts": "^4.5.0",
76
+ "vitest": "^4.0.18",
77
+ "zone.js": "^0.15.0"
78
+ }
79
+ }