nuxt-og-image 6.4.6 → 6.4.8

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 (56) hide show
  1. package/dist/chunks/tw4.cjs +1 -1
  2. package/dist/chunks/tw4.mjs +1 -1
  3. package/dist/chunks/uno.cjs +1 -1
  4. package/dist/chunks/uno.mjs +1 -1
  5. package/dist/devtools/200.html +1 -1
  6. package/dist/devtools/404.html +1 -1
  7. package/dist/devtools/_nuxt/BpycYUS7.js +1 -0
  8. package/dist/devtools/_nuxt/CD5ERUqd.js +6 -0
  9. package/dist/devtools/_nuxt/CaN1xyol.js +3 -0
  10. package/dist/devtools/_nuxt/CaUGEVp7.js +1 -0
  11. package/dist/devtools/_nuxt/{B75jVnAo.js → D-SbM8XJ.js} +1 -1
  12. package/dist/devtools/_nuxt/DG6qtUJw.js +152 -0
  13. package/dist/devtools/_nuxt/{C2qZkcnS.js → DcgxrIJS.js} +1 -1
  14. package/dist/devtools/_nuxt/DddW44YX.js +4 -0
  15. package/dist/devtools/_nuxt/DevtoolsSection.R7m3HD1q.css +1 -0
  16. package/dist/devtools/_nuxt/DevtoolsSnippet.BGKAlc9O.css +1 -0
  17. package/dist/devtools/_nuxt/ZaZQm-qN.js +23 -0
  18. package/dist/devtools/_nuxt/b4dSe8RS.js +3 -0
  19. package/dist/devtools/_nuxt/bk2FT9xh.js +1 -0
  20. package/dist/devtools/_nuxt/builds/latest.json +1 -1
  21. package/dist/devtools/_nuxt/builds/meta/e868427f-4a2d-49e8-9faf-74ff7663dfb9.json +1 -0
  22. package/dist/devtools/_nuxt/entry.Ciqipq4I.css +2 -0
  23. package/dist/devtools/_nuxt/kA6DLus1.js +2 -0
  24. package/dist/devtools/_nuxt/{D5adIWRn.js → oq4DzcWM.js} +1 -1
  25. package/dist/devtools/_nuxt/{pages.DNfeVIDd.css → pages.DRV8dSAi.css} +1 -1
  26. package/dist/devtools/_nuxt/renderer-select.C7qbPwz4.css +1 -0
  27. package/dist/devtools/debug/index.html +1 -1
  28. package/dist/devtools/docs/index.html +1 -1
  29. package/dist/devtools/index.html +1 -1
  30. package/dist/devtools/templates/index.html +1 -1
  31. package/dist/module.cjs +1 -1
  32. package/dist/module.json +1 -1
  33. package/dist/module.mjs +1 -1
  34. package/dist/runtime/server/og-image/font-source.d.ts +20 -0
  35. package/dist/runtime/server/og-image/font-source.js +20 -0
  36. package/dist/runtime/server/og-image/fonts.d.ts +8 -1
  37. package/dist/runtime/server/og-image/fonts.js +22 -32
  38. package/dist/runtime/server/og-image/takumi/renderer.js +40 -12
  39. package/dist/shared/{nuxt-og-image.TJuh6pW5.cjs → nuxt-og-image.KwJtn8oJ.cjs} +3 -3
  40. package/dist/shared/{nuxt-og-image.Cr3WHMk1.mjs → nuxt-og-image.ZQrnalbB.mjs} +2 -2
  41. package/package.json +7 -7
  42. package/dist/devtools/_nuxt/671cdwR5.js +0 -1
  43. package/dist/devtools/_nuxt/8kkJjsM6.js +0 -2
  44. package/dist/devtools/_nuxt/BJ9iyiD_.js +0 -3
  45. package/dist/devtools/_nuxt/BcGh1UWn.js +0 -23
  46. package/dist/devtools/_nuxt/CHmOAOu6.js +0 -3
  47. package/dist/devtools/_nuxt/Ci8ZvNRB.js +0 -1
  48. package/dist/devtools/_nuxt/DVtbGlya.js +0 -152
  49. package/dist/devtools/_nuxt/DbOyl855.js +0 -1
  50. package/dist/devtools/_nuxt/DevtoolsSection.DTZAmexP.css +0 -1
  51. package/dist/devtools/_nuxt/DevtoolsSnippet.Cd7XR-3f.css +0 -1
  52. package/dist/devtools/_nuxt/DrqfEi04.js +0 -4
  53. package/dist/devtools/_nuxt/builds/meta/35156fa7-4f5e-4690-9647-2e1992596b7c.json +0 -1
  54. package/dist/devtools/_nuxt/cIRSrPLM.js +0 -6
  55. package/dist/devtools/_nuxt/entry.zgUFdiSv.css +0 -2
  56. package/dist/devtools/_nuxt/renderer-select.elTTxv30.css +0 -1
@@ -0,0 +1,20 @@
1
+ export function fontFormat(src) {
2
+ if (src.endsWith(".woff2"))
3
+ return "woff2";
4
+ if (src.endsWith(".woff"))
5
+ return "woff";
6
+ if (src.endsWith(".otf"))
7
+ return "otf";
8
+ return "ttf";
9
+ }
10
+ export function selectFontSource(f, supportedFormats, preferStatic) {
11
+ const primarySupported = supportedFormats.has(fontFormat(f.src));
12
+ const satoriSupported = !!(f.satoriSrc && supportedFormats.has(fontFormat(f.satoriSrc)));
13
+ if (preferStatic && satoriSupported && f.satoriSrc !== f.src)
14
+ return { src: f.satoriSrc, isStaticFallback: true };
15
+ if (primarySupported)
16
+ return { src: f.src, isStaticFallback: false };
17
+ if (satoriSupported)
18
+ return { src: f.satoriSrc, isStaticFallback: true };
19
+ return null;
20
+ }
@@ -1,8 +1,8 @@
1
1
  import type { H3Event } from 'h3';
2
2
  import type { OgImageRenderEventContext, RuntimeFontConfig } from '../../types.js';
3
+ import type { FontFormat } from './font-source.js';
3
4
  export { buildSubsetFamilyChain, renameSubsetFonts, resolveSubsetChain } from './font-subsets.js';
4
5
  export { codepointsIntersectRanges, extractCodepoints, parseUnicodeRange } from './unicode-range.js';
5
- type FontFormat = 'ttf' | 'otf' | 'woff' | 'woff2';
6
6
  export interface LoadFontsOptions {
7
7
  /**
8
8
  * Font formats the renderer can parse.
@@ -16,6 +16,13 @@ export interface LoadFontsOptions {
16
16
  fontFamilyOverride?: string;
17
17
  /** Codepoints present in the template — fonts whose unicodeRange doesn't intersect are skipped */
18
18
  codepoints?: Set<number>;
19
+ /**
20
+ * Prefer the static satoriSrc (full TTF/WOFF from fontless) over the primary src
21
+ * (subset WOFF2 from @nuxt/fonts) when both are usable. Takumi uses this so non-Latin
22
+ * glyphs (devanagari, CJK, etc.) render — @nuxt/fonts CSS often only ships latin
23
+ * subsets for a family, but the fontless static file contains the full glyph set.
24
+ */
25
+ preferStatic?: boolean;
19
26
  }
20
27
  export declare function loadAllFontsDebug(component?: string): {
21
28
  component: string | undefined;
@@ -4,19 +4,11 @@ import resolvedFonts from "#og-image/fonts";
4
4
  import availableFonts from "#og-image/fonts-available";
5
5
  import { logger } from "../../logger.js";
6
6
  import { fontArrayCache, fontCache } from "./cache/lru.js";
7
+ import { fontFormat, selectFontSource } from "./font-source.js";
7
8
  import { renameSubsetFonts } from "./font-subsets.js";
8
9
  import { codepointsIntersectRanges, parseUnicodeRange } from "./unicode-range.js";
9
10
  export { buildSubsetFamilyChain, renameSubsetFonts, resolveSubsetChain } from "./font-subsets.js";
10
11
  export { codepointsIntersectRanges, extractCodepoints, parseUnicodeRange } from "./unicode-range.js";
11
- function fontFormat(src) {
12
- if (src.endsWith(".woff2"))
13
- return "woff2";
14
- if (src.endsWith(".woff"))
15
- return "woff";
16
- if (src.endsWith(".otf"))
17
- return "otf";
18
- return "ttf";
19
- }
20
12
  async function loadFont(event, font, src) {
21
13
  const cacheKey = `${font.family}-${font.weight}-${font.style}-${src}`;
22
14
  const cached = fontCache.get(cacheKey);
@@ -103,39 +95,37 @@ export async function loadAllFonts(event, options) {
103
95
  }
104
96
  }
105
97
  }
106
- if (options.codepoints && options.codepoints.size > 0) {
107
- for (let i = fonts.length - 1; i >= 0; i--) {
108
- const f = fonts[i];
109
- if (!f.unicodeRange)
110
- continue;
111
- const ranges = parseUnicodeRange(f.unicodeRange);
112
- if (!ranges)
113
- continue;
114
- if (!codepointsIntersectRanges(options.codepoints, ranges))
115
- fonts.splice(i, 1);
116
- }
98
+ const resolved = [];
99
+ for (const f of fonts) {
100
+ const selection = selectFontSource(f, options.supportedFormats, options.preferStatic ?? false);
101
+ if (selection)
102
+ resolved.push({ font: f, ...selection });
117
103
  }
104
+ const filtered = options.codepoints && options.codepoints.size > 0 ? resolved.filter(({ font: f, isStaticFallback }) => {
105
+ if (isStaticFallback || !f.unicodeRange)
106
+ return true;
107
+ const ranges = parseUnicodeRange(f.unicodeRange);
108
+ if (!ranges)
109
+ return true;
110
+ return codepointsIntersectRanges(options.codepoints, ranges);
111
+ }) : resolved;
118
112
  const results = await Promise.all(
119
- fonts.map(async (f) => {
120
- let src = f.src;
121
- const srcFormat = fontFormat(f.src);
122
- if (!options.supportedFormats.has(srcFormat)) {
123
- if (f.satoriSrc && options.supportedFormats.has(fontFormat(f.satoriSrc))) {
124
- src = f.satoriSrc;
125
- } else {
126
- return null;
127
- }
128
- }
113
+ filtered.map(async ({ font: f, src: initialSrc, isStaticFallback }) => {
114
+ let src = initialSrc;
129
115
  let data = await loadFont(event, f, src);
130
- if (!data && src !== f.src && options.supportedFormats.has(srcFormat)) {
116
+ if (!data && src !== f.src && options.supportedFormats.has(fontFormat(f.src))) {
131
117
  data = await loadFont(event, f, f.src);
132
- if (data)
118
+ if (data) {
133
119
  src = f.src;
120
+ isStaticFallback = false;
121
+ }
134
122
  }
135
123
  if (!data)
136
124
  return null;
137
125
  return {
138
126
  ...f,
127
+ src,
128
+ ...isStaticFallback ? { unicodeRange: void 0 } : {},
139
129
  cacheKey: `${f.family}-${f.weight}-${f.style}-${src}`,
140
130
  data
141
131
  };
@@ -25,26 +25,54 @@ function withTakumiLock(state, fn) {
25
25
  state.lock = next.catch(() => void 0);
26
26
  return next;
27
27
  }
28
- async function loadFontsIntoRenderer(state, fonts) {
28
+ function dedupeFontsByBinary(fonts) {
29
+ const byBinary = /* @__PURE__ */ new Map();
29
30
  for (const font of fonts) {
30
31
  if (!font.data)
31
32
  continue;
32
- const uniqueKey = font.cacheKey || `${font.family}-${font.weight}-${font.style}`;
33
- if (state.loadedFontKeys.has(uniqueKey))
33
+ const binaryKey = `${font.family}|${font.style || "normal"}|${font.src || ""}`;
34
+ const existing = byBinary.get(binaryKey);
35
+ if (existing) {
36
+ existing.weights.add(font.weight);
37
+ } else {
38
+ byBinary.set(binaryKey, {
39
+ family: font.family,
40
+ style: font.style,
41
+ data: font.data,
42
+ weights: /* @__PURE__ */ new Set([font.weight])
43
+ });
44
+ }
45
+ }
46
+ const result = [];
47
+ for (const [binaryKey, entry] of byBinary) {
48
+ const isVariable = entry.weights.size > 1;
49
+ result.push({
50
+ binaryKey,
51
+ family: entry.family,
52
+ style: entry.style,
53
+ data: entry.data,
54
+ weight: isVariable ? void 0 : [...entry.weights][0]
55
+ });
56
+ }
57
+ return result;
58
+ }
59
+ async function loadFontsIntoRenderer(state, fonts) {
60
+ for (const entry of dedupeFontsByBinary(fonts)) {
61
+ if (state.loadedFontKeys.has(entry.binaryKey))
34
62
  continue;
35
- const fontData = font.data instanceof ArrayBuffer ? new Uint8Array(font.data) : Uint8Array.from(font.data);
63
+ const fontData = entry.data instanceof ArrayBuffer ? new Uint8Array(entry.data) : Uint8Array.from(entry.data);
36
64
  try {
37
65
  await state.renderer.loadFont({
38
- name: font.family,
66
+ name: entry.family,
39
67
  data: fontData,
40
- weight: font.weight,
41
- style: font.style
68
+ ...entry.weight !== void 0 ? { weight: entry.weight } : {},
69
+ style: entry.style
42
70
  });
43
- state.loadedFamilies.add(font.family);
71
+ state.loadedFamilies.add(entry.family);
44
72
  } catch (err) {
45
- logger.warn(`Failed to load font "${font.family}" (weight: ${font.weight}) into takumi renderer: ${err.message}`);
73
+ logger.warn(`Failed to load font "${entry.family}" into takumi renderer: ${err.message}`);
46
74
  }
47
- state.loadedFontKeys.add(uniqueKey);
75
+ state.loadedFontKeys.add(entry.binaryKey);
48
76
  }
49
77
  }
50
78
  function lookupFontFamily(family, loadedFamilies) {
@@ -88,7 +116,7 @@ async function createImage(event, format) {
88
116
  const { fontFamilyOverride, defaultFont } = getDefaultFontFamily(options);
89
117
  const nodes = await createTakumiNodes(event);
90
118
  const codepoints = extractCodepoints(nodes);
91
- const fonts = await timings.measure("font-load", () => loadFontsForRenderer(event, { supportedFormats: /* @__PURE__ */ new Set(["ttf", "woff2"]), component: options.component, fontFamilyOverride: fontFamilyOverride || defaultFont, codepoints }));
119
+ const fonts = await timings.measure("font-load", () => loadFontsForRenderer(event, { supportedFormats: /* @__PURE__ */ new Set(["ttf", "woff2"]), preferStatic: true, component: options.component, fontFamilyOverride: fontFamilyOverride || defaultFont, codepoints }));
92
120
  await event._nitro.hooks.callHook("nuxt-og-image:takumi:nodes", nodes, event);
93
121
  const subsetChains = buildSubsetFamilyChain(fonts);
94
122
  const state = await getTakumiState(event);
@@ -163,7 +191,7 @@ const TakumiRenderer = {
163
191
  async debug(e) {
164
192
  const [vnodes, fonts] = await Promise.all([
165
193
  createTakumiNodes(e),
166
- loadFontsForRenderer(e, { supportedFormats: /* @__PURE__ */ new Set(["ttf", "woff2"]), component: e.options.component })
194
+ loadFontsForRenderer(e, { supportedFormats: /* @__PURE__ */ new Set(["ttf", "woff2"]), preferStatic: true, component: e.options.component })
167
195
  ]);
168
196
  return {
169
197
  vnodes,
@@ -4320,7 +4320,7 @@ const module$1 = kit.defineNuxtModule({
4320
4320
  await onUpgrade(nuxt, options, previousVersion);
4321
4321
  },
4322
4322
  async setup(config, nuxt) {
4323
- const _resolver = kit.createResolver((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/nuxt-og-image.TJuh6pW5.cjs', document.baseURI).href)));
4323
+ const _resolver = kit.createResolver((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/nuxt-og-image.KwJtn8oJ.cjs', document.baseURI).href)));
4324
4324
  const fixSharedPath = (p) => {
4325
4325
  if (p.includes("/shared/runtime/"))
4326
4326
  return p.replace("/shared/runtime/", "/runtime/");
@@ -5087,7 +5087,7 @@ export const resolve = (import.meta.dev || import.meta.prerender) ? devResolve :
5087
5087
  if (hasNuxtFonts && fontContext) {
5088
5088
  persistFontUrlMapping({ fontContext, buildDir: nuxt.options.buildDir, logger: logger_js.logger });
5089
5089
  }
5090
- if (!fontProcessingDone && convertedWoff2Files.size === 0 && hasSatoriRenderer() && hasNuxtFonts) {
5090
+ if (!fontProcessingDone && convertedWoff2Files.size === 0 && (hasSatoriRenderer() || hasTakumiRenderer()) && hasNuxtFonts) {
5091
5091
  if (pendingFontRequirements.length > 0)
5092
5092
  await Promise.all(pendingFontRequirements);
5093
5093
  await convertWoff2ToTtf({
@@ -5156,7 +5156,7 @@ export const rootDir = ${JSON.stringify(nuxt.options.rootDir)}`;
5156
5156
  });
5157
5157
  nuxt.hook("vite:compiled", async () => {
5158
5158
  persistFontUrlMapping({ fontContext, buildDir: nuxt.options.buildDir, logger: logger_js.logger });
5159
- if (fontProcessingDone || !hasSatoriRenderer())
5159
+ if (fontProcessingDone || !hasSatoriRenderer() && !hasTakumiRenderer())
5160
5160
  return;
5161
5161
  if (pendingFontRequirements.length === 0)
5162
5162
  return;
@@ -5067,7 +5067,7 @@ export const resolve = (import.meta.dev || import.meta.prerender) ? devResolve :
5067
5067
  if (hasNuxtFonts && fontContext) {
5068
5068
  persistFontUrlMapping({ fontContext, buildDir: nuxt.options.buildDir, logger });
5069
5069
  }
5070
- if (!fontProcessingDone && convertedWoff2Files.size === 0 && hasSatoriRenderer() && hasNuxtFonts) {
5070
+ if (!fontProcessingDone && convertedWoff2Files.size === 0 && (hasSatoriRenderer() || hasTakumiRenderer()) && hasNuxtFonts) {
5071
5071
  if (pendingFontRequirements.length > 0)
5072
5072
  await Promise.all(pendingFontRequirements);
5073
5073
  await convertWoff2ToTtf({
@@ -5136,7 +5136,7 @@ export const rootDir = ${JSON.stringify(nuxt.options.rootDir)}`;
5136
5136
  });
5137
5137
  nuxt.hook("vite:compiled", async () => {
5138
5138
  persistFontUrlMapping({ fontContext, buildDir: nuxt.options.buildDir, logger });
5139
- if (fontProcessingDone || !hasSatoriRenderer())
5139
+ if (fontProcessingDone || !hasSatoriRenderer() && !hasTakumiRenderer())
5140
5140
  return;
5141
5141
  if (pendingFontRequirements.length === 0)
5142
5142
  return;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-og-image",
3
3
  "type": "module",
4
- "version": "6.4.6",
4
+ "version": "6.4.8",
5
5
  "description": "Enlightened OG Image generation for Nuxt.",
6
6
  "author": {
7
7
  "website": "https://harlanzw.com",
@@ -109,7 +109,7 @@
109
109
  "mocked-exports": "^0.1.1",
110
110
  "nuxt-site-config": "^4.0.8",
111
111
  "nuxtseo-shared": "^5.1.3",
112
- "nypm": "^0.6.5",
112
+ "nypm": "^0.6.6",
113
113
  "ofetch": "^1.5.1",
114
114
  "ohash": "^2.0.11",
115
115
  "oxc-parser": "^0.127.0",
@@ -142,18 +142,18 @@
142
142
  "@nuxt/image": "^2.0.0",
143
143
  "@nuxt/module-builder": "^1.0.2",
144
144
  "@nuxt/test-utils": "^4.0.2",
145
- "@nuxt/ui": "^4.6.1",
145
+ "@nuxt/ui": "^4.7.0",
146
146
  "@nuxtjs/color-mode": "^4.0.0",
147
147
  "@nuxtjs/eslint-config-typescript": "^12.1.0",
148
- "@nuxtjs/i18n": "^10.2.4",
148
+ "@nuxtjs/i18n": "^10.3.0",
149
149
  "@nuxtjs/tailwindcss": "7.0.0-beta.1",
150
150
  "@resvg/resvg-js": "^2.6.2",
151
151
  "@resvg/resvg-wasm": "^2.6.2",
152
152
  "@shikijs/langs": "^4.0.2",
153
153
  "@shikijs/themes": "^4.0.2",
154
154
  "@tailwindcss/vite": "^4.2.4",
155
- "@takumi-rs/core": "^1.0.16",
156
- "@takumi-rs/wasm": "^1.0.16",
155
+ "@takumi-rs/core": "^1.1.2",
156
+ "@takumi-rs/wasm": "^1.1.2",
157
157
  "@unocss/nuxt": "^66.6.8",
158
158
  "@vitejs/plugin-vue": "^6.0.6",
159
159
  "@vueuse/nuxt": "^14.2.1",
@@ -181,7 +181,7 @@
181
181
  "unocss": "^66.6.8",
182
182
  "vitest": "^4.1.5",
183
183
  "vue-tsc": "^3.2.7",
184
- "wrangler": "^4.84.1",
184
+ "wrangler": "^4.85.0",
185
185
  "yoga-wasm-web": "^0.3.3"
186
186
  },
187
187
  "scripts": {
@@ -1 +0,0 @@
1
- import{At as e,Dt as t,M as n,Q as r,S as i,T as a,U as o,_ as s,g as c,q as l,v as u,y as d}from"./B75jVnAo.js";import{D as f}from"./CHmOAOu6.js";import{t as p}from"./CP0tQR2M.js";var m=[`open`],h={class:`flex-1 min-w-0`},g={class:`section-label`},_={key:0,class:`section-description`},v=Object.assign(p(a({__name:`DevtoolsSection`,props:n({icon:{},text:{},description:{},containerClass:{default:``},headerClass:{},collapse:{type:Boolean,default:!0},open:{type:Boolean},padding:{type:[Boolean,String],default:!0}},{open:{default:!0},openModifiers:{}}),emits:[`update:open`],setup(n){let a=r(n,`open`);function p(e){a.value=e.target.open}return(r,v)=>{let y=f;return o(),d(`details`,{open:a.value,class:`section-block`,onToggle:p},[c(`summary`,{class:t([`section-header`,n.collapse?``:`pointer-events-none`])},[c(`div`,{class:t([`section-title`,[a.value?``:`opacity-60`,n.headerClass]])},[n.icon?(o(),s(y,{key:0,name:n.icon,class:`section-icon`},null,8,[`name`])):u(``,!0),c(`div`,h,[c(`div`,g,[l(r.$slots,`text`,{},()=>[i(e(n.text),1)],!0)]),n.description||r.$slots.description?(o(),d(`div`,_,[l(r.$slots,`description`,{},()=>[i(e(n.description),1)],!0)])):u(``,!0)]),l(r.$slots,`actions`,{},void 0,!0),n.collapse?(o(),s(y,{key:1,name:`carbon:chevron-down`,class:`chevron`})):u(``,!0)],2)],2),c(`div`,{class:t([`section-content`,typeof n.padding==`string`?n.padding:n.padding?`px-4`:``])},[l(r.$slots,`details`,{},void 0,!0),c(`div`,{class:t(n.containerClass)},[l(r.$slots,`default`,{},void 0,!0)],2),l(r.$slots,`footer`,{},void 0,!0)],2)],40,m)}}}),[[`__scopeId`,`data-v-c5ad32d6`]]),{__name:`DevtoolsSection`});export{v as t};
@@ -1,2 +0,0 @@
1
- import{At as e,C as t,K as n,T as r,Tt as i,U as a,_ as o,at as s,g as c,u as l,v as u,y as d}from"./B75jVnAo.js";import{t as f}from"./CHmOAOu6.js";import{t as p}from"./671cdwR5.js";import{t as m}from"./Ci8ZvNRB.js";var h={class:`h-full max-h-full overflow-hidden space-y-5`},g={class:`space-y-2 p-3 bg-amber-500/10 rounded-lg border border-amber-500/20`},_=r({__name:`debug`,setup(r){let{globalDebug:_,debug:v}=f();return(r,f)=>{let y=p,b=m;return a(),d(`div`,h,[i(v)?.warnings?.length?(a(),o(y,{key:0,icon:`carbon:warning`,text:`Satori Warnings`},{default:s(()=>[c(`div`,g,[(a(!0),d(l,null,n(i(v).warnings,(t,n)=>(a(),d(`div`,{key:n,class:`text-sm text-amber-200 font-mono`},e(t),1))),128))])]),_:1})):u(``,!0),t(y,{icon:`carbon:settings`,text:`Compatibility`},{default:s(()=>[t(b,{code:JSON.stringify(i(_)?.compatibility||{},null,2),lang:`json`,label:`Compatibility`},null,8,[`code`])]),_:1}),t(y,{icon:`carbon:ibm-cloud-pak-manta-automated-data-lineage`,text:`vNodes`},{default:s(()=>[t(b,{code:JSON.stringify(i(v)?.vnodes||{},null,2),lang:`json`,label:`vNodes`},null,8,[`code`])]),_:1}),t(y,{icon:`carbon:ibm-cloud-pak-manta-automated-data-lineage`,text:`SVG`},{default:s(()=>[t(b,{code:i(v)?.svg?.replaceAll(`>`,`>
2
- `)||``,lang:`xml`,label:`SVG`},null,8,[`code`])]),_:1}),t(y,{icon:`carbon:settings`,text:`Runtime Config`},{default:s(()=>[t(b,{code:JSON.stringify(i(_)?.runtimeConfig||{},null,2),lang:`json`,label:`Runtime Config`},null,8,[`code`])]),_:1})])}}});export{_ as default};
@@ -1,3 +0,0 @@
1
- import{At as e,B as t,C as n,Ct as r,Dt as i,L as a,T as o,Tt as s,U as c,g as l,gt as u,kt as d,o as f,ot as p,tt as m,v as h,y as g}from"./B75jVnAo.js";import{Ht as _}from"./cIRSrPLM.js";import{Ct as v,D as y,jt as b,o as x}from"./CHmOAOu6.js";import{t as S}from"./CP0tQR2M.js";var C=[`src`],w={key:0,class:`loading-state`},T={key:1,class:`error-state`},E={class:`error-header`},D={class:`error-type`},O={class:`error-message`},k={key:0,class:`error-stack`},A=Object.assign(S(o({__name:`ImageLoader`,props:{src:{},aspectRatio:{},maxHeight:{},maxWidth:{},minHeight:{}},emits:[`load`],setup(t,{emit:o}){let _=t,v=o,b=u(!1),S=u(!1),A=u(!1),j=u(0),M;m(()=>_.src,()=>{S.value=!0,A.value=!1,b.value=!1,j.value=Date.now(),clearTimeout(M),M=setTimeout(()=>{S.value&&(A.value=!0)},200)},{immediate:!0});function N(){S.value=!1,A.value=!1,clearTimeout(M),v(`load`,{timeTaken:Date.now()-j.value,sizeKb:``})}a(()=>clearTimeout(M));function P(){S.value=!1,A.value=!1,clearTimeout(M),$fetch(_.src).catch(e=>{b.value=e.data?.stack||[`Failed to load image`]})}return(a,o)=>{let u=y;return c(),g(`div`,{class:i([`image-loader`,{"is-valid":!s(b)&&!s(S),"is-error":s(b)}]),style:d({aspectRatio:t.aspectRatio,minHeight:t.minHeight})},[p(l(`img`,{src:t.src,style:d({aspectRatio:t.aspectRatio,maxWidth:`${s(r)(s(x).width)||1200}px`}),onLoad:N,onError:P},null,44,C),[[f,!s(S)&&!s(b)]]),s(A)?(c(),g(`div`,w,[...o[0]||=[l(`div`,{class:`loading-spinner`},null,-1)]])):h(``,!0),s(b)?(c(),g(`div`,T,[l(`div`,E,[n(u,{name:`carbon:warning`,class:`error-icon`}),l(`span`,D,e(s(b).join(`
2
- `).includes(`satori`)?`SatoriError`:`ImageError`),1)]),l(`p`,O,e(s(b)[0]?.replace(`Error:`,``)),1),s(b).length>1?(c(),g(`pre`,k,e(s(b).slice(1).join(`
3
- `)),1)):h(``,!0)])):h(``,!0)],6)}}}),[[`__scopeId`,`data-v-7f953e88`]]),{__name:`ImageLoader`}),j=Object.assign(S(o({__name:`IFrameLoader`,props:{src:{},aspectRatio:{}},emits:[`load`],setup(e,{emit:n}){let i=e,a=n,o=u(),f=u(),p=u(),h=b(()=>{let e=f.value;if(!e||!o.value)return;let t=Date.now();e.src=``;let n=r(x.value.width)||1200,i=p.value?.offsetWidth,s=i?Math.min(1,i/n):1;e.style.opacity=`0`,e.onload=()=>{e.style.opacity=`1`,a(`load`,{timeTaken:Date.now()-t})},e.src=_(o.value,{scale:s})},200);return t(()=>{m(()=>i.src,e=>{o.value!==e&&f.value&&(o.value=e,h())},{immediate:!0}),m(f,()=>{h()})}),v(p,()=>{o.value&&h()}),m(()=>r(x.value.width),()=>{o.value&&h()},{flush:`post`}),(t,n)=>(c(),g(`div`,{ref_key:`container`,ref:p,class:`iframe-loader`,style:d({aspectRatio:e.aspectRatio,maxWidth:`${s(r)(s(x).width)||1200}px`})},[l(`iframe`,{ref_key:`iframe`,ref:f},null,512)],4))}}),[[`__scopeId`,`data-v-6929e48a`]]),{__name:`IFrameLoader`});export{A as n,j as t};