@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/README.md +455 -0
- package/dist/index.cjs +206 -0
- package/dist/index.d.cts +316 -0
- package/dist/index.d.ts +316 -0
- package/dist/index.mjs +528 -0
- package/package.json +79 -0
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
|
+
}
|