Compare commits

...

444 Commits

Author SHA1 Message Date
github-actions[bot] 51095b1628 ci(changesets): version packages (#2787) 2024-04-18 19:47:12 -03:00
Art Rosnovsky a2b8421441 chore: fix minor typo in date-input docs (#2790) 2024-04-18 17:02:52 -03:00
Junior Garcia eccc2f2f3d fix(core): export * from not supported on client components (#2789)
* fix(core): export * from not supported on client components

* fix(core): named exports implemented in several packages

* chore(root): changeset description
2024-04-18 16:19:48 -03:00
աӄա 2bc1d1a58b feat(dropdown): test cases (#2786)
* fix(popover): trigger disabled prop warning

* chore(.changeset): fix typo

* feat(dropdown): add @nextui-org/image

* feat(dropdown): add more tests for custom trigger with isDisabled

* feat(dropdown): make sure the menu can be open

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-18 13:59:58 -03:00
Junior Garcia 183a4a6cfd fix(popover): trigger disabled prop warning (#2784) 2024-04-18 13:22:31 -03:00
github-actions[bot] a644544dfb ci(changesets): version packages (#2776)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-18 08:56:43 -03:00
Junior Garcia 9e5dd8ce37 fix(popover): ref not beign passed 2024-04-18 08:48:42 -03:00
chirokas 69f713cb05 fix(checkbox): omit non-react props on checkbox-group (#2772) 2024-04-18 08:20:35 -03:00
github-actions[bot] d820d9397a ci(changesets): version packages (#2767)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-17 23:57:49 -03:00
աӄա f89356691c fix(popover): isDisabled prop on a DOM element (#2741)
* fix(popover): isDisabled prop on a DOM element

* refactor(popover): filter non-react props

* fix(dropdown): tests

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-17 23:50:42 -03:00
Junior Garcia 6b56e43a35 Fix DropdownItem onPress (#2746)
* chore(dropdown): missing events added

* fix(menu): item selection events

* chore(menu): changeset
2024-04-17 23:27:36 -03:00
github-actions[bot] 4ca6e2c1f6 ci(changesets): version packages (#2745)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-17 11:03:40 -03:00
Shrinidhi Upadhyaya 2126ea1863 fix(table): add empty content only when table size is 0 #2742 (#2747)
* fix(table): add empty content only when table size is 0 #2742

* fix(table): added changeset

---------

Co-authored-by: shrinidhi.upadhyaya <shrinidhi.upadhyaya@stud.uni-bamberg.de>
2024-04-17 10:56:47 -03:00
աӄա cadbb30cfb fix(checkbox): checkbox controlled state (#2754)
* fix(checkbox): checkbox controlled state

* feat(checkbox): add @nextui-org/use-callback-ref

* chore(deps): pnpm-lock.yaml

* fix(checkbox): handle checkbox group

* fix(checkbox): rely on react aria logic (#2760)

* fix(checkbox): add missing dependency in useCheckbox hook

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-17 10:43:57 -03:00
Junior Garcia f728c0542c fix(radio): omit non-react props on radio-group (#2761) 2024-04-17 09:47:56 -03:00
Junior Garcia 74eda31288 fix(core): named exports and client directive (#2758)
* fix(core): named exports instead of * from, use client directive added to main pkg

* chore(root): changeset
2024-04-17 09:27:06 -03:00
Junior Garcia 158c2aa004 refactor(calendar): cell tab index fixed, width property added (#2744)
* refactor(calendar): cell tab index fixed, width property added

* chore(date-picker): remove needless omit
2024-04-16 16:39:19 -03:00
Junior Garcia ccd8f730e1 fix(docs): popover placements 2024-04-16 16:30:19 -03:00
github-actions[bot] 098d7884cf ci(changesets): version packages (#2738)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-16 13:37:32 -03:00
Junior Garcia 60c61aaf0c fix(modal): inside and outside scroll (#2739) 2024-04-16 13:31:35 -03:00
Junior Garcia fdbfa1f299 fix(date-picker): invalid and disabled props removed (#2737) 2024-04-16 12:37:50 -03:00
Junior Garcia ed1dbbc172 Merge branch 'main' of github.com:nextui-org/nextui 2024-04-16 10:09:31 -03:00
Junior Garcia 9cdc262619 feat(docs): v2.3.0 blog 2024-04-16 10:09:21 -03:00
github-actions[bot] c0d0a57338 ci(changesets): version packages (#2441)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-16 09:53:16 -03:00
Junior Garcia 651c8b55af fix(root): release ci 2024-04-16 09:44:57 -03:00
Junior Garcia 3a22505185 fix(root): release ci 2024-04-16 09:38:15 -03:00
Junior Garcia dc0bcf13a5 v2.3.0 [WIP] (#2618)
* refactor(input): input ref test (#2613)

* refactor(input): remove duplicate test

* refactor(input): remove unncessary waitFor

* fix(radio): isRequired & missing warning message in Form (#2597)

* fix(radio): avoid overriding required props

* fix(radio): merge with domRef

* feat(changeset): fixed missing required props and validationMessage

* fix(radio): unnecessary mergeRefs

* Calendar component  📅 (#2456)

* feat(calendar): initial structure

* feat(calendar): calendar structure completed, styles in progress

* chore(calendar): dark colors adjusted

* feat(calendar): styles improved, variants added, animations added with framer motion

* chore(calendar): animation changed, shadow improved

* chore(calendar): disableAnimation support added as well as weekDays format

* feat(calendar): more stories added

* chore(calendar): refactor calendar cell styling

* feat(calendar): create calendar function added to the root provider

* feat(calendar): invalid state and error message added

* feat(calendar): calendar picker added, provider modified

* feat(root): object.values deps replaced by new func, intersection hoook added, types version unified

* feat(calendar): calendar pickers in progress

* feat(calendar): calendar pickers added

* fix(calendar): year label formatting

* chore(calendar): add layout parameter to Calendar stories

* feat(calendar): pickers completed, context added

* feat(calendar): visibleMonths supported, warnings fixed, tests added

* chore(root): changeset

* chore(calendar): add topContent and bottomContent props to calendar

* feat(calendar): add @nextui-org/radio package and update calendar component

* refactor: assigned type(DateValue) to focusedDate(ControlledFocusedVaue) (#2637)

Co-authored-by: shrinidhi.upadhyaya <shrinidhi.upadhyaya@stud.uni-bamberg.de>

* Range Calendar 📆 (#2634)

* feat(calendar): range calendar added, calendar and context adapted

* feat(calendar): range calendar stories added

* chore(calendar): range calendar tests added

* fix(calendar): update calendar styles to adjust to dynamic width

* Date Input 🗓️ (#2641)

* feat(date-picker): date field component initialized

* chore(date-picker): date field renamed to date-input

* feat(date-picker): date input completed

* chore(date-input): commented code removed

* feat(avatar): support slots in AvatarGroup (#2669)

* feat: rename newPost to new (#2665)

* fix(avatar): spread getAvatarGroupCountProps in avatar count

* feat(avatar): support slots in avatarGroup

* feat(avatar): support classNames and add getAvatarGroupCountProps

* feat(docs): add classNames to avatar group

* feat(avatar): add CustomSlots in avatar group

* feat(changeset): support slots in avatar group

---------

Co-authored-by: winches <96854855+winchesHe@users.noreply.github.com>

* Date Picker Component 🗓️ (#2652)

* feat(date-picker): first iteration

* chore(date-picker): update date-picker README.md with improved description

* feat(date-picker): code organized, integration done

* fix(date-picker): min and max value + styles

* fix(date-picker): popover offset adn calendar styles

* feat(date-picker): stories added

* fix(date-picker): calendar width properly handled

* feat(date-picker): styles simplified

* chore(date-picker): almost all test passing

* fix(date-picker): test and styles

* chore(date-picker): calendar popover tests added

* fix(date-picker): props to be passed to the date-input

* TimeInput Component 🕒 (#2672)

* feat(time-input): time input added with some stories, tests and date-picker integration missing

* feat(time-input): tests added, date-picker integration added, missing stories added

* chore(react): missing packages added

* chore(time-input): fix stories names

* fix(time-input): time value type

* fix: date-picker visibleMonth width does not get widen enough (#2703)

* DateRangePicker Component 🗓️ (#2682)

* chore(date-range-picker): in progress

* chore(date-range-picker): in progress

* feat(date-input): components separated into multiple pieces to be able to implement the date range picker

* feat(date-range-picker): first version of it working

* chore(date-picker): hyphen symbol changed

* feat(date-range-picker): stories done

* fix(range-calendar): styles

* docs: Calendar & RangeCalendar (#2686)

* feat(docs): add calendar in routes.json

* feat(docs): refresh search-meta.json

* feat(docs): add calendar examples

* feat(docs): calendar content

* feat(deps): add @internationalized/date

* refactor(docs): remove div wrapper

* feat(docs): add calendar doc

* fix(docs): calendar presets

* fix(docs): preset styles

* chore(docs): remove calendar iframe examples

* refactor(docs): discard iframe in calendar doc

* fix(docs): incorrect DateValue import

* feat(docs): include @internationalized/date in live demo scope

* feat(docs): add presets description

* chore(docs): update search-meta.json

* fix(docs): remove DateValue

* feat(docs): include reactAriaI18n in react live demo scope

* fix(docs): presets import issue

* chore(docs): update search-meta.json

* feat(docs): add api reference for nextui provider

* fix(calendar): ixExpanded  typo

* feat(docs): add missing props & event

* chore(docs): update search-meta.json

* chore(docs): update route keywords

* chore(docs): revise value style add defaultFocusedValue

* chore(docs): remove padding and revise gap

* feat(docs): range calendar

* chore(docs): update search-meta.json

* feat(docs): add reactAriaHook

* fix(docs): incorrect component and add storybook and reactAriaHook

* fix(docs): incorrect import path

* chore(docs): reorder range calendar position in sidebar

* chore(Docs): remove custom styles & implementation

* chore(docs): remove last item from accessibility

* chore(docs): onValueChange -> onChange

* feat(docs): add ts example for range calendar

* chore(docs): remove unwanted content in range calendar

* feat(docs): add ts examples for calendar

* chore(docs): update import path

* chore(docs): update import path

* chore(docs): styles adjusted, routes updated

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* docs: TimeInput (#2698)

* feat(docs): add time input to routes.json

* feat(deps): add @internationalized/date

* feat(docs): add @internationalized/date and @react-aria/i18n to code demo scopes

* feat(docs): time input contetnt

* chore(docs): revise time input examples

* feat(docs): time input content

* chore(time-input): update description

* feat(docs): add ts examples in time-input

* chore(docs): revise TimeValue import

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* chore(date-picker): exports updated

* docs: DatePicker (#2700)

* docs: created the doc for datepicker and its examples

* docs: regenerate search-meta.json

* fix: reverted the unncessary change to Input component

* fix: fixed the component-link for date-picker

* fix: fixed the component-link for date-picker

* fix: added variants section to the doc

* fix: made adjustment to the explanations for the props of DatePicker comp

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* doc: DateInput (#2711)

* docs: created base examples and the document

* chore: created search-meta and follow-up fix for each date-input example cases

* fix: fixed some example components styles

* fix(docs): updated routes.json

* fix(docs): fixed typo in the docs

* fix: fixed the component-link for date-input

* fix: fixed the component-link for date-input

* fix: label-placements example flex style adjustment

* fix: added variants section to the doc

---------

Co-authored-by: HaRuki Kuriwada <haruki.kuriwada@hennge.com>
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* refactor(theme): units removed, tailwind-variants upgraded (#2713)

* fix(theme): units replaced by spacing

* fix(select): positioning the label if a description is used (#2553)

Co-authored-by: Poli Sour <polisour.work@gmail.com>

* Upgrade to new react aria version (#2561)

* chore(root): pkg upgraded

* fix: type error

* fix: build error

* chore: update packages from a~d

* chore: update packages from i~r

* chore: update packages from s~u

* chore: update core, hooks, and utilities packages

* feat: add support radio group validationBehavior props

* fix: validationBehavior default to native

* chore: add validationBehavior props in RadioGroup Stories

* fix: handling of errorMessage

* chore: add support validationBehavior autocomplete

* chore: partial support for validation of select

* chore: add support validationBehavior checkbox

* chore: change validationBehavior default to native

* Merge branch 'v.2.3.0' into feat/upgrade-react-aria

* fix: validation logic

* fix: add default value for autocomplete

* chore: add example using error message function

* chore: fixed error displayed in storybook

* chore: omit validationBehavior from component props

* chore: update docs and storybook on validate

* fix: pnpm-lock version

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* fix(core): build and date input / time input apis

* chore(date-picker): omit validation behavior

* chore(docs): add missing props to calendar and range calendar

* docs: add nextui-cli page (#2714)

* docs: add nextui-cli page

* docs: update search meta

* docs: typo

* docs: typo

* docs: typo

* feat(docs): cli docs done

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* chore(docs): add cli commands to installation docs

* fix(checkbox): prettier

* fix(docs): incorrect cli api references link

* doc: DateRangePicker (#2712)

* chore: created base for date-range-picker doc

* fix: added follow-up story examples to the doc

* fix: fixed bugs happening on the doc

* fix: fixed bugs happening on the doc

* fix(docs): incorrect file path and revise title

* fix: component examples style fixes

* fix: component presets typo fix

* refactor(core): date range picker docs completed, standaline date picker field fixed

---------

Co-authored-by: HaRuki Kuriwada <haruki.kuriwada@hennge.com>
Co-authored-by: աɨռɢӄաօռɢ <wingkwong.code@gmail.com>
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* fix: only two keyframes currently supported with spring and inertia animations (#2596)

* chore(deps): bump framer-motion

* feat(changeset): fixed framer motion issue

* chore(changeset): revise changeset message

* chore(deps): update pnpm-lock.yaml

* fix: react hook form issue (#2603)

* fix(input): pass domRef?.current?.value to controlled state

* fix(input): pass domRef?.current?.value to useTextField instead

* fix(checkbox): handle RHF case

* fix(checkbox): add missing isSelected case

* chore(checkbox): update ref type

* chore(deps): add @nextui-org/use-safe-layout-effect

* chore(deps): update pnpm-lock.yaml

* chore(deps): update pnpm-lock.yaml

* fix(select): handle RHF case

* chore(deps): add @nextui-org/use-safe-layout-effect to select

* fix(autocomplete): handle RHF case

* chore(deps): add @nextui-org/use-safe-layout-effect to autocomplete

* refactor(components): revise comments

* feat(changeset): react-hook-form uncontrolled components

* chore(deps): pnpm-lock.yaml

* fix(input): domRef.current.value has higher precedence

* fix(checkbox): set isChecked based on input ref checked

* feat(components): tabs component add tabPosition prop (#2398)

* feat(components): tabs component add tabPosition prop

* fix: review problem change

* test: add tabs position vertical test

* docs: update changeset

* fix(tabs): optimize return of tabs

* fix(tabs): rename orientation to placement

* fix(tabs): optimize description

* chore(docs): routes

* fix: isReadOnly in Autocomplete MDX (#2444)

* feat(autocomplete): add isReadOnly example

* fix(autocomplete): isReadOnly logic in Autocomplete

* feat(root): add changeset - fixed isReadOnly logic in Autocomplete

* chore(autocomplete component) isReadOnly property demo

isReadOnly property demo in website MDX for autocomplete component.

* Update apps/docs/content/docs/components/autocomplete.mdx

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

---------

Co-authored-by: աɨռɢӄաօռɢ <wingkwong.code@gmail.com>
Co-authored-by: Alpha <116849110+alpha-xek@users.noreply.github.com>
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* fix(select): only trigger setSelectedKeys when domRef.current.value is true (#2722)

* chore(docs): blog changes (#2724)

* chore(docs): blog changes

* feat(docs): blog improved

* chore(blog): draft param added

* chore: version changeset added

* feat(blog): v2.3.0 almost done

* chore(docs): tailwind colors updated, calendar overflow fixed

* chore(blog): add presets demo

* fix(calendar): overflow on windows

* chore(docs): improve popover placements demo

* fix(autocomplete): set shouldUseVirtualFocus to false in getListboxProps (#2731)

* chore(blog): add cotributors

* chore(blog): draft

---------

Co-authored-by: աӄա <wingkwong.code@gmail.com>
Co-authored-by: Shrinidhi Upadhyaya <shrinidhiupadhyaya1195@gmail.com>
Co-authored-by: shrinidhi.upadhyaya <shrinidhi.upadhyaya@stud.uni-bamberg.de>
Co-authored-by: winches <96854855+winchesHe@users.noreply.github.com>
Co-authored-by: HaRuki <soccer_haruki15@me.com>
Co-authored-by: HaRuki Kuriwada <haruki.kuriwada@hennge.com>
Co-authored-by: Poli Sour <57824881+novsource@users.noreply.github.com>
Co-authored-by: Poli Sour <polisour.work@gmail.com>
Co-authored-by: Ryo Matsukawa <76232929+ryo-manba@users.noreply.github.com>
Co-authored-by: winches <329487092@qq.com>
Co-authored-by: Alpha Xek <116849110+alphaxek@users.noreply.github.com>
Co-authored-by: Alpha <116849110+alpha-xek@users.noreply.github.com>
2024-04-16 09:25:51 -03:00
Mohammad Reza Badri aab1f19a96 fix(select): add RTL support to the select component (#2042) (#2485) 2024-04-15 21:22:03 -03:00
Mohammad Reza Badri 9873c6fb83 fix: handle RTL direction divider storybook (#2483) (#2484) 2024-04-15 21:21:15 -03:00
black197 af877f7ddb fix(use-autocomplete): overwrite onKeyDown to prevent meaningless error msg (#1909) (#2100) 2024-04-15 11:20:03 -03:00
աӄա 25640e42ff fix(autocomplete): incorrect prop name in getEmptyPopoverProps (#2716)
* fix(autocomplete): incorrect prop name in getEmptyPopoverProps

* chore(changeset): update changeset message
2024-04-15 11:07:56 -03:00
աӄա abf532b548 fix: selectedKeys are not present in the collection warning in async case (#2648)
* fix(hook): add AsyncLoadable & show warning after data is loaded

* fix(hooks): change isLoading default state to true

* refactor(hooks): move the logic to missingKeys

* refactor(changeset): rephrase changeset description
2024-04-14 16:37:27 -03:00
աӄա e458432550 fix(select): disabled select shouldn't get update by keyboard (#2649)
* fix(select): disable all keys for isDisabled case

* fix(select): add "disabled select shouldn't update by keyboard" test case

* refactor(select): remove unnecessary map
2024-04-14 16:35:07 -03:00
աӄա c2ef4c0935 chore(storybook): add missing AsyncFiltering story (#2566)
* feat(autocomplete): add AsyncFilteringTemplate

* chore(autocomplete): move SWCharacter out

* feat(changeset):  add missing AsyncFiltering story in Autocomplete

* chore(changeset): remove changeset since the change only impacts the story
2024-04-14 16:19:39 -03:00
աӄա a1c112431f refactor(autocomplete): remove unnecessary map after getting all collection key (#2654)
* refactor(components): remove unnecessary map

* feat(changeset): remove unnecessary map after getting all collection keys
2024-04-14 16:10:39 -03:00
u3u 4dd2605ac2 fix: remove conflicting transition utilities (#2677)
* fix: remove conflicting transition utilities

see: https://tailwindcss.com/docs/transition-property

* chore: add changeset

* fix: typo

* chore: remove comments
2024-04-14 12:57:17 -03:00
Junior Garcia dab0534095 chore(main): lock file updated 2024-04-14 11:40:32 -03:00
Junior Garcia 12bf410807 chore(docs): tailwindcss upgraded 2024-04-14 11:39:09 -03:00
winches 09504cd702 feat: add peerDep files in components.json and update theme peerDep (#2689) 2024-04-14 11:38:12 -03:00
աӄա 86a78c9b91 fix(autocomplete): empty items with allowCustomValue (#2674)
* feat(autocomplete): add & export getEmptyPopoverProps

* fix(autocomplete): avoid null node in `ariaHideOutside` from `@react-aria/overlays`

* feat(changeset): add changeset
2024-04-14 11:29:53 -03:00
Ryo Matsukawa feab3e6c1d fix: correct links in docs (#2708) 2024-04-14 11:28:21 -03:00
Ryo Matsukawa eb11a7731a fix(modal): input carry over with IMEs in modal forms (#2709)
* fix(modal): prevent IME input carryover in form fields when tabbing

* chore: add changeset

* chore: chain default onKeyDown
2024-04-14 09:51:43 -03:00
աӄա 2829d4afae fix(core): hsl rounding issue (#2702) 2024-04-13 12:30:51 -03:00
winches ebab10804c feat: rename newPost to new (#2665) 2024-04-07 13:03:52 -03:00
Bryson Tang 6da144f459 Update remix.mdx (#2638) 2024-04-04 13:10:48 -03:00
winches 6811ce52c3 feat: add style attribute in components.json (#2632) 2024-04-02 15:13:14 -03:00
աӄա 2e49e08315 fix: lazyMotion forwardRef issue (#2622)
* fix(ripple): lazyMotion forwardRef issue in Ripple

* feat(dropdown): add test case for LazyMotion React.forwardRef issue

* refactor(dropdown): revise the test title

* feat(modal): include console error check in modal test

* feat(popover): add "should not throw error when clicking trigger button" test

* feat(accordion): add test for lazy motion issue

* feat(navbar): add test for lazy motion issue

* feat(tabs): add test for lazy motion issue

* feat(tooltip): add test for lazy motion issue

* refactor(dropdown): remove unnecessary async

* refactor(test): move spy outside and trigger clearAllMocks after each test
2024-04-02 11:01:17 -03:00
աӄա a60c2d7b22 fix(hooks): handle numeric selectedKeys in Select (#2589) 2024-04-02 08:45:09 -03:00
աӄա c5049edfde fix(popover): unexpected props on a DOM element (#2522)
* fix(popover): handle isDisabled logic for elements without isDisabled props

* chore(popover): isDisabled not necessary in restProps

* chore(changset): handle isDisabled logic for elements without isDisabled props

* fix(popover): keep all the props but isDisabled for non nextui button

* refactor(popover): move isDisabled handling to getTriggerProps

* refactor(popover): get the popover trigger styles from theme instead

* feat(theme): add isDisabled styles in popover

* chore(changeset): add patch to @nextui-org/theme

* refactor(popover): avoid re-instantiate popover styles

* fix(popover): apply filterDOMProps in popover trigger

* fix(popover): avoid conflicts with tooltip isDisabled

* chore(core): add isNextUIEl function to check if a component is a NextUI component

* chore(changeset): add system-rsc and revise message

* feat(dropdown): add tests for custom trigger with isDisabled

* fix(dropdown): incorrect User import path

* feat(dropdown): revise User and add mockRestore

* fix(dropdown): revise user import path

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-04-01 22:33:26 -03:00
Tsuki 410e30c720 Add bun as package manager eng 581 (#2625)
* feat: add bun social icon

* chore: add bun to package-managers.tsx

* chore: add bun to installation.mdx
2024-04-01 15:29:03 -03:00
Hyden Liu 82a9fd9bc4 chore: fix typo (#2583) 2024-04-01 14:52:40 -03:00
աӄա ef6ea6c1ff fix(checkbox): incorrect onChange typing in Checkbox Group (#2595)
* fix(checkbox): incorrect onChange typing in Checkbox Group

* fix(checkbox): remove onChange from Props instead
2024-04-01 14:50:11 -03:00
Junior Garcia c188e4d628 chore(badge): remove unused import statement in badge.tsx (#2619) 2024-03-31 15:32:21 -03:00
աӄա a597c82a9c fix(image): className in image blurred example (#2540) 2024-03-31 15:17:33 -03:00
աӄա 0359bf3084 fix(skeleton): fixed missing disableAnimation behavior in skeleton (#2538) 2024-03-31 15:17:02 -03:00
աӄա eb51bf2261 fix: incorrect level of m.div (#2616)
* fix(modal): incorrect level of m.div

* fix(popover): incorrect level of m.div

* feat(changeset): fixed incorrect level of m.div

* fix(modal): remove forwardProps in RemoveScroll

* fix(popover): remove forwardProps in RemoveScroll
2024-03-31 12:16:48 -03:00
winches b14067bb94 feat: add component meta data (#2590)
* feat: add component meta data

* feat: add component meta data

* feat: add description and status component data

* fix: review problem
2024-03-31 11:56:28 -03:00
աӄա 8761168d34 fix: lazy motion forward ref issue (#2611)
* fix(modal): lazy motion forward ref issue

* fix(popover): lazy motion forward ref issue

* feat(changeset): fixed lazy motion forwardRef issue
2024-03-30 15:03:54 -03:00
Sagar Joshi cf0d4e471e Update override-styles.mdx (#2588) 2024-03-26 07:37:52 -03:00
HaRuki 2aa476455f fix(docs): some user links in support us section led to 404 pages (#2576) 2024-03-24 18:42:46 -03:00
winches ee7a819147 fix: recycle import error (#2568) 2024-03-22 15:49:33 -03:00
codeesura fb0625470f Sort 'Space' Type Values in Ascending Order (#2545)
Reordered `Space` type values to a logical ascending sequence (0.5, 1, 1.5, etc.) for improved readability and consistency. No functional impact on the code.
2024-03-21 13:06:43 -03:00
աӄա 2b9f89023a fix: revise shouldCloseOnInteractOutside for FreeSoloPopover (#2536)
* fix(select): set undefined to shouldCloseOnInteractOutside in select

* fix(select): set false to shouldCloseOnInteractOutside in autocomplete

* fix(popover): take shouldCloseOnInteractOutside from props

* chore(changeset):  revise shouldCloseOnInteractOutside for FreeSoloPopover

* feat(select): add test cases to select

* feat(select): assert that the select is open after click

* feat(autocomplete): add test cases to autocomplete

* feat(select): assert that the select is open after click
2024-03-21 13:04:59 -03:00
Denish Navadiya 26a3a7d2c6 chore(badge): Remove unnecessary type (#2541)
* chore(badge): Remove unnecessary type

I suggest removing the `children` type from BadgeProps, as the already extended UseBadgeProps has a `children` prop.

* Create three-tools-whisper.md

* Update three-tools-whisper.md
2024-03-21 13:02:36 -03:00
աӄա 888d861841 fix(select): isFilled & hasValue logic for state.selectedItems (#2556)
* fix(select): isFilled logic for state.selectedItems

* fix(select): handle hasValue case and return boolean type

* chore(changeset): include hasValue case as well
2024-03-21 12:54:40 -03:00
Orion Railean 0973cd9bff docs(snippet): fix grammatical error (#2557) 2024-03-21 12:53:03 -03:00
Junior Garcia e67b3af223 chore(root): remove beano subproject 2024-03-15 22:58:28 -03:00
Mohammad Reza Badri 52dafd08f1 fix(input): resolve RTL support (#2315) (#2316)
* fix(input): resolve RTL support (#2315)

* fix: add changeset

* fix: add changeset for rtl input

* fix: convert changeset rtl input to ptach
2024-03-15 22:52:35 -03:00
Frozen FIsh ceeb52363d feat(docs): Integrate kapaai (#2428)
* test(docs): test kapa.ai script

* feat(docs): add script-providers.tsx

* refactor(docs): update layout.tsx

* chore(docs): update script-providers.tsx

* refactor(docs): update layout.tsx
2024-03-15 22:48:34 -03:00
Mohammad Reza Badri 0d9ea4925b fix(kbd): add RTL support to the kbd component (#2481) (#2482) 2024-03-15 22:46:09 -03:00
Alpha Xek ea48ac2d08 feat(table spinner): Fixed Spinner without emptyContent prop in Table (#2500)
* feat(table spinner): spinner without emptyContent

Fixed Spinner loading on top of columns in case of emptyContent prop not passed.

* Update .changeset/nice-rockets-watch.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(table spinner): changeset fix

* fix(table spinner): changeset description fix

---------

Co-authored-by: Alpha <116849110+alpha-xek@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-03-15 22:43:59 -03:00
Alpha Xek b0ee8e3fc2 fix(disabled table rows): fixed cursor for disabled rows in Table (#2502)
* fix(disabled table rows): fixed cursor for disabled rows

Fixed cursor for disabled rows in Table rows .

* fix(disabled table rows): changeset fix

---------

Co-authored-by: Alpha <116849110+alpha-xek@users.noreply.github.com>
2024-03-15 22:40:17 -03:00
Mohammad Reza Badri 5d84634c0a fix: add RTL support to the avatar group component (#2498) 2024-03-15 22:39:44 -03:00
HaRuki 9496ab57c5 fix(docs): listbox with description (#2513) 2024-03-15 22:37:50 -03:00
Alpha Xek 5ea479f6c4 fix(table striped): isStriped prop fix for multiple computed values in td (#2509)
* fix(table striped): multiple computed values in `td`

Fixed `Table` rendering the contents of the cell beneath the stripe for the multiple computed values

* fix(table striped): multiple computed values in `td`

* fix(table striped): changeset fix

* fix(table striped): changeset description enhancement

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: Alpha <116849110+alpha-xek@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-03-15 09:20:36 -03:00
աӄա cda881799c fix(docs): remove non-existing triggerType props in Tooltip (#2520) 2024-03-15 09:14:37 -03:00
աӄա 707a61de4c fix(navbar): lazy motion forwardRef issue (#2527) 2024-03-15 09:01:13 -03:00
Bruno Kraychete da Costa 5a8768a4b2 fix(table): hide empty content if isLoading is true (#2470) (#2491)
Avoid displaying loadingContent and emptyContent at the same time.
Note that there's an existing issue with loadingContent where if
emptyContent is not provided, it will render loadingContent on top of
the columns (instead of inside the table). This change doesn't fix that,
but rather make isLoading play nice with a provided emptyContent. A
separate fix is still needed for when emptyContent is not provided, which
may affect this change later.
2024-03-10 10:53:02 -03:00
Junior Garcia a25292215a chore(root): add coderabbit setup (#2495) 2024-03-10 10:51:32 -03:00
աӄա a05aef0acb fix(components): popover closing issue in autocomplete with open modal (#2494)
* fix(components): set shouldCloseOnInteractOutside to false for FreeSoloPopover

* feat(changeset): fixed popover closing issue in autocomplete with open modal
2024-03-10 10:37:55 -03:00
Dominik K 2894aecca1 Remove unused framer motion features (#2464)
* fix: remove unused framer motion features

* fix: add changeset

* fix: non working tabs animation

* fix: remove unchanged changeset

* fix: move to patch
2024-03-08 11:43:14 -03:00
Mohammad Reza Badri a702bb869d Add RTL support to the switch component (#2468)
* fix: add RTL support to the switch component

* fix: convert changeset rtl switch to ptach
2024-03-08 11:32:55 -03:00
Mohammad Reza Badri 0443ec1c87 fix: add RTL support to the modal component (#2472) 2024-03-08 11:30:16 -03:00
աӄա 7263daca08 fix(autocomplete): support isReadOnly for dynamic collections in Autocomplete (#2458) 2024-03-08 11:22:45 -03:00
Mohammad Reza Badri e4b3c7d1a1 fix: issue on RTL support checkbox component (#2466)
* fix: issue on RTL support checkbox component

* fix: delete extra file

* fix: adjust the changeset for rtl checkbox

* fix: convert changeset rtl checkbox to ptach
2024-03-08 11:16:18 -03:00
Mohammad Reza Badri a686262009 fix: add RTL support to the modal component (#2469) 2024-03-07 20:53:47 -03:00
ImFirstPlace f373400102 Fix capital city of Australia (#2431) 2024-03-07 10:09:46 -03:00
Ryo Matsukawa 2c3be59dfb fix(accordion): remove dividers from hidden accordion items (#2219)
* fix: remove dividers from hidden accordion items

* Create slimy-panthers-swim.md
2024-03-07 10:07:58 -03:00
Junior Garcia 798e84e729 Revert "feat(calendar): initial structure"
This reverts commit 139b28437b.
2024-03-05 23:33:22 -03:00
Junior Garcia 139b28437b feat(calendar): initial structure 2024-03-05 23:30:37 -03:00
Alpha Xek f2205642f4 chore(pnpmlock script): rimraf for windows support (#2454) 2024-03-05 19:56:42 -03:00
black197 0a10de8d08 Fix(tooltip): allow non-ReactElement children (#2079)
* fix(tooltip): accept non-ReactElement as children

* chore: changeset
2024-03-05 16:33:10 -03:00
աӄա bae544d198 fix: isReadOnly in Autocomplete (#2429)
* feat(autocomplete): add isReadOnly example

* fix(autocomplete): isReadOnly logic in Autocomplete

* feat(root): add changeset - fixed isReadOnly logic in Autocomplete

* chore(stories): set isClearable to false

* fix(autocomplete): revise isClearable logic
2024-03-05 16:15:20 -03:00
Junior Garcia feafb36fcc Fix/dropdown disabled state (#2452)
* fix(popover): dropdown behavior on disabled state and update popover trigger props

* chore(dropdown): add DisabledTrigger story to dropdown.stories.tsx
2024-03-05 16:14:19 -03:00
աӄա 65f48135d6 fix(stories): link anchor typo (#2447) 2024-03-05 09:53:04 -03:00
Alpha Xek 1d32bf8f1e rimraf to support in windows (#2443)
replace `rm` with rimraf while deleting node_modules during `pnpm clean` to support in both Windows and Linux.
2024-03-05 09:52:40 -03:00
աӄա 0a9982d3ef fix(dropdown): getMenuTriggerProps mergeProps (#2450)
* fix(dropdown): getMenuTriggerProps mergeProps

* feat(changeset): fixed getMenuTriggerProps mergeProps

* refactor(dropdown): use isDisabled directly

* chore(changeset): correct issue number
2024-03-05 08:58:01 -03:00
աӄա f864dc3974 fix(utils): include enterKeyHint in dom-props (#2437) 2024-03-04 13:12:26 -03:00
github-actions[bot] 3a0f2c5610 ci(changesets): version packages (#2029)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2024-03-03 20:54:23 -03:00
Junior Garcia a030680e6a chore(root): fix changeset versions 2024-03-03 20:38:38 -03:00
HaRuki e12f3faa81 fix(components): autocomplete, tabIndex is not passed on input (#2375)
* fix(components): autocomplete, tabIndex is not passed on input

* fix(components): autocomplete, tabIndex is not passed on input

* Update metal-gorillas-dress.md
2024-03-03 20:37:11 -03:00
HaRuki 2dc5adb6e0 docs(components): accordion controlled example shows errors (#2339)
* docs(components): accordion controlled example shows errors

* docs(components): accordion controlled example shows errors

* docs(components): accordion controlled example shows errors
2024-03-03 20:36:55 -03:00
HaRuki f63b20c59d fix(components): accordion component throws "validateDOMNesting" erro… (#2169)
* fix(components): accordion component throws "validateDOMNesting" error on the storybook

* fix(components): accordion component throws "validateDOMNesting" error on the storybook

* fix(components): accordion component throws "validateDOMNesting" error on the storybook

* fix(components): accordion component throws "validateDOMNesting" error on the storybook

* fix(docs): accordion component throws "validateDOMNesting" error on the storybook
2024-03-03 20:36:05 -03:00
kght6123 0df5099a62 docs(components): fixed Custom Implementation sample for button component missing onClear type (#2256) 2024-03-03 18:36:41 -03:00
Robin cdc4981508 docs(autocomplete): fix missing defaultItems property (#2185) 2024-03-03 18:34:05 -03:00
Kinfe Michael Tariku acee3c2fda fix: dup // fix on a link for edit this page on github (#2237) 2024-03-03 18:28:41 -03:00
Ryo Matsukawa fa72bb45cc fix: update dev script to only run pnpm sb (#2218) 2024-03-03 18:26:58 -03:00
Aruelius.L 265c121d65 fix: Invalid command (#2201) 2024-03-03 18:26:09 -03:00
nitipat.rstw d6b42f757a fix: added missing ChipProps import (#2205) 2024-03-03 18:16:08 -03:00
Frozen FIsh d8b0ef528b fix: won't display warning in when placeholder (#2346) (#2377)
* fix: won't display warning in when placeholder (#2346)

* chore: update use-multiselect-list-state.ts

* chore: add change log
2024-03-03 18:09:21 -03:00
Frozen FIsh e83595e06f fix(chip): avoid chip malformed (#2350) (#2379)
* fix(chip): add min width avoid chip malformed(#2350)

* chore: add change log

* fix(chip): fix isOneChar compound variants avoid chip malformed(#2350)

* chore: update change log
2024-03-03 17:53:47 -03:00
HaRuki 141887d38c fix(theme): chip with dot variant is not properly padded when having a 1-char text (#2387) 2024-03-03 17:45:55 -03:00
u3u a235e324b9 feat: add updatePositionDeps prop to popover component (#2390) 2024-03-03 17:44:30 -03:00
HaRuki 9b27da544e fix(components): isdisabled does not disable dropdown (#2435) 2024-03-03 17:30:27 -03:00
Junior Garcia 5528ccd042 Fix/sidebar and pro banner space (#2438)
* feat(utils): add featurebase utils

* feat(config): add changelog, feedback and roadmap routes

* feat(app): add featurebase script

* feat(docs): add NEXT_PUBLIC_FB_FEEDBACK_URL

* feat(featurebase): add featurebase components

* feat(components): add featurebase components to navbar

* feat(components): add featurebase components to sidebar

* chore(config): remove changelog and feedback at this moment

* fix(components): fb-roadmap-link styles

* chore(components): hide feedback and changelog at this moment

* feat(docs): add NEXT_PUBLIC_FB_FEEDBACK_ORG

* feat(featurebase): add trackEvent & revise props

* fix(sidebar): remove opacity classes from TreeItem component

* fix(docs): pro banner margin

---------

Co-authored-by: աɨռɢӄաօռɢ <wingkwong.code@gmail.com>
2024-03-03 16:32:29 -03:00
աӄա 4957f56e86 feat: featurebase integration (#2425)
* feat(utils): add featurebase utils

* feat(config): add changelog, feedback and roadmap routes

* feat(app): add featurebase script

* feat(docs): add NEXT_PUBLIC_FB_FEEDBACK_URL

* feat(featurebase): add featurebase components

* feat(components): add featurebase components to navbar

* feat(components): add featurebase components to sidebar

* chore(config): remove changelog and feedback at this moment

* fix(components): fb-roadmap-link styles

* chore(components): hide feedback and changelog at this moment

* feat(docs): add NEXT_PUBLIC_FB_FEEDBACK_ORG

* feat(featurebase): add trackEvent & revise props
2024-03-03 16:20:40 -03:00
Mark Wilson fa27bccb37 fix: #2382 typo in modal transition CSS variable access (#2426) 2024-03-01 18:46:05 -03:00
HaRuki 0cc8c79c53 docs(components): type error on tab components (#2416) 2024-02-29 11:44:29 -03:00
աӄա 5be104f72d fix(hooks): incorrect attribute names in clearOverflow (#2050)
* fix(hooks): incorrect attribute names in clearOverflow

* feat(root): add changeset for "incorrect attribute names in clearOverflow"
2024-02-27 11:33:26 -03:00
աӄա dc289fb59b fix(docs): keep navbar layout consistent (#2412) 2024-02-27 11:32:46 -03:00
աӄա 0ce10269c2 fix(components): incorrect strokeWidth (#2410)
* fix(components): incorrect strokeWidth

* feat(changeset): incorrect strokeWidth in circular progress
2024-02-27 11:31:38 -03:00
աӄա cd3b80974c fix: sematic typos (#2408)
* fix(docs): sematic -> semantic

* fix(stories): sematic -> semantic
2024-02-27 11:30:55 -03:00
աӄա dc91ab8bc9 fix(docs): accordion itemClasses (#2406) 2024-02-27 11:30:33 -03:00
աӄա dec7d411b5 fix: pagination RTL (#2393)
* fix(components): handle RTL in onNext and onPrevious in use-pagination.ts

* fix(components): invert forward icon for RTL

* fix(hooks): invert pagination logic for RTL

* chore(root): add changeset for pagination RTL change

* fix(hooks): add isRTL to hook dependency

* fix(components): add isRTL to hook dependency

* fix(components): incorrect isDisabled logic

* refactor(hooks): remove isRTL dependency from paginationRange

* chore(deps): add @react-aria/i18n
2024-02-27 11:29:54 -03:00
աӄա 37bed2368e fix(components): rtl styles in toggle (#2392)
* fix(components): rtl styles in toggle

* chore(root): add changeset for switcher rtl issue
2024-02-27 11:28:41 -03:00
Frozen FIsh 755a835fa7 fix(docs): update introduction.mdx replace p tag to div to avoid p tag nested p tag (#2388) (#2389) 2024-02-26 22:20:33 -03:00
Shibani Dcosta 6f27b048d0 Fixed Typo (#2400) 2024-02-23 09:08:07 -05:00
Mohit Chandel dc9362f959 Fix: Added few missing imports (#2401) 2024-02-23 07:24:55 -05:00
Prakash Choudhary e6f36281cb fix(components): number input label #2268 fixed (#2274)
* fix(components): number input label #2268 fixed

* fix(component): comments resolved

* fix(component): format with prettier

---------

Co-authored-by: Prakash Choudhary <prakashchoudhary@Prakashs-iMac.local>
2024-02-21 23:12:44 -05:00
Ryo Matsukawa f75174d07e docs(modal): update documentation to include dismiss properties (#2217) 2024-02-21 23:12:24 -05:00
lalalazero ac0e564b34 fix(docs): development setup in CONTRIBUTEING.md (#1673) 2024-02-21 23:06:46 -05:00
աӄա 60e453d265 fix(docs): typos (#2373) 2024-02-18 01:57:41 -03:00
Anthony Whitford 6e5ba692db Added note for installing React. (#2369) 2024-02-17 15:12:33 -03:00
աӄա e4ba43b4e3 fix(components): input label overlapping issue (#2371)
* fix(components): input label overlapping issue

* chore(root): add changeset for input overlapping issue
2024-02-17 15:10:12 -03:00
Mehmet Akifhan ILGAZ 995b37e2eb Update spinner.mdx (#2355)
Fix labelColor description
2024-02-14 17:15:06 -03:00
Frozen FIsh 3be8c621a1 chore: typo (#2353) 2024-02-14 17:14:40 -03:00
Ali Idrizi 0b5cde7bc4 fix(spinner): pass classNames.label to slot (#2325) 2024-02-12 21:37:57 -03:00
HaRuki a4cab30df3 docs(components): tooltip delays inverted (#2338) 2024-02-12 21:13:51 -03:00
HaRuki 9ff61b5d54 docs(components): table component link for storybook does not work (#2342) 2024-02-12 21:08:40 -03:00
HaRuki 7a3015c497 docs(components): tabs component link for storybook does not work (#2344) 2024-02-12 21:08:15 -03:00
Frozen FIsh 2106d987f2 fix: plop template error (#2333)
* chore: replace wrong script

* fix: plop templates
2024-02-11 10:34:09 -03:00
Frozen FIsh 2934a90d41 chore(storybook): improve preview.tsx (#2332) 2024-02-11 10:26:40 -03:00
HaRuki 39714775c7 docs(components): radioGroup component link for Storybook does not work (#2335) 2024-02-11 10:19:27 -03:00
Junior Garcia 07372eaa65 Merge branch 'main' of github.com:nextui-org/nextui 2024-02-11 09:33:54 -03:00
Junior Garcia dedd42c288 fix(docs): remove pro banner on examples routes 2024-02-11 09:33:37 -03:00
kght6123 f28e93d940 docs(components): #2236 [FIX] - Duplicate table disableAnimation prop description (#2246) 2024-02-08 10:25:43 -03:00
Stephan Schuto 0ad6e033f8 fix(docs): autocomplete typo (#2252) 2024-02-08 10:23:41 -03:00
navedqb fb0707087c fix missing imports in navbar (#2281) 2024-02-08 10:21:09 -03:00
André Vital d953a22b99 docs(modal): update documentation's default backdrop value (#2285) 2024-02-08 10:20:27 -03:00
Simon He 077c19506f docs: typo (#2294) 2024-02-08 10:19:40 -03:00
Simon He 6ca97c0bd6 docs(checkboxGroup): add attribute label (#2295) 2024-02-08 10:18:16 -03:00
Alexander Densley 5c8f21a106 docs: dix typo in table docs (#2319) 2024-02-08 10:14:11 -03:00
Junior Garcia decf11d270 fix(banner): z-index fixed 2024-02-07 23:07:48 -03:00
Junior Garcia fff248a30b chore(docs): update pro banner link href URLs 2024-02-04 21:54:37 -03:00
Junior Garcia 4996d9fb36 chore(docs): codeblock event removed, text sizes increased 2024-02-03 15:26:34 -03:00
Junior Garcia a5d7fcff0e chore(docs): pro banner text improved 2024-02-03 15:18:01 -03:00
Junior Garcia e8f5699fe2 fix(docs): pro banner on mobile 2024-02-02 21:09:55 -03:00
Junior Garcia a343e8e2ce Chore/add pro banner (#2309)
* chore(docs): add nextui pro banner

* chore(docs): add analytics

* fix(docs): banner
2024-02-02 17:26:57 -03:00
Junior Garcia a95e06acf2 Chore/add pro banner (#2308)
* chore(docs): add nextui pro banner

* chore(docs): add analytics
2024-02-02 17:15:04 -03:00
Junior Garcia 22f2665b00 chore(docs): add SponsorItem component and update sponsors list 2024-01-05 18:38:17 -03:00
Junior Garcia 921746f284 chore(docs): env var added to enable/disable va tracking events 2023-12-26 17:14:29 -03:00
Robin 132efbcb6d docs(modal): fix radius property (#2156) 2023-12-23 12:41:31 -03:00
Friedemann Sommer bea1e1fde8 components/tooltip replace "useLayoutEffect" with "useSafeLayoutEffect" (#2021) 2023-12-23 12:40:19 -03:00
Robin 95ffa64d41 docs(accordion): fix typo (#2133) 2023-12-16 12:36:00 -03:00
Junior Garcia e551226ff2 Refactor/add sponsors section (#2132)
* chore(docs): sponsor structure added

* feat(docs): top sponsors section added
2023-12-13 16:25:04 -03:00
Pranshu Gupta f3d0d6dded Update demo-code-modal.tsx (#2088) 2023-12-04 09:48:42 -03:00
աӄա 1c77b33e82 fix: broken contributing md links (#2048)
* chore(root): rename to CONTRIBUTING.md

* fix(core): broken CONTRIBUTING.md link

* fix(root): broken CONTRIBUTING.md link

* fix(docs): broken CONTRIBUTING.md link
2023-11-28 10:29:56 -03:00
Luther Tchofo Safo 0d7a19693b Update introduction.mdx (3) (#2046)
Typos. (Actually stinking to "PRs" instead of "PR's". The grammatical format present in examples such as L's and W's is expected because it's only one letter, but does not seem to apply to multiple letters combined.
2023-11-27 11:17:29 -03:00
Junior Garcia 01aedcf09b fix(popover): isDismissable prop passed to aria popover hook (#2032) 2023-11-24 09:46:51 -03:00
Junior Garcia 436ba1cd84 fix(input): clearable feature (#2031) 2023-11-24 09:35:49 -03:00
Junior Garcia 0ba165f0fd fix(input): label placement outside when label is missing (#2028) 2023-11-24 09:20:39 -03:00
Siddhesh Thadeshwar 088af8b6df Fix Autocomplete & Select docs with correct reference to disableSelectorIconRotation (#1990) 2023-11-19 20:09:38 -03:00
Junior Garcia 6951e262e5 fix(scroll-shadow): typo in scroll-shadow.stories.tsx (#1982) 2023-11-15 09:52:01 -03:00
nanwy 51c54f118f fix(docs): wrong tooltip classNames type (#1960)
In version 2.2.0, the classNames prop for tooltips is not of type Record<"base"|"arrow", string>, it should be of type Record<"base"|"content", string>.
2023-11-15 09:42:07 -03:00
Simon He 11fc733b36 docs(listbox): fix ListboxSection Props typo (#1962) 2023-11-15 09:41:40 -03:00
Junior Garcia a8dc5b429a chore(docs): nextui inc added to the footer 2023-11-12 11:24:21 -03:00
github-actions[bot] 12cebcfdac ci(changesets): version packages (#1940)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-11-10 10:09:54 -03:00
Junior Garcia 0fb2160899 Merge branch 'main' of github.com:nextui-org/nextui 2023-11-10 10:09:26 -03:00
Junior Garcia 09380c5b06 chore(docs): textarea without autoszie example added 2023-11-10 10:09:08 -03:00
Junior Garcia 0f5cce5d62 fix(progress): tv function refactored (#1951) 2023-11-10 10:00:25 -03:00
Junior Garcia 64c89bc57d fix(tabs): selected key prop duplicated type removed (#1947) 2023-11-10 09:16:00 -03:00
Junior Garcia 467383b8a2 fix(switch): element type (#1949) 2023-11-10 09:06:49 -03:00
Junior Garcia aab1dbf77c Fix/autocomplete ref (#1948)
* fix(tabs): selected key prop duplicated type removed

* fix(autocomplete): reference aims to input

* chore(autocomplete): changeset
2023-11-10 09:03:49 -03:00
Junior Garcia 36775dceee fix(navbar): style prop (#1946) 2023-11-10 08:23:15 -03:00
Pradyumna Banakar 8628ba04a7 docs(breadcrumb): fix typo (#1943) 2023-11-10 07:16:00 -03:00
Junior Garcia a978687b07 fix(system): add "size" prop to HTMLNextUIProps (#1936) 2023-11-09 13:57:20 -03:00
github-actions[bot] 57cafa06d0 ci(changesets): version packages (#1929)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-11-08 12:28:39 -03:00
Junior Garcia d2bd008ba3 chore(textarea): refactor Textarea component props and add (#1928)
hasHelper prop
2023-11-08 12:16:41 -03:00
github-actions[bot] 2f87b8d644 ci(changesets): version packages (#1924)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-11-08 11:29:59 -03:00
Junior Garcia 6ecdc278ab fix(system): extend variants fuction adapted (#1927) 2023-11-08 11:15:10 -03:00
Junior Garcia 9189b3fbf2 fix(textarea): styles issues and start/end content props added (#1923)
* fix(textarea): styles issues and start/end content props added

* chore(textarea): multiple rows prop renamed
2023-11-08 10:33:00 -03:00
github-actions[bot] 1149345cae ci(changesets): version packages (#1916)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-11-07 10:35:29 -03:00
Junior Garcia 135cc21e6f fix(menu): add hideSelectedIcon prop to menu and listbox (#1915)
sections
2023-11-07 10:16:02 -03:00
Junior Garcia 7f6218b978 fix(select): multiline styles (#1914) 2023-11-07 10:06:35 -03:00
github-actions[bot] 0eb9f1e3fe ci(changesets): version packages (#1903)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-11-06 17:12:38 -03:00
Junior Garcia 11ef4365da refactor(theme): update input and select component styles (#1905) 2023-11-06 17:00:38 -03:00
Junior Garcia 85a820eeff fix(autocomplete): endContent prop (#1902) 2023-11-06 16:25:00 -03:00
Junior Garcia 6a6d426b10 fix(input): label position and styles (#1901)
* fix(input): label position and styles

* fix(textarea): invalid state
2023-11-06 15:45:05 -03:00
github-actions[bot] a3cbb5997b ci(changesets): version packages (#1878)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-11-06 08:39:24 -03:00
Junior Garcia a5cc42bf80 refactor(docs): routing and add folder routes (#1892)
* refactor(docs): routing and add folder routes

* chore(docs): permanent redirect enabled
2023-11-06 08:22:03 -03:00
Junior Garcia e728a8967b fix(theme): update input and select styling and add data attribute for (#1891)
value
2023-11-06 08:20:02 -03:00
Junior Garcia acba2cf8f5 Fix/input select helper position (#1884)
* fix(input): fix input and select component styles

* chore(root): changeset
2023-11-05 20:00:48 -03:00
Junior Garcia 049db57bb2 fix(docs): fix typo in routing guide link 2023-11-05 18:47:49 -03:00
Dawson 5296d9b84d Typo fix (#1882) 2023-11-05 18:45:24 -03:00
Simon He 1619a35cf9 docs(pagination): fix dotsJump type 2023-11-05 12:20:47 -03:00
Simon He 8106629dab docs(radio-group): fix typo 2023-11-05 12:19:44 -03:00
Junior Garcia d55f52cc35 Merge pull request #1877 from nextui-org/fix/changeset-peer-deps-config 2023-11-05 10:57:39 -03:00
Junior Garcia 78198c32be Merge branch 'main' of github.com:nextui-org/nextui into fix/changeset-peer-deps-config 2023-11-05 10:44:00 -03:00
Junior Garcia 71807e8831 chore(theme): changeset 2023-11-05 10:43:37 -03:00
Junior Garcia 9af6174dcf refactor(theme): refactor theme plugin to improve performance and
readability
2023-11-05 10:43:37 -03:00
Junior Garcia 1a129db6fe chore: merge branch main 2023-11-05 10:30:55 -03:00
Junior Garcia 44ed1056e7 chore(root): changeset added 2023-11-05 10:24:48 -03:00
Junior Garcia db0e26a003 ci(changesets): version packages 2023-11-05 10:02:18 -03:00
Junior Garcia 38af48faf5 fix(core): update peer dependencies for several packages 2023-11-05 09:53:57 -03:00
Junior Garcia 5b60840751 chore(root): main conflicts merge fixed 2023-11-05 09:28:58 -03:00
Junior Garcia 4c56839db0 fix(root): changeset message 2023-11-05 09:27:56 -03:00
Junior Garcia ef61a3fe09 Revert "fix(root): peer dependecies update only when out of range"
This reverts commit bc4927c901.
2023-11-05 09:25:52 -03:00
Junior Garcia bc4927c901 fix(root): peer dependecies update only when out of range 2023-11-05 09:23:28 -03:00
Junior Garcia 4191feab2a fix(docs): update hoverOpacity in layout theme 2023-11-05 09:03:39 -03:00
Junior Garcia fe8647bd1d fix(docs): router import added to the routing next.js app docs 2023-11-05 08:59:16 -03:00
Junior Garcia 23992572ea fix(select): add button component and update select component 2023-11-05 08:52:33 -03:00
Junior Garcia e7a4711d9b ci(changesets): version packages 2023-11-04 16:44:59 -03:00
Junior Garcia e84158db62 chore: changeset 2023-11-04 16:38:57 -03:00
Junior Garcia f59e8f6bac fix(select): without label and input helperWrapper relative 2023-11-04 16:38:57 -03:00
Junior Garcia 73dfb7fc93 feat(docs): add package manager selection and usehooks-ts
dependency
2023-11-04 10:17:00 -03:00
Junior Garcia df9f6f5f58 ci(changesets): version packages 2023-11-03 19:38:47 -03:00
Junior Garcia 1fd5049f5a fix(select): multiline label (#1865) 2023-11-03 19:28:23 -03:00
Junior Garcia a386e1cadd chore(blog): card body padding change added 2023-11-03 17:08:03 -03:00
Junior Garcia 3172a803e3 feat(docs): blog post announcement added to mobile resolutions 2023-11-03 16:55:43 -03:00
Junior Garcia dfc8bdc7af chore(docs): v2.2.0 post date fixed, search meta updated 2023-11-03 16:48:25 -03:00
Junior Garcia 67ce4beb28 Feat/v2 blog (#1858)
* feat: Slider Component (#1686)

* feat(slider): initial structure

* chore(slider): readme improved

* fix: fixed border color of slider track

* docs: added range story

* feat: added rtl support to slider

* feat: improved value label formatting

* feat: refactor styling and add colors support to slider

* chore: improved thumb color

* docs: improved slider stories

* chore(slider): default color changed by foreground

* Update packages/core/theme/src/components/slider.ts

Co-authored-by: Jakob Guddas <github@jguddas.de>

* feat: added fillOffset prop

* Update packages/components/slider/src/use-slider.ts

* fix(slider): animation

* Update packages/components/slider/src/use-slider.ts

* Update packages/core/theme/src/components/slider.ts

* feat: slider steps

* refactor: renamed variables

* feat: improved slider step styling

* fix: hide infinite steps

* fix: fixed step transparency issue

* fix: fixed thumb focus issue

* Update packages/components/slider/src/use-slider.ts

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* feat(slider): vertical orientation added, start & end content, bug fixes

* chore(slider): tests added

* fix(docs): scrollbar added to the sidebar (#1743)

* feat(slider): marks added

* chore(slider): example ts-doc changed

* feat(slider): vertical marks support

* feat(core): slider tooltip support added, popover modified (#1746)

* Feat/slider custom styles (#1751)

* feat(slider): custom styles story added

* fix(slider): custom styles on different sizes

* Fix/slider tooltip android position (#1753)

* feat(slider): custom styles story added

* fix(slider): tooltip update position dependecies added

* fix(popover): arrow placements improved

* feat(slider): docs started, custom thumb and custom output stories added

* feat(slider): render function added to custom render the slider parts

* feat(slider): docs in progress, new properties and examples added

* fix(slider): some issues fixed, output renamed to value, documentation improved

* feat(slider): docs done

* chore: changeset

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>

* Client side routing (#1764)

* feat(slider): initial structure

* chore(slider): readme improved

* fix: fixed border color of slider track

* docs: added range story

* feat: added rtl support to slider

* feat: improved value label formatting

* feat: refactor styling and add colors support to slider

* chore: improved thumb color

* docs: improved slider stories

* chore(slider): default color changed by foreground

* Update packages/core/theme/src/components/slider.ts

Co-authored-by: Jakob Guddas <github@jguddas.de>

* feat: added fillOffset prop

* Update packages/components/slider/src/use-slider.ts

* fix(slider): animation

* Update packages/components/slider/src/use-slider.ts

* Update packages/core/theme/src/components/slider.ts

* feat: slider steps

* refactor: renamed variables

* feat: improved slider step styling

* fix: hide infinite steps

* fix: fixed step transparency issue

* fix: fixed thumb focus issue

* Update packages/components/slider/src/use-slider.ts

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* feat(slider): vertical orientation added, start & end content, bug fixes

* chore(slider): tests added

* feat(slider): marks added

* chore(slider): example ts-doc changed

* feat(slider): vertical marks support

* feat(core): slider tooltip support added, popover modified (#1746)

* Feat/slider custom styles (#1751)

* feat(slider): custom styles story added

* fix(slider): custom styles on different sizes

* Fix/slider tooltip android position (#1753)

* feat(slider): custom styles story added

* fix(slider): tooltip update position dependecies added

* fix(popover): arrow placements improved

* feat(slider): docs started, custom thumb and custom output stories added

* feat(slider): render function added to custom render the slider parts

* feat(slider): docs in progress, new properties and examples added

* fix(slider): some issues fixed, output renamed to value, documentation improved

* feat(slider): docs done

* chore: changeset

* chore: react aria packages upgraded

* feat(system): router provider added

* feat: client side routing support added to items components

* chore(docs): routing docs started

* chore: changeset

* feat(docs): client side routing documented

* feat(pagination): client router support added to pagination

* fix(link): csr added

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>

* feat: added RTL support to accordion component (#1725)

* feat: added RTL support to accordion component

* Create healthy-cobras-crash.md

* feat: added RTL support to avatar and avatar group component (#1727)

* feat: added RTL support to avatar and avatar group components

* Create tender-penguins-love.md

* Update tender-penguins-love.md

* feat: added RTL support to button group component (#1726)

* feat: added RTL support to button component

* feat: added RTL support to button component

* Create orange-bobcats-kneel.md

* Update button.ts

* refactor(root): styles refactor (#1688)

* refactor(root): styles refactor

* chore(tabs): remove needless type extends

* fix(tabs): typecheck

* Breadcrumbs component (#1794)

* feat(components): breadcrumbs initial structure

* feat(breadcrumbs): tests and examples added

* feat(docs): breadcrumbs documentation done

* feat(docs): breadcrumbs docs done

* chore(breadcrumbs): readme changed

* fix(slider): Place last dragged slider handle over the other handle (#1778)

* Set `data-focused` in handle

* Style focused handle on top

* Add tests

* fix(core): tests and build

* fix(button): show only spinner if button isLoading & isIconOnly (#1800)

* fix(button): show only spinner if button isLoading & isIconOnly

* chore: add changeset

* fix(button): remove repeating code

* Fix blur/opaque Popover (#1812)

* fix(popover): double underlay click

* chore: use ref instead of a state

* Feat/controlled scroll shadow (#1819)

* feat(scroll-shadow): logic improved, controlled support added

* feat(scroll-shadow): controlled visibility

* fix(scroll-shadow): visibility tests

* Autocomplete component (Single Selection) (#1797)

* feat(autocomplete): initial structure

* feat(core): use press custom hook implemented, autocomplete improved, input and select animations fixed

* chore(button): add console.log on press

* feat(core): select & input label position, autocomplete improvements, listbox and menu empty state

* chore: tailwind-variants upgraded

* chore: autocomplete stories in progress

* fix: input and select label placement

* fix(autocomplete): popover trigger

* chore(root): react-aria pkgs and framer-motion upgraded

* fix(input,select): outside label scale removed

* feat(autocomplete): more stories and use cases supported

* fix(core): custom items support on collection-based comps, menu generic items support added

* chore(core): tailwind-variants upgraded, custom tv function adapted

* chore(docs): select on-change controlled e.g. changed, sandpack theme fixed

* chore(autocomplete): docs started, tests added

* chore: in progress

* feat(menu): top and end content added, autocomplete docs improved

* feat(docs): autocomplete documentation almost done

* fix(input): outside styles

* feat(docs): autocomplete async filtering added

* chore(docs): autocomplete highlighted lines added

* feat(docs): autocomplete a11y and slots added

* feat(docs): autocomplete a11y and slots added

* feat(docs): autocomplete docs done

* fix(root): peer dependencies (#1848)

* Fix/small issues (#1851)

* fix(input): visible outline

* fix(button): button group radius prop

* chore(navbar): menu item active status added

* fix(docs): pagination missing keys custom items

* fix(core): extendVariants support added to collection-based components

* fix(theme): card body padding

* chore(theme): transition added to menu/listbox items

* fix(input): textarea styles fixed, new prop added

* chore(input): textarea height animated

* feat(button): hover opacity added

* chore(textarea): hide scroll when the limit hasn't been reached

* chore(docs): updated badge added to textarea

* feat(docs): blog v2.2.0 image and entry added

* fix(avatar): ring primary color

* chore(docs): tabs added again, autocomplete iframes removed

* chore: v2 blog post

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Maurici Abad Gutierrez <hello@mauriciabad.com>
Co-authored-by: Ivan Kucher <dev.kucher@gmail.com>
2023-11-03 12:35:36 -03:00
github-actions[bot] 5a4a60be65 ci(changesets): version packages (#1860)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-11-03 12:21:01 -03:00
Junior Garcia 25e86fb417 chore(changeset): updated 2023-11-03 12:08:29 -03:00
Junior Garcia a95bd6558d chore(core): system pkg theme dependecy moved to peer 2023-11-03 12:07:12 -03:00
Junior Garcia 080718e265 fix(root): changeset 2023-11-03 11:31:30 -03:00
Junior Garcia 8217639fd4 chore(root): v2.2.0 changeset 2023-11-03 11:17:44 -03:00
Junior Garcia 7abd68941a v2.2.0 🕹️ (#1777)
* feat: Slider Component (#1686)

* feat(slider): initial structure

* chore(slider): readme improved

* fix: fixed border color of slider track

* docs: added range story

* feat: added rtl support to slider

* feat: improved value label formatting

* feat: refactor styling and add colors support to slider

* chore: improved thumb color

* docs: improved slider stories

* chore(slider): default color changed by foreground

* Update packages/core/theme/src/components/slider.ts

Co-authored-by: Jakob Guddas <github@jguddas.de>

* feat: added fillOffset prop

* Update packages/components/slider/src/use-slider.ts

* fix(slider): animation

* Update packages/components/slider/src/use-slider.ts

* Update packages/core/theme/src/components/slider.ts

* feat: slider steps

* refactor: renamed variables

* feat: improved slider step styling

* fix: hide infinite steps

* fix: fixed step transparency issue

* fix: fixed thumb focus issue

* Update packages/components/slider/src/use-slider.ts

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* feat(slider): vertical orientation added, start & end content, bug fixes

* chore(slider): tests added

* fix(docs): scrollbar added to the sidebar (#1743)

* feat(slider): marks added

* chore(slider): example ts-doc changed

* feat(slider): vertical marks support

* feat(core): slider tooltip support added, popover modified (#1746)

* Feat/slider custom styles (#1751)

* feat(slider): custom styles story added

* fix(slider): custom styles on different sizes

* Fix/slider tooltip android position (#1753)

* feat(slider): custom styles story added

* fix(slider): tooltip update position dependecies added

* fix(popover): arrow placements improved

* feat(slider): docs started, custom thumb and custom output stories added

* feat(slider): render function added to custom render the slider parts

* feat(slider): docs in progress, new properties and examples added

* fix(slider): some issues fixed, output renamed to value, documentation improved

* feat(slider): docs done

* chore: changeset

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>

* Client side routing (#1764)

* feat(slider): initial structure

* chore(slider): readme improved

* fix: fixed border color of slider track

* docs: added range story

* feat: added rtl support to slider

* feat: improved value label formatting

* feat: refactor styling and add colors support to slider

* chore: improved thumb color

* docs: improved slider stories

* chore(slider): default color changed by foreground

* Update packages/core/theme/src/components/slider.ts

Co-authored-by: Jakob Guddas <github@jguddas.de>

* feat: added fillOffset prop

* Update packages/components/slider/src/use-slider.ts

* fix(slider): animation

* Update packages/components/slider/src/use-slider.ts

* Update packages/core/theme/src/components/slider.ts

* feat: slider steps

* refactor: renamed variables

* feat: improved slider step styling

* fix: hide infinite steps

* fix: fixed step transparency issue

* fix: fixed thumb focus issue

* Update packages/components/slider/src/use-slider.ts

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* feat(slider): vertical orientation added, start & end content, bug fixes

* chore(slider): tests added

* feat(slider): marks added

* chore(slider): example ts-doc changed

* feat(slider): vertical marks support

* feat(core): slider tooltip support added, popover modified (#1746)

* Feat/slider custom styles (#1751)

* feat(slider): custom styles story added

* fix(slider): custom styles on different sizes

* Fix/slider tooltip android position (#1753)

* feat(slider): custom styles story added

* fix(slider): tooltip update position dependecies added

* fix(popover): arrow placements improved

* feat(slider): docs started, custom thumb and custom output stories added

* feat(slider): render function added to custom render the slider parts

* feat(slider): docs in progress, new properties and examples added

* fix(slider): some issues fixed, output renamed to value, documentation improved

* feat(slider): docs done

* chore: changeset

* chore: react aria packages upgraded

* feat(system): router provider added

* feat: client side routing support added to items components

* chore(docs): routing docs started

* chore: changeset

* feat(docs): client side routing documented

* feat(pagination): client router support added to pagination

* fix(link): csr added

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>

* feat: added RTL support to accordion component (#1725)

* feat: added RTL support to accordion component

* Create healthy-cobras-crash.md

* feat: added RTL support to avatar and avatar group component (#1727)

* feat: added RTL support to avatar and avatar group components

* Create tender-penguins-love.md

* Update tender-penguins-love.md

* feat: added RTL support to button group component (#1726)

* feat: added RTL support to button component

* feat: added RTL support to button component

* Create orange-bobcats-kneel.md

* Update button.ts

* refactor(root): styles refactor (#1688)

* refactor(root): styles refactor

* chore(tabs): remove needless type extends

* fix(tabs): typecheck

* Breadcrumbs component (#1794)

* feat(components): breadcrumbs initial structure

* feat(breadcrumbs): tests and examples added

* feat(docs): breadcrumbs documentation done

* feat(docs): breadcrumbs docs done

* chore(breadcrumbs): readme changed

* fix(slider): Place last dragged slider handle over the other handle (#1778)

* Set `data-focused` in handle

* Style focused handle on top

* Add tests

* fix(core): tests and build

* fix(button): show only spinner if button isLoading & isIconOnly (#1800)

* fix(button): show only spinner if button isLoading & isIconOnly

* chore: add changeset

* fix(button): remove repeating code

* Fix blur/opaque Popover (#1812)

* fix(popover): double underlay click

* chore: use ref instead of a state

* Feat/controlled scroll shadow (#1819)

* feat(scroll-shadow): logic improved, controlled support added

* feat(scroll-shadow): controlled visibility

* fix(scroll-shadow): visibility tests

* Autocomplete component (Single Selection) (#1797)

* feat(autocomplete): initial structure

* feat(core): use press custom hook implemented, autocomplete improved, input and select animations fixed

* chore(button): add console.log on press

* feat(core): select & input label position, autocomplete improvements, listbox and menu empty state

* chore: tailwind-variants upgraded

* chore: autocomplete stories in progress

* fix: input and select label placement

* fix(autocomplete): popover trigger

* chore(root): react-aria pkgs and framer-motion upgraded

* fix(input,select): outside label scale removed

* feat(autocomplete): more stories and use cases supported

* fix(core): custom items support on collection-based comps, menu generic items support added

* chore(core): tailwind-variants upgraded, custom tv function adapted

* chore(docs): select on-change controlled e.g. changed, sandpack theme fixed

* chore(autocomplete): docs started, tests added

* chore: in progress

* feat(menu): top and end content added, autocomplete docs improved

* feat(docs): autocomplete documentation almost done

* fix(input): outside styles

* feat(docs): autocomplete async filtering added

* chore(docs): autocomplete highlighted lines added

* feat(docs): autocomplete a11y and slots added

* feat(docs): autocomplete a11y and slots added

* feat(docs): autocomplete docs done

* fix(root): peer dependencies (#1848)

* Fix/small issues (#1851)

* fix(input): visible outline

* fix(button): button group radius prop

* chore(navbar): menu item active status added

* fix(docs): pagination missing keys custom items

* fix(core): extendVariants support added to collection-based components

* fix(theme): card body padding

* chore(theme): transition added to menu/listbox items

* fix(input): textarea styles fixed, new prop added

* chore(input): textarea height animated

* feat(button): hover opacity added

* chore(textarea): hide scroll when the limit hasn't been reached

* chore(docs): updated badge added to textarea

* feat(docs): blog v2.2.0 image and entry added

* fix(avatar): ring primary color

* chore(docs): tabs added again, autocomplete iframes removed

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Maurici Abad Gutierrez <hello@mauriciabad.com>
Co-authored-by: Ivan Kucher <dev.kucher@gmail.com>
2023-11-03 11:05:16 -03:00
Danny Nemer c3f762563b docs: Fix typos in frameworks/nextjs.mdx (#1849) 2023-11-02 11:02:39 -03:00
Sandro Huber 8d2192183b Fix typo in table component doc (#1850) 2023-11-02 11:01:27 -03:00
Ajith 8b86f83802 Fix typo (#1835)
t he => the
2023-10-30 10:35:53 -03:00
Soohyun, Chae f38059aa44 Update tabs.mdx (#1781) 2023-10-21 13:01:27 +00:00
navedqb 311ceb0c3a Added missing imports to navbar (#1771) 2023-10-16 18:34:41 +00:00
Jakob Guddas 50a9bf54d4 fix: pagination issues second try (#1584)
* fix: pagination issues second try

* Create red-hairs-thank.md
2023-10-16 13:42:27 +00:00
KyungJi Kim 99d4d296d7 docs: fix storybook link in ComponentLinks (#1757) 2023-10-09 23:07:26 -03:00
Jakob Guddas 9245384ac3 docs: accessible toggle button in examples (#1749) 2023-10-07 11:54:16 +00:00
Junior Garcia 5af4b10114 fix(docs): scrollbar added to the sidebar (#1743) 2023-10-05 19:45:37 +00:00
Junior Garcia 8de357cfac fix(docs): sandpack hook react addition validation fixed (#1740) 2023-10-05 15:17:27 +00:00
Junior Garcia 655599982d fix(card): stories 2023-10-05 12:01:02 -03:00
POPO He 3aac9bac26 fix: resolved border collapse issue #1626 when border variants are mixed in button group (#1637)
* fix(button-group): radius not work

* fix(button): not show the correct borders

* fix(changeset): button issue

* fix(changeset): fix typo

* fix(changeset): tweak changeset message

* fix(button-groups): add miss undefined radius

* fix: make changeset clearly

* test(button-group): add variant button

* refactor: button-group variant handling in button-group.stories.tsx

* test: update button variant to 'bordered'

* refactor: rename isIsolate to isIsolated

* Revert "fix(button-group): radius not work"

This reverts commit 6233690d8acd96664c48d4f721c481bcb4095be4.

* fix: remove isIsolate because using a negative value for the margin will always cover the neighbor

* fix(changeset): remove radius part for another PR

* test: add multiple variant buttons on storybook

* fix: remove unused attribute

* feat: use adjacent selector to remove doubles border

* test: make variantButtons theme consistency

* refactor: use collapseAdjacentVariantBorders to wrap an adjacent selector

* Added RTL support.

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2023-10-04 19:54:15 +00:00
markyong 95c8fdaa2e fix(select): add placeholder dep for renderSelectedItem (#1682) 2023-10-04 14:54:15 +00:00
Junior Garcia c0706acbca Fix/1609 (#1736)
* feat: storybook upgraded

* fix(skeleton): loading state

* chore(skeleton): changeset
2023-10-04 14:49:18 +00:00
Junior Garcia 9d4c7ed9cf fix(ripple): clear ripples on animation complete (#1681) 2023-09-23 13:18:13 +00:00
Sung Ye In 9ebaae083d fix: add peer dependencies (#1651)
* fix: add peer dependencies

* fix: update pnpm lock
2023-09-23 13:02:06 +00:00
Ansh Mourya c9c5564c58 fix: #1648 (#1655) 2023-09-23 09:36:55 -03:00
Bobby Chan d79808dbe1 fix(radio): correct the style of radio in invalid and selected states (#1668)
* fix(radio): correct the style of radio in invalid and selected states

* Update hot-otters-laugh.md
2023-09-22 13:59:11 +00:00
cosine 5a9b78d234 fix doc: Fixed some errors in the Listbox Component documentation. (#1665)
* fix doc: export IconWrapper and ItemCounter

* fix doc: fix WatcherIcons -> WatcherIcon at everywhere
2023-09-22 13:57:25 +00:00
Chewy 9f4bdf352d docs: add missing semicolon (#1663) 2023-09-20 17:38:14 +00:00
Junior Garcia d62feb08dc chore(docs): next.js upgraded 2023-09-20 01:45:07 -03:00
lijianan 62d307117a docs: fix code Sizes demo overflow (#1644) 2023-09-17 15:00:08 +00:00
Jakob Guddas 01a27293eb docs: updated isInvalid documentation (#1646)
* Update input.mdx

* Update textarea.mdx

* Update select.mdx
2023-09-17 14:54:38 +00:00
github-actions[bot] a53e274d5b ci(changesets): version packages (#1615)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-16 21:25:10 +00:00
Junior Garcia 425a034bca fix(packages): validation state deprecated, isInvalid prop adjusted (#1631) 2023-09-16 21:16:32 +00:00
lijianan a5a1ea5ade fix(docs): button custom implement (#1643) 2023-09-16 21:12:14 +00:00
Junior Garcia f6531c5f60 fix(core): extend variants function, destructuring order changed (#1642)
* fix(core): extend variants function, destructuring order changed

* chore(core): changeset added
2023-09-16 21:06:16 +00:00
Junior Garcia 37d5f12162 fix(docs): button custom implementation (#1641) 2023-09-16 20:28:52 +00:00
lijianan dd97fc3c4f fix: fix eslint warning (#1640) 2023-09-16 20:23:26 +00:00
lijianan ceddd0d1d9 refactor: optimize the time of ripple destroy (#1635)
* refactor: optimize the time of ripple destroy

* Update packages/components/button/src/use-button.ts

Co-authored-by: Jakob Guddas <github@jguddas.de>

* fix: fix

* Update packages/components/button/src/button.tsx

Co-authored-by: Jakob Guddas <github@jguddas.de>

* Update packages/components/card/src/card.tsx

Co-authored-by: Jakob Guddas <github@jguddas.de>

* Update packages/components/button/src/button.tsx

Co-authored-by: Jakob Guddas <github@jguddas.de>

* Update packages/components/card/src/card.tsx

Co-authored-by: Jakob Guddas <github@jguddas.de>

* Update packages/components/card/src/use-card.ts

Co-authored-by: Jakob Guddas <github@jguddas.de>

* Update packages/components/card/src/use-card.ts

Co-authored-by: Jakob Guddas <github@jguddas.de>

* fix: fix

* chore: revert

* Create fresh-cameras-provide.md

* Update packages/components/button/src/button.tsx

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* Update packages/components/button/src/button.tsx

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* Update packages/components/button/src/use-button.ts

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* Update packages/components/card/src/card.tsx

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* Update packages/components/card/src/card.tsx

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* fix: fix

* feat: add getUniqueID

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-16 20:11:04 +00:00
Junior Garcia bb8ed58749 fix(accordion): selectedKeys added to the values memo function (#1639) 2023-09-16 20:01:39 +00:00
markyong bbbdcbdfdf chore(root): update contributing.md note (#1638) 2023-09-16 19:17:59 +00:00
Junior Garcia bc424948c7 fix(accordion): accordion is no longer preventing spacebar (#1630) 2023-09-15 20:42:02 +00:00
Junior Garcia cdc30db14c fix(utils): filterDomProps fixed (#1629) 2023-09-14 22:49:58 -03:00
Junior Garcia 3aa86423aa Fix/1625 (#1628)
* fix(listbox): item classNames prop, listbox wrapper export

* chore(listbox): changesets
2023-09-15 00:53:26 +00:00
Junior Garcia 59ed34b3de fix(docs): table use case example fixed, sandpack tabs padding added (#1627) 2023-09-15 00:30:17 +00:00
Chong Ruei He f58fc9bb69 fix(docs): add scrollbehavior ts support (#1618) 2023-09-14 20:13:07 +00:00
Junior Garcia 9a478b6c1f chore(docs): hero events 2023-09-13 09:16:48 -03:00
Junior Garcia 7fd0327657 chore(docs): va events added 2023-09-13 08:39:58 -03:00
Bobby Chan 05c966e8a4 fix(card): corrected footerStyles in card footer (#1611) 2023-09-12 13:20:09 -03:00
Nahuel Alejandro Cabrera 5b014b76ff Update explanation in layout.mdx (#1601) 2023-09-12 13:19:10 -03:00
Koen Verheyen cf32b5ae8b Update standalone.ts (#1614) 2023-09-12 13:18:47 -03:00
github-actions[bot] 4452ed66c0 ci(changesets): version packages (#1599)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-10 20:32:13 +00:00
Junior Garcia b1b30b7976 chore(root): fix changesets deploy (#1600) 2023-09-10 20:20:19 +00:00
github-actions[bot] 97ef2d7250 ci(changesets): version packages (#1565)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-10 19:58:22 +00:00
Junior Garcia 8b39989090 chore(root): changesets 2023-09-10 16:46:31 -03:00
Chongyi Zheng 8363a3ecfc fix: avoid src in import path (#1596)
* fix: avoid `src` in import path

* fix: export `RippleType`
2023-09-10 19:42:55 +00:00
Jakob Guddas 5c30e04811 fix: set nowrap in chip (#1590)
* fix: set nowrap in chip

* Create early-garlics-deliver.md
2023-09-10 19:16:06 +00:00
Adrian 8606fbe0b9 fix(links): corrected typo in accordion link (#1594) 2023-09-10 01:10:46 +00:00
Junior Garcia 1612532eee chore: react-aria packages upgraded (#1589) 2023-09-09 13:50:21 +00:00
Junior Garcia a3be419cb3 Fix/1561 (#1563)
* fix(select): bottom space

* chore(select): changeset
2023-09-03 13:19:17 +00:00
github-actions[bot] 72a7f71377 ci(changesets): version packages (#1559)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-02 21:38:53 +00:00
Junior Garcia 7c8341035d fix(pagination): changeset (#1558) 2023-09-02 21:28:41 +00:00
github-actions[bot] 6ca0ce309a ci(changesets): version packages (#1557)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-02 21:20:10 +00:00
Junior Garcia acc2ff3913 Merge branch 'main' of github.com:nextui-org/nextui 2023-09-02 18:07:05 -03:00
Junior Garcia 4db10a47e9 chore: changeset pagination revert 2023-09-02 18:06:51 -03:00
Junior Garcia a9c4fab011 chore: pagination changes changeset removed (#1556) 2023-09-02 20:53:55 +00:00
Junior Garcia d61428d9e6 Revert "ci(changesets): version packages (#1550)" (#1555)
This reverts commit 43906f639e.
2023-09-02 20:52:36 +00:00
Junior Garcia 455b788924 fix(docs): missing pagination docs added 2023-09-02 17:48:31 -03:00
Junior Garcia 79cfdbd8ff Revert "fix: resolved cursor issues in pagination (#1222)" (#1554)
This reverts commit 28477447d3.
2023-09-02 20:46:01 +00:00
Junior Garcia 7d294e3a04 Revert "fix: fixed pagination scale animation (#1552)" (#1553)
This reverts commit 8fcc8b3767.
2023-09-02 20:45:49 +00:00
github-actions[bot] 43906f639e ci(changesets): version packages (#1550)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-02 20:40:07 +00:00
Jakob Guddas 8fcc8b3767 fix: fixed pagination scale animation (#1552) 2023-09-02 15:45:27 -03:00
Jakob Guddas 28477447d3 fix: resolved cursor issues in pagination (#1222)
* fix: resolved cursor issues in pagination

* chore: added comment

* kick: trigger ci

* Create eighty-knives-heal.md
2023-09-02 18:01:38 +00:00
Junior Garcia fc3c6b9431 chore(root): tailwind variants upgraded (#1551)
* chore(root): tailwind variants upgraded

* fix(theme): prettier
2023-09-02 17:46:36 +00:00
Junior Garcia 59fda3772f fix(navbar-menu): dismiss buttons removed to fix the scroll (#1549) 2023-09-02 15:41:38 +00:00
Troye d8d2b87cb8 fix(docs): table async pagination (#1491)
* fix(docs): change to swr

* chore(table): change to swr

* fix(table): keep the pagination when switching pages

* chore(repo): pnpm lockfile updated
2023-09-02 12:56:39 +00:00
github-actions[bot] 64571e468c ci(changesets): version packages (#1514)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-09-01 21:09:05 +00:00
Junior Garcia faf26acd23 fix(snippet): invalid props (#1546) 2023-09-01 20:52:16 +00:00
Junior Garcia cac56faf29 chore(docs): hero tooltip arrow removed (#1547) 2023-09-01 20:45:41 +00:00
Junior Garcia 09fe1d3141 Fix/1531 (#1545)
* fix(tabs): title prop was being passed to html element

* chore(tabs): changeset
2023-09-01 20:44:46 +00:00
Junior Garcia a9e324b351 fix(listbox): dynamic items types (#1544) 2023-09-01 20:42:20 +00:00
Junior Garcia 043b8420cf Fix/1492 (#1543)
* fix(select): select & input styles fixed

* chore(input): extra data attr added to input wrapper
2023-09-01 20:42:15 +00:00
Junior Garcia 57909accde Fix/1298 (#1542)
* fix(modal): focus trap added

* chore(navbar): changeset added
2023-09-01 20:42:08 +00:00
Vansh Shah 7a17256268 Solved error in Listbox Component (#1530) 2023-08-31 14:06:13 -03:00
MisterHims bf2bc265ee feat: adding some adjustements on listbox and dropdown doc pages (#1520)
* fix: some typo and renamed use infinite scroll call on async section of select docpage

* fix(listbox-docpage): note doublon from the with icons section

* fix(switch-docpage): add a missing whitespace

* fix(dropdown-docpage): remove note doublon

* fix(dropdown-docpage): adding DropdownSection dependencu into the with-section code

* fix(dropdown-docpage): do not need Button component on custom-trigger section code

* fix(dropdown-docpage): fixed typo missing letter on dropdown-item list

* fix(dropdown-section): add missing comma
2023-08-29 18:05:55 +00:00
MisterHims cf6bf749a1 feat: adding some ajustements on listbox and dropdown doc pages (#1518) 2023-08-29 13:20:51 -03:00
Tianen Pang 641bf0885b feat(system): extend props for nextui provider (#1513) 2023-08-28 13:00:24 -03:00
MisterHims 40b42001f9 fix: some typo and renamed use infinite scroll call on async section of select docpage (#1509) 2023-08-27 19:30:49 -03:00
github-actions[bot] 789a7209a2 ci(changesets): version packages (#1500)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-26 14:57:11 +00:00
Junior Garcia 021aa16d96 chore(docs): inter font applied to tailwind config 2023-08-26 11:30:06 -03:00
Junior Garcia eb8a1fcc01 chore(docs): font family chnaged to inter 2023-08-26 11:24:28 -03:00
Junior Garcia 9b42a2fca1 fix(docs): select typo 2023-08-26 11:15:15 -03:00
Junior Garcia 5702287e56 fix(popover): arrow color (#1501) 2023-08-26 14:13:04 +00:00
Jakob Guddas 290cce15be fix: show focus ring when table row is focused in read mode (#1303)
* fix: show focus ring when table row is focused in read mode

* Create witty-trees-buy.md
2023-08-26 13:41:35 +00:00
github-actions[bot] 27bde30839 ci(changesets): version packages (#1499)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-26 13:39:00 +00:00
Junior Garcia 6be3bc3516 fix(docs): textarea readonly typo 2023-08-26 10:30:13 -03:00
T/once e4113b05ce fix(navbar): unable to Close NavbarMenu (#1496)
* add mode wait to AnimatePresence

* add changeset
2023-08-26 13:29:27 +00:00
Junior Garcia a3a95e7196 Merge branch 'main' of github.com:nextui-org/nextui 2023-08-26 10:27:22 -03:00
Junior Garcia 8731159702 fix(docs): font family 2023-08-26 10:27:08 -03:00
Hyuuh b6adb2ae8c docs(components): 📝 change to the new rsc link (#1493)
The new docs for Next.js RSC has been moved to a new section.
2023-08-25 17:29:00 +00:00
github-actions[bot] cd2d9b70a9 ci(changesets): version packages (#1477)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-23 03:26:47 +00:00
Junior Garcia a371e1a5fa Fix/tooltip arrow position (#1474)
* feat(blog): rss auto-discovery added

* fix(blog): feed.xml author name

* fix(tooltip): arrow position

* chore(tooltip): changeset
2023-08-23 03:11:15 +00:00
github-actions[bot] 5cdc4d1d87 ci(changesets): version packages (#1475)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-23 03:11:05 +00:00
Junior Garcia 22c6e070dd Fix/1469 (#1476)
* feat(blog): rss auto-discovery added

* fix(blog): feed.xml author name

* fix(docs): sandpack files filter
2023-08-23 03:10:41 +00:00
Junior Garcia 0714192838 Merge branch 'main' of github.com:nextui-org/nextui 2023-08-23 00:02:41 -03:00
Junior Garcia ae9f300d45 Fix/1468 (#1472)
* feat(blog): rss auto-discovery added

* fix(blog): feed.xml author name

* fix(select): size prop

* chore(root): changeset
2023-08-23 02:59:03 +00:00
Junior Garcia a16dac04c8 Merge branch 'main' of github.com:nextui-org/nextui 2023-08-22 23:49:47 -03:00
Junior Garcia 94db001961 Chore/docs improvemements (#1473)
* feat(blog): rss auto-discovery added

* fix(blog): feed.xml author name

* chore(docs): pnpm script modified
2023-08-23 02:46:37 +00:00
Junior Garcia d77cf7658b Feat/add rss auto discovery (#1471)
* feat(blog): rss auto-discovery added

* fix(blog): feed.xml author name
2023-08-23 02:43:58 +00:00
Junior Garcia 46c47f7e6e fix(blog): feed.xml author name 2023-08-22 12:37:26 -03:00
Junior Garcia 35b9741663 feat(blog): rss auto-discovery added 2023-08-22 12:34:35 -03:00
github-actions[bot] 2b82ba86eb ci(changesets): version packages (#1465)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-21 22:15:21 +00:00
Junior Garcia 904f538779 Chore/update react aria packages (#1463)
* fix(dropdown): popover and dropdown fixes

* fix(popover): arrow animation, shouldCloseOnInteractOutside function usage fixed

* chore(root): changeset

* chore(root): react-aria utils pkg updated

* fix(root): changesets

* fix(root): changeset
2023-08-21 22:06:36 +00:00
nirmalkumar 609e9f4c11 fix -( Image-Tag issue in Cover-image.ts ) (#1462) 2023-08-21 21:16:33 +00:00
github-actions[bot] e3dabac9f5 ci(changesets): version packages (#1461) 2023-08-21 12:28:39 -03:00
Junior Garcia 4e94c11528 fix(dropdown): popover and dropdown fixes (#1458) 2023-08-21 12:07:28 -03:00
João Vitor a17b6c7502 docs(tooltip): decrease zIndex so it doesn't overlap other elements (#1454)
* fix(navbar): z-index issue on desktop

* Revert "fix(navbar): z-index issue on desktop"

This reverts commit 227b79e5c6493084ee31a62fd5b13079c8a4a2e4.

* docs(tooltip): decrease the zIndex
2023-08-21 14:29:03 +00:00
github-actions[bot] bd72301b01 ci(changesets): version packages (#1456)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-21 13:40:21 +00:00
Junior Garcia cc839cdd1f Fix/select label closes the popover (#1455)
* fix(select): label pointer events removed

* chore(select): changeset
2023-08-21 13:29:49 +00:00
Yannik Hewlik c9e5c2ef7f docs: correct default value for popover radius (#1451)
* Update popover.mdx

* Update apps/docs/content/docs/components/popover.mdx

Co-authored-by: Jakob Guddas <github@jguddas.de>

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2023-08-21 13:22:50 +00:00
Junior Garcia e8f5264cf8 fix(blog): v2.1.0 date 2023-08-21 10:11:10 -03:00
Junior Garcia df7f773f3d fix(blog): async typo 2023-08-21 09:49:59 -03:00
github-actions[bot] af925d56d1 ci(changesets): version packages (#1453)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-21 12:41:43 +00:00
Junior Garcia baec55029d Feat/select component (#1313)
* chore(root): menu and select components in progress

* chore(root): merged with main

* feat(menu): stories created

* feat(dropdown): menu migrated to menu component

* feat(select): base implementation in progress

* feat(select): listbox implemented

* feat(select): scroll overflow and auto scroll added

* feat(select): colors & variants improved, inside placement complete, outside pending

* feat(scroll-shadow): new component in progress

* feat(select): scroll shadow integrated

* fix(select): popover implementation, more scroll shadow stories added

* feat(listbox): custom styles example added to stories

* chore(listbox): overflow hidden removed

* feat(select): variants and styles completed

* chore(select): description story added

* feat(select): more stories added

* fix(select): dynamic collections inference, styles improved, more stories added

* fix(select): auto scroll to selected item, scroll padding added

* chore(select): scroll behavior changed to nearest

* feat(select): custom item story added

* fix(select): autoscroll fixed

* feat(select): multi select support added

* feat(select): more examples added, clean-package modified to remove dev packages

* chore(modal): useImperativeHandle removed

* feat(select): render value story improved

* feat(docs): listbox & scroll shadow docs done

* feat(docs): select documentation in progress

* fix: select aria label (#1425)

* feat(docs): more examples added

* feat(docs): select multiple added, storybook favicon changed

* fix: added value to aria label of select (#1431)

* feat(select): more examples added, storybook favicon changed

* fix(popover): dialog role removed

* feat(select): api added, async loading exampled added

* fix: fixed list box on click not working with sr click (#1439)

* feat(select): async items loading support added and documented

* feat(root): input styles updated to be as the select ones

* chore(root): listbox and scroll shadow readme updated

* feat(select): ts examples added, banner updated

* fix(popover): voiceover closes when focusing an item fixed

* chore(select): focus scope removed

* fix(popover): free solo popover added to use without a trigger

* feat(select): blog post added

* chore(docs): search meta generated, multi controlled onchange example fixed

* chore(root): changeset added

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2023-08-21 12:28:01 +00:00
Gaurav Pandey ea2868e58e updated doc handling hydration mismatch error (#1449)
Co-authored-by: btsb78 <gaurav.pandey@kratikal.com>
2023-08-20 20:42:01 +00:00
Junior Garcia 691f380dff fix(docs): client directive added to next app examples on dark mode page 2023-08-20 11:45:23 -03:00
Junior Garcia ac8afec964 fix(modal): docs issues 2023-08-19 18:33:51 -03:00
Loïc GREFFIER 5fe5521a7c fix(docs): replaced ghost by dot in chip variants (#1436) 2023-08-18 20:49:36 -03:00
github-actions[bot] 15403bc67e ci(changesets): version packages (#1435) 2023-08-18 18:16:55 -03:00
Junior Garcia c186f37c98 fix(accordion): hide indicator prop in accordion item (#1433) 2023-08-18 20:59:49 +00:00
github-actions[bot] 1bc2a50e2c ci(changesets): version packages (#1434)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-18 20:57:44 +00:00
Junior Garcia 453f792a7a fix(link): warning onClick removed (#1432) 2023-08-18 20:50:13 +00:00
Junior Garcia 3f6fd48eee fix(docs): modal mail icon imports (#1421) 2023-08-17 12:48:06 +00:00
github-actions[bot] d7c6c79f38 ci(changesets): version packages (#1414)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-15 20:35:07 -03:00
Junior Garcia f068552774 refactor(tooltip): style prop merged with the passed one (#1413) 2023-08-15 20:28:23 -03:00
Cesar Leonardo Insuasty Moreno 6d7372ede1 fix: Import CardFooter in the card component doc (#1412) 2023-08-15 18:52:16 -03:00
github-actions[bot] 1487219a1c ci(changesets): version packages (#1411)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-15 18:30:06 -03:00
Junior Garcia 6e7e834c2d fix(popover): allow pass custom z-index (#1410) 2023-08-15 18:22:08 -03:00
Victor Bejas 80a8f7e94c fix/add import CardFooter at Card component composition (#1408) 2023-08-15 16:19:39 -03:00
github-actions[bot] fae7467b64 ci(changesets): version packages (#1407)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-15 14:41:45 -03:00
Tommaso De Rossi 4e7789c1f6 fix(input): don't always use controlled mode (#1406)
* fix(input): don't always use controlled mode

* fix(input): don't pass value to useTextField

* test(input): added test for mutating input via ref

* chore(input): changelog
2023-08-15 14:24:55 -03:00
Junior Garcia 6694b934e6 fix(docs): accordion item isOpen prop removed 2023-08-14 10:06:07 -03:00
github-actions[bot] 4d341081e3 ci(changesets): version packages (#1393)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-13 22:07:15 -03:00
github-actions[bot] df562449fb ci(changesets): version packages (#1392)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-13 21:50:12 -03:00
Junior Garcia 4063362699 fix(popover): use layout effect on the server warning 2023-08-13 21:42:57 -03:00
Junior Garcia 94d65df533 fix(root): filter dom props function fixed, slot prop added (#1391)
* fix(root): filter dom props function fixed, slot prop added

* chore(root): changeset added
2023-08-13 21:41:42 -03:00
Junior Garcia 8f66c6b564 fix(docs): individual installation highlights 2023-08-13 15:32:22 -03:00
Junior Garcia 4a19a3c906 Merge branch 'main' of github.com:nextui-org/nextui 2023-08-13 15:25:03 -03:00
Junior Garcia 0be398ade9 fix(docs): individual components styles 2023-08-13 15:24:48 -03:00
github-actions[bot] 50d23e5378 ci(changesets): version packages (#1385)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-13 00:03:39 -03:00
Junior Garcia d0341020e6 fix(docs): navbar with search input example (#1384) 2023-08-12 23:53:22 -03:00
github-actions[bot] 4170ecdc76 ci(changesets): version packages (#1383)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-12 23:33:09 -03:00
Junior Garcia e2b0076b53 chore(root): version field moved to bug report template 2023-08-12 23:27:55 -03:00
Junior Garcia e2b0497b07 fix(root): checkbox and radio onChange event types fixed (#1381) 2023-08-12 23:26:07 -03:00
Junior Garcia df3b309542 Merge branch 'main' of github.com:nextui-org/nextui 2023-08-12 22:56:11 -03:00
Junior Garcia 6c35a502fe chore(root): feature request template updated, version added 2023-08-12 22:55:37 -03:00
github-actions[bot] a629f8c088 ci(changesets): version packages (#1378)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-12 11:40:59 -03:00
Junior Garcia fd4e01dcfa fix(dropdown): spread key warning (#1377) 2023-08-12 11:33:13 -03:00
github-actions[bot] e9c08abd55 ci(changesets): version packages (#1374)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-11 21:10:32 -03:00
Junior Garcia 3e263aa882 fix(table): layout property (#1372) 2023-08-11 20:58:57 -03:00
Junior Garcia 9add9aba97 chore(docs): current version added to navbar dropdown (#1373) 2023-08-11 20:48:00 -03:00
Tudor Comparan 0311ae43f1 individual instalation, tailwind setup, require correct nextui package (#1371) 2023-08-11 16:07:23 -03:00
github-actions[bot] 79c5fb9a94 ci(changesets): version packages (#1370)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-11 15:02:25 -03:00
Junior Garcia abe1ba58de Fix/input undefined value (#1369)
* fix(input): undefined value uncontrolled

* fix(input): undefined value uncontrolled
2023-08-11 14:54:29 -03:00
Jakob Guddas e6c3747153 chore: added custom title for release PRs (#1368) 2023-08-11 14:12:11 -03:00
github-actions[bot] d15b16ecab ci(changesets): version packages (#1366)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-11 12:20:17 -03:00
Junior Garcia fe03c42fa1 fix(tooltip): filter dom props function fixed (#1365)
* fix(tooltip): filter dom props function fixed

* fix(root): react types pkg updated
2023-08-11 12:06:47 -03:00
navedqb 25a918d146 Fixed incorrect import in card component (#1364) 2023-08-11 09:04:17 -03:00
github-actions[bot] 87918ac5b4 ci(changesets): version packages (#1360)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-10 23:47:40 -03:00
Junior Garcia a30cec4810 chore(root): react-aria packages upgraded (#1359) 2023-08-10 23:25:24 -03:00
github-actions[bot] 1b0653c97a ci(changesets): version packages (#1353)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-10 17:35:26 -03:00
Junior Garcia 710395f3a2 Refactor/remove needless exports system (#1350)
* fix(root): filter dom props func, accordion keep content mounted, navbaropen menu callbacks

* refactor(system): needeless exports removed

* refactor(system): needeless exports removed
2023-08-10 17:27:53 -03:00
github-actions[bot] e7e58e854a ci(changesets): version packages (#1352)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-10 17:19:51 -03:00
Junior Garcia d13a14facc Fix/events and props issues (#1351)
* fix(root): filter dom props func, accordion keep content mounted, navbaropen menu callbacks

* fix(docs): examples keys
2023-08-10 17:10:53 -03:00
Junior Garcia cef7235c4b fix(docs): compound variants typo 2023-08-10 08:54:38 -03:00
Junior Garcia fcff1a1d36 Merge branch 'main' of github.com:nextui-org/nextui 2023-08-09 23:39:57 -03:00
Junior Garcia c7ba9e1508 fix(docs): customize theme button example, color added 2023-08-09 23:39:44 -03:00
github-actions[bot] 1d8dc4b9d8 ci(changesets): version packages (#1339)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-09 21:51:25 -03:00
github-actions[bot] ea5e0fb096 ci(changesets): version packages (#1338)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-09 21:42:53 -03:00
Junior Garcia 26f64d043d fix(storybook): padding 2023-08-09 21:40:54 -03:00
Jakob Guddas a078c3dcd2 chore: storybook improvements (#1335) 2023-08-09 21:36:54 -03:00
Jakob Guddas 5a50390e3f fix: moved sr only modal close buttons to not show unnecessary scroll bar (#1333)
* fix: moved sr only modal close buttons to not show unnecessary scroll bar

* Create sour-lizards-allow.md
2023-08-09 21:36:14 -03:00
Tianen Pang 894d85d059 docs(table): use case example (#1326) 2023-08-08 14:43:40 -03:00
github-actions[bot] 0ef41d27e7 ci(changesets): version packages (#1324)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-08 12:28:30 -03:00
Tianen Pang 4200164712 fix(input): duplicate triggering of input events (#1323)
* feat(utils): support for omit-names

* fix(input): exclude duplicate event props

* fix(input): exclude duplicate event fn only

* test(input): event fn call count

* chore(changeset): changeset added
2023-08-08 12:19:08 -03:00
Tianen Pang 6d4c6980d5 fix(docs): typo in the loading more data section (#1319) 2023-08-08 09:10:10 -03:00
github-actions[bot] f3f36a7146 ci(changesets): version packages (#1316)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-08 01:04:01 -03:00
Junior Garcia 8de209bff7 feat(root): new changeset 2023-08-08 00:56:56 -03:00
Junior Garcia e9d01be74d chore(root): eslint and prettier ignore updated 2023-08-08 00:45:14 -03:00
Junior Garcia 66ac2e67ae feat(root): new changeset 2023-08-08 00:44:58 -03:00
Junior Garcia 7ed88f39c1 chore(pagination): fix prettier 2023-08-08 00:41:58 -03:00
vaynevayne 32d18bfd41 Update pagination-item.tsx (#1315) 2023-08-08 00:41:09 -03:00
vaynevayne a1b32c1ceb Update use-pagination.ts (#1314) 2023-08-08 00:39:01 -03:00
Junior Garcia 9e683b32ba Merge branch 'main' of github.com:nextui-org/nextui 2023-08-08 00:12:35 -03:00
Junior Garcia b7c947805d feat(storybook): logo adapted to light/dark theme, favicon added 2023-08-08 00:12:21 -03:00
github-actions[bot] a76fdfa774 ci(changesets): version packages (#1310)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-07 23:40:34 -03:00
Junior Garcia ac605eb71f Fix/1307 input on value change (#1309)
* fix(input): inner event handler implemented

* chore(root): changeset added
2023-08-07 23:31:16 -03:00
Junior Garcia 5b343b6181 chore(root): storybook static files removed 2023-08-06 15:56:24 -03:00
Junior Garcia 05562dcf90 feat(root): storybook v7 2023-08-06 15:41:25 -03:00
github-actions[bot] 0a60388258 ci(changesets): version packages (#1302)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-06 15:23:26 -03:00
Junior Garcia d794225cb7 Pr/1224 (#1301)
* chore: storybook migration

* chore: storybook migration

* chore: storybook migration

* fix: moved options in arg types out of control

* fix: fixed type issues

* fix: renamed sb:start script to start

* chore: migrate csf 2 to csf 3

* fix: removed storybook build from root build script

* chore: kick

* chore(root): pnpm lock updated

* chore(root): new changeset

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2023-08-06 15:04:26 -03:00
Junior Garcia ec2ed200f5 fix(docs): navbar imports 2023-08-06 14:53:19 -03:00
Junior Garcia 2f7703ec8e fix(docs): navbar imports 2023-08-06 14:53:12 -03:00
Junior Garcia 25cbe1146f chore(root): qa action parallelized again 2023-08-06 12:06:57 -03:00
Junior Garcia 3db9b6248e chore(root): qa action parallelized again 2023-08-06 11:59:43 -03:00
github-actions[bot] b1b5eda15b ci(changesets): version packages (#1293)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-06 00:02:27 -03:00
Junior Garcia e3e13a095f chore(root): new changeset 2023-08-05 23:49:42 -03:00
Junior Garcia 86f921d098 Feat/server components (#1291)
* feat(root): rsc components added, packages modified, filter dom props function adapted

* fix(root): eslint/prettier issues

* feat(root): exports changed to named, new pkg for system rsc compatible functions
2023-08-05 23:35:28 -03:00
Junior Garcia eefda8d6e2 feat(root): RSC components added, packages modified, filter dom props function adapted (#1289)
* feat(root): rsc components added, packages modified, filter dom props function adapted

* fix(root): eslint/prettier issues
2023-08-05 18:53:34 -03:00
Junior Garcia 2e4ce7bcee chore(root): all qa processes joined into a single one 2023-08-05 18:40:08 -03:00
Junior Garcia 5a4c4f498d chore(root): build step added to tests QA 2023-08-05 18:34:17 -03:00
Junior Garcia ec30a9adbd refactor(root): sotybook build folder added to repo 2023-08-05 11:14:27 -03:00
Junior Garcia a6954c4156 Merge branch 'main' of github.com:nextui-org/nextui 2023-08-05 11:13:53 -03:00
Junior Garcia b887a2f503 refactor(root): sotybook build folder added to repo 2023-08-05 11:13:37 -03:00
github-actions[bot] edc2bc741e ci(changesets): version packages (#1284)
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
2023-08-05 10:54:54 -03:00
Tianen Pang a1a02dc0db fix(tooltip): behavior of tooltip trigger with delay (#1278)
* fix(tooltip): use trigger-props instead of custom on-pointer events

* chore(changeset): add tooltip changeset
2023-08-05 10:46:01 -03:00
1180 changed files with 89121 additions and 17960 deletions
+3
View File
@@ -10,6 +10,9 @@
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
},
"ignore": [
"@nextui-org/docs",
"@nextui-org/storybook"
+22
View File
@@ -0,0 +1,22 @@
language: "en"
early_access: false
reviews:
high_level_summary: true
poem: false
review_status: true
collapse_walkthrough: false
auto_review:
enabled: true
ignore_title_keywords:
- "WIP"
- "DO NOT MERGE"
- 'ci(changesets)'
drafts: false
base_branches:
- "main"
- "develop"
- "fix/.*"
- "chore/.*"
- "feat/.*"
chat:
auto_reply: true
+1 -1
View File
@@ -3,7 +3,7 @@ const conventional = require("@commitlint/config-conventional");
module.exports = {
extends: ["@commitlint/config-conventional"],
plugins: ["commitlint-plugin-function-rules"],
helpUrl: "https://github.com/nextui-org/nextui/blob/main/CONTRIBUTING.MD#commit-convention",
helpUrl: "https://github.com/nextui-org/nextui/blob/main/CONTRIBUTING.md#commit-convention",
rules: {
...conventional.rules,
"type-enum": [
+1
View File
@@ -1,6 +1,7 @@
.now/*
.next/*
*.css
.changeset
dist
esm/*
public/*
+10
View File
@@ -21,6 +21,16 @@ body:
- NextUI's [Discussions tab](https://github.com/nextui-org/nextui/discussions)
The more information you fill in, the better the community can help you.
- type: input
id: version
attributes:
label: NextUI Version
description: |
Please provide the version of NextUI you are using.
You can find the version number in the package.json file.
placeholder: ex. 2.0.10
validations:
required: true
- type: textarea
id: description
attributes:
+2 -1
View File
@@ -33,6 +33,7 @@ jobs:
uses: changesets/action@v1
with:
publish: pnpm release
title: "ci(changesets): :package: version packages"
commit: "ci(changesets): version packages"
setupGitUser: false
env:
@@ -48,4 +49,4 @@ jobs:
pnpm release:dev
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+1
View File
@@ -20,6 +20,7 @@ coverage
dist/
storybook-static
/packages/storybook/public/tailwind.css
# misc
.DS_Store
.env
+2 -2
View File
@@ -13,12 +13,12 @@ const removeIgnoredFiles = async (files) => {
};
module.exports = {
"**/*.{cjs,mjs,js,ts,jsx,tsx}": async (files) => {
"**/*.{js,ts,jsx,tsx}": async (files) => {
const filesToLint = await removeIgnoredFiles(files);
return [`eslint -c .eslintrc.json --max-warnings=0 --fix ${filesToLint}`];
},
"**/*.{css,json,md}": async (files) => {
"**/*.css": async (files) => {
const filesToLint = await removeIgnoredFiles(files);
return [`prettier --config .prettierrc.json --ignore-path --write ${filesToLint}`];
+1
View File
@@ -2,6 +2,7 @@ dist
node_modules
plop
coverage
.changeset
.next
build
scripts
+1 -1
View File
@@ -2,6 +2,6 @@
"typescript.tsdk": "node_modules/typescript/lib",
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
"source.fixAll.eslint": "explicit"
}
}
+28 -14
View File
@@ -118,12 +118,13 @@ We use [Turbo Repo](https://turborepo.org/) for the project management.
```bash
## Start the dev babel server of NextUI core components
pnpm dev:nextui
pnpm dev
## optional
pnpm dev:docs ## this will start the documentation next.js server and it will automatically detect the changes in the components.
pnpm start:sb ## this will start the storybook server for a faster development and testing.
pnpm sb ## this will start the storybook server for a faster development and testing.
pnpm dev:docs ## this will start the documentation next.js server and it will automatically detect the changes in the components.
```
- If you will be working just on the documentation source code / mdx, you can use the following commands to build
@@ -131,7 +132,7 @@ pnpm start:sb ## this will start the storybook server for a faster development a
```bash
## Build NextUI source components
pnpm build:nextui
pnpm build
## Start the next.js documentation dev server
pnpm dev:docs
@@ -141,10 +142,6 @@ pnpm dev:docs
```bash
pnpm sb
#or
pnpm start:sb
```
Remember that these commands must be executed in the root folder of the project.
@@ -166,23 +163,40 @@ git checkout -b fix/something
All commits that fix bugs or add features need a test.
You can run the nest command for component specific tests.
```
```bash
# Test current code
pnpm test:update # or npm run test:update
pnpm test
# or
npm run test
```
```bash
# Test isolated component code
pnpm test:update src/button # or npm run test:update src/button
pnpm test button
# or
npm run test button
```
5. Be sure the package builds.
```
```bash
# Build current code
pnpm build # or npm run build
pnpm build
# or
npm run build
```
> Note: ensure your version of Node is 14 or higher to run scripts
> Note: ensure your version of Node is 16 or higher to run scripts
6. Send your pull request:
+5 -1
View File
@@ -12,4 +12,8 @@ IS_PREVIEW=true/false
ANALYZE_BUNDLE=true/false
# Vercel preview env (is used for taking the docs directly from the project files)
NEXT_PUBLIC_PREVIEW=true/false
NEXT_PUBLIC_PREVIEW=true/false
## Featurebase
NEXT_PUBLIC_FB_FEEDBACK_ORG=
NEXT_PUBLIC_FB_FEEDBACK_URL=
+1 -1
View File
@@ -202,7 +202,7 @@
"email": null,
"twitter": null,
"github": "https://github.com/HighError",
"website": "https://higherror.github.io/"
"website": null
},
{
"MemberId": 409558,
+6 -1
View File
@@ -7,6 +7,7 @@ import {format, parseISO} from "date-fns";
import NextLink from "next/link";
import {Balancer} from "react-wrap-balancer";
import {__DEV__, __PREVIEW__} from "@/utils";
import {MDXContent} from "@/components/mdx-content";
import {siteConfig} from "@/config/site";
import {Route} from "@/libs/docs/page";
@@ -18,6 +19,8 @@ interface BlogPostProps {
};
}
const isDraftVisible = __DEV__ || __PREVIEW__;
async function getBlogPostFromParams({params}: BlogPostProps) {
const slug = params.slug || "";
const post = allBlogPosts.find((post) => post.slugAsParams === slug);
@@ -78,7 +81,7 @@ export async function generateStaticParams(): Promise<BlogPostProps["params"][]>
export default async function DocPage({params}: BlogPostProps) {
const {post} = await getBlogPostFromParams({params});
if (!post) {
if (!post || (post.draft && !isDraftVisible)) {
notFound();
}
@@ -96,6 +99,7 @@ export default async function DocPage({params}: BlogPostProps) {
<ChevronRightLinearIcon className="rotate-180 inline-block mr-1" size={15} />
Back to blog
</Link>
<time className="block text-small mb-2 text-default-500" dateTime={post.date}>
{format(parseISO(post.date), "LLLL d, yyyy")}
</time>
@@ -119,6 +123,7 @@ export default async function DocPage({params}: BlogPostProps) {
</div>
<h1 className="mb-2 font-bold text-4xl">
<Balancer>{post.title}</Balancer>
<strong className="text-default-300">{post?.draft && " (Draft)"}</strong>
</h1>
<MDXContent code={post.body.code} />
</div>
+12 -1
View File
@@ -2,9 +2,20 @@ import {allBlogPosts} from "contentlayer/generated";
import {compareDesc} from "date-fns";
import {BlogPostList} from "@/components/blog-post";
import {__DEV__, __PREVIEW__} from "@/utils";
const isDraftVisible = __DEV__ || __PREVIEW__;
export default function Blog() {
const posts = allBlogPosts.sort((a, b) => compareDesc(new Date(a.date), new Date(b.date)));
const posts = allBlogPosts
.sort((a, b) => compareDesc(new Date(a.date), new Date(b.date)))
?.filter((post) => {
if (post.draft && !isDraftVisible) {
return false;
}
return true;
});
return (
<div className="w-full lg:px-16 mt-12">
+1 -1
View File
@@ -83,7 +83,7 @@ export default async function DocPage({params}: DocPageProps) {
if (!doc) {
notFound();
}
const editUrl = `${GITHUB_URL}/${REPO_NAME}/edit/${TAG}/${CONTENT_PATH}${currentRoute?.path}`;
const editUrl = `${GITHUB_URL}/${REPO_NAME}/edit/${TAG}${CONTENT_PATH}${currentRoute?.path}`;
return (
<>
+1 -1
View File
@@ -12,7 +12,7 @@ export default function DocsLayout({children}: DocsLayoutProps) {
<>
<main className="relative container mx-auto max-w-7xl z-10 px-6 min-h-[calc(100vh_-_64px_-_108px)] mb-12 flex-grow">
<div className="grid grid-cols-12">
<div className="hidden relative z-10 lg:block lg:col-span-2 mt-8 pr-4">
<div className="hidden overflow-visible relative z-10 lg:block lg:col-span-2 mt-8 pr-4">
<DocsSidebar routes={manifest.routes} />
</div>
{children}
@@ -0,0 +1,47 @@
/* eslint-disable no-console */
"use client";
import * as React from "react";
import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {useAsyncList} from "@react-stately/data";
type SWCharacter = {
name: string;
height: string;
mass: string;
birth_year: string;
};
export default function Page() {
let list = useAsyncList<SWCharacter>({
async load({signal, filterText}) {
let res = await fetch(`https://swapi.py4e.com/api/people/?search=${filterText}`, {signal});
let json = await res.json();
return {
items: json.results,
};
},
});
return (
<div className="p-6">
<Autocomplete
className="max-w-xs"
inputValue={list.filterText}
isLoading={list.isLoading}
items={list.items}
label="Select a character"
placeholder="Type to search..."
variant="bordered"
onInputChange={list.setFilterText}
>
{(item) => (
<AutocompleteItem key={item.name} className="capitalize">
{item.name}
</AutocompleteItem>
)}
</Autocomplete>
</div>
);
}
@@ -0,0 +1,113 @@
/* eslint-disable no-console */
"use client";
import * as React from "react";
import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {useInfiniteScroll} from "@nextui-org/use-infinite-scroll";
type Pokemon = {
name: string;
url: string;
};
type UsePokemonListProps = {
/** Delay to wait before fetching more items */
fetchDelay?: number;
};
function usePokemonList({fetchDelay = 0}: UsePokemonListProps = {}) {
const [items, setItems] = React.useState<Pokemon[]>([]);
const [hasMore, setHasMore] = React.useState(true);
const [isLoading, setIsLoading] = React.useState(false);
const [offset, setOffset] = React.useState(0);
const limit = 10; // Number of items per page, adjust as necessary
const loadPokemon = async (currentOffset: number) => {
const controller = new AbortController();
const {signal} = controller;
try {
setIsLoading(true);
if (offset > 0) {
// Delay to simulate network latency
await new Promise((resolve) => setTimeout(resolve, fetchDelay));
}
let res = await fetch(
`https://pokeapi.co/api/v2/pokemon?offset=${currentOffset}&limit=${limit}`,
{signal},
);
if (!res.ok) {
throw new Error("Network response was not ok");
}
let json = await res.json();
setHasMore(json.next !== null);
// Append new results to existing ones
setItems((prevItems) => [...prevItems, ...json.results]);
} catch (error) {
// @ts-ignore
if (error.name === "AbortError") {
console.log("Fetch aborted");
} else {
console.error("There was an error with the fetch operation:", error);
}
} finally {
setIsLoading(false);
}
};
React.useEffect(() => {
loadPokemon(offset);
}, []);
const onLoadMore = () => {
const newOffset = offset + limit;
setOffset(newOffset);
loadPokemon(newOffset);
};
return {
items,
hasMore,
isLoading,
onLoadMore,
};
}
export default function Page() {
const [isOpen, setIsOpen] = React.useState(false);
const {items, hasMore, isLoading, onLoadMore} = usePokemonList({fetchDelay: 1500});
const [, scrollerRef] = useInfiniteScroll({
hasMore,
isEnabled: isOpen,
shouldUseLoader: false, // We don't want to show the loader at the bottom of the list
onLoadMore,
});
return (
<div className="p-6">
<Autocomplete
className="max-w-xs"
defaultItems={items}
isLoading={isLoading}
label="Pick a Pokemon"
placeholder="Select a Pokemon"
scrollRef={scrollerRef}
variant="bordered"
onOpenChange={setIsOpen}
>
{(item) => (
<AutocompleteItem key={item.name} className="capitalize">
{item.name}
</AutocompleteItem>
)}
</Autocomplete>
</div>
);
}
@@ -0,0 +1,107 @@
"use client";
import * as React from "react";
import {Autocomplete, AutocompleteItem, MenuTriggerAction} from "@nextui-org/react";
import {useFilter} from "@react-aria/i18n";
const animals = [
{label: "Cat", value: "cat", description: "The second most popular pet in the world"},
{label: "Dog", value: "dog", description: "The most popular pet in the world"},
{label: "Elephant", value: "elephant", description: "The largest land animal"},
{label: "Lion", value: "lion", description: "The king of the jungle"},
{label: "Tiger", value: "tiger", description: "The largest cat species"},
{label: "Giraffe", value: "giraffe", description: "The tallest land animal"},
{
label: "Dolphin",
value: "dolphin",
description: "A widely distributed and diverse group of aquatic mammals",
},
{label: "Penguin", value: "penguin", description: "A group of aquatic flightless birds"},
{label: "Zebra", value: "zebra", description: "A several species of African equids"},
{
label: "Shark",
value: "shark",
description: "A group of elasmobranch fish characterized by a cartilaginous skeleton",
},
{
label: "Whale",
value: "whale",
description: "Diverse group of fully aquatic placental marine mammals",
},
{label: "Otter", value: "otter", description: "A carnivorous mammal in the subfamily Lutrinae"},
{label: "Crocodile", value: "crocodile", description: "A large semiaquatic reptile"},
];
type FieldState = {
selectedKey: React.Key | null;
inputValue: string;
items: typeof animals;
};
export default function Page() {
// Store ComboBox input value, selected option, open state, and items
// in a state tracker
const [fieldState, setFieldState] = React.useState<FieldState>({
selectedKey: "",
inputValue: "",
items: animals,
});
// Implement custom filtering logic and control what items are
// available to the Autocomplete.
const {startsWith} = useFilter({sensitivity: "base"});
// Specify how each of the Autocomplete values should change when an
// option is selected from the list box
const onSelectionChange = (key: React.Key) => {
setFieldState((prevState) => {
let selectedItem = prevState.items.find((option) => option.value === key);
return {
inputValue: selectedItem?.label || "",
selectedKey: key,
items: animals.filter((item) => startsWith(item.label, selectedItem?.label || "")),
};
});
};
// Specify how each of the Autocomplete values should change when the input
// field is altered by the user
const onInputChange = (value: string) => {
setFieldState((prevState) => ({
inputValue: value,
selectedKey: value === "" ? null : prevState.selectedKey,
items: animals.filter((item) => startsWith(item.label, value)),
}));
};
// Show entire list if user opens the menu manually
const onOpenChange = (isOpen: boolean, menuTrigger: MenuTriggerAction) => {
if (menuTrigger === "manual" && isOpen) {
setFieldState((prevState) => ({
inputValue: prevState.inputValue,
selectedKey: prevState.selectedKey,
items: animals,
}));
}
};
return (
<div className="p-6">
<Autocomplete
className="max-w-xs"
inputValue={fieldState.inputValue}
items={fieldState.items}
label="Favorite Animal"
placeholder="Select an animal"
selectedKey={fieldState.selectedKey}
variant="bordered"
onInputChange={onInputChange}
onOpenChange={onOpenChange}
onSelectionChange={onSelectionChange}
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
</div>
);
}
@@ -44,12 +44,12 @@ export default function Page() {
];
return (
<Navbar isBordered onMenuOpenChange={setIsMenuOpen}>
<NavbarContent className="sm:hidden" justify="start">
<NavbarMenuToggle aria-label={isMenuOpen ? "Close menu" : "Open menu"} />
</NavbarContent>
<NavbarContent className="sm:hidden pr-3" justify="center">
<Navbar onMenuOpenChange={setIsMenuOpen}>
<NavbarContent>
<NavbarMenuToggle
aria-label={isMenuOpen ? "Close menu" : "Open menu"}
className="sm:hidden"
/>
<NavbarBrand>
<AcmeLogo />
<p className="font-bold text-inherit">ACME</p>
@@ -57,17 +57,13 @@ export default function Page() {
</NavbarContent>
<NavbarContent className="hidden sm:flex gap-4" justify="center">
<NavbarBrand>
<AcmeLogo />
<p className="font-bold text-inherit">ACME</p>
</NavbarBrand>
<NavbarItem>
<Link color="foreground" href="#">
Features
</Link>
</NavbarItem>
<NavbarItem isActive>
<Link aria-current="page" color="warning" href="#">
<Link aria-current="page" href="#">
Customers
</Link>
</NavbarItem>
@@ -77,25 +73,23 @@ export default function Page() {
</Link>
</NavbarItem>
</NavbarContent>
<NavbarContent justify="end">
<NavbarItem className="hidden lg:flex">
<Link href="#">Login</Link>
</NavbarItem>
<NavbarItem>
<Button as={Link} color="warning" href="#" variant="flat">
<Button as={Link} color="primary" href="#" variant="flat">
Sign Up
</Button>
</NavbarItem>
</NavbarContent>
<NavbarMenu>
{menuItems.map((item, index) => (
<NavbarMenuItem key={`${item}-${index}`}>
<Link
className="w-full"
color={
index === 2 ? "warning" : index === menuItems.length - 1 ? "danger" : "foreground"
index === 2 ? "primary" : index === menuItems.length - 1 ? "danger" : "foreground"
}
href="#"
size="lg"
@@ -28,6 +28,8 @@ const AcmeLogo = () => (
);
export default function Page() {
const [isMenuOpen, setIsMenuOpen] = React.useState<boolean | undefined>(false);
const menuItems = [
"Profile",
"Dashboard",
@@ -42,12 +44,12 @@ export default function Page() {
];
return (
<Navbar disableAnimation isBordered>
<NavbarContent className="sm:hidden" justify="start">
<NavbarMenuToggle />
</NavbarContent>
<NavbarContent className="sm:hidden pr-3" justify="center">
<Navbar disableAnimation onMenuOpenChange={setIsMenuOpen}>
<NavbarContent>
<NavbarMenuToggle
aria-label={isMenuOpen ? "Close menu" : "Open menu"}
className="sm:hidden"
/>
<NavbarBrand>
<AcmeLogo />
<p className="font-bold text-inherit">ACME</p>
@@ -55,17 +57,13 @@ export default function Page() {
</NavbarContent>
<NavbarContent className="hidden sm:flex gap-4" justify="center">
<NavbarBrand>
<AcmeLogo />
<p className="font-bold text-inherit">ACME</p>
</NavbarBrand>
<NavbarItem>
<Link color="foreground" href="#">
Features
</Link>
</NavbarItem>
<NavbarItem isActive>
<Link aria-current="page" color="warning" href="#">
<Link aria-current="page" href="#">
Customers
</Link>
</NavbarItem>
@@ -75,25 +73,23 @@ export default function Page() {
</Link>
</NavbarItem>
</NavbarContent>
<NavbarContent justify="end">
<NavbarItem className="hidden lg:flex">
<Link href="#">Login</Link>
</NavbarItem>
<NavbarItem>
<Button as={Link} color="warning" href="#" variant="flat">
<Button as={Link} color="primary" href="#" variant="flat">
Sign Up
</Button>
</NavbarItem>
</NavbarContent>
<NavbarMenu>
{menuItems.map((item, index) => (
<NavbarMenuItem key={`${item}-${index}`}>
<Link
className="w-full"
color={
index === 2 ? "warning" : index === menuItems.length - 1 ? "danger" : "foreground"
index === 2 ? "primary" : index === menuItems.length - 1 ? "danger" : "foreground"
}
href="#"
size="lg"
@@ -61,7 +61,8 @@ export default function Page() {
classNames={{
base: "max-w-full sm:max-w-[10rem] h-10",
input: "text-small",
inputWrapper: "font-normal text-default-500 bg-default-400/20 dark:bg-default-500/20",
inputWrapper:
"h-full font-normal text-default-500 bg-default-400/20 dark:bg-default-500/20",
}}
placeholder="Type to search..."
startContent={<SearchLinearIcon size={18} />}
+311 -9
View File
@@ -9,10 +9,17 @@ import {
Textarea,
Input,
Tab,
Avatar,
Select,
SelectItem,
AccordionItem,
Pagination,
extendVariants,
PaginationItem,
} from "@nextui-org/react";
import {useState} from "react";
import {useFilter} from "@react-aria/i18n";
import {useEffect, useMemo, useRef, useState} from "react";
import {useSearchParams} from "next/navigation";
import {SearchLinearIcon} from "@/components/icons";
@@ -117,15 +124,15 @@ const MyInput = extendVariants(Input, {
},
size: {
xs: {
inputWrapper: "h-unit-6 min-h-unit-6 px-1",
inputWrapper: "h-6 min-h-6 px-1",
input: "text-tiny",
},
md: {
inputWrapper: "h-unit-10 min-h-unit-10",
inputWrapper: "h-10 min-h-10",
input: "text-small",
},
xl: {
inputWrapper: "h-unit-14 min-h-unit-14",
inputWrapper: "h-14 min-h-14",
input: "text-medium",
},
},
@@ -175,16 +182,302 @@ const MyButton2 = extendVariants(Button, {
xl: "px-12 py-6 text-xl",
},
},
defaultVariants: {},
defaultVariants: {
color: "foreground",
},
});
const usersData = [
{
id: 1,
name: "Tony Reichert",
role: "CEO",
team: "Management",
status: "active",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/1.png",
email: "tony.reichert@example.com",
},
{
id: 2,
name: "Zoey Lang",
role: "Tech Lead",
team: "Development",
status: "paused",
age: "25",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/1.png",
email: "zoey.lang@example.com",
},
{
id: 3,
name: "Jane Fisher",
role: "Sr. Dev",
team: "Development",
status: "active",
age: "22",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/2.png",
email: "jane.fisher@example.com",
},
{
id: 4,
name: "William Howard",
role: "C.M.",
team: "Marketing",
status: "vacation",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/2.png",
email: "william.howard@example.com",
},
{
id: 5,
name: "Kristen Copper",
role: "S. Manager",
team: "Sales",
status: "active",
age: "24",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/3.png",
email: "kristen.cooper@example.com",
},
{
id: 6,
name: "Brian Kim",
role: "P. Manager",
team: "Management",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/3.png",
email: "brian.kim@example.com",
status: "Active",
},
{
id: 7,
name: "Michael Hunt",
role: "Designer",
team: "Design",
status: "paused",
age: "27",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/4.png",
email: "michael.hunt@example.com",
},
{
id: 8,
name: "Samantha Brooks",
role: "HR Manager",
team: "HR",
status: "active",
age: "31",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/4.png",
email: "samantha.brooks@example.com",
},
{
id: 9,
name: "Frank Harrison",
role: "F. Manager",
team: "Finance",
status: "vacation",
age: "33",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/5.png",
email: "frank.harrison@example.com",
},
{
id: 10,
name: "Emma Adams",
role: "Ops Manager",
team: "Operations",
status: "active",
age: "35",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/5.png",
email: "emma.adams@example.com",
},
{
id: 11,
name: "Brandon Stevens",
role: "Jr. Dev",
team: "Development",
status: "active",
age: "22",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/7.png",
email: "brandon.stevens@example.com",
},
{
id: 12,
name: "Megan Richards",
role: "P. Manager",
team: "Product",
status: "paused",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/7.png",
email: "megan.richards@example.com",
},
{
id: 13,
name: "Oliver Scott",
role: "S. Manager",
team: "Security",
status: "active",
age: "37",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/8.png",
email: "oliver.scott@example.com",
},
{
id: 14,
name: "Grace Allen",
role: "M. Specialist",
team: "Marketing",
status: "active",
age: "30",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/8.png",
email: "grace.allen@example.com",
},
{
id: 15,
name: "Noah Carter",
role: "IT Specialist",
team: "I. Technology",
status: "paused",
age: "31",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/9.png",
email: "noah.carter@example.com",
},
{
id: 16,
name: "Ava Perez",
role: "Manager",
team: "Sales",
status: "active",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/9.png",
email: "ava.perez@example.com",
},
{
id: 17,
name: "Liam Johnson",
role: "Data Analyst",
team: "Analysis",
status: "active",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/11.png",
email: "liam.johnson@example.com",
},
{
id: 18,
name: "Sophia Taylor",
role: "QA Analyst",
team: "Testing",
status: "active",
age: "27",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/11.png",
email: "sophia.taylor@example.com",
},
{
id: 19,
name: "Lucas Harris",
role: "Administrator",
team: "Information Technology",
status: "paused",
age: "32",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/12.png",
email: "lucas.harris@example.com",
},
{
id: 20,
name: "Mia Robinson",
role: "Coordinator",
team: "Operations",
status: "active",
age: "26",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/12.png",
email: "mia.robinson@example.com",
},
];
export default function NextUIPerf() {
const [textA, setTextA] = useState<string | undefined>("");
const [textB, setTextB] = useState<string | undefined>("");
const [textC, setTextC] = useState<string | undefined>("");
const [textA, setTextA] = useState<string>("");
const [textB, setTextB] = useState<string>("");
const [textC, setTextC] = useState<string>("");
const [isOpen, setIsOpen] = useState<boolean>(false);
const [inputValue, setInputValue] = useState<string>();
const [selectedKey, setSelectedKey] = useState<string>("");
const searchParams = useSearchParams();
const page = Number(searchParams.get("page"));
let {startsWith} = useFilter({sensitivity: "base"});
const filteredItems = inputValue
? usersData.filter((item) => startsWith(item.name, inputValue))
: usersData;
const inputRef = useRef<HTMLInputElement>(null);
useEffect(() => {
isOpen && inputRef?.current?.focus();
}, [isOpen]);
const handleSelectionChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
setSelectedKey(e.target.value);
};
const topContent = useMemo(() => {
return (
<Input
ref={inputRef}
isClearable
aria-activedescendant={selectedKey}
aria-expanded={isOpen}
aria-label="Search user"
autoComplete="off"
autoCorrect="off"
className="z-10 sticky top-1"
placeholder="Search..."
spellCheck={false}
startContent={<SearchLinearIcon className="text-default-400" size={18} strokeWidth="2" />}
type="text"
onValueChange={setInputValue}
/>
);
}, [inputRef, selectedKey, isOpen]);
return (
<div className="w-full p-24 gap-4 flex flex-col">
<Select
classNames={{
base: "max-w-xs",
listboxWrapper: "scroll-pb-6 scroll-pt-28",
}}
items={filteredItems}
label="Assigned to"
labelPlacement="outside"
listboxProps={{
topContent,
variant: "flat",
classNames: {
base: [
"before:content-[''] before:rounded-t-medium before:fixed before:w-full before:h-14 before:z-10",
"before:top-0 before:left-0 before:bg-gradient-to-b before:from-default-50",
],
},
}}
placeholder="Select a user"
selectedKeys={[selectedKey]}
showScrollIndicators={false}
variant="flat"
onChange={handleSelectionChange}
onOpenChange={setIsOpen}
>
{(item) => (
<SelectItem key={item.id} textValue={item.name}>
<div className="flex gap-2 items-center">
<Avatar alt={item.name} className="flex-shrink-0" size="sm" src={item.avatar} />
<div className="flex flex-col">
<span className="text-small">{item.name}</span>
<span className="text-tiny text-default-400">{item.email}</span>
</div>
</div>
</SelectItem>
)}
</Select>
<Accordion>
<AccordionItem key="1" aria-label="Accordion 1" title="Accordion 1">
Non est aliqua tempor occaecat laborum. Lorem culpa minim irure mollit. Est qui
@@ -253,7 +546,16 @@ export default function NextUIPerf() {
<Button>Click Me!</Button>
<MyButton2 color="foreground">Press Me!</MyButton2>
<MyButton2 color="primary">Press Me!</MyButton2>
<Pagination
showControls
initialPage={page ?? 1}
renderItem={({page, ...itemProps}) => {
return <PaginationItem href={`/examples/perf?page=${page}`} {...itemProps} />;
}}
total={10}
/>
</div>
);
}
@@ -0,0 +1,113 @@
/* eslint-disable no-console */
"use client";
import {Select, SelectItem} from "@nextui-org/react";
import {useEffect, useState} from "react";
import {useInfiniteScroll} from "@nextui-org/use-infinite-scroll";
type Pokemon = {
name: string;
url: string;
};
type UsePokemonListProps = {
/** Delay to wait before fetching more items */
fetchDelay?: number;
};
function usePokemonList({fetchDelay = 0}: UsePokemonListProps = {}) {
const [items, setItems] = useState<Pokemon[]>([]);
const [hasMore, setHasMore] = useState(true);
const [isLoading, setIsLoading] = useState(false);
const [offset, setOffset] = useState(0);
const limit = 10; // Number of items per page, adjust as necessary
const loadPokemon = async (currentOffset: number) => {
const controller = new AbortController();
const {signal} = controller;
try {
setIsLoading(true);
if (offset > 0) {
// Delay to simulate network latency
await new Promise((resolve) => setTimeout(resolve, fetchDelay));
}
let res = await fetch(
`https://pokeapi.co/api/v2/pokemon?offset=${currentOffset}&limit=${limit}`,
{signal},
);
if (!res.ok) {
throw new Error("Network response was not ok");
}
let json = await res.json();
setHasMore(json.next !== null);
// Append new results to existing ones
setItems((prevItems) => [...prevItems, ...json.results]);
} catch (error) {
// @ts-ignore
if (error.name === "AbortError") {
console.log("Fetch aborted");
} else {
console.error("There was an error with the fetch operation:", error);
}
} finally {
setIsLoading(false);
}
};
useEffect(() => {
loadPokemon(offset);
}, []);
const onLoadMore = () => {
const newOffset = offset + limit;
setOffset(newOffset);
loadPokemon(newOffset);
};
return {
items,
hasMore,
isLoading,
onLoadMore,
};
}
export default function Page() {
const [isOpen, setIsOpen] = useState(false);
const {items, hasMore, isLoading, onLoadMore} = usePokemonList({fetchDelay: 1500});
const [, scrollerRef] = useInfiniteScroll({
hasMore,
isEnabled: isOpen,
shouldUseLoader: false, // We don't want to show the loader at the bottom of the list
onLoadMore,
});
return (
<div className="p-6">
<Select
className="max-w-xs"
isLoading={isLoading}
items={items}
label="Pick a Pokemon"
placeholder="Select a Pokemon"
scrollRef={scrollerRef}
selectionMode="single"
onOpenChange={setIsOpen}
>
{(item) => (
<SelectItem key={item.name} className="capitalize">
{item.name}
</SelectItem>
)}
</Select>
</div>
);
}
@@ -11,8 +11,8 @@ import {
Spinner,
Pagination,
} from "@nextui-org/react";
import {useAsyncList} from "@react-stately/data";
import {useCallback, useMemo, useState} from "react";
import {useMemo, useState} from "react";
import useSWR from "swr";
type SWCharacter = {
name: string;
@@ -21,50 +21,23 @@ type SWCharacter = {
birth_year: string;
};
const fetcher = (...args: Parameters<typeof fetch>) => fetch(...args).then((res) => res.json());
export default function Page() {
const [page, setPage] = useState(1);
const [total, setTotal] = useState(0);
const [isLoading, setIsLoading] = useState(true);
const {data, isLoading} = useSWR<{
count: number;
results: SWCharacter[];
}>(`https://swapi.py4e.com/api/people?page=${page}`, fetcher, {
keepPreviousData: true,
});
const rowsPerPage = 10;
let list = useAsyncList<SWCharacter>({
async load({signal, cursor}) {
// If no cursor is available, then we're loading the first page.
// Otherwise, the cursor is the next URL to load, as returned from the previous page.
const res = await fetch(cursor || "https://swapi.py4e.com/api/people/?search=", {signal});
let json = await res.json();
setTotal(json.count);
setIsLoading(false);
return {
items: json.results,
cursor: json.next,
};
},
});
const pages = Math.ceil(total / rowsPerPage);
const items = useMemo(() => {
const start = (page - 1) * rowsPerPage;
const end = start + rowsPerPage;
return list.items.slice(start, end);
}, [page, list.items?.length]);
const onPaginationChange = useCallback(
(page: number) => {
setIsLoading(true);
if (page >= list.items.length / rowsPerPage) {
list.loadMore();
}
setPage(page);
},
[list.items.length],
);
const pages = useMemo(() => {
return data?.count ? Math.ceil(data.count / rowsPerPage) : 0;
}, [data?.count, rowsPerPage]);
return (
<div className="p-6">
@@ -80,7 +53,7 @@ export default function Page() {
color="primary"
page={page}
total={pages}
onChange={onPaginationChange}
onChange={(page) => setPage(page)}
/>
</div>
) : null
@@ -96,8 +69,8 @@ export default function Page() {
<TableColumn key="birth_year">Birth year</TableColumn>
</TableHeader>
<TableBody
isLoading={isLoading && !items.length}
items={items}
isLoading={isLoading || data?.results.length === 0}
items={data?.results ?? []}
loadingContent={<Spinner />}
>
{(item) => (
@@ -105,7 +105,7 @@ const users = [
email: "kristen.cooper@example.com",
},
{
key: 6,
id: 6,
name: "Brian Kim",
role: "P. Manager",
team: "Management",
@@ -256,7 +256,7 @@ const users = [
},
];
type User = typeof users[0];
type User = (typeof users)[number];
export default function Page() {
const [filterValue, setFilterValue] = useState("");
+13 -9
View File
@@ -105,7 +105,7 @@ const users = [
email: "kristen.cooper@example.com",
},
{
key: 6,
id: 6,
name: "Brian Kim",
role: "P. Manager",
team: "Management",
@@ -256,7 +256,7 @@ const users = [
},
];
type User = typeof users[0];
type User = (typeof users)[number];
export default function Page() {
const [filterValue, setFilterValue] = useState("");
@@ -271,8 +271,6 @@ export default function Page() {
const [page, setPage] = useState(1);
const pages = Math.ceil(users.length / rowsPerPage);
const hasSearchFilter = Boolean(filterValue);
const headerColumns = useMemo(() => {
@@ -298,6 +296,8 @@ export default function Page() {
return filteredUsers;
}, [users, filterValue, statusFilter]);
const pages = Math.ceil(filteredItems.length / rowsPerPage);
const items = useMemo(() => {
const start = (page - 1) * rowsPerPage;
const end = start + rowsPerPage;
@@ -390,6 +390,11 @@ export default function Page() {
}
}, []);
const onClear = useCallback(() => {
setFilterValue("");
setPage(1);
}, []);
const topContent = useMemo(() => {
return (
<div className="flex flex-col gap-4">
@@ -400,7 +405,7 @@ export default function Page() {
placeholder="Search by name..."
startContent={<SearchIcon />}
value={filterValue}
onClear={() => setFilterValue("")}
onClear={() => onClear()}
onValueChange={onSearchChange}
/>
<div className="flex gap-3">
@@ -483,23 +488,22 @@ export default function Page() {
<span className="w-[30%] text-small text-default-400">
{selectedKeys === "all"
? "All items selected"
: `${selectedKeys.size} of ${items.length} selected`}
: `${selectedKeys.size} of ${filteredItems.length} selected`}
</span>
<Pagination
isCompact
showControls
showShadow
color="primary"
isDisabled={hasSearchFilter}
page={page}
total={pages}
onChange={setPage}
/>
<div className="hidden sm:flex w-[30%] justify-end gap-2">
<Button isDisabled={hasSearchFilter} size="sm" variant="flat" onPress={onPreviousPage}>
<Button isDisabled={pages === 1} size="sm" variant="flat" onPress={onPreviousPage}>
Previous
</Button>
<Button isDisabled={hasSearchFilter} size="sm" variant="flat" onPress={onNextPage}>
<Button isDisabled={pages === 1} size="sm" variant="flat" onPress={onNextPage}>
Next
</Button>
</div>
+2 -1
View File
@@ -24,7 +24,8 @@ export async function GET() {
url: `${siteConfig.siteUrl}/blog/${post.slug}`,
guid: `${siteConfig.siteUrl}/blog/${post.slug}`,
date: post.date,
author: `${author} <${siteConfig.email}>`,
// @ts-ignore - name does exist
author: `${author.name} <${siteConfig.email}>`,
categories: post.tags ?? [],
});
});
+3 -11
View File
@@ -1,6 +1,7 @@
import {Button, Image, Link} from "@nextui-org/react";
import {Image} from "@nextui-org/react";
import {Blockquote} from "@/components/docs/components/blockquote";
import {FigmaButton} from "@/components/figma-button";
export default function FigmaPage() {
return (
@@ -23,16 +24,7 @@ export default function FigmaPage() {
width="800"
/>
<div className="text-center max-w-2xl m-auto">
<Button className="max-w-fit" color="default" variant="bordered">
<Link
isExternal
showAnchorIcon
className="text-current"
href="https://www.figma.com/community/file/1267584376234254760"
>
Open in Figma
</Link>
</Button>
<FigmaButton />
<Blockquote color="warning">
This file is still in development and will be continuously updated.
</Blockquote>
+10 -3
View File
@@ -2,7 +2,6 @@ import "@/styles/globals.css";
import "@/styles/sandpack.css";
import {Metadata} from "next";
import {clsx} from "@nextui-org/shared-utils";
import {Analytics} from "@vercel/analytics/react";
import {Providers} from "./providers";
@@ -12,7 +11,8 @@ import {siteConfig} from "@/config/site";
import {fontSans} from "@/config/fonts";
import {Navbar} from "@/components/navbar";
import {Footer} from "@/components/footer";
import {__PROD__} from "@/utils";
import {ProBanner} from "@/components/pro-banner";
import {ScriptProviders} from "@/components/scripts/script-providers";
export const metadata: Metadata = {
title: {
@@ -53,6 +53,12 @@ export const metadata: Metadata = {
},
],
creator: "jrgarciadev",
alternates: {
canonical: "https://nextui.org",
types: {
"application/rss+xml": [{url: "https://nextui.org/feed.xml", title: "NextUI RSS Feed"}],
},
},
viewport:
"viewport-fit=cover, width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0",
};
@@ -64,13 +70,14 @@ export default function RootLayout({children}: {children: React.ReactNode}) {
<body className={clsx("min-h-screen bg-background font-sans antialiased", fontSans.variable)}>
<Providers themeProps={{attribute: "class", defaultTheme: "dark"}}>
<div className="relative flex flex-col" id="app-container">
<ProBanner />
<Navbar mobileRoutes={manifest.mobileRoutes} routes={manifest.routes} />
{children}
<Footer />
</div>
<Cmdk />
</Providers>
{__PROD__ && <Analytics />}
<ScriptProviders />
</body>
</html>
);
+3 -1
View File
@@ -1,4 +1,4 @@
import {Spacer} from "@nextui-org/react";
import {Spacer} from "@nextui-org/spacer";
import {Hero} from "@/components/marketing/hero";
import {FeaturesGrid} from "@/components/marketing/features-grid";
@@ -12,6 +12,7 @@ import {Community} from "@/components/marketing/community";
import {Support} from "@/components/marketing/support";
import landingContent from "@/content/landing";
import {getAllSponsors} from "@/utils/get-all-sponsors";
import {Sponsors} from "@/components/marketing/sponsors";
async function getData() {
try {
@@ -33,6 +34,7 @@ export default async function Home() {
<section className="flex flex-col items-center justify-center">
<Hero />
<FeaturesGrid features={landingContent.topFeatures} />
<Sponsors />
<CustomThemes />
<A11yOtb />
<DarkMode />
+4 -1
View File
@@ -4,6 +4,7 @@ import * as React from "react";
import {NextUIProvider} from "@nextui-org/react";
import {ThemeProvider as NextThemesProvider} from "next-themes";
import {ThemeProviderProps} from "next-themes/dist/types";
import {useRouter} from "next/navigation";
export interface ProvidersProps {
children: React.ReactNode;
@@ -11,8 +12,10 @@ export interface ProvidersProps {
}
export function Providers({children, themeProps}: ProvidersProps) {
const router = useRouter();
return (
<NextUIProvider>
<NextUIProvider navigate={router.push}>
<NextThemesProvider {...themeProps}>{children}</NextThemesProvider>
</NextUIProvider>
);
+21 -10
View File
@@ -1,21 +1,31 @@
"use client";
import {BlogPost} from "contentlayer/generated";
import {Card, CardFooter, CardBody, CardHeader, Link, Avatar} from "@nextui-org/react";
import {Card, CardFooter, CardBody, CardHeader, Link, Avatar, Image} from "@nextui-org/react";
import Balancer from "react-wrap-balancer";
import {format, parseISO} from "date-fns";
import NextLink from "next/link";
import {AnimatePresence, motion} from "framer-motion";
import {useIsMounted} from "@/hooks/use-is-mounted";
import {trackEvent} from "@/utils/va";
const BlogPostCard = (post: BlogPost) => {
const isMounted = useIsMounted();
const handlePress = () => {
trackEvent("BlogPostCard - Selection", {
name: post.title,
action: "click",
category: "blog",
data: post.url ?? "",
});
};
return (
<AnimatePresence>
{isMounted && (
<motion.div
<motion.article
animate={{opacity: 1, y: 0}}
exit={{opacity: 0, y: 5}}
initial={{opacity: 0, y: 5}}
@@ -24,9 +34,10 @@ const BlogPostCard = (post: BlogPost) => {
<Card
isBlurred
as={NextLink}
className="p-2 border-transparent text-start bg-white/5 dark:bg-default-400/10 backdrop-blur-lg backdrop-saturate-[1.8]"
className="p-2 h-full border-transparent text-start bg-white/5 dark:bg-default-400/10 backdrop-blur-lg backdrop-saturate-[1.8]"
href={post.url}
isPressable={!!post.url}
onPress={handlePress}
>
<CardHeader>
<Link
@@ -35,23 +46,23 @@ const BlogPostCard = (post: BlogPost) => {
href={post.url}
size="lg"
underline="hover"
onPress={handlePress}
>
<Balancer>{post.title}</Balancer>
</Link>
</CardHeader>
<CardBody className="px-3 pt-0 pb-1">
<p className="font-normal text-default-600">
<Balancer>{post.description}</Balancer>
</p>
<CardBody className="pt-0 px-2 pb-1">
<Image className="mb-4" src={post.image} />
<p className="font-normal w-full text-default-600">{post.description}</p>
</CardBody>
<CardFooter className="flex justify-between items-center">
<time className="block text-small text-default-500" dateTime={post.date}>
{format(parseISO(post.date), "LLLL d, yyyy")}
{format(parseISO(post.date), "LLLL d, yyyy")} {post?.draft && " (Draft)"}
</time>
<Avatar size="sm" src={post.author?.avatar} />
</CardFooter>
</Card>
</motion.div>
</motion.article>
)}
</AnimatePresence>
);
@@ -59,7 +70,7 @@ const BlogPostCard = (post: BlogPost) => {
export const BlogPostList = ({posts}: {posts: BlogPost[]}) => {
return (
<div className="mt-10 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<div className="mt-10 grid gap-4 grid-cols-[repeat(auto-fill,minmax(300px,1fr))]">
{posts.map((post, idx) => (
<BlogPostCard key={idx} {...post} />
))}
+26
View File
@@ -25,6 +25,7 @@ import {
import searchData from "@/config/search-meta.json";
import {useUpdateEffect} from "@/hooks/use-update-effect";
import {trackEvent} from "@/utils/va";
const hideOnPaths = ["examples"];
@@ -175,6 +176,13 @@ export const Cmdk: FC<{}> = () => {
const matches = intersectionBy(...matchesForEachWord, "objectID").slice(0, MAX_RESULTS);
trackEvent("Cmdk - Search", {
name: "cmdk - search",
action: "search",
category: "cmdk",
data: {query, words, matches: matches?.map((match) => match.url).join(", ")},
});
return matches;
},
[query],
@@ -190,10 +198,21 @@ export const Cmdk: FC<{}> = () => {
if (e?.key?.toLowerCase() === "k" && e[hotkey]) {
e.preventDefault();
isOpen ? onClose() : onOpen();
trackEvent("Cmdk - Open/Close", {
name: "cmdk - open/close",
action: "keydown",
category: "cmdk",
data: isOpen ? "close" : "open",
});
}
};
document.addEventListener("keydown", onKeyDown);
return () => {
document.removeEventListener("keydown", onKeyDown);
};
}, [isOpen]);
const onItemSelect = useCallback(
@@ -201,6 +220,13 @@ export const Cmdk: FC<{}> = () => {
onClose();
router.push(item.url);
addToRecentSearches(item);
trackEvent("Cmdk - ItemSelect", {
name: item.content,
action: "click",
category: "cmdk",
data: item.url,
});
},
[router, recentSearches],
);
@@ -108,9 +108,9 @@ function CodeTypewriter({value, className, css, ...props}: any) {
return (
<Pre className={className} css={css} {...props}>
<code
dangerouslySetInnerHTML={{__html: value}}
ref={wrapperRef}
className={className}
dangerouslySetInnerHTML={{__html: value}}
style={{opacity: 0}}
/>
</Pre>
@@ -155,7 +155,7 @@ const CodeBlock = React.forwardRef<HTMLPreElement, CodeBlockProps>((_props, forw
{...props}
>
{showWindowIcons && <WindowActions title={title} />}
<code className={clsx(classes, codeClasses)} dangerouslySetInnerHTML={{__html: result}} />
<code dangerouslySetInnerHTML={{__html: result}} className={clsx(classes, codeClasses)} />
</Pre>
);
});
+1 -1
View File
@@ -57,7 +57,7 @@ export const DemoCodeModal: FC<DemoCodeModalProps> = ({isOpen, code, title, subt
<>
This is an example of how to use the {lowerTitle} component, for more information
please visit the&nbsp;
<NextUILink as={Link} href={`/docs/${lowerTitle}`}>
<NextUILink as={Link} href={`/docs/components/${lowerTitle}`}>
{lowerTitle}
</NextUILink>
&nbsp;docs.
@@ -3,6 +3,8 @@
import {useRef} from "react";
import {Button} from "@nextui-org/react";
import {trackEvent} from "@/utils/va";
export const CustomButton = () => {
const buttonRef = useRef<HTMLButtonElement | null>(null);
@@ -26,6 +28,11 @@ export const CustomButton = () => {
x: targetCenterX / clientWidth,
},
});
trackEvent("LandingPage - Confetti Button", {
action: "press",
category: "landing-page",
});
};
return (
+5 -5
View File
@@ -1,6 +1,6 @@
"use client";
import {Card, CardBody, Button, Image, Progress, CardProps} from "@nextui-org/react";
import {Card, CardBody, Button, Image, Slider, CardProps} from "@nextui-org/react";
import {useState, FC} from "react";
import {clsx} from "@nextui-org/shared-utils";
import NextImage from "next/image";
@@ -63,15 +63,15 @@ export const MusicPlayer: FC<MusicPlayerProps> = ({className, ...otherProps}) =>
</div>
<div className="flex flex-col mt-3 gap-1">
<Progress
<Slider
aria-label="Music progress"
classNames={{
indicator: "bg-default-800 dark:bg-white",
track: "bg-default-500/30",
thumb: "w-2 h-2 after:w-2 after:h-2 after:bg-foreground",
}}
color="default"
color="foreground"
defaultValue={33}
size="sm"
value={33}
/>
<div className="flex justify-between">
<p className="text-sm">1:23</p>
@@ -31,11 +31,12 @@ interface CodeDemoProps extends UseCodeDemoProps, WindowResizerProps {
showSandpackPreview?: boolean;
initialEditorOpen?: boolean;
enableResize?: boolean;
showTabs?: boolean;
showPreview?: boolean;
hideWindowActions?: boolean;
showOpenInCodeSandbox?: boolean;
isPreviewCentered?: boolean;
resizeEnabled?: boolean;
typescriptStrict?: boolean;
displayMode?: "always" | "visible";
isGradientBox?: boolean;
gradientColor?: GradientBoxProps["color"];
@@ -51,16 +52,19 @@ export const CodeDemo: React.FC<CodeDemoProps> = ({
showEditor = true,
showPreview = true,
asIframe = false,
showTabs = true,
resizeEnabled = true,
hideWindowActions = false,
showSandpackPreview = false,
isPreviewCentered = false,
// when false .js files will be used
typescriptStrict = false,
showOpenInCodeSandbox,
isGradientBox = false,
defaultExpanded = false,
previewHeight = "auto",
overflow = "visible",
displayMode = "always",
showTabs = true,
gradientColor,
highlightedLines,
iframeInitialWidth,
@@ -96,6 +100,7 @@ export const CodeDemo: React.FC<CodeDemoProps> = ({
const content = asIframe ? (
<WindowResizer
hideWindowActions={hideWindowActions}
iframeHeight={previewHeight}
iframeInitialWidth={iframeInitialWidth}
iframeSrc={iframeSrc}
@@ -121,6 +126,7 @@ export const CodeDemo: React.FC<CodeDemoProps> = ({
isGradientBox,
gradientColor,
previewHeight,
hideWindowActions,
asIframe,
showPreview,
isInView,
@@ -138,6 +144,7 @@ export const CodeDemo: React.FC<CodeDemoProps> = ({
showEditor={showEditor}
showOpenInCodeSandbox={showOpenInCodeSandbox || showPreview}
showPreview={showSandpackPreview}
typescriptStrict={typescriptStrict}
/>
);
@@ -2,6 +2,8 @@ import React from "react";
import {LivePreview, LiveProvider, LiveError} from "react-live";
import {clsx} from "@nextui-org/shared-utils";
import * as Components from "@nextui-org/react";
import * as intlDateUtils from "@internationalized/date";
import * as reactAriaI18n from "@react-aria/i18n";
import {BgGridContainer} from "@/components/bg-grid-container";
import {GradientBox, GradientBoxProps} from "@/components/gradient-box";
@@ -19,6 +21,8 @@ export interface ReactLiveDemoProps {
export const scope = {
...Components,
...intlDateUtils,
...reactAriaI18n,
} as Record<string, unknown>;
export const ReactLiveDemo: React.FC<ReactLiveDemoProps> = ({
@@ -49,6 +49,7 @@ const resizer = tv({
export interface WindowResizerProps {
resizeEnabled?: boolean;
hideWindowActions?: boolean;
iframeHeight?: string | number;
iframeMinWidth?: number;
iframeSrc?: string;
@@ -70,6 +71,7 @@ const WindowResizer: React.FC<WindowResizerProps> = (props) => {
iframeSrc,
iframeTitle,
resizeEnabled,
hideWindowActions = false,
iframeHeight: height = "420px",
iframeInitialWidth,
iframeMinWidth: minWidth = MIN_WIDTH,
@@ -120,7 +122,7 @@ const WindowResizer: React.FC<WindowResizerProps> = (props) => {
width: isMobile ? "100%" : browserWidth,
}}
>
<WindowActions className="bg-default-100 dark:bg-default-50" />
{!hideWindowActions && <WindowActions className="bg-default-100 dark:bg-default-50" />}
<motion.iframe ref={iframeRef} className={iframe()} src={iframeSrc} title={iframeTitle} />
</motion.div>
{resizeEnabled && (
@@ -1,6 +1,7 @@
import React, {forwardRef} from "react";
import {clsx, getUniqueID} from "@nextui-org/shared-utils";
import React, {forwardRef, useEffect} from "react";
import {clsx, dataAttr, getUniqueID} from "@nextui-org/shared-utils";
import BaseHighlight, {Language, PrismTheme, defaultProps} from "prism-react-renderer";
import {debounce, omit} from "lodash";
import defaultTheme from "@/libs/prism-theme";
@@ -9,13 +10,26 @@ interface CodeblockProps {
codeString: string;
metastring?: string;
theme?: PrismTheme;
children?: React.ReactNode;
showLines?: boolean;
removeIndent?: boolean;
hideScrollBar?: boolean;
className?: string;
children?: (props: any) => React.ReactNode;
}
type HighlightStyle = "inserted" | "deleted" | undefined;
const nextuiCliCommand = [
/^init$/,
/^add$/,
/^upgrade$/,
/^remove$/,
/^list$/,
/^env$/,
/^doctor$/,
];
const highlightStyleToken = ["bun", /nextui\s\w+(?=\s?)/, /^nextui$/, "Usage", ...nextuiCliCommand];
const RE = /{([\d,-]+)}/;
const calculateLinesToHighlight = (meta?: string) => {
@@ -60,11 +74,70 @@ const Codeblock = forwardRef<HTMLPreElement, CodeblockProps>(
const shouldHighlightLine = calculateLinesToHighlight(metastring);
const isMultiLine = codeString.split("\n").length > 2;
const lastSelectionText = React.useRef<string | null>(null);
const isDiff = language.includes("diff");
const codeLang = isDiff ? (language.split("-")[1] as Language) : language;
let highlightStyle: HighlightStyle[] = [];
if (isDiff) {
let code: string[] = [];
highlightStyle = codeString.split?.("\n").map((line) => {
if (line.startsWith("+")) {
code.push(line.substr(1));
return "inserted";
}
if (line.startsWith("-")) {
code.push(line.substr(1));
return "deleted";
}
code.push(line);
});
codeString = code.join("\n");
}
useEffect(() => {
const handleSelectionChange = () => {
if (!window.getSelection) return;
const el = window.getSelection()?.anchorNode?.parentNode;
if (!el) return;
const selectionText = window.getSelection()?.toString();
if (!selectionText) return;
if (
!selectionText ||
selectionText === lastSelectionText.current ||
!codeString.includes(selectionText)
)
return;
lastSelectionText.current = selectionText;
};
const debouncedHandleSelectionChange = debounce(handleSelectionChange, 1000);
document.addEventListener("selectionchange", debouncedHandleSelectionChange);
return () => {
document.removeEventListener("selectionchange", debouncedHandleSelectionChange);
};
}, []);
return (
<BaseHighlight
{...defaultProps}
code={codeString}
language={language}
language={codeLang}
theme={theme}
{...props}
>
@@ -83,8 +156,8 @@ const Codeblock = forwardRef<HTMLPreElement, CodeblockProps>(
return (
<div
{...omit(lineProps, ["key"])}
key={`${i}-${getUniqueID("line-wrapper")}`}
{...lineProps}
className={clsx(
lineProps.className,
removeIndent ? "pr-4" : "px-4",
@@ -97,17 +170,34 @@ const Codeblock = forwardRef<HTMLPreElement, CodeblockProps>(
shouldHighlightLine(i),
},
)}
data-deleted={dataAttr(highlightStyle?.[i] === "deleted")}
data-inserted={dataAttr(highlightStyle?.[i] === "inserted")}
>
{showLines && (
<span className="select-none text-xs mr-6 opacity-30">{i + 1}</span>
)}
{line.map((token, key) => (
<span
key={`${key}-${getUniqueID("line")}`}
{...getTokenProps({token, key})}
className={className}
/>
))}
{line.map((token, key) => {
// Bun has no color style by default in the code block, so hack add in here
const props = getTokenProps({token, key}) || {};
return (
<span
{...omit(props, ["key"])}
key={`${key}-${getUniqueID("line")}`}
className={className}
style={{
...props.style,
...(highlightStyleToken.some((t) => {
const regex = t instanceof RegExp ? t : new RegExp(t);
return regex.test(token.content.trim());
})
? {color: "rgb(var(--code-function))"}
: {}),
}}
/>
);
})}
</div>
);
})}
@@ -1,12 +1,18 @@
import {Button, ButtonProps, Link} from "@nextui-org/react";
import {Button, ButtonProps, Code, Link, Tooltip} from "@nextui-org/react";
import {ReactNode} from "react";
import Balancer from "react-wrap-balancer";
import {GithubIcon, NpmIcon, AdobeIcon, StorybookIcon} from "@/components/icons";
import {GithubIcon, NpmIcon, AdobeIcon, StorybookIcon, NextJsIcon} from "@/components/icons";
import {COMPONENT_PATH, COMPONENT_THEME_PATH} from "@/libs/github/constants";
import {trackEvent} from "@/utils/va";
export interface ComponentLinksProps {
component: string;
npm?: string;
source?: string;
styles?: string;
storybook?: string;
rscCompatible?: boolean;
reactAriaHook?: string;
}
@@ -14,27 +20,53 @@ const ButtonLink = ({
children,
href,
startContent,
tooltip,
...props
}: ButtonProps & {
href: string;
}) => (
<Button
isExternal
as={Link}
className="!text-small py-4 bg-default-100 dark:bg-default-50 text-default-700"
href={href}
size="sm"
startContent={startContent}
{...props}
>
{children}
</Button>
);
tooltip?: string | ReactNode;
}) => {
const handlePress = () => {
if (!href) return;
trackEvent("ComponentLinks - Click", {
category: "docs",
action: "click",
data: href || "",
});
};
const button = (
<Button
isExternal
as={Link}
className="!text-small py-4 bg-default-100 dark:bg-default-50 text-default-700"
href={href}
size="sm"
startContent={startContent}
onPress={handlePress}
{...props}
>
{children}
</Button>
);
return tooltip ? (
<Tooltip className="max-w-[230px]" content={tooltip}>
{button}
</Tooltip>
) : (
button
);
};
export const ComponentLinks = ({
component,
npm,
source,
storybook,
styles,
rscCompatible,
reactAriaHook,
}: ComponentLinksProps) => {
if (!component) {
@@ -44,16 +76,18 @@ export const ComponentLinks = ({
return (
<div className="flex flex-wrap gap-3 mt-6">
<ButtonLink
href={`https://storybook.nextui.org/?path=/story/components-${storybook || component}`}
href={`https://storybook.nextui.org/?path=/story/components-${
storybook || component
}--default`}
startContent={<StorybookIcon className="text-lg text-[#ff4785]" />}
>
Storybook
</ButtonLink>
<ButtonLink
href={`https://www.npmjs.com/package/@nextui-org/${component}`}
href={`https://www.npmjs.com/package/@nextui-org/${npm || component}`}
startContent={<NpmIcon className="text-2xl text-[#E53E3E]" />}
>
{`@nextui-org/${component}`}
{`@nextui-org/${npm || component}`}
</ButtonLink>
{reactAriaHook && (
<ButtonLink
@@ -63,7 +97,30 @@ export const ComponentLinks = ({
React Aria
</ButtonLink>
)}
<ButtonLink href={`${COMPONENT_PATH}/${component}`} startContent={<GithubIcon size={20} />}>
{rscCompatible && (
<ButtonLink
href="https://nextjs.org/docs/app/building-your-application/rendering/server-components"
startContent={<NextJsIcon size={18} />}
tooltip={
<p>
<Balancer>
This component doesn&apos;t use the
<Code className="font-normal bg-transparent px-0 py-0 text-code-mdx">
`use client;`
</Code>
directive making it compatible with RSC.
</Balancer>
</p>
}
>
Server component
</ButtonLink>
)}
<ButtonLink
href={`${COMPONENT_PATH}/${source || component}`}
startContent={<GithubIcon size={20} />}
>
Source
</ButtonLink>
<ButtonLink
@@ -1,17 +1,24 @@
import {Tabs, Tab, Snippet} from "@nextui-org/react";
import {Key, useState} from "react";
import Codeblock from "./codeblock";
import {YarnIcon, NpmSmallIcon, PnpmIcon} from "@/components/icons";
import {YarnIcon, NpmSmallIcon, PnpmIcon, BunIcon, CLIBoldIcon} from "@/components/icons";
type PackageManagerName = "npm" | "yarn" | "pnpm";
type PackageManagerName = "cli" | "npm" | "yarn" | "pnpm" | "bun";
type PackageManager = {
icon: JSX.Element;
label?: string;
name: PackageManagerName;
};
const packageManagers: PackageManager[] = [
{
name: "cli",
label: "CLI",
icon: <CLIBoldIcon className="text-lg text-default-600 dark:text-default-400" />,
},
{
name: "npm",
icon: <NpmSmallIcon className="text-[#E53E3E]" />,
@@ -24,13 +31,25 @@ const packageManagers: PackageManager[] = [
name: "pnpm",
icon: <PnpmIcon className="text-[#F69220]" />,
},
{
name: "bun",
icon: <BunIcon className="text-lg text-[#FBF0DF]" />,
},
];
export interface PackageManagersProps {
commands: Partial<Record<PackageManagerName, string>>;
commands: Partial<Record<PackageManagerName, React.Key>>;
}
export const PackageManagers = ({commands}: PackageManagersProps) => {
const [selectedManager, setSelectedManager] = useState<PackageManagerName>(
commands.cli ? "cli" : "npm",
);
const handleSelectionChange = (tabKey: Key) => {
setSelectedManager(tabKey as PackageManagerName);
};
return (
<Tabs
aria-label="NextUI installation commands"
@@ -38,9 +57,11 @@ export const PackageManagers = ({commands}: PackageManagersProps) => {
base: "group mt-4",
tabList: "h-10",
}}
selectedKey={selectedManager}
variant="underlined"
onSelectionChange={handleSelectionChange}
>
{packageManagers.map(({name, icon}) => {
{packageManagers.map(({name, label, icon}) => {
if (!commands[name]) return null;
return (
@@ -49,7 +70,7 @@ export const PackageManagers = ({commands}: PackageManagersProps) => {
title={
<div className="flex items-center space-x-2">
{icon}
<span>{name}</span>
<span>{label || name}</span>
</div>
}
>
@@ -20,7 +20,7 @@ type SwatchColors = {
type SwatchSetProps = {
colors: SwatchColors[];
isSematic?: boolean;
isSemantic?: boolean;
};
const scaleIndexMap: Record<number, string> = {
@@ -90,7 +90,7 @@ const Swatch = ({color, scale}: {color: string; scale?: string}) => {
);
};
const SematicSwatch = ({
const SemanticSwatch = ({
color,
className,
textClassName,
@@ -139,15 +139,15 @@ const SematicSwatch = ({
);
};
const SwatchSet = ({colors, isSematic = false}: SwatchSetProps) => (
const SwatchSet = ({colors, isSemantic = false}: SwatchSetProps) => (
<div className="flex flex-row flex-wrap items-center justify-center">
{colors.map(({title, items}) => (
<div key={title} className="flex flex-col items-start w-full h-full">
<h2 className="text-xl font-bold text-foreground">{title}</h2>
<div className="flex flex-row flex-wrap items-center justify-start w-full h-full px-4 py-1">
{items.map((c, index) =>
isSematic ? (
<SematicSwatch
isSemantic ? (
<SemanticSwatch
key={`${c.color}-${index}`}
className={c.className}
color={c.color}
@@ -218,7 +218,7 @@ export const CommonColors = () => {
export const SemanticColors = () => {
return (
<SwatchSet
isSematic
isSemantic
colors={[
{
title: "Layout",
+18 -7
View File
@@ -1,31 +1,43 @@
"use client";
import * as React from "react";
import NextLink from "next/link";
import {Link} from "@nextui-org/react";
import {useRouter} from "next/navigation";
import {ChevronIcon} from "@nextui-org/shared-icons";
import manifest from "@/config/routes.json";
import {removeFromLast} from "@/utils";
import {Route} from "@/libs/docs/page";
import {useDocsRoute} from "@/hooks/use-docs-route";
import {trackEvent} from "@/utils/va";
export interface FooterNavProps {
currentRoute?: Route;
}
export const DocsPager: React.FC<FooterNavProps> = ({currentRoute}) => {
const router = useRouter();
const {prevRoute, nextRoute} = useDocsRoute(manifest.routes, currentRoute);
const handlePress = (path: string) => {
trackEvent("DocsPager - Click", {
category: "docs",
action: "click",
data: path || "",
});
router.push(removeFromLast(path || "", "."));
};
return (
<div className="flex w-full justify-between py-20">
{prevRoute ? (
<Link
isBlock
as={NextLink}
className="flex gap-2"
className="cursor-pointer flex gap-2"
color="foreground"
href={removeFromLast(prevRoute.path || "", ".")}
onPress={() => handlePress(prevRoute.path || "")}
>
<ChevronIcon className="text-primary" height={20} width={20} />
{prevRoute.title}
@@ -36,10 +48,9 @@ export const DocsPager: React.FC<FooterNavProps> = ({currentRoute}) => {
{nextRoute && (
<Link
isBlock
as={NextLink}
className="flex gap-1 items-center"
className="cursor-pointer flex gap-1 items-center"
color="foreground"
href={removeFromLast(nextRoute.path || "", ".")}
onPress={() => handlePress(nextRoute.path || "")}
>
{nextRoute.title}
<ChevronIcon className="rotate-180 text-primary" height={20} width={20} />
+138 -67
View File
@@ -1,6 +1,6 @@
"use client";
import {FC} from "react";
import {FC, useEffect, useState} from "react";
import {ChevronIcon} from "@nextui-org/shared-icons";
import {CollectionBase, Expandable, MultipleSelection, Node, ItemProps} from "@react-types/shared";
import {BaseItem} from "@nextui-org/aria-utils";
@@ -21,11 +21,18 @@ import Link from "next/link";
import {isEmpty} from "lodash";
import {usePathname, useRouter} from "next/navigation";
import {ScrollArea} from "../scroll-area";
import {getRoutePaths} from "./utils";
import {Route} from "@/libs/docs/page";
import {TreeKeyboardDelegate} from "@/utils/tree-keyboard-delegate";
import {useScrollPosition} from "@/hooks/use-scroll-position";
import {trackEvent} from "@/utils/va";
import {FbFeedbackButton} from "@/components/featurebase/fb-feedback-button";
import {FbChangelogButton} from "@/components/featurebase/fb-changelog-button";
import {FbRoadmapLink} from "@/components/featurebase/fb-roadmap-link";
import {openFeedbackWidget} from "@/utils/featurebase";
import emitter from "@/libs/emitter";
export interface Props<T> extends Omit<ItemProps<T>, "title">, Route {
slug?: string;
@@ -68,6 +75,7 @@ function TreeItem<T>(props: TreeItemProps<T>) {
};
const isNew = item.props?.newPost;
const isUpdated = item.props?.updated;
const isExpanded = state.expandedKeys.has(key);
const isSelected =
@@ -82,18 +90,109 @@ function TreeItem<T>(props: TreeItemProps<T>) {
const Component = hasChildNodes ? "ul" : "li";
const cn = clsx(
"w-full",
"font-normal",
"before:mr-4",
"before:content-['']",
"before:block",
"before:bg-default-300",
"before:w-1",
"before:h-1",
"before:rounded-full",
);
const {pressProps} = usePress({
onPress: () => {
if (hasChildNodes) {
state.toggleKey(item.key);
} else {
router.push(paths.pathname);
trackEvent("SidebarDocs", {
category: "docs",
action: "click",
data: paths.pathname || "",
});
}
},
});
const {focusProps, isFocused, isFocusVisible} = useFocusRing();
const renderFeaturebaseComponent = (key: string) => {
if (key === "roadmap")
return <FbRoadmapLink className={cn} innerClassName="opacity-80 dark:opacity-60" />;
if (key === "changelog")
return (
<NextUILink as={Link} className={cn} color="foreground" href="#">
<FbChangelogButton />
</NextUILink>
);
return (
<NextUILink as={Link} className={cn} color="foreground" href="#" onClick={openFeedbackWidget}>
<FbFeedbackButton />
</NextUILink>
);
};
const renderComponent = () => {
if (hasChildNodes) {
return (
<span className="flex items-center gap-3">
<span>{rendered}</span>
<ChevronIcon
className={clsx("transition-transform", {
"-rotate-90": isExpanded,
})}
/>
</span>
);
}
if (typeof key === "string" && ["changelog", "feedback", "roadmap"].includes(key)) {
return renderFeaturebaseComponent(key);
}
return (
<NextUILink as={Link} className={clsx(cn)} color="foreground" href={paths.pathname}>
<span
className={clsx(
isSelected
? "text-primary font-medium dark:text-foreground"
: "opacity-80 dark:opacity-60",
{
"pointer-events-none": item.props?.comingSoon,
},
)}
>
{rendered}
</span>
{isUpdated && (
<Chip
className="ml-1 py-1 text-tiny text-default-400 bg-default-100/50"
color="default"
size="sm"
variant="flat"
>
Updated
</Chip>
)}
{isNew && (
<Chip className="ml-1 py-1 text-tiny" color="primary" size="sm" variant="flat">
New
</Chip>
)}
{item.props?.comingSoon && (
<Chip className="ml-1 py-1 text-tiny" color="default" size="sm" variant="flat">
Coming soon
</Chip>
)}
</NextUILink>
);
};
return (
<Component
{...focusProps}
@@ -101,7 +200,9 @@ function TreeItem<T>(props: TreeItemProps<T>) {
aria-expanded={dataAttr(hasChildNodes ? isExpanded : undefined)}
aria-selected={dataAttr(isSelected)}
className={clsx(
"flex flex-col gap-3 outline-none w-full tap-highlight-transparent",
"flex flex-col gap-3outline-none w-full tap-highlight-transparent",
hasChildNodes ? "mb-4" : "first:mt-4",
// focus ring
...dataFocusVisibleClasses,
)}
@@ -111,56 +212,9 @@ function TreeItem<T>(props: TreeItemProps<T>) {
>
<div className="flex items-center gap-3 cursor-pointer" {...pressProps}>
<Spacer x={spaceLeft} />
{hasChildNodes ? (
<span className="flex items-center gap-3">
<span>{rendered}</span>
<ChevronIcon
className={clsx("transition-transform", {
"-rotate-90": isExpanded,
})}
/>
</span>
) : (
<NextUILink
as={Link}
className={clsx(
"w-full",
"font-normal",
"before:mr-4",
"before:content-['']",
"before:block",
"before:bg-default-300",
"before:w-1",
"before:h-1",
"before:rounded-full",
)}
color="foreground"
href={paths.pathname}
>
<span
className={clsx(
isSelected
? "text-primary font-medium dark:text-foreground"
: "opacity-80 dark:opacity-60",
{
"pointer-events-none": item.props?.comingSoon,
},
)}
>
{rendered}
</span>
{isNew && (
<Chip className="ml-2" color="primary" size="sm" variant="flat">
New
</Chip>
)}
{item.props?.comingSoon && (
<Chip className="ml-2" color="default" size="sm" variant="flat">
Coming soon
</Chip>
)}
</NextUILink>
)}
{renderComponent()}
{/* Workaround to avoid scrollbar overlapping */}
<Spacer x={4} />
</div>
{isExpanded && hasChildNodes && (
<div className="flex flex-col gap-3 items-start" role="group">
@@ -189,9 +243,7 @@ function TreeHeading({item}: {item: any}) {
function Tree<T extends object>(props: CollectionBase<T> & Expandable & MultipleSelection) {
let state = useTreeState(props);
let ref = useRef<HTMLUListElement>(null);
const scrollPosition = useScrollPosition(ref);
let ref = useRef<HTMLDivElement>(null);
let keyboardDelegate = useMemo(
// @ts-expect-error
@@ -206,16 +258,11 @@ function Tree<T extends object>(props: CollectionBase<T> & Expandable & Multiple
});
return (
<ul
{...collectionProps}
<ScrollArea
ref={ref}
className="flex flex-col gap-4 scrollbar-hide lg:overflow-y-scroll lg:max-h-[calc(100vh_-_64px)] pb-28"
className="h-full lg:max-h-[calc(100vh_-_64px)]"
role="tree"
style={{
WebkitMaskImage: `linear-gradient(to top, transparent 0%, #000 100px, #000 ${
scrollPosition > 30 ? "90%" : "100%"
}, transparent 100%)`,
}}
{...collectionProps}
>
{[...state.collection].map((item) => {
if (item.type === "section") {
@@ -224,7 +271,7 @@ function Tree<T extends object>(props: CollectionBase<T> & Expandable & Multiple
return <TreeItem key={item.key} item={item} state={state} />;
})}
</ul>
</ScrollArea>
);
}
@@ -236,6 +283,8 @@ export interface DocsSidebarProps {
}
export const DocsSidebar: FC<DocsSidebarProps> = ({routes, slug, tag, className}) => {
const [isProBannerVisible, setIsProBannerVisible] = useState(true);
const expandedKeys = routes?.reduce((keys, route) => {
if (route.defaultOpen) {
keys.push(route.key as string);
@@ -244,8 +293,18 @@ export const DocsSidebar: FC<DocsSidebarProps> = ({routes, slug, tag, className}
return keys;
}, [] as string[]);
return (
<div className={clsx("lg:fixed lg:top-20 mt-2 z-0 lg:h-[calc(100vh-121px)]", className)}>
useEffect(() => {
emitter.on("proBannerVisibilityChange", (value) => {
setIsProBannerVisible(value === "visible");
});
return () => {
emitter.off("proBannerVisibilityChange");
};
}, []);
const treeContent = useMemo(() => {
return (
<Tree defaultExpandedKeys={expandedKeys} items={routes || []}>
{(route) => (
<Item
@@ -259,6 +318,18 @@ export const DocsSidebar: FC<DocsSidebarProps> = ({routes, slug, tag, className}
</Item>
)}
</Tree>
);
}, [routes]);
return (
<div
className={clsx(
"lg:fixed mt-2 z-0 lg:h-[calc(100vh-121px)]",
isProBannerVisible ? "lg:top-32" : "lg:top-20",
className,
)}
>
{treeContent}
</div>
);
};
+18 -2
View File
@@ -1,6 +1,6 @@
"use client";
import {FC, useRef, useEffect} from "react";
import {FC, useRef, useEffect, useState} from "react";
import {clsx} from "@nextui-org/shared-utils";
import {Divider, Spacer} from "@nextui-org/react";
import {ChevronCircleTopLinearIcon} from "@nextui-org/shared-icons";
@@ -9,6 +9,7 @@ import scrollIntoView from "scroll-into-view-if-needed";
import {Heading} from "@/libs/docs/utils";
import {useScrollSpy} from "@/hooks/use-scroll-spy";
import {useScrollPosition} from "@/hooks/use-scroll-position";
import emitter from "@/libs/emitter";
export interface DocsTocProps {
headings: Heading[];
@@ -22,6 +23,8 @@ const paddingLeftByLevel: Record<number, string> = {
};
export const DocsToc: FC<DocsTocProps> = ({headings}) => {
const [isProBannerVisible, setIsProBannerVisible] = useState(true);
const tocRef = useRef<HTMLDivElement>(null);
const scrollPosition = useScrollPosition(tocRef);
@@ -51,10 +54,23 @@ export const DocsToc: FC<DocsTocProps> = ({headings}) => {
}
}, [activeId, activeIndex]);
useEffect(() => {
emitter.on("proBannerVisibilityChange", (value) => {
setIsProBannerVisible(value === "visible");
});
return () => {
emitter.off("proBannerVisibilityChange");
};
}, []);
return (
<div
ref={tocRef}
className="fixed w-full max-w-[12rem] flex flex-col gap-4 text-left top-20 pb-20 h-[calc(100vh-121px)] scrollbar-hide overflow-y-scroll"
className={clsx(
"fixed w-full max-w-[12rem] flex flex-col gap-4 text-left pb-28 h-[calc(100vh-121px)] scrollbar-hide overflow-y-scroll",
isProBannerVisible ? "top-32" : "top-20",
)}
style={{
WebkitMaskImage: `linear-gradient(to top, transparent 0%, #000 100px, #000 ${
scrollPosition > 30 ? "90%" : "100%"
@@ -0,0 +1,46 @@
"use client";
import {useEffect} from "react";
import {trackEvent} from "@/utils/va";
type Props = {
className?: string;
};
// ref: https://developers.featurebase.app/install/changelog-widget/install
export const FbChangelogButton = ({className}: Props) => {
useEffect(() => {
const win = window as any;
if (typeof win.Featurebase !== "function") {
win.Featurebase = function () {
// eslint-disable-next-line prefer-rest-params
(win.Featurebase.q = win.Featurebase.q || []).push(arguments);
};
}
win.Featurebase("initialize_changelog_widget", {
organization: process.env.NEXT_PUBLIC_FB_FEEDBACK_ORG,
theme: "dark",
usersName: "",
fullscreenPopup: true,
alwaysShow: true,
});
}, []);
const fbButtonOnClick = () => {
(window as any).Featurebase("manually_open_changelog_popup");
trackEvent("Featurebase - Changelog", {
name: "featurebase-changelog",
action: "press",
category: "featurebase",
});
};
return (
<button className={className} onClick={fbButtonOnClick}>
Changelog <span id="fb-update-badge" />
</button>
);
};
@@ -0,0 +1,42 @@
"use client";
import {useEffect} from "react";
import {trackEvent} from "@/utils/va";
type Props = {
className?: string;
};
// ref: https://developers.featurebase.app/install/feedback-widget/setup
export const FbFeedbackButton = ({className}: Props) => {
useEffect(() => {
const win = window as any;
if (typeof win.Featurebase !== "function") {
win.Featurebase = function () {
// eslint-disable-next-line prefer-rest-params
(win.Featurebase.q = win.Featurebase.q || []).push(arguments);
};
}
win.Featurebase("initialize_feedback_widget", {
organization: process.env.NEXT_PUBLIC_FB_FEEDBACK_ORG,
theme: "dark",
email: "",
});
}, []);
const fbButtonOnClick = () => {
trackEvent("Featurebase - Feedback", {
name: "featurebase-feedback",
action: "press",
category: "featurebase",
});
};
return (
<button data-featurebase-feedback className={className} onClick={fbButtonOnClick}>
Feedback
</button>
);
};
@@ -0,0 +1,42 @@
"use client";
import NextLink from "next/link";
import arrowRightUpIcon from "@iconify/icons-solar/arrow-right-up-linear";
import {Icon} from "@iconify/react/dist/offline";
import {clsx} from "@nextui-org/shared-utils";
import {trackEvent} from "@/utils/va";
type Props = {
className?: string;
innerClassName?: string;
};
export const FbRoadmapLink = ({className, innerClassName}: Props) => {
const fbLinkOnClick = () => {
trackEvent("Featurebase - Roadmap", {
name: "featurebase-roadmap",
action: "press",
category: "featurebase",
});
};
return (
<NextLink
className={clsx("inline-flex items-center", className)}
color="foreground"
href={`${process.env.NEXT_PUBLIC_FB_FEEDBACK_URL}/roadmap`}
target="_blank"
onClick={fbLinkOnClick}
>
<div className={clsx("relative", innerClassName)}>
Roadmap
<Icon
className="absolute right-[-10px] top-0 outline-none transition-transform group-data-[hover=true]:translate-y-0.5 [&>path]:stroke-[2.5px]"
icon={arrowRightUpIcon}
width={10}
/>
</div>
</NextLink>
);
};
+25
View File
@@ -0,0 +1,25 @@
"use client";
import {Button, Link} from "@nextui-org/react";
import {trackEvent} from "@/utils/va";
export const FigmaButton = () => (
<Button
isExternal
showAnchorIcon
as={Link}
className="max-w-fit text-current"
color="default"
href="https://www.figma.com/community/file/1267584376234254760"
variant="bordered"
onPress={() => {
trackEvent("FigmaPage - Open Figma Link", {
action: "click",
category: "figma",
});
}}
>
Open in Figma
</Button>
);
+2 -8
View File
@@ -3,9 +3,8 @@
import dynamic from "next/dynamic";
import {usePathname} from "next/navigation";
import {siteConfig} from "@/config/site";
import {getCurrentYear} from "@/utils/time";
const Link = dynamic(() => import("@nextui-org/react").then((mod) => mod.Link));
const VercelCallout = dynamic(() => import("./vercel-callout").then((mod) => mod.VercelCallout));
export const Footer = () => {
@@ -18,12 +17,7 @@ export const Footer = () => {
return (
<footer className="container mx-auto max-w-7xl pb-12 px-12">
<div className="flex flex-col justify-center items-center gap-1">
<p className="text-sm text-default-400">
Created&nbsp;by&nbsp;
<Link isExternal className="text-sm" href={siteConfig.links.portfolio}>
Junior Garcia
</Link>
</p>
<p className="text-sm text-default-400">© {getCurrentYear()} NextUI Inc.</p>
<VercelCallout />
</div>
</footer>
+22
View File
@@ -0,0 +1,22 @@
import {IconSvgProps} from "@/types";
export const CLIBoldIcon = ({...props}: IconSvgProps) => (
<svg
aria-hidden="true"
fill="none"
focusable="false"
height="1em"
role="presentation"
viewBox="0 0 24 24"
width="1em"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
clipRule="evenodd"
d="M3.464 3.464C2 4.93 2 7.286 2 12c0 4.714 0 7.071 1.464 8.535C4.93 22 7.286 22 12 22c4.714 0 7.071 0 8.535-1.465C22 19.072 22 16.714 22 12s0-7.071-1.465-8.536C19.072 2 16.714 2 12 2S4.929 2 3.464 3.464m2.96 6.056a.75.75 0 0 1 1.056-.096l.277.23c.605.504 1.12.933 1.476 1.328c.379.42.674.901.674 1.518s-.295 1.099-.674 1.518c-.356.395-.871.824-1.476 1.328l-.277.23a.75.75 0 1 1-.96-1.152l.234-.195c.659-.55 1.09-.91 1.366-1.216c.262-.29.287-.427.287-.513c0-.086-.025-.222-.287-.513c-.277-.306-.707-.667-1.366-1.216l-.234-.195a.75.75 0 0 1-.096-1.056M17.75 15a.75.75 0 0 1-.75.75h-5a.75.75 0 0 1 0-1.5h5a.75.75 0 0 1 .75.75"
fill="currentColor"
fillRule="evenodd"
/>
</svg>
);
+1
View File
@@ -16,3 +16,4 @@ export * from "./hash";
export * from "./more-square";
export * from "./play";
export * from "./pause";
export * from "./cli";
+23
View File
@@ -0,0 +1,23 @@
import {IconSvgProps} from "@/types";
export const CLILinearIcon = ({...props}: IconSvgProps) => (
<svg
aria-hidden="true"
fill="none"
focusable="false"
height="1em"
role="presentation"
viewBox="0 0 24 24"
width="1em"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<g fill="none" stroke="currentColor" strokeWidth="1.5">
<path d="M2 12c0-4.714 0-7.071 1.464-8.536C4.93 2 7.286 2 12 2c4.714 0 7.071 0 8.535 1.464C22 4.93 22 7.286 22 12c0 4.714 0 7.071-1.465 8.535C19.072 22 16.714 22 12 22s-7.071 0-8.536-1.465C2 19.072 2 16.714 2 12Z" />
<path
d="M17 15h-5m-5-5l.234.195c1.282 1.068 1.923 1.602 1.923 2.305c0 .703-.64 1.237-1.923 2.305L7 15"
strokeLinecap="round"
/>
</g>
</svg>
);
@@ -20,3 +20,4 @@ export * from "./chevron-right";
export * from "./search";
export * from "./simple-grid";
export * from "./rotate-left";
export * from "./cli";
+39
View File
@@ -223,6 +223,44 @@ const AstroIcon: React.FC<IconSvgProps> = ({width = "1em", height = "1em", ...pr
);
};
const BunIcon: React.FC<IconSvgProps> = ({width = "1em", height = "1em", ...props}) => {
return (
<svg aria-hidden="true" height={height} viewBox="0 0 32 32" width={width} {...props}>
<path
d="M29 17c0 5.65-5.82 10.23-13 10.23S3 22.61 3 17c0-3.5 2.24-6.6 5.66-8.44S14.21 4.81 16 4.81s3.32 1.54 7.34 3.71C26.76 10.36 29 13.46 29 17"
fill="#fbf0df"
/>
<path
d="M16 27.65c7.32 0 13.46-4.65 13.46-10.65c0-3.72-2.37-7-5.89-8.85c-1.39-.75-2.46-1.41-3.37-2l-1.13-.69A6.14 6.14 0 0 0 16 4.35a6.88 6.88 0 0 0-3.3 1.23c-.42.24-.86.51-1.32.8c-.87.54-1.83 1.13-3 1.73C4.91 10 2.54 13.24 2.54 17c0 6 6.14 10.65 13.46 10.65Z"
fill="none"
stroke="#000"
/>
<ellipse cx="21.65" cy="18.62" fill="#febbd0" rx="2.17" ry="1.28" />
<ellipse cx="10.41" cy="18.62" fill="#febbd0" rx="2.17" ry="1.28" />
<path
d="M11.43 18.11a2 2 0 1 0-2-2.05a2.05 2.05 0 0 0 2 2.05m9.2 0a2 2 0 1 0-2-2.05a2 2 0 0 0 2 2.05"
fillRule="evenodd"
/>
<path
d="M10.79 16.19a.77.77 0 1 0-.76-.77a.76.76 0 0 0 .76.77m9.2 0a.77.77 0 1 0 0-1.53a.77.77 0 0 0 0 1.53"
fill="#fff"
fillRule="evenodd"
/>
<path
d="M18.62 19.67a3.3 3.3 0 0 1-1.09 1.75a2.48 2.48 0 0 1-1.5.69a2.53 2.53 0 0 1-1.5-.69a3.28 3.28 0 0 1-1.08-1.75a.26.26 0 0 1 .29-.3h4.58a.27.27 0 0 1 .3.3Z"
fill="#b71422"
stroke="#000"
strokeWidth=".75"
/>
<path
d="M14.93 5.75a6.09 6.09 0 0 1-2.09 4.62c-.1.09 0 .27.11.22c1.25-.49 2.94-1.94 2.23-4.88c-.03-.15-.25-.11-.25.04m.85 0a6 6 0 0 1 .57 5c0 .13.12.24.21.13c.83-1 1.54-3.11-.59-5.31c-.1-.11-.27.04-.19.17Zm1-.06a6.09 6.09 0 0 1 2.53 4.38c0 .14.21.17.24 0c.34-1.3.15-3.51-2.66-4.66c-.12-.02-.21.18-.09.27ZM9.94 9.55a6.27 6.27 0 0 0 3.89-3.33c.07-.13.28-.08.25.07c-.64 3-2.79 3.59-4.13 3.51c-.14-.01-.14-.21-.01-.25"
fill="#ccbea7"
fillRule="evenodd"
/>
</svg>
);
};
const NewNextJSIcon: React.FC<IconSvgProps> = ({width = "1em", height = "1em", ...props}) => {
return (
<svg aria-hidden="true" fill="none" focusable="false" height={height} width={width} {...props}>
@@ -452,4 +490,5 @@ export {
CodeSandboxIcon,
JavascriptIcon,
TypescriptIcon,
BunIcon,
};
File diff suppressed because one or more lines are too long
@@ -6,6 +6,8 @@ import {Card, CardHeader, CardBody, LinkProps, SlotsToClasses} from "@nextui-org
import {useRouter} from "next/navigation";
import {LinkIcon} from "@nextui-org/shared-icons";
import {trackEvent} from "@/utils/va";
const styles = tv({
slots: {
base: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",
@@ -38,6 +40,13 @@ export const FeaturesGrid: React.FC<FeaturesGridProps> = ({features, classNames,
const slots = styles();
const handleClick = (feat: Feature) => {
trackEvent("FeaturesGrid - Click", {
name: feat.title,
action: "click",
category: "docs",
data: feat.href ?? "",
});
if (!feat.href) {
return;
}
@@ -105,12 +105,14 @@ export const FloatingComponents: React.FC<{}> = () => {
{isMounted && (
<Tooltip
showArrow
className="text-sm animate-[levitate_14s_ease_infinite]"
color="secondary"
content="Developers love Next.js"
isOpen={!isTablet}
placement="top"
style={{
zIndex: 39,
}}
>
<Button
className="absolute left-[200px] top-[160px] max-w-fit animate-[levitate_14s_ease_infinite_0.5s]"
+42 -1
View File
@@ -1,7 +1,7 @@
"use client";
import NextLink from "next/link";
import {Button, Link} from "@nextui-org/react";
import {Button, Link, Chip} from "@nextui-org/react";
import {ArrowRightIcon} from "@nextui-org/shared-icons";
import dynamic from "next/dynamic";
@@ -9,15 +9,40 @@ import {FloatingComponents} from "./floating-components";
import {title, subtitle} from "@/components/primitives";
import {GithubIcon} from "@/components/icons";
import {trackEvent} from "@/utils/va";
const BgLooper = dynamic(() => import("./bg-looper").then((mod) => mod.BgLooper), {
ssr: false,
});
export const Hero = () => {
const handlePressAnnouncement = (name: string, url: string) => {
trackEvent("NavbarItem", {
name,
action: "press",
category: "home - gero",
data: url,
});
};
return (
<section className="flex relative overflow-hidden lg:overflow-visible w-full flex-nowrap justify-between items-center h-[calc(100vh_-_64px)] 2xl:h-[calc(84vh_-_64px)]">
<div className="flex relative z-20 flex-col gap-6 w-full lg:w-1/2 xl:mt-10">
<div className="w-full flex justify-center md:hidden">
<Chip
as={NextLink}
className="bg-default-100/50 hover:bg-default-100 border-default-200/80 dark:border-default-100/80 transition-colors cursor-pointer"
color="default"
href="/blog/v2.3.0"
variant="dot"
onClick={() => handlePressAnnouncement("Introducing v2.3.0", "/blog/v2.3.0")}
>
Introducing v2.3.0&nbsp;
<span aria-label="tada emoji" role="img">
🎉
</span>
</Chip>
</div>
<div className="text-center leading-8 md:leading-10 md:text-left">
<div className="inline-block">
<h1 className={title()}>Make&nbsp;</h1>
@@ -42,6 +67,14 @@ export const Hero = () => {
href="/docs/guide/introduction"
radius="full"
size="lg"
onPress={() => {
trackEvent("Hero - Get Started", {
name: "Get Started",
action: "click",
category: "landing-page",
data: "/docs/guide/introduction",
});
}}
>
Get Started
</Button>
@@ -56,6 +89,14 @@ export const Hero = () => {
size="lg"
startContent={<GithubIcon />}
variant="bordered"
onPress={() => {
trackEvent("Hero - Github", {
name: "Github",
action: "click",
category: "landing-page",
data: "https://github.com/nextui-org/nextui",
});
}}
>
Github
</Button>
@@ -11,6 +11,7 @@ import {FeaturesGrid} from "./features-grid";
import {sectionWrapper, subtitle, title} from "@/components/primitives";
import {GithubIcon, NoteLinearIcon, NextJsIcon} from "@/components/icons";
import {useIsMounted} from "@/hooks/use-is-mounted";
import {trackEvent} from "@/utils/va";
const bannerSuggestions = [
{
@@ -69,6 +70,13 @@ export const InstallBanner = () => {
href="/docs/guide/installation"
radius="full"
size="md"
onClick={() => {
trackEvent("InstallBanner - Get Started", {
action: "press",
category: "landing-page",
data: "/docs/guide/installation",
});
}}
>
Get Started
</Button>
@@ -81,6 +89,13 @@ export const InstallBanner = () => {
size="md"
startContent={<GithubIcon />}
variant="bordered"
onClick={() => {
trackEvent("InstallBanner - Github", {
action: "press",
category: "landing-page",
data: "https://github.com/nextui-org/nextui",
});
}}
>
Github
</Button>
@@ -0,0 +1,30 @@
"use client";
import {Link} from "@nextui-org/react";
import {trackEvent} from "@/utils/va";
export type Sponsor = {
name: string;
href: string;
logo: React.ReactNode;
};
export const SponsorItem = ({name, href, logo}: Sponsor) => {
return (
<Link
isExternal
className="flex flex-col items-center justify-center"
href={href}
onClick={() => {
trackEvent("Hero - Sponsors", {
name,
action: "click",
category: "hero",
});
}}
>
{logo}
</Link>
);
};
@@ -0,0 +1,51 @@
import {Button, Link} from "@nextui-org/react";
import {sectionWrapper} from "@/components/primitives";
import {RelumeLogo, Story2DesignLogo} from "@/components/icons/sponsors";
import {HeartFilledIcon} from "@/components/icons";
import {VercelIcon} from "@/components/icons/social";
import {siteConfig} from "@/config/site";
import {Sponsor, SponsorItem} from "@/components/marketing/sponsor-item";
const sponsors: Sponsor[] = [
{
name: "Relume",
href: "https://library.relume.io/ai-site-builder?via=nextui",
logo: <RelumeLogo className="text-black dark:text-white" />,
},
{
name: "story.to.design",
href: "https://story.to.design?utm_source=nextui&utm_marketing=partnership",
logo: <Story2DesignLogo className="pt-1" />,
},
{
name: "Vercel",
href: "https://www.vercel.com?utm_source=nextui&utm_marketing=oss",
logo: <VercelIcon className="text-black dark:text-white" height={24} />,
},
];
export const Sponsors = () => {
return (
<section className={sectionWrapper({class: "text-center mt-24 lg:mt-32"})}>
<h3 className="text-large text-default-500">Supported and backed by</h3>
<div className="w-full flex flex-wrap gap-x-5 gap-y-3 justify-center items-center">
{sponsors.map((sponsor) => (
<SponsorItem key={sponsor.name} {...sponsor} />
))}
<Button
isExternal
as={Link}
className="group text-sm border-dashed font-normal text-default-600 data-[hover=true]:bg-default-100/50"
href={siteConfig.links.sponsor}
startContent={
<HeartFilledIcon className="text-danger group-data-[hover=true]:animate-heartbeat" />
}
variant="bordered"
>
Your Company
</Button>
</div>
</section>
);
};
+10 -1
View File
@@ -12,6 +12,7 @@ import {OpenCollectiveIcon, PatreonIcon, HeartBoldIcon, PlusLinearIcon} from "@/
import {Sponsor, SPONSOR_TIERS, SPONSOR_COLORS, getTier} from "@/libs/docs/sponsors";
import {SonarPulse} from "@/components/sonar-pulse";
import {useIsMobile} from "@/hooks/use-media-query";
import {trackEvent} from "@/utils/va";
export interface SupportProps {
sponsors: Sponsor[];
@@ -100,6 +101,14 @@ export const Support: FC<SupportProps> = ({sponsors = []}) => {
window.open(href, "_blank");
};
const handleBecomeSponsor = () => {
trackEvent("Support - Become a sponsor", {
action: "click",
category: "landing-page",
});
handleExternalLinkClick(supportAccounts[0].href);
};
const renderSponsors = useMemo(() => {
if (!sponsors.length) return null;
@@ -181,7 +190,7 @@ export const Support: FC<SupportProps> = ({sponsors = []}) => {
aria-label="Become a sponsor"
className="z-50 w-auto h-auto bg-gradient-to-b from-[#FF1CF7] to-[#7928CA]"
radius="full"
onPress={() => handleExternalLinkClick(supportAccounts[0].href)}
onPress={handleBecomeSponsor}
>
<PlusLinearIcon
className="flex items-center justify-center rounded-full text-white"
+24 -4
View File
@@ -11,7 +11,8 @@ import {CarbonAd} from "@/components/ads/carbon-ad";
import * as DocsComponents from "@/components/docs/components";
import * as BlogComponents from "@/components/blog/components";
import {Codeblock} from "@/components/docs/components";
import {VirtualAnchor, virtualAnchorEncode} from "@/components";
import {VirtualAnchor, virtualAnchorEncode} from "@/components/virtual-anchor";
import {trackEvent} from "@/utils/va";
const Table: React.FC<{children?: React.ReactNode}> = ({children}) => {
return (
@@ -104,7 +105,7 @@ const List: React.FC<{children?: React.ReactNode}> = ({children}) => {
const InlineCode = ({children}: {children?: React.ReactNode}) => {
return (
<Components.Code className="font-normal bg-transparent px-0 py-0 text-code-mdx">
<Components.Code className="font-normal text-default-700 bg-default-200/50 dark:bg-default-100/60 px-2 py-0.5">
{children}
</Components.Code>
);
@@ -144,6 +145,12 @@ const Code = ({
copyButton: "text-lg text-zinc-500 mr-2",
}}
codeString={codeString}
onCopy={() => {
trackEvent("MDXComponents - Copy", {
category: "docs",
action: "copyCode",
});
}}
>
<Codeblock codeString={codeString} language={language} metastring={meta} />
</Components.Snippet>
@@ -153,8 +160,21 @@ const Code = ({
const Link = ({href, children}: {href?: string; children?: React.ReactNode}) => {
const isExternal = href?.startsWith("http");
const handlePress = () => {
trackEvent("MDXComponents - Click", {
category: "docs",
action: "click",
data: href || "",
});
};
return (
<Components.Link href={href} isExternal={isExternal} showAnchorIcon={isExternal}>
<Components.Link
href={href}
isExternal={isExternal}
showAnchorIcon={isExternal}
onPress={handlePress}
>
{children}
</Components.Link>
);
@@ -208,7 +228,7 @@ export const MDXComponents = {
),
Steps: ({...props}) => (
<div
className="[&>h3]:step [&>h3>a]:pt-0.5 mb-12 ml-4 relative border-l border-default-100 pl-[1.625rem] [counter-reset:step]"
className="[&>h3]:step [&>h3>a]:pt-0.5 [&>h4]:step [&>h4>a]:pt-0.5 mb-12 ml-4 relative border-l border-default-100 pl-[1.625rem] [counter-reset:step]"
{...props}
/>
),
+98 -20
View File
@@ -30,19 +30,16 @@ import {useEffect} from "react";
import {usePress} from "@react-aria/interactions";
import {useFocusRing} from "@react-aria/focus";
import {currentVersion} from "@/utils/version";
import {siteConfig} from "@/config/site";
import {Route} from "@/libs/docs/page";
import {LargeLogo, SmallLogo, ThemeSwitch} from "@/components";
import {
TwitterIcon,
GithubIcon,
DiscordIcon,
HeartFilledIcon,
SearchLinearIcon,
} from "@/components/icons";
import {TwitterIcon, GithubIcon, DiscordIcon, SearchLinearIcon} from "@/components/icons";
import {useIsMounted} from "@/hooks/use-is-mounted";
import {DocsSidebar} from "@/components/docs/sidebar";
import {useCmdkStore} from "@/components/cmdk";
import {FbRoadmapLink} from "@/components/featurebase/fb-roadmap-link";
import {trackEvent} from "@/utils/va";
export interface NavbarProps {
routes: Route[];
@@ -73,8 +70,17 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
setCommandKey(isAppleDevice() ? "command" : "ctrl");
}, []);
const handleOpenCmdk = () => {
cmdkStore.onOpen();
trackEvent("Navbar - Search", {
name: "navbar - search",
action: "press",
category: "cmdk",
});
};
const {pressProps} = usePress({
onPress: () => cmdkStore.onOpen(),
onPress: handleOpenCmdk,
});
const {focusProps, isFocusVisible} = useFocusRing();
@@ -100,7 +106,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
strokeWidth={2}
/>
}
onPress={() => cmdkStore.onOpen()}
onPress={handleOpenCmdk}
>
Quick Search...
</Button>
@@ -120,6 +126,15 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
}
};
const handlePressNavbarItem = (name: string, url: string) => {
trackEvent("NavbarItem", {
name,
action: "press",
category: "navbar",
data: url,
});
};
return (
<NextUINavbar
ref={ref}
@@ -137,6 +152,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
aria-label="Home"
className="flex justify-start items-center gap-2 tap-highlight-transparent transition-opacity active:opacity-50"
href="/"
onClick={() => handlePressNavbarItem("Home", "/")}
>
<SmallLogo className="w-6 h-6 md:hidden" />
<LargeLogo className="h-5 md:h-6" />
@@ -154,7 +170,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
size="sm"
variant="flat"
>
v2.0.0
v{currentVersion}
</Button>
</DropdownTrigger>
</motion.div>
@@ -166,7 +182,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
selectionMode="single"
onAction={handleVersionChange}
>
<DropdownItem key="v2">v2.0.0</DropdownItem>
<DropdownItem key="v2">v{currentVersion}</DropdownItem>
<DropdownItem key="v1" endContent={<LinkIcon />}>
v1.0.0
</DropdownItem>
@@ -183,6 +199,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
color="foreground"
data-active={includes(docsPaths, pathname)}
href="/docs/guide/introduction"
onClick={() => handlePressNavbarItem("Docs", "/docs/guide/introduction")}
>
Docs
</NextLink>
@@ -193,6 +210,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
color="foreground"
data-active={includes(pathname, "components")}
href="/docs/components/avatar"
onClick={() => handlePressNavbarItem("Components", "/docs/components/avatar")}
>
Components
</NextLink>
@@ -203,6 +221,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
color="foreground"
data-active={includes(pathname, "blog")}
href="/blog"
onClick={() => handlePressNavbarItem("Blog", "/blog")}
>
Blog
</NextLink>
@@ -213,21 +232,40 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
color="foreground"
data-active={includes(pathname, "figma")}
href="/figma"
onClick={() => handlePressNavbarItem("Figma", "/figma")}
>
Figma
</NextLink>
</NavbarItem>
{/* hide feedback and changelog at this moment */}
{/* <NavbarItem>
<NextLink className={navLinkClasses} color="foreground" href="#">
<FbChangelogButton key="changelog" userName="" />
</NextLink>
</NavbarItem>
<NavbarItem>
<NextLink className={navLinkClasses} color="foreground" href="#">
<FbFeedbackButton key="feedback" userEmail="" />
</NextLink>
</NavbarItem> */}
<NavbarItem>
<FbRoadmapLink className={navLinkClasses} />
</NavbarItem>
{/* <NavbarItem>
<Chip
as={NextLink}
className="hover:bg-default-100 border-default-200/80 dark:border-default-100/80 transition-colors cursor-pointer"
color="secondary"
href="/blog/nextui-v2"
href="/blog/v2.2.0"
variant="dot"
onClick={() => handlePressNavbarItem("Introducing v2.2.0", "/blog/v2.2.0")}
>
Introducing NextUI v2.0
Introducing v2.2.0&nbsp;
<span aria-label="rocket emoji" role="img">
🚀
</span>
</Chip>
</NavbarItem>
</NavbarItem> */}
</ul>
</NavbarContent>
@@ -238,6 +276,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
aria-label="Github"
className="p-1"
href="https://github.com/nextui-org/nextui"
onClick={() => handlePressNavbarItem("Github", "https://github.com/nextui-org/nextui")}
>
<GithubIcon className="text-default-600 dark:text-default-500" />
</Link>
@@ -269,19 +308,52 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
<NavbarContent className="hidden sm:flex basis-1/5 sm:basis-full" justify="end">
<NavbarItem className="hidden sm:flex">
<Link isExternal aria-label="Twitter" className="p-1" href={siteConfig.links.twitter}>
<Chip
as={NextLink}
className="bg-default-100/50 hover:bg-default-100 border-default-200/80 dark:border-default-100/80 transition-colors cursor-pointer"
color="default"
href="/blog/v2.3.0"
variant="dot"
onClick={() => handlePressNavbarItem("Introducing v2.3.0", "/blog/v2.3.0")}
>
Introducing v2.3.0&nbsp;
<span aria-label="tada emoji" role="img">
🎉
</span>
</Chip>
</NavbarItem>
<NavbarItem className="hidden sm:flex">
<Link
isExternal
aria-label="Twitter"
className="p-1"
href={siteConfig.links.twitter}
onPress={() => handlePressNavbarItem("Twitter", siteConfig.links.twitter)}
>
<TwitterIcon className="text-default-600 dark:text-default-500" />
</Link>
<Link isExternal aria-label="Discord" className="p-1" href={siteConfig.links.discord}>
<Link
isExternal
aria-label="Discord"
className="p-1"
href={siteConfig.links.discord}
onPress={() => handlePressNavbarItem("Discord", siteConfig.links.discord)}
>
<DiscordIcon className="text-default-600 dark:text-default-500" />
</Link>
<Link isExternal aria-label="Github" className="p-1" href={siteConfig.links.github}>
<Link
isExternal
aria-label="Github"
className="p-1"
href={siteConfig.links.github}
onPress={() => handlePressNavbarItem("Github", siteConfig.links.github)}
>
<GithubIcon className="text-default-600 dark:text-default-500" />
</Link>
<ThemeSwitch />
</NavbarItem>
<NavbarItem className="hidden lg:flex">{searchButton}</NavbarItem>
<NavbarItem className="hidden md:flex">
{/* <NavbarItem className="hidden md:flex">
<Button
isExternal
as={Link}
@@ -291,10 +363,11 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
<HeartFilledIcon className="text-danger group-data-[hover=true]:animate-heartbeat" />
}
variant="flat"
onPress={() => handlePressNavbarItem("Sponsor", siteConfig.links.sponsor)}
>
Sponsor
</Button>
</NavbarItem>
</NavbarItem> */}
<NavbarMenuToggle
aria-label={isMenuOpen ? "Close menu" : "Open menu"}
className="hidden sm:flex lg:hidden ml-4"
@@ -302,7 +375,12 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
</NavbarContent>
<NavbarMenu>
<DocsSidebar className="mt-4" routes={[...mobileRoutes, ...routes]} slug={slug} tag={tag} />
<DocsSidebar
className="mt-4 pt-8"
routes={[...mobileRoutes, ...routes]}
slug={slug}
tag={tag}
/>
{children}
</NavbarMenu>
</NextUINavbar>
+1
View File
@@ -20,6 +20,7 @@ export const title = tv({
sm: "text-3xl lg:text-4xl",
md: "text-[2.5rem] lg:text-5xl",
lg: "text-4xl lg:text-6xl",
xl: "text-5xl md:text-6xl lg:text-7xl",
},
fullWidth: {
true: "w-full block",
+115
View File
@@ -0,0 +1,115 @@
"use client";
import {Icon} from "@iconify/react/dist/offline";
import arrowRightIcon from "@iconify/icons-solar/arrow-right-linear";
import {usePathname} from "next/navigation";
import {useEffect} from "react";
import {trackEvent} from "@/utils/va";
import emitter from "@/libs/emitter";
const hideOnPaths = ["examples"];
export const ProBanner = () => {
const handleClick = () => {
trackEvent("NextUI Pro Banner", {
action: "click",
category: "landing-page",
});
};
const pathname = usePathname();
const shouldBeVisible = !hideOnPaths.some((path) => pathname.includes(path));
useEffect(() => {
if (!shouldBeVisible) return;
// listen to scroll event, dispatch an event when scroll is at the top < 48 px
const handleScroll = () => {
if (window.scrollY < 48) {
emitter.emit("proBannerVisibilityChange", "visible");
} else {
emitter.emit("proBannerVisibilityChange", "hidden");
}
};
window.addEventListener("scroll", handleScroll);
return () => {
window.removeEventListener("scroll", handleScroll);
};
}, [shouldBeVisible]);
if (!shouldBeVisible) return null;
return (
<div className="relative z-50 isolate flex items-center gap-x-6 overflow-hidden bg-background border-b-1 border-divider px-6 py-2 sm:px-3.5 sm:before:flex-1">
<div
aria-hidden="true"
className="absolute left-[max(-7rem,calc(50%-52rem))] top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl"
>
<div
className="aspect-[577/310] w-[36.0625rem] bg-gradient-to-r from-[#ff80b5] to-[#9089fc] dark:from-[#F54180] dark:to-[#338EF7] opacity-20 dark:opacity-10"
style={{
clipPath:
"polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)",
}}
/>
</div>
<div
aria-hidden="true"
className="absolute left-[max(45rem,calc(50%+8rem))] top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl"
>
<div
className="aspect-[577/310] w-[36.0625rem] bg-gradient-to-r from-[#ff80b5] to-[#9089fc] dark:from-[#F54180] dark:to-[#338EF7] opacity-30 dark:opacity-20"
style={{
clipPath:
"polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)",
}}
/>
</div>
<div className="flex w-full items-center justify-between md:justify-center gap-x-3">
<a
className="text-small flex items-end sm:text-[0.93rem] text-foreground hover:opacity-80 transition-opacity"
href="https://nextui.pro?utm_source=nextui.org&utm_medium=top-banner"
rel="noopener noreferrer"
target="_blank"
onClick={handleClick}
>
<span aria-label="rocket" className="hidden md:block" role="img">
🚀
</span>
<span
className="inline-flex md:ml-1 animate-text-gradient font-medium bg-clip-text text-transparent bg-[linear-gradient(90deg,#D6009A_0%,#8a56cc_50%,#D6009A_100%)] dark:bg-[linear-gradient(90deg,#FFEBF9_0%,#8a56cc_50%,#FFEBF9_100%)]"
style={{
fontSize: "inherit",
backgroundSize: "200%",
backgroundClip: "text",
WebkitBackgroundClip: "text",
color: "transparent",
}}
>
Ship faster with beautiful components
</span>
</a>
<a
className="flex group min-w-[120px] items-center font-semibold text-foreground shadow-sm gap-1.5 relative overflow-hidden rounded-full p-[1px] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"
href="https://nextui.pro?utm_source=nextui.org&utm_medium=top-banner"
rel="noopener noreferrer"
onClick={handleClick}
>
<span className="absolute inset-[-1000%] animate-[spin_3s_linear_infinite] bg-[conic-gradient(from_90deg_at_50%_50%,#F54180_0%,#338EF7_50%,#F54180_100%)]" />
<div className="inline-flex h-full w-full cursor-pointer items-center justify-center rounded-full bg-background group-hover:bg-background/70 transition-background px-3 py-1 text-sm font-medium text-foreground backdrop-blur-3xl">
NextUI Pro
<Icon
aria-hidden="true"
className="outline-none transition-transform group-hover:translate-x-0.5 [&>path]:stroke-[2px]"
icon={arrowRightIcon}
width={16}
/>
</div>
</a>
</div>
</div>
);
};
@@ -1,6 +1,6 @@
import React from "react";
import {usePathname} from "next/navigation";
import {Tooltip, Link, Button} from "@nextui-org/react";
import {Tooltip, Button} from "@nextui-org/react";
import {capitalize, last} from "lodash";
import {BugIcon} from "@/components/icons";
@@ -11,6 +11,10 @@ export const BugReportButton = () => {
const componentTitle = capitalize(last(pathname?.split("/")));
const handlePress = () => {
window.open(`${ISSUE_REPORT_URL}${componentTitle}`, "_blank");
};
return (
<Tooltip
className="text-xs px-2"
@@ -19,15 +23,7 @@ export const BugReportButton = () => {
placement="top"
radius="md"
>
<Button
isExternal
isIconOnly
as={Link}
href={`${ISSUE_REPORT_URL}${componentTitle}`}
size="sm"
title="Report a bug"
variant="light"
>
<Button isIconOnly size="sm" title="Report a bug" variant="light" onPress={handlePress}>
<BugIcon className="text-white dark:text-zinc-500" height={16} width={16} />
</Button>
</Tooltip>
+15 -2
View File
@@ -1,4 +1,4 @@
export const getFileEntry = (theme: string) => `
export const rootFile = `
import React from "react";
import ReactDOM from "react-dom/client";
import { NextUIProvider } from "@nextui-org/react";
@@ -8,13 +8,26 @@ import "./styles.css";
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<NextUIProvider>
<div className="w-screen h-screen ${theme} text-foreground bg-background p-8 flex items-start justify-center">
<div className="w-screen h-screen p-8 flex items-start justify-center">
<App />
</div>
</NextUIProvider>
</React.StrictMode>
);`;
export const getHtmlFile = (theme: string, entryFile: string) => `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body class="${theme} text-foreground bg-background">
<div id="root"></div>
<script type="module" src="/${entryFile}"></script>
</body>
</html>`;
export const tailwindConfig = `const { nextui } = require("@nextui-org/react");
/** @type {import('tailwindcss').Config} */
@@ -26,6 +26,7 @@ export const Sandpack: FC<SandpackProps> = ({
files: filesProp,
template,
highlightedLines,
typescriptStrict = false,
showPreview = false,
showEditor = true,
defaultExpanded = false,
@@ -41,6 +42,7 @@ export const Sandpack: FC<SandpackProps> = ({
useSandpack({
files: filesProp,
template,
typescriptStrict,
highlightedLines,
});
+1 -2
View File
@@ -30,8 +30,7 @@ export const nextuiTheme: SandpackTheme = {
},
font: {
body: "Inter var",
mono:
'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
mono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
size: "14px",
lineHeight: "1.5rem",
},
+23 -8
View File
@@ -1,24 +1,24 @@
import {useMemo} from "react";
import {SandpackFiles, SandpackPredefinedTemplate} from "@codesandbox/sandpack-react";
import {useTheme} from "next-themes";
import {useLocalStorage} from "usehooks-ts";
import {HighlightedLines} from "./types";
import {getHighlightedLines, getFileName} from "./utils";
import {getFileEntry, stylesConfig, postcssConfig, tailwindConfig} from "./entries";
import {useLocalStorage} from "@/hooks/use-local-storage";
import {stylesConfig, postcssConfig, tailwindConfig, getHtmlFile, rootFile} from "./entries";
export interface UseSandpackProps {
files?: SandpackFiles;
typescriptStrict?: boolean;
template?: SandpackPredefinedTemplate;
highlightedLines?: HighlightedLines;
}
const importReact = 'import React from "react";';
const importAllReact = 'import * as React from "react";';
export const useSandpack = ({
files = {},
typescriptStrict = false,
template = "vite-react",
highlightedLines,
}: UseSandpackProps) => {
@@ -57,6 +57,12 @@ export const useSandpack = ({
if (key.includes("App") && !key.includes(mimeType)) {
return acc;
}
if (typescriptStrict && currentTemplate === "vite-react-ts" && key.includes(".js")) {
return acc;
}
if (currentTemplate === "vite-react" && key.includes(".ts")) {
return acc;
}
// @ts-ignore
acc[key] = files[key];
@@ -64,7 +70,7 @@ export const useSandpack = ({
}, {});
let dependencies = {
"framer-motion": "10.12.16",
"framer-motion": "11.0.22",
"@nextui-org/react": "latest",
};
@@ -76,6 +82,11 @@ export const useSandpack = ({
const aName = getFileName(a);
const bName = getFileName(b);
// if bName includes "App" should be first
if (bName.includes("App")) {
return 1;
}
if (aFile?.includes(bName)) {
return -1;
}
@@ -89,7 +100,7 @@ export const useSandpack = ({
let fileContent = files[key] as string;
// Check if the file content includes 'React' import statements, if not, add it
if (!fileContent.includes(importReact) && !fileContent.includes(importAllReact)) {
if (!fileContent.includes("from 'react'") && !fileContent.includes('from "react"')) {
fileContent = `${importReact}\n${fileContent}\n`;
}
@@ -128,7 +139,7 @@ export const useSandpack = ({
// const dependencies = useMemo(() => {
// let deps = {
// "framer-motion": "10.12.16",
// "framer-motion": "11.0.22",
// };
// if (hasComponents) {
@@ -173,7 +184,11 @@ export const useSandpack = ({
files: {
...sortedFiles,
[entryFile]: {
code: getFileEntry(theme ?? "light"),
code: rootFile,
hidden: true,
},
"index.html": {
code: getHtmlFile(theme ?? "light", entryFile),
hidden: true,
},
"tailwind.config.js": {
@@ -0,0 +1,29 @@
import * as React from "react";
import {Analytics} from "@vercel/analytics/react";
import Script from "next/script";
import {__PROD__} from "@/utils";
export function ScriptProviders() {
return (
<>
<Script
id="featurebase-sdk"
src="https://do.featurebase.app/js/sdk.js"
strategy={"beforeInteractive"}
/>
<Script
defer
data-modal-disclaimer="This is a custom LLM for NextUI with access to all developer docs (nextui.org/docs) and GitHub Issues and PRs (github.com/nextui-org/nextui)."
data-modal-example-questions="How do I install for Next.js?,How do I customize primary color?"
data-project-color="#000000"
data-project-logo="https://avatars.githubusercontent.com/u/86160567?s=280&v=4"
data-project-name="NextUI"
data-website-id="e733a73f-980e-4f7d-9e8b-91867453f899"
src="https://widget.kapa.ai/kapa-widget.bundle.js"
strategy="afterInteractive"
/>
{__PROD__ && <Analytics />}
</>
);
}
+54
View File
@@ -0,0 +1,54 @@
"use client";
import * as React from "react";
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
import {cn} from "@nextui-org/react";
const ScrollArea = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
>(({className, children, ...props}, ref) => {
return (
<ScrollAreaPrimitive.Root
ref={ref}
className={cn("relative overflow-hidden", className)}
{...props}
>
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit] pb-28">
{children}
</ScrollAreaPrimitive.Viewport>
<ScrollBar />
<ScrollAreaPrimitive.Corner />
</ScrollAreaPrimitive.Root>
);
});
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
const ScrollBar = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
>(({className, orientation = "vertical", ...props}, ref) => (
<ScrollAreaPrimitive.ScrollAreaScrollbar
ref={ref}
className={cn(
"flex touch-none select-none transition-colors",
orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
orientation === "horizontal" && "h-2.5 border-t border-t-transparent p-[1px]",
className,
)}
orientation={orientation}
{...props}
>
<ScrollAreaPrimitive.ScrollAreaThumb
className={cn(
"relative rounded-full bg-default-400/50",
orientation === "vertical" && "flex-1",
)}
/>
</ScrollAreaPrimitive.ScrollAreaScrollbar>
));
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
export {ScrollArea, ScrollBar};
+7
View File
@@ -8,6 +8,7 @@ import {clsx} from "@nextui-org/shared-utils";
import {useIsSSR} from "@react-aria/ssr";
import {SunFilledIcon, MoonFilledIcon} from "@/components/icons";
import {trackEvent} from "@/utils/va";
export interface ThemeSwitchProps {
className?: string;
@@ -20,6 +21,12 @@ export const ThemeSwitch: FC<ThemeSwitchProps> = ({className, classNames}) => {
const onChange = () => {
theme === "light" ? setTheme("dark") : setTheme("light");
trackEvent("ThemeChange", {
action: "click",
category: "theme",
data: theme === "light" ? "dark" : "light",
});
};
const {Component, slots, isSelected, getBaseProps, getInputProps, getWrapperProps} = useSwitch({
+10
View File
@@ -1,7 +1,10 @@
"use client";
import React from "react";
import {Link} from "@nextui-org/react";
import {VercelIcon} from "@/components/icons";
import {trackEvent} from "@/utils/va";
export const VercelCallout: React.FC<unknown> = () => {
return (
@@ -9,6 +12,13 @@ export const VercelCallout: React.FC<unknown> = () => {
isExternal
className="flex justify-end items-center gap-2 text-foreground"
href="https://www.vercel.com?utm_source=nextui&utm_marketing=oss"
onClick={() => {
trackEvent("VercelCallout", {
name: "vercel callout",
action: "click",
category: "footer",
});
}}
>
<p className="font-normal">Deployed on</p>
<VercelIcon className="text-black dark:text-white" height={18} />
+2 -2
View File
@@ -1,6 +1,6 @@
import {DM_Sans} from "next/font/google";
import {Inter} from "next/font/google";
export const fontSans = DM_Sans({
export const fontSans = Inter({
variable: "--font-sans",
adjustFontFallback: true,
display: "optional",
+134 -21
View File
@@ -18,12 +18,25 @@
"keywords": "getting started, installation, start, nextui",
"path": "/docs/guide/installation.mdx"
},
{
"key": "cli",
"title": "CLI",
"keywords": "cli, command line interface",
"path": "/docs/guide/cli.mdx",
"newPost": true
},
{
"key": "design-principles",
"title": "Design Principles",
"keywords": "design principles, nextui",
"path": "/docs/guide/design-principles.mdx"
},
{
"key": "routing",
"title": "Routing",
"keywords": "client side routing, routing, browser routing, nextui, next.js router, react router, remix router",
"path": "/docs/guide/routing.mdx"
},
{
"key": "upgrade-to-v2",
"title": "Upgrade to v2",
@@ -78,7 +91,8 @@
{
"key": "layout",
"title": "Layout",
"path": "/docs/customization/layout.mdx"
"path": "/docs/customization/layout.mdx",
"updated": true
},
{
"key": "colors",
@@ -130,6 +144,12 @@
"keywords": "accordion, collapse, expandable sections, content hiding",
"path": "/docs/components/accordion.mdx"
},
{
"key": "autocomplete",
"title": "Autocomplete",
"keywords": "autocomplete, auto suggest, search, typeahead",
"path": "/docs/components/autocomplete.mdx"
},
{
"key": "badge",
"title": "Badge",
@@ -142,6 +162,12 @@
"keywords": "button, interactive, action trigger, click events",
"path": "/docs/components/button.mdx"
},
{
"key": "breadcrumbs",
"title": "Breadcrumbs",
"keywords": "breadcrumbs, navigation, path, trail, location",
"path": "/docs/components/breadcrumbs.mdx"
},
{
"key": "card",
"title": "Card",
@@ -164,7 +190,32 @@
"key": "chip",
"title": "Chip",
"keywords": "chip, tag, label, small actionable entity",
"path": "/docs/components/chip.mdx",
"path": "/docs/components/chip.mdx"
},
{
"key": "code",
"title": "Code",
"keywords": "code, code snippet, inline code, coding",
"path": "/docs/components/code.mdx"
},
{
"key": "input",
"title": "Input",
"keywords": "input, text box, form field, data entry",
"path": "/docs/components/input.mdx"
},
{
"key": "date-input",
"title": "Date Input",
"keywords": "date-input, time, input, timezone",
"path": "/docs/components/date-input.mdx",
"newPost": true
},
{
"key": "time-input",
"title": "Time Input",
"keywords": "timeinput, time, input, timezone",
"path": "/docs/components/time-input.mdx",
"newPost": true
},
{
@@ -174,17 +225,38 @@
"path": "/docs/components/circular-progress.mdx"
},
{
"key": "code",
"title": "Code",
"keywords": "code, code snippet, inline code, coding",
"path": "/docs/components/code.mdx"
"key": "calendar",
"title": "Calendar",
"keywords": "calendar, date picker, month picker, year picker",
"path": "/docs/components/calendar.mdx",
"newPost": true
},
{
"key": "range-calendar",
"title": "Range Calendar",
"keywords": "range calendar, date picker, month picker, year picker",
"path": "/docs/components/range-calendar.mdx",
"newPost": true
},
{
"key": "date-picker",
"title": "Date Picker",
"keywords": "date-picker, time, input, timezone",
"path": "/docs/components/date-picker.mdx",
"newPost": true
},
{
"key": "date-range-picker",
"title": "Date Range Picker",
"keywords": "date-range-picker, date-picker, time, input, timezone",
"path": "/docs/components/date-range-picker.mdx",
"newPost": true
},
{
"key": "divider",
"title": "Divider",
"keywords": "divider, boundary, separator, section divider",
"path": "/docs/components/divider.mdx",
"newPost": true
"path": "/docs/components/divider.mdx"
},
{
"key": "dropdown",
@@ -198,18 +270,11 @@
"keywords": "image, media, picture, photo, graphic display",
"path": "/docs/components/image.mdx"
},
{
"key": "input",
"title": "Input",
"keywords": "input, text box, form field, data entry",
"path": "/docs/components/input.mdx"
},
{
"key": "kbd",
"title": "Kbd",
"keywords": "keyboard input, shortcut, keys, user input display",
"path": "/docs/components/kbd.mdx",
"newPost": true
"path": "/docs/components/kbd.mdx"
},
{
"key": "link",
@@ -217,6 +282,12 @@
"keywords": "link, navigation, href, web page connection",
"path": "/docs/components/link.mdx"
},
{
"key": "listbox",
"title": "Listbox",
"keywords": "listbox, selection, option list, multiple choice",
"path": "/docs/components/listbox.mdx"
},
{
"key": "modal",
"title": "Modal",
@@ -253,19 +324,29 @@
"keywords": "radio group, selection set, option selection, exclusive choices",
"path": "/docs/components/radio-group.mdx"
},
{
"key": "select",
"title": "Select",
"keywords": "select, selection, option list, multiple choice",
"path": "/docs/components/select.mdx"
},
{
"key": "skeleton",
"title": "Skeleton",
"keywords": "skeleton, loading state, placeholder, content preview",
"path": "/docs/components/skeleton.mdx",
"newPost": true
"path": "/docs/components/skeleton.mdx"
},
{
"key": "snippet",
"title": "Snippet",
"keywords": "snippet, code block, programming, code example",
"path": "/docs/components/snippet.mdx",
"newPost": true
"path": "/docs/components/snippet.mdx"
},
{
"key": "scroll-shadow",
"title": "Scroll Shadow",
"keywords": "scroll shadow, scroll indicator, scroll bar, scroll position",
"path": "/docs/components/scroll-shadow.mdx"
},
{
"key": "spacer",
@@ -285,6 +366,12 @@
"keywords": "switch, toggle, binary input, on/off control",
"path": "/docs/components/switch.mdx"
},
{
"key": "slider",
"title": "Slider",
"keywords": "slider, range input, value selector, sliding control",
"path": "/docs/components/slider.mdx"
},
{
"key": "table",
"title": "Table",
@@ -296,7 +383,7 @@
"title": "Tabs",
"keywords": "tabs, section navigation, categorized content, tabbed interface",
"path": "/docs/components/tabs.mdx",
"newPost": true
"updated": true
},
{
"key": "textarea",
@@ -317,6 +404,26 @@
"path": "/docs/components/user.mdx"
}
]
},
{
"key": "api-references",
"title": "API References",
"defaultOpen": true,
"keywords": "api references, nextui, api",
"routes": [
{
"key": "cli-api",
"title": "NextUI CLI",
"keywords": "api references, nextui, api, cli",
"path": "/docs/api-references/cli-api.mdx"
},
{
"key": "nextui-provider",
"title": "NextUI Provider",
"keywords": "api references, nextui, api, nextui provider",
"path": "/docs/api-references/nextui-provider.mdx"
}
]
}
],
"mobileRoutes": [
@@ -349,6 +456,12 @@
"title": "Figma",
"keywords": "figma, nextui, design, ui kit",
"path": "/figma"
},
{
"key": "roadmap",
"title": "Roadmap",
"keywords": "roadmap, nextui",
"path": "#"
}
]
}
File diff suppressed because it is too large Load Diff
+14 -1
View File
@@ -175,7 +175,7 @@ We've added a new function, `extendVariants`, that allows you to customize any N
height={350}
/>
You can create or override the component `variants`, `defaultVariants` and `componentVariants`.
You can create or override the component `variants`, `defaultVariants` and `compoundVariants`.
> Check out the [Custom Variants](/docs/customization/custom-variants) documentation for more information.
@@ -310,3 +310,16 @@ file helps streamline the process of transforming design ideas into functioning
To start using **NextUI v2.0**, head over to our [installation guide](/docs/guide/installation).
We can't wait to see the amazing things you'll build with **NextUI v2.0**!
---
## Community
We're excited to see the community adopt NextUI, raise issues, and provide feedback.
Whether it's a feature request, bug report, or a project to showcase, please get involved!
<Community />
## Contributing
PR's on NextUI are always welcome, please see our [contribution guidelines](https://github.com/nextui-org/nextui/blob/main/CONTRIBUTING.md) to learn how you can contribute to this project.
+167
View File
@@ -0,0 +1,167 @@
---
title: "New components v2.1.0 🎉"
description: "NextUI v2.1.0 is here with new components, Select, Listbox and ScrollShadow."
date: "2023-08-21"
image: "/blog/v2.1.0.jpg"
tags: ["nextui", "select", "listbox", "scroll-shadow", "multi-select"]
author:
name: "Junior Garcia"
username: "@jrgarciadev"
link: "https://twitter.com/jrgarciadev"
avatar: "/avatars/junior-garcia.jpeg"
---
import {selectContent} from "@/content/components/select";
import {listboxContent} from "@/content/components/listbox";
import {scrollShadowContent} from "@/content/components/scroll-shadow";
<img
src="/blog/v2.1.0.jpg"
width={700}
height={350}
alt="NextUI v2"
className="w-full border border-transparent dark:border-default-200/50 object-fit rounded-xl shadow-lg"
/>
We are thrilled to announce the latest update to NextUI, version **2.1.0**! This release introduces some game-changing
additions that many of you have eagerly been waiting for.
First on the list is the highly-anticipated **Select** component. Fully customizable and beautifully designed, supports both single and
multi-select modes and is accessible out of the box.
But that's not all. We're also rolling out two more incredible components **Listbox** and **ScrollShadow**. The new
**Listbox** allows you to make list manipulations more efficient and visually appealing. Meanwhile, the
**ScrollShadow** component adds an elegant shadow effect to scrollable areas, enhancing the UI aesthetics while
also improving usability.
## Select
Creating a select component that is both accessible and customizable is a challenging task. We've spent a lot of time
researching and testing different approaches to come up with a solution that works for everyone. The result is a
component that is easy to use, fully accessible, and highly customizable.
The new **Select** component includes:
- Support for selecting a single option.
- Support for selecting multiple options.
- Support for disabled options.
- Support for sections.
- Labeling support for accessibility.
- Exposed to assistive technology as a button with a listbox popup using ARIA (combined with [Listbox](/docs/components/listbox)).
- Support for description and error message help text linked to the input via ARIA.
- Support for mouse, touch, and keyboard interactions.
- Tab stop focus management.
- Asynchronous options loading.
- Keyboard support for opening the listbox using the arrow keys, including automatically focusing the first or last item accordingly.
- Typeahead to allow selecting options by typing text, even without opening the listbox.
- Browser autofill integration via a hidden native `<select>` element.
- Support for mobile form navigation via software keyboard.
- Mobile screen reader listbox dismissal support.
- And much more...
### Single Select
The single select component is used to select a single option from a list of options. It is a combination of a button
and a listbox. The button displays the currently selected option and the listbox displays the available options.
<CodeDemo title="Usage" files={selectContent.usage} />
### Multiple Select
The multiple select component can be used to select multiple options from a list of options.
You only need to pass the `selectionMode="multiple"` prop to the `Select` component.
<CodeDemo title="Multiple Selection" files={selectContent.multiple} />
### Multiple Variants
The select component comes with multiple variants.
<CodeDemo title="Variants" files={selectContent.variants} />
### Chips Support
The select component is flexible and allows you to render any component as an option and as a selected option.
<CodeDemo title="Multiple Selection with Chips" files={selectContent.multipleWithChips} />
### Customizable
The select component is highly customizable, you can customize the selected option, the options, the listbox,
the popover and the scrollable area.
<CodeDemo title="Custom Styles" files={selectContent.customStyles} />
Go to the [Select](/docs/components/select) component page to learn more about sizes, colors, and more.
## Listbox
The listbox component allows you to make list manipulations more efficient and visually appealing.
The new **Listbox** component includes:
- Support for single, multiple, or no selection.
- Exposed to assistive technology as a `listbox` using ARIA.
- Support for disabled items.
- Support for sections.
- Labeling support for accessibility.
- Support for mouse, touch, and keyboard interactions.
- Tab stop focus management.
- Keyboard navigation support including arrow keys, home/end, page up/down, select all, and clear.
- Automatic scrolling support during keyboard navigation.
- Typeahead to allow focusing options by typing text.
### Usage
<CodeDemo title="Usage" files={listboxContent.usage} />
### Custom Styles
The Listbox components offers multiple customization options.
<CodeDemo title="Custom Styles" files={listboxContent.customStyles} />
> **Note**: In the above example, we've utilized the [Boxicons](https://boxicons.com/) icons collection.
Go to the [Listbox](/docs/components/listbox) component page to learn more about it.
## ScrollShadow
The ScrollShadow component gives a nice shadow effect to scrollable areas. These shadows are handled by using
the CSS `mask-image` property, which makes the shadows adapt to the background color.
### Usage
<CodeDemo title="Usage" files={scrollShadowContent.usage} />
You can hide the scrollbars, customize the shadows size, change the orientation, and more.
Go to the [ScrollShadow](/docs/components/scroll-shadow) component page to learn more about it.
<Spacer y={6}/>
We hope you enjoy these new components and the new features. We're excited to see what you build with them!
Thanks for reading and happy coding! 🚀
---
## Community
We're excited to see the community adopt NextUI, raise issues, and provide feedback.
Whether it's a feature request, bug report, or a project to showcase, please get involved!
<Community />
## Contributing
PR's on NextUI are always welcome, please see our [contribution guidelines](https://github.com/nextui-org/nextui/blob/main/CONTRIBUTING.md) to learn how you can contribute to this project.
+443
View File
@@ -0,0 +1,443 @@
---
title: "Introducing v2.2.0 🚀"
description: "NextUI v2.2.0 is here! Dive into client-side router support, discover 3 new components including the Autocomplete, and more."
date: "2023-11-03"
image: "/blog/v2.2.0.jpg"
tags: ["nextui", "autocomplete", "breadcrumbs", "client side router", "slider"]
author:
name: "Junior Garcia"
username: "@jrgarciadev"
link: "https://twitter.com/jrgarciadev"
avatar: "/avatars/junior-garcia.jpeg"
---
import {autocompleteContent} from "@/content/components/autocomplete";
import {sliderContent} from "@/content/components/slider";
import {breadcrumbsContent} from "@/content/components/breadcrumbs";
<img
src="/blog/v2.2.0_2x.jpg"
width={700}
height={350}
alt="NextUI v2.2.0"
className="w-full border border-transparent dark:border-default-200/50 object-fit rounded-xl shadow-lg"
/>
We are excited to announce the latest update to NextUI, version **2.2.0**! This release introduces 3 new components,
support for client-side routing, and more.
## What's New in v2.2.0?
- [Client Side Routing](#client-side-routing) - Allows you to seamlessly incorporate client-side routers.
- [Autocomplete](/docs/components/autocomplete) - Combines a text input with a listbox, allowing users to filter a list of options.
- [Slider](/docs/components/slider) - Allows users to make selections from a range of values.
- [Breadcrumbs](/docs/components/breadcrumbs) - Displays a hierarchy of links to the current page or resource in an application.
- [Other Changes](#other-changes) - Includes styling improvements, accessibility and usability enhancements.
<Spacer y={4} />
## Client Side Routing
By default, links perform native browser navigation when they are interacted with. However, many apps and
frameworks use client side routers to avoid a full page reload when navigating between pages.
NextUI now natively supports client-side routing in components such as [Link](/docs/components/link), [Tabs](/docs/components/tabs),
[Breadcrumbs](/docs/components/breadcrumbs), [Listbox](/docs/components/listbox), [Dropdown](/docs/components/dropdown) and many others offering
the flexibility to be rendered as HTML links, allowing you to seamlessly incorporate client-side routers. See the [Routing](/docs/guide/routing) guide to
learn how it set it up in your app.
The `NextUIProvider` component configures all NextUI components within it to navigate using the
client side router you provide.
> **Note**: Client side routing is based on [React Aria Routing](https://react-spectrum.adobe.com/react-aria/routing.html).
### Next.js Example
- App Router
Go to your `app/providers.tsx` or `app/providers.jsx` (create it if it doesn't exist) and add the
`useRouter` hook from `next/navigation`, it returns a router object that can be used to perform navigation.
```tsx
// app/providers.tsx
"use client";
import {NextUIProvider} from "@nextui-org/react";
export function Providers({children}: {children: React.ReactNode}) {
const router = useRouter();
return <NextUIProvider navigate={router.push}>{children}</NextUIProvider>;
}
```
- Pages Router
Go to pages`/_app.js` or `pages/_app.tsx` (create it if it doesn't exist) and add the`useRouter` hook
from `next/router`, it returns a router object that can be used to perform navigation.
```tsx
// pages/_app.tsx
import type {AppProps} from "next/app";
import {useRouter} from "next/router";
import {NextUIProvider} from "@nextui-org/react";
function MyApp({Component, pageProps}: AppProps) {
const router = useRouter();
return (
<NextUIProvider navigate={router.push}>
<Component {...pageProps} />
</NextUIProvider>
);
}
export default MyApp;
```
- Usage
Now that you have set up the `NextUIProvider` in your app, you can use the `href` prop in the `Tabs`,
`Listbox` and `Dropdown` items to navigate between pages.
The [Link](/docs/components/link) component will also use the `navigate` function from the
`NextUIProvider` to navigate between pages.
```jsx
import {
Tabs,
Tab,
Listbox,
ListboxItem,
Dropdown,
DropdownTrigger,
DropdownMenu,
DropdownItem,
Button,
Link,
} from "@nextui-org/react";
function App() {
return (
<>
<Tabs aria-label="Navigation">
<Tab key="home" href="/home">
Home
</Tab>
<Tab key="about" href="/about">
About
</Tab>
</Tabs>
<Listbox aria-label="Navigation">
<ListboxItem key="home" href="/home">
Home
</ListboxItem>
<ListboxItem key="about" href="/about">
About
</ListboxItem>
</Listbox>
<Dropdown>
<DropdownTrigger>
<Button>Open</Button>
</DropdownTrigger>
<DropdownMenu aria-label="Navigation">
<DropdownItem key="home" href="/home">
Home
</DropdownItem>
<DropdownItem key="about" href="/about">
About
</DropdownItem>
</DropdownMenu>
</Dropdown>
<Link href="/home">Home</Link>
<Link href="/about">About</Link>
</>
);
}
```
<Spacer y={4} />
## Autocomplete
Creating an autocomplete component that is both accessible and customizable is a challenging task. We've spent a lot of time
researching and testing different approaches to come up with a solution that works for everyone. The result is a
component that is easy to use, fully accessible, and highly customizable.
The new **Autocomplete** component includes:
- Support for selecting a single option.
- Support for disabled options.
- Support for groups of items in sections.
- Support for filtering a list of options by typing.
- Support for controlled and uncontrolled options, selection and input value.
- Support for custom filter functions.
- Async loading and infinite scrolling support.
- Required and invalid states exposed to assistive technology via ARIA.
- Support for description and error message help text linked to the input via ARIA.
- And much more...
We recommend to read this [Blog post](https://react-spectrum.adobe.com/blog/building-a-combobox.html) from [react-aria](https://react-spectrum.adobe.com/react-aria) team to learn more
about the Autocomplete component.
### Usage
<CodeDemo title="Usage" files={autocompleteContent.usage} />
### Custom Items
You can customize the autocomplete items by modifying the `AutocompleteItem` children.
<CodeDemo title="Custom Items" files={autocompleteContent.customItems} />
### Customizable
The autocomplete component is highly customizable, you can customize the popover, listbox and
input components.
<CodeDemo title="Custom Styles" files={autocompleteContent.customStyles} />
Go to the [Autocomplete](/docs/components/autocomplete) component page to learn more about it.
<Spacer y={4} />
## Slider
The **Slider** component allows users to make selections from a range of values. It is a great way to allow users to
select a value from a fixed range, such as volume or temperature, or to select a value from a range that changes
frequently, such as stock prices or budgets.
### Usage
<CodeDemo title="Usage" files={sliderContent.usage} />
### Range Support
If you pass an array of values to the `value` prop or to the `defaultValue` prop, the slider will become a range slider.
<CodeDemo title="Range Slider" files={sliderContent.range} />
### With Tooltip
The slider component also supports a tooltip to display the current value.
<CodeDemo title="With Tooltip" files={sliderContent.tooltip} />
### Slider steps
You can use the `showSteps` prop to display small dots on each step.
<CodeDemo title="With Visible Steps" files={sliderContent.visibleSteps} />
### Slider Custom Styles
You can customize the `Slider` component by passing custom Tailwind CSS classes to the component slots.
<CodeDemo title="Custom Styles" files={sliderContent.customStyles} />
Go to the [Slider](/docs/components/slider) component page to learn more about it.
<Spacer y={4} />
## Breadcrumbs
The **Breadcrumbs** is an essential component for navigating hierarchical content. It displays a hierarchy of links to the
current page or resource in an application.
### Usage
<CodeDemo title="Usage" files={breadcrumbsContent.usage} />
### Breadcrumbs as menu
It is possible to use the `Breadcrumbs` component as a horizontal menu. This is useful when you want to display a list
of possible navigations and let the user choose one of them.
<CodeDemo title="Menu Type" files={breadcrumbsContent.menuType} />
### Start & End Content support
You can add any element to the start or end of the breadcrumbs by using the `startContent` and `endContent` props. The
above example uses the `startContent` prop to add icons to the start of the breadcrumbs.
<CodeDemo title="Start & End Content" files={breadcrumbsContent.startEndContent} />
### Collapsing Items support
The `Breadcrumbs` component supports collapsing items, it is useful when you have a lot of items and you want to
collapse them into a dropdown menu.
<CodeDemo title="Customizing the Ellipsis Item" files={breadcrumbsContent.customizingEllipsis} />
### Applying custom styles
You can customize the `Breadcrumbs` component by passing custom Tailwind CSS classes to the component slots.
<CodeDemo title="Custom Styles" files={breadcrumbsContent.customStyles} />
<Spacer y={4} />
Go to the [Breadcrumbs](/docs/components/breadcrumbs) component page to learn more about it.
## Other Changes
- Styling Improvements:
- Transitioned spacing units from pixels (px) to rem units to optimize mobile component sizing.
- Introduced a new `shouldSelectOnPressUp` property for `Tabs/Tab` with a default value of true, allowing tab selection on press-up instead of press-down.
- Updated Chip component's font size to text-tiny for the sm size variant.
- Enhanced the Button component to display only the spinner during loading when it contains an icon.
- Accessibility and Usability Enhancements:
- Resolved Popover component's open state issues for blur/opaque backdrops.
- Enhanced the ScrollShadow API, introducing visibility and onVisibilityChange properties to manage shadow visibility.
- Added `emptyContent`, `topContent`, and `bottomContent` properties to Listbox/Menu/Dropdown for customized content rendering.
- Introduced baseRef to the Input component, allowing control over the parent element's reference.
- Upgraded tailwind-variants to version `0.1.18`, incorporating slot props control.
- Right-to-Left (RTL) Support:
- Implemented RTL support for Accordion,
- Implemented RTL support for Accordion Avatar & AvatarGroup components,
- Implemented RTL support for ButtonGroup.
- Custom Implementations and Fixes:
- Implemented a custom `usePress` hook to address the corner press issue, with a corresponding pull request and issue submitted to the react-aria project.
- Applied the custom `usePress` across all NextUI interactive components for consistent behavior.
- Improved animations and positioning for Input & Select labels.
- Upgraded `react-aria` packages and `framer-motion` for enhanced performance.
- Enhanced TypeScript support for generic items in Menu and DropdownMenu.
- Streamlined package dependencies to exclude globally or individually installed packages, reducing bundle sizes.
- Visual and Interactive Tweaks:
- Removed the outline on Input focus-visible for a cleaner aesthetic.
- Fixed the radius property issue in `ButtonGroup`.
- Introduced the `isActive` prop for `NavbarMenuItem` for active state management.
- Corrected the Pagination custom-items example by adding the key prop.
- Enabled Collection Items support within the `extendVariants` function.
- Added transitions to menu/listbox items for smoother interaction.
- Added a `disableAutosize` property to `Textarea` to control auto-resizing.
- Resolved styling issues in Textarea and animated height adjustments for a fluid user experience.
- Included a `hoverOpacity` key in the themes object within the plugin for customized hover effects.
- Implemented a hover effect for the Button component to enhance user interaction feedback.
- The padding of the CardBody has been updated from `p-5` to `p-3` for consistency with the padding of other Card elements.
<Spacer y={4} />
## Breaking Changes
Unfortunately, we had to make some small styles breaking changes in this release to improve the [Popover](/docs/components/popover) arrow
dynamic positioning. Instead of having a specific slot for the popover arrow, we now use the `before` pseudo element, this allows the
popover to also move the arrow altogether.
This change impacts the Popover, Dropdown, Tooltip and Select implementations.
Popover changes:
```diff-jsx
<Popover
showArrow
backdrop="opaque"
placement="right"
classNames={{
- base: "py-3 px-4 border border-default-200 bg-gradient-to-br from-white to-default-300 dark:from-default-100 dark:to-default-50",
- arrow: "bg-default-200",
+ base: [
+ // the "before" pseudo element is now the popover' arrow
+ "before:bg-default-200"
+ ],
+ content: [ // now we need to use the "content" slot to actually modify the popover' content styles
+ "py-3 px-4 border border-default-200",
+ "bg-gradient-to-br from-white to-default-300",
+ "dark:from-default-100 dark:to-default-50",
],
}}
>
...
</Popover>
```
Tooltip changes:
```diff-jsx
<Tooltip
showArrow
placement="right"
content="I am a tooltip"
classNames={{
- base: "py-2 px-4 shadow-xl text-black bg-gradient-to-br from-white to-neutral-400",
- arrow: "bg-neutral-400 dark:bg-white",
+ base: [
+ // the "before" pseudo element is now the popover' arrow
+ "before:bg-neutral-400 dark:before:bg-white",
+ ],
+ content: [ // now we need to use the "content" slot to actually modify the popover' content styles
+ "py-2 px-4 shadow-xl",
+ "text-black bg-gradient-to-br from-white to-neutral-400",
+ ],
}}
>
<Button variant="flat">Hover me</Button>
</Tooltip>
```
Select changes:
```diff-jsx
<Select
items={users}
label="Assigned to"
className="max-w-xs"
variant="bordered"
popoverProps={{
classNames: {
- base: "p-0 border-small border-divider bg-background",
- arrow: "bg-default-200",
+ base: "before:bg-default-200", // the before pseudo element controls the popover's arrow
+ content: "p-0 border-small border-divider bg-background", // now instead of the "base" slot we use the "content" slot
},
}}
>
...
</Select>
);
}`;
```
Dropdown Changes
```diff-jsx
<Dropdown
showArrow
classNames={{
- base: "py-1 px-1 border border-default-200 bg-gradient-to-br from-white to-default-200 dark:from-default-50 dark:to-black",
- arrow: "bg-default-200",
+ content: "py-1 px-1 border border-default-200 bg-gradient-to-br from-white to-default-200 dark:from-default-50 dark:to-black", // now instead of the "base" slot we use the "content"
+ base: "before:bg-default-200", // the before pseudo element controls the popover's arrow
}}
>
...
</Dropdown>
```
<Spacer y={6} />
We hope you enjoy these new components and the new features. We're excited to see what you build with them!
Thanks for reading and happy coding! 🚀
---
## Community
We're excited to see the community adopt NextUI, raise issues, and provide feedback.
Whether it's a feature request, bug report, or a project to showcase, please get involved!
<Community />
## Contributing
PR's on NextUI are always welcome, please see our [contribution guidelines](https://github.com/nextui-org/nextui/blob/main/CONTRIBUTING.md) to learn how you can contribute to this project.
+406
View File
@@ -0,0 +1,406 @@
---
title: "Introducing v2.3.0 🎉"
description: "NextUI v2.3.0 is here! includes six new components, NextUI CLI, bug fixes, React Aria, and a TailwindCSS upgrade, among other enhancements."
date: "2024-04-16"
image: "/blog/v2.3.0.jpg"
tags: ["nextui", "cli", "date picker", "time input", "date input", "calendar"]
author:
name: "Junior Garcia"
username: "@jrgarciadev"
link: "https://twitter.com/jrgarciadev"
avatar: "/avatars/junior-garcia.jpeg"
---
import {dateInputContent} from "@/content/components/date-input";
import {timeInputContent} from "@/content/components/time-input";
import {calendarContent} from "@/content/components/calendar";
import {rangeCalendarContent} from "@/content/components/range-calendar";
import {datePickerContent} from "@/content/components/date-picker";
import {dateRangePickerContent} from "@/content/components/date-range-picker";
<img
src="/blog/v2.3.0_2x.jpg"
width={700}
height={350}
alt="NextUI v2.3.0"
className="w-full border border-transparent dark:border-default-200/50 object-fit rounded-xl shadow-lg"
/>
We are excited to announce the latest update to NextUI, version **2.3.0**! This release introduces 6 new components,
our new CLI, and several enhancements and bug fixes.
## What's New in v2.3.0?
- [NextUI CLI](/docs/guide/cli) - A command-line interface for creating and managing NextUI projects.
- [DateInput](/docs/components/date-input) - Allows users to enter and edit date and time values using a keyboard.
- [TimeInput](/docs/components/time-input) - Allows users to enter and edit time values using a keyboard.
- [Calendar](/docs/components/calendar) - Displays a calendar for selecting dates and times.
- [RangeCalendar](/docs/components/range-calendar) - Displays a calendar for selecting date ranges.
- [DatePicker](/docs/components/date-picker) - Allows users to select a date from a calendar.
- [DateRangePicker](/docs/components/date-range-picker) - Allows users to select a date range from a calendar.
- [Other Changes](#other-changes) - Includes styling improvements, accessibility and usability enhancements.
<Spacer y={4} />
Requirements:
- [Tailwind CSS 3.4](https://tailwindcss.com/) or later
Upgrade today by running one of the following commands:
<Spacer y={4} />
<PackageManagers
commands={{
cli: "nextui upgrade",
npm: "npx nextui-cli@latest upgrade",
}}
/>
<Spacer y={4} />
## NextUI CLI
We are thrilled to introduce the [NextUI CLI](https://github.com/nextui-org/nextui-cli), a command-line interface, It offers a comprehensive suite
of commands to initialize, manage, and improve your NextUI projects. It enables you to `add`, `remove`, or
`upgrade` individual components, assess the health of your project, and more.
### Installation
To install the CLI globally, execute one of the following commands in your terminal:
<PackageManagers
commands={{
npm: "npm install nextui-cli -g",
yarn: "yarn add nextui-cli -g",
pnpm: "pnpm add nextui-cli -g",
bun: "bun add nextui-cli -g",
}}
/>
Alternatively, you can use the CLI without a global installation by employing `npx`:
```bash
npx nextui-cli@latest
```
### Usage
Once the CLI is installed, run the following command to display available commands:
```bash
nextui
```
NextUI CLI can help you create new projects, add components, upgrade components, remove components, detect issues in
you setup, know your environment, and more.
<Spacer y={4} />
To initialize a new project, you can simply run:
```bash
nextui init my-nextui-app
```
<Spacer y={4} />
You will be prompted to configure your project:
```codeBlock bash
? Select a template - Use arrow-keys. Return to submit.
App
A Next.js 13 with app directory template pre-configured with NextUI (v2) and Tailwind CSS.
Pages
A Next.js 13 with pages directory template pre-configured with NextUI (v2) and Tailwind CSS.
```
Select the template you want to use and the CLI will create a new project for you.
> We're working on adding more templates to the CLI, so stay tuned for updates!
<Spacer y={4} />
If you already have a NextUI project, you can add components to it using the `add` command:
```bash
nextui add date-input
```
It will automatically detect the required dependencies, modify your `tailwind.config.(js|ts)` file,
detect whether using `pnpm` if so, add the required configuration to your `.npmrc` file and add the component to your project.
If instead of installing a single component you want to install multiple components, you can do so by separating them with a space:
```bash
nextui add date-input time-input calendar
```
You can alternatively install the `main` package which includes all the components by passing the `--all` flag:
```bash
nextui add --all
```
<Spacer y={4} />
> The CLI is currentl in `Alpha` stage, we're working on adding more features and improvements. If you find any issues or have any suggestions, please let us know by [opening an issue](https://github.com/nextui-org/nextui-cli/issues/new).
To learn more about the CLI and its commands, please refer to the [CLI documentation](/docs/guide/cli) and the [CLI API reference](/docs/api-references/cli-api).
## New Components
Since the beginning of NextUI, devs have been asking for date and time input components. After
months of iteration and development, we are excited to introduce the following new components:
### DateInput
DateInput is a component that allows users to enter and edit date and time values using a keyboard.
Each part of a date value is displayed in an individually editable segment.
<CodeDemo title="Usage" files={dateInputContent.usage} />
Go to the [DateInput documentation](/docs/components/date-input) to learn more about the component.
### TimeInput
The `TimeInput` component consists of a label, and a group of segments representing each unit of a time (e.g. hours, minutes, and seconds). Each segment is individually focusable and editable by the user, by typing or using the arrow keys to increment and decrement the value. This approach allows values to be formatted and parsed correctly regardless of the locale or time format, and offers an easy and error-free way to edit times using the keyboard.
<CodeDemo title="Usage" files={timeInputContent.usage} />
Go to the [TimeInput documentation](/docs/components/time-input) to learn more about the component.
### Calendar
A Calendar consists of a grouping element containing one or more date grids (e.g. months), and a previous and next button for navigating between date ranges. Each calendar grid consists of cells containing button elements that can be pressed and navigated to using the arrow keys to select a date.
<CodeDemo title="Usage" files={calendarContent.usage} />
The calendar also supports selecting years and months for rapid selection.
<CodeDemo title="With Month And Year Picker" files={calendarContent.withMonthAndYearPicker} />
Go to the [Calendar documentation](/docs/components/calendar) to learn more about the component.
### RangeCalendar
A Range calendar consists of a grouping element containing one or more date grids (e.g. months), and a previous and next button for navigating through time. Each calendar grid consists of cells containing button elements that can be pressed and navigated to using the arrow keys to select a date range. Once a start date is selected, the user can navigate to another date using the keyboard or by hovering over it, and clicking it or pressing the Enter key commits the selected date range.
<CodeDemo title="Usage" files={rangeCalendarContent.usage} />
Go to the [RangeCalendar documentation](/docs/components/range-calendar) to learn more about the component.
### DatePicker
A Date Picker combines a DateInput and a Calendar popover to allow users to enter or select a date and time value.
<CodeDemo title="Usage" files={datePickerContent.usage} />
Go to the [DatePicker documentation](/docs/components/date-picker) to learn more about the component.
### DateRangePicker
Date Range Picker combines two DateInputs and a RangeCalendar popover to allow users to enter or select a date and time range.
<CodeDemo title="Usage" files={dateRangePickerContent.usage} />
Go to the [DateRangePicker documentation](/docs/components/date-range-picker) to learn more about the component.
### Calendar Presets
`Calendar` and `RangeCalendar` components support adding custom content at the top and bottom of the calendar, this is useful for adding presets or
custom actions to the calendar.
Here's an example of how to add presets to the `Calendar` component:
<CodeDemo title="Calendar Presets" files={calendarContent.presets} />
### Internationalization
These new components have built-in internationalization, time zones and granularity support, they supports selecting dates
in many calendar systems used around the world, including `Gregorian`, `Hebrew`, `Indian`, `Islamic`, `Buddhist`, and more.
Dates are automatically displayed in the appropriate calendar system for the user's locale this is possible thanks to [@internationalized/date](https://react-spectrum.adobe.com/internationalized/date/) package, which
includes functions for parsing strings in multiple formats into `ZonedDateTime` objects.
Here's and example using the `Indian` calendar system:
<CodeDemo title="International Calendar" files={datePickerContent.internationalCalendar} />
Alternatively you can set the `locale` globally by using the `NextUIProvider` component:
```jsx
// Next.js App Router example
"use client";
import {NextUIProvider} from "@nextui-org/react";
export interface ProvidersProps {
children: React.ReactNode;
}
export function Providers({children}: ProvidersProps) {
const router = useRouter();
return <NextUIProvider locale="hi-IN-u-ca-indian">{children}</NextUIProvider>;
}
```
If no `locale` is provided, it will extract the locale from the browser.
### NextUI Provider
The `NextUIProvider` component was updated to include the `createCalendar` function, which allows you to create a calendar instance with the specified locale and time zone,
and the `defaultDates` object which allows you to set global minimum and maximum dates for the components.
```jsx
// Next.js App Router example
"use client";
import {NextUIProvider, SupportedCalendars} from "@nextui-org/react";
import {CalendarDate, GregorianCalendar} from "@internationalized/date";
export interface ProvidersProps {
children: React.ReactNode;
}
function createCalendar(identifier: SupportedCalendars) {
switch (identifier) {
case "gregory":
return new GregorianCalendar();
default:
throw new Error(`Unsupported calendar ${identifier}`);
}
}
export function Providers({children}: ProvidersProps) {
const router = useRouter();
return (
<NextUIProvider
locale="hi-IN-u-ca-indian"
defaultDates={{
minDate: new CalendarDate(1900, 1, 1),
maxDate: new CalendarDate(2099, 12, 31),
}}
createCalendar={createCalendar}
>
{children}
</NextUIProvider>
);
}
```
<Spacer y={4} />
## Breaking Changes
In order to improve the performance and reduce the bundle size, we have removed the `units` creation from the
`nextui` plugin. [TailwindCSS v3.4](https://tailwindcss.com/blog/tailwindcss-v3-4) added support for `min-h-*` and `min-w-*` classes, so it is no longer needed.
How to upgrade:
1. Upgrade TailwindCSS to version 3.4 or later (if you haven't already). You can do this by running:
```bash
npm install tailwindcss@latest
```
2. Remove the `spacingUnit` configuration from your `tailwind.config.(js|ts)` file (if you have it):
```diff-js
plugins: [
nextui({
layout: {
- spacingUnit: 4,
},
}),
],
```
3. Find all `-unit` classes in your project and replace them with a `-` separator. For example, replace `p-unit-4` with `p-4`.
```diff-jsx
import {Button} from "@nextui-org/react";
export const MyButton = () => {
return (
- <Button className="px-unit-2 py-unit-1 min-w-unit-48">
+ <Button className="px-2 py-1 min-w-48">
My Button
</Button>
);
};
```
That's it! Your project should now be using the latest version of TailwindCSS and NextUI.
<Spacer y={4} />
## Other Changes
**Bug Fixes**:
- Fixed an HSL color rounding issue in the theme settings to ensure accurate color representation. [PR](https://github.com/nextui-org/nextui/pull/2702) - [@wingkwong](https://github.com/wingkwong)
- Removed conflicting transition definitions affecting CSS classes. [PR](https://github.com/nextui-org/nextui/pull/2677) - [@u3u](https://github.com/u3u)
- Patched the "@nextui-org/autocomplete" package to fix an issue where empty items with `allowCustomValue` would not render properly due to a null node problem. [PR](https://github.com/nextui-org/nextui/pull/2674) - [@wingkwong](https://github.com/wingkwong)
- Implemented a fix in modal components to prevent carryover of IME (Input Method Editor) input when switching fields using the Tab key. [PR](https://github.com/nextui-org/nextui/pull/2709) - [@ryo-manba](https://github.com/ryo-manba)
- Enhanced accessibility by handling Tab key press event in the `ModalContent` component. [PR](https://github.com/nextui-org/nextui/pull/2709) - [@ryo-manba](https://github.com/ryo-manba)
- Fixed an issue where disabled select components could still be changed using blur and keyboard shortcuts. [PR](https://github.com/nextui-org/nextui/pull/2649) - [@wingkwong](https://github.com/wingkwong)
- Patched issues in "@nextui-org/use-aria-multiselect" and "@nextui-org/stories-utils" packages to fix a warning about `SELECT defaultSelectedKeys`. [PR](https://github.com/nextui-org/nextui/pull/2648) - [@wingkwong](https://github.com/wingkwong)
- Fixed an issue with incorrect `onChange` typing in Checkbox Group, ensuring it now correctly handles an array of strings as values. [PR](https://github.com/nextui-org/nextui/pull/2595) - [@wingkwong](https://github.com/wingkwong)
- Fixed the `label` placement issue in `Select` component if a `description` prop is used [PR](https://github.com/nextui-org/nextui/pull/2553) - [@novsource](https://github.com/novsource)
- Fixed the `originalProps` spread issue in the `Dropdown` component. [PR](https://github.com/nextui-org/nextui/pull/2450) - [@wingkwong](https://github.com/wingkwong)
**Improvements**
- Framer Motion was updated to the latest version, improving performance and reducing bundle size. [Docs](https://www.framer.com/motion/guide-reduce-bundle-size/) [PR](https://github.com/nextui-org/nextui/pull/2464) - [@mezotv](https://github.com/mezotv)
- `LazyMotion` was added to all components that use Framer Motion, improving performance by only loading the required motion components.
- We removed the custom `units` creation from the `nextui` plugin, it is no longer needed with TailwindCSS v3.4 and above. [PR](https://github.com/nextui-org/nextui/pull/2713) - [@jrgarciadev](https://github.com/jrgarciadev)
- Updated `framer-motion` package across various components and utilities to version `11.0.22` for enhanced performance and consistency. [PR](https://github.com/nextui-org/nextui/pull/2596) - [@wingkwong](https://github.com/wingkwong)
- Ensured compatibility with `react@18.2.0` and `react-dom@18.2.0` across the board. [PR](https://github.com/nextui-org/nextui/pull/2596) - [@wingkwong](https://github.com/wingkwong)
- Introduced patches for NextUI components to improve animations, including support for keyframes with spring and inertia animations. [PR](https://github.com/nextui-org/nextui/pull/2596) - [@wingkwong](https://github.com/wingkwong)
- Improved handling of numeric keys in the multi-select component to ensure consistent behavior. [PR](https://github.com/nextui-org/nextui/pull/2589) - [@wingkwong](https://github.com/wingkwong)
- Updated the version of react-aria to include the latest changes as detailed in the [2024-02-13 release](https://react-spectrum.adobe.com/releases/2024-02-13.html). [PR](https://github.com/nextui-org/nextui/pull/2561) - [@ryo-manba](https://github.com/ryo-manba)
- Added support for custom class names in the `AvatarGroup` component, enhancing flexibility in styling. [PR](https://github.com/nextui-org/nextui/pull/2669) - [@wingkwong](https://github.com/wingkwong)
- Introduced a `count` slot to the `AvatarGroup` for more customized rendering. [PR](https://github.com/nextui-org/nextui/pull/2669) - [@wingkwong](https://github.com/wingkwong)
- Improved the `AvatarGroup` component's count rendering logic for better performance and flexibility. [PR](https://github.com/nextui-org/nextui/pull/2669) - [@wingkwong](https://github.com/wingkwong)
- Add RTL support to the kbd component. [PR](https://github.com/nextui-org/nextui/pull/2482) - [@mrbadri](https://github.com/mrbadri)
- Add RTL support to the Select component. [PR](https://github.com/nextui-org/nextui/pull/2485) - [@mrbadri](https://github.com/mrbadri)
- Add RTL support to the avatar group componen. [PR](https://github.com/nextui-org/nextui/pull/2498) - [@mrbadri](https://github.com/mrbadri)
- Add RTL support to the Table component. [PR](https://github.com/nextui-org/nextui/pull/2472) - [@mrbadri](https://github.com/mrbadri)
**Documentation**:
- Updated documentation to reflect the new features and changes in the `AvatarGroup` component.
- Added support for the "bun" package manager across documentation and components. [PR](https://github.com/nextui-org/nextui/pull/2625) - [@sudongyuer](https://github.com/sudongyuer)
- [Kapa.ai](https://www.kapa.ai/) widget was added to the documentation to provide AI support for users. [PR](https://github.com/nextui-org/nextui/pull/2428) - [@wingkwong](https://github.com/sudongyuer)
- Layout docs updated to remove the `units` configuration from the `tailwind.config.(js|ts)` file.
Special thanks to NextUI Team members [@kuri-sun](https://github.com/kuri-sun), [@ryo-manba](https://github.com/ryo-manba),
[@sudongyuer](https://github.com/sudongyuer), [@winchesHe](https://github.com/winchesHe), [@wingkwong](https://github.com/wingkwong),
[@tianenpang](https://github.com/tianenpang), [@smultar](https://github.com/smultar) and contributors for their contributions to this release.
For a full list of changes, please refer to the [release notes](https://github.com/nextui-org/nextui/releases/tag/%40nextui-org%2Freact%402.3.0).
<Spacer y={6} />
We hope you enjoy these new components and the new features. We're excited to see what you build with them!
Thanks for reading and happy coding! 🚀
---
## Community
We're excited to see the community adopt NextUI, raise issues, and provide feedback.
Whether it's a feature request, bug report, or a project to showcase, please get involved!
<Community />
## Contributing
PR's on NextUI are always welcome, please see our [contribution guidelines](https://github.com/nextui-org/nextui/blob/main/CONTRIBUTING.md) to learn how you can contribute to this project.
@@ -24,10 +24,41 @@ export default function App() {
);
}`;
const AppTs = `import type {Selection} from "@nextui-org/react";
import {Accordion, AccordionItem} from "@nextui-org/react";
export default function App() {
const [selectedKeys, setSelectedKeys] = React.useState<Selection>(new Set(["1"]));
const defaultContent =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
return (
<Accordion
selectedKeys={selectedKeys}
onSelectionChange={setSelectedKeys}
>
<AccordionItem key="1" aria-label="Accordion 1" title="Accordion 1">
{defaultContent}
</AccordionItem>
<AccordionItem key="2" aria-label="Accordion 2" title="Accordion 2">
{defaultContent}
</AccordionItem>
<AccordionItem key="3" aria-label="Accordion 3" title="Accordion 3">
{defaultContent}
</AccordionItem>
</Accordion>
);
}`;
const react = {
"/App.jsx": App,
};
const reactTs = {
"/App.tsx": AppTs,
};
export default {
...react,
...reactTs,
};
@@ -214,7 +214,7 @@ export default function App() {
startContent={<MonitorMobileIcon className="text-primary" />}
subtitle={
<p className="flex">
2 issues to <p className="text-primary ml-1">fix now</p>
2 issues to <span className="text-primary ml-1">fix now</span>
</p>
}
title="Connected devices"
@@ -249,7 +249,7 @@ export default function App() {
title={
<p className="flex gap-1 items-center">
Card expired
<p className="text-default-400 text-small">*4812</p>
<span className="text-default-400 text-small">*4812</span>
</p>
}
>
@@ -51,7 +51,7 @@ export default function App() {
}
subtitle={
<p className="flex">
2 issues to<p className="text-primary ml-1">fix now</p>
2 issues to<span className="text-primary ml-1">fix now</span>
</p>
}
title="Zoey Lang"
@@ -0,0 +1,89 @@
const App = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {useAsyncList} from "@react-stately/data";
export default function App() {
let list = useAsyncList({
async load({signal, filterText}) {
let res = await fetch(\`https://swapi.py4e.com/api/people/?search=\${filterText}\`, {signal});
let json = await res.json();
return {
items: json.results,
};
},
});
return (
<Autocomplete
className="max-w-xs"
inputValue={list.filterText}
isLoading={list.isLoading}
items={list.items}
label="Select a character"
placeholder="Type to search..."
variant="bordered"
onInputChange={list.setFilterText}
>
{(item) => (
<AutocompleteItem key={item.name} className="capitalize">
{item.name}
</AutocompleteItem>
)}
</Autocomplete>
);
}`;
const AppTs = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {useAsyncList} from "@react-stately/data";
type SWCharacter = {
name: string;
height: string;
mass: string;
birth_year: string;
};
export default function App() {
let list = useAsyncList<SWCharacter>({
async load({signal, filterText}) {
let res = await fetch(\`https://swapi.py4e.com/api/people/?search=\${filterText}\`, {signal});
let json = await res.json();
return {
items: json.results,
};
},
});
return (
<Autocomplete
className="max-w-xs"
inputValue={list.filterText}
isLoading={list.isLoading}
items={list.items}
label="Select a character"
placeholder="Type to search..."
variant="bordered"
onInputChange={list.setFilterText}
>
{(item) => (
<AutocompleteItem key={item.name} className="capitalize">
{item.name}
</AutocompleteItem>
)}
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
};
const reactTs = {
"/App.tsx": AppTs,
};
export default {
...react,
...reactTs,
};
@@ -0,0 +1,188 @@
const usePokemonListTs = `export type Pokemon = {
name: string;
url: string;
};
export type UsePokemonListProps = {
/** Delay to wait before fetching more items */
fetchDelay?: number;
};
export function usePokemonList({fetchDelay = 0}: UsePokemonListProps = {}) {
const [items, setItems] = React.useState<Pokemon[]>([]);
const [hasMore, setHasMore] = React.useState(true);
const [isLoading, setIsLoading] = React.useState(false);
const [offset, setOffset] = React.useState(0);
const limit = 10; // Number of items per page, adjust as necessary
const loadPokemon = async (currentOffset: number) => {
const controller = new AbortController();
const {signal} = controller;
try {
setIsLoading(true);
if (offset > 0) {
// Delay to simulate network latency
await new Promise((resolve) => setTimeout(resolve, fetchDelay));
}
let res = await fetch(
\`https://pokeapi.co/api/v2/pokemon?offset=\${currentOffset}&limit=\${limit}\`,
{signal},
);
if (!res.ok) {
throw new Error("Network response was not ok");
}
let json = await res.json();
setHasMore(json.next !== null);
// Append new results to existing ones
setItems((prevItems) => [...prevItems, ...json.results]);
} catch (error) {
if (error.name === "AbortError") {
console.log("Fetch aborted");
} else {
console.error("There was an error with the fetch operation:", error);
}
} finally {
setIsLoading(false);
}
};
React.useEffect(() => {
loadPokemon(offset);
}, []);
const onLoadMore = () => {
const newOffset = offset + limit;
setOffset(newOffset);
loadPokemon(newOffset);
};
return {
items,
hasMore,
isLoading,
onLoadMore,
};
}
`;
const usePokemonList = `export function usePokemonList({fetchDelay = 0} = {}) {
const [items, setItems] = React.useState([]);
const [hasMore, setHasMore] = React.useState(true);
const [isLoading, setIsLoading] = React.useState(false);
const [offset, setOffset] = React.useState(0);
const limit = 10; // Number of items per page, adjust as necessary
const loadPokemon = async (currentOffset) => {
const controller = new AbortController();
const {signal} = controller;
try {
setIsLoading(true);
if (offset > 0) {
// Delay to simulate network latency
await new Promise((resolve) => setTimeout(resolve, fetchDelay));
}
let res = await fetch(
\`https://pokeapi.co/api/v2/pokemon?offset=\${currentOffset}&limit=\${limit}\`,
{signal},
);
if (!res.ok) {
throw new Error("Network response was not ok");
}
let json = await res.json();
setHasMore(json.next !== null);
// Append new results to existing ones
setItems((prevItems) => [...prevItems, ...json.results]);
} catch (error) {
if (error.name === "AbortError") {
console.log("Fetch aborted");
} else {
console.error("There was an error with the fetch operation:", error);
}
} finally {
setIsLoading(false);
}
};
React.useEffect(() => {
loadPokemon(offset);
}, []);
const onLoadMore = () => {
const newOffset = offset + limit;
setOffset(newOffset);
loadPokemon(newOffset);
};
return {
items,
hasMore,
isLoading,
onLoadMore,
};
};`;
const App = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {useInfiniteScroll} from "@nextui-org/use-infinite-scroll";
import {usePokemonList} from "./usePokemonList";
export default function App() {
const [isOpen, setIsOpen] = React.useState(false);
const {items, hasMore, isLoading, onLoadMore} = usePokemonList({fetchDelay: 1500});
const [, scrollerRef] = useInfiniteScroll({
hasMore,
isEnabled: isOpen,
shouldUseLoader: false, // We don't want to show the loader at the bottom of the list
onLoadMore,
});
return (
<Autocomplete
className="max-w-xs"
variant="bordered"
isLoading={isLoading}
defaultItems={items}
label="Pick a Pokemon"
placeholder="Select a Pokemon"
scrollRef={scrollerRef}
selectionMode="single"
onOpenChange={setIsOpen}
>
{(item) => (
<AutocompleteItem key={item.name} className="capitalize">
{item.name}
</AutocompleteItem>
)}
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
"/usePokemonList.js": usePokemonList,
};
const reactTs = {
"/App.tsx": App,
"/usePokemonList.ts": usePokemonListTs,
};
export default {
...react,
...reactTs,
};
@@ -0,0 +1,68 @@
const data = `export const animals = [
{label: "Cat", value: "cat", description: "The second most popular pet in the world"},
{label: "Dog", value: "dog", description: "The most popular pet in the world"},
{label: "Elephant", value: "elephant", description: "The largest land animal"},
{label: "Lion", value: "lion", description: "The king of the jungle"},
{label: "Tiger", value: "tiger", description: "The largest cat species"},
{label: "Giraffe", value: "giraffe", description: "The tallest land animal"},
{
label: "Dolphin",
value: "dolphin",
description: "A widely distributed and diverse group of aquatic mammals",
},
{label: "Penguin", value: "penguin", description: "A group of aquatic flightless birds"},
{label: "Zebra", value: "zebra", description: "A several species of African equids"},
{
label: "Shark",
value: "shark",
description: "A group of elasmobranch fish characterized by a cartilaginous skeleton",
},
{
label: "Whale",
value: "whale",
description: "Diverse group of fully aquatic placental marine mammals",
},
{label: "Otter", value: "otter", description: "A carnivorous mammal in the subfamily Lutrinae"},
{label: "Crocodile", value: "crocodile", description: "A large semiaquatic reptile"},
];`;
const App = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {animals} from "./data";
export default function App() {
const colors = [
"default",
"primary",
"secondary",
"success",
"warning",
"danger",
];
return (
<div className="w-full flex flex-row flex-wrap gap-4">
{colors.map((color) => (
<Autocomplete
key={color}
color={color}
defaultItems={animals}
label="Favorite Animal"
placeholder="Search an animal"
defaultSelectedKey={"cat"}
className="max-w-xs"
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
))}
</div>
);
}`;
const react = {
"/App.jsx": App,
"/data.js": data,
};
export default {
...react,
};
@@ -0,0 +1,90 @@
const data = `export const animals = [
{label: "Cat", value: "cat", description: "The second most popular pet in the world"},
{label: "Dog", value: "dog", description: "The most popular pet in the world"},
{label: "Elephant", value: "elephant", description: "The largest land animal"},
{label: "Lion", value: "lion", description: "The king of the jungle"},
{label: "Tiger", value: "tiger", description: "The largest cat species"},
{label: "Giraffe", value: "giraffe", description: "The tallest land animal"},
{
label: "Dolphin",
value: "dolphin",
description: "A widely distributed and diverse group of aquatic mammals",
},
{label: "Penguin", value: "penguin", description: "A group of aquatic flightless birds"},
{label: "Zebra", value: "zebra", description: "A several species of African equids"},
{
label: "Shark",
value: "shark",
description: "A group of elasmobranch fish characterized by a cartilaginous skeleton",
},
{
label: "Whale",
value: "whale",
description: "Diverse group of fully aquatic placental marine mammals",
},
{label: "Otter", value: "otter", description: "A carnivorous mammal in the subfamily Lutrinae"},
{label: "Crocodile", value: "crocodile", description: "A large semiaquatic reptile"},
];`;
const AppTs = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {animals} from "./data";
export default function App() {
const [value, setValue] = React.useState<React.Key>("cat");
return (
<div className="flex w-full max-w-xs flex-col gap-2">
<Autocomplete
label="Favorite Animal"
variant="bordered"
defaultItems={animals}
placeholder="Search an animal"
className="max-w-xs"
selectedKey={value}
onSelectionChange={setValue}
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
<p className="text-default-500 text-small">Selected: {value}</p>
</div>
);
}`;
const App = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {animals} from "./data";
export default function App() {
const [value, setValue] = React.useState("cat");
return (
<div className="flex w-full max-w-xs flex-col gap-2">
<Autocomplete
label="Favorite Animal"
variant="bordered"
defaultItems={animals}
placeholder="Search an animal"
className="max-w-xs"
selectedKey={value}
onSelectionChange={setValue}
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
<p className="text-default-500 text-small">Selected: {value}</p>
</div>
);
}`;
const react = {
"/App.jsx": App,
"/data.js": data,
};
const reactTs = {
"/App.tsx": AppTs,
"/data.js": data,
};
export default {
...react,
...reactTs,
};
@@ -0,0 +1,102 @@
const data = `export const animals = [
{label: "Cat", value: "cat", description: "The second most popular pet in the world"},
{label: "Dog", value: "dog", description: "The most popular pet in the world"},
{label: "Elephant", value: "elephant", description: "The largest land animal"},
{label: "Lion", value: "lion", description: "The king of the jungle"},
{label: "Tiger", value: "tiger", description: "The largest cat species"},
{label: "Giraffe", value: "giraffe", description: "The tallest land animal"},
{
label: "Dolphin",
value: "dolphin",
description: "A widely distributed and diverse group of aquatic mammals",
},
{label: "Penguin", value: "penguin", description: "A group of aquatic flightless birds"},
{label: "Zebra", value: "zebra", description: "A several species of African equids"},
{
label: "Shark",
value: "shark",
description: "A group of elasmobranch fish characterized by a cartilaginous skeleton",
},
{
label: "Whale",
value: "whale",
description: "Diverse group of fully aquatic placental marine mammals",
},
{label: "Otter", value: "otter", description: "A carnivorous mammal in the subfamily Lutrinae"},
{label: "Crocodile", value: "crocodile", description: "A large semiaquatic reptile"},
];`;
const App = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {animals} from "./data";
export default function App() {
const myFilter = (textValue, inputValue) => {
if (inputValue.length === 0) {
return true;
}
// Normalize both strings so we can slice safely
// take into account the ignorePunctuation option as well...
textValue = textValue.normalize("NFC").toLocaleLowerCase();
inputValue = inputValue.normalize("NFC").toLocaleLowerCase();
return textValue.slice(0, inputValue.length) === inputValue;
};
return (
<Autocomplete
allowsCustomValue
className="max-w-xs"
defaultFilter={myFilter}
defaultItems={animals}
label="Search an animal"
variant="bordered"
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
);
}`;
const AppTs = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {animals} from "./data";
export default function App() {
const myFilter = (textValue: string, inputValue: string) => {
if (inputValue.length === 0) {
return true;
}
// Normalize both strings so we can slice safely
// take into account the ignorePunctuation option as well...
textValue = textValue.normalize("NFC").toLocaleLowerCase();
inputValue = inputValue.normalize("NFC").toLocaleLowerCase();
return textValue.slice(0, inputValue.length) === inputValue;
};
return (
<Autocomplete
className="max-w-xs"
defaultFilter={myFilter}
defaultItems={animals}
label="Search an animal"
variant="bordered"
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
"/data.js": data,
};
const reactTs = {
"/App.tsx": AppTs,
};
export default {
...react,
...reactTs,
};
@@ -0,0 +1,239 @@
const data = `export const users = [
{
id: 1,
name: "Tony Reichert",
role: "CEO",
team: "Management",
status: "active",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/1.png",
email: "tony.reichert@example.com",
},
{
id: 2,
name: "Zoey Lang",
role: "Tech Lead",
team: "Development",
status: "paused",
age: "25",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/1.png",
email: "zoey.lang@example.com",
},
{
id: 3,
name: "Jane Fisher",
role: "Sr. Dev",
team: "Development",
status: "active",
age: "22",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/2.png",
email: "jane.fisher@example.com",
},
{
id: 4,
name: "William Howard",
role: "C.M.",
team: "Marketing",
status: "vacation",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/2.png",
email: "william.howard@example.com",
},
{
id: 5,
name: "Kristen Copper",
role: "S. Manager",
team: "Sales",
status: "active",
age: "24",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/3.png",
email: "kristen.cooper@example.com",
},
{
id: 6,
name: "Brian Kim",
role: "P. Manager",
team: "Management",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/3.png",
email: "brian.kim@example.com",
status: "Active",
},
{
id: 7,
name: "Michael Hunt",
role: "Designer",
team: "Design",
status: "paused",
age: "27",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/4.png",
email: "michael.hunt@example.com",
},
{
id: 8,
name: "Samantha Brooks",
role: "HR Manager",
team: "HR",
status: "active",
age: "31",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/4.png",
email: "samantha.brooks@example.com",
},
{
id: 9,
name: "Frank Harrison",
role: "F. Manager",
team: "Finance",
status: "vacation",
age: "33",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/5.png",
email: "frank.harrison@example.com",
},
{
id: 10,
name: "Emma Adams",
role: "Ops Manager",
team: "Operations",
status: "active",
age: "35",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/5.png",
email: "emma.adams@example.com",
},
{
id: 11,
name: "Brandon Stevens",
role: "Jr. Dev",
team: "Development",
status: "active",
age: "22",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/7.png",
email: "brandon.stevens@example.com",
},
{
id: 12,
name: "Megan Richards",
role: "P. Manager",
team: "Product",
status: "paused",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/7.png",
email: "megan.richards@example.com",
},
{
id: 13,
name: "Oliver Scott",
role: "S. Manager",
team: "Security",
status: "active",
age: "37",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/8.png",
email: "oliver.scott@example.com",
},
{
id: 14,
name: "Grace Allen",
role: "M. Specialist",
team: "Marketing",
status: "active",
age: "30",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/8.png",
email: "grace.allen@example.com",
},
{
id: 15,
name: "Noah Carter",
role: "IT Specialist",
team: "I. Technology",
status: "paused",
age: "31",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/9.png",
email: "noah.carter@example.com",
},
{
id: 16,
name: "Ava Perez",
role: "Manager",
team: "Sales",
status: "active",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/9.png",
email: "ava.perez@example.com",
},
{
id: 17,
name: "Liam Johnson",
role: "Data Analyst",
team: "Analysis",
status: "active",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/11.png",
email: "liam.johnson@example.com",
},
{
id: 18,
name: "Sophia Taylor",
role: "QA Analyst",
team: "Testing",
status: "active",
age: "27",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/11.png",
email: "sophia.taylor@example.com",
},
{
id: 19,
name: "Lucas Harris",
role: "Administrator",
team: "Information Technology",
status: "paused",
age: "32",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/12.png",
email: "lucas.harris@example.com",
},
{
id: 20,
name: "Mia Robinson",
role: "Coordinator",
team: "Operations",
status: "active",
age: "26",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/12.png",
email: "mia.robinson@example.com",
},
];`;
const App = `import {Autocomplete, AutocompleteItem, Avatar} from "@nextui-org/react";
import {users} from "./data";
export default function App() {
return (
<Autocomplete
defaultItems={users}
variant="bordered"
label="Assigned to"
placeholder="Select a user"
labelPlacement="inside"
className="max-w-xs"
>
{(user) => (
<AutocompleteItem key={user.id} textValue={user.name}>
<div className="flex gap-2 items-center">
<Avatar alt={user.name} className="flex-shrink-0" size="sm" src={user.avatar} />
<div className="flex flex-col">
<span className="text-small">{user.name}</span>
<span className="text-tiny text-default-400">{user.email}</span>
</div>
</div>
</AutocompleteItem>
)}
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
"/data.js": data,
};
export default {
...react,
};
@@ -0,0 +1,56 @@
const App = `import {Autocomplete, AutocompleteItem, AutocompleteSection} from "@nextui-org/react";
export default function App() {
const headingClasses = "flex w-full sticky top-1 z-20 py-1.5 px-2 bg-default-100 shadow-small rounded-small";
return (
<Autocomplete
label="Favorite Animal"
variant="bordered"
placeholder="Search an animal"
className="max-w-xs"
scrollShadowProps={{
isEnabled: false,
}}
>
<AutocompleteSection
title="Mammals"
classNames={{
heading: headingClasses,
}}
>
<AutocompleteItem key="Lion">Lion</AutocompleteItem>
<AutocompleteItem key="Tiger">Tiger</AutocompleteItem>
<AutocompleteItem key="Elephant">Elephant</AutocompleteItem>
<AutocompleteItem key="Kangaroo">Kangaroo</AutocompleteItem>
<AutocompleteItem key="Panda">Panda</AutocompleteItem>
<AutocompleteItem key="Giraffe">Giraffe</AutocompleteItem>
<AutocompleteItem key="Zebra">Zebra</AutocompleteItem>
<AutocompleteItem key="Cheetah">Cheetah</AutocompleteItem>
</AutocompleteSection>
<AutocompleteSection
title="Birds"
classNames={{
heading: headingClasses,
}}
>
<AutocompleteItem key="Eagle">Eagle</AutocompleteItem>
<AutocompleteItem key="Parrot">Parrot</AutocompleteItem>
<AutocompleteItem key="Penguin">Penguin</AutocompleteItem>
<AutocompleteItem key="Ostrich">Ostrich</AutocompleteItem>
<AutocompleteItem key="Peacock">Peacock</AutocompleteItem>
<AutocompleteItem key="Swan">Swan</AutocompleteItem>
<AutocompleteItem key="Falcon">Falcon</AutocompleteItem>
<AutocompleteItem key="Flamingo">Flamingo</AutocompleteItem>
</AutocompleteSection>
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
};
export default {
...react,
};
@@ -0,0 +1,78 @@
const data = `export const animals = [
{label: "Cat", value: "cat", description: "The second most popular pet in the world"},
{label: "Dog", value: "dog", description: "The most popular pet in the world"},
{label: "Elephant", value: "elephant", description: "The largest land animal"},
{label: "Lion", value: "lion", description: "The king of the jungle"},
{label: "Tiger", value: "tiger", description: "The largest cat species"},
{label: "Giraffe", value: "giraffe", description: "The tallest land animal"},
{
label: "Dolphin",
value: "dolphin",
description: "A widely distributed and diverse group of aquatic mammals",
},
{label: "Penguin", value: "penguin", description: "A group of aquatic flightless birds"},
{label: "Zebra", value: "zebra", description: "A several species of African equids"},
{
label: "Shark",
value: "shark",
description: "A group of elasmobranch fish characterized by a cartilaginous skeleton",
},
{
label: "Whale",
value: "whale",
description: "Diverse group of fully aquatic placental marine mammals",
},
{label: "Otter", value: "otter", description: "A carnivorous mammal in the subfamily Lutrinae"},
{label: "Crocodile", value: "crocodile", description: "A large semiaquatic reptile"},
];`;
const SelectorIcon = `export const SelectorIcon = (props) => (
<svg
aria-hidden="true"
fill="none"
focusable="false"
height="1em"
role="presentation"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="1.5"
viewBox="0 0 24 24"
width="1em"
{...props}
>
<path d="M0 0h24v24H0z" fill="none" stroke="none" />
<path d="M8 9l4 -4l4 4" />
<path d="M16 15l-4 4l-4 -4" />
</svg>
);`;
const App = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {SelectorIcon} from "./SelectorIcon";
import {animals} from "./data";
export default function App() {
return (
<Autocomplete
label="Favorite Animal"
placeholder="Search an animal"
defaultItems={animals}
labelPlacement="outside"
className="max-w-xs"
disableSelectorIconRotation
selectorIcon={<SelectorIcon />}
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
"/data.js": data,
"/SelectorIcon.jsx": SelectorIcon,
};
export default {
...react,
};
@@ -0,0 +1,319 @@
const data = `export const users = [
{
id: 1,
name: "Tony Reichert",
role: "CEO",
team: "Management",
status: "active",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/1.png",
email: "tony.reichert@example.com",
},
{
id: 2,
name: "Zoey Lang",
role: "Tech Lead",
team: "Development",
status: "paused",
age: "25",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/1.png",
email: "zoey.lang@example.com",
},
{
id: 3,
name: "Jane Fisher",
role: "Sr. Dev",
team: "Development",
status: "active",
age: "22",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/2.png",
email: "jane.fisher@example.com",
},
{
id: 4,
name: "William Howard",
role: "C.M.",
team: "Marketing",
status: "vacation",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/2.png",
email: "william.howard@example.com",
},
{
id: 5,
name: "Kristen Copper",
role: "S. Manager",
team: "Sales",
status: "active",
age: "24",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/3.png",
email: "kristen.cooper@example.com",
},
{
id: 6,
name: "Brian Kim",
role: "P. Manager",
team: "Management",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/3.png",
email: "brian.kim@example.com",
status: "Active",
},
{
id: 7,
name: "Michael Hunt",
role: "Designer",
team: "Design",
status: "paused",
age: "27",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/4.png",
email: "michael.hunt@example.com",
},
{
id: 8,
name: "Samantha Brooks",
role: "HR Manager",
team: "HR",
status: "active",
age: "31",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/4.png",
email: "samantha.brooks@example.com",
},
{
id: 9,
name: "Frank Harrison",
role: "F. Manager",
team: "Finance",
status: "vacation",
age: "33",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/5.png",
email: "frank.harrison@example.com",
},
{
id: 10,
name: "Emma Adams",
role: "Ops Manager",
team: "Operations",
status: "active",
age: "35",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/5.png",
email: "emma.adams@example.com",
},
{
id: 11,
name: "Brandon Stevens",
role: "Jr. Dev",
team: "Development",
status: "active",
age: "22",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/7.png",
email: "brandon.stevens@example.com",
},
{
id: 12,
name: "Megan Richards",
role: "P. Manager",
team: "Product",
status: "paused",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/7.png",
email: "megan.richards@example.com",
},
{
id: 13,
name: "Oliver Scott",
role: "S. Manager",
team: "Security",
status: "active",
age: "37",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/8.png",
email: "oliver.scott@example.com",
},
{
id: 14,
name: "Grace Allen",
role: "M. Specialist",
team: "Marketing",
status: "active",
age: "30",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/8.png",
email: "grace.allen@example.com",
},
{
id: 15,
name: "Noah Carter",
role: "IT Specialist",
team: "I. Technology",
status: "paused",
age: "31",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/9.png",
email: "noah.carter@example.com",
},
{
id: 16,
name: "Ava Perez",
role: "Manager",
team: "Sales",
status: "active",
age: "29",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/9.png",
email: "ava.perez@example.com",
},
{
id: 17,
name: "Liam Johnson",
role: "Data Analyst",
team: "Analysis",
status: "active",
age: "28",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/11.png",
email: "liam.johnson@example.com",
},
{
id: 18,
name: "Sophia Taylor",
role: "QA Analyst",
team: "Testing",
status: "active",
age: "27",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/11.png",
email: "sophia.taylor@example.com",
},
{
id: 19,
name: "Lucas Harris",
role: "Administrator",
team: "Information Technology",
status: "paused",
age: "32",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/male/12.png",
email: "lucas.harris@example.com",
},
{
id: 20,
name: "Mia Robinson",
role: "Coordinator",
team: "Operations",
status: "active",
age: "26",
avatar: "https://d2u8k2ocievbld.cloudfront.net/memojis/female/12.png",
email: "mia.robinson@example.com",
},
];`;
const SearchIcon = `export const SearchIcon = ({
size = 24,
strokeWidth = 1.5,
width,
height,
...props
}) => (
<svg
aria-hidden="true"
fill="none"
focusable="false"
height={height || size}
role="presentation"
viewBox="0 0 24 24"
width={width || size}
{...props}
>
<path
d="M11.5 21C16.7467 21 21 16.7467 21 11.5C21 6.25329 16.7467 2 11.5 2C6.25329 2 2 6.25329 2 11.5C2 16.7467 6.25329 21 11.5 21Z"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={strokeWidth}
/>
<path
d="M22 22L20 20"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={strokeWidth}
/>
</svg>
);`;
const App = `import {Autocomplete, AutocompleteItem, Avatar, Button} from "@nextui-org/react";
import {SearchIcon} from "./SearchIcon";
import {users} from "./data";
export default function App() {
return (
<Autocomplete
classNames={{
base: "max-w-xs",
listboxWrapper: "max-h-[320px]",
selectorButton: "text-default-500"
}}
defaultItems={users}
inputProps={{
classNames: {
input: "ml-1",
inputWrapper: "h-[48px]",
},
}}
listboxProps={{
hideSelectedIcon: true,
itemClasses: {
base: [
"rounded-medium",
"text-default-500",
"transition-opacity",
"data-[hover=true]:text-foreground",
"dark:data-[hover=true]:bg-default-50",
"data-[pressed=true]:opacity-70",
"data-[hover=true]:bg-default-200",
"data-[selectable=true]:focus:bg-default-100",
"data-[focus-visible=true]:ring-default-500",
],
},
}}
aria-label="Select an employee"
placeholder="Enter employee name"
popoverProps={{
offset: 10,
classNames: {
base: "rounded-large",
content: "p-1 border-small border-default-100 bg-background",
},
}}
startContent={<SearchIcon className="text-default-400" strokeWidth={2.5} size={20} />}
radius="full"
variant="bordered"
>
{(item) => (
<AutocompleteItem key={item.id} textValue={item.name}>
<div className="flex justify-between items-center">
<div className="flex gap-2 items-center">
<Avatar alt={item.name} className="flex-shrink-0" size="sm" src={item.avatar} />
<div className="flex flex-col">
<span className="text-small">{item.name}</span>
<span className="text-tiny text-default-400">{item.team}</span>
</div>
</div>
<Button
className="border-small mr-0.5 font-medium shadow-small"
radius="full"
size="sm"
variant="bordered"
>
Add
</Button>
</div>
</AutocompleteItem>
)}
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
"/SearchIcon.jsx": SearchIcon,
"/data.js": data,
};
export default {
...react,
};
@@ -0,0 +1,53 @@
const data = `export const animals = [
{label: "Cat", value: "cat", description: "The second most popular pet in the world"},
{label: "Dog", value: "dog", description: "The most popular pet in the world"},
{label: "Elephant", value: "elephant", description: "The largest land animal"},
{label: "Lion", value: "lion", description: "The king of the jungle"},
{label: "Tiger", value: "tiger", description: "The largest cat species"},
{label: "Giraffe", value: "giraffe", description: "The tallest land animal"},
{
label: "Dolphin",
value: "dolphin",
description: "A widely distributed and diverse group of aquatic mammals",
},
{label: "Penguin", value: "penguin", description: "A group of aquatic flightless birds"},
{label: "Zebra", value: "zebra", description: "A several species of African equids"},
{
label: "Shark",
value: "shark",
description: "A group of elasmobranch fish characterized by a cartilaginous skeleton",
},
{
label: "Whale",
value: "whale",
description: "Diverse group of fully aquatic placental marine mammals",
},
{label: "Otter", value: "otter", description: "A carnivorous mammal in the subfamily Lutrinae"},
{label: "Crocodile", value: "crocodile", description: "A large semiaquatic reptile"},
];`;
const App = `import {Autocomplete, AutocompleteItem} from "@nextui-org/react";
import {animals} from "./data";
export default function App() {
return (
<Autocomplete
allowsCustomValue
label="Search an animal"
variant="bordered"
className="max-w-xs"
defaultItems={animals}
>
{(item) => <AutocompleteItem key={item.value}>{item.label}</AutocompleteItem>}
</Autocomplete>
);
}`;
const react = {
"/App.jsx": App,
"/data.js": data,
};
export default {
...react,
};

Some files were not shown because too many files have changed in this diff Show More