UNPKG

@kadoui/react

Version:

Kadoui primitive components for React

680 lines (567 loc) 19.3 kB
# Kadoui-react Primitive components for `React` powered by `Kadoui-css` styles. We recommend use `Kadoui-css` for styling the components: [Read about `Kadoui-css`](https://www.npmjs.com/package/@kadoui/css) Also use `lucide-react` for icons: [Read about `lucide-react`](https://www.npmjs.com/package/lucide-react) --- ### AccessNavigation For add arrow-key nagivations to your UIs. ```tsx <AccessNavigation direction="x" className="join mt-6"> <button className="btn btn-soft">One</button> <button className="btn btn-soft">Two</button> <button className="btn btn-soft">Three</button> <button className="btn btn-soft">Four</button> </AccessNavigation> ``` ### Accordion ```tsx <Accordion> <Accordion.Toggle className="btn btn-full data-[state=true]:btn-fill data-[state=false]:btn-soft justify-between mt-6 group"> <span>Open accordion</span> <ChevronDownIcon className="transition-transform btn-icon-size group-data-[state=true]:-scale-y-100" /> </Accordion.Toggle> <Accordion.Body> <p className="p-3"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos fugit accusamus unde, repellendus dolores, fuga nam commodi sapiente omnis voluptatum error earum culpa asperiores eaque ea enim possimus vero esse! </p> </Accordion.Body> </Accordion> ``` ### Breadcrumbs ```tsx <Breadcrumbs className="breadcrumbs"> <Breadcrumbs.Item className="breadcrumbs-item"> <button className="btn btn-soft">Home</button> </Breadcrumbs.Item> <Breadcrumbs.Item className="breadcrumbs-item"> <button className="btn btn-soft">Articles</button> </Breadcrumbs.Item> <Breadcrumbs.Item className="breadcrumbs-item" isLastItem> <button className="btn btn-fill">How to gain money?</button> </Breadcrumbs.Item> </Breadcrumbs> ``` or ```tsx <Breadcrumbs className="breadcrumbs"> <Breadcrumbs.Item className="breadcrumbs-item"> <button className="btn btn-soft">Home</button> </Breadcrumbs.Item> <Breadcrumbs.Item className="breadcrumbs-item"> <button className="btn btn-soft">Articles</button> </Breadcrumbs.Item> <Breadcrumbs.Item className="breadcrumbs-item" isLastItem> <button className="btn btn-fill">How to gain money?</button> </Breadcrumbs.Item> </Breadcrumbs> ``` ### Carousel ```tsx <Carousel className="carousel"> <Carousel.LeftFade className="carousel-left-fade" /> <Carousel.RightFade className="carousel-right-fade" /> <Carousel.Container className="carousel-container gap-3 scroll-smooth"> {Array.from({ length: 12 }).map((_, index) => ( <article key={index} className="carousel-children card slidable"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores doloremque error rem ex, necessitatibus dolore deleniti alias aperiam cum ipsum, suscipit possimus porro provident totam mollitia? Voluptate, eaque quas. Culpa. </article> ))} </Carousel.Container> <div className="f-center gap-3 mt-3"> <Carousel.PrevBtn className="btn btn-outline btn-square"> <ArrowLeftIcon className="btn-icon-size" /> </Carousel.PrevBtn> <Carousel.NextBtn className="btn btn-outline btn-square"> <ArrowRightIcon className="btn-icon-size" /> </Carousel.NextBtn> </div> </Carousel> ``` ### ClientOnly ```tsx <p>There is server</p> <ClientOnly> <p>There is client</p> </ClientOnly> ``` ### Clipboard ```tsx <Clipboard text="Kadoui-react" className="btn btn-soft btn-square" copiedChildren={<CopyCheckIcon className="btn-icon-size" />}> <CopyIcon className="btn-icon-size" /> </Clipboard> ``` ### ContextMenu ```tsx <ContextMenu className="context-menu border-4 border-dashed border-foreground h-[33vh]"> <span className="absolute inset-center">Context menu!</span> <ContextMenu.Body className="context-menu-body"> <AccessNavigation className="card card-menu card-y"> <button className="btn btn-ghost"> <TrashIcon className="compatible-icon" /> <span>DELETE</span> </button> <button className="btn btn-ghost"> <RefreshCwIcon className="compatible-icon" /> <span>RELOAD</span> </button> <button className="btn btn-ghost"> <FlagIcon className="compatible-icon" /> <span>IGNORE IT</span> </button> </AccessNavigation> </ContextMenu.Body> </ContextMenu> ``` ### Drawer ```tsx <Drawer> <Drawer.Toggle className="btn btn-soft">Open left drawer</Drawer.Toggle> <Drawer.Portal className="drawer-portal"> <Drawer.Body className="drawer-body"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum porro vero delectus eum qui laboriosam, dolore veritatis eligendi amet voluptatibus incidunt temporibus dolores fuga adipisci eius saepe quod aspernatur iure. </Drawer.Body> </Drawer.Portal> </Drawer> ``` or ```tsx <Drawer> <Drawer.Toggle className="btn btn-soft">Open top drawer</Drawer.Toggle> <Drawer.Portal className="drawer-portal"> <Drawer.Body className="drawer-body" position="top"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum porro vero delectus eum qui laboriosam, dolore veritatis eligendi amet voluptatibus incidunt temporibus dolores fuga adipisci eius saepe quod aspernatur iure. </Drawer.Body> </Drawer.Portal> </Drawer> ``` or ```tsx <Drawer> <Drawer.Toggle className="btn btn-soft">Open right drawer</Drawer.Toggle> <Drawer.Portal className="drawer-portal"> <Drawer.Body className="drawer-body" position="right"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum porro vero delectus eum qui laboriosam, dolore veritatis eligendi amet voluptatibus incidunt temporibus dolores fuga adipisci eius saepe quod aspernatur iure. </Drawer.Body> </Drawer.Portal> </Drawer> ``` or ```tsx <Drawer> <Drawer.Toggle className="btn btn-soft">Open bottom drawer</Drawer.Toggle> <Drawer.Portal className="drawer-portal"> <Drawer.Body className="drawer-body" position="bottom"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum porro vero delectus eum qui laboriosam, dolore veritatis eligendi amet voluptatibus incidunt temporibus dolores fuga adipisci eius saepe quod aspernatur iure. </Drawer.Body> </Drawer.Portal> </Drawer> ``` ### Modal ```tsx <Modal> <Modal.Toggle className="btn btn-soft">Open modal</Modal.Toggle> <Modal.Portal className="modal-portal"> <Modal.Body className="modal-body"> <Modal.Header className="modal-header font-bold justify-center"> Say hello to modal </Modal.Header> <Modal.Content className="modal-content max-w-xl"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Dignissimos, ratione repudiandae eveniet quisquam, vitae, nobis iure voluptas harum est incidunt odio? Dolorem quod numquam placeat sed beatae, natus cum porro! </Modal.Content> </Modal.Body> </Modal.Portal> </Modal> ``` ### OTP ```tsx <Otp className="otp"> <Otp.Inputs length={6} className="input input-outline input-square" onLastChange={(otp) => alert(otp)} /> <Otp.HiddenInput /> </Otp> ``` ### Pagination With state: ```tsx <PaginationWithState pagesLength={6}> <div className="pagination"> <PaginationWithState.PrevBtn className="btn btn-soft btn-square"> <ChevronLeftIcon className="btn-icon-size" /> </PaginationWithState.PrevBtn> <PaginationWithState.Counts className="btn data-[state=false]:btn-ghost data-[state=true]:btn-fill" /> <PaginationWithState.NextBtn className="btn btn-soft btn-square"> <ChevronRightIcon className="btn-icon-size" /> </PaginationWithState.NextBtn> </div> </PaginationWithState> ``` With search params: ```tsx <Suspense> <PaginationWithSearchParams pagesLength={6}> <div className="pagination"> <PaginationWithSearchParams.PrevBtn className="btn btn-soft btn-square"> <ChevronLeftIcon className="btn-icon-size" /> </PaginationWithSearchParams.PrevBtn> <PaginationWithSearchParams.Counts className="btn data-[state=false]:btn-ghost data-[state=true]:btn-fill" /> <PaginationWithSearchParams.NextBtn className="btn btn-soft btn-square"> <ChevronRightIcon className="btn-icon-size" /> </PaginationWithSearchParams.NextBtn> </div> </PaginationWithSearchParams> </Suspense> ``` ### Pagination with pages With state: ```tsx const PAGES_WITH_STATE = [ { name: "Hello world", component: ( <p> One: Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quis officiis quia, dolores similique, cumque ut vel aspernatur non vitae voluptas reiciendis? Veniam, voluptates impedit soluta blanditiis ad nam eligendi dignissimos. </p> ), }, { name: "Finish", component: ( <p> Two: Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quis officiis quia, dolores similique, cumque ut vel aspernatur non vitae voluptas reiciendis? Veniam, voluptates impedit soluta blanditiis ad nam eligendi dignissimos. </p> ), }, ]; <PaginationWithState pages={PAGES_WITH_STATE}> <div className="max-w-96"> <PaginationWithState.Pages /> <div className="pagination"> <PaginationWithState.PrevBtn className="btn btn-soft btn-square"> <ChevronLeftIcon className="btn-icon-size" /> </PaginationWithState.PrevBtn> <PaginationWithState.Counts className="btn data-[state=false]:btn-ghost data-[state=true]:btn-fill" /> <PaginationWithState.NextBtn className="btn btn-soft btn-square"> <ChevronRightIcon className="btn-icon-size" /> </PaginationWithState.NextBtn> </div> </div> </PaginationWithState>; ``` With search params: ```tsx const PAGES_WITH_SEARCHPARAMS = [ { name: "Hello world", component: ( <p> One: Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quis officiis quia, dolores similique, cumque ut vel aspernatur non vitae voluptas reiciendis? Veniam, voluptates impedit soluta blanditiis ad nam eligendi dignissimos. </p> ), }, { name: "Finish", component: ( <p> Two: Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quis officiis quia, dolores similique, cumque ut vel aspernatur non vitae voluptas reiciendis? Veniam, voluptates impedit soluta blanditiis ad nam eligendi dignissimos. </p> ), }, ]; <Suspense> <PaginationWithSearchParams pages={PAGES_WITH_SEARCHPARAMS}> <div className="max-w-96"> <PaginationWithSearchParams.Pages /> <div className="pagination"> <PaginationWithSearchParams.PrevBtn className="btn btn-soft btn-square"> <ChevronLeftIcon className="btn-icon-size" /> </PaginationWithSearchParams.PrevBtn> <PaginationWithSearchParams.Counts className="btn data-[state=false]:btn-ghost data-[state=true]:btn-fill" /> <PaginationWithSearchParams.NextBtn className="btn btn-soft btn-square"> <ChevronRightIcon className="btn-icon-size" /> </PaginationWithSearchParams.NextBtn> </div> </div> </PaginationWithSearchParams> </Suspense>; ``` ### PasswordInput ```tsx <PasswordInput className="input input-outline"> <PasswordInput.Field className="input-field" /> <PasswordInput.Toggle className="btn btn-ghost btn-sm" visibleChildren={<EyeIcon className="btn-icon-size" />}> <EyeClosedIcon className="btn-icon-size" /> </PasswordInput.Toggle> </PasswordInput> ``` ### Popover ```tsx <Popover className="popover" mode="hover"> <Popover.Toggle className="btn btn-soft">Hover me</Popover.Toggle> <Popover.Body className="popover-body popover-body-b card card-menu max-w-[200%]"> Lorem ipsum dolor sit amet, consectetur adipisicing. </Popover.Body> </Popover> ``` or ```tsx <Popover className="popover" mode="both"> <Popover.Toggle className="btn btn-soft">Hover and click me</Popover.Toggle> <Popover.Body className="popover-body popover-body-b card card-menu max-w-[200%]"> Lorem ipsum dolor sit amet, consectetur adipisicing. </Popover.Body> </Popover> ``` or ```tsx <Popover className="popover" mode="click"> <Popover.Toggle className="btn btn-soft">Click me</Popover.Toggle> <Popover.Body className="popover-body popover-body-b card card-menu max-w-[200%]"> Lorem ipsum dolor sit amet, consectetur adipisicing. </Popover.Body> </Popover> ``` ### Portal ```tsx <Portal> <p> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Similique placeat eligendi dolore adipisci sunt magni quo accusamus commodi rerum excepturi! Temporibus molestias, et nesciunt ut aut labore quod nihil magni? </p> </Portal> ``` ### Progress ```tsx <Progress className="progress" value={45}> <Progress.Bar className="progress-bar" /> </Progress> ``` ### QrCode ```tsx <QrCode className="w-96 rounded-lg" value="https://github.com/FarzadVav" options={{ width: 384 }} /> ``` ### Rating ```tsx const [rating, setRating] = useState(3); <Rating className="rating"> <Rating.Items className="rating-items" count={5} value={rating} onValueChange={setRating} element={<StarIcon className="size-9" />} activeElement={<StarIcon className="fill-foreground size-9" />} /> </Rating>; ``` ### Sheet ```tsx <Sheet> <Sheet.Toggle className="btn btn-soft">Open sheet</Sheet.Toggle> <Sheet.Portal className="sheet-portal"> <Sheet.Body className="sheet-body"> <Sheet.Header className="sheet-header"> <Sheet.Handlebar className="sheet-handlebar" /> </Sheet.Header> <Sheet.Content className="sheet-content"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae explicabo numquam sed dolorem nesciunt repellat deleniti quisquam laudantium? Quas ullam magni voluptate esse animi vero dicta maxime mollitia amet dolor. </Sheet.Content> </Sheet.Body> </Sheet.Portal> </Sheet> ``` ### ShowMore ```tsx <ShowMore className="max-w-96" maxLines={3}> <ShowMore.Content> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Accusantium exercitationem repellendus debitis, dignissimos non quis! Fugit ducimus adipisci minus quas est expedita, voluptatibus minima ad facere quis, dolor ipsum debitis! </ShowMore.Content> <ShowMore.Fade className="show-more-fade" /> <ShowMore.Toggle className="btn btn-soft mt-1.5">Show more</ShowMore.Toggle> </ShowMore> ``` ### Spoiler ```tsx <p> Lorem ipsum dolor sit{" "} <Spoiler className="spoiler"> <Spoiler.Blur className="spoiler-blur">amet consectetur adipisicing</Spoiler.Blur> </Spoiler>{" "} elit. Officiis nemo incidunt tenetur assumenda consequuntur beatae harum iusto, libero labore! Ea quo dolore accusantium veniam illo vel quae nihil iure aliquid. </p> ``` ### Submit ```tsx <form action={async () => { await new Promise((resolve) => setTimeout(resolve, 1000)); }}> <Submit className="btn btn-soft"> <span>Press the from</span> <Submit.Loader loader={<LoaderIcon className="btn-icon-size animate-spin" />}> <SendHorizonalIcon className="btn-icon-size" /> </Submit.Loader> </Submit> </form> ``` ### Swap ```tsx const SWAP_KEYS = ["one", "two", "three"]; const [swapKey, setSwapKey] = useState(SWAP_KEYS[0] as string); <Swap keys={SWAP_KEYS} activeKey={swapKey} setActiveKey={setSwapKey}> <Swap.Btn className="btn btn-soft" btnKey={SWAP_KEYS[0] as string} /> <Swap.Btn className="btn btn-soft" btnKey={SWAP_KEYS[1] as string} /> <Swap.Btn className="btn btn-soft" btnKey={SWAP_KEYS[2] as string} /> </Swap>; ``` ### Tabs ```tsx const [activeTab, setActiveTab] = useState("1"); <Tabs activeTab={activeTab} setActiveTab={setActiveTab}> <AccessNavigation direction="x"> <Tabs.List className="tabs-list join-border"> <Tabs.Tab value="1" className="btn data-[state=false]:btn-soft data-[state=true]:btn-fill"> Tab 1 </Tabs.Tab> <Tabs.Tab value="2" className="btn data-[state=false]:btn-soft data-[state=true]:btn-fill"> Tab 2 </Tabs.Tab> <Tabs.Tab value="3" className="btn data-[state=false]:btn-soft data-[state=true]:btn-fill"> Tab 3 </Tabs.Tab> </Tabs.List> </AccessNavigation> <Tabs.Panel className="tabs-panel card-lg" key={"1"} value="1"> Tab 1: Lorem, ipsum dolor sit amet consectetur adipisicing elit. Voluptates, animi nisi, magni quis dolore cum molestias ipsam accusantium sunt repudiandae repellendus perspiciatis cumque unde commodi reprehenderit distinctio nostrum quisquam nihil? </Tabs.Panel> <Tabs.Panel className="tabs-panel card-lg" key={"2"} value="2"> Tab 2: Lorem, ipsum dolor sit amet consectetur adipisicing elit. Voluptates, animi nisi, magni quis dolore cum molestias ipsam accusantium sunt repudiandae quisquam nihil? </Tabs.Panel> <Tabs.Panel className="tabs-panel card-lg" key={"3"} value="3"> Tab 3: Lorem, ipsum dolor sit amet consectetur adipisicing elit. Voluptates, animi nisi, magni quis dolore cum molestias ipsam accusantium sunt repudiandae repellendus perspiciatis cumque unde commodi reprehenderit distinctio nostrum quisquam nihil? <br /> Lorem ipsum dolor sit amet consectetur, adipisicing elit. Fugiat ut corporis sequi expedita deserunt aliquid iste facere, nisi ipsa iure ad nostrum animi. Adipisci placeat eos laborum error magnam officiis necessitatibus illo commodi a, aperiam tempora alias voluptatum eveniet, atque quas dolores, facilis architecto quisquam ipsum dolore officia debitis facere! Dicta iste consectetur, illo amet obcaecati aut error, ipsam optio at earum odio laudantium voluptatibus? Nemo, nisi debitis et, nam voluptas tempora ipsa ipsum culpa nobis perferendis ipsam cumque blanditiis quos corrupti, rerum eos? Sapiente fugiat voluptatibus laborum culpa at. Quidem, suscipit perferendis. Illum doloribus in cumque fuga laboriosam dignissimos! </Tabs.Panel> </Tabs>; ``` ### LinkLoader ```tsx <Link className="btn btn-soft mt-6" href={"/test"}> <span>Test page</span> <LinkLoader loader={<LoaderIcon className="btn-icon-size animate-spin" />}> <ArrowRightIcon className="btn-icon-size" /> </LinkLoader> </Link> ``` --- Written with ❤️ by [Farzad Vahdati](https://github.com/FarzadVav)