nuxt-convex-module 0.0.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +40 -200
  3. package/dist/chunks/index.mjs +1 -1
  4. package/dist/devtools-client/200.html +1 -1
  5. package/dist/devtools-client/404.html +1 -1
  6. package/dist/devtools-client/_nuxt/{CgIEvOQU.js → 71bSMC-_.js} +1 -1
  7. package/dist/devtools-client/_nuxt/{C2KGYsR4.js → BhmjAr2Q.js} +1 -1
  8. package/dist/devtools-client/_nuxt/{D2ksFYuU.js → C6YdTgGl.js} +2 -2
  9. package/dist/devtools-client/_nuxt/{CtxksWnu.js → _Lf3mfPR.js} +1 -1
  10. package/dist/devtools-client/_nuxt/builds/latest.json +1 -1
  11. package/dist/devtools-client/_nuxt/builds/meta/7dfea6da-3eca-4a35-ba06-5e069ac7e8df.json +1 -0
  12. package/dist/devtools-client/_nuxt/error-404.CLlwiMp-.css +1 -0
  13. package/dist/devtools-client/_nuxt/error-500.Bxr6fpDU.css +1 -0
  14. package/dist/devtools-client/_nuxt/queries.DNBUjWk2.css +1 -0
  15. package/dist/devtools-client/auth/index.html +1 -1
  16. package/dist/devtools-client/index.html +1 -1
  17. package/dist/devtools-client/logs/index.html +1 -1
  18. package/dist/devtools-client/queries/index.html +1 -1
  19. package/dist/module.d.mts +29 -105
  20. package/dist/module.json +2 -2
  21. package/dist/module.mjs +329 -221
  22. package/dist/runtime/auth0/vue/index.d.ts +3 -3
  23. package/dist/runtime/better-auth/nuxt/middleware.d.ts +0 -6
  24. package/dist/runtime/better-auth/nuxt/middleware.js +4 -5
  25. package/dist/runtime/better-auth/nuxt/proxy.d.ts +18 -2
  26. package/dist/runtime/better-auth/nuxt/proxy.js +7 -7
  27. package/dist/runtime/better-auth/nuxt/server.d.ts +6 -6
  28. package/dist/runtime/better-auth/vue/auth-boundary.d.ts +1 -0
  29. package/dist/runtime/better-auth/vue/cross-domain.js +7 -2
  30. package/dist/runtime/better-auth/vue/hydration.d.ts +1 -1
  31. package/dist/runtime/better-auth/vue/index.d.ts +1 -1
  32. package/dist/runtime/better-auth/vue/index.js +1 -1
  33. package/dist/runtime/better-auth/vue/plugin.client.d.ts +1 -5
  34. package/dist/runtime/better-auth/vue/plugin.client.js +6 -10
  35. package/dist/runtime/better-auth/vue/plugin.server.d.ts +5 -16
  36. package/dist/runtime/better-auth/vue/plugin.server.js +3 -6
  37. package/dist/runtime/better-auth/vue/redirect.d.ts +2 -14
  38. package/dist/runtime/better-auth/vue/{use-auth.d.ts → use-better-auth.d.ts} +31 -11
  39. package/dist/runtime/better-auth/vue/{use-auth.js → use-better-auth.js} +2 -2
  40. package/dist/runtime/clerk/vue/index.d.ts +4 -4
  41. package/dist/runtime/nuxt/app.d.ts +48 -0
  42. package/dist/runtime/nuxt/app.js +8 -0
  43. package/dist/runtime/nuxt/composables/use-async-paginated-query.d.ts +88 -0
  44. package/dist/runtime/nuxt/composables/use-async-paginated-query.js +90 -0
  45. package/dist/runtime/nuxt/composables/use-async-query.d.ts +7 -16
  46. package/dist/runtime/nuxt/composables/use-async-query.js +14 -9
  47. package/dist/runtime/nuxt/config.d.ts +11 -0
  48. package/dist/runtime/nuxt/config.js +1 -0
  49. package/dist/runtime/nuxt/index.d.ts +2 -5
  50. package/dist/runtime/polar/vue/components.d.ts +8 -1
  51. package/dist/runtime/polar/vue/components.js +2 -2
  52. package/dist/runtime/vue/auth/index.d.ts +4 -4
  53. package/dist/runtime/vue/client.d.ts +5 -57
  54. package/dist/runtime/vue/client.js +2 -0
  55. package/dist/runtime/vue/components/convex-image.d.ts +50 -0
  56. package/dist/runtime/vue/components/convex-image.js +21 -0
  57. package/dist/runtime/vue/composables/use-connection-state.d.ts +1 -0
  58. package/dist/runtime/vue/composables/use-paginated-query.d.ts +5 -1
  59. package/dist/runtime/vue/composables/use-paginated-query.js +2 -2
  60. package/dist/runtime/vue/composables/use-query.d.ts +2 -0
  61. package/dist/runtime/vue/composables/use-subscription.d.ts +1 -15
  62. package/dist/runtime/vue/composables/use-upload-queue.d.ts +2 -3
  63. package/dist/runtime/vue/hydration.d.ts +3 -24
  64. package/dist/runtime/vue/index.d.ts +2 -2
  65. package/dist/runtime/vue/index.js +1 -0
  66. package/dist/runtime/vue/plugin.js +1 -1
  67. package/dist/runtime/vue/provide.d.ts +5 -5
  68. package/dist/types.d.mts +2 -2
  69. package/package.json +52 -16
  70. package/dist/devtools-client/_nuxt/builds/meta/23303226-2230-4d14-87ce-87b0f562de6c.json +0 -1
  71. package/dist/devtools-client/_nuxt/error-404.BpRUKU69.css +0 -1
  72. package/dist/devtools-client/_nuxt/error-500.DuDYJ5TI.css +0 -1
  73. package/dist/devtools-client/_nuxt/queries.BmISPDaV.css +0 -1
@@ -14,10 +14,10 @@ export type Preloaded<Query extends FunctionReference<'query'>> = {
14
14
  };
15
15
  /**
16
16
  * Load a reactive query within a Vue component using a `Preloaded` payload
17
- * from the server returned by {@link preloadQuery}.
17
+ * from the server returned by {@link server!preloadQuery | preloadQuery}.
18
18
  *
19
- * This Vue composable contains internal state that will cause a rerender
20
- * whenever the query result changes.
19
+ * This Vue composable returns a computed that updates whenever the query
20
+ * result changes.
21
21
  *
22
22
  * Throws an error if no Convex client has been provided (see {@link useConvex}).
23
23
  *
@@ -43,24 +43,3 @@ export type Preloaded<Query extends FunctionReference<'query'>> = {
43
43
  * @public
44
44
  */
45
45
  export declare function usePreloadedQuery<Query extends FunctionReference<'query'>>(preloadedQuery: MaybeRefOrGetter<Preloaded<Query>>): ComputedRef<Query['_returnType']>;
46
- /**
47
- * Derive the query reference and reactive args/fallback from a (possibly
48
- * reactive) `Preloaded` payload. All three are reactive: swapping in a payload
49
- * for a different query re-derives the reference, matching upstream's
50
- * `usePreloadedQuery`, which recomputes `makeFunctionReference(_name)` on
51
- * every render.
52
- *
53
- * @internal
54
- */
55
- export declare function usePreloadedPayload<Query extends FunctionReference<'query'>>(preloadedQuery: MaybeRefOrGetter<Preloaded<Query>>): {
56
- query: ComputedRef<Query>;
57
- args: ComputedRef<Query['_args']>;
58
- preloadedResult: ComputedRef<Query['_returnType']>;
59
- };
60
- /**
61
- * A `useQuery` variant whose query *reference* is reactive alongside its args.
62
- * Pass `'skip'` args to pause the subscription.
63
- *
64
- * @internal
65
- */
66
- export declare function useReactiveQuery<Query extends FunctionReference<'query'>>(query: ComputedRef<Query>, args: ComputedRef<Query['_args'] | 'skip'>): ComputedRef<Query['_returnType'] | undefined>;
@@ -69,7 +69,6 @@ export type { AuthTokenFetcher } from 'convex/browser';
69
69
  export * from './auth/helpers.js';
70
70
  export * from './auth/index.js';
71
71
  export { usePreloadedQuery, type Preloaded } from './hydration.js';
72
- export { useSubscription } from './composables/use-subscription.js';
73
72
  export { type VueMutation } from './composables/use-mutation.js';
74
73
  export { type VueAction } from './composables/use-action.js';
75
74
  export { type Watch, type WatchQueryOptions, type MutationOptions, type ConvexVueClientOptions, } from './client.js';
@@ -89,6 +88,7 @@ export type { ConnectionState, OptimisticUpdate, QueryJournal, } from 'convex/br
89
88
  export type { FunctionReference, FunctionArgs, FunctionReturnType, OptionalRestArgs, ArgsAndOptions, } from 'convex/server';
90
89
  export type { Value } from 'convex/values';
91
90
  export { useUpload, useConvexUpload, uploadFile, type VueUpload, type UseUploadOptions, type UploadFileOptions, type GenerateUploadUrl, type StorageId, } from './composables/use-upload.js';
92
- export { useUploadQueue, useConvexUploadQueue, type VueUploadQueue, type UseUploadQueueOptions, type UploadQueueItem, type UploadItemStatus, } from './composables/use-upload-queue.js';
91
+ export { useUploadQueue, useConvexUploadQueue, type VueUploadQueue, type UseUploadQueueOptions, type UploadQueueItem, type UploadItemStatus, type EnqueueInput, } from './composables/use-upload-queue.js';
93
92
  export { useStorageUrl, useConvexStorageUrl, type GetStorageUrl, } from './composables/use-storage-url.js';
93
+ export { ConvexImage } from './components/convex-image.js';
94
94
  export { provideConvexApi, useConvexApi, useConvexNamespace, ConvexApiKey, type ConvexApi, } from './provide.js';
@@ -34,6 +34,7 @@ export {
34
34
  useStorageUrl,
35
35
  useConvexStorageUrl
36
36
  } from "./composables/use-storage-url.js";
37
+ export { ConvexImage } from "./components/convex-image.js";
37
38
  export {
38
39
  provideConvexApi,
39
40
  useConvexApi,
@@ -6,7 +6,7 @@ export default defineNuxtPlugin({
6
6
  const url = useRuntimeConfig().public.convex.url;
7
7
  if (!url) {
8
8
  if (import.meta.client) {
9
- console.warn("[nuxt-convex-module] No Convex URL configured; client not created.");
9
+ console.warn("[nuxt-convex-module] No Convex deployment URL configured \u2014 client not created. Set NUXT_PUBLIC_CONVEX_URL or `convex.url` in nuxt.config.");
10
10
  }
11
11
  return;
12
12
  }
@@ -9,8 +9,8 @@ export type ConvexApi = Record<string, Record<string, unknown>>;
9
9
  export declare const ConvexApiKey: InjectionKey<ConvexApi>;
10
10
  /**
11
11
  * Make the generated Convex `api` available to every `nuxt-convex-module` composable
12
- * and component, so `useBilling()`, `<CheckoutLink>`, `useEmailStatus()`, … work
13
- * with zero arguments.
12
+ * and component, so `<CheckoutLink>`, `<CustomerPortalLink>`, `useConvexNamespace()`,
13
+ * … work with zero arguments.
14
14
  *
15
15
  * The packaged Nuxt plugin calls this automatically with `#convex/api`. Call it
16
16
  * yourself (e.g. with a custom `api`) only to override that default — pass the
@@ -30,9 +30,9 @@ export declare function provideConvexApi(api: ConvexApi, app?: App): void;
30
30
  */
31
31
  export declare function useConvexApi(): ConvexApi | undefined;
32
32
  /**
33
- * The named function group from the generated `api` (e.g. `'billing'`,
34
- * `'email'`), or `undefined` when billing/email isn't scaffolded — letting the
35
- * feature degrade to a graceful no-op rather than throwing.
33
+ * The named function group from the generated `api` (e.g. `'polar'`), or
34
+ * `undefined` when that group isn't scaffolded — letting the feature degrade
35
+ * to a graceful no-op rather than throwing.
36
36
  *
37
37
  * @typeParam T - The expected shape of the namespace's function references.
38
38
  */
package/dist/types.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- export { type convexTypeFallbackContents, default, type formatStartupSummary, type getConvexAliases, type resolveDeploymentUrls, type resolveIntegrationState, type validateModuleOptions } from './module.mjs'
1
+ export { default } from './module.mjs'
2
2
 
3
- export { type BetterAuthModuleOptions, type IntegrationFlags, type ModuleOptionDiagnostics, type ModuleOptions } from './module.mjs'
3
+ export { type BetterAuthModuleOptions, type ModuleOptions } from './module.mjs'
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "nuxt-convex-module",
4
- "version": "0.0.1",
5
- "description": "The Convex module for Nuxt — reactive live queries, mutations, actions, cursor pagination, file storage, connection state and SSR, on a complete Vue client that also runs without Nuxt, with opt-in Better Auth and Polar",
4
+ "version": "0.9.0",
5
+ "description": "Connects a Nuxt app to a Convex backend: live queries, mutations, actions, pagination, file storage and SSR, auto-imported and typed against your deployment. The same Vue client runs without Nuxt; Better Auth, Clerk, Auth0 and Polar are opt-in.",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/qruto/nuxt-convex-module.git"
9
9
  },
10
10
  "license": "MIT",
11
11
  "author": "Slava Razum <razum@qruto.to>",
12
- "homepage": "https://github.com/qruto/nuxt-convex-module#readme",
12
+ "homepage": "https://nuxt-convex-module.dev",
13
13
  "bugs": {
14
14
  "url": "https://github.com/qruto/nuxt-convex-module/issues"
15
15
  },
@@ -19,13 +19,22 @@
19
19
  },
20
20
  "keywords": [
21
21
  "nuxt",
22
+ "convex",
22
23
  "nuxt-module",
23
24
  "vue",
24
- "convex",
25
+ "realtime",
26
+ "live-queries",
27
+ "backend",
28
+ "database",
29
+ "ssr",
30
+ "file-storage",
31
+ "auth",
32
+ "authentication",
25
33
  "better-auth",
34
+ "clerk",
35
+ "auth0",
26
36
  "polar",
27
- "realtime",
28
- "ssr"
37
+ "billing"
29
38
  ],
30
39
  "type": "module",
31
40
  "exports": {
@@ -46,10 +55,18 @@
46
55
  "types": "./dist/runtime/nuxt/index.d.ts",
47
56
  "import": "./dist/runtime/nuxt/index.js"
48
57
  },
58
+ "./app": {
59
+ "types": "./dist/runtime/nuxt/app.d.ts",
60
+ "import": "./dist/runtime/nuxt/app.js"
61
+ },
49
62
  "./better-auth/client": {
50
63
  "types": "./dist/runtime/better-auth/vue/index.d.ts",
51
64
  "import": "./dist/runtime/better-auth/vue/index.js"
52
65
  },
66
+ "./better-auth/vue": {
67
+ "types": "./dist/runtime/better-auth/vue/index.d.ts",
68
+ "import": "./dist/runtime/better-auth/vue/index.js"
69
+ },
53
70
  "./better-auth/server": {
54
71
  "types": "./dist/runtime/better-auth/nuxt/server.d.ts",
55
72
  "import": "./dist/runtime/better-auth/nuxt/server.js"
@@ -94,9 +111,15 @@
94
111
  "server": [
95
112
  "./dist/runtime/nuxt/index.d.ts"
96
113
  ],
114
+ "app": [
115
+ "./dist/runtime/nuxt/app.d.ts"
116
+ ],
97
117
  "better-auth/client": [
98
118
  "./dist/runtime/better-auth/vue/index.d.ts"
99
119
  ],
120
+ "better-auth/vue": [
121
+ "./dist/runtime/better-auth/vue/index.d.ts"
122
+ ],
100
123
  "better-auth/server": [
101
124
  "./dist/runtime/better-auth/nuxt/server.d.ts"
102
125
  ],
@@ -124,8 +147,7 @@
124
147
  "dist"
125
148
  ],
126
149
  "engines": {
127
- "node": ">=24.11.0",
128
- "pnpm": ">=11.6.0"
150
+ "node": ">=24.11.0"
129
151
  },
130
152
  "dependencies": {
131
153
  "@nuxt/devtools-kit": "^3.4.2",
@@ -136,8 +158,8 @@
136
158
  "peerDependencies": {
137
159
  "@auth0/auth0-vue": ">=2.0.0",
138
160
  "@clerk/vue": ">=2.0.0",
139
- "@convex-dev/better-auth": ">=0.12.0",
140
- "@convex-dev/polar": ">=0.9.0",
161
+ "@convex-dev/better-auth": ">=0.12.0 <0.13.0",
162
+ "@convex-dev/polar": ">=0.9.0 <0.10.0",
141
163
  "@polar-sh/checkout": ">=0.4.0",
142
164
  "better-auth": "~1.6.11",
143
165
  "convex": "^1.40.0",
@@ -170,7 +192,7 @@
170
192
  "devDependencies": {
171
193
  "@arethetypeswrong/cli": "^0.18.5",
172
194
  "@auth0/auth0-vue": "^2.9.0",
173
- "@clerk/vue": "2.5.0",
195
+ "@clerk/vue": "2.5.1",
174
196
  "@commitlint/cli": "^21.2.2",
175
197
  "@commitlint/config-conventional": "^21.2.2",
176
198
  "@convex-dev/better-auth": "^0.12.5",
@@ -182,21 +204,22 @@
182
204
  "@nuxt/schema": "^4.5.2",
183
205
  "@nuxt/test-utils": "^4.3.2",
184
206
  "@polar-sh/checkout": "^0.4.1",
185
- "@types/node": "^26.5.0",
207
+ "@types/node": "^26.5.1",
186
208
  "@types/ws": "^8.18.1",
187
209
  "@unhead/vue": "^3.4.0",
188
210
  "@vitest/coverage-v8": "^5.0.0",
189
211
  "@vue/test-utils": "^2.5.0",
190
- "better-auth": "~1.6.30",
212
+ "better-auth": "~1.6.31",
191
213
  "changelogen": "^0.6.2",
192
214
  "convex": "^1.45.0",
193
215
  "eslint": "^10.10.0",
194
- "fallow": "3.23.0",
195
- "happy-dom": "^20.14.0",
216
+ "fallow": "3.25.0",
217
+ "happy-dom": "^20.14.5",
196
218
  "installed-check": "^11.0.0",
197
219
  "nuxt": "^4.5.2",
198
220
  "nuxt-security": "^2.6.0",
199
221
  "pkg-pr-new": "^0.0.88",
222
+ "playwright-core": "^1.63.0",
200
223
  "portless": "0.15.6",
201
224
  "publint": "^0.3.24",
202
225
  "taze": "^21.1.0",
@@ -211,6 +234,17 @@
211
234
  "publishConfig": {
212
235
  "access": "public"
213
236
  },
237
+ "changelog": {
238
+ "scopeMap": {
239
+ "better-auth": "Better Auth",
240
+ "ci": "CI",
241
+ "deps": "Dependencies",
242
+ "deps-dev": "Dev dependencies",
243
+ "devtools": "DevTools",
244
+ "dx": "DX",
245
+ "github": "GitHub"
246
+ }
247
+ },
214
248
  "scripts": {
215
249
  "build": "nuxt-module-build build && pnpm run build:devtools-client",
216
250
  "build:devtools-client": "nuxt generate devtools-client-app",
@@ -230,8 +264,10 @@
230
264
  "test:types:lib": "pnpm run dev:prepare:lib && pnpm run typecheck",
231
265
  "test:unit": "vitest --project unit --run",
232
266
  "test:nuxt": "vitest --project nuxt --run",
267
+ "test:module": "vitest --project module --run",
268
+ "test:docs": "vitest --project docs --run",
233
269
  "test:e2e": "vitest --run --project e2e",
234
- "test:quality": "fallow",
270
+ "test:quality": "fallow --fail-on-issues",
235
271
  "test:security": "fallow security --fail-on-issues",
236
272
  "docs:api": "typedoc && node scripts/typedoc-postprocess.mjs",
237
273
  "docs:api:check": "pnpm run docs:api && git diff --exit-code -- website/content/4.api-reference",
@@ -1 +0,0 @@
1
- {"id":"23303226-2230-4d14-87ce-87b0f562de6c","timestamp":1789163683324,"prerendered":[]}
@@ -1 +0,0 @@
1
- .grid[data-v-bc32d885]{display:grid}.mb-2[data-v-bc32d885]{margin-bottom:.5rem}.mb-4[data-v-bc32d885]{margin-bottom:1rem}.max-w-520px[data-v-bc32d885]{max-width:520px}.min-h-screen[data-v-bc32d885]{min-height:100vh}.w-full[data-v-bc32d885]{width:100%}.flex[data-v-bc32d885]{display:flex}.place-content-center[data-v-bc32d885]{place-content:center}.items-center[data-v-bc32d885]{align-items:center}.justify-center[data-v-bc32d885]{justify-content:center}.overflow-hidden[data-v-bc32d885]{overflow:hidden}.bg-white[data-v-bc32d885]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-bc32d885]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-bc32d885]{text-align:center}.text-\[80px\][data-v-bc32d885]{font-size:80px}.text-2xl[data-v-bc32d885]{font-size:1.5rem;line-height:2rem}.text-sm[data-v-bc32d885]{font-size:.875rem;line-height:1.25rem}.text-\[\#020420\][data-v-bc32d885]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\[\#64748B\][data-v-bc32d885]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.hover\:text-\[\#00DC82\][data-v-bc32d885]:hover{--un-text-opacity:1;color:rgb(0 220 130/var(--un-text-opacity))}.font-medium[data-v-bc32d885]{font-weight:500}.font-semibold[data-v-bc32d885]{font-weight:600}.leading-none[data-v-bc32d885]{line-height:1}.tracking-wide[data-v-bc32d885]{letter-spacing:.025em}.font-sans[data-v-bc32d885]{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-bc32d885]{--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-bc32d885]{text-decoration-line:underline}.underline-offset-3[data-v-bc32d885]{text-underline-offset:3px}.antialiased[data-v-bc32d885]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-\[\#020420\][data-v-bc32d885]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\:text-white[data-v-bc32d885]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (width>=640px){.sm\:text-\[110px\][data-v-bc32d885]{font-size:110px}.sm\:text-3xl[data-v-bc32d885]{font-size:1.875rem;line-height:2.25rem}}
@@ -1 +0,0 @@
1
- .grid[data-v-512e66c2]{display:grid}.mb-2[data-v-512e66c2]{margin-bottom:.5rem}.mb-4[data-v-512e66c2]{margin-bottom:1rem}.max-w-520px[data-v-512e66c2]{max-width:520px}.min-h-screen[data-v-512e66c2]{min-height:100vh}.place-content-center[data-v-512e66c2]{place-content:center}.overflow-hidden[data-v-512e66c2]{overflow:hidden}.bg-white[data-v-512e66c2]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-512e66c2]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-512e66c2]{text-align:center}.text-\[80px\][data-v-512e66c2]{font-size:80px}.text-2xl[data-v-512e66c2]{font-size:1.5rem;line-height:2rem}.text-\[\#020420\][data-v-512e66c2]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\[\#64748B\][data-v-512e66c2]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.font-semibold[data-v-512e66c2]{font-weight:600}.leading-none[data-v-512e66c2]{line-height:1}.tracking-wide[data-v-512e66c2]{letter-spacing:.025em}.font-sans[data-v-512e66c2]{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-512e66c2]{--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-512e66c2]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-\[\#020420\][data-v-512e66c2]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\:text-white[data-v-512e66c2]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (width>=640px){.sm\:text-\[110px\][data-v-512e66c2]{font-size:110px}.sm\:text-3xl[data-v-512e66c2]{font-size:1.875rem;line-height:2.25rem}}
@@ -1 +0,0 @@
1
- .n-code-block-lines code{counter-increment:step calc(var(--start,1) - 1);counter-reset:step}.n-code-block-lines code .line:before{content:counter(step);counter-increment:step;text-align:right;color:#a3a3a380;width:2.5rem;margin-right:.5rem;padding-right:.5rem;display:inline-block}details[data-v-c64ba2dc],summary[data-v-c64ba2dc]{border-style:none}summary[data-v-c64ba2dc]{list-style:none}details[open] summary[data-v-c64ba2dc]{border-style:none}details summary[data-v-c64ba2dc]::-webkit-details-marker{display:none}details[open] .chevron[data-v-c64ba2dc]{opacity:.75;transform:rotate(180deg)}