nuxt-og-image 3.0.0-beta.5 → 3.0.0-beta.51

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 (138) hide show
  1. package/README.md +4 -4
  2. package/dist/client/200.html +5 -5
  3. package/dist/client/404.html +5 -5
  4. package/dist/client/_nuxt/IconCSS.4bbe2613.css +1 -0
  5. package/dist/client/_nuxt/IconCSS.71f1059a.js +1 -0
  6. package/dist/client/_nuxt/builds/latest.json +1 -1
  7. package/dist/client/_nuxt/builds/meta/6b86c847-1bce-41b5-9ab8-acabeed13f1f.json +1 -0
  8. package/dist/client/_nuxt/entry.33a59bbf.css +1 -0
  9. package/dist/client/_nuxt/entry.99da9ce9.js +138 -0
  10. package/dist/client/_nuxt/{error-404.b07f263f.js → error-404.eed1a665.js} +1 -1
  11. package/dist/client/_nuxt/{error-500.ed41d8f2.js → error-500.05b9efb3.js} +1 -1
  12. package/dist/client/index.html +5 -5
  13. package/dist/module.d.mts +55 -46
  14. package/dist/module.d.ts +55 -46
  15. package/dist/module.json +2 -2
  16. package/dist/module.mjs +306 -162
  17. package/dist/runtime/cache.d.ts +7 -10
  18. package/dist/runtime/cache.mjs +40 -27
  19. package/dist/runtime/components/OgImage/OgImage.d.ts +5 -0
  20. package/dist/runtime/components/OgImage/{index.mjs → OgImage.mjs} +1 -1
  21. package/dist/runtime/components/OgImage/OgImageScreenshot.d.ts +5 -0
  22. package/dist/runtime/components/OgImage/{Screenshot.mjs → OgImageScreenshot.mjs} +1 -1
  23. package/dist/runtime/components/Templates/{Official → Community}/BrandedLogo.vue +3 -2
  24. package/dist/runtime/components/Templates/Community/Nuxt.vue +6 -5
  25. package/dist/runtime/components/Templates/Community/NuxtSeo.vue +137 -0
  26. package/dist/runtime/components/Templates/Community/Pergel.vue +104 -0
  27. package/dist/runtime/components/Templates/{Official → Community}/SimpleBlog.vue +7 -5
  28. package/dist/runtime/components/Templates/Community/UnJs.vue +108 -0
  29. package/dist/runtime/components/Templates/{Official → Community}/Wave.vue +3 -2
  30. package/dist/runtime/components/Templates/{Official → Community}/WithEmoji.vue +3 -2
  31. package/dist/runtime/composables/defineOgImage.d.ts +2 -23
  32. package/dist/runtime/composables/defineOgImage.mjs +33 -117
  33. package/dist/runtime/composables/defineOgImageComponent.d.ts +3 -0
  34. package/dist/runtime/composables/defineOgImageComponent.mjs +8 -0
  35. package/dist/runtime/composables/defineOgImageScreenshot.d.ts +2 -0
  36. package/dist/runtime/composables/defineOgImageScreenshot.mjs +13 -0
  37. package/dist/runtime/core/bindings/css-inline/node.d.ts +2 -5
  38. package/dist/runtime/core/bindings/css-inline/node.mjs +2 -10
  39. package/dist/runtime/core/bindings/resvg/wasm-fs.d.ts +40 -0
  40. package/dist/runtime/core/bindings/resvg/wasm-fs.mjs +6 -0
  41. package/dist/runtime/core/bindings/resvg/wasm.mjs +2 -2
  42. package/dist/runtime/core/bindings/satori/wasm-fs.mjs +13 -0
  43. package/dist/runtime/core/bindings/satori/wasm.d.ts +6 -0
  44. package/dist/runtime/core/bindings/satori/wasm.mjs +14 -0
  45. package/dist/runtime/core/cache/emojis.d.ts +1 -0
  46. package/dist/runtime/core/cache/emojis.mjs +5 -0
  47. package/dist/runtime/core/cache/htmlPayload.d.ts +5 -0
  48. package/dist/runtime/core/cache/htmlPayload.mjs +6 -0
  49. package/dist/runtime/core/cache/prerender.d.ts +1 -5
  50. package/dist/runtime/core/cache/prerender.mjs +1 -2
  51. package/dist/runtime/core/env/assets.d.ts +0 -1
  52. package/dist/runtime/core/env/assets.mjs +0 -4
  53. package/dist/runtime/core/font/fetch.d.ts +2 -3
  54. package/dist/runtime/core/font/fetch.mjs +32 -15
  55. package/dist/runtime/core/html/applyEmojis.d.ts +3 -0
  56. package/dist/runtime/core/html/applyEmojis.mjs +37 -0
  57. package/dist/runtime/core/html/applyInlineCss.d.ts +3 -0
  58. package/dist/runtime/core/html/applyInlineCss.mjs +32 -0
  59. package/dist/runtime/core/html/devIframeTemplate.d.ts +2 -0
  60. package/dist/runtime/core/html/{fetch.mjs → devIframeTemplate.mjs} +33 -42
  61. package/dist/runtime/core/html/fetchIsland.d.ts +3 -0
  62. package/dist/runtime/core/html/fetchIsland.mjs +17 -0
  63. package/dist/runtime/core/options/fetch.d.ts +1 -1
  64. package/dist/runtime/core/options/fetch.mjs +10 -5
  65. package/dist/runtime/core/renderers/chromium/index.mjs +9 -13
  66. package/dist/runtime/core/renderers/chromium/screenshot.d.ts +2 -3
  67. package/dist/runtime/core/renderers/chromium/screenshot.mjs +18 -13
  68. package/dist/runtime/core/renderers/satori/fonts.d.ts +2 -2
  69. package/dist/runtime/core/renderers/satori/fonts.mjs +2 -2
  70. package/dist/runtime/core/renderers/satori/index.d.ts +2 -3
  71. package/dist/runtime/core/renderers/satori/index.mjs +26 -22
  72. package/dist/runtime/core/renderers/satori/instances.d.ts +3 -0
  73. package/dist/runtime/core/renderers/satori/instances.mjs +15 -0
  74. package/dist/runtime/core/renderers/satori/plugins/emojis.mjs +15 -13
  75. package/dist/runtime/core/renderers/satori/plugins/imageSrc.mjs +23 -10
  76. package/dist/runtime/core/renderers/satori/plugins/unocss.d.ts +2 -0
  77. package/dist/runtime/core/renderers/satori/plugins/unocss.mjs +45 -0
  78. package/dist/runtime/core/renderers/satori/utils.d.ts +2 -3
  79. package/dist/runtime/core/renderers/satori/vnodes.d.ts +2 -3
  80. package/dist/runtime/core/renderers/satori/vnodes.mjs +16 -6
  81. package/dist/runtime/core/utils/resolveRendererContext.d.ts +2 -6
  82. package/dist/runtime/core/utils/resolveRendererContext.mjs +47 -29
  83. package/dist/runtime/core/utils/wasm.d.ts +3 -0
  84. package/dist/runtime/core/utils/wasm.mjs +16 -0
  85. package/dist/runtime/nitro/plugins/nuxt-content.mjs +3 -4
  86. package/dist/runtime/nitro/plugins/prerender.d.ts +1 -1
  87. package/dist/runtime/nitro/plugins/prerender.mjs +20 -18
  88. package/dist/runtime/nitro/utils.d.ts +2 -0
  89. package/dist/runtime/nitro/utils.mjs +17 -0
  90. package/dist/runtime/nuxt/plugins/og-image-canonical-urls.server.mjs +31 -0
  91. package/dist/runtime/nuxt/plugins/route-rule-og-image.server.mjs +16 -51
  92. package/dist/runtime/nuxt/utils.d.ts +3 -0
  93. package/dist/runtime/nuxt/utils.mjs +69 -0
  94. package/dist/runtime/server/routes/__og-image__/debug.json.d.ts +2 -3
  95. package/dist/runtime/server/routes/__og-image__/debug.json.mjs +5 -7
  96. package/dist/runtime/server/routes/__og-image__/image.mjs +88 -0
  97. package/dist/runtime/types.d.ts +89 -25
  98. package/dist/runtime/utils.d.ts +4 -0
  99. package/dist/runtime/utils.mjs +11 -0
  100. package/dist/runtime/utils.pure.d.ts +5 -0
  101. package/dist/runtime/utils.pure.mjs +43 -0
  102. package/package.json +30 -31
  103. package/virtual.d.ts +49 -0
  104. package/dist/client/_nuxt/IconCSS.8f429b14.css +0 -1
  105. package/dist/client/_nuxt/IconCSS.b16882c0.js +0 -1
  106. package/dist/client/_nuxt/builds/meta/df74ddc4-3ccb-4ada-8e61-014943e6befc.json +0 -1
  107. package/dist/client/_nuxt/entry.434c2c45.css +0 -1
  108. package/dist/client/_nuxt/entry.d4edd2a5.js +0 -137
  109. package/dist/client/grid.png +0 -0
  110. package/dist/runtime/components/OgImage/Cached.d.ts +0 -5
  111. package/dist/runtime/components/OgImage/Cached.mjs +0 -10
  112. package/dist/runtime/components/OgImage/Dynamic.d.ts +0 -8
  113. package/dist/runtime/components/OgImage/Dynamic.mjs +0 -10
  114. package/dist/runtime/components/OgImage/Screenshot.d.ts +0 -6
  115. package/dist/runtime/components/OgImage/Static.d.ts +0 -8
  116. package/dist/runtime/components/OgImage/Static.mjs +0 -10
  117. package/dist/runtime/components/OgImage/WithoutCache.d.ts +0 -5
  118. package/dist/runtime/components/OgImage/WithoutCache.mjs +0 -10
  119. package/dist/runtime/components/OgImage/index.d.ts +0 -5
  120. package/dist/runtime/components/Templates/Official/Fallback.vue +0 -147
  121. package/dist/runtime/core/bindings/css-inline/mock.d.ts +0 -5
  122. package/dist/runtime/core/bindings/css-inline/mock.mjs +0 -3
  123. package/dist/runtime/core/bindings/satori/yoga-wasm.mjs +0 -7
  124. package/dist/runtime/core/bindings/sharp/wasm.d.ts +0 -2
  125. package/dist/runtime/core/bindings/sharp/wasm.mjs +0 -2
  126. package/dist/runtime/core/html/fetch.d.ts +0 -3
  127. package/dist/runtime/core/options/normalise.d.ts +0 -2
  128. package/dist/runtime/core/options/normalise.mjs +0 -26
  129. package/dist/runtime/nuxt/plugins/nuxt-content-canonical-urls.mjs +0 -29
  130. package/dist/runtime/public-assets/__nuxt_og_image__/browser-provider-not-supported.png +0 -0
  131. package/dist/runtime/server/routes/__og-image__/image-[path]-og.[extension].mjs +0 -45
  132. package/dist/runtime/utilts.d.ts +0 -2
  133. package/dist/runtime/utilts.mjs +0 -8
  134. /package/dist/runtime/core/bindings/satori/{yoga-wasm.d.ts → wasm-fs.d.ts} +0 -0
  135. /package/dist/runtime/nuxt/plugins/{nuxt-content-canonical-urls.d.ts → og-image-canonical-urls.server.d.ts} +0 -0
  136. /package/dist/runtime/{public-assets-optional/inter-font → server/assets}/inter-latin-ext-400-normal.woff +0 -0
  137. /package/dist/runtime/{public-assets-optional/inter-font → server/assets}/inter-latin-ext-700-normal.woff +0 -0
  138. /package/dist/runtime/server/routes/__og-image__/{image-[path]-og.[extension].d.ts → image.d.ts} +0 -0
@@ -1,12 +1,9 @@
1
- import type { H3Event } from 'h3';
2
- export declare function useNitroCache<T>(e: H3Event, options: {
3
- key: string;
4
- cacheTtl: number;
5
- cache: boolean;
6
- headers: boolean;
7
- skipRestore?: boolean;
8
- }): Promise<{
9
- cachedItem: false | T;
1
+ import type { OgImageRenderEventContext } from './types';
2
+ export declare function useOgImageBufferCache(ctx: OgImageRenderEventContext, options: {
3
+ baseCacheKey: string | false;
4
+ cacheMaxAgeSeconds?: number;
5
+ }): Promise<void | {
6
+ cachedItem: false | BufferSource;
10
7
  enabled: boolean;
11
- update: (item: T) => Promise<void>;
8
+ update: (image: BufferSource) => Promise<void>;
12
9
  }>;
@@ -1,45 +1,58 @@
1
1
  import { prefixStorage } from "unstorage";
2
- import { getQuery, setHeader } from "h3";
3
- import { useRuntimeConfig, useStorage } from "#imports";
4
- export async function useNitroCache(e, options) {
5
- const module = "nuxt-og-image";
6
- const { runtimeCacheStorage, version } = useRuntimeConfig()[module];
7
- const enabled = options.cache && runtimeCacheStorage && options.cacheTtl && options.cacheTtl > 0;
8
- const baseCacheKey = runtimeCacheStorage === "default" ? `/cache/${module}@${version}` : `/${module}@${version}`;
9
- const cache = prefixStorage(useStorage(), `${baseCacheKey}/`);
10
- const key = options.key;
11
- let xCacheHeader = "DISABLED";
12
- let xCacheExpires = 0;
13
- const newExpires = Date.now() + (options.cacheTtl || 0);
14
- const purge = typeof getQuery(e).purge !== "undefined";
2
+ import { getQuery, handleCacheHeaders, setHeader, setHeaders } from "h3";
3
+ import { withTrailingSlash } from "ufo";
4
+ import { hash } from "ohash";
5
+ import { useStorage } from "#imports";
6
+ export async function useOgImageBufferCache(ctx, options) {
7
+ const maxAge = Number(options.cacheMaxAgeSeconds);
8
+ const enabled = !import.meta.dev && import.meta.env.MODE !== "test" && maxAge > 0;
9
+ const cache = prefixStorage(useStorage(), withTrailingSlash(options.baseCacheKey || "/"));
10
+ const key = ctx.key;
15
11
  let cachedItem = false;
16
- if (!options.skipRestore && enabled && await cache.hasItem(key).catch(() => false)) {
17
- const { value, expiresAt } = await cache.getItem(key).catch(() => ({ value: null, expiresAt: Date.now() }));
18
- if (purge) {
19
- xCacheHeader = "PURGE";
20
- xCacheExpires = newExpires;
12
+ if (enabled && await cache.hasItem(key).catch(() => false)) {
13
+ const { value, expiresAt, headers } = await cache.getItem(key).catch(() => ({ value: null, expiresAt: Date.now() }));
14
+ if (typeof getQuery(ctx.e).purge !== "undefined") {
21
15
  await cache.removeItem(key).catch(() => {
22
16
  });
23
17
  } else if (expiresAt > Date.now()) {
24
- xCacheHeader = "HIT";
25
- xCacheExpires = newExpires;
26
- cachedItem = value;
18
+ cachedItem = Buffer.from(value, "base64");
19
+ if (handleCacheHeaders(ctx.e, {
20
+ modifiedTime: new Date(headers["last-modified"]),
21
+ etag: headers.etag,
22
+ maxAge
23
+ }))
24
+ return;
25
+ setHeaders(ctx.e, headers);
27
26
  } else {
28
- xCacheHeader = "MISS";
29
- xCacheExpires = expiresAt;
30
27
  await cache.removeItem(key).catch(() => {
31
28
  });
32
29
  }
33
30
  }
34
- if (options.headers) {
35
- setHeader(e, `x-${module}-cache`, xCacheHeader);
36
- setHeader(e, `x-${module}-expires`, xCacheExpires.toString());
31
+ if (!enabled) {
32
+ setHeader(ctx.e, "Cache-Control", "no-cache, no-store, must-revalidate");
33
+ setHeader(ctx.e, "Pragma", "no-cache");
34
+ setHeader(ctx.e, "Expires", "0");
37
35
  }
38
36
  return {
39
37
  enabled,
40
38
  cachedItem,
41
39
  async update(item) {
42
- enabled && await cache.setItem(key, { value: item, expiresAt: Date.now() + (options.cacheTtl || 0) });
40
+ if (!enabled)
41
+ return;
42
+ const value = Buffer.from(item).toString("base64");
43
+ const headers = {
44
+ // avoid multi-tenancy cache issues
45
+ "Vary": "accept-encoding, host",
46
+ "etag": `W/"${hash(value)}"`,
47
+ "last-modified": (/* @__PURE__ */ new Date()).toUTCString(),
48
+ "cache-control": `public, s-maxage=${maxAge}, stale-while-revalidate`
49
+ };
50
+ setHeaders(ctx.e, headers);
51
+ await cache.setItem(key, {
52
+ value,
53
+ headers,
54
+ expiresAt: Date.now() + maxAge * 1e3
55
+ });
43
56
  }
44
57
  };
45
58
  }
@@ -0,0 +1,5 @@
1
+ import type { OgImageOptions } from '../../types';
2
+ declare const _default: import("vue").DefineComponent<OgImageOptions<"NuxtSeo">, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<OgImageOptions<"NuxtSeo">>, {
3
+ props?: any;
4
+ }, {}>;
5
+ export default _default;
@@ -4,7 +4,7 @@ export default defineComponent({
4
4
  name: "OgImage",
5
5
  async setup(_, { attrs }) {
6
6
  if (import.meta.server)
7
- await defineOgImage(attrs);
7
+ defineOgImage(attrs);
8
8
  return () => null;
9
9
  }
10
10
  });
@@ -0,0 +1,5 @@
1
+ import type { OgImagePageScreenshotOptions } from '../../types';
2
+ declare const _default: import("vue").DefineComponent<OgImagePageScreenshotOptions, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<OgImagePageScreenshotOptions>, {
3
+ props?: any;
4
+ }, {}>;
5
+ export default _default;
@@ -4,7 +4,7 @@ export default defineComponent({
4
4
  name: "OgImageScreenshot",
5
5
  async setup(_, { attrs }) {
6
6
  if (import.meta.server)
7
- await defineOgImageScreenshot(attrs);
7
+ defineOgImageScreenshot(attrs);
8
8
  return () => null;
9
9
  }
10
10
  });
@@ -1,6 +1,7 @@
1
1
  <script setup lang="ts">
2
- // inherited attrs can mess up the satori parser
3
- defineOptions({ inheritAttrs: false })
2
+ /**
3
+ * @credits Full Stack Heroes <https://fullstackheroes.com/>
4
+ */
4
5
 
5
6
  withDefaults(defineProps<{
6
7
  title?: string
@@ -3,14 +3,15 @@
3
3
  * @credits NuxtLabs <https://nuxtlabs.com/>
4
4
  * @see https://github.com/nuxt/nuxt.com/blob/main/components/OgImage/OgImageDocs.vue
5
5
  */
6
+ import { computed } from 'vue'
6
7
 
7
- defineOptions({ inheritAttrs: false })
8
-
9
- withDefaults(defineProps<{ title?: string, description?: string, headline?: string }>(), {
8
+ const props = withDefaults(defineProps<{ title?: string, description?: string, headline?: string }>(), {
10
9
  title: 'title',
11
10
  description: 'description',
12
11
  headline: 'headline',
13
12
  })
13
+
14
+ const title = computed(() => props.title.slice(0, 60))
14
15
  </script>
15
16
 
16
17
  <template>
@@ -43,11 +44,11 @@ withDefaults(defineProps<{ title?: string, description?: string, headline?: stri
43
44
  </defs>
44
45
  </svg>
45
46
 
46
- <div class="w-[700px] pl-[100px]">
47
+ <div class="w-[600px] pl-[100px]">
47
48
  <p v-if="headline" class="uppercase text-[24px] text-[#00DC82] mb-4 font-semibold">
48
49
  {{ headline }}
49
50
  </p>
50
- <h1 class="m-0 text-[75px] font-semibold mb-4 text-white flex items-center">
51
+ <h1 class="w-[600px] m-0 text-[75px] font-semibold mb-4 text-white flex items-center">
51
52
  <span>{{ title }}</span>
52
53
  </h1>
53
54
  <p class="text-[32px] text-[#E4E4E7] leading-tight">
@@ -0,0 +1,137 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * @credits Nuxt SEO <https://nuxtseo.com/>
4
+ */
5
+
6
+ import { computed, defineComponent, h, resolveComponent } from 'vue'
7
+ import { useOgImageRuntimeConfig } from '../../../utils'
8
+ import { useSiteConfig } from '#imports'
9
+
10
+ // convert to typescript props
11
+ const props = withDefaults(defineProps<{
12
+ colorMode?: 'dark' | 'light'
13
+ title?: string
14
+ description?: string
15
+ icon?: string | boolean
16
+ siteName?: string
17
+ siteLogo?: string
18
+ theme?: string
19
+ }>(), {
20
+ theme: '#00dc82',
21
+ title: 'title',
22
+ })
23
+
24
+ const HexRegex = /^#([0-9a-f]{3}){1,2}$/i
25
+
26
+ const runtimeConfig = useOgImageRuntimeConfig()
27
+
28
+ const colorMode = computed(() => {
29
+ return props.colorMode || runtimeConfig.colorPreference || 'light'
30
+ })
31
+
32
+ const themeHex = computed(() => {
33
+ // regex test if valid hex
34
+ if (HexRegex.test(props.theme))
35
+ return props.theme
36
+
37
+ // if it's hex without the hash, just add the hash
38
+ if (HexRegex.test(`#${props.theme}`))
39
+ return `#${props.theme}`
40
+
41
+ // if it's rgb or rgba, we convert it to hex
42
+ if (props.theme.startsWith('rgb')) {
43
+ const rgb = props.theme
44
+ .replace('rgb(', '')
45
+ .replace('rgba(', '')
46
+ .replace(')', '')
47
+ .split(',')
48
+ .map(v => Number.parseInt(v.trim(), 10))
49
+ const hex = rgb
50
+ .map((v) => {
51
+ const hex = v.toString(16)
52
+ return hex.length === 1 ? `0${hex}` : hex
53
+ })
54
+ .join('')
55
+ return `#${hex}`
56
+ }
57
+ return '#FFFFFF'
58
+ })
59
+
60
+ const themeRgb = computed(() => {
61
+ // we want to convert it so it's just `<red>, <green>, <blue>` (255, 255, 255)
62
+ return themeHex.value
63
+ .replace('#', '')
64
+ .match(/.{1,2}/g)
65
+ ?.map(v => Number.parseInt(v, 16))
66
+ .join(', ')
67
+ })
68
+
69
+ const siteConfig = useSiteConfig()
70
+ const siteName = computed(() => {
71
+ return props.siteName || siteConfig.name
72
+ })
73
+ const siteLogo = computed(() => {
74
+ return props.siteLogo || siteConfig.logo
75
+ })
76
+
77
+ const IconComponent = runtimeConfig.hasNuxtIcon
78
+ ? resolveComponent('Icon')
79
+ : defineComponent({
80
+ render() {
81
+ return h('div', 'missing nuxt-icon')
82
+ },
83
+ })
84
+ if (typeof props.icon === 'string' && !runtimeConfig.hasNuxtIcon && process.dev) {
85
+ console.warn('Please install `nuxt-icon` to use icons with the fallback OG Image component.')
86
+ // eslint-disable-next-line no-console
87
+ console.log('\nnpm add -D nuxt-icon\n')
88
+ // create simple div renderer component
89
+ }
90
+ </script>
91
+
92
+ <template>
93
+ <div
94
+ class="w-full h-full flex justify-between relative p-[60px]"
95
+ :class="[
96
+ colorMode === 'light' ? ['bg-white', 'text-gray-900'] : ['bg-gray-900', 'text-gray-50'],
97
+ ]"
98
+ >
99
+ <div
100
+ class="flex absolute top-0 right-[-100%]" :style="{
101
+ width: '200%',
102
+ height: '200%',
103
+ backgroundImage: `radial-gradient(circle, rgba(${themeRgb}, 0.5) 0%, ${colorMode === 'dark' ? 'rgba(5, 5, 5,0.3)' : 'rgba(255, 255, 255, 0.7)'} 50%, ${props.colorMode === 'dark' ? 'rgba(5, 5, 5,0)' : 'rgba(255, 255, 255, 0)'} 70%)`,
104
+ }"
105
+ />
106
+ <div class="h-full w-full justify-between relative">
107
+ <div class="flex flex-row justify-between items-start">
108
+ <div class="flex flex-col w-full max-w-[65%]">
109
+ <h1 class="m-0 font-bold mb-[30px] text-[75px]">
110
+ {{ title }}
111
+ </h1>
112
+ <p
113
+ v-if="description" class="text-[35px]" :class="[
114
+ colorMode === 'light' ? ['text-gray-700'] : ['text-gray-300'],
115
+ ]"
116
+ >
117
+ {{ description }}
118
+ </p>
119
+ </div>
120
+ <div v-if="icon" style="width: 30%;" class="flex justify-end">
121
+ <IconComponent :name="icon" size="250px" style="margin: 0 auto; opacity: 0.7;" />
122
+ </div>
123
+ </div>
124
+ <div class="flex flex-row justify-center items-center text-left w-full">
125
+ <img v-if="siteLogo" :src="siteLogo" height="30">
126
+ <template v-else>
127
+ <svg height="50" width="50" class="mr-3" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
128
+ <path :fill="theme.includes('#') ? theme : `#${theme}`" d="M62.3,-53.9C74.4,-34.5,73.5,-9,67.1,13.8C60.6,36.5,48.7,56.5,30.7,66.1C12.7,75.7,-11.4,74.8,-31.6,65.2C-51.8,55.7,-67.9,37.4,-73.8,15.7C-79.6,-6,-75.1,-31.2,-61.1,-51C-47.1,-70.9,-23.6,-85.4,0.8,-86C25.1,-86.7,50.2,-73.4,62.3,-53.9Z" transform="translate(100 100)" />
129
+ </svg>
130
+ <p v-if="siteName" style="font-size: 25px;" class="font-bold">
131
+ {{ siteName }}
132
+ </p>
133
+ </template>
134
+ </div>
135
+ </div>
136
+ </div>
137
+ </template>
@@ -0,0 +1,104 @@
1
+ <script lang="ts" setup>
2
+ /**
3
+ * @credits Pergel <https://nuxtlabs.com/>
4
+ * @see https://github.com/nuxt/nuxt.com/blob/main/components/OgImage/OgImageDocs.vue
5
+ */
6
+ import { computed } from 'vue'
7
+
8
+ const props = withDefaults(defineProps<{ title?: string, description?: string, headline?: string }>(), {
9
+ title: 'title',
10
+ description: 'description',
11
+ headline: 'headline',
12
+ })
13
+
14
+ const title = computed(() => props.title.slice(0, 60))
15
+ </script>
16
+
17
+ <template>
18
+ <div class="w-full h-full flex flex-col justify-center bg-[#212121]">
19
+ <svg class="absolute top-0 right-0" width="1200" height="675" viewBox="0 0 1200 675" fill="none" xmlns="http://www.w3.org/2000/svg">
20
+ <g style="mix-blend-mode:overlay" opacity="0.7" filter="url(#filter0_f_448_25)">
21
+ <circle cx="901.5" cy="45.5" r="199.5" fill="#FFA7A7" />
22
+ <circle cx="600.5" cy="216.5" r="199.5" fill="#FFCC49" />
23
+ <circle cx="179.5" cy="317.5" r="199.5" fill="#FFA149" />
24
+ </g>
25
+ <defs>
26
+ <filter id="filter0_f_448_25" x="-240" y="-374" width="1561" height="1111" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
27
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
28
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
29
+ <feGaussianBlur stdDeviation="110" result="effect1_foregroundBlur_448_25" />
30
+ </filter>
31
+ </defs>
32
+ </svg>
33
+
34
+ <div class="w-[600px] pl-[100px]">
35
+ <p v-if="headline" class="uppercase text-[24px] text-[#FEC476] mb-4 font-semibold">
36
+ Oku - Pergel
37
+ </p>
38
+ <h1 class="w-[600px] m-0 text-[75px] font-semibold mb-4 text-white flex items-center">
39
+ <span>{{ title }}</span>
40
+ </h1>
41
+ <p class="text-[32px] text-[#E4E4E7] leading-tight">
42
+ {{ description.slice(0, 200) }}
43
+ </p>
44
+ </div>
45
+
46
+ <svg class="absolute top-[250px] right-[190px]" width="241" height="184" viewBox="0 0 241 184" fill="none" xmlns="http://www.w3.org/2000/svg">
47
+ <g filter="url(#filter0_ddd_563_6)">
48
+ <path d="M204.852 126.822C204.852 127.098 204.677 128.114 202.583 129.748C200.551 131.335 197.276 133.034 192.613 134.687C183.325 137.979 169.872 140.62 153.875 142.19C137.92 143.755 120.334 144.166 103.363 143.367C86.3776 142.566 70.8801 140.594 58.8213 137.738C52.7901 136.31 47.8449 134.713 44.0617 133.037C40.1988 131.325 37.891 129.679 36.7621 128.335C36.2309 127.702 36.0703 127.267 36.0227 127.035C35.9829 126.842 35.9842 126.629 36.1192 126.305C36.459 125.488 37.6413 124.038 40.7165 122.28C46.7614 118.823 57.5073 115.641 71.9244 113.359C86.2251 111.096 103.109 109.879 120.426 109.879" stroke="url(#paint0_angular_563_6)" stroke-width="8" />
49
+ </g>
50
+ <g clip-path="url(#clip0_563_6)">
51
+ <g filter="url(#filter1_i_563_6)">
52
+ <path d="M211.514 112.29L209.41 124.066L200.573 115.781L182.897 61.0337C186.772 60.5223 190.442 59.2291 193.777 57.2455L211.514 112.29ZM196.523 35.7822C195.733 40.2018 193.22 44.1268 189.537 46.6936C185.853 49.2604 181.301 50.2588 176.881 49.4691L174.437 49.0324L131.693 103.474L120.534 108.187L122.638 96.4106L165.598 41.721C160.708 33.7969 163.149 23.3421 171.139 18.407C174.615 16.2766 178.781 15.416 182.836 16.1405L184.821 5.03095C186.294 5.29416 187.603 6.13183 188.458 7.35968C189.314 8.58752 189.647 10.105 189.383 11.5782L188.212 18.1328C194.461 21.6568 197.783 28.7276 196.523 35.7822ZM185.413 33.7973C185.677 32.3241 185.344 30.8066 184.488 29.5788C183.633 28.3509 182.324 27.5133 180.851 27.25C179.378 26.9868 177.861 27.3196 176.633 28.1752C175.405 29.0308 174.567 30.3391 174.304 31.8123C174.041 33.2856 174.374 34.803 175.229 36.0308C176.085 37.2587 177.393 38.0964 178.866 38.3596C180.339 38.6228 181.857 38.29 183.085 37.4344C184.313 36.5788 185.15 35.2705 185.413 33.7973Z" fill="url(#paint1_diamond_563_6)" />
53
+ </g>
54
+ </g>
55
+ <defs>
56
+ <filter id="filter0_ddd_563_6" x="-3.8147e-05" y="77.8786" width="240.852" height="105.886" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
57
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
58
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
59
+ <feOffset dy="3.62319" />
60
+ <feGaussianBlur stdDeviation="7.24638" />
61
+ <feComposite in2="hardAlpha" operator="out" />
62
+ <feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.667391 0 0 0 0 0.3625 0 0 0 0.75 0" />
63
+ <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_563_6" />
64
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
65
+ <feOffset dy="4" />
66
+ <feGaussianBlur stdDeviation="16" />
67
+ <feComposite in2="hardAlpha" operator="out" />
68
+ <feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.854792 0 0 0 0 0.4875 0 0 0 0.25 0" />
69
+ <feBlend mode="normal" in2="effect1_dropShadow_563_6" result="effect2_dropShadow_563_6" />
70
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
71
+ <feOffset dy="4" />
72
+ <feGaussianBlur stdDeviation="2" />
73
+ <feComposite in2="hardAlpha" operator="out" />
74
+ <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0" />
75
+ <feBlend mode="normal" in2="effect2_dropShadow_563_6" result="effect3_dropShadow_563_6" />
76
+ <feBlend mode="normal" in="SourceGraphic" in2="effect3_dropShadow_563_6" result="shape" />
77
+ </filter>
78
+ <filter id="filter1_i_563_6" x="120.534" y="5.03094" width="94.9804" height="123.035" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
79
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
80
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
81
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
82
+ <feOffset dx="7" dy="5" />
83
+ <feGaussianBlur stdDeviation="2" />
84
+ <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
85
+ <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0" />
86
+ <feBlend mode="normal" in2="shape" result="effect1_innerShadow_563_6" />
87
+ </filter>
88
+ <radialGradient id="paint0_angular_563_6" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(120.426 126.822) rotate(90) scale(20.943 88.4261)">
89
+ <stop offset="0.0677083" stop-color="#FFE092" />
90
+ <stop offset="0.333333" stop-color="#FFD792" />
91
+ <stop offset="0.666667" stop-color="#FFD192" />
92
+ <stop offset="1" stop-color="#FFAC5F" />
93
+ </radialGradient>
94
+ <radialGradient id="paint1_diamond_563_6" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(303.899 145.741) rotate(-155.036) scale(253.361 239.508)">
95
+ <stop offset="0.333674" stop-color="#FEC479" />
96
+ <stop offset="1" stop-color="white" stop-opacity="0" />
97
+ </radialGradient>
98
+ <clipPath id="clip0_563_6">
99
+ <rect width="135.426" height="135.426" fill="white" transform="translate(96.5743)" />
100
+ </clipPath>
101
+ </defs>
102
+ </svg>
103
+ </div>
104
+ </template>
@@ -1,8 +1,10 @@
1
1
  <script setup lang="ts">
2
- import { parseURL } from 'ufo'
2
+ /**
3
+ * @credits Full Stack Heroes <https://fullstackheroes.com/>
4
+ */
3
5
 
4
- // inherited attrs can mess up the satori parser
5
- defineOptions({ inheritAttrs: false })
6
+ import { parseURL } from 'ufo'
7
+ import { computed, useSiteConfig } from '#imports'
6
8
 
7
9
  const props = withDefaults(defineProps<{
8
10
  title?: string
@@ -24,9 +26,9 @@ const website = computed(() => {
24
26
  <h1 class="text-[80px] p-20 font-black text-left">
25
27
  {{ title }}
26
28
  </h1>
27
- <div class="text-2xl pb-10 px-20 font-bold mb-0">
29
+ <p class="text-2xl pb-10 px-20 font-bold mb-0">
28
30
  {{ website }}
29
- </div>
31
+ </p>
30
32
  </div>
31
33
  </div>
32
34
  </div>
@@ -0,0 +1,108 @@
1
+ <script setup lang="ts">
2
+ import { computed } from '#imports'
3
+
4
+ /**
5
+ * @credits UnJS <https://unjs.io/>
6
+ */
7
+
8
+ const props = withDefaults(defineProps<{
9
+ title?: string
10
+ description?: string
11
+ emoji?: string
12
+ downloads?: string | number
13
+ stars?: string | number
14
+ contributors?: string | number
15
+ }>(), {
16
+ title: 'unjs/h3',
17
+ description: 'Minimal H(TTP) framework built for high performance and portability',
18
+ emoji: '⚡',
19
+ downloads: '2500000',
20
+ stars: '2400',
21
+ contributors: '30',
22
+ })
23
+
24
+ const org = computed(() => props.title.split('/')[0])
25
+ const repo = computed(() => props.title.split('/')[1])
26
+
27
+ const stars = computed(() => {
28
+ return new Intl.NumberFormat('en-US', { notation: 'compact', compactDisplay: 'short' }).format(props.stars || 0)
29
+ })
30
+ const downloads = computed(() => new Intl.NumberFormat('en-US', { notation: 'compact', compactDisplay: 'short' })
31
+ .format(props.downloads || 0),
32
+ )
33
+
34
+ const description = computed(() => (props.description || '').slice(0, 200))
35
+ </script>
36
+
37
+ <template>
38
+ <div class="w-full h-full flex flex-col bg-white">
39
+ <div class="pt-[60px] pb-[70px] px-[6.75rem] h-full flex flex-col justify-between">
40
+ <div class="flex flex-row justify-between">
41
+ <div class="max-w-[700px]">
42
+ <h1 class="mb-[30px] max-w-[700px] text-[60px] text-gray-900 font-normal flex flex-row">
43
+ <span>{{ org }}</span>
44
+ <span v-if="repo" class="ml-2">/</span>
45
+ <span v-if="repo" class="ml-2 font-bold">{{ repo }}</span>
46
+ </h1>
47
+ <p class="text-gray-500 max-w-[700px] text-[35px] leading-[60px]">
48
+ {{ description }}
49
+ </p>
50
+ </div>
51
+ <div class="text-[200px]">
52
+ {{ emoji }}
53
+ </div>
54
+ </div>
55
+ <div class="flex flex-row items-center justify-between">
56
+ <div class="flex flex-row text-[40px]">
57
+ <div class="flex flex-row pr-10">
58
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 32 32"><path fill="#888888" d="m4.67 28l6.39-12l7.3 6.49a2 2 0 0 0 1.7.47a2 2 0 0 0 1.42-1.07L27 10.9l-1.82-.9l-5.49 11l-7.3-6.49a2 2 0 0 0-1.68-.51a2 2 0 0 0-1.42 1L4 25V2H2v26a2 2 0 0 0 2 2h26v-2Z" /></svg>
59
+ <div class="pl-2">
60
+ <div>{{ downloads }}</div>
61
+ <div class="text-lg text-gray-600">
62
+ Monthly Downloads
63
+ </div>
64
+ </div>
65
+ </div>
66
+ <div class="flex flex-row pr-10">
67
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 32 32"><path fill="#888888" d="m16 6.52l2.76 5.58l.46 1l1 .15l6.16.89l-4.38 4.3l-.75.73l.18 1l1.05 6.13l-5.51-2.89L16 23l-.93.49l-5.51 2.85l1-6.13l.18-1l-.74-.77l-4.42-4.35l6.16-.89l1-.15l.46-1L16 6.52M16 2l-4.55 9.22l-10.17 1.47l7.36 7.18L6.9 30l9.1-4.78L25.1 30l-1.74-10.13l7.36-7.17l-10.17-1.48Z" /></svg>
68
+ <div class="pl-2">
69
+ <div>{{ stars }}</div>
70
+ <div class="text-lg text-gray-600">
71
+ Stars
72
+ </div>
73
+ </div>
74
+ </div>
75
+ <div class="flex flex-row pr-10">
76
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 32 32"><path fill="#888888" d="M22.45 6a5.47 5.47 0 0 1 3.91 1.64a5.7 5.7 0 0 1 0 8L16 26.13L5.64 15.64a5.7 5.7 0 0 1 0-8a5.48 5.48 0 0 1 7.82 0l2.54 2.6l2.53-2.58A5.44 5.44 0 0 1 22.45 6m0-2a7.47 7.47 0 0 0-5.34 2.24L16 7.36l-1.11-1.12a7.49 7.49 0 0 0-10.68 0a7.72 7.72 0 0 0 0 10.82L16 29l11.79-11.94a7.72 7.72 0 0 0 0-10.82A7.49 7.49 0 0 0 22.45 4Z" /></svg>
77
+ <div class="pl-2">
78
+ <div>{{ contributors }}</div>
79
+ <div class="text-lg text-gray-600">
80
+ Contributors
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ <div class="flex flex-row">
86
+ <svg width="100" height="100" class="rounded-[0.25rem] w-[100px] h-[100px]" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
87
+ <g clip-path="url(#clip0_206_4645)">
88
+ <mask id="mask0_206_4645" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="32" height="32">
89
+ <path d="M32 0H0V32H32V0Z" fill="white" />
90
+ </mask>
91
+ <g mask="url(#mask0_206_4645)">
92
+ <path d="M31.9142 32.0223C21.2766 32.0223 10.6506 32.0223 0.0246745 32.0223C0.0238272 32.0194 0.0222373 32.0166 0.0222373 32.0137C0.0221323 21.3508 0.0221329 10.688 0.0221329 0.0236816C10.6877 0.0236816 21.3534 0.0236816 32.0206 0.0236816C32.0206 10.6878 32.0206 21.3533 32.0206 32.0223C31.9901 32.0223 31.958 32.0223 31.9142 32.0223ZM26.4121 20.9345C26.361 20.8762 26.3128 20.8153 26.2585 20.7601C25.6577 20.1492 24.9011 20.0218 24.0955 20.0946C23.3969 20.1577 22.7984 20.4652 22.2811 20.9345C22.2532 20.9598 22.2227 20.9823 22.1824 21.0151C22.1824 20.9497 22.185 20.902 22.182 20.8546C22.1669 20.6225 22.0579 20.4465 21.8514 20.3407C21.649 20.2371 21.4421 20.247 21.2512 20.3689C21.0389 20.5045 20.9665 20.713 20.9667 20.958C20.9682 22.7933 20.9675 24.6286 20.9675 26.4639C20.9675 26.5784 20.9652 26.693 20.968 26.8074C20.9751 27.102 21.1313 27.3354 21.3685 27.4101C21.7847 27.5411 22.1817 27.2525 22.1823 26.8136C22.1839 25.5543 22.1836 24.2951 22.1824 23.0359C22.1821 22.6812 22.2717 22.356 22.4979 22.0791C23.025 21.434 23.7075 21.1616 24.5332 21.2556C24.9353 21.3015 25.2602 21.4881 25.4831 21.8327C25.6923 22.1561 25.7639 22.5212 25.7668 22.8971C25.7747 23.9347 25.7716 24.9724 25.7727 26.01C25.7731 26.2943 25.7683 26.5788 25.7739 26.863C25.7826 27.3076 26.2605 27.5828 26.6518 27.3716C26.9007 27.2373 26.9891 27.0176 26.9888 26.7463C26.9873 25.5683 26.9907 24.3903 26.9862 23.2123C26.9852 22.9326 26.9757 22.6511 26.9432 22.3735C26.883 21.8589 26.7401 21.3697 26.4121 20.9345ZM18.7519 20.2768C18.6788 20.282 18.6027 20.2759 18.5331 20.2944C18.2433 20.3715 18.0835 20.6019 18.0833 20.9365C18.0826 22.1367 18.0851 23.337 18.081 24.5372C18.0803 24.7357 18.07 24.9372 18.035 25.1319C17.9425 25.6461 17.6668 26.0312 17.1721 26.2263C16.6902 26.4164 16.194 26.423 15.695 26.2875C15.3165 26.1848 15.0263 25.9676 14.8367 25.6226C14.7009 25.3752 14.6347 25.1055 14.6298 24.8266C14.6199 24.2617 14.6232 23.6966 14.6226 23.1316C14.6218 22.4004 14.6236 21.6691 14.6219 20.9379C14.6211 20.5778 14.3819 20.295 14.069 20.2767C13.6814 20.254 13.4081 20.518 13.4076 20.9221C13.4063 22.1556 13.4047 23.389 13.4085 24.6225C13.4099 25.0635 13.4572 25.4984 13.6251 25.9135C13.9436 26.701 14.5379 27.1764 15.3353 27.4077C15.8372 27.5533 16.3542 27.5622 16.8722 27.5012C17.2723 27.4541 17.6549 27.3449 18.0035 27.1424C18.8265 26.6641 19.2453 25.9203 19.2718 24.9916C19.3108 23.63 19.2949 22.2667 19.2963 20.9041C19.2968 20.5622 19.0957 20.3353 18.7519 20.2768Z" fill="#ECDC5A" />
93
+ <path d="M26.4164 20.9411C26.7401 21.3697 26.883 21.8589 26.9432 22.3735C26.9757 22.6511 26.9852 22.9326 26.9862 23.2123C26.9907 24.3903 26.9873 25.5683 26.9888 26.7463C26.9891 27.0176 26.9007 27.2373 26.6518 27.3716C26.2605 27.5828 25.7825 27.3076 25.7739 26.863C25.7683 26.5787 25.773 26.2943 25.7728 26.01C25.7716 24.9723 25.7746 23.9347 25.7668 22.8971C25.7639 22.5212 25.6923 22.1561 25.4831 21.8327C25.2603 21.488 24.9353 21.3014 24.5332 21.2556C23.7076 21.1616 23.025 21.434 22.4979 22.0791C22.2718 22.356 22.182 22.6812 22.1824 23.0358C22.1836 24.2951 22.1839 25.5543 22.1823 26.8136C22.1817 27.2525 21.7847 27.5411 21.3686 27.4101C21.1313 27.3354 20.9751 27.102 20.968 26.8074C20.9653 26.6929 20.9676 26.5784 20.9676 26.4639C20.9676 24.6286 20.9682 22.7933 20.9667 20.9579C20.9665 20.713 21.039 20.5045 21.2512 20.3689C21.4421 20.2469 21.649 20.2371 21.8513 20.3407C22.0578 20.4465 22.1669 20.6224 22.182 20.8546C22.185 20.9019 22.1824 20.9497 22.1824 21.015C22.2227 20.9823 22.2532 20.9598 22.2811 20.9344C22.7984 20.4652 23.3969 20.1577 24.0955 20.0946C24.901 20.0218 25.6577 20.1492 26.2585 20.7601C26.3127 20.8153 26.361 20.8762 26.4164 20.9411Z" fill="#111827" />
94
+ <path d="M18.7618 20.2773C19.0957 20.3354 19.2968 20.5622 19.2963 20.9041C19.2949 22.2667 19.3108 23.63 19.2718 24.9916C19.2453 25.9204 18.8265 26.6641 18.0035 27.1424C17.6549 27.345 17.2723 27.4542 16.8722 27.5012C16.3542 27.5622 15.8372 27.5534 15.3353 27.4078C14.5379 27.1764 13.9436 26.701 13.6251 25.9135C13.4572 25.4984 13.4099 25.0635 13.4085 24.6225C13.4047 23.3891 13.4063 22.1556 13.4076 20.9221C13.4081 20.518 13.6814 20.2541 14.069 20.2767C14.3819 20.2951 14.6211 20.5779 14.6219 20.938C14.6236 21.6692 14.6218 22.4004 14.6226 23.1316C14.6232 23.6966 14.6199 24.2618 14.6298 24.8266C14.6347 25.1055 14.7009 25.3753 14.8367 25.6226C15.0263 25.9677 15.3165 26.1848 15.695 26.2876C16.1939 26.423 16.6902 26.4164 17.1721 26.2263C17.6668 26.0313 17.9425 25.6461 18.035 25.132C18.07 24.9372 18.0803 24.7358 18.081 24.5373C18.0851 23.337 18.0826 22.1368 18.0833 20.9366C18.0835 20.602 18.2433 20.3715 18.5331 20.2944C18.6027 20.2759 18.6788 20.282 18.7618 20.2773Z" fill="#111827" />
95
+ </g>
96
+ </g>
97
+ <defs>
98
+ <clipPath id="clip0_206_4645">
99
+ <rect width="32" height="32" rx="2" fill="white" />
100
+ </clipPath>
101
+ </defs>
102
+ </svg>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ <div class="absolute bottom-0 w-full h-8 bg-[#ECDC5A]" />
107
+ </div>
108
+ </template>
@@ -1,6 +1,7 @@
1
1
  <script setup lang="ts">
2
- // inherited attrs can mess up the satori parser
3
- defineOptions({ inheritAttrs: false })
2
+ /**
3
+ * @credits Full Stack Heroes <https://fullstackheroes.com/>
4
+ */
4
5
 
5
6
  withDefaults(defineProps<{
6
7
  title?: string
@@ -1,6 +1,7 @@
1
1
  <script setup lang="ts">
2
- // inherited attrs can mess up the satori parser
3
- defineOptions({ inheritAttrs: false })
2
+ /**
3
+ * @credits Full Stack Heroes <https://fullstackheroes.com/>
4
+ */
4
5
 
5
6
  withDefaults(defineProps<{
6
7
  emoji?: string
@@ -1,23 +1,2 @@
1
- import type { AllowedComponentProps, Component, ComponentCustomProps, VNodeProps } from '@vue/runtime-core';
2
- import type { OgImageOptions, OgImageScreenshotOptions } from '../types';
3
- import type { OgImageComponents } from '#nuxt-og-image/components';
4
- export declare function defineOgImageScreenshot(options?: OgImageScreenshotOptions): void;
5
- /**
6
- * @param options
7
- * @deprecated Use `defineOgImage` or `defineOgImageCached` instead
8
- */
9
- export declare function defineOgImageStatic(options?: OgImageOptions): void;
10
- export declare function defineOgImageCached(options?: OgImageOptions): void;
11
- export declare function defineOgImageWithoutCache(options?: OgImageOptions): void;
12
- /**
13
- * @param options
14
- * @deprecated Use `defineOgImageWithoutCache` instead
15
- */
16
- export declare function defineOgImageDynamic(options?: OgImageOptions): void;
17
- type OgImagePrebuilt = {
18
- url: string;
19
- } & Pick<OgImageOptions, 'width' | 'height' | 'alt'>;
20
- type ExtractComponentProps<T extends Component> = T extends new (...args: any) => any ? Omit<InstanceType<T>['$props'], keyof ComponentCustomProps | keyof VNodeProps | keyof AllowedComponentProps> : never;
21
- export declare function defineOgImageComponent<T extends keyof OgImageComponents>(component: T, props: ExtractComponentProps<OgImageComponents[T]>, options?: OgImageOptions): void;
22
- export declare function defineOgImage(_options?: OgImagePrebuilt | OgImageOptions): void;
23
- export {};
1
+ import type { DefineOgImageInput } from '../types';
2
+ export declare function defineOgImage(_options?: DefineOgImageInput): void;