@quikturn/logos 0.4.1 → 0.6.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 +130 -4
- package/dist/client/index.cjs +6 -6
- package/dist/client/index.mjs +6 -6
- package/dist/server/index.cjs +6 -6
- package/dist/server/index.mjs +6 -6
- package/package.json +13 -5
package/README.md
CHANGED
|
@@ -4,10 +4,14 @@ TypeScript SDK for the [Quikturn Logos API](https://getquikturn.io) -- fetch any
|
|
|
4
4
|
|
|
5
5
|
**[Get your API key](https://getquikturn.io)** -- free tier available, no credit card required.
|
|
6
6
|
|
|
7
|
-
| Package | Description | |
|
|
8
|
-
|
|
7
|
+
| Package | Description | Install |
|
|
8
|
+
|---------|-------------|---------|
|
|
9
9
|
| [`@quikturn/logos`](https://www.npmjs.com/package/@quikturn/logos) | Core SDK -- URL builder, browser client, server client, web component | `pnpm add @quikturn/logos` |
|
|
10
10
|
| [`@quikturn/logos-react`](https://www.npmjs.com/package/@quikturn/logos-react) | React components -- logo, carousel, grid | `pnpm add @quikturn/logos-react` |
|
|
11
|
+
| [`@quikturn/logos-next`](https://www.npmjs.com/package/@quikturn/logos-next) | Next.js -- `next/image` wrapper, loaders, server helpers | `pnpm add @quikturn/logos-next` |
|
|
12
|
+
| [`@quikturn/logos-vue`](https://www.npmjs.com/package/@quikturn/logos-vue) | Vue 3 components -- logo, carousel, grid, plugin | `pnpm add @quikturn/logos-vue` |
|
|
13
|
+
| [`@quikturn/logos-svelte`](https://www.npmjs.com/package/@quikturn/logos-svelte) | Svelte 5 components -- logo, carousel, grid, runes | `pnpm add @quikturn/logos-svelte` |
|
|
14
|
+
| [`@quikturn/logos-angular`](https://www.npmjs.com/package/@quikturn/logos-angular) | Angular 17+ -- standalone components, signals, pipe | `pnpm add @quikturn/logos-angular` |
|
|
11
15
|
|
|
12
16
|
---
|
|
13
17
|
|
|
@@ -29,7 +33,16 @@ pnpm add @quikturn/logos
|
|
|
29
33
|
| **Browser** | `@quikturn/logos/client` | Blob URLs, retry/backoff, scrape polling, events |
|
|
30
34
|
| **Server** | `@quikturn/logos/server` | Buffer output, streaming, batch operations |
|
|
31
35
|
| **Element** | `@quikturn/logos/element` | `<quikturn-logo>` web component with built-in attribution |
|
|
32
|
-
|
|
36
|
+
|
|
37
|
+
### Framework Packages
|
|
38
|
+
|
|
39
|
+
| Package | Import | Framework |
|
|
40
|
+
|---------|--------|-----------|
|
|
41
|
+
| **React** | `@quikturn/logos-react` | React 18+ -- components, hooks, context |
|
|
42
|
+
| **Next.js** | `@quikturn/logos-next` | Next.js 14+ -- `next/image` wrapper, server helpers |
|
|
43
|
+
| **Vue** | `@quikturn/logos-vue` | Vue 3.3+ -- SFCs, composables, plugin |
|
|
44
|
+
| **Svelte** | `@quikturn/logos-svelte` | Svelte 5 -- runes, snippets, context |
|
|
45
|
+
| **Angular** | `@quikturn/logos-angular` | Angular 17+ -- standalone components, signals, pipe |
|
|
33
46
|
|
|
34
47
|
---
|
|
35
48
|
|
|
@@ -134,7 +147,116 @@ function App() {
|
|
|
134
147
|
}
|
|
135
148
|
```
|
|
136
149
|
|
|
137
|
-
Full
|
|
150
|
+
Full API reference: [`@quikturn/logos-react` docs](./packages/react/README.md)
|
|
151
|
+
|
|
152
|
+
### Next.js
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
pnpm add @quikturn/logos-next
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import { QuikturnProvider, QuikturnImage } from "@quikturn/logos-next";
|
|
160
|
+
|
|
161
|
+
export default function Page() {
|
|
162
|
+
return (
|
|
163
|
+
<QuikturnProvider token="qt_your_key">
|
|
164
|
+
<QuikturnImage domain="github.com" width={128} height={128} alt="GitHub" />
|
|
165
|
+
</QuikturnProvider>
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Full API reference: [`@quikturn/logos-next` docs](./packages/next/README.md)
|
|
171
|
+
|
|
172
|
+
### Vue
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
pnpm add @quikturn/logos-vue
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```vue
|
|
179
|
+
<script setup lang="ts">
|
|
180
|
+
import { QuikturnLogo, QuikturnLogoCarousel } from "@quikturn/logos-vue";
|
|
181
|
+
</script>
|
|
182
|
+
|
|
183
|
+
<template>
|
|
184
|
+
<QuikturnLogo domain="github.com" :size="64" />
|
|
185
|
+
|
|
186
|
+
<QuikturnLogoCarousel
|
|
187
|
+
:domains="['github.com', 'stripe.com', 'vercel.com', 'figma.com']"
|
|
188
|
+
:speed="120"
|
|
189
|
+
fade-out
|
|
190
|
+
pause-on-hover
|
|
191
|
+
/>
|
|
192
|
+
</template>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Full API reference: [`@quikturn/logos-vue` docs](./packages/vue/README.md)
|
|
196
|
+
|
|
197
|
+
### Svelte
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
pnpm add @quikturn/logos-svelte
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
```svelte
|
|
204
|
+
<script>
|
|
205
|
+
import { QuikturnProvider, QuikturnLogo, QuikturnLogoCarousel } from "@quikturn/logos-svelte";
|
|
206
|
+
</script>
|
|
207
|
+
|
|
208
|
+
<QuikturnProvider token="qt_your_key">
|
|
209
|
+
<QuikturnLogo domain="github.com" size={64} />
|
|
210
|
+
|
|
211
|
+
<QuikturnLogoCarousel
|
|
212
|
+
domains={["github.com", "stripe.com", "vercel.com", "figma.com"]}
|
|
213
|
+
speed={120}
|
|
214
|
+
fadeOut
|
|
215
|
+
pauseOnHover
|
|
216
|
+
/>
|
|
217
|
+
</QuikturnProvider>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Full API reference: [`@quikturn/logos-svelte` docs](./packages/svelte/README.md)
|
|
221
|
+
|
|
222
|
+
### Angular
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
pnpm add @quikturn/logos-angular
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
// app.config.ts
|
|
230
|
+
import { provideQuikturnLogos } from "@quikturn/logos-angular";
|
|
231
|
+
|
|
232
|
+
export const appConfig = {
|
|
233
|
+
providers: [provideQuikturnLogos({ token: "qt_your_key" })],
|
|
234
|
+
};
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
import { Component } from "@angular/core";
|
|
239
|
+
import { QuikturnLogoComponent, QuikturnLogoCarouselComponent } from "@quikturn/logos-angular";
|
|
240
|
+
|
|
241
|
+
@Component({
|
|
242
|
+
selector: "app-example",
|
|
243
|
+
standalone: true,
|
|
244
|
+
imports: [QuikturnLogoComponent, QuikturnLogoCarouselComponent],
|
|
245
|
+
template: `
|
|
246
|
+
<quikturn-logo domain="github.com" [size]="64" />
|
|
247
|
+
|
|
248
|
+
<quikturn-logo-carousel
|
|
249
|
+
[domains]="['github.com', 'stripe.com', 'vercel.com', 'figma.com']"
|
|
250
|
+
[speed]="120"
|
|
251
|
+
[fadeOut]="true"
|
|
252
|
+
[pauseOnHover]="true"
|
|
253
|
+
/>
|
|
254
|
+
`,
|
|
255
|
+
})
|
|
256
|
+
export class ExampleComponent {}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Full API reference: [`@quikturn/logos-angular` docs](./packages/angular/README.md)
|
|
138
260
|
|
|
139
261
|
---
|
|
140
262
|
|
|
@@ -372,6 +494,10 @@ Rate limits and monthly quotas are enforced server-side and vary by plan. The SD
|
|
|
372
494
|
- **[Dashboard](https://getquikturn.io/dashboard)** -- usage analytics, key management, plan upgrades
|
|
373
495
|
- **[Pricing](https://getquikturn.io/pricing)** -- free tier, pro, and enterprise plans
|
|
374
496
|
- **[React components](./packages/react/README.md)** -- `@quikturn/logos-react` docs
|
|
497
|
+
- **[Next.js components](./packages/next/README.md)** -- `@quikturn/logos-next` docs
|
|
498
|
+
- **[Vue components](./packages/vue/README.md)** -- `@quikturn/logos-vue` docs
|
|
499
|
+
- **[Svelte components](./packages/svelte/README.md)** -- `@quikturn/logos-svelte` docs
|
|
500
|
+
- **[Angular components](./packages/angular/README.md)** -- `@quikturn/logos-angular` docs
|
|
375
501
|
- **[GitHub](https://github.com/Quikturn-PowerPoint-Add-In/Logo-SDK)** -- source, issues, contributions
|
|
376
502
|
|
|
377
503
|
## License
|
package/dist/client/index.cjs
CHANGED
|
@@ -366,8 +366,8 @@ async function browserFetch(url, options) {
|
|
|
366
366
|
throw new AuthenticationError("Authentication failed");
|
|
367
367
|
}
|
|
368
368
|
if (response.status === 403) {
|
|
369
|
-
const
|
|
370
|
-
const reason =
|
|
369
|
+
const body = await response.text();
|
|
370
|
+
const reason = body.slice(0, 256) || "unknown";
|
|
371
371
|
throw new ForbiddenError("Access forbidden", reason);
|
|
372
372
|
}
|
|
373
373
|
if (response.status === 404) {
|
|
@@ -407,8 +407,8 @@ async function browserFetch(url, options) {
|
|
|
407
407
|
);
|
|
408
408
|
}
|
|
409
409
|
if (response.status === 400) {
|
|
410
|
-
const
|
|
411
|
-
throw new BadRequestError(
|
|
410
|
+
const body = await response.text();
|
|
411
|
+
throw new BadRequestError(body.slice(0, 256) || "Bad request");
|
|
412
412
|
}
|
|
413
413
|
if (response.status === 500) {
|
|
414
414
|
if (!serverErrorRetried) {
|
|
@@ -416,9 +416,9 @@ async function browserFetch(url, options) {
|
|
|
416
416
|
await delay(SERVER_ERROR_RETRY_DELAY_MS);
|
|
417
417
|
continue;
|
|
418
418
|
}
|
|
419
|
-
const
|
|
419
|
+
const body = await response.text();
|
|
420
420
|
throw new LogoError(
|
|
421
|
-
|
|
421
|
+
body.slice(0, 256) || "Internal server error",
|
|
422
422
|
"SERVER_ERROR",
|
|
423
423
|
500
|
|
424
424
|
);
|
package/dist/client/index.mjs
CHANGED
|
@@ -364,8 +364,8 @@ async function browserFetch(url, options) {
|
|
|
364
364
|
throw new AuthenticationError("Authentication failed");
|
|
365
365
|
}
|
|
366
366
|
if (response.status === 403) {
|
|
367
|
-
const
|
|
368
|
-
const reason =
|
|
367
|
+
const body = await response.text();
|
|
368
|
+
const reason = body.slice(0, 256) || "unknown";
|
|
369
369
|
throw new ForbiddenError("Access forbidden", reason);
|
|
370
370
|
}
|
|
371
371
|
if (response.status === 404) {
|
|
@@ -405,8 +405,8 @@ async function browserFetch(url, options) {
|
|
|
405
405
|
);
|
|
406
406
|
}
|
|
407
407
|
if (response.status === 400) {
|
|
408
|
-
const
|
|
409
|
-
throw new BadRequestError(
|
|
408
|
+
const body = await response.text();
|
|
409
|
+
throw new BadRequestError(body.slice(0, 256) || "Bad request");
|
|
410
410
|
}
|
|
411
411
|
if (response.status === 500) {
|
|
412
412
|
if (!serverErrorRetried) {
|
|
@@ -414,9 +414,9 @@ async function browserFetch(url, options) {
|
|
|
414
414
|
await delay(SERVER_ERROR_RETRY_DELAY_MS);
|
|
415
415
|
continue;
|
|
416
416
|
}
|
|
417
|
-
const
|
|
417
|
+
const body = await response.text();
|
|
418
418
|
throw new LogoError(
|
|
419
|
-
|
|
419
|
+
body.slice(0, 256) || "Internal server error",
|
|
420
420
|
"SERVER_ERROR",
|
|
421
421
|
500
|
|
422
422
|
);
|
package/dist/server/index.cjs
CHANGED
|
@@ -369,8 +369,8 @@ async function serverFetch(url, options) {
|
|
|
369
369
|
throw new AuthenticationError("Authentication failed");
|
|
370
370
|
}
|
|
371
371
|
if (response.status === 403) {
|
|
372
|
-
const
|
|
373
|
-
const reason =
|
|
372
|
+
const body = await response.text();
|
|
373
|
+
const reason = body.slice(0, 256) || "unknown";
|
|
374
374
|
throw new ForbiddenError("Access forbidden", reason);
|
|
375
375
|
}
|
|
376
376
|
if (response.status === 404) {
|
|
@@ -410,8 +410,8 @@ async function serverFetch(url, options) {
|
|
|
410
410
|
);
|
|
411
411
|
}
|
|
412
412
|
if (response.status === 400) {
|
|
413
|
-
const
|
|
414
|
-
throw new BadRequestError(
|
|
413
|
+
const body = await response.text();
|
|
414
|
+
throw new BadRequestError(body.slice(0, 256) || "Bad request");
|
|
415
415
|
}
|
|
416
416
|
if (response.status === 500) {
|
|
417
417
|
if (!serverErrorRetried) {
|
|
@@ -419,9 +419,9 @@ async function serverFetch(url, options) {
|
|
|
419
419
|
await delay(SERVER_ERROR_RETRY_DELAY_MS);
|
|
420
420
|
continue;
|
|
421
421
|
}
|
|
422
|
-
const
|
|
422
|
+
const body = await response.text();
|
|
423
423
|
throw new LogoError(
|
|
424
|
-
|
|
424
|
+
body.slice(0, 256) || "Internal server error",
|
|
425
425
|
"SERVER_ERROR",
|
|
426
426
|
500
|
|
427
427
|
);
|
package/dist/server/index.mjs
CHANGED
|
@@ -367,8 +367,8 @@ async function serverFetch(url, options) {
|
|
|
367
367
|
throw new AuthenticationError("Authentication failed");
|
|
368
368
|
}
|
|
369
369
|
if (response.status === 403) {
|
|
370
|
-
const
|
|
371
|
-
const reason =
|
|
370
|
+
const body = await response.text();
|
|
371
|
+
const reason = body.slice(0, 256) || "unknown";
|
|
372
372
|
throw new ForbiddenError("Access forbidden", reason);
|
|
373
373
|
}
|
|
374
374
|
if (response.status === 404) {
|
|
@@ -408,8 +408,8 @@ async function serverFetch(url, options) {
|
|
|
408
408
|
);
|
|
409
409
|
}
|
|
410
410
|
if (response.status === 400) {
|
|
411
|
-
const
|
|
412
|
-
throw new BadRequestError(
|
|
411
|
+
const body = await response.text();
|
|
412
|
+
throw new BadRequestError(body.slice(0, 256) || "Bad request");
|
|
413
413
|
}
|
|
414
414
|
if (response.status === 500) {
|
|
415
415
|
if (!serverErrorRetried) {
|
|
@@ -417,9 +417,9 @@ async function serverFetch(url, options) {
|
|
|
417
417
|
await delay(SERVER_ERROR_RETRY_DELAY_MS);
|
|
418
418
|
continue;
|
|
419
419
|
}
|
|
420
|
-
const
|
|
420
|
+
const body = await response.text();
|
|
421
421
|
throw new LogoError(
|
|
422
|
-
|
|
422
|
+
body.slice(0, 256) || "Internal server error",
|
|
423
423
|
"SERVER_ERROR",
|
|
424
424
|
500
|
|
425
425
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quikturn/logos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Quikturn Logo SDK — URL builder, browser client, and server client for the Quikturn Logos API",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Quikturn",
|
|
@@ -26,11 +26,10 @@
|
|
|
26
26
|
],
|
|
27
27
|
"packageManager": "pnpm@10.28.1",
|
|
28
28
|
"engines": {
|
|
29
|
-
"node": ">=
|
|
29
|
+
"node": ">=20"
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
32
|
"dist",
|
|
33
|
-
"package.json",
|
|
34
33
|
"LICENSE",
|
|
35
34
|
"README.md"
|
|
36
35
|
],
|
|
@@ -81,20 +80,29 @@
|
|
|
81
80
|
"test:watch": "vitest",
|
|
82
81
|
"test:coverage": "vitest run --coverage",
|
|
83
82
|
"typecheck": "tsc --noEmit",
|
|
84
|
-
"lint": "
|
|
85
|
-
"
|
|
83
|
+
"lint": "eslint .",
|
|
84
|
+
"lint:fix": "eslint . --fix",
|
|
85
|
+
"check": "pnpm typecheck && pnpm lint",
|
|
86
86
|
"prepublishOnly": "pnpm run build"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
|
+
"@eslint/js": "^9.39.2",
|
|
89
90
|
"@semantic-release/changelog": "^6.0.3",
|
|
90
91
|
"@semantic-release/git": "^10.0.1",
|
|
91
92
|
"@types/jsdom": "^27.0.0",
|
|
92
93
|
"@types/node": "^25.2.2",
|
|
93
94
|
"@vitest/coverage-v8": "^4.0.18",
|
|
95
|
+
"angular-eslint": "^21.2.0",
|
|
96
|
+
"eslint": "^9.39.2",
|
|
97
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
98
|
+
"eslint-plugin-svelte": "^3.15.0",
|
|
99
|
+
"eslint-plugin-vue": "^10.7.0",
|
|
100
|
+
"globals": "^17.3.0",
|
|
94
101
|
"jsdom": "^28.0.0",
|
|
95
102
|
"semantic-release": "^25.0.3",
|
|
96
103
|
"tsup": "^8.5.1",
|
|
97
104
|
"typescript": "^5.9.3",
|
|
105
|
+
"typescript-eslint": "^8.55.0",
|
|
98
106
|
"vitest": "^4.0.18"
|
|
99
107
|
}
|
|
100
108
|
}
|