From 60ca6210e65e97578dd2c0b517f103eed9ff8a5a Mon Sep 17 00:00:00 2001 From: iamhectorsosa Date: Sun, 3 Dec 2023 22:16:33 +0100 Subject: [PATCH] Playground --- playground/.eslintrc.cjs | 18 + playground/.gitignore | 24 + playground/README.md | 30 + playground/components.json | 16 + playground/index.html | 46 ++ playground/package.json | 47 ++ playground/postcss.config.js | 6 + playground/public/home.png | Bin 0 -> 29399 bytes playground/public/icon.png | Bin 0 -> 1039 bytes playground/src/App.tsx | 20 + playground/src/components/Config.tsx | 25 + playground/src/components/Form.tsx | 184 +++++ playground/src/components/Navbar.tsx | 20 + playground/src/components/Playground.tsx | 37 + playground/src/components/URLBar.tsx | 40 + playground/src/components/ui/accordion.tsx | 52 ++ playground/src/components/ui/button.tsx | 56 ++ playground/src/components/ui/checkbox.tsx | 28 + playground/src/components/ui/input.tsx | 25 + playground/src/components/ui/label.tsx | 24 + playground/src/components/ui/switch.tsx | 27 + playground/src/components/ui/table.tsx | 117 +++ playground/src/components/ui/tabs.tsx | 53 ++ playground/src/config.ts | 33 + playground/src/index.css | 100 +++ playground/src/lib/utils.ts | 6 + playground/src/main.tsx | 13 + playground/src/providers/Providers.tsx | 19 + playground/src/sugar-high.d.ts | 4 + playground/src/vite-env.d.ts | 1 + playground/tailwind.config.js | 79 ++ playground/tsconfig.json | 30 + playground/tsconfig.node.json | 10 + playground/vite.config.ts | 13 + pnpm-lock.yaml | 903 ++++++++++++++++++++- pnpm-workspace.yaml | 1 + turbo.json | 9 +- 37 files changed, 2104 insertions(+), 12 deletions(-) create mode 100644 playground/.eslintrc.cjs create mode 100644 playground/.gitignore create mode 100644 playground/README.md create mode 100644 playground/components.json create mode 100644 playground/index.html create mode 100644 playground/package.json create mode 100644 playground/postcss.config.js create mode 100644 playground/public/home.png create mode 100644 playground/public/icon.png create mode 100644 playground/src/App.tsx create mode 100644 playground/src/components/Config.tsx create mode 100644 playground/src/components/Form.tsx create mode 100644 playground/src/components/Navbar.tsx create mode 100644 playground/src/components/Playground.tsx create mode 100644 playground/src/components/URLBar.tsx create mode 100644 playground/src/components/ui/accordion.tsx create mode 100644 playground/src/components/ui/button.tsx create mode 100644 playground/src/components/ui/checkbox.tsx create mode 100644 playground/src/components/ui/input.tsx create mode 100644 playground/src/components/ui/label.tsx create mode 100644 playground/src/components/ui/switch.tsx create mode 100644 playground/src/components/ui/table.tsx create mode 100644 playground/src/components/ui/tabs.tsx create mode 100644 playground/src/config.ts create mode 100644 playground/src/index.css create mode 100644 playground/src/lib/utils.ts create mode 100644 playground/src/main.tsx create mode 100644 playground/src/providers/Providers.tsx create mode 100644 playground/src/sugar-high.d.ts create mode 100644 playground/src/vite-env.d.ts create mode 100644 playground/tailwind.config.js create mode 100644 playground/tsconfig.json create mode 100644 playground/tsconfig.node.json create mode 100644 playground/vite.config.ts diff --git a/playground/.eslintrc.cjs b/playground/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/playground/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/playground/.gitignore b/playground/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/playground/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/playground/README.md b/playground/README.md new file mode 100644 index 0000000..0d6babe --- /dev/null +++ b/playground/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/playground/components.json b/playground/components.json new file mode 100644 index 0000000..3807e0e --- /dev/null +++ b/playground/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/playground/index.html b/playground/index.html new file mode 100644 index 0000000..992e735 --- /dev/null +++ b/playground/index.html @@ -0,0 +1,46 @@ + + + + + + + + + Search Params - Playground + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/playground/package.json b/playground/package.json new file mode 100644 index 0000000..0810fb1 --- /dev/null +++ b/playground/package.json @@ -0,0 +1,47 @@ +{ + "name": "playground", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@search-params/react": "workspace:*", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "lucide-react": "^0.292.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.20.1", + "sugar-high": "^0.5.2", + "tailwind-merge": "^2.0.0", + "tailwindcss-animate": "^1.0.7", + "valibot": "^0.19.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10", + "eslint": "^8.53.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.4", + "postcss": "^8", + "tailwindcss": "^3", + "typescript": "^5.2.2", + "vite": "^5.0.0" + } +} \ No newline at end of file diff --git a/playground/postcss.config.js b/playground/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/playground/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/playground/public/home.png b/playground/public/home.png new file mode 100644 index 0000000000000000000000000000000000000000..11ea01dd1b1cae836b7b35aca8c4b8694e8d3adf GIT binary patch literal 29399 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 literal 0 HcmV?d00001 diff --git a/playground/public/icon.png b/playground/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..160702b9669e1c4ea5cc8b17fd01e43704eb4f55 GIT binary patch literal 1039 zcmV+q1n~QbP)j9C%x=?5+a2Hq0&nV zk)ARF^&+jLhYsbk5K6Xhn%~GgW@q1Ot?T-O;k`HW&3wP_&wOu&kp}_-zfx8&W4xJj zY9K~6ln*#k2x<9W_Db&D?1%>;$k2`g++qM8aIj9`iI}T`J5P^7RpPh z@DK*^P9H0yG(TF+BH*(EPldal&}D;Bi*1($9OvkrOTceeig?pB6%Rq5b>p+}#11

E25E3`km~E}sl2>g_HAu#$rg=9 zX@7s8E&}fG7UuU=d?M_11EZs(6bglMPKNS9y)Re0z91crG z@B+pZF^sjhw^J&WqI}`=>TGRob>Dk>dNN!MBGuK^QU=e)#zxxM*lI zIH2|Qb^0#?I=rll$Kz6|$_J299&2i9qRGignLi33H8C+kD=RBmYgt}Ox3{<5_obz! zjKu(06pO{=(**^{P2Z;+dIr?FJHXj<73bG z-8=U(5utEns(HH8Y`T2QTTU(QsnJ~BK!oq^< z34J>&coI+~hKGl#p`k%;H^f~}CMX9Hb3w0!Qz3<{DgRGNxV*e9n^LUejCX8HJrBH! zlRl0)x=fY_urM+jF7_%!m>h{j+;7t&udwJcX3|<-!mvv1buXAob)YVo(AP05XBGj( zP{k2RH!?DkVHNs@hKAg4)B_zD)8+MVGpPa3Qmhh8Ur4!5w>}n+QFtPpRk|?`MnG2W zeauJMHgm+bt?OeZ0SKdNsjNjSDJhXnDM21YBT@McC2ehO@*O({^3Bc7R8>{w$|Ik4 zcXv%yxp#ruhDw26>(BZPW30cwUwQ!z#+>!X1c3yda~jI$mwO&j2}YZiIFoJC6@hWu zv$(}q>59OKzry_^;I|nLrG>tToC%>g@jHE3E9yWp=@1W5ks+)f$5Y-5I6vO8?6L~M zDo8~DV@zDp4yRoLfVio=wd_)HKVdC&nP4n(^5>^}1IxG@I?nNX+bZ1?BydVDbWS80 z@or_g%O{t#-wufD8tdSvNA?=Z4+-JYO>zETz2VSYQskQ{@D~ya)j+A*Qs@8x002ov JPDHLkV1fw$&)xt4 literal 0 HcmV?d00001 diff --git a/playground/src/App.tsx b/playground/src/App.tsx new file mode 100644 index 0000000..3486401 --- /dev/null +++ b/playground/src/App.tsx @@ -0,0 +1,20 @@ +import { Providers } from "./providers/Providers"; +import { Playground } from "./components/Playground"; +import { Route, Routes } from "react-router-dom"; + +function App() { + return ( + + + + + } + /> + + ); +} + +export default App; diff --git a/playground/src/components/Config.tsx b/playground/src/components/Config.tsx new file mode 100644 index 0000000..0d1b913 --- /dev/null +++ b/playground/src/components/Config.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; +import { highlight } from "sugar-high"; +import rawConfig from "../config.ts?raw"; + +export const Config: React.FC = () => { + return ( +

+

+ Use{" "} + + createSearchParamsConfig + {" "} + to create a config object to handle all validations. You can choose any + schema validation library (i.e. Valibot, Zod, Yup, etc..), or write your + own, to handle your validations. +

+
+    
+ ); +}; diff --git a/playground/src/components/Form.tsx b/playground/src/components/Form.tsx new file mode 100644 index 0000000..78df8ac --- /dev/null +++ b/playground/src/components/Form.tsx @@ -0,0 +1,184 @@ +import * as React from "react"; +import { + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "./ui/table"; +import { Input } from "./ui/input"; +import { Button } from "./ui/button"; +import { Switch } from "./ui/switch"; +import { Label } from "./ui/label"; +import { Checkbox } from "./ui/checkbox"; +import { useSearchParams } from "@search-params/react"; +import { config } from "@/config"; + +export const Form: React.FC = () => { + const { page, item, notifications, categories, setQuery, clearQuery } = + useSearchParams({ + route: config.home, + }); + + return ( +
+ + + Use the inputs below to update the Search Params + + + + Param + Value + typeof + + + + + Page + {page} + {typeof page} + + + Item + {item || "-"} + {typeof item} + + + Notifications + {JSON.stringify(notifications) || "-"} + {typeof notifications} + + + Categories + {JSON.stringify(categories) || "-"} + {typeof categories} + + +
+

+ Inputs +

+
+ + setQuery({ + page: parseInt(e.currentTarget.value), + }) + } + /> + + +
+
+ + setQuery({ + item: e.currentTarget.value, + }) + } + /> + +
+
+ + setQuery({ + notifications: !notifications, + }) + } + id="notifications" + /> + +
+
+
+ + setQuery({ + categories: categories?.includes("electronics") + ? categories?.filter((c) => c !== "electronics") + : (categories ?? []).concat("electronics"), + }) + } + id="electronics" + /> + +
+
+ + setQuery({ + categories: categories?.includes("consoles") + ? categories?.filter((c) => c !== "consoles") + : (categories ?? []).concat("consoles"), + }) + } + id="consoles" + /> + +
+
+ + setQuery({ + categories: categories?.includes("gifts") + ? categories?.filter((c) => c !== "gifts") + : (categories ?? []).concat("gifts"), + }) + } + id="gifts" + /> + +
+
+
+ +
+
+ ); +}; diff --git a/playground/src/components/Navbar.tsx b/playground/src/components/Navbar.tsx new file mode 100644 index 0000000..f9512c9 --- /dev/null +++ b/playground/src/components/Navbar.tsx @@ -0,0 +1,20 @@ +import { ExternalLinkIcon } from "lucide-react"; +import * as React from "react"; +import { Link } from "react-router-dom"; + +export const Navbar: React.FC = () => { + return ( + + ); +}; diff --git a/playground/src/components/Playground.tsx b/playground/src/components/Playground.tsx new file mode 100644 index 0000000..3539cdf --- /dev/null +++ b/playground/src/components/Playground.tsx @@ -0,0 +1,37 @@ +import * as React from "react"; +import { Navbar } from "./Navbar"; +import { URLBar } from "./URLBar"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Config } from "./Config"; +import { Form } from "./Form"; + +export const Playground: React.FC = () => { + return ( +
+ + +
+
+

+ The URL Playground +

+

+ Read and update URLSearchParams with full type-safety +

+
+ + + Config + Form + + + + + +
+ + +
+
+ ); +}; diff --git a/playground/src/components/URLBar.tsx b/playground/src/components/URLBar.tsx new file mode 100644 index 0000000..a9304f5 --- /dev/null +++ b/playground/src/components/URLBar.tsx @@ -0,0 +1,40 @@ +import { RotateCcwIcon } from "lucide-react"; +import * as React from "react"; +import { useLocation } from "react-router-dom"; +import { Button } from "./ui/button"; +import { useSearchParams } from "@search-params/react"; +import { config } from "@/config"; + +export const URLBar: React.FC = () => { + const location = useLocation(); + const { clearQuery } = useSearchParams({ + route: config.home, + }); + + return ( +
+
+ {location.search} + {location.search !== "?page=1" && ( + + )} +
+
+ ); +}; + +const ARC_DEV_MODE_BG: React.CSSProperties = { + background: + "repeating-linear-gradient(45deg, #4247CB, #4247CB 20px, #3E43CA 20px, #3E43CA 40px)", +}; diff --git a/playground/src/components/ui/accordion.tsx b/playground/src/components/ui/accordion.tsx new file mode 100644 index 0000000..92c9f9e --- /dev/null +++ b/playground/src/components/ui/accordion.tsx @@ -0,0 +1,52 @@ +import * as React from "react"; +import * as AccordionPrimitive from "@radix-ui/react-accordion"; +import { ChevronDown } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Accordion = AccordionPrimitive.Root; + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AccordionItem.displayName = "AccordionItem"; + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)); + +AccordionContent.displayName = AccordionPrimitive.Content.displayName; + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/playground/src/components/ui/button.tsx b/playground/src/components/ui/button.tsx new file mode 100644 index 0000000..1bf9659 --- /dev/null +++ b/playground/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + } +); +Button.displayName = "Button"; + +export { Button }; diff --git a/playground/src/components/ui/checkbox.tsx b/playground/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..5158448 --- /dev/null +++ b/playground/src/components/ui/checkbox.tsx @@ -0,0 +1,28 @@ +import * as React from "react"; +import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; +import { Check } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; + +export { Checkbox }; diff --git a/playground/src/components/ui/input.tsx b/playground/src/components/ui/input.tsx new file mode 100644 index 0000000..677d05f --- /dev/null +++ b/playground/src/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/playground/src/components/ui/label.tsx b/playground/src/components/ui/label.tsx new file mode 100644 index 0000000..7c96064 --- /dev/null +++ b/playground/src/components/ui/label.tsx @@ -0,0 +1,24 @@ +import * as React from "react"; +import * as LabelPrimitive from "@radix-ui/react-label"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +); + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)); +Label.displayName = LabelPrimitive.Root.displayName; + +export { Label }; diff --git a/playground/src/components/ui/switch.tsx b/playground/src/components/ui/switch.tsx new file mode 100644 index 0000000..83a6dc1 --- /dev/null +++ b/playground/src/components/ui/switch.tsx @@ -0,0 +1,27 @@ +import * as React from "react"; +import * as SwitchPrimitives from "@radix-ui/react-switch"; + +import { cn } from "@/lib/utils"; + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +Switch.displayName = SwitchPrimitives.Root.displayName; + +export { Switch }; diff --git a/playground/src/components/ui/table.tsx b/playground/src/components/ui/table.tsx new file mode 100644 index 0000000..7f3502f --- /dev/null +++ b/playground/src/components/ui/table.tsx @@ -0,0 +1,117 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + tr]:last:border-b-0", + className + )} + {...props} + /> +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} diff --git a/playground/src/components/ui/tabs.tsx b/playground/src/components/ui/tabs.tsx new file mode 100644 index 0000000..a190e9d --- /dev/null +++ b/playground/src/components/ui/tabs.tsx @@ -0,0 +1,53 @@ +import * as React from "react"; +import * as TabsPrimitive from "@radix-ui/react-tabs"; + +import { cn } from "@/lib/utils"; + +const Tabs = TabsPrimitive.Root; + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsList.displayName = TabsPrimitive.List.displayName; + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName; + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsContent.displayName = TabsPrimitive.Content.displayName; + +export { Tabs, TabsList, TabsTrigger, TabsContent }; diff --git a/playground/src/config.ts b/playground/src/config.ts new file mode 100644 index 0000000..b4b2306 --- /dev/null +++ b/playground/src/config.ts @@ -0,0 +1,33 @@ +import { createSearchParamsConfig } from "@search-params/react"; +import { + fallback, + number, + object, + parse, + string, + optional, + boolean, + array, + union, + literal, + minValue, +} from "valibot"; + +/** Using `valibot` */ +const searchParamsSchema = object({ + page: fallback(number([minValue(1)]), 1), + item: fallback(optional(string()), undefined), + notifications: fallback(optional(boolean()), undefined), + categories: fallback( + optional( + array( + union([literal("electronics"), literal("consoles"), literal("gifts")]) + ) + ), + undefined + ), +}); + +export const config = createSearchParamsConfig({ + home: (search) => parse(searchParamsSchema, search), +}); diff --git a/playground/src/index.css b/playground/src/index.css new file mode 100644 index 0000000..73a19a2 --- /dev/null +++ b/playground/src/index.css @@ -0,0 +1,100 @@ +@import url("https://fonts.googleapis.com/css2?family=Schibsted+Grotesk:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400&display=swap"); + +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + + --radius: 0.5rem; + } + + :root { + --sh-class: #2d5e9d; + --sh-identifier: #859bb5; + --sh-sign: #8996a3; + --sh-string: #00a99a; + --sh-keyword: #f47067; + --sh-comment: #a19595; + --sh-jsxliterals: #6266d1; + } + + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + } +} + +* { + scroll-behavior: smooth; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + font-family: "Schibsted Grotesk", sans-serif; + } + body pre, + body code { + font-family: "IBM Plex Mono", monospace; + } +} diff --git a/playground/src/lib/utils.ts b/playground/src/lib/utils.ts new file mode 100644 index 0000000..ec79801 --- /dev/null +++ b/playground/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/playground/src/main.tsx b/playground/src/main.tsx new file mode 100644 index 0000000..3b384e9 --- /dev/null +++ b/playground/src/main.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.css"; +import { BrowserRouter } from "react-router-dom"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + +); diff --git a/playground/src/providers/Providers.tsx b/playground/src/providers/Providers.tsx new file mode 100644 index 0000000..8d6a21c --- /dev/null +++ b/playground/src/providers/Providers.tsx @@ -0,0 +1,19 @@ +import * as React from "react"; +import { SearchParamsProvider } from "@search-params/react"; +import { useSearchParams } from "react-router-dom"; + +export const Providers: React.FC = ({ children }) => { + const [searchParams, setSearchParams] = useSearchParams(); + + return ( + setSearchParams(href), + replace: (href) => setSearchParams(href), + }} + > + {children} + + ); +}; diff --git a/playground/src/sugar-high.d.ts b/playground/src/sugar-high.d.ts new file mode 100644 index 0000000..1d555be --- /dev/null +++ b/playground/src/sugar-high.d.ts @@ -0,0 +1,4 @@ +declare module "sugar-high" { + export function highlight(code: string): string; + export function tokenize(code: string): Array<[number, string]>; +} diff --git a/playground/src/vite-env.d.ts b/playground/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/playground/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/playground/tailwind.config.js b/playground/tailwind.config.js new file mode 100644 index 0000000..8694536 --- /dev/null +++ b/playground/tailwind.config.js @@ -0,0 +1,79 @@ +import tailwindcssAnimate from "tailwindcss-animate"; + +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: ["class"], + content: [ + "./index.html", + "./pages/**/*.{ts,tsx}", + "./components/**/*.{ts,tsx}", + "./app/**/*.{ts,tsx}", + "./src/**/*.{ts,tsx}", + ], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [tailwindcssAnimate], +}; diff --git a/playground/tsconfig.json b/playground/tsconfig.json new file mode 100644 index 0000000..4a83aa7 --- /dev/null +++ b/playground/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/playground/tsconfig.node.json b/playground/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/playground/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/playground/vite.config.ts b/playground/vite.config.ts new file mode 100644 index 0000000..de58842 --- /dev/null +++ b/playground/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import path from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1618c60..e1130db 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,6 +116,103 @@ importers: specifier: ^0.34.6 version: 0.34.6 + playground: + dependencies: + '@radix-ui/react-accordion': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-checkbox': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-label': + specifier: ^2.0.2 + version: 2.0.2(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': + specifier: ^1.0.2 + version: 1.0.2(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-switch': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@search-params/react': + specifier: workspace:* + version: link:../packages/react + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.0.0 + version: 2.0.0 + lucide-react: + specifier: ^0.292.0 + version: 0.292.0(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-router-dom: + specifier: ^6.20.1 + version: 6.20.1(react-dom@18.2.0)(react@18.2.0) + sugar-high: + specifier: ^0.5.2 + version: 0.5.2 + tailwind-merge: + specifier: ^2.0.0 + version: 2.0.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.3.5) + valibot: + specifier: ^0.19.0 + version: 0.19.0 + devDependencies: + '@types/node': + specifier: ^20 + version: 20.8.9 + '@types/react': + specifier: ^18.2.37 + version: 18.2.41 + '@types/react-dom': + specifier: ^18.2.15 + version: 18.2.17 + '@typescript-eslint/eslint-plugin': + specifier: ^6.10.0 + version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.2.2) + '@typescript-eslint/parser': + specifier: ^6.10.0 + version: 6.13.1(eslint@8.55.0)(typescript@5.2.2) + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.5.0(vite@5.0.0) + autoprefixer: + specifier: ^10 + version: 10.4.16(postcss@8.4.31) + eslint: + specifier: ^8.53.0 + version: 8.55.0 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.55.0) + eslint-plugin-react-refresh: + specifier: ^0.4.4 + version: 0.4.5(eslint@8.55.0) + postcss: + specifier: ^8 + version: 8.4.31 + tailwindcss: + specifier: ^3 + version: 3.3.5 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + vite: + specifier: ^5.0.0 + version: 5.0.0(@types/node@20.8.9) + packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -745,6 +842,16 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.55.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@eslint-community/regexpp@4.10.0: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -767,11 +874,33 @@ packages: - supports-color dev: true + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/js@8.52.0: resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@8.55.0: + resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} @@ -988,6 +1117,35 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} peerDependencies: @@ -1016,6 +1174,34 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: @@ -1044,6 +1230,34 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: @@ -1068,6 +1282,30 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: @@ -1082,6 +1320,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + /@radix-ui/react-context@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: @@ -1096,6 +1348,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-context@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + /@radix-ui/react-direction@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: @@ -1110,6 +1376,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-direction@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + /@radix-ui/react-id@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: @@ -1125,6 +1405,21 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-id@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: @@ -1146,6 +1441,27 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: @@ -1168,6 +1484,28 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: @@ -1189,6 +1527,56 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-slot@1.0.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: @@ -1204,6 +1592,21 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-slot@1.0.2(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: @@ -1231,6 +1634,61 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + '@types/react-dom': 18.2.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: @@ -1245,6 +1703,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: @@ -1260,6 +1732,21 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: @@ -1274,8 +1761,50 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.33)(react@18.2.0): - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/react': 18.2.33 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.41)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/react': 18.2.41 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 @@ -1284,11 +1813,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.41)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -1298,11 +1828,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.41)(react@18.2.0) + '@types/react': 18.2.41 react: 18.2.0 dev: false + /@remix-run/router@1.13.1: + resolution: {integrity: sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==} + engines: {node: '>=14.0.0'} + dev: false + /@rollup/rollup-android-arm-eabi@4.5.0: resolution: {integrity: sha512-OINaBGY+Wc++U0rdr7BLuFClxcoWaVW3vQYqmQq6B3bqQ/2olkaoz+K8+af/Mmka/C2yN5j+L9scBkv4BtKsDA==} cpu: [arm] @@ -1407,12 +1942,125 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true + /@swc/core-darwin-arm64@1.3.100: + resolution: {integrity: sha512-XVWFsKe6ei+SsDbwmsuRkYck1SXRpO60Hioa4hoLwR8fxbA9eVp6enZtMxzVVMBi8ej5seZ4HZQeAWepbukiBw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.100: + resolution: {integrity: sha512-KF/MXrnH1nakm1wbt4XV8FS7kvqD9TGmVxeJ0U4bbvxXMvzeYUurzg3AJUTXYmXDhH/VXOYJE5N5RkwZZPs5iA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.100: + resolution: {integrity: sha512-p8hikNnAEJrw5vHCtKiFT4hdlQxk1V7vqPmvUDgL/qe2menQDK/i12tbz7/3BEQ4UqUPnvwpmVn2d19RdEMNxw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.100: + resolution: {integrity: sha512-BWx/0EeY89WC4q3AaIaBSGfQxkYxIlS3mX19dwy2FWJs/O+fMvF9oLk/CyJPOZzbp+1DjGeeoGFuDYpiNO91JA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.100: + resolution: {integrity: sha512-XUdGu3dxAkjsahLYnm8WijPfKebo+jHgHphDxaW0ovI6sTdmEGFDew7QzKZRlbYL2jRkUuuKuDGvD6lO5frmhA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.100: + resolution: {integrity: sha512-PhoXKf+f0OaNW/GCuXjJ0/KfK9EJX7z2gko+7nVnEA0p3aaPtbP6cq1Ubbl6CMoPL+Ci3gZ7nYumDqXNc3CtLQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.100: + resolution: {integrity: sha512-PwLADZN6F9cXn4Jw52FeP/MCLVHm8vwouZZSOoOScDtihjY495SSjdPnlosMaRSR4wJQssGwiD/4MbpgQPqbAw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.100: + resolution: {integrity: sha512-0f6nicKSLlDKlyPRl2JEmkpBV4aeDfRQg6n8mPqgL7bliZIcDahG0ej+HxgNjZfS3e0yjDxsNRa6sAqWU2Z60A==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.100: + resolution: {integrity: sha512-b7J0rPoMkRTa3XyUGt8PwCaIBuYWsL2DqbirrQKRESzgCvif5iNpqaM6kjIjI/5y5q1Ycv564CB51YDpiS8EtQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.100: + resolution: {integrity: sha512-7dKgTyxJjlrMwFZYb1auj3Xq0D8ZBe+5oeIgfMlRU05doXZypYJe0LAk0yjj3WdbwYzpF+T1PLxwTWizI0pckw==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.2 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.100 + '@swc/core-darwin-x64': 1.3.100 + '@swc/core-linux-arm64-gnu': 1.3.100 + '@swc/core-linux-arm64-musl': 1.3.100 + '@swc/core-linux-x64-gnu': 1.3.100 + '@swc/core-linux-x64-musl': 1.3.100 + '@swc/core-win32-arm64-msvc': 1.3.100 + '@swc/core-win32-ia32-msvc': 1.3.100 + '@swc/core-win32-x64-msvc': 1.3.100 + dev: true + + /@swc/counter@0.1.2: + resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + dev: true + /@swc/helpers@0.5.2: resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: tslib: 2.6.2 dev: false + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: true + /@types/chai-subset@1.3.5: resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} dependencies: @@ -1429,6 +2077,10 @@ packages: ci-info: 3.9.0 dev: true + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true @@ -1459,6 +2111,11 @@ packages: dependencies: '@types/react': 18.2.33 + /@types/react-dom@18.2.17: + resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} + dependencies: + '@types/react': 18.2.41 + /@types/react@18.2.33: resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} dependencies: @@ -1466,6 +2123,13 @@ packages: '@types/scheduler': 0.16.5 csstype: 3.1.2 + /@types/react@18.2.41: + resolution: {integrity: sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw==} + dependencies: + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 + csstype: 3.1.2 + /@types/scheduler@0.16.5: resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} @@ -1473,6 +2137,56 @@ packages: resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} dev: true + /@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.2.2): + resolution: {integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/type-utils': 6.13.1(eslint@8.55.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.3.4 + eslint: 8.55.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.2.2): + resolution: {integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.3.4 + eslint: 8.55.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@6.9.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1494,6 +2208,14 @@ packages: - supports-color dev: true + /@typescript-eslint/scope-manager@6.13.1: + resolution: {integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/visitor-keys': 6.13.1 + dev: true + /@typescript-eslint/scope-manager@6.9.0: resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1502,11 +2224,57 @@ packages: '@typescript-eslint/visitor-keys': 6.9.0 dev: true + /@typescript-eslint/type-utils@6.13.1(eslint@8.55.0)(typescript@5.2.2): + resolution: {integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.2.2) + '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.55.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.13.1: + resolution: {integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/types@6.9.0: resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/typescript-estree@6.13.1(typescript@5.2.2): + resolution: {integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@6.9.0(typescript@5.2.2): resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1528,6 +2296,33 @@ packages: - supports-color dev: true + /@typescript-eslint/utils@6.13.1(eslint@8.55.0)(typescript@5.2.2): + resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.2.2) + eslint: 8.55.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.13.1: + resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.13.1 + eslint-visitor-keys: 3.4.3 + dev: true + /@typescript-eslint/visitor-keys@6.9.0: resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1540,6 +2335,17 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true + /@vitejs/plugin-react-swc@3.5.0(vite@5.0.0): + resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==} + peerDependencies: + vite: ^4 || ^5 + dependencies: + '@swc/core': 1.3.100 + vite: 5.0.0(@types/node@20.8.9) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + /@vitest/expect@0.34.6: resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} dependencies: @@ -2533,6 +3339,23 @@ packages: eslint: 8.52.0 dev: true + /eslint-plugin-react-hooks@4.6.0(eslint@8.55.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.55.0 + dev: true + + /eslint-plugin-react-refresh@0.4.5(eslint@8.55.0): + resolution: {integrity: sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==} + peerDependencies: + eslint: '>=7' + dependencies: + eslint: 8.55.0 + dev: true + /eslint-plugin-react@7.33.2(eslint@8.52.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} @@ -2618,6 +3441,53 @@ packages: - supports-color dev: true + /eslint@8.55.0: + resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.55.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4033,6 +4903,29 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true + /react-router-dom@6.20.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.13.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.20.1(react@18.2.0) + dev: false + + /react-router@6.20.1(react@18.2.0): + resolution: {integrity: sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.13.1 + react: 18.2.0 + dev: false + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f1dcdd0..bd3fec6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - "docs" + - "playground" - "packages/*" diff --git a/turbo.json b/turbo.json index 8bf2e3a..0801e04 100644 --- a/turbo.json +++ b/turbo.json @@ -2,14 +2,9 @@ "$schema": "https://turbo.build/schema.json", "pipeline": { "build": { - "dependsOn": [ - "^build" - ], "outputs": [ - ".next/**", - "!.next/cache/**" - ], - "cache": false + "dist/**" + ] }, "dev": {}, "lint": {},