@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 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
- | **React** | `@quikturn/logos-react` | `<QuikturnLogo>`, `<QuikturnLogoCarousel>`, `<QuikturnLogoGrid>` |
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 React API reference: [`@quikturn/logos-react` docs](./packages/react/README.md)
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
@@ -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 body2 = await response.text();
370
- const reason = body2.slice(0, 256) || "unknown";
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 body2 = await response.text();
411
- throw new BadRequestError(body2.slice(0, 256) || "Bad request");
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 body2 = await response.text();
419
+ const body = await response.text();
420
420
  throw new LogoError(
421
- body2.slice(0, 256) || "Internal server error",
421
+ body.slice(0, 256) || "Internal server error",
422
422
  "SERVER_ERROR",
423
423
  500
424
424
  );
@@ -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 body2 = await response.text();
368
- const reason = body2.slice(0, 256) || "unknown";
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 body2 = await response.text();
409
- throw new BadRequestError(body2.slice(0, 256) || "Bad request");
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 body2 = await response.text();
417
+ const body = await response.text();
418
418
  throw new LogoError(
419
- body2.slice(0, 256) || "Internal server error",
419
+ body.slice(0, 256) || "Internal server error",
420
420
  "SERVER_ERROR",
421
421
  500
422
422
  );
@@ -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 body2 = await response.text();
373
- const reason = body2.slice(0, 256) || "unknown";
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 body2 = await response.text();
414
- throw new BadRequestError(body2.slice(0, 256) || "Bad request");
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 body2 = await response.text();
422
+ const body = await response.text();
423
423
  throw new LogoError(
424
- body2.slice(0, 256) || "Internal server error",
424
+ body.slice(0, 256) || "Internal server error",
425
425
  "SERVER_ERROR",
426
426
  500
427
427
  );
@@ -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 body2 = await response.text();
371
- const reason = body2.slice(0, 256) || "unknown";
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 body2 = await response.text();
412
- throw new BadRequestError(body2.slice(0, 256) || "Bad request");
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 body2 = await response.text();
420
+ const body = await response.text();
421
421
  throw new LogoError(
422
- body2.slice(0, 256) || "Internal server error",
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.4.1",
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": ">=18"
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": "tsc --noEmit",
85
- "check": "pnpm lint && pnpm typecheck",
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
  }