From 9f2e7463885870adef8e2d06b3cb09644d2a0126 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Sat, 16 Mar 2024 20:19:24 -0400 Subject: [PATCH] Initial Commit --- .eslintrc.cjs | 18 +++ .gitignore | 24 ++++ README.md | 13 ++ bun.lockb | Bin 0 -> 244326 bytes index.html | 13 ++ package.json | 72 +++++++++++ postcss.config.js | 6 + public/vite.svg | 1 + src/App.tsx | 14 +++ src/assets/react.svg | 1 + src/components/TipTap.tsx | 41 ++++++ src/index.css | 31 +++++ src/lib/usePersistedStore.ts | 18 +++ src/main.tsx | 10 ++ src/ui/accordion.tsx | 59 +++++++++ src/ui/alert-dialog.tsx | 141 +++++++++++++++++++++ src/ui/alert.tsx | 62 +++++++++ src/ui/avatar.tsx | 48 +++++++ src/ui/badge.tsx | 37 ++++++ src/ui/button.tsx | 54 ++++++++ src/ui/calendar.tsx | 65 ++++++++++ src/ui/card.tsx | 86 +++++++++++++ src/ui/checkbox.tsx | 30 +++++ src/ui/cn.tsx | 7 ++ src/ui/collapsible.tsx | 11 ++ src/ui/command.tsx | 152 ++++++++++++++++++++++ src/ui/context-menu.tsx | 200 +++++++++++++++++++++++++++++ src/ui/dialog.tsx | 125 +++++++++++++++++++ src/ui/dropdown-menu.tsx | 199 +++++++++++++++++++++++++++++ src/ui/form.tsx | 153 +++++++++++++++++++++++ src/ui/hover-card.tsx | 29 +++++ src/ui/input.tsx | 25 ++++ src/ui/label.tsx | 24 ++++ src/ui/menubar.tsx | 236 +++++++++++++++++++++++++++++++++++ src/ui/navigation-menu.tsx | 126 +++++++++++++++++++ src/ui/pagination.tsx | 117 +++++++++++++++++ src/ui/popover.tsx | 31 +++++ src/ui/progress.tsx | 26 ++++ src/ui/radio-group.tsx | 41 ++++++ src/ui/select.tsx | 159 +++++++++++++++++++++++ src/ui/separator.tsx | 31 +++++ src/ui/sheet.tsx | 139 +++++++++++++++++++++ src/ui/skeleton.tsx | 18 +++ src/ui/slider.tsx | 28 +++++ src/ui/switch.tsx | 29 +++++ src/ui/table.tsx | 117 +++++++++++++++++ src/ui/tabs.tsx | 55 ++++++++ src/ui/textarea.tsx | 24 ++++ src/ui/toaster.tsx | 28 +++++ src/ui/toggle-group.tsx | 56 +++++++++ src/ui/toggle.tsx | 44 +++++++ src/ui/tooltip.tsx | 30 +++++ src/ui/useFormField.tsx | 29 +++++ src/vite-env.d.ts | 1 + tailwind.config.js | 108 ++++++++++++++++ tsconfig.json | 25 ++++ tsconfig.node.json | 11 ++ vite.config.ts | 7 ++ 58 files changed, 3285 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 index.html create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/vite.svg create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/components/TipTap.tsx create mode 100644 src/index.css create mode 100644 src/lib/usePersistedStore.ts create mode 100644 src/main.tsx create mode 100644 src/ui/accordion.tsx create mode 100644 src/ui/alert-dialog.tsx create mode 100644 src/ui/alert.tsx create mode 100644 src/ui/avatar.tsx create mode 100644 src/ui/badge.tsx create mode 100644 src/ui/button.tsx create mode 100644 src/ui/calendar.tsx create mode 100644 src/ui/card.tsx create mode 100644 src/ui/checkbox.tsx create mode 100644 src/ui/cn.tsx create mode 100644 src/ui/collapsible.tsx create mode 100644 src/ui/command.tsx create mode 100644 src/ui/context-menu.tsx create mode 100644 src/ui/dialog.tsx create mode 100644 src/ui/dropdown-menu.tsx create mode 100644 src/ui/form.tsx create mode 100644 src/ui/hover-card.tsx create mode 100644 src/ui/input.tsx create mode 100644 src/ui/label.tsx create mode 100644 src/ui/menubar.tsx create mode 100644 src/ui/navigation-menu.tsx create mode 100644 src/ui/pagination.tsx create mode 100644 src/ui/popover.tsx create mode 100644 src/ui/progress.tsx create mode 100644 src/ui/radio-group.tsx create mode 100644 src/ui/select.tsx create mode 100644 src/ui/separator.tsx create mode 100644 src/ui/sheet.tsx create mode 100644 src/ui/skeleton.tsx create mode 100644 src/ui/slider.tsx create mode 100644 src/ui/switch.tsx create mode 100644 src/ui/table.tsx create mode 100644 src/ui/tabs.tsx create mode 100644 src/ui/textarea.tsx create mode 100644 src/ui/toaster.tsx create mode 100644 src/ui/toggle-group.tsx create mode 100644 src/ui/toggle.tsx create mode 100644 src/ui/tooltip.tsx create mode 100644 src/ui/useFormField.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/.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/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.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/README.md b/README.md new file mode 100644 index 0000000..58b1aeb --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +- ~~supports markdown~~ +- ~~we're going to use prosemirror~~ +- ~~keep it stored in a readable, markdown-ish format. files over app~~ +- be able to toggle anything + - a place where toggle things appear or something +- use markdown annotations to link to "canvases of content" +- there is a canvas around the document +- user can create notes +- the user can highlight sections and add notes +- then they can move through sections in a review mode where suggestions are made for each change +- the user can bind references or notes to a particular place in the text, kind of like stickies that live inside the text. those stickies can inform the AI as well. +- another concept is global state for a document, and custom renderers, also site scraping +- you can highlight and run AI functions \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..e6581bb652d26a5ef6a48838211a3c9f21fbcd24 GIT binary patch literal 244326 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

O_M4WVQMpitxYKQFj7CoCBG|Fw)0}q~#MA zTK2u^$^pE77z7_<9UU6oE9fC>ebdcJ;4T1t?ND7Zr3yQQ(H(UF^FuP)aoPi1#Y{p+ zT2J=<1DnHiB7dp-PPT(?XnZ`~==RGx{^z*=)~OS3Fnrx;`8@?-q%TBtU@Gcob;&kq z2YODNs&u*$nQBEpLswVm9xwl{cMYaE^4&S}9V8#(t65(+XI-)lkcR+^J*hS6r$knw z-Xqo%Oq%fEnPfYz`%TYzUuP376_hc<-jvC9aJM#cU1@NLKHDv(o z1-X75$Ai{r-6ha|N~YzI)I=^@KEH7L(=Yh_&b&kUs>gQryhiKv*~Q8pw)grtbcRpl zWK+V!W^)|u!56*7I55%B=}f7#d*L>EZRh#?%Kusorn8!1nAWeKc!3>PykDOzcegY} zjt_2iW2e3n-ygUweS2dQ1&<({k#6#3X;M2Jb+B~gt~?o|UE#H;dAai>_K7lT{2eqZ)_CM&_RL-i_!y%JIYw^EDwEIw>r$vhz_ z5^z-~WaZ#sHy@+`Q<}O?U!}?7mhy6VRcDoAJ?>>DdT7Ac_R%}J4gE)ULiA2o>zXQj;FdT&&6?3JFXh)0V8X_XE#V4W>$W5LCH9QpK#JMP$$CY*5UTiZ2f* z^IPaIDw%{ULr|?)D??Lw9re^)3fMr4I*__75M~_yN*Sj4W7(n8?bQXW8!&*m&43+S zUAO8yD`@9QMFw@6M3?sitDjZlPrAWTMqvtA8Bw*-8Bna=G-#)wsR7Zh99}E8BbWx4 zf>vHMnN}PHw2B#Y)XmTqWu57VvFHy~n9xt}ba$9p-5{l#$0xA}z zGsRZW+67ruU9iL^4bSH4svMv_WDOKqrkfKZ{#CufLonDkC+aNG$fk!=Z*8DtG87Yp zO(9V;@lHL5Sqx4A*5`SMN7K&8dejRFd2g@Ff`MR|%*3h92AHS49R1lWmk5p=wo2H@ zu+2m1K@r;{XM5W0u(5Ol1L*WA`<@ZA6Jt$dT0P7ZD%G+mu1DX-usN}GbB@}_^B5Kn zGbm#3ICqO{OOV=U3fdTmT9p^w_Vyr;tx*C! z1y@bV0i?`2ZT#^R#Jm=f8}_&g3%$L~~(^=SGu_)`FaVkhMB{PHgA8mKAA zu#QE_5^3OAN@n7Y>A21WuwMTNt+D=l#Tx+Pxq|@N6wm52uf)vt0M=QG%_xyzpCPSX z9bl}Z(t|LV(oG_*7sOYDSRJLubUMncum+6Mnz#x1X!b5H8^AGAichFVMUt@D?*nK` zdA+x0wHo@upLw#hjZ3FQak9w8glnd!Jul>@goRX_{G#@$=>Sa~1>S{ST9_D8`}>ZF zK~F(G3E*Efc*z zOGq~cgPm)|JVUE{y2)zh3U+cJgP zUGIxC`fzJ=IvzEYlE>X&-2)b5l?`UrQSCj4sdii97cR(T1swnD>Fsw(#DCu2-hTM> z`2))R{0UUjxE)UE>cxF}ZhZ>c0FK(HsT0IBahn3tgwrc}fmL8y;vkh` z6n&0}y3_4DIx0}DYJjnhs@;-GfA?klve`3Ja=m8?dOj4VmlGRYpM6;btzUbV9#`bD zt%iQHj^X^{58-c?SJEi~)7Ne6cR19*QIRIDVHEpeFNpz9MVgdXUt65&XIo=DB4^gA z#lbGj4SxN@Yn#k<^4$NfcZcjHSubLR61ogfsGLw#ly+EF(+v(IMv%@a|GeGokDFIk zUhIScGa#a{{lr!qmN=>9z%fH!oqyc1*Zwe=VyU-ZiS^&1zsxLhE-=_o2`9PKKb`6& z(!kyMDh6Po{ai5(a|-?@S%~9zif1kC9R-wAC-D@p$pT@*Pdl^iGwx5dPT$S#ZI`lw zI0dS9@Aa6b!{**y$jeFK`*+$W(LEHS65{dmYG;)&Kki@mI=wb#7*KO-zACW2@R){UPy?J{HY@?(e2A_Hk~ zM^)R5c^k0K{Is982QQd_M4hCtS^|GWZ{k7XHN4p*witK;GHJOxXwj3 zfT2VZ4OX{_IlHf0bG3JHwyrsCTaI+R*7pVpZ2}%rcNTX_ojh=2r~BnldSheL?NPRRIvrUp>Z_MWi>7;_AhZI>ZZGCziqZt4V7!idm0t8 z)Kt-6Xz{j`7Q}6O!WdZi#7Z#s!Prt=RP(e$s?(eDjR2IL z!$>b}Zt3@`cRX{t09I!`EMx|I1l1?BFkoJVRQr{US1|^RRcs}eC6yFJSv_Uct)Ayx zbkwSHsb!ri+E$N72h788<|CklAV=avC|%7cv72>x9YdZ)w`o*>8ARamu9D2FCU07n zV=LtN6~p!tm!(`wpD@|Qz?ZP~N@k~jFJP}BsYe|xwfQ-eMjp8A_kTiC*Lp%&rxoO! zKOB#{Au_(|Y(iK;p&Z21``m1i@flh0S&&d*4zJq2b176bB%<=9tbfr`eF_X(XG%bJ z40m8tZ})nV6OXoOzp?$UQo-0UJ{=~Rf(B>e&o-;5D|9+h&O@;|j8`zOY*i&-s~A#g z#hT*fNNPr@xNwhOiOq~QYD<6XRAyn2HER?gZQ=##0;C8`y?Wte)Z4FtKtWo1nTe}< z;Wxp$c^=l*^NC+({8Oh-u~){pUl$5|z4ok46tNz0*@lH_AS{u>=x%+=WoLrr?F%-t zYB-e$US4zp8;8F6lyjB1S~%qH@g27AxO+)!u$|JT1CX=p#3=2`m$dIK5&=t8fO9F? YMp?AaYF^8ND_0ymK41Ui|Mb7V0aJv1zW@LL literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +

+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..393c1c1 --- /dev/null +++ b/package.json @@ -0,0 +1,72 @@ +{ + "name": "app", + "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": "latest", + "@radix-ui/react-alert-dialog": "latest", + "@radix-ui/react-avatar": "latest", + "@radix-ui/react-checkbox": "latest", + "@radix-ui/react-collapsible": "latest", + "@radix-ui/react-context-menu": "latest", + "@radix-ui/react-dialog": "latest", + "@radix-ui/react-dropdown-menu": "latest", + "@radix-ui/react-hover-card": "latest", + "@radix-ui/react-label": "latest", + "@radix-ui/react-menubar": "latest", + "@radix-ui/react-navigation-menu": "latest", + "@radix-ui/react-popover": "latest", + "@radix-ui/react-progress": "latest", + "@radix-ui/react-radio-group": "latest", + "@radix-ui/react-select": "latest", + "@radix-ui/react-separator": "latest", + "@radix-ui/react-slider": "latest", + "@radix-ui/react-slot": "latest", + "@radix-ui/react-switch": "latest", + "@radix-ui/react-tabs": "latest", + "@radix-ui/react-toggle": "latest", + "@radix-ui/react-toggle-group": "latest", + "@radix-ui/react-tooltip": "latest", + "@tiptap/extension-link": "^2.2.4", + "@tiptap/pm": "^2.2.4", + "@tiptap/react": "^2.2.4", + "@tiptap/starter-kit": "^2.2.4", + "class-variance-authority": "latest", + "clsx": "latest", + "cmdk": "latest", + "novel": "^0.2.12", + "react": "^18.2.0", + "react-day-picker": "latest", + "react-dom": "^18.2.0", + "react-hook-form": "latest", + "react-icons": "latest", + "sonner": "latest", + "tailwind-merge": "latest", + "tiptap-markdown": "^0.8.9", + "zustand": "latest" + }, + "devDependencies": { + "@tailwindcss/typography": "^0.5.10", + "@types/react": "^18.2.56", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^7.0.2", + "@typescript-eslint/parser": "^7.0.2", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "latest", + "eslint": "^8.56.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "latest", + "tailwindcss": "latest", + "tailwindcss-animate": "latest", + "typescript": "^5.2.2", + "vite": "^5.1.4" + } +} \ No newline at end of file diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..bbfe10b --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,14 @@ +import { TooltipProvider } from "./ui/tooltip"; +import { Toaster } from "./ui/toaster"; +import { TipTap } from "./components/TipTap"; + +export default function App() { + return ( + +
+ +
+ +
+ ); +} diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/TipTap.tsx b/src/components/TipTap.tsx new file mode 100644 index 0000000..9efb034 --- /dev/null +++ b/src/components/TipTap.tsx @@ -0,0 +1,41 @@ +import type { EditorProps } from "@tiptap/pm/view"; +import { EditorContent, useEditor } from "@tiptap/react"; +import StarterKit from "@tiptap/starter-kit"; +import { Markdown } from "tiptap-markdown"; +import { Link } from "@tiptap/extension-link"; +import { usePersistedStore } from "../lib/usePersistedStore"; + +// define your extension array +const extensions = [ + StarterKit, + Markdown.configure({ + linkify: true, + }), + Link.configure({ + autolink: true, + }), +]; + +const editorProps: EditorProps = { + attributes: { + class: + "main-editor prose prose-neutral lg:prose-lg xl:prose-xl dark:prose-invert prose-sm sm:prose-base m-5 focus:outline-none", + spellcheck: "false", + }, +}; + +export function TipTap() { + const content = usePersistedStore((state) => state.content); + const editor = useEditor({ + extensions, + content, + editorProps, + onUpdate: ({ editor }) => { + usePersistedStore.setState({ + content: editor.storage.markdown.getMarkdown(), + }); + }, + }); + + return ; +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b4203c3 --- /dev/null +++ b/src/index.css @@ -0,0 +1,31 @@ +@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&&family=Pathway+Extreme:wght@700&display=swap"); + +:root { + --font-sans: PP Neue Montreal TT, Open Sans; + --font-display: Pathway Extreme; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; + +html { + @apply antialiased; +} + +body { + @apply bg-white text-foreground; +} + +@layer components { + *, + ::before, + ::after { + --tw-ring-color: theme("colors.foreground/0.25"); + @apply border-neutral-200; + } +} + +.main-editor { + @apply bg-white p-4; +} diff --git a/src/lib/usePersistedStore.ts b/src/lib/usePersistedStore.ts new file mode 100644 index 0000000..4296021 --- /dev/null +++ b/src/lib/usePersistedStore.ts @@ -0,0 +1,18 @@ +import { JSONContent } from "@tiptap/react"; +import { create } from "zustand"; +import { persist } from "zustand/middleware"; + +type PersistedState = { + content: JSONContent; +}; + +export const usePersistedStore = create()( + persist( + (_set) => ({ + content: {}, + }), + { + name: "persisted-editor-content", + } + ) +); diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..966f17a --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.css"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + +); diff --git a/src/ui/accordion.tsx b/src/ui/accordion.tsx new file mode 100644 index 0000000..4e9c8ba --- /dev/null +++ b/src/ui/accordion.tsx @@ -0,0 +1,59 @@ +"use client"; + +import * as AccordionPrimitive from "@radix-ui/react-accordion"; +import * as React from "react"; + +import { LuChevronDown } from "react-icons/lu"; +import { cn } from "./cn"; + +const Accordion = AccordionPrimitive.Root; + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AccordionItem.displayName = AccordionPrimitive.Item.displayName; + +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, AccordionContent,AccordionItem, AccordionTrigger }; diff --git a/src/ui/alert-dialog.tsx b/src/ui/alert-dialog.tsx new file mode 100644 index 0000000..19403f1 --- /dev/null +++ b/src/ui/alert-dialog.tsx @@ -0,0 +1,141 @@ +"use client"; + +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"; +import * as React from "react"; + +import { buttonVariants } from "./button"; +import { cn } from "./cn"; +import { dialogTitleStaticClasses } from "./dialog"; + +const AlertDialog = AlertDialogPrimitive.Root; + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger; + +const AlertDialogPortal = AlertDialogPrimitive.Portal; + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogOverlay.displayName = "AlertDialogOverlay"; + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)); +AlertDialogContent.displayName = "AlertDialogContent"; + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ); +}); +AlertDialogTitle.displayName = "AlertDialogTitle"; + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogDescription.displayName = "AlertDialogDescription"; + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogAction.displayName = "AlertDialogAction"; + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogCancel.displayName = "AlertDialogCancel"; + +export { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogOverlay, + AlertDialogPortal, + AlertDialogTitle, + AlertDialogTrigger, +}; diff --git a/src/ui/alert.tsx b/src/ui/alert.tsx new file mode 100644 index 0000000..1b92abd --- /dev/null +++ b/src/ui/alert.tsx @@ -0,0 +1,62 @@ +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { cn } from "./cn"; +import { dialogTitleStaticClasses } from "./dialog"; + +const alertVariants = cva( + "relative w-full rounded-xl border p-4 [&>svg]:text-foreground grid gap-y-1 gap-x-2 [&:has(>svg)]:grid-cols-[auto_[main]_minmax(0,1fr)] items-center", + { + variants: { + variant: { + default: "bg-background text-card-foreground", + destructive: + "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)); +Alert.displayName = "Alert"; + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return ( +
+ ); +}); +AlertTitle.displayName = "AlertTitle"; + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +AlertDescription.displayName = "AlertDescription"; + +export { Alert, AlertDescription,AlertTitle, alertVariants }; diff --git a/src/ui/avatar.tsx b/src/ui/avatar.tsx new file mode 100644 index 0000000..9ba7f5c --- /dev/null +++ b/src/ui/avatar.tsx @@ -0,0 +1,48 @@ +import * as AvatarPrimitive from "@radix-ui/react-avatar"; +import * as React from "react"; + +import { cn } from "./cn"; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarFallback,AvatarImage }; diff --git a/src/ui/badge.tsx b/src/ui/badge.tsx new file mode 100644 index 0000000..f114efe --- /dev/null +++ b/src/ui/badge.tsx @@ -0,0 +1,37 @@ +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { cn } from "./cn"; + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-foreground text-neutral-100 hover:bg-foreground/80", + secondary: + "border-transparent bg-neutral-100 text-secondary-foreground hover:bg-neutral-100/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +const Badge = ({ className, variant, ...props }: BadgeProps) => { + return ( +
+ ); +}; +Badge.displayName = "Badge"; + +export { Badge,badgeVariants }; diff --git a/src/ui/button.tsx b/src/ui/button.tsx new file mode 100644 index 0000000..bd1c6cf --- /dev/null +++ b/src/ui/button.tsx @@ -0,0 +1,54 @@ +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { cn } from "./cn"; + +const buttonVariants = cva( + "shadow-sm 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-foreground text-background hover:bg-foreground/80", + outline: + "border bg-background hover:bg-neutral-100 hover:text-neutral-800", + secondary: + "bg-neutral-100 text-secondary-foreground hover:bg-neutral-100/80 !shadow-none", + ghost: "hover:bg-neutral-100 hover:text-neutral-800 !shadow-none", + link: "text-foreground underline-offset-4 hover:underline !shadow-none", + }, + 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", + }, + }, +); + +export 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,buttonVariants }; diff --git a/src/ui/calendar.tsx b/src/ui/calendar.tsx new file mode 100644 index 0000000..bd41295 --- /dev/null +++ b/src/ui/calendar.tsx @@ -0,0 +1,65 @@ +"use client"; + +import * as React from "react"; +import { DayPicker } from "react-day-picker"; + +import { LuChevronLeft, LuChevronRight } from "react-icons/lu"; +import { buttonVariants } from "./button"; +import { cn } from "./cn"; + +export type CalendarProps = React.ComponentProps; + +const Calendar = ({ + className, + classNames, + showOutsideDays = true, + ...props +}: CalendarProps) => { + return ( + , + IconRight: () => , + }} + {...props} + /> + ); +}; +Calendar.displayName = "Calendar"; + +export { Calendar }; diff --git a/src/ui/card.tsx b/src/ui/card.tsx new file mode 100644 index 0000000..f3a7b59 --- /dev/null +++ b/src/ui/card.tsx @@ -0,0 +1,86 @@ +import * as React from "react"; + +import { cn } from "./cn"; +import { dialogTitleStaticClasses } from "./dialog"; + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return ( +

+ ); +}); +CardTitle.displayName = "CardTitle"; + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = "CardFooter"; + +export { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +}; diff --git a/src/ui/checkbox.tsx b/src/ui/checkbox.tsx new file mode 100644 index 0000000..8aa790f --- /dev/null +++ b/src/ui/checkbox.tsx @@ -0,0 +1,30 @@ +"use client"; + +import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; +import * as React from "react"; + +import { LuCheck } from "react-icons/lu"; +import { cn } from "./cn"; + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; + +export { Checkbox }; diff --git a/src/ui/cn.tsx b/src/ui/cn.tsx new file mode 100644 index 0000000..28a4a3d --- /dev/null +++ b/src/ui/cn.tsx @@ -0,0 +1,7 @@ +import { type ClassValue, clsx } from "clsx"; + import { twMerge } from "tailwind-merge"; + + export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); + } + \ No newline at end of file diff --git a/src/ui/collapsible.tsx b/src/ui/collapsible.tsx new file mode 100644 index 0000000..3e421ff --- /dev/null +++ b/src/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client"; + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"; + +const Collapsible = CollapsiblePrimitive.Root; + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger; + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent; + +export { Collapsible, CollapsibleContent,CollapsibleTrigger }; diff --git a/src/ui/command.tsx b/src/ui/command.tsx new file mode 100644 index 0000000..ecea73d --- /dev/null +++ b/src/ui/command.tsx @@ -0,0 +1,152 @@ +"use client"; + +import { type DialogProps } from "@radix-ui/react-dialog"; +import { Command as CommandPrimitive } from "cmdk"; +import * as React from "react"; + +import { LuSearch } from "react-icons/lu"; +import { cn } from "./cn"; +import { Dialog, DialogContent } from "./dialog"; + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Command.displayName = "Command"; + +interface CommandDialogProps extends DialogProps {} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + + + + {children} + + + + ); +}; + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)); +CommandInput.displayName = "CommandInput"; + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +CommandList.displayName = CommandPrimitive.List.displayName; + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +CommandEmpty.displayName = CommandPrimitive.Empty.displayName; + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +CommandGroup.displayName = "CommandGroup"; + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +CommandSeparator.displayName = "CommandSeparator"; + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +CommandItem.displayName = CommandPrimitive.Item.displayName; + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; + +export { + Command, + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, + CommandShortcut, +}; diff --git a/src/ui/context-menu.tsx b/src/ui/context-menu.tsx new file mode 100644 index 0000000..c8ca103 --- /dev/null +++ b/src/ui/context-menu.tsx @@ -0,0 +1,200 @@ +"use client"; + +import * as ContextMenuPrimitive from "@radix-ui/react-context-menu"; +import * as React from "react"; + +import { LuChevronRight, LuCheck, LuCircle } from "react-icons/lu"; +import { cn } from "./cn"; + +const ContextMenu = ContextMenuPrimitive.Root; + +const ContextMenuTrigger = ContextMenuPrimitive.Trigger; + +const ContextMenuGroup = ContextMenuPrimitive.Group; + +const ContextMenuPortal = ContextMenuPrimitive.Portal; + +const ContextMenuSub = ContextMenuPrimitive.Sub; + +const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup; + +const ContextMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger"; + +const ContextMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName; + +const ContextMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName; + +const ContextMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +ContextMenuItem.displayName = "ContextMenuItem"; + +const ContextMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +ContextMenuCheckboxItem.displayName = + ContextMenuPrimitive.CheckboxItem.displayName; + +const ContextMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName; + +const ContextMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +ContextMenuLabel.displayName = "ContextMenuLabel"; + +const ContextMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName; + +const ContextMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +ContextMenuShortcut.displayName = "ContextMenuShortcut"; + +export { + ContextMenu, + ContextMenuCheckboxItem, + ContextMenuContent, + ContextMenuGroup, + ContextMenuItem, + ContextMenuLabel, + ContextMenuPortal, + ContextMenuRadioGroup, + ContextMenuRadioItem, + ContextMenuSeparator, + ContextMenuShortcut, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuTrigger, +}; diff --git a/src/ui/dialog.tsx b/src/ui/dialog.tsx new file mode 100644 index 0000000..b761cd5 --- /dev/null +++ b/src/ui/dialog.tsx @@ -0,0 +1,125 @@ +"use client"; + +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import * as React from "react"; + +import { LuX } from "react-icons/lu"; +import { cn } from "./cn"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = "DialogOverlay"; + +export const dialogContentStaticClasses = + "grid gap-4 border bg-background text-card-foreground p-4 shadow-lg rounded-xl"; + +export const dialogPrimitiveCloseStaticClasses = + "absolute right-4 top-4 rounded-md opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-neutral-100 data-[state=open]:text-neutral-500"; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = "DialogContent"; + +export const dialogHeaderStaticClasses = + "flex flex-col space-y-1.5 text-center sm:text-left"; + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); + +export const dialogFooterStaticClasses = + "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2"; + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); + +export const dialogTitleStaticClasses = + "text-3xl font-bold tracking-tight font-display"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ); +}); +DialogTitle.displayName = "DialogTitle"; + +export const dialogDescriptionStaticClasses = "text-sm text-neutral-500"; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = "DialogDescription"; + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +}; diff --git a/src/ui/dropdown-menu.tsx b/src/ui/dropdown-menu.tsx new file mode 100644 index 0000000..4a82fc0 --- /dev/null +++ b/src/ui/dropdown-menu.tsx @@ -0,0 +1,199 @@ +"use client"; + +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import * as React from "react"; + +import { LuChevronRight, LuCheck, LuCircle } from "react-icons/lu"; +import { cn } from "./cn"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = "DropdownMenuSubTrigger"; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = "DropdownMenuItem"; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = "DropdownMenuLabel"; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +}; diff --git a/src/ui/form.tsx b/src/ui/form.tsx new file mode 100644 index 0000000..9001f7c --- /dev/null +++ b/src/ui/form.tsx @@ -0,0 +1,153 @@ +import * as LabelPrimitive from "@radix-ui/react-label"; +import { Slot } from "@radix-ui/react-slot"; +import * as React from "react"; +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, +} from "react-hook-form"; + +import { Label } from "../ui/label"; +import { cn } from "./cn"; +import { useFormField } from "./useFormField"; + +const Form = FormProvider; + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +> = { + name: TName; +}; + +export const FormFieldContext = React.createContext( + {} as FormFieldContextValue, +); + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +>({ + ...props +}: ControllerProps) => { + return ( + + + + ); +}; + +type FormItemContextValue = { + id: string; +}; + +export const FormItemContext = React.createContext( + {} as FormItemContextValue, +); + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId(); + + return ( + +
+ + ); +}); +FormItem.displayName = "FormItem"; + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField(); + + return ( +