diff --git a/apps/browser-rendering b/apps/browser-rendering index 3119b29f..b37c9623 160000 --- a/apps/browser-rendering +++ b/apps/browser-rendering @@ -1 +1 @@ -Subproject commit 3119b29faa3342a0e6465793c9649ff6176459b4 +Subproject commit b37c962365a36cf342a31a196f4908f4f1343553 diff --git a/apps/web-v2/.eslintrc.json b/apps/web-v2/.eslintrc.json new file mode 100644 index 00000000..abd7bea7 --- /dev/null +++ b/apps/web-v2/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "next/core-web-vitals", + "plugin:eslint-plugin-next-on-pages/recommended" + ], + "plugins": ["eslint-plugin-next-on-pages"] +} diff --git a/apps/web-v2/.gitignore b/apps/web-v2/.gitignore new file mode 100644 index 00000000..c213988d --- /dev/null +++ b/apps/web-v2/.gitignore @@ -0,0 +1,40 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# wrangler files +.wrangler +.dev.vars diff --git a/apps/web-v2/README.md b/apps/web-v2/README.md new file mode 100644 index 00000000..64c8f3bc --- /dev/null +++ b/apps/web-v2/README.md @@ -0,0 +1,70 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`c3`](https://developers.cloudflare.com/pages/get-started/c3). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Cloudflare integration + +Besides the `dev` script mentioned above `c3` has added a few extra scripts that allow you to integrate the application with the [Cloudflare Pages](https://pages.cloudflare.com/) environment, these are: + +- `pages:build` to build the application for Pages using the [`@cloudflare/next-on-pages`](https://github.com/cloudflare/next-on-pages) CLI +- `preview` to locally preview your Pages application using the [Wrangler](https://developers.cloudflare.com/workers/wrangler/) CLI +- `deploy` to deploy your Pages application using the [Wrangler](https://developers.cloudflare.com/workers/wrangler/) CLI + +> **Note:** while the `dev` script is optimal for local development you should preview your Pages application as well (periodically or before deployments) in order to make sure that it can properly work in the Pages environment (for more details see the [`@cloudflare/next-on-pages` recommended workflow](https://github.com/cloudflare/next-on-pages/blob/05b6256/internal-packages/next-dev/README.md#recommended-workflow)) + +### Bindings + +Cloudflare [Bindings](https://developers.cloudflare.com/pages/functions/bindings/) are what allows you to interact with resources available in the Cloudflare Platform. + +You can use bindings during development, when previewing locally your application and of course in the deployed application: + +- To use bindings in dev mode you need to define them in the `next.config.js` file under `setupDevBindings`, this mode uses the `next-dev` `@cloudflare/next-on-pages` submodule. For more details see its [documentation](https://github.com/cloudflare/next-on-pages/blob/05b6256/internal-packages/next-dev/README.md). + +- To use bindings in the preview mode you need to add them to the `pages:preview` script accordingly to the `wrangler pages dev` command. For more details see its [documentation](https://developers.cloudflare.com/workers/wrangler/commands/#dev-1) or the [Pages Bindings documentation](https://developers.cloudflare.com/pages/functions/bindings/). + +- To use bindings in the deployed application you will need to configure them in the Cloudflare [dashboard](https://dash.cloudflare.com/). For more details see the [Pages Bindings documentation](https://developers.cloudflare.com/pages/functions/bindings/). + +#### KV Example + +`c3` has added for you an example showing how you can use a KV binding. + +In order to enable the example: + +- Search for javascript/typescript lines containing the following comment: + ```ts + // KV Example: + ``` + and uncomment the commented lines below it. +- Do the same in the `wrangler.toml` file, where + the comment is: + ``` + # KV Example: + ``` +- If you're using TypeScript run the `cf-typegen` script to update the `env.d.ts` file: + ```bash + npm run cf-typegen + # or + yarn cf-typegen + # or + pnpm cf-typegen + # or + bun cf-typegen + ``` + +After doing this you can run the `dev` or `preview` script and visit the `/api/hello` route to see the example in action. + +Finally, if you also want to see the example work in the deployed application make sure to add a `MY_KV_NAMESPACE` binding to your Pages application in its [dashboard kv bindings settings section](https://dash.cloudflare.com/?to=/:account/pages/view/:pages-project/settings/functions#kv_namespace_bindings_section). After having configured it make sure to re-deploy your application. diff --git a/apps/web-v2/env.d.ts b/apps/web-v2/env.d.ts new file mode 100644 index 00000000..a0e1d952 --- /dev/null +++ b/apps/web-v2/env.d.ts @@ -0,0 +1,4 @@ +// Generated by Wrangler +// by running `wrangler types --env-interface CloudflareEnv env.d.ts` + +interface CloudflareEnv {} diff --git a/apps/web-v2/next.config.mjs b/apps/web-v2/next.config.mjs new file mode 100644 index 00000000..b0c1476c --- /dev/null +++ b/apps/web-v2/next.config.mjs @@ -0,0 +1,13 @@ +import { setupDevPlatform } from "@cloudflare/next-on-pages/next-dev"; + +// Here we use the @cloudflare/next-on-pages next-dev module to allow us to use bindings during local development +// (when running the application with `next dev`), for more information see: +// https://github.com/cloudflare/next-on-pages/blob/5712c57ea7/internal-packages/next-dev/README.md +if (process.env.NODE_ENV === "development") { + await setupDevPlatform(); +} + +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/apps/web-v2/package.json b/apps/web-v2/package.json new file mode 100644 index 00000000..4910e3b3 --- /dev/null +++ b/apps/web-v2/package.json @@ -0,0 +1,36 @@ +{ + "name": "web-v2", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "pages:build": "bunx @cloudflare/next-on-pages", + "preview": "bun pages:build && wrangler pages dev", + "deploy": "bun pages:build && wrangler pages deploy", + "cf-typegen": "wrangler types --env-interface CloudflareEnv env.d.ts" + }, + "dependencies": { + "react": "^18", + "react-dom": "^18", + "next": "14.1.0" + }, + "devDependencies": { + "@cloudflare/next-on-pages": "1", + "@cloudflare/workers-types": "^4.20240512.0", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "14.1.0", + "eslint-plugin-next-on-pages": "^1.11.3", + "postcss": "^8", + "tailwindcss": "^3.3.0", + "typescript": "^5", + "vercel": "^34.2.0", + "wrangler": "^3.57.0" + } +} diff --git a/apps/web-v2/postcss.config.js b/apps/web-v2/postcss.config.js new file mode 100644 index 00000000..12a703d9 --- /dev/null +++ b/apps/web-v2/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/web-v2/public/images/carousel-illustration-01.png b/apps/web-v2/public/images/carousel-illustration-01.png new file mode 100644 index 00000000..13ecb109 Binary files /dev/null and b/apps/web-v2/public/images/carousel-illustration-01.png differ diff --git a/apps/web-v2/public/images/feature-illustration.png b/apps/web-v2/public/images/feature-illustration.png new file mode 100644 index 00000000..60d98263 Binary files /dev/null and b/apps/web-v2/public/images/feature-illustration.png differ diff --git a/apps/web-v2/public/landing-bg-1.svg b/apps/web-v2/public/landing-bg-1.svg new file mode 100644 index 00000000..4154dade --- /dev/null +++ b/apps/web-v2/public/landing-bg-1.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/apps/web-v2/public/landing-bg-2.svg b/apps/web-v2/public/landing-bg-2.svg new file mode 100644 index 00000000..4d0020e1 --- /dev/null +++ b/apps/web-v2/public/landing-bg-2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/apps/web-v2/public/landing-ui-2.png b/apps/web-v2/public/landing-ui-2.png new file mode 100644 index 00000000..956da910 Binary files /dev/null and b/apps/web-v2/public/landing-ui-2.png differ diff --git a/apps/web-v2/public/landing-ui.svg b/apps/web-v2/public/landing-ui.svg new file mode 100644 index 00000000..43e64a70 --- /dev/null +++ b/apps/web-v2/public/landing-ui.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web-v2/public/logo.svg b/apps/web-v2/public/logo.svg new file mode 100644 index 00000000..6081634d --- /dev/null +++ b/apps/web-v2/public/logo.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/apps/web-v2/src/app/(landing)/EmailInput.tsx b/apps/web-v2/src/app/(landing)/EmailInput.tsx new file mode 100644 index 00000000..5dd51678 --- /dev/null +++ b/apps/web-v2/src/app/(landing)/EmailInput.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +function EmailInput() { + return ( +
+ +
+ ); +} + +export default EmailInput; diff --git a/apps/web-v2/src/app/(landing)/Features.tsx b/apps/web-v2/src/app/(landing)/Features.tsx new file mode 100644 index 00000000..93e6f725 --- /dev/null +++ b/apps/web-v2/src/app/(landing)/Features.tsx @@ -0,0 +1,325 @@ +"use client"; + +import { useState, useRef, useEffect } from "react"; +import { Transition } from "@headlessui/react"; +import Image from "next/image"; +import CarouselIllustration from "@/../public/images/carousel-illustration-01.png"; + +export default function Features() { + const [tab, setTab] = useState(1); + + const tabs = useRef(null); + + const heightFix = () => { + if (tabs.current && tabs.current.parentElement) + tabs.current.parentElement.style.height = `${tabs.current.clientHeight}px`; + }; + + useEffect(() => { + heightFix(); + }, []); + + return ( +
+
+ {/* Carousel */} +
+
+ {/* Content */} +
+
+
+ Use cases +
+

+ Save time and keep things organised +

+

+ With Supermemory, it's really easy to save information from + all over the internet, while training your own AI to help you + do more with it. +

+
+ {/* Tabs buttons */} +
+ + + +
+
+ + {/* Tabs items */} +
+
+ {/* Item 1 */} + heightFix()} + unmount={false} + > +
+ Carousel 01 +
+
+ {/* Item 2 */} + heightFix()} + unmount={false} + > +
+ Carousel 02 +
+
+ {/* Item 3 */} + heightFix()} + unmount={false} + > +
+ Carousel 03 +
+
+
+
+
+
+ + {/* Features blocks */} +
+
+ {/* Block #1 */} +
+
+ + + +

+ Discussions +

+
+

+ Keep workflows efficient with tools that give teams visibility + throughout the process. +

+
+ {/* Block #2 */} +
+
+ + + +

+ Team views +

+
+

+ Keep workflows efficient with tools that give teams visibility + throughout the process. +

+
+ {/* Block #3 */} +
+
+ + + +

+ Powerful search +

+
+

+ Keep workflows efficient with tools that give teams visibility + throughout the process. +

+
+ {/* Block #4 */} +
+
+ + + +

+ Enhancing +

+
+

+ Keep workflows efficient with tools that give teams visibility + throughout the process. +

+
+ {/* Block #5 */} +
+
+ + + +

+ Powerful search +

+
+

+ Keep workflows efficient with tools that give teams visibility + throughout the process. +

+
+ {/* Block #6 */} +
+
+ + + +

+ Team views +

+
+

+ Keep workflows efficient with tools that give teams visibility + throughout the process. +

+
+
+
+
+
+ ); +} diff --git a/apps/web-v2/src/app/(landing)/RotatingIcons.tsx b/apps/web-v2/src/app/(landing)/RotatingIcons.tsx new file mode 100644 index 00000000..fadf7d25 --- /dev/null +++ b/apps/web-v2/src/app/(landing)/RotatingIcons.tsx @@ -0,0 +1,77 @@ +"use client"; + +import { motion } from "framer-motion"; +import { Github, Medium, Notion, Reddit, Twitter } from "@/utils/icons"; +import Image from "next/image"; + +const icons = [ +
+ +
, +
+ +
, +
+ +
, +
+ +
, +
+ +
, +]; + +const RotatingIcons: React.FC = () => { + return ( +
+
+ {icons.map((icon, index) => ( + + + {icon} + + + ))} + Supermemory logo +
+
+ ); +}; + +export default RotatingIcons; diff --git a/apps/web-v2/src/app/(landing)/page.tsx b/apps/web-v2/src/app/(landing)/page.tsx new file mode 100644 index 00000000..d5dbd566 --- /dev/null +++ b/apps/web-v2/src/app/(landing)/page.tsx @@ -0,0 +1,126 @@ +import { Github, Twitter } from "@/utils/icons"; +import Image from "next/image"; +import EmailInput from "./EmailInput"; +import Features from "./Features"; +import RotatingIcons from "./RotatingIcons"; +import Logo from "@/../public/logo.svg"; + +export default function Home() { + return ( +
+
+ +
+ {/* Background gradients */} +
+
+
+
+ + {/* a blue gradient line that's slightly tilted with blur (a lotof blur)*/} +
+
+
+
+ {/* Hero section */} +
+ + Follow us on Twitter + +

+ Build your own second brain with Supermemory +

+

+ Bring saved information from all over the internet into one place + where you can connect it, and ask AI about it +

+ +
+ Landing page background + + +
+

+ Collect data from
{" "} + + any website{" "} + {" "} + on the internet +

+ +

+ ... and bring it into your second brain +

+
+ +
+
+ {/* a blue gradient line that's slightly tilted with blur (a lotof blur)*/} +
+
+
+
+ Landing page background +

+ Your bookmarks are collecting dust. +

+

+ Time to change that.
Sign up for the waitlist and be the first + to try Supermemory +

+ +
+ + +
+ ); +} diff --git a/apps/web-v2/src/app/api/hello/route.ts b/apps/web-v2/src/app/api/hello/route.ts new file mode 100644 index 00000000..363d0704 --- /dev/null +++ b/apps/web-v2/src/app/api/hello/route.ts @@ -0,0 +1,22 @@ +import type { NextRequest } from "next/server"; +import { getRequestContext } from "@cloudflare/next-on-pages"; + +export const runtime = "edge"; + +export async function GET(request: NextRequest) { + let responseText = "Hello World"; + + // In the edge runtime you can use Bindings that are available in your application + // (for more details see: + // - https://developers.cloudflare.com/pages/framework-guides/deploy-a-nextjs-site/#use-bindings-in-your-nextjs-application + // - https://developers.cloudflare.com/pages/functions/bindings/ + // ) + // + // KV Example: + // const myKv = getRequestContext().env.MY_KV_NAMESPACE + // await myKv.put('suffix', ' from a KV store!') + // const suffix = await myKv.get('suffix') + // responseText += suffix + + return new Response(responseText); +} diff --git a/apps/web-v2/src/app/favicon.ico b/apps/web-v2/src/app/favicon.ico new file mode 100644 index 00000000..718d6fea Binary files /dev/null and b/apps/web-v2/src/app/favicon.ico differ diff --git a/apps/web-v2/src/app/globals.css b/apps/web-v2/src/app/globals.css new file mode 100644 index 00000000..69f64702 --- /dev/null +++ b/apps/web-v2/src/app/globals.css @@ -0,0 +1,37 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + --black-bg: #0f1114; + --soft-foreground: #ffffff; + --soft-foreground-text: #b2bcca; +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient(to bottom, transparent, var(--black-bg)) + var(--black-bg); +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} + +@keyframes rotate { + 0% { + transform: rotate(0deg) translateX(130px); /* Adjust radius */ + } + 100% { + transform: rotate(360deg) translateX(130px); /* Adjust radius */ + } +} + +.icon-container { + animation: rotate 10s linear infinite; +} diff --git a/apps/web-v2/src/app/layout.tsx b/apps/web-v2/src/app/layout.tsx new file mode 100644 index 00000000..a4ed27c5 --- /dev/null +++ b/apps/web-v2/src/app/layout.tsx @@ -0,0 +1,23 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "Supermemory - Your personal second brain.", + description: + "Bring saved information from all over the internet into one place where you can connect it, and ask AI about it", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/apps/web-v2/src/app/not-found.tsx b/apps/web-v2/src/app/not-found.tsx new file mode 100644 index 00000000..3409889a --- /dev/null +++ b/apps/web-v2/src/app/not-found.tsx @@ -0,0 +1,58 @@ +export const runtime = "edge"; + +export default function NotFound() { + return ( + <> + 404: This page could not be found. +
+
+ + + + + + + + + + + + + + + +); + +export const Notion = (props: SVGProps) => ( + + + + +); diff --git a/apps/web-v2/tailwind.config.ts b/apps/web-v2/tailwind.config.ts new file mode 100644 index 00000000..071a0555 --- /dev/null +++ b/apps/web-v2/tailwind.config.ts @@ -0,0 +1,25 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + backgroundImage: { + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "gradient-conic": + "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + }, + colors: { + "black-bg": "var(--black-bg)", + "soft-foreground": "var(--foreground-bg)", + "soft-foreground-text": "var(--soft-foreground-text)", + }, + }, + }, + plugins: [], +}; +export default config; diff --git a/apps/web-v2/tsconfig.json b/apps/web-v2/tsconfig.json new file mode 100644 index 00000000..7b285893 --- /dev/null +++ b/apps/web-v2/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/apps/web-v2/wrangler.toml b/apps/web-v2/wrangler.toml new file mode 100644 index 00000000..4d57012e --- /dev/null +++ b/apps/web-v2/wrangler.toml @@ -0,0 +1,87 @@ +#:schema node_modules/wrangler/config-schema.json +name = "web-v2" +compatibility_date = "2024-05-12" +compatibility_flags = ["nodejs_compat"] +pages_build_output_dir = ".vercel/output/static" + +# Automatically place your workloads in an optimal location to minimize latency. +# If you are running back-end logic in a Pages Function, running it closer to your back-end infrastructure +# rather than the end user may result in better performance. +# Docs: https://developers.cloudflare.com/pages/functions/smart-placement/#smart-placement +# [placement] +# mode = "smart" + +# Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) +# Docs: +# - https://developers.cloudflare.com/pages/functions/bindings/#environment-variables +# Note: Use secrets to store sensitive data. +# - https://developers.cloudflare.com/pages/functions/bindings/#secrets +# [vars] +# MY_VARIABLE = "production_value" + +# Bind the Workers AI model catalog. Run machine learning models, powered by serverless GPUs, on Cloudflare’s global network +# Docs: https://developers.cloudflare.com/pages/functions/bindings/#workers-ai +# [ai] +# binding = "AI" + +# Bind a D1 database. D1 is Cloudflare’s native serverless SQL database. +# Docs: https://developers.cloudflare.com/pages/functions/bindings/#d1-databases +# [[d1_databases]] +# binding = "MY_DB" +# database_name = "my-database" +# database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + +# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model. +# Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps. +# Docs: https://developers.cloudflare.com/workers/runtime-apis/durable-objects +# [[durable_objects.bindings]] +# name = "MY_DURABLE_OBJECT" +# class_name = "MyDurableObject" +# script_name = 'my-durable-object' + +# Bind a KV Namespace. Use KV as persistent storage for small key-value pairs. +# Docs: https://developers.cloudflare.com/pages/functions/bindings/#kv-namespaces +# KV Example: +# [[kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer. +# Docs: https://developers.cloudflare.com/pages/functions/bindings/#queue-producers +# [[queues.producers]] +# binding = "MY_QUEUE" +# queue = "my-queue" + +# Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files. +# Docs: https://developers.cloudflare.com/pages/functions/bindings/#r2-buckets +# [[r2_buckets]] +# binding = "MY_BUCKET" +# bucket_name = "my-bucket" + +# Bind another Worker service. Use this binding to call another Worker without network overhead. +# Docs: https://developers.cloudflare.com/pages/functions/bindings/#service-bindings +# [[services]] +# binding = "MY_SERVICE" +# service = "my-service" + +# To use different bindings for preview and production environments, follow the examples below. +# When using environment-specific overrides for bindings, ALL bindings must be specified on a per-environment basis. +# Docs: https://developers.cloudflare.com/pages/functions/wrangler-configuration#environment-specific-overrides + +######## PREVIEW environment config ######## + +# [env.preview.vars] +# API_KEY = "xyz789" + +# [[env.preview.kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "" + +######## PRODUCTION environment config ######## + +# [env.production.vars] +# API_KEY = "abc123" + +# [[env.production.kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "" diff --git a/package.json b/package.json index e318f3c8..1fd54c62 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "@cloudflare/puppeteer": "^0.0.6", "@crxjs/vite-plugin": "^1.0.14", "@google/generative-ai": "^0.3.1", + "@headlessui/react": "^2.0.3", "@heroicons/react": "^2.1.1", "@langchain/cloudflare": "^0.0.3", "@radix-ui/colors": "^3.0.0", @@ -69,7 +70,7 @@ "dotenv-cli": "^7.3.0", "drizzle-orm": "^0.29.4", "eslint-plugin-next-on-pages": "^1.9.0", - "framer-motion": "^11.0.6", + "framer-motion": "^11.2.4", "hono": "^4.3.7", "honox": "^0.1.17", "html-metadata": "^1.7.1",