@nuxt/scripts 1.0.0-rc.7 → 1.0.0-rc.9

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 (34) hide show
  1. package/dist/devtools-client/200.html +1 -1
  2. package/dist/devtools-client/404.html +1 -1
  3. package/dist/devtools-client/_nuxt/{BDlZgWHO.js → B4uHpJPz.js} +1 -1
  4. package/dist/devtools-client/_nuxt/{BntLcF3H.js → BBS9G2Kb.js} +1 -1
  5. package/dist/devtools-client/_nuxt/{CC9d18RE.js → CQR4zIAm.js} +1 -1
  6. package/dist/devtools-client/_nuxt/{DJ5bfe9v.js → Cxq4HLPL.js} +1 -1
  7. package/dist/devtools-client/_nuxt/{CaQ1scfO.js → DCBsJT4N.js} +1 -1
  8. package/dist/devtools-client/_nuxt/{5D-5agUu.js → DTxy5P8N.js} +18 -18
  9. package/dist/devtools-client/_nuxt/{YKhzFESo.js → DvZScWzI.js} +1 -1
  10. package/dist/devtools-client/_nuxt/builds/latest.json +1 -1
  11. package/dist/devtools-client/_nuxt/builds/meta/bd58b869-1eb5-4c50-871c-707f9b71e8f9.json +1 -0
  12. package/dist/devtools-client/_nuxt/error-404.d44aGwWI.css +1 -0
  13. package/dist/devtools-client/_nuxt/error-500.NthMfIEt.css +1 -0
  14. package/dist/devtools-client/docs/index.html +1 -1
  15. package/dist/devtools-client/first-party/index.html +1 -1
  16. package/dist/devtools-client/index.html +1 -1
  17. package/dist/devtools-client/registry/index.html +1 -1
  18. package/dist/module.json +1 -1
  19. package/dist/runtime/registry/bing-uet.d.ts +184 -10
  20. package/dist/runtime/registry/bing-uet.js +3 -1
  21. package/dist/runtime/server/google-maps-geocode-proxy.js +1 -1
  22. package/dist/runtime/server/google-static-maps-proxy.js +1 -1
  23. package/dist/runtime/server/gravatar-proxy.js +1 -1
  24. package/dist/runtime/server/instagram-embed.d.ts +1 -16
  25. package/dist/runtime/server/instagram-embed.js +2 -114
  26. package/dist/runtime/server/proxy-handler.js +1 -2
  27. package/dist/runtime/server/utils/instagram-embed.d.ts +16 -0
  28. package/dist/runtime/server/utils/instagram-embed.js +152 -0
  29. package/dist/runtime/server/utils/withSigning.js +1 -1
  30. package/dist/types-source.mjs +56 -1
  31. package/package.json +2 -2
  32. package/dist/devtools-client/_nuxt/builds/meta/7a96fd5e-d239-4ba5-816b-05034a861ba0.json +0 -1
  33. package/dist/devtools-client/_nuxt/error-404.Dwj0Wlzm.css +0 -1
  34. package/dist/devtools-client/_nuxt/error-500.B4wHUYBa.css +0 -1
@@ -0,0 +1,152 @@
1
+ export const RSRC_RE = /url\(\/rsrc\.php([^)]+)\)/g;
2
+ export const AMP_RE = /&/g;
3
+ export const SCONTENT_RE = /https:\/\/scontent[^"'\s),]+\.cdninstagram\.com[^"'\s),]+/g;
4
+ export const STATIC_CDN_RE = /https:\/\/static\.cdninstagram\.com[^"'\s),]+/g;
5
+ export const LOOKASIDE_RE = /https:\/\/lookaside\.instagram\.com[^"'\s),]+/g;
6
+ export const INSTAGRAM_IMAGE_HOSTS = ["scontent.cdninstagram.com", "lookaside.instagram.com"];
7
+ export const INSTAGRAM_ASSET_HOST = "static.cdninstagram.com";
8
+ const CHARSET_RE = /@charset\s[^;]+;/gi;
9
+ const IMPORT_RE = /@import\s[^;]+;/gi;
10
+ const WHITESPACE_RE = /\s/;
11
+ const AT_RULE_NAME_RE = /@([\w-]+)/;
12
+ const MULTI_SPACE_RE = /\s+/g;
13
+ export function proxyImageUrl(url, prefix = "/_scripts") {
14
+ return `${prefix}/embed/instagram-image?url=${encodeURIComponent(url.replace(AMP_RE, "&"))}`;
15
+ }
16
+ export function proxyAssetUrl(url, prefix = "/_scripts") {
17
+ return `${prefix}/embed/instagram-asset?url=${encodeURIComponent(url.replace(AMP_RE, "&"))}`;
18
+ }
19
+ export function rewriteUrl(url, prefix = "/_scripts") {
20
+ try {
21
+ const parsed = new URL(url);
22
+ if (parsed.hostname === INSTAGRAM_ASSET_HOST)
23
+ return proxyAssetUrl(url, prefix);
24
+ if (INSTAGRAM_IMAGE_HOSTS.some((h) => parsed.hostname === h || parsed.hostname.endsWith(`.cdninstagram.com`)))
25
+ return proxyImageUrl(url, prefix);
26
+ } catch {
27
+ }
28
+ return url;
29
+ }
30
+ export function rewriteUrlsInText(text, prefix = "/_scripts") {
31
+ return text.replace(SCONTENT_RE, (m) => proxyImageUrl(m, prefix)).replace(STATIC_CDN_RE, (m) => proxyAssetUrl(m, prefix)).replace(LOOKASIDE_RE, (m) => proxyImageUrl(m, prefix));
32
+ }
33
+ export function scopeCss(css, scopeSelector) {
34
+ let result = css.replace(CHARSET_RE, "");
35
+ result = result.replace(IMPORT_RE, "");
36
+ return processRules(result, scopeSelector);
37
+ }
38
+ function processRules(css, scopeSelector) {
39
+ const output = [];
40
+ let i = 0;
41
+ while (i < css.length) {
42
+ while (i < css.length && WHITESPACE_RE.test(css[i])) i++;
43
+ if (i >= css.length)
44
+ break;
45
+ if (css[i] === "@") {
46
+ const atRule = extractAtRule(css, i);
47
+ if (atRule) {
48
+ const atName = atRule.content.match(AT_RULE_NAME_RE)?.[1]?.toLowerCase();
49
+ if (atName === "media" || atName === "supports" || atName === "layer") {
50
+ const braceStart = atRule.content.indexOf("{");
51
+ if (braceStart === -1) {
52
+ output.push(atRule.content);
53
+ } else {
54
+ const innerCss = atRule.content.slice(braceStart + 1, -1);
55
+ const scopedInner = processRules(innerCss, scopeSelector);
56
+ output.push(`${atRule.content.slice(0, braceStart + 1)}${scopedInner}}`);
57
+ }
58
+ } else if (atName === "keyframes" || atName === "-webkit-keyframes" || atName === "font-face") {
59
+ output.push(atRule.content);
60
+ }
61
+ i = atRule.end;
62
+ continue;
63
+ }
64
+ }
65
+ const bracePos = css.indexOf("{", i);
66
+ if (bracePos === -1)
67
+ break;
68
+ const selector = css.slice(i, bracePos).trim();
69
+ const block = extractBlock(css, bracePos);
70
+ if (!block)
71
+ break;
72
+ i = block.end;
73
+ if (!selector)
74
+ continue;
75
+ const selectors = splitTopLevel(selector, ",").map((s) => s.trim());
76
+ const filteredSelectors = selectors.filter((s) => {
77
+ const normalized = s.replace(MULTI_SPACE_RE, " ").trim().toLowerCase();
78
+ return normalized !== ":root" && normalized !== "html" && normalized !== "body" && !normalized.startsWith(":root ") && !normalized.startsWith("html ") && !normalized.startsWith("body ") && normalized !== "html, body";
79
+ });
80
+ if (filteredSelectors.length === 0)
81
+ continue;
82
+ const scopedSelectors = filteredSelectors.map((s) => `${scopeSelector} ${s}`);
83
+ output.push(`${scopedSelectors.join(", ")} ${block.content}`);
84
+ }
85
+ return output.join("\n");
86
+ }
87
+ function extractAtRule(css, start) {
88
+ const bracePos = css.indexOf("{", start);
89
+ const semiPos = css.indexOf(";", start);
90
+ if (semiPos !== -1 && (bracePos === -1 || semiPos < bracePos)) {
91
+ return { content: css.slice(start, semiPos + 1), end: semiPos + 1 };
92
+ }
93
+ if (bracePos === -1)
94
+ return null;
95
+ const block = extractBlock(css, bracePos);
96
+ if (!block)
97
+ return null;
98
+ return {
99
+ content: css.slice(start, bracePos) + block.content,
100
+ end: block.end
101
+ };
102
+ }
103
+ function splitTopLevel(input, separator) {
104
+ const parts = [];
105
+ let depth = 0;
106
+ let quote = null;
107
+ let start = 0;
108
+ for (let i = 0; i < input.length; i++) {
109
+ const ch = input[i];
110
+ if (quote) {
111
+ if (ch === "\\") {
112
+ i++;
113
+ continue;
114
+ }
115
+ if (ch === quote)
116
+ quote = null;
117
+ continue;
118
+ }
119
+ if (ch === '"' || ch === "'") {
120
+ quote = ch;
121
+ continue;
122
+ }
123
+ if (ch === "(" || ch === "[") {
124
+ depth++;
125
+ continue;
126
+ }
127
+ if (ch === ")" || ch === "]") {
128
+ depth--;
129
+ continue;
130
+ }
131
+ if (ch === separator && depth === 0) {
132
+ parts.push(input.slice(start, i));
133
+ start = i + 1;
134
+ }
135
+ }
136
+ parts.push(input.slice(start));
137
+ return parts;
138
+ }
139
+ function extractBlock(css, openBrace) {
140
+ let depth = 0;
141
+ for (let j = openBrace; j < css.length; j++) {
142
+ if (css[j] === "{") {
143
+ depth++;
144
+ } else if (css[j] === "}") {
145
+ depth--;
146
+ if (depth === 0) {
147
+ return { content: css.slice(openBrace, j + 1), end: j + 1 };
148
+ }
149
+ }
150
+ }
151
+ return null;
152
+ }
@@ -1,8 +1,8 @@
1
1
  import { createError, defineEventHandler } from "h3";
2
+ import { useRuntimeConfig } from "nitropack/runtime";
2
3
  import { verifyProxyRequest } from "./sign.js";
3
4
  export function withSigning(handler) {
4
5
  return defineEventHandler(async (event) => {
5
- const { useRuntimeConfig } = await import("#imports");
6
6
  const runtimeConfig = useRuntimeConfig(event);
7
7
  const secret = runtimeConfig["nuxt-scripts"]?.proxySecret;
8
8
  if (!secret)
@@ -5,10 +5,65 @@ const types = {
5
5
  kind: "const",
6
6
  code: "export const BingUetOptions = object({\n /**\n * Your Bing UET tag ID.\n * @see https://help.ads.microsoft.com/#apex/ads/en/56682/2-500\n */\n id: string(),\n /**\n * Enable automatic SPA page tracking.\n * @default true\n */\n enableAutoSpaTracking: optional(boolean()),\n})"
7
7
  },
8
+ {
9
+ name: "BingUetConsentStatus",
10
+ kind: "type",
11
+ code: "export type BingUetConsentStatus = 'granted' | 'denied'"
12
+ },
13
+ {
14
+ name: "BingUetConsentOptions",
15
+ kind: "interface",
16
+ code: "export interface BingUetConsentOptions {\n /**\n * Controls storage of advertising identifiers. Currently the only field UET honors.\n */\n ad_storage?: BingUetConsentStatus\n}"
17
+ },
18
+ {
19
+ name: "BingUetEventName",
20
+ kind: "type",
21
+ code: "export type BingUetEventName\n = | 'page_view'\n | 'screen_view'\n | 'login'\n | 'sign_up'\n | 'subscribe'\n | 'start_trial'\n | 'lead'\n | 'generate_lead'\n | 'submit_lead_form'\n | 'contact'\n | 'search'\n | 'view_search_results'\n | 'select_content'\n | 'share'\n | 'exception'\n | 'find_location'\n | 'book_appointment'\n | 'get_route'\n | 'view_item'\n | 'view_item_list'\n | 'view_promotion'\n | 'add_to_cart'\n | 'remove_from_cart'\n | 'add_to_wishlist'\n | 'add_payment_info'\n | 'begin_checkout'\n | 'checkout_progress'\n | 'set_checkout_option'\n | 'purchase'\n | 'refund'\n | (string & {})"
22
+ },
23
+ {
24
+ name: "BingUetItem",
25
+ kind: "interface",
26
+ code: "export interface BingUetItem {\n id?: string\n name?: string\n brand?: string\n category?: string\n variant?: string\n price?: number\n quantity?: number\n list_name?: string\n list_position?: number\n creative_name?: string\n creative_slot?: string\n location_id?: string\n [key: string]: any\n}"
27
+ },
28
+ {
29
+ name: "BingUetPromotion",
30
+ kind: "interface",
31
+ code: "export interface BingUetPromotion {\n id?: string\n name?: string\n creative_name?: string\n creative_slot?: string\n [key: string]: any\n}"
32
+ },
33
+ {
34
+ name: "BingUetEventParams",
35
+ kind: "interface",
36
+ code: "export interface BingUetEventParams {\n /** Event category (beacon shortcut). */\n ec?: string\n /** Event action (beacon shortcut). */\n ea?: string\n /** Event label (beacon shortcut). */\n el?: string\n /** Event value, numeric (beacon shortcut). */\n ev?: number\n /** Goal category / goal completion. */\n gc?: string\n /** Goal value. */\n gv?: number\n /** Long-form alias for `ec`. */\n event_category?: string\n /** Long-form alias for `ea`. */\n event_action?: string\n /** Long-form alias for `el`. */\n event_label?: string\n /** Long-form alias for `ev`. */\n event_value?: number\n /** Unique event identifier (dedup). */\n event_id?: string\n /** Variable revenue amount. */\n revenue_value?: number\n /** ISO 4217 currency code (e.g. \"USD\"). */\n currency?: string\n /** Unique order/transaction ID (dedup). */\n transaction_id?: string\n /** Ecommerce items. */\n items?: BingUetItem[]\n /** Promotions associated with the event. */\n promotions?: BingUetPromotion[]\n /** Sign-up/login method (e.g. \"Google\"). */\n method?: string\n coupon?: string\n tax?: number\n shipping?: number\n affiliation?: string\n /** Search query. */\n search_term?: string\n content_type?: string\n content_id?: string\n checkout_step?: number\n checkout_option?: string\n description?: string\n name?: string\n screen_name?: string\n /** Whether an exception is fatal. */\n fatal?: boolean\n /** Flags a new customer conversion. */\n new_customer?: boolean | number\n /** Retail vertical: product ID. */\n ecomm_prodid?: string | string[]\n /** Retail vertical: page type. */\n ecomm_pagetype?: 'home' | 'searchresults' | 'category' | 'product' | 'cart' | 'purchase' | 'other' | (string & {})\n ecomm_totalvalue?: number\n ecomm_category?: string | string[]\n ecomm_query?: string\n /** Override page path. */\n page_path?: string\n /** Override page title. */\n page_title?: string\n /** Override full page URL. */\n page_location?: string\n [key: string]: any\n}"
37
+ },
38
+ {
39
+ name: "BingUetEnhancedConversionsPid",
40
+ kind: "interface",
41
+ code: "export interface BingUetEnhancedConversionsPid {\n /** SHA-256 hashed email (lowercase, trimmed). Alias: `email`. */\n em?: string\n /** SHA-256 hashed phone (E.164 digits only). Alias: `phone_number`. */\n ph?: string\n /** Long-form alias for `em`. */\n email?: string\n /** Long-form alias for `ph`. */\n phone_number?: string\n [key: string]: any\n}"
42
+ },
43
+ {
44
+ name: "BingUetSetParams",
45
+ kind: "interface",
46
+ code: "export interface BingUetSetParams {\n /** Partner identifiers for enhanced conversions. */\n pid?: BingUetEnhancedConversionsPid\n page_path?: string\n page_title?: string\n page_location?: string\n [key: string]: any\n}"
47
+ },
48
+ {
49
+ name: "BingUetTcfConfig",
50
+ kind: "interface",
51
+ code: "export interface BingUetTcfConfig {\n /** Enable TCF v2.0 auto-consent handling (Microsoft vendorId 1126). */\n enabled?: boolean\n [key: string]: any\n}"
52
+ },
53
+ {
54
+ name: "BingUetConstructorOptions",
55
+ kind: "interface",
56
+ code: "export interface BingUetConstructorOptions {\n /** UET tag ID. */\n ti: string\n /** Alternate tag ID field (same effect as `ti`). */\n tagId?: string\n /** Auto-fire pageLoad on SPA route changes. */\n enableAutoSpaTracking?: boolean\n /** Enable TCF v2.0 auto-consent handling. */\n enableAutoConsent?: boolean\n /** Suppress automatic page_view on load. */\n disableAutoPageView?: boolean\n /** Disable the UET container entirely. */\n disableContainer?: boolean\n /** Disable writing the UET visitor ID cookie. */\n disableUetVid?: boolean\n /** Disable visibility (tab focus/blur) events. */\n disableVisibilityEvents?: boolean\n /** Defer loading the beacon. */\n deferLoad?: boolean\n /** Strip query strings from reported URLs. */\n removeQueryFromUrls?: boolean\n /** Store conversion tracking cookies. */\n storeConvTrackCookies?: boolean\n /** Cookie domain. */\n cookieDomain?: string\n /** Cookie flags (e.g. \"SameSite=None; Secure\"). */\n cookieFlags?: string\n /** Enable MS DNS cookie. */\n msDnsCookie?: boolean\n /** UID cookie name. */\n uidCookie?: string\n /** Error beacon verbosity level. */\n errorBeaconLevel?: number\n /** Microsoft Clarity project ID for integration. */\n clarityProjectId?: string\n /** When true, reads `window.enhanced_conversion_data` for gtag-style enhanced conversions. */\n gtagPid?: boolean\n /** Beacon protocol version. */\n Ver?: 1 | 2\n /** Associated advertiser ID. */\n advertiserId?: string\n /** Source tag for GTM integration. */\n gtmTagSource?: string\n /** Queue reference, typically `window.uetq`. */\n q?: any[]\n [key: string]: any\n}"
57
+ },
58
+ {
59
+ name: "BingUetQueue",
60
+ kind: "interface",
61
+ code: "export interface BingUetQueue {\n push: {\n // Legacy custom event object form (beacon shortcuts).\n (event: BingUetEventParams): void\n // Manual page load (maps internally to `page_view`).\n (command: 'pageLoad'): void\n // Standard and custom events.\n (command: 'event', eventName: BingUetEventName, eventParams?: BingUetEventParams): void\n // Consent mode (default on init, update after user interaction).\n (command: 'consent', action: 'default' | 'update', consentParams: BingUetConsentOptions): void\n // Enhanced conversions / sticky page overrides.\n (command: 'set', params: BingUetSetParams): void\n // TCF v2.0 auto-consent configuration.\n (command: 'config', target: 'tcf', params: BingUetTcfConfig): void\n }\n}"
62
+ },
8
63
  {
9
64
  name: "BingUetApi",
10
65
  kind: "interface",
11
- code: "export interface BingUetApi {\n uetq: {\n push: (event: string | Record<string, any>) => void\n }\n}"
66
+ code: "export interface BingUetApi {\n uetq: BingUetQueue\n}"
12
67
  }
13
68
  ],
14
69
  "bluesky-embed": [
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nuxt/scripts",
3
3
  "type": "module",
4
- "version": "1.0.0-rc.7",
4
+ "version": "1.0.0-rc.9",
5
5
  "description": "Load third-party scripts with better performance, privacy and DX in Nuxt Apps.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -112,7 +112,7 @@
112
112
  "magic-string": "^0.30.21",
113
113
  "ofetch": "^1.5.1",
114
114
  "ohash": "^2.0.11",
115
- "oxc-parser": "^0.124.0",
115
+ "oxc-parser": "^0.125.0",
116
116
  "oxc-walker": "^0.7.0",
117
117
  "pathe": "^2.0.3",
118
118
  "pkg-types": "^2.3.0",
@@ -1 +0,0 @@
1
- {"id":"7a96fd5e-d239-4ba5-816b-05034a861ba0","timestamp":1775877331028,"prerendered":[]}
@@ -1 +0,0 @@
1
- .grid[data-v-4b6f334a]{display:grid}.mb-2[data-v-4b6f334a]{margin-bottom:.5rem}.mb-4[data-v-4b6f334a]{margin-bottom:1rem}.max-w-520px[data-v-4b6f334a]{max-width:520px}.min-h-screen[data-v-4b6f334a]{min-height:100vh}.w-full[data-v-4b6f334a]{width:100%}.flex[data-v-4b6f334a]{display:flex}.place-content-center[data-v-4b6f334a]{place-content:center}.items-center[data-v-4b6f334a]{align-items:center}.justify-center[data-v-4b6f334a]{justify-content:center}.overflow-hidden[data-v-4b6f334a]{overflow:hidden}.bg-white[data-v-4b6f334a]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-4b6f334a]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-4b6f334a]{text-align:center}.text-\[80px\][data-v-4b6f334a]{font-size:80px}.text-2xl[data-v-4b6f334a]{font-size:1.5rem;line-height:2rem}.text-sm[data-v-4b6f334a]{font-size:.875rem;line-height:1.25rem}.text-\[\#020420\][data-v-4b6f334a]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\[\#64748B\][data-v-4b6f334a]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.hover\:text-\[\#00DC82\][data-v-4b6f334a]:hover{--un-text-opacity:1;color:rgb(0 220 130/var(--un-text-opacity))}.font-medium[data-v-4b6f334a]{font-weight:500}.font-semibold[data-v-4b6f334a]{font-weight:600}.leading-none[data-v-4b6f334a]{line-height:1}.tracking-wide[data-v-4b6f334a]{letter-spacing:.025em}.font-sans[data-v-4b6f334a]{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}.tabular-nums[data-v-4b6f334a]{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.underline[data-v-4b6f334a]{text-decoration-line:underline}.underline-offset-3[data-v-4b6f334a]{text-underline-offset:3px}.antialiased[data-v-4b6f334a]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\:bg-\[\#020420\][data-v-4b6f334a]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\:text-white[data-v-4b6f334a]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\:text-\[110px\][data-v-4b6f334a]{font-size:110px}.sm\:text-3xl[data-v-4b6f334a]{font-size:1.875rem;line-height:2.25rem}}
@@ -1 +0,0 @@
1
- .grid[data-v-3c69d55a]{display:grid}.mb-2[data-v-3c69d55a]{margin-bottom:.5rem}.mb-4[data-v-3c69d55a]{margin-bottom:1rem}.max-w-520px[data-v-3c69d55a]{max-width:520px}.min-h-screen[data-v-3c69d55a]{min-height:100vh}.place-content-center[data-v-3c69d55a]{place-content:center}.overflow-hidden[data-v-3c69d55a]{overflow:hidden}.bg-white[data-v-3c69d55a]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-3c69d55a]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-3c69d55a]{text-align:center}.text-\[80px\][data-v-3c69d55a]{font-size:80px}.text-2xl[data-v-3c69d55a]{font-size:1.5rem;line-height:2rem}.text-\[\#020420\][data-v-3c69d55a]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\[\#64748B\][data-v-3c69d55a]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.font-semibold[data-v-3c69d55a]{font-weight:600}.leading-none[data-v-3c69d55a]{line-height:1}.tracking-wide[data-v-3c69d55a]{letter-spacing:.025em}.font-sans[data-v-3c69d55a]{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}.tabular-nums[data-v-3c69d55a]{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.antialiased[data-v-3c69d55a]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\:bg-\[\#020420\][data-v-3c69d55a]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\:text-white[data-v-3c69d55a]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\:text-\[110px\][data-v-3c69d55a]{font-size:110px}.sm\:text-3xl[data-v-3c69d55a]{font-size:1.875rem;line-height:2.25rem}}