diff --git a/apps/formbricks-com/components/docs/Layout.tsx b/apps/formbricks-com/components/docs/Layout.tsx index 39f1ac80d2..855f410e5e 100644 --- a/apps/formbricks-com/components/docs/Layout.tsx +++ b/apps/formbricks-com/components/docs/Layout.tsx @@ -64,9 +64,9 @@ function Header({ navigation }: any) { onClick={() => router.push("https://github.com/formbricks/formbricks")}> View on Github - + */} ); @@ -124,15 +124,6 @@ export function Layout({ children, meta }: LayoutProps) { )} {children} -
-

Need help?

-

- Join our Discord and ask away. We're happy to help where we can! -

- -
{previousPage && ( @@ -164,6 +155,15 @@ export function Layout({ children, meta }: LayoutProps) { )}
+
+

Need help?

+

+ Join our Discord and ask away. We're happy to help where we can! +

+ +
diff --git a/apps/formbricks-com/components/home/Hero.tsx b/apps/formbricks-com/components/home/Hero.tsx index ad456b4cca..3d9acd96f7 100644 --- a/apps/formbricks-com/components/home/Hero.tsx +++ b/apps/formbricks-com/components/home/Hero.tsx @@ -1,8 +1,16 @@ import TemplateList from "../dummyUI/TemplateList"; +import { Button } from "@formbricks/ui"; +import { useState } from "react"; +import { useRouter } from "next/router"; +import VideoWalkThrough from "./VideoWalkThrough"; +import { PlayCircleIcon } from "@heroicons/react/24/solid"; interface Props {} export default function Hero({}: Props) { + const router = useRouter(); + const [videoModal, setVideoModal] = useState(false); + return (
@@ -21,18 +29,28 @@ export default function Hero({}: Props) { Continuously measure what your customers think and feel. All open-source.

- {/* +
- - -
*/} +
+ setVideoModal(false)} /> ); } +function GitHubIcon(props: any) { + return ( + + ); +} diff --git a/apps/formbricks-com/components/home/VideoWalkThrough.tsx b/apps/formbricks-com/components/home/VideoWalkThrough.tsx new file mode 100644 index 0000000000..691f1074aa --- /dev/null +++ b/apps/formbricks-com/components/home/VideoWalkThrough.tsx @@ -0,0 +1,17 @@ +import { ResponsiveVideo } from "@formbricks/ui"; +import Modal from "../shared/Modal"; + +interface VideoWalkThroughProps { + open: boolean; + setOpen: (v: boolean) => void; +} + +export default function VideoWalkThrough({ open, setOpen }: VideoWalkThroughProps) { + return ( + +
+ +
+
+ ); +} diff --git a/apps/formbricks-com/components/shared/Header.tsx b/apps/formbricks-com/components/shared/Header.tsx index f551830802..7209009413 100644 --- a/apps/formbricks-com/components/shared/Header.tsx +++ b/apps/formbricks-com/components/shared/Header.tsx @@ -46,8 +46,9 @@ export default function Header() { {/* ; +``` + +export default ({ children }) => {children}; diff --git a/apps/formbricks-com/pages/docs/events/no-code/index.mdx b/apps/formbricks-com/pages/docs/events/no-code/index.mdx new file mode 100644 index 0000000000..bf6db448c8 --- /dev/null +++ b/apps/formbricks-com/pages/docs/events/no-code/index.mdx @@ -0,0 +1,28 @@ +import { Layout } from "@/components/docs/Layout"; + +export const meta = { + title: "No-Code Events", +}; + +No-Code events can be set up within Formbricks with just a few clicks. There are three types of No-Code events: + +## Page URL Event + +The page URL event is triggered, when a user visits a specific page in your application. There are several match conditions: + +- `exactMatch`: The URL should exactly match the provided string. +- `contains`: The URL should contain the specified string as a substring. +- `startsWith`: The URL should start with the specified string. +- `endsWith`: The URL should end with the specified string. +- `notMatch`: The URL should not match the specified condition. +- `notContains`: The URL should not contain the specified string as a substring. + +## innerText Event (coming soon) + +The innerText event checks if the `innerText` of a clicked HTML element matches a specific text, e.g. the label of a button. + +## CSS Selector Event (coming soon) + +The CSS Selector event checks if the provided CSS selector matches the selector of a clicked HTML element. The CSS selector can be a class, id or any other CSS selector within your website. + +export default ({ children }) => {children}; diff --git a/apps/formbricks-com/pages/docs/events/why/index.mdx b/apps/formbricks-com/pages/docs/events/why/index.mdx new file mode 100644 index 0000000000..b2343909ee --- /dev/null +++ b/apps/formbricks-com/pages/docs/events/why/index.mdx @@ -0,0 +1,21 @@ +import { Layout } from "@/components/docs/Layout"; + +export const meta = { + title: "What are events and why are they useful?", +}; + +You want to understand what your users think and feel during specific moments in the user journey. To be able to ask at exactly the right point in time, you need events. + +## What are events? + +Events are a little notification sent from your application to Formbricks. You decide which events are sent either in your [Code](/docs/events/code) or by setting up a [No-Code](/docs/events/no-code) event within Formbricks. + +## How do events work? + +When a predefined event happens in your app, the Formbricks widget notices. This event can then trigger a survey to be shown to the user and is stored in the database. + +## Why are events useful? + +Events help you to display your surveys at the right time. Later on, you will be able to segment your users based on the events they have triggered in the past. This way, you can create much more granular user segments, e.g. only target users that already have used a specific feature. + +export default ({ children }) => {children}; diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs/index.mdx b/apps/formbricks-com/pages/docs/getting-started/nextjs/index.mdx index 5a6dacb8ed..d7c1f55323 100644 --- a/apps/formbricks-com/pages/docs/getting-started/nextjs/index.mdx +++ b/apps/formbricks-com/pages/docs/getting-started/nextjs/index.mdx @@ -1,11 +1,9 @@ import { Layout } from "@/components/docs/Layout"; export const meta = { - title: "Quickstart", + title: "Setting up Formbricks SDK with Next.js", }; -# Setting up Formbricks SDK with Next.js - This guide will walk you through the process of integrating the Formbricks SDK into a Next.js application. As the Formbricks SDK only works on the client side, it's essential to ensure proper integration to avoid any issues. ## Introduction diff --git a/apps/formbricks-com/pages/docs/getting-started/quickstart/index.mdx b/apps/formbricks-com/pages/docs/getting-started/quickstart/index.mdx index 7295c1178d..4c57e026c1 100644 --- a/apps/formbricks-com/pages/docs/getting-started/quickstart/index.mdx +++ b/apps/formbricks-com/pages/docs/getting-started/quickstart/index.mdx @@ -80,8 +80,11 @@ For more detailed guides for different frameworks, check out our [Next.js](/docs ## Step 5: Verify your setup -After setting up the widget, head back to the Formbricks dashboard: 1. Navigate to **Settings** in the top menubar. 2. Check the **Setup Checklist** to ensure everything is working -correctly. If all items in the checklist are marked as complete, congratulations! You've successfully set up -Formbricks, and you're ready to start creating and customizing your in-product surveys. +After setting up the widget, head back to the Formbricks dashboard: + +1. Navigate to **Settings** in the top menubar. +2. Check the **Setup Checklist** to ensure everything is working correctly. + +If you see confetti and a green box saying "Receiving data" you've successfully set up Formbricks. You're ready to start creating and customizing your in-product surveys. export default ({ children }) => {children}; diff --git a/apps/formbricks-com/pages/docs/getting-started/vuejs/index.mdx b/apps/formbricks-com/pages/docs/getting-started/vuejs/index.mdx index 0627e18a83..7d95477368 100644 --- a/apps/formbricks-com/pages/docs/getting-started/vuejs/index.mdx +++ b/apps/formbricks-com/pages/docs/getting-started/vuejs/index.mdx @@ -1,11 +1,9 @@ import { Layout } from "@/components/docs/Layout"; export const meta = { - title: "Quickstart", + title: "Setting up Formbricks SDK with Vue.js", }; -# Setting up Formbricks SDK with Vue.js - In this guide, we will go through the steps to set up the Formbricks SDK in a Vue.js application. This will allow you to create and customize in-product micro-surveys to gather valuable feedback from your users and improve your product experience. ## Introduction diff --git a/apps/formbricks-com/pages/docs/introduction/how-it-works/index.mdx b/apps/formbricks-com/pages/docs/introduction/how-it-works/index.mdx index 447ee247eb..942fc7834a 100644 --- a/apps/formbricks-com/pages/docs/introduction/how-it-works/index.mdx +++ b/apps/formbricks-com/pages/docs/introduction/how-it-works/index.mdx @@ -5,13 +5,11 @@ export const meta = { title: "How Formbricks works", }; -Formbricks is a powerful platform designed to help you create and manage in-product micro-surveys for SaaS and digital products. In this section, we'll provide a high-level overview of the different components that make up the Formbricks platform. +Formbricks is a powerful platform designed to help you create and manage in-product micro-surveys for SaaS and digital products. Here is an overview: -## Overview +## Four components -The Formbricks platform consists of four main components: - -1. **Form Builder**: Create and customize your survey forms with a user-friendly, no-code interface. +1. **Form Builder**: Create and customize your surveys with a user-friendly, no-code interface. 2. **Targeting & Triggers**: Define specific user segments and set event-based triggers to display your surveys to the right users at the right time. 3. **Integration**: Seamlessly integrate Formbricks into your web or mobile application using the provided SDKs or the HTML snippet. 4. **Analytics & Insights**: Analyze user responses and gain actionable insights to make informed product decisions. @@ -32,6 +30,4 @@ Integrating Formbricks into your web or mobile application is a breeze. With SDK Formbricks provides powerful analytics and insights to help you understand user responses and make data-driven decisions. The platform aggregates survey results and presents them in an easy-to-understand format, enabling you to identify trends, spot issues, and uncover opportunities for improvement. With Formbricks, you're always one step ahead in understanding your users and optimizing your product experience. -By combining these components, Formbricks offers an end-to-end solution for creating, managing, and analyzing in-product micro-surveys. Get started with Formbricks today and unlock valuable insights to grow your digital product. 🚀 - export default ({ children }) => {children}; diff --git a/apps/formbricks-com/pages/docs/introduction/why-is-it-better/index.mdx b/apps/formbricks-com/pages/docs/introduction/why-is-it-better/index.mdx index c59a16fe0a..7cfc51d4e3 100644 --- a/apps/formbricks-com/pages/docs/introduction/why-is-it-better/index.mdx +++ b/apps/formbricks-com/pages/docs/introduction/why-is-it-better/index.mdx @@ -18,6 +18,6 @@ Formbricks outshines other survey tools by specializing in in-product micro-surv | Event-based triggers | ❌ | ✅ | | User segmentation | ❌ | ✅ | -With Formbricks, you're not just getting another survey tool, but an in-depth, data-driven solution tailor-made for digital products. Start experiencing the difference with Formbricks today! 🎉 +With Formbricks, you're not just getting another survey tool, but an in-depth, data-driven solution tailor-made for digital products 🎉 export default ({ children }) => {children}; diff --git a/apps/formbricks-com/public/videos/walkthrough-v1.mp4 b/apps/formbricks-com/public/videos/walkthrough-v1.mp4 new file mode 100644 index 0000000000..239a7bba9f Binary files /dev/null and b/apps/formbricks-com/public/videos/walkthrough-v1.mp4 differ diff --git a/apps/formbricks-com/styles/globals.css b/apps/formbricks-com/styles/globals.css index ded6533911..1697ca6abf 100644 --- a/apps/formbricks-com/styles/globals.css +++ b/apps/formbricks-com/styles/globals.css @@ -34,3 +34,11 @@ background-color: #cbd5e1; border: 3px solid #cbd5e1; } + +.DocSearch-Input { + @apply px-11 text-gray-900 bg-white; +} + +.dark .DocSearch-Input { + @apply text-gray-200 bg-gray-800; +} diff --git a/apps/web/app/environments/[environmentId]/EnvironmentsNavbar.tsx b/apps/web/app/environments/[environmentId]/EnvironmentsNavbar.tsx index edf3ca2f92..f3805dd159 100644 --- a/apps/web/app/environments/[environmentId]/EnvironmentsNavbar.tsx +++ b/apps/web/app/environments/[environmentId]/EnvironmentsNavbar.tsx @@ -33,6 +33,7 @@ import { PaintBrushIcon, PlusIcon, UserCircleIcon, + UsersIcon, } from "@heroicons/react/24/solid"; import clsx from "clsx"; import type { Session } from "next-auth"; @@ -122,8 +123,8 @@ export default function EnvironmentsNavbar({ environmentId, session }: Environme icon: UserCircleIcon, label: "Profile", href: `/environments/${environmentId}/settings/profile`, - } /* - { icon: UsersIcon, label: "Team", href: `/environments/${environmentId}/settings/team` }, */, + }, + { icon: UsersIcon, label: "Team", href: `/environments/${environmentId}/settings/team` }, { icon: CreditCardIcon, label: "Billing & Plan", diff --git a/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx b/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx index c0be9ba37f..ff238c6886 100644 --- a/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx +++ b/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx @@ -33,7 +33,10 @@ export default function AttributeClassesList({ environmentId }: { environmentId: return ( <>
- diff --git a/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx b/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx index 7d56606efb..37e52d3982 100644 --- a/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx +++ b/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx @@ -70,7 +70,10 @@ export default function AttributeSettingsTab({
-
diff --git a/apps/web/app/environments/[environmentId]/settings/members/AddMemberModal.tsx b/apps/web/app/environments/[environmentId]/settings/members/AddMemberModal.tsx index cbe2980128..c8900c7ef4 100644 --- a/apps/web/app/environments/[environmentId]/settings/members/AddMemberModal.tsx +++ b/apps/web/app/environments/[environmentId]/settings/members/AddMemberModal.tsx @@ -41,7 +41,7 @@ export default function AddMemberModal({ open, setOpen, onSubmit }: MemberModalP
- +
@@ -55,12 +55,7 @@ export default function AddMemberModal({ open, setOpen, onSubmit }: MemberModalP }}> Cancel - diff --git a/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx b/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx index 6204108239..aa04995ffc 100644 --- a/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx +++ b/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx @@ -14,6 +14,8 @@ import { import { PaperAirplaneIcon, TrashIcon } from "@heroicons/react/24/outline"; import { useState } from "react"; import AddMemberModal from "./AddMemberModal"; +import { Badge } from "@formbricks/ui"; +import toast from "react-hot-toast"; export function EditMemberships({ environmentId }) { const { team, isErrorTeam, isLoadingTeam, mutateTeam } = useTeam(environmentId); @@ -69,7 +71,7 @@ export function EditMemberships({ environmentId }) {
-
+
Fullname
Email
@@ -78,7 +80,7 @@ export function EditMemberships({ environmentId }) {
{[...team.members, ...team.invitees].map((member) => (
@@ -88,22 +90,22 @@ export function EditMemberships({ environmentId }) {
{member.email}
- {!member.accepted && ( -

- Pending -

- )} + {!member.accepted && } {member.role !== "owner" && ( )} {!member.accepted && ( - diff --git a/apps/web/app/environments/[environmentId]/settings/members/page.tsx b/apps/web/app/environments/[environmentId]/settings/members/page.tsx index 02bf90c706..d17f6b7751 100644 --- a/apps/web/app/environments/[environmentId]/settings/members/page.tsx +++ b/apps/web/app/environments/[environmentId]/settings/members/page.tsx @@ -1,7 +1,6 @@ import SettingsCard from "../SettingsCard"; import SettingsTitle from "../SettingsTitle"; import { EditMemberships } from "./EditMemberships"; -import { EditTeamName } from "./EditTeamName"; export default function MembersSettingsPage({ params }) { return ( @@ -10,9 +9,9 @@ export default function MembersSettingsPage({ params }) { - - - + {/* + + */}
); } diff --git a/apps/web/app/environments/[environmentId]/settings/setup/SetupInstructions.tsx b/apps/web/app/environments/[environmentId]/settings/setup/SetupInstructions.tsx index 4381404e0e..4a6b25a19e 100644 --- a/apps/web/app/environments/[environmentId]/settings/setup/SetupInstructions.tsx +++ b/apps/web/app/environments/[environmentId]/settings/setup/SetupInstructions.tsx @@ -62,7 +62,10 @@ if (typeof window !== "undefined") { Need a more detailed setup guide for React, Next.js or Vue.js? {" "} - + Check out the docs. @@ -83,7 +86,10 @@ if (typeof window !== "undefined") { Want to learn how to add user attributes, custom events and more? {" "} - + Dive into the docs. @@ -96,7 +102,7 @@ if (typeof window !== "undefined") { Insert this code into the {``} tag of your website:

{``}

You're done 🎉

@@ -125,7 +131,10 @@ if (typeof window !== "undefined") { Want to learn how to add user attributes, custom events and more? {" "} - + Dive into the docs. diff --git a/apps/web/app/environments/[environmentId]/surveys/SurveyList.tsx b/apps/web/app/environments/[environmentId]/surveys/SurveyList.tsx index 9e40ff49cd..b18ed25ca6 100644 --- a/apps/web/app/environments/[environmentId]/surveys/SurveyList.tsx +++ b/apps/web/app/environments/[environmentId]/surveys/SurveyList.tsx @@ -9,9 +9,10 @@ import { DropdownMenuTrigger, } from "@/components/shared/DropdownMenu"; import LoadingSpinner from "@/components/shared/LoadingSpinner"; +import Modal from "@/components/shared/Modal"; import SurveyStatusIndicator from "@/components/shared/SurveyStatusIndicator"; -import { ErrorComponent } from "@formbricks/ui"; import { deleteSurvey, useSurveys } from "@/lib/surveys/surveys"; +import { Button, ErrorComponent, ResponsiveVideo } from "@formbricks/ui"; import { PlusIcon } from "@heroicons/react/24/outline"; import { EllipsisHorizontalIcon, PencilSquareIcon, TrashIcon } from "@heroicons/react/24/solid"; import Link from "next/link"; @@ -24,6 +25,7 @@ export default function SurveysList({ environmentId }) { const { surveys, mutateSurveys, isLoadingSurveys, isErrorSurveys } = useSurveys(environmentId); const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false); + const [isVideoDialogOpen, setVideoDialogOpen] = useState(false); const [activeSurvey, setActiveSurvey] = useState("" as any); const [activeSurveyIdx, setActiveSurveyIdx] = useState("" as any); @@ -67,6 +69,25 @@ export default function SurveysList({ environmentId }) {

+ {surveys.length === 0 && ( +
+

Kinda lost?

+ + + + + + +
+ )} {surveys .sort((a, b) => b.updatedAt - a.updatedAt) .map((survey, surveyIdx) => ( diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx index 42629d2d2a..212465e284 100644 --- a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx @@ -73,6 +73,7 @@ export default function SurveyMenuBar({ diff --git a/apps/web/app/invite/InviteContentComponents.tsx b/apps/web/app/invite/InviteContentComponents.tsx index 5aad95897e..dc36598020 100644 --- a/apps/web/app/invite/InviteContentComponents.tsx +++ b/apps/web/app/invite/InviteContentComponents.tsx @@ -17,7 +17,7 @@ const ContentLayout = ({ headline, description, children }) => { export const NotLoggedInContent = ({ email, token, redirectUrl }) => { email = encodeURIComponent(email); return ( - + diff --git a/apps/web/public/video/lost-sw.mp4 b/apps/web/public/video/lost-sw.mp4 new file mode 100644 index 0000000000..5a5ebc93b2 Binary files /dev/null and b/apps/web/public/video/lost-sw.mp4 differ diff --git a/apps/web/public/video/walkthrough-v1.mp4 b/apps/web/public/video/walkthrough-v1.mp4 new file mode 100644 index 0000000000..239a7bba9f Binary files /dev/null and b/apps/web/public/video/walkthrough-v1.mp4 differ diff --git a/packages/ui/components/Badge.tsx b/packages/ui/components/Badge.tsx index 15615033b5..f6a327a33e 100644 --- a/packages/ui/components/Badge.tsx +++ b/packages/ui/components/Badge.tsx @@ -30,7 +30,7 @@ export function Badge({ text, type, size }: BadgeProps) { return ( + +
+ ); +} diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx index d3fe6a1ea2..87b1a0c313 100644 --- a/packages/ui/index.tsx +++ b/packages/ui/index.tsx @@ -30,6 +30,7 @@ export { PageTitle } from "./components/PageTitle"; export { Popover, PopoverTrigger, PopoverContent } from "./components/Popover"; export { ProgressBar } from "./components/ProgressBar"; export { RadioGroup, RadioGroupItem } from "./components/RadioGroup"; +export { ResponsiveVideo } from "./components/ResponsiveVideo"; export { Select, SelectGroup, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 179a44183a..531d049590 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: '@changesets/cli': 2.25.0 prettier: 2.8.7 tsx: 3.9.0 - turbo: 1.8.6 + turbo: 1.8.8 apps/demo: specifiers: @@ -65,6 +65,7 @@ importers: '@types/prismjs': ^1.26.0 '@types/react': 18.0.28 '@types/react-dom': 18.0.11 + '@types/react-responsive-embed': ^2.1.0 add: ^2.0.6 autoprefixer: ^10.4.14 clsx: ^1.2.1 @@ -115,6 +116,7 @@ importers: '@types/prismjs': 1.26.0 '@types/react': 18.0.28 '@types/react-dom': 18.0.11 + '@types/react-responsive-embed': 2.1.0 autoprefixer: 10.4.14_postcss@8.4.21 eslint: 8.36.0 eslint-config-formbricks: link:../../packages/eslint-config-formbricks @@ -4586,6 +4588,12 @@ packages: redux: 4.2.1 dev: false + /@types/react-responsive-embed/2.1.0: + resolution: {integrity: sha512-VZ921rT7Kf5Zq2GyUxaFXWXQd/YqSMwpwOO5BRJJyzcZoH34YbeX442Dk/nDwXL5QQkz1Zp7hmD80Ris1OHPCA==} + dependencies: + '@types/react': 18.0.31 + dev: true + /@types/react/18.0.27: resolution: {integrity: sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==} dependencies: @@ -18638,65 +18646,65 @@ packages: dependencies: safe-buffer: 5.2.1 - /turbo-darwin-64/1.8.6: - resolution: {integrity: sha512-VlXkQR0TEBAEyBRsvAXBax+fj1EdPKPliwBaCnRLiDUcA/8wYlKte/Kk6ubmj9E0n7U/B4keCxxHiJZqW/5Rqg==} + /turbo-darwin-64/1.8.8: + resolution: {integrity: sha512-18cSeIm7aeEvIxGyq7PVoFyEnPpWDM/0CpZvXKHpQ6qMTkfNt517qVqUTAwsIYqNS8xazcKAqkNbvU1V49n65Q==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64/1.8.6: - resolution: {integrity: sha512-w4L2QLj90ex68UXxTPoqtZPl8mWzc6a1RtPjQhoxAWtZf9T2WXi813dCzYEbVUVC09/DOW/VxZRN7sb2r0KP9A==} + /turbo-darwin-arm64/1.8.8: + resolution: {integrity: sha512-ruGRI9nHxojIGLQv1TPgN7ud4HO4V8mFBwSgO6oDoZTNuk5ybWybItGR+yu6fni5vJoyMHXOYA2srnxvOc7hjQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64/1.8.6: - resolution: {integrity: sha512-eV245jefIhMAZskqQKalFwreC5UEdQcuHcBiWcgUk0py76fbwB7+1HfH5cmeJlb3a1sB6f3H0HHmGPmb34feCA==} + /turbo-linux-64/1.8.8: + resolution: {integrity: sha512-N/GkHTHeIQogXB1/6ZWfxHx+ubYeb8Jlq3b/3jnU4zLucpZzTQ8XkXIAfJG/TL3Q7ON7xQ8yGOyGLhHL7MpFRg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64/1.8.6: - resolution: {integrity: sha512-Kiw3nyEvNU6Bpil4zE5FwhasPAOi59R4YdCmjJp0Sen6V9u+/Jij6SWwaoUdATORJLiYQBbhontWBH55B53VDw==} + /turbo-linux-arm64/1.8.8: + resolution: {integrity: sha512-hKqLbBHgUkYf2Ww8uBL9UYdBFQ5677a7QXdsFhONXoACbDUPvpK4BKlz3NN7G4NZ+g9dGju+OJJjQP0VXRHb5w==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64/1.8.6: - resolution: {integrity: sha512-34BkAG9r4nE00xeMeVahaF82h8R6SO+IIOcD60fNr2p+Ch+YcQa+DbEWA/KUj3coUTIiNP5XnRCLRUYADdlxjQ==} + /turbo-windows-64/1.8.8: + resolution: {integrity: sha512-2ndjDJyzkNslXxLt+PQuU21AHJWc8f6MnLypXy3KsN4EyX/uKKGZS0QJWz27PeHg0JS75PVvhfFV+L9t9i+Yyg==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64/1.8.6: - resolution: {integrity: sha512-4jWUaI7Lmonp2I3x81GruiCYd0aQsG/xDOYhuv9+j2yIgB/UHJFz/P8PWp/nziwPtGpRd/AheDlPzzyd9lWoqw==} + /turbo-windows-arm64/1.8.8: + resolution: {integrity: sha512-xCA3oxgmW9OMqpI34AAmKfOVsfDljhD5YBwgs0ZDsn5h3kCHhC4x9W5dDk1oyQ4F5EXSH3xVym5/xl1J6WRpUg==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo/1.8.6: - resolution: {integrity: sha512-6IOOaa8ytgjnSCTnp3LKAd2uGBZ/Kmx8ZPlI/YMWuKMUqvkXKLbh+w76ApMgMm+faUqti+QujVWovCu2kY6KuQ==} + /turbo/1.8.8: + resolution: {integrity: sha512-qYJ5NjoTX+591/x09KgsDOPVDUJfU9GoS+6jszQQlLp1AHrf1wRFA3Yps8U+/HTG03q0M4qouOfOLtRQP4QypA==} hasBin: true requiresBuild: true optionalDependencies: - turbo-darwin-64: 1.8.6 - turbo-darwin-arm64: 1.8.6 - turbo-linux-64: 1.8.6 - turbo-linux-arm64: 1.8.6 - turbo-windows-64: 1.8.6 - turbo-windows-arm64: 1.8.6 + turbo-darwin-64: 1.8.8 + turbo-darwin-arm64: 1.8.8 + turbo-linux-64: 1.8.8 + turbo-linux-arm64: 1.8.8 + turbo-windows-64: 1.8.8 + turbo-windows-arm64: 1.8.8 dev: true /tween-functions/1.2.0: