├── .env.example ├── .gitignore ├── README.md ├── TODO.md ├── actions ├── admin.ts ├── login.ts ├── logout.ts ├── new-password.ts ├── new-verification.ts ├── register.ts ├── reset.ts └── settings.ts ├── app ├── (docs) │ ├── docs │ │ ├── [[...slug]] │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ └── not-found.tsx │ └── layout.tsx ├── api │ ├── admin │ │ └── route.ts │ └── auth │ │ └── [...nextauth] │ │ └── route.ts ├── auth │ ├── error │ │ └── page.tsx │ ├── layout.tsx │ ├── login │ │ └── page.tsx │ ├── new-password │ │ └── page.tsx │ ├── new-verification │ │ └── page.tsx │ ├── register │ │ └── page.tsx │ └── reset │ │ └── page.tsx ├── favicon.ico ├── globals.css ├── layout.tsx └── page.tsx ├── auth.config.ts ├── auth.ts ├── components ├── auth │ ├── auth.tsx │ ├── logout-button.tsx │ └── user-button.tsx ├── callout.tsx ├── code-block-wrapper.tsx ├── command-menu.tsx ├── component-preview.tsx ├── component-source.tsx ├── component-wrapper.tsx ├── contribute.tsx ├── footer.tsx ├── landing-page │ ├── components.tsx │ ├── demo.tsx │ └── hero.tsx ├── main-nav.tsx ├── mdx-components.tsx ├── mobile-nav.tsx ├── pager.tsx ├── repo-download.tsx ├── sidebar-nav.tsx ├── site-header.tsx ├── tech-stack.tsx ├── template-preview.tsx ├── toc.tsx └── ui │ ├── accordion.tsx │ ├── alert.tsx │ ├── avatar.tsx │ ├── badge.tsx │ ├── border-beam.tsx │ ├── button-shiny.tsx │ ├── button.tsx │ ├── card.tsx │ ├── chart.tsx │ ├── checkbox.tsx │ ├── collapsible.tsx │ ├── command.tsx │ ├── copy-button.tsx │ ├── dialog.tsx │ ├── dropdown-menu.tsx │ ├── examples │ ├── auth-example.tsx │ ├── chart-example.tsx │ ├── payment-example.tsx │ └── product-example.tsx │ ├── form.tsx │ ├── hero-video-animation.tsx │ ├── hero-video-dialog.tsx │ ├── icons │ └── icons.tsx │ ├── input.tsx │ ├── label.tsx │ ├── number-ticker.tsx │ ├── radio-group.tsx │ ├── registry │ ├── registry-base-colors.ts │ └── registry-styles.ts │ ├── scroll-area.tsx │ ├── select.tsx │ ├── separator.tsx │ ├── sheet.tsx │ ├── table.tsx │ ├── tabs.tsx │ ├── theme │ ├── theme-provider.tsx │ └── theme-toggle.tsx │ ├── toast.tsx │ ├── tooltip.tsx │ └── tweet-card.tsx ├── config ├── docs.ts └── site.ts ├── content-collections.ts ├── content └── docs │ ├── cli.mdx │ ├── index.mdx │ └── installation.mdx ├── data ├── account.ts ├── password-reset-token.ts ├── two-factor-confirmation.ts ├── two-factor-token.ts ├── user.ts └── verification-token.ts ├── eslint.config.mjs ├── hooks ├── use-current-role.ts └── use-current-user.ts ├── lib ├── auth.ts ├── db.ts ├── events.ts ├── github.ts ├── mail.ts ├── rehype-component.ts ├── rehype-npm-command.ts ├── toc.ts ├── token.ts ├── use-config.ts ├── use-mounted.ts └── utils.ts ├── next-auth.d.ts ├── next.config.ts ├── package-lock.json ├── package.json ├── packages └── cli │ ├── dist │ ├── commands │ │ ├── add.js │ │ └── init.js │ ├── index.js │ ├── utils.js │ └── utils │ │ ├── add-component.js │ │ ├── handle-error.js │ │ ├── highlighter.js │ │ ├── init-setup.js │ │ ├── logger.js │ │ └── spinner.js │ └── node_modules │ ├── .bin │ ├── acorn │ ├── ts-node │ ├── ts-node-cwd │ ├── ts-node-esm │ ├── ts-node-script │ ├── ts-node-transpile-only │ ├── ts-script │ ├── tsc │ └── tsserver │ ├── .package-lock.json │ ├── @cspotcode │ └── source-map-support │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── browser-source-map-support.js │ │ ├── package.json │ │ ├── register-hook-require.d.ts │ │ ├── register-hook-require.js │ │ ├── register.d.ts │ │ ├── register.js │ │ ├── source-map-support.d.ts │ │ └── source-map-support.js │ ├── @jridgewell │ ├── resolve-uri │ │ ├── LICENSE │ │ ├── README.md │ │ ├── dist │ │ │ ├── resolve-uri.mjs │ │ │ ├── resolve-uri.mjs.map │ │ │ ├── resolve-uri.umd.js │ │ │ ├── resolve-uri.umd.js.map │ │ │ └── types │ │ │ │ └── resolve-uri.d.ts │ │ └── package.json │ ├── sourcemap-codec │ │ ├── LICENSE │ │ ├── README.md │ │ ├── dist │ │ │ ├── sourcemap-codec.mjs │ │ │ ├── sourcemap-codec.mjs.map │ │ │ ├── sourcemap-codec.umd.js │ │ │ ├── sourcemap-codec.umd.js.map │ │ │ └── types │ │ │ │ ├── scopes.d.ts │ │ │ │ ├── sourcemap-codec.d.ts │ │ │ │ ├── strings.d.ts │ │ │ │ └── vlq.d.ts │ │ └── package.json │ └── trace-mapping │ │ ├── LICENSE │ │ ├── README.md │ │ ├── dist │ │ ├── trace-mapping.mjs │ │ ├── trace-mapping.mjs.map │ │ ├── trace-mapping.umd.js │ │ ├── trace-mapping.umd.js.map │ │ └── types │ │ │ ├── any-map.d.ts │ │ │ ├── binary-search.d.ts │ │ │ ├── by-source.d.ts │ │ │ ├── resolve.d.ts │ │ │ ├── sort.d.ts │ │ │ ├── sourcemap-segment.d.ts │ │ │ ├── strip-filename.d.ts │ │ │ ├── trace-mapping.d.ts │ │ │ └── types.d.ts │ │ └── package.json │ ├── @tsconfig │ ├── node10 │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ └── tsconfig.json │ ├── node12 │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ └── tsconfig.json │ ├── node14 │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ └── tsconfig.json │ └── node16 │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ └── tsconfig.json │ ├── @types │ └── node │ │ ├── LICENSE │ │ ├── README.md │ │ ├── assert.d.ts │ │ ├── assert │ │ └── strict.d.ts │ │ ├── async_hooks.d.ts │ │ ├── buffer.buffer.d.ts │ │ ├── buffer.d.ts │ │ ├── child_process.d.ts │ │ ├── cluster.d.ts │ │ ├── compatibility │ │ ├── disposable.d.ts │ │ ├── index.d.ts │ │ ├── indexable.d.ts │ │ └── iterators.d.ts │ │ ├── console.d.ts │ │ ├── constants.d.ts │ │ ├── crypto.d.ts │ │ ├── dgram.d.ts │ │ ├── diagnostics_channel.d.ts │ │ ├── dns.d.ts │ │ ├── dns │ │ └── promises.d.ts │ │ ├── dom-events.d.ts │ │ ├── domain.d.ts │ │ ├── events.d.ts │ │ ├── fs.d.ts │ │ ├── fs │ │ └── promises.d.ts │ │ ├── globals.d.ts │ │ ├── globals.typedarray.d.ts │ │ ├── http.d.ts │ │ ├── http2.d.ts │ │ ├── https.d.ts │ │ ├── index.d.ts │ │ ├── inspector.d.ts │ │ ├── module.d.ts │ │ ├── net.d.ts │ │ ├── os.d.ts │ │ ├── package.json │ │ ├── path.d.ts │ │ ├── perf_hooks.d.ts │ │ ├── process.d.ts │ │ ├── punycode.d.ts │ │ ├── querystring.d.ts │ │ ├── readline.d.ts │ │ ├── readline │ │ └── promises.d.ts │ │ ├── repl.d.ts │ │ ├── sea.d.ts │ │ ├── stream.d.ts │ │ ├── stream │ │ ├── consumers.d.ts │ │ ├── promises.d.ts │ │ └── web.d.ts │ │ ├── string_decoder.d.ts │ │ ├── test.d.ts │ │ ├── timers.d.ts │ │ ├── timers │ │ └── promises.d.ts │ │ ├── tls.d.ts │ │ ├── trace_events.d.ts │ │ ├── ts5.6 │ │ ├── buffer.buffer.d.ts │ │ ├── globals.typedarray.d.ts │ │ └── index.d.ts │ │ ├── tty.d.ts │ │ ├── url.d.ts │ │ ├── util.d.ts │ │ ├── v8.d.ts │ │ ├── vm.d.ts │ │ ├── wasi.d.ts │ │ ├── worker_threads.d.ts │ │ └── zlib.d.ts │ ├── acorn-walk │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── dist │ │ ├── walk.d.mts │ │ ├── walk.d.ts │ │ ├── walk.js │ │ └── walk.mjs │ └── package.json │ ├── acorn │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── bin │ │ └── acorn │ ├── dist │ │ ├── acorn.d.mts │ │ ├── acorn.d.ts │ │ ├── acorn.js │ │ ├── acorn.mjs │ │ └── bin.js │ └── package.json │ ├── ansi-styles │ ├── index.d.ts │ ├── index.js │ ├── license │ ├── package.json │ └── readme.md │ ├── arg │ ├── LICENSE.md │ ├── README.md │ ├── index.d.ts │ ├── index.js │ └── package.json │ ├── chalk │ ├── index.d.ts │ ├── license │ ├── package.json │ ├── readme.md │ └── source │ │ ├── index.js │ │ ├── templates.js │ │ └── util.js │ ├── color-convert │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── conversions.js │ ├── index.js │ ├── package.json │ └── route.js │ ├── color-name │ ├── LICENSE │ ├── README.md │ ├── index.js │ └── package.json │ ├── commander │ ├── LICENSE │ ├── Readme.md │ ├── esm.mjs │ ├── index.js │ ├── lib │ │ ├── argument.js │ │ ├── command.js │ │ ├── error.js │ │ ├── help.js │ │ ├── option.js │ │ └── suggestSimilar.js │ ├── package-support.json │ ├── package.json │ └── typings │ │ ├── esm.d.mts │ │ └── index.d.ts │ ├── create-require │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── create-require.d.ts │ ├── create-require.js │ └── package.json │ ├── diff │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── dist │ │ ├── diff.js │ │ └── diff.min.js │ ├── lib │ │ ├── convert │ │ │ ├── dmp.js │ │ │ └── xml.js │ │ ├── diff │ │ │ ├── array.js │ │ │ ├── base.js │ │ │ ├── character.js │ │ │ ├── css.js │ │ │ ├── json.js │ │ │ ├── line.js │ │ │ ├── sentence.js │ │ │ └── word.js │ │ ├── index.es6.js │ │ ├── index.js │ │ ├── patch │ │ │ ├── apply.js │ │ │ ├── create.js │ │ │ ├── merge.js │ │ │ └── parse.js │ │ └── util │ │ │ ├── array.js │ │ │ ├── distance-iterator.js │ │ │ └── params.js │ ├── package.json │ ├── release-notes.md │ └── runtime.js │ ├── has-flag │ ├── index.d.ts │ ├── index.js │ ├── license │ ├── package.json │ └── readme.md │ ├── make-error │ ├── LICENSE │ ├── README.md │ ├── dist │ │ └── make-error.js │ ├── index.d.ts │ ├── index.js │ └── package.json │ ├── nanospinner │ ├── LICENSE │ ├── README.md │ ├── dist │ │ ├── consts.d.ts │ │ ├── consts.js │ │ ├── index.d.ts │ │ └── index.js │ └── package.json │ ├── picocolors │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── picocolors.browser.js │ ├── picocolors.d.ts │ ├── picocolors.js │ └── types.d.ts │ ├── supports-color │ ├── browser.js │ ├── index.js │ ├── license │ ├── package.json │ └── readme.md │ ├── ts-node │ ├── LICENSE │ ├── README.md │ ├── child-loader.mjs │ ├── dist-raw │ │ ├── NODE-LICENSE.md │ │ ├── README.md │ │ ├── node-internal-constants.js │ │ ├── node-internal-errors.js │ │ ├── node-internal-modules-cjs-helpers.js │ │ ├── node-internal-modules-cjs-loader.js │ │ ├── node-internal-modules-esm-get_format.js │ │ ├── node-internal-modules-esm-resolve.js │ │ ├── node-internal-modules-package_json_reader.js │ │ ├── node-internal-repl-await.js │ │ ├── node-internalBinding-fs.js │ │ ├── node-nativemodule.js │ │ ├── node-options.js │ │ ├── node-primordials.js │ │ └── runmain-hack.js │ ├── dist │ │ ├── bin-cwd.d.ts │ │ ├── bin-cwd.js │ │ ├── bin-cwd.js.map │ │ ├── bin-esm.d.ts │ │ ├── bin-esm.js │ │ ├── bin-esm.js.map │ │ ├── bin-script-deprecated.d.ts │ │ ├── bin-script-deprecated.js │ │ ├── bin-script-deprecated.js.map │ │ ├── bin-script.d.ts │ │ ├── bin-script.js │ │ ├── bin-script.js.map │ │ ├── bin-transpile.d.ts │ │ ├── bin-transpile.js │ │ ├── bin-transpile.js.map │ │ ├── bin.d.ts │ │ ├── bin.js │ │ ├── bin.js.map │ │ ├── child │ │ │ ├── argv-payload.d.ts │ │ │ ├── argv-payload.js │ │ │ ├── argv-payload.js.map │ │ │ ├── child-entrypoint.d.ts │ │ │ ├── child-entrypoint.js │ │ │ ├── child-entrypoint.js.map │ │ │ ├── child-loader.d.ts │ │ │ ├── child-loader.js │ │ │ ├── child-loader.js.map │ │ │ ├── child-require.d.ts │ │ │ ├── child-require.js │ │ │ ├── child-require.js.map │ │ │ ├── spawn-child.d.ts │ │ │ ├── spawn-child.js │ │ │ └── spawn-child.js.map │ │ ├── cjs-resolve-hooks.d.ts │ │ ├── cjs-resolve-hooks.js │ │ ├── cjs-resolve-hooks.js.map │ │ ├── configuration.d.ts │ │ ├── configuration.js │ │ ├── configuration.js.map │ │ ├── esm.d.ts │ │ ├── esm.js │ │ ├── esm.js.map │ │ ├── file-extensions.d.ts │ │ ├── file-extensions.js │ │ ├── file-extensions.js.map │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.js.map │ │ ├── module-type-classifier.d.ts │ │ ├── module-type-classifier.js │ │ ├── module-type-classifier.js.map │ │ ├── node-module-type-classifier.d.ts │ │ ├── node-module-type-classifier.js │ │ ├── node-module-type-classifier.js.map │ │ ├── repl.d.ts │ │ ├── repl.js │ │ ├── repl.js.map │ │ ├── resolver-functions.d.ts │ │ ├── resolver-functions.js │ │ ├── resolver-functions.js.map │ │ ├── transpilers │ │ │ ├── swc.d.ts │ │ │ ├── swc.js │ │ │ ├── swc.js.map │ │ │ ├── types.d.ts │ │ │ ├── types.js │ │ │ └── types.js.map │ │ ├── ts-compiler-types.d.ts │ │ ├── ts-compiler-types.js │ │ ├── ts-compiler-types.js.map │ │ ├── ts-internals.d.ts │ │ ├── ts-internals.js │ │ ├── ts-internals.js.map │ │ ├── ts-transpile-module.d.ts │ │ ├── ts-transpile-module.js │ │ ├── ts-transpile-module.js.map │ │ ├── tsconfig-schema.d.ts │ │ ├── tsconfig-schema.js │ │ ├── tsconfig-schema.js.map │ │ ├── tsconfigs.d.ts │ │ ├── tsconfigs.js │ │ ├── tsconfigs.js.map │ │ ├── util.d.ts │ │ ├── util.js │ │ └── util.js.map │ ├── esm.mjs │ ├── esm │ │ └── transpile-only.mjs │ ├── node10 │ │ └── tsconfig.json │ ├── node12 │ │ └── tsconfig.json │ ├── node14 │ │ └── tsconfig.json │ ├── node16 │ │ └── tsconfig.json │ ├── package.json │ ├── register │ │ ├── files.js │ │ ├── index.js │ │ ├── transpile-only.js │ │ └── type-check.js │ ├── transpilers │ │ ├── swc-experimental.js │ │ └── swc.js │ ├── tsconfig.schema.json │ └── tsconfig.schemastore-schema.json │ ├── typescript │ ├── LICENSE.txt │ ├── README.md │ ├── SECURITY.md │ ├── ThirdPartyNoticeText.txt │ ├── bin │ │ ├── tsc │ │ └── tsserver │ ├── lib │ │ ├── _tsc.js │ │ ├── _tsserver.js │ │ ├── _typingsInstaller.js │ │ ├── cancellationToken.js │ │ ├── cs │ │ │ └── diagnosticMessages.generated.json │ │ ├── de │ │ │ └── diagnosticMessages.generated.json │ │ ├── es │ │ │ └── diagnosticMessages.generated.json │ │ ├── fr │ │ │ └── diagnosticMessages.generated.json │ │ ├── it │ │ │ └── diagnosticMessages.generated.json │ │ ├── ja │ │ │ └── diagnosticMessages.generated.json │ │ ├── ko │ │ │ └── diagnosticMessages.generated.json │ │ ├── lib.d.ts │ │ ├── lib.decorators.d.ts │ │ ├── lib.decorators.legacy.d.ts │ │ ├── lib.dom.asynciterable.d.ts │ │ ├── lib.dom.d.ts │ │ ├── lib.dom.iterable.d.ts │ │ ├── lib.es2015.collection.d.ts │ │ ├── lib.es2015.core.d.ts │ │ ├── lib.es2015.d.ts │ │ ├── lib.es2015.generator.d.ts │ │ ├── lib.es2015.iterable.d.ts │ │ ├── lib.es2015.promise.d.ts │ │ ├── lib.es2015.proxy.d.ts │ │ ├── lib.es2015.reflect.d.ts │ │ ├── lib.es2015.symbol.d.ts │ │ ├── lib.es2015.symbol.wellknown.d.ts │ │ ├── lib.es2016.array.include.d.ts │ │ ├── lib.es2016.d.ts │ │ ├── lib.es2016.full.d.ts │ │ ├── lib.es2016.intl.d.ts │ │ ├── lib.es2017.arraybuffer.d.ts │ │ ├── lib.es2017.d.ts │ │ ├── lib.es2017.date.d.ts │ │ ├── lib.es2017.full.d.ts │ │ ├── lib.es2017.intl.d.ts │ │ ├── lib.es2017.object.d.ts │ │ ├── lib.es2017.sharedmemory.d.ts │ │ ├── lib.es2017.string.d.ts │ │ ├── lib.es2017.typedarrays.d.ts │ │ ├── lib.es2018.asyncgenerator.d.ts │ │ ├── lib.es2018.asynciterable.d.ts │ │ ├── lib.es2018.d.ts │ │ ├── lib.es2018.full.d.ts │ │ ├── lib.es2018.intl.d.ts │ │ ├── lib.es2018.promise.d.ts │ │ ├── lib.es2018.regexp.d.ts │ │ ├── lib.es2019.array.d.ts │ │ ├── lib.es2019.d.ts │ │ ├── lib.es2019.full.d.ts │ │ ├── lib.es2019.intl.d.ts │ │ ├── lib.es2019.object.d.ts │ │ ├── lib.es2019.string.d.ts │ │ ├── lib.es2019.symbol.d.ts │ │ ├── lib.es2020.bigint.d.ts │ │ ├── lib.es2020.d.ts │ │ ├── lib.es2020.date.d.ts │ │ ├── lib.es2020.full.d.ts │ │ ├── lib.es2020.intl.d.ts │ │ ├── lib.es2020.number.d.ts │ │ ├── lib.es2020.promise.d.ts │ │ ├── lib.es2020.sharedmemory.d.ts │ │ ├── lib.es2020.string.d.ts │ │ ├── lib.es2020.symbol.wellknown.d.ts │ │ ├── lib.es2021.d.ts │ │ ├── lib.es2021.full.d.ts │ │ ├── lib.es2021.intl.d.ts │ │ ├── lib.es2021.promise.d.ts │ │ ├── lib.es2021.string.d.ts │ │ ├── lib.es2021.weakref.d.ts │ │ ├── lib.es2022.array.d.ts │ │ ├── lib.es2022.d.ts │ │ ├── lib.es2022.error.d.ts │ │ ├── lib.es2022.full.d.ts │ │ ├── lib.es2022.intl.d.ts │ │ ├── lib.es2022.object.d.ts │ │ ├── lib.es2022.regexp.d.ts │ │ ├── lib.es2022.string.d.ts │ │ ├── lib.es2023.array.d.ts │ │ ├── lib.es2023.collection.d.ts │ │ ├── lib.es2023.d.ts │ │ ├── lib.es2023.full.d.ts │ │ ├── lib.es2023.intl.d.ts │ │ ├── lib.es2024.arraybuffer.d.ts │ │ ├── lib.es2024.collection.d.ts │ │ ├── lib.es2024.d.ts │ │ ├── lib.es2024.full.d.ts │ │ ├── lib.es2024.object.d.ts │ │ ├── lib.es2024.promise.d.ts │ │ ├── lib.es2024.regexp.d.ts │ │ ├── lib.es2024.sharedmemory.d.ts │ │ ├── lib.es2024.string.d.ts │ │ ├── lib.es5.d.ts │ │ ├── lib.es6.d.ts │ │ ├── lib.esnext.array.d.ts │ │ ├── lib.esnext.collection.d.ts │ │ ├── lib.esnext.d.ts │ │ ├── lib.esnext.decorators.d.ts │ │ ├── lib.esnext.disposable.d.ts │ │ ├── lib.esnext.full.d.ts │ │ ├── lib.esnext.intl.d.ts │ │ ├── lib.esnext.iterator.d.ts │ │ ├── lib.scripthost.d.ts │ │ ├── lib.webworker.asynciterable.d.ts │ │ ├── lib.webworker.d.ts │ │ ├── lib.webworker.importscripts.d.ts │ │ ├── lib.webworker.iterable.d.ts │ │ ├── pl │ │ │ └── diagnosticMessages.generated.json │ │ ├── pt-br │ │ │ └── diagnosticMessages.generated.json │ │ ├── ru │ │ │ └── diagnosticMessages.generated.json │ │ ├── tr │ │ │ └── diagnosticMessages.generated.json │ │ ├── tsc.js │ │ ├── tsserver.js │ │ ├── tsserverlibrary.d.ts │ │ ├── tsserverlibrary.js │ │ ├── typesMap.json │ │ ├── typescript.d.ts │ │ ├── typescript.js │ │ ├── typingsInstaller.js │ │ ├── watchGuard.js │ │ ├── zh-cn │ │ │ └── diagnosticMessages.generated.json │ │ └── zh-tw │ │ │ └── diagnosticMessages.generated.json │ └── package.json │ ├── undici-types │ ├── LICENSE │ ├── README.md │ ├── agent.d.ts │ ├── api.d.ts │ ├── balanced-pool.d.ts │ ├── cache.d.ts │ ├── client.d.ts │ ├── connector.d.ts │ ├── content-type.d.ts │ ├── cookies.d.ts │ ├── diagnostics-channel.d.ts │ ├── dispatcher.d.ts │ ├── env-http-proxy-agent.d.ts │ ├── errors.d.ts │ ├── eventsource.d.ts │ ├── fetch.d.ts │ ├── file.d.ts │ ├── filereader.d.ts │ ├── formdata.d.ts │ ├── global-dispatcher.d.ts │ ├── global-origin.d.ts │ ├── handlers.d.ts │ ├── header.d.ts │ ├── index.d.ts │ ├── interceptors.d.ts │ ├── mock-agent.d.ts │ ├── mock-client.d.ts │ ├── mock-errors.d.ts │ ├── mock-interceptor.d.ts │ ├── mock-pool.d.ts │ ├── package.json │ ├── patch.d.ts │ ├── pool-stats.d.ts │ ├── pool.d.ts │ ├── proxy-agent.d.ts │ ├── readable.d.ts │ ├── retry-agent.d.ts │ ├── retry-handler.d.ts │ ├── util.d.ts │ ├── webidl.d.ts │ └── websocket.d.ts │ ├── v8-compile-cache-lib │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── v8-compile-cache.d.ts │ └── v8-compile-cache.js │ └── yn │ ├── index.d.ts │ ├── index.js │ ├── lenient.js │ ├── license │ ├── package.json │ └── readme.md ├── postcss.config.mjs ├── prisma └── schema.prisma ├── public ├── file.svg ├── globe.svg ├── logos │ ├── auth.svg │ ├── nextjs.svg │ ├── recharts.svg │ ├── resend.svg │ ├── stripe.svg │ └── supabase.svg ├── next.svg ├── vercel.svg └── window.svg ├── routes.ts ├── schemas └── index.ts ├── styles └── mdx.css ├── tailwind.config.ts ├── tsconfig.json ├── tsconfig.scripts.json └── types ├── index.d.ts └── unist.ts /.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_APP_URL= 2 | 3 | STRIPE_SECRET_KEY= 4 | 5 | DATABASE_URL="" 6 | 7 | NEXTAUTH_SECRET="" 8 | 9 | GITHUB_ID="" 10 | GITHUB_SECRET="" 11 | 12 | GOOGLE_ID="" 13 | GOOGLE_SECRET="" 14 | 15 | NEXT_PUBLIC_POSTHOG_KEY= 16 | NEXT_PUBLIC_POSTHOG_HOST= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env* 2 | !.env.example 3 | 4 | # dependencies 5 | /node_modules 6 | /.pnp 7 | .pnp.* 8 | .yarn/* 9 | !.yarn/patches 10 | !.yarn/plugins 11 | !.yarn/releases 12 | !.yarn/versions 13 | 14 | # testing 15 | /coverage 16 | 17 | # next.js 18 | /.next/ 19 | /out/ 20 | 21 | # production 22 | /build 23 | 24 | # misc 25 | .DS_Store 26 | *.pem 27 | 28 | # debug 29 | npm-debug.log* 30 | yarn-debug.log* 31 | yarn-error.log* 32 | .pnpm-debug.log* 33 | 34 | # vercel 35 | .vercel 36 | 37 | # typescript 38 | *.tsbuildinfo 39 | next-env.d.ts 40 | 41 | # misc 42 | __registry__/ 43 | .content-collections/ 44 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | # TODOs 2 | 3 | - decide design 4 | - write 1st version of docs 5 | - set up npm package 6 | - landing page 7 | 8 | - add at least 3 components before making a video about it: 9 | - auth 10 | - landing page 11 | - stripe 12 | 13 | auth implementation: 14 | - next auth 15 | - providers 16 | - email, password 17 | - google 18 | - auth wrapper 19 | - if the app is just initialized, save in index.tsx 20 | - otherwise log and inform the user you're saving them in another file 21 | 22 | landing page: 23 | - design it for our website and then use a very simple version to release -------------------------------------------------------------------------------- /actions/admin.ts: -------------------------------------------------------------------------------- 1 | "use server"; 2 | 3 | import { currentRole } from "@/lib/auth"; 4 | import { UserRole } from "@prisma/client"; 5 | 6 | export const admin = async () => { 7 | const role = await currentRole(); 8 | 9 | if (role === UserRole.ADMIN) { 10 | return { success: "Allowed Server Action!" }; 11 | } 12 | 13 | return { error: "Forbidden Server Action!" } 14 | }; -------------------------------------------------------------------------------- /actions/logout.ts: -------------------------------------------------------------------------------- 1 | "use server"; 2 | 3 | import { signOut } from "@/auth"; 4 | 5 | export const logout = async () => { 6 | await signOut(); 7 | }; -------------------------------------------------------------------------------- /actions/new-verification.ts: -------------------------------------------------------------------------------- 1 | "use server"; 2 | 3 | import { db } from "@/lib/db"; 4 | import { getUserByEmail } from "@/data/user"; 5 | import { getVerificationTokenByToken } from "../data/verification-token"; 6 | 7 | export const newVerification = async (token: string) => { 8 | const existingToken = await getVerificationTokenByToken(token); 9 | 10 | if (!existingToken) { 11 | return { error: "Token does not exist!" }; 12 | } 13 | 14 | const hasExpired = new Date(existingToken.expires) < new Date(); 15 | 16 | if (hasExpired) { 17 | return { error: "Token has expired!" }; 18 | } 19 | 20 | const existingUser = await getUserByEmail(existingToken.email); 21 | 22 | if (!existingUser) { 23 | return { error: "Email does not exist!" }; 24 | } 25 | 26 | await db.user.update({ 27 | where: { id: existingUser.id }, 28 | data: { 29 | emailVerified: new Date(), 30 | email: existingToken.email, 31 | } 32 | }); 33 | await db.verificationToken.delete({ 34 | where: { id: existingToken.id } 35 | }); 36 | 37 | return { success: "Email verified!" }; 38 | }; -------------------------------------------------------------------------------- /actions/reset.ts: -------------------------------------------------------------------------------- 1 | "use server"; 2 | 3 | import * as z from "zod"; 4 | 5 | import { ResetSchema } from "@/schemas"; 6 | import { getUserByEmail } from "@/data/user"; 7 | import { sendPasswordResetEmail } from "@/lib/mail"; 8 | import { generatePasswordResetToken } from "../lib/token"; 9 | 10 | export const reset = async (values: z.infer) => { 11 | const validatedFields = ResetSchema.safeParse(values); 12 | 13 | if (!validatedFields.success) { 14 | return { error: "Invalid emaiL!" }; 15 | } 16 | 17 | const { email } = validatedFields.data; 18 | 19 | const existingUser = await getUserByEmail(email); 20 | 21 | if (!existingUser) { 22 | return { error: "Email not found!" }; 23 | } 24 | 25 | const passwordResetToken = await generatePasswordResetToken(email); 26 | await sendPasswordResetEmail( 27 | passwordResetToken.email, 28 | passwordResetToken.token, 29 | ); 30 | 31 | return { success: "Reset email sent!" }; 32 | } -------------------------------------------------------------------------------- /app/(docs)/docs/layout.tsx: -------------------------------------------------------------------------------- 1 | import { docsConfig } from "@/config/docs"; 2 | import { ScrollArea } from "@/components/ui/scroll-area"; 3 | import { DocsSidebarNav } from "@/components/sidebar-nav"; 4 | 5 | interface DocsLayoutProps { 6 | children: React.ReactNode; 7 | } 8 | 9 | export default function DocsLayout({ children }: DocsLayoutProps) { 10 | return ( 11 |
12 | 17 | {children} 18 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /app/(docs)/layout.tsx: -------------------------------------------------------------------------------- 1 | interface DocsLayoutProps { 2 | children: React.ReactNode; 3 | } 4 | 5 | export default async function DocsLayout({ 6 | children, 7 | }: DocsLayoutProps) { 8 | return ( 9 | <> 10 |
{children}
11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /app/api/admin/route.ts: -------------------------------------------------------------------------------- 1 | import { currentRole } from "@/lib/auth"; 2 | import { UserRole } from "@prisma/client"; 3 | import { NextResponse } from "next/server"; 4 | 5 | export async function GET() { 6 | const role = await currentRole(); 7 | 8 | if (role === UserRole.ADMIN) { 9 | return new NextResponse(null, { status: 200 }); 10 | } 11 | 12 | return new NextResponse(null, { status: 403 }); 13 | } 14 | -------------------------------------------------------------------------------- /app/api/auth/[...nextauth]/route.ts: -------------------------------------------------------------------------------- 1 | export { GET, POST } from "@/auth"; -------------------------------------------------------------------------------- /app/auth/error/page.tsx: -------------------------------------------------------------------------------- 1 | import { ErrorCard } from '@/components/auth/error-card'; 2 | 3 | const AuthErrorPage = () => { 4 | return ; 5 | }; 6 | 7 | export default AuthErrorPage; 8 | -------------------------------------------------------------------------------- /app/auth/layout.tsx: -------------------------------------------------------------------------------- 1 | const AuthLayout = ({ children }: { children: React.ReactNode }) => { 2 | return ( 3 |
4 | {children} 5 |
6 | ); 7 | }; 8 | 9 | export default AuthLayout; 10 | -------------------------------------------------------------------------------- /app/auth/login/page.tsx: -------------------------------------------------------------------------------- 1 | import { Login } from '@/components/auth/auth'; 2 | 3 | const LoginPage = () => { 4 | return ; 5 | }; 6 | 7 | export default LoginPage; 8 | -------------------------------------------------------------------------------- /app/auth/new-password/page.tsx: -------------------------------------------------------------------------------- 1 | import { NewPassword } from '@/components/auth/auth'; 2 | 3 | const NewPasswordPage = () => { 4 | return 5 | }; 6 | 7 | export default NewPasswordPage; 8 | -------------------------------------------------------------------------------- /app/auth/new-verification/page.tsx: -------------------------------------------------------------------------------- 1 | import { VerifyEmail } from '@/components/auth/auth'; 2 | 3 | const NewVerificationPage = () => { 4 | return ; 5 | }; 6 | 7 | export default NewVerificationPage; 8 | -------------------------------------------------------------------------------- /app/auth/register/page.tsx: -------------------------------------------------------------------------------- 1 | import { SignUp } from '@/components/auth/auth'; 2 | 3 | const RegisterPage = () => { 4 | return ; 5 | }; 6 | 7 | export default RegisterPage; 8 | -------------------------------------------------------------------------------- /app/auth/reset/page.tsx: -------------------------------------------------------------------------------- 1 | import { ResetPassword } from "@/components/auth/auth"; 2 | 3 | const ResetPage = () => { 4 | return ( 5 | 6 | ); 7 | } 8 | 9 | export default ResetPage; -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nizzyabi/lib-ui/09c5c6e8d338675e61f8fb2eebc9651ced679173/app/favicon.ico -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import Footer from "@/components/footer"; 4 | import Components from "@/components/landing-page/components"; 5 | import Demo from "@/components/landing-page/demo"; 6 | import Hero from "@/components/landing-page/hero"; 7 | import { useSession } from "next-auth/react"; 8 | import { signOut } from "next-auth/react"; 9 | 10 | export default function Home() { 11 | const { data: session, status } = useSession(); 12 | console.log("Session status:", status); 13 | console.log("Full session:", session); 14 | console.log("User email:", session?.user?.email); 15 | const handleSignOut = async () => { 16 | await signOut(); 17 | }; 18 | 19 | return ( 20 | <> 21 |
22 | {status === "loading" 23 | ? "Loading..." 24 | : session?.user?.email || "Not signed in"} 25 |
26 | 27 | 28 |
29 | 30 | 31 |
32 |