nuxt-og-image 3.0.0 → 3.0.2

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.
@@ -1 +1 @@
1
- {"id":"c0255dff-4096-412a-b1f2-8c73ec29c527","timestamp":1726070625217}
1
+ {"id":"f7ac4397-9cc2-4170-a44e-5e843b399997","timestamp":1726156539286}
@@ -0,0 +1 @@
1
+ {"id":"f7ac4397-9cc2-4170-a44e-5e843b399997","timestamp":1726156539286,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}
@@ -0,0 +1 @@
1
+ .spotlight[data-v-1e8489a4]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);bottom:-30vh;filter:blur(20vh);height:40vh}.gradient-border[data-v-1e8489a4]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:.5rem;position:relative}@media (prefers-color-scheme:light){.gradient-border[data-v-1e8489a4]{background-color:#ffffff4d}.gradient-border[data-v-1e8489a4]:before{background:linear-gradient(90deg,#e2e2e2,#e2e2e2 25%,#00dc82,#36e4da 75%,#0047e1)}}@media (prefers-color-scheme:dark){.gradient-border[data-v-1e8489a4]{background-color:#1414144d}.gradient-border[data-v-1e8489a4]:before{background:linear-gradient(90deg,#303030,#303030 25%,#00dc82,#36e4da 75%,#0047e1)}}.gradient-border[data-v-1e8489a4]:before{background-size:400% auto;border-radius:.5rem;bottom:0;content:"";left:0;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.5;padding:2px;position:absolute;right:0;top:0;transition:background-position .3s ease-in-out,opacity .2s ease-in-out;width:100%}.gradient-border[data-v-1e8489a4]:hover:before{background-position:-50% 0;opacity:1}.fixed[data-v-1e8489a4]{position:fixed}.left-0[data-v-1e8489a4]{left:0}.right-0[data-v-1e8489a4]{right:0}.z-10[data-v-1e8489a4]{z-index:10}.z-20[data-v-1e8489a4]{z-index:20}.grid[data-v-1e8489a4]{display:grid}.mb-16[data-v-1e8489a4]{margin-bottom:4rem}.mb-8[data-v-1e8489a4]{margin-bottom:2rem}.max-w-520px[data-v-1e8489a4]{max-width:520px}.min-h-screen[data-v-1e8489a4]{min-height:100vh}.w-full[data-v-1e8489a4]{width:100%}.flex[data-v-1e8489a4]{display:flex}.cursor-pointer[data-v-1e8489a4]{cursor:pointer}.place-content-center[data-v-1e8489a4]{place-content:center}.items-center[data-v-1e8489a4]{align-items:center}.justify-center[data-v-1e8489a4]{justify-content:center}.overflow-hidden[data-v-1e8489a4]{overflow:hidden}.bg-white[data-v-1e8489a4]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-4[data-v-1e8489a4]{padding-left:1rem;padding-right:1rem}.px-8[data-v-1e8489a4]{padding-left:2rem;padding-right:2rem}.py-2[data-v-1e8489a4]{padding-bottom:.5rem;padding-top:.5rem}.text-center[data-v-1e8489a4]{text-align:center}.text-8xl[data-v-1e8489a4]{font-size:6rem;line-height:1}.text-xl[data-v-1e8489a4]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-1e8489a4]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-1e8489a4]{font-weight:300}.font-medium[data-v-1e8489a4]{font-weight:500}.leading-tight[data-v-1e8489a4]{line-height:1.25}.font-sans[data-v-1e8489a4]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-1e8489a4]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-1e8489a4]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-1e8489a4]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-1e8489a4]{padding-left:0;padding-right:0}.sm\:px-6[data-v-1e8489a4]{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3[data-v-1e8489a4]{padding-bottom:.75rem;padding-top:.75rem}.sm\:text-4xl[data-v-1e8489a4]{font-size:2.25rem;line-height:2.5rem}.sm\:text-xl[data-v-1e8489a4]{font-size:1.25rem;line-height:1.75rem}}
@@ -0,0 +1 @@
1
+ .spotlight[data-v-3e7659a1]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);filter:blur(20vh)}.fixed[data-v-3e7659a1]{position:fixed}.-bottom-1\/2[data-v-3e7659a1]{bottom:-50%}.left-0[data-v-3e7659a1]{left:0}.right-0[data-v-3e7659a1]{right:0}.grid[data-v-3e7659a1]{display:grid}.mb-16[data-v-3e7659a1]{margin-bottom:4rem}.mb-8[data-v-3e7659a1]{margin-bottom:2rem}.h-1\/2[data-v-3e7659a1]{height:50%}.max-w-520px[data-v-3e7659a1]{max-width:520px}.min-h-screen[data-v-3e7659a1]{min-height:100vh}.place-content-center[data-v-3e7659a1]{place-content:center}.overflow-hidden[data-v-3e7659a1]{overflow:hidden}.bg-white[data-v-3e7659a1]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-8[data-v-3e7659a1]{padding-left:2rem;padding-right:2rem}.text-center[data-v-3e7659a1]{text-align:center}.text-8xl[data-v-3e7659a1]{font-size:6rem;line-height:1}.text-xl[data-v-3e7659a1]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-3e7659a1]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-3e7659a1]{font-weight:300}.font-medium[data-v-3e7659a1]{font-weight:500}.leading-tight[data-v-3e7659a1]{line-height:1.25}.font-sans[data-v-3e7659a1]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-3e7659a1]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-3e7659a1]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-3e7659a1]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-3e7659a1]{padding-left:0;padding-right:0}.sm\:text-4xl[data-v-3e7659a1]{font-size:2.25rem;line-height:2.5rem}}
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html><html data-capo=""><head><meta charset="utf-8">
2
2
  <meta name="viewport" content="width=device-width, initial-scale=1">
3
3
  <link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.DtsycVcr.css">
4
- <link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DkfuXiRx.js">
4
+ <link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DW2-WTuf.js">
5
5
  <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BS9sT-GQ.js">
6
6
  <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/C6doOGgB.js">
7
7
  <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/pCnzZaOt.js">
@@ -267,9 +267,9 @@
267
267
  <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BLmvGqlk.js">
268
268
  <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BYelj_cE.js">
269
269
  <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B6E6ObS_.js">
270
- <link rel="prefetch" as="style" href="/__nuxt-og-image/_nuxt/error-404.D2eZnIkK.css">
271
- <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CxK4ekaG.js">
272
- <link rel="prefetch" as="style" href="/__nuxt-og-image/_nuxt/error-500.BJ-KsTwR.css">
273
- <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CFTaR7kf.js">
274
- <script type="module" src="/__nuxt-og-image/_nuxt/DkfuXiRx.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"serverRendered":1},false]</script>
275
- <script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"c0255dff-4096-412a-b1f2-8c73ec29c527",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script></body></html>
270
+ <link rel="prefetch" as="style" href="/__nuxt-og-image/_nuxt/error-404.BOFYfCaH.css">
271
+ <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DE1lnDnt.js">
272
+ <link rel="prefetch" as="style" href="/__nuxt-og-image/_nuxt/error-500.WFhhfaOj.css">
273
+ <link rel="prefetch" as="script" crossorigin href="/__nuxt-og-image/_nuxt/7waJbMbQ.js">
274
+ <script type="module" src="/__nuxt-og-image/_nuxt/DW2-WTuf.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"serverRendered":1},false]</script>
275
+ <script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"f7ac4397-9cc2-4170-a44e-5e843b399997",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script></body></html>
package/dist/module.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "bridge": false
6
6
  },
7
7
  "configKey": "ogImage",
8
- "version": "3.0.0-rc.69",
8
+ "version": "3.0.1",
9
9
  "builder": {
10
10
  "@nuxt/module-builder": "0.8.4",
11
11
  "unbuild": "2.0.0"
package/dist/module.mjs CHANGED
@@ -400,11 +400,7 @@ const TreeShakeComposablesPlugin = createUnplugin(() => {
400
400
  },
401
401
  transform(code, id) {
402
402
  const s = new MagicString(code);
403
- if (id.endsWith("components.islands.mjs")) {
404
- for (const match of code.matchAll(/"OgImage.*": defineAsyncComponent\(.*\),?/g)) {
405
- s.overwrite(match.index, match.index + match[0].length, "");
406
- }
407
- } else {
403
+ if (id.endsWith("components.islands.mjs")) ; else {
408
404
  const strippedCode = stripLiteral(code);
409
405
  if (!COMPOSABLE_RE.test(code)) {
410
406
  return;
@@ -9,6 +9,7 @@ import { normalizeKey } from "unstorage";
9
9
  import { separateProps, useOgImageRuntimeConfig } from "../../shared.js";
10
10
  import { decodeObjectHtmlEntities } from "../util/encoding.js";
11
11
  import { createNitroRouteRuleMatcher } from "../util/kit.js";
12
+ import { normaliseOptions } from "../util/options.js";
12
13
  import { useChromiumRenderer, useSatoriRenderer } from "./instances.js";
13
14
  export function resolvePathCacheKey(e, path) {
14
15
  const siteConfig = e.context.siteConfig.get();
@@ -99,7 +100,7 @@ export async function resolveContext(e) {
99
100
  publicStoragePath: runtimeConfig.publicStoragePath,
100
101
  extension,
101
102
  basePath,
102
- options,
103
+ options: normaliseOptions(options),
103
104
  _nitro: useNitroApp()
104
105
  };
105
106
  await ctx._nitro.hooks.callHook("nuxt-og-image:context", ctx);
@@ -156,7 +157,22 @@ async function fetchPathHtmlAndExtractOptions(e, path, key) {
156
157
  return cachedHtmlPayload.value;
157
158
  let html;
158
159
  try {
159
- html = await e.$fetch(path);
160
+ html = await e.$fetch(path, {
161
+ // follow redirects
162
+ redirect: "follow",
163
+ headers: {
164
+ accept: "text/html"
165
+ }
166
+ });
167
+ if (typeof html !== "string" || !html.includes("<html>")) {
168
+ html = await globalThis.$fetch(path, {
169
+ // follow redirects
170
+ redirect: "follow",
171
+ headers: {
172
+ accept: "text/html"
173
+ }
174
+ });
175
+ }
160
176
  } catch (err) {
161
177
  return createError({
162
178
  statusCode: 500,
@@ -11,17 +11,42 @@ const BLOCK_ELEMENTS = [
11
11
  "table",
12
12
  "dl"
13
13
  ];
14
+ const INLINE_ELEMENTS = [
15
+ "span",
16
+ "a",
17
+ "b",
18
+ "i",
19
+ "u",
20
+ "em",
21
+ "strong",
22
+ "code",
23
+ "abbr",
24
+ "del",
25
+ "ins",
26
+ "mark",
27
+ "sub",
28
+ "sup",
29
+ "small",
30
+ "p",
31
+ "h1",
32
+ "h2",
33
+ "h3",
34
+ "h4",
35
+ "h5"
36
+ ];
14
37
  export default defineSatoriTransformer({
15
- filter: (node) => node.type === "div" && (Array.isArray(node.props?.children) && node.props?.children.length >= 1) && !node.props?.class?.includes("hidden"),
38
+ filter: (node) => [...INLINE_ELEMENTS, "div"].includes(node.type) && (Array.isArray(node.props?.children) && node.props?.children.length >= 1) && !node.props?.class?.includes("hidden"),
16
39
  transform: (node) => {
17
40
  node.props.style = node.props.style || {};
18
41
  if (node.props.style?.display && node.props.style?.display !== "flex") {
19
42
  return;
20
43
  }
21
- node.props.style.display = "flex";
22
- if (!node.props?.class?.includes("flex-") && node.props.children.some((child) => BLOCK_ELEMENTS.includes(child.type))) {
23
- node.props.style.flexDirection = "column";
24
- return;
44
+ if (node.type === "div") {
45
+ node.props.style.display = "flex";
46
+ if (!node.props?.class?.includes("flex-") && node.props.children.some((child) => BLOCK_ELEMENTS.includes(child.type))) {
47
+ node.props.style.flexDirection = "column";
48
+ return;
49
+ }
25
50
  }
26
51
  let flexWrap = node.props?.class?.includes("flex-wrap");
27
52
  if (!node.props?.class?.includes("flex-")) {
@@ -17,7 +17,19 @@ export default defineSatoriTransformer({
17
17
  const parsedToken = await uno.parseToken(token);
18
18
  if (parsedToken) {
19
19
  const inlineStyles = parsedToken[0][2].split(";").filter((s) => !!s?.trim());
20
- const vars = {};
20
+ const vars = {
21
+ "--color-gray-50": "249 250 251",
22
+ "--color-gray-100": "243 244 246",
23
+ "--color-gray-200": "229 231 235",
24
+ "--color-gray-300": "209 213 219",
25
+ "--color-gray-400": "156 163 175",
26
+ "--color-gray-500": "107 114 128",
27
+ "--color-gray-600": "75 85 99",
28
+ "--color-gray-700": "55 65 81",
29
+ "--color-gray-800": "31 41 55",
30
+ "--color-gray-900": "17 24 39",
31
+ "--color-gray-950": "3 7 18"
32
+ };
21
33
  inlineStyles.filter((s) => s.startsWith("--")).forEach((s) => {
22
34
  const [key, value] = s.split(":");
23
35
  vars[key] = value;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-og-image",
3
3
  "type": "module",
4
- "version": "3.0.0",
4
+ "version": "3.0.2",
5
5
  "description": "Enlightened OG Image generation for Nuxt.",
6
6
  "author": {
7
7
  "website": "https://harlanzw.com",
@@ -66,7 +66,7 @@
66
66
  "yoga-wasm-web": "^0.3.3"
67
67
  },
68
68
  "devDependencies": {
69
- "@antfu/eslint-config": "^3.5.1",
69
+ "@antfu/eslint-config": "^3.6.0",
70
70
  "@css-inline/css-inline": "^0.14.1",
71
71
  "@headlessui/vue": "^1.7.23",
72
72
  "@iconify-json/carbon": "^1.2.1",
@@ -101,7 +101,7 @@
101
101
  "sharp": "^0.33.5",
102
102
  "typescript": "^5.6.2",
103
103
  "unocss": "^0.62.3",
104
- "vitest": "^2.0.5"
104
+ "vitest": "^2.1.0"
105
105
  },
106
106
  "resolutions": {
107
107
  "vue": "3.5.4",
@@ -131,6 +131,7 @@
131
131
  "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground && nuxi prepare client",
132
132
  "release": "pnpm build && bumpp && pnpm -r publish --no-git-checks",
133
133
  "typecheck": "tsc --noEmit",
134
- "test": "vitest integration/endpoints"
134
+ "test": "HAS_CHROME=true vitest",
135
+ "test:no-chrome": "vitest"
135
136
  }
136
137
  }
@@ -1 +0,0 @@
1
- {"id":"c0255dff-4096-412a-b1f2-8c73ec29c527","timestamp":1726070625217,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}
@@ -1 +0,0 @@
1
- .spotlight[data-v-e8999add]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);bottom:-30vh;filter:blur(20vh);height:40vh}.gradient-border[data-v-e8999add]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:.5rem;position:relative}@media (prefers-color-scheme:light){.gradient-border[data-v-e8999add]{background-color:#ffffff4d}.gradient-border[data-v-e8999add]:before{background:linear-gradient(90deg,#e2e2e2,#e2e2e2 25%,#00dc82,#36e4da 75%,#0047e1)}}@media (prefers-color-scheme:dark){.gradient-border[data-v-e8999add]{background-color:#1414144d}.gradient-border[data-v-e8999add]:before{background:linear-gradient(90deg,#303030,#303030 25%,#00dc82,#36e4da 75%,#0047e1)}}.gradient-border[data-v-e8999add]:before{background-size:400% auto;border-radius:.5rem;bottom:0;content:"";left:0;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.5;padding:2px;position:absolute;right:0;top:0;transition:background-position .3s ease-in-out,opacity .2s ease-in-out;width:100%}.gradient-border[data-v-e8999add]:hover:before{background-position:-50% 0;opacity:1}.fixed[data-v-e8999add]{position:fixed}.left-0[data-v-e8999add]{left:0}.right-0[data-v-e8999add]{right:0}.z-10[data-v-e8999add]{z-index:10}.z-20[data-v-e8999add]{z-index:20}.grid[data-v-e8999add]{display:grid}.mb-16[data-v-e8999add]{margin-bottom:4rem}.mb-8[data-v-e8999add]{margin-bottom:2rem}.max-w-520px[data-v-e8999add]{max-width:520px}.min-h-screen[data-v-e8999add]{min-height:100vh}.w-full[data-v-e8999add]{width:100%}.flex[data-v-e8999add]{display:flex}.cursor-pointer[data-v-e8999add]{cursor:pointer}.place-content-center[data-v-e8999add]{place-content:center}.items-center[data-v-e8999add]{align-items:center}.justify-center[data-v-e8999add]{justify-content:center}.overflow-hidden[data-v-e8999add]{overflow:hidden}.bg-white[data-v-e8999add]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-4[data-v-e8999add]{padding-left:1rem;padding-right:1rem}.px-8[data-v-e8999add]{padding-left:2rem;padding-right:2rem}.py-2[data-v-e8999add]{padding-bottom:.5rem;padding-top:.5rem}.text-center[data-v-e8999add]{text-align:center}.text-8xl[data-v-e8999add]{font-size:6rem;line-height:1}.text-xl[data-v-e8999add]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-e8999add]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-e8999add]{font-weight:300}.font-medium[data-v-e8999add]{font-weight:500}.leading-tight[data-v-e8999add]{line-height:1.25}.font-sans[data-v-e8999add]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-e8999add]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-e8999add]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-e8999add]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-e8999add]{padding-left:0;padding-right:0}.sm\:px-6[data-v-e8999add]{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3[data-v-e8999add]{padding-bottom:.75rem;padding-top:.75rem}.sm\:text-4xl[data-v-e8999add]{font-size:2.25rem;line-height:2.5rem}.sm\:text-xl[data-v-e8999add]{font-size:1.25rem;line-height:1.75rem}}
@@ -1 +0,0 @@
1
- .spotlight[data-v-ab5e1a72]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);filter:blur(20vh)}.fixed[data-v-ab5e1a72]{position:fixed}.-bottom-1\/2[data-v-ab5e1a72]{bottom:-50%}.left-0[data-v-ab5e1a72]{left:0}.right-0[data-v-ab5e1a72]{right:0}.grid[data-v-ab5e1a72]{display:grid}.mb-16[data-v-ab5e1a72]{margin-bottom:4rem}.mb-8[data-v-ab5e1a72]{margin-bottom:2rem}.h-1\/2[data-v-ab5e1a72]{height:50%}.max-w-520px[data-v-ab5e1a72]{max-width:520px}.min-h-screen[data-v-ab5e1a72]{min-height:100vh}.place-content-center[data-v-ab5e1a72]{place-content:center}.overflow-hidden[data-v-ab5e1a72]{overflow:hidden}.bg-white[data-v-ab5e1a72]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-8[data-v-ab5e1a72]{padding-left:2rem;padding-right:2rem}.text-center[data-v-ab5e1a72]{text-align:center}.text-8xl[data-v-ab5e1a72]{font-size:6rem;line-height:1}.text-xl[data-v-ab5e1a72]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-ab5e1a72]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-ab5e1a72]{font-weight:300}.font-medium[data-v-ab5e1a72]{font-weight:500}.leading-tight[data-v-ab5e1a72]{line-height:1.25}.font-sans[data-v-ab5e1a72]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-ab5e1a72]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-ab5e1a72]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-ab5e1a72]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-ab5e1a72]{padding-left:0;padding-right:0}.sm\:text-4xl[data-v-ab5e1a72]{font-size:2.25rem;line-height:2.5rem}}