├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode └── settings.json ├── LICENSE.md ├── README.md ├── apps ├── docs │ ├── .gitignore │ ├── app │ │ ├── (home) │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ ├── docs │ │ │ ├── [[...slug]] │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ └── not-found.tsx │ │ ├── error.tsx │ │ ├── layout-preview │ │ │ └── dashboard │ │ │ │ └── [id] │ │ │ │ ├── DashboardLayout.tsx │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ └── not-found.tsx │ ├── components.json │ ├── content │ │ └── docs │ │ │ ├── guide │ │ │ ├── cli.mdx │ │ │ ├── data-fetching-api-client.mdx │ │ │ ├── data-fetching-enhance-ux.mdx │ │ │ ├── data-fetching-invalidation.mdx │ │ │ ├── data-fetching-overview.mdx │ │ │ ├── decisions-on-dx.mdx │ │ │ ├── form-basic.mdx │ │ │ ├── form-conditional-fields.mdx │ │ │ ├── form-dependant-validation.mdx │ │ │ ├── form-field-array.mdx │ │ │ ├── form-large.mdx │ │ │ ├── form-overview.mdx │ │ │ ├── form-submission-errors.mdx │ │ │ ├── form-validation.mdx │ │ │ ├── form-with-loading.mdx │ │ │ ├── installation.mdx │ │ │ ├── introduction.mdx │ │ │ ├── philosophy.mdx │ │ │ ├── react-code-convention.mdx │ │ │ ├── react-folder-structure.mdx │ │ │ └── tech-stack.mdx │ │ │ └── ui │ │ │ ├── accordion.mdx │ │ │ ├── avatar.mdx │ │ │ ├── button.mdx │ │ │ ├── calendar.mdx │ │ │ ├── checkbox.mdx │ │ │ ├── combobox.mdx │ │ │ ├── confirm-dialog.mdx │ │ │ ├── data-table.mdx │ │ │ ├── date-field.mdx │ │ │ ├── date-picker.mdx │ │ │ ├── date-range-picker.mdx │ │ │ ├── dialog.mdx │ │ │ ├── file-trigger.mdx │ │ │ ├── input.mdx │ │ │ ├── loading-overlay.mdx │ │ │ ├── menu.mdx │ │ │ ├── nprogress.mdx │ │ │ ├── number-field.mdx │ │ │ ├── pagination.mdx │ │ │ ├── popover.mdx │ │ │ ├── radio-group.mdx │ │ │ ├── range-calendar.mdx │ │ │ ├── select.mdx │ │ │ ├── separator.mdx │ │ │ ├── sheet.mdx │ │ │ ├── sidebar.mdx │ │ │ ├── skeleton.mdx │ │ │ ├── sonner.mdx │ │ │ ├── spinner.mdx │ │ │ ├── switch.mdx │ │ │ ├── table.mdx │ │ │ ├── textarea.mdx │ │ │ ├── time-field.mdx │ │ │ ├── tooltip.mdx │ │ │ ├── unused.mdx │ │ │ └── uploader.mdx │ ├── contentlayer.config.ts │ ├── eslint.config.js │ ├── features │ │ ├── docs │ │ │ └── components │ │ │ │ ├── Article.tsx │ │ │ │ └── TocPortal.tsx │ │ └── home │ │ │ └── components │ │ │ ├── FeatureSection.tsx │ │ │ ├── FooterSection.tsx │ │ │ ├── HeroSection.tsx │ │ │ └── HomePage.tsx │ ├── next.config.ts │ ├── package.json │ ├── postcss.config.mjs │ ├── public │ │ ├── favicon.ico │ │ ├── hero-background.webp │ │ ├── images │ │ │ ├── folder-feature-based.avif │ │ │ ├── folder-features.avif │ │ │ ├── folder-import-flow.avif │ │ │ ├── folder-overview.avif │ │ │ ├── folder-routing.avif │ │ │ ├── folder-shared.avif │ │ │ └── og-image-2.jpg │ │ └── logo.png │ ├── shared │ │ ├── actions │ │ │ └── examples │ │ │ │ ├── payments.data.ts │ │ │ │ ├── payments.ts │ │ │ │ └── payments.type.ts │ │ ├── components │ │ │ ├── CopyToClipboard.tsx │ │ │ ├── Logo.tsx │ │ │ ├── ProjectFeatures.tsx │ │ │ ├── Providers.tsx │ │ │ ├── ThemeSwitcher.tsx │ │ │ ├── Toc.tsx │ │ │ ├── examples │ │ │ │ ├── AccordionDemo.tsx │ │ │ │ ├── AvatarDemo.tsx │ │ │ │ ├── AvatarSizes.tsx │ │ │ │ ├── ButtonAsALink.tsx │ │ │ │ ├── ButtonDemo.tsx │ │ │ │ ├── ButtonDestructive.tsx │ │ │ │ ├── ButtonGhost.tsx │ │ │ │ ├── ButtonIcon.tsx │ │ │ │ ├── ButtonLoading.tsx │ │ │ │ ├── ButtonOutline.tsx │ │ │ │ ├── ButtonWithIcon.tsx │ │ │ │ ├── CalendarControlled.tsx │ │ │ │ ├── CalendarDemo.tsx │ │ │ │ ├── CalendarMinMax.tsx │ │ │ │ ├── CalendarUnstyled.tsx │ │ │ │ ├── CheckboxDemo.tsx │ │ │ │ ├── CheckboxDisabled.tsx │ │ │ │ ├── CheckboxForm.tsx │ │ │ │ ├── CheckboxGroupDemo.tsx │ │ │ │ ├── CheckboxIndeterminate.tsx │ │ │ │ ├── ConfirmDialogDemo.tsx │ │ │ │ ├── ConfirmDialogDestructive.tsx │ │ │ │ ├── DataTableColumnAlignment.tsx │ │ │ │ ├── DataTableDemo.tsx │ │ │ │ ├── DataTableLoadingState.tsx │ │ │ │ ├── DataTableRealworld.tsx │ │ │ │ ├── DataTableRowSelection.tsx │ │ │ │ ├── DataTableSorting.tsx │ │ │ │ ├── DataTableSticky.tsx │ │ │ │ ├── DateFieldDemo.tsx │ │ │ │ ├── DateFieldDisabled.tsx │ │ │ │ ├── DateFieldForm.tsx │ │ │ │ ├── DateFieldWithLabel.tsx │ │ │ │ ├── DatePickerDemo.tsx │ │ │ │ ├── DatePickerDisabled.tsx │ │ │ │ ├── DatePickerForm.tsx │ │ │ │ ├── DatePickerWithLabel.tsx │ │ │ │ ├── DateRangePickerDemo.tsx │ │ │ │ ├── DateRangePickerDisabled.tsx │ │ │ │ ├── DateRangePickerForm.tsx │ │ │ │ ├── DateRangePickerWithLabel.tsx │ │ │ │ ├── DialogDemo.tsx │ │ │ │ ├── FileTriggerAvatar.tsx │ │ │ │ ├── FileTriggerDemo.tsx │ │ │ │ ├── InputDemo.tsx │ │ │ │ ├── InputDisabled.tsx │ │ │ │ ├── InputFile.tsx │ │ │ │ ├── InputForm.tsx │ │ │ │ ├── InputWithButton.tsx │ │ │ │ ├── InputWithLabel.tsx │ │ │ │ ├── LoadingOverlayDemo.tsx │ │ │ │ ├── MenuDemo.tsx │ │ │ │ ├── MenuWithIcon.tsx │ │ │ │ ├── MenuWithKeyboard.tsx │ │ │ │ ├── MenuWithSubmenu.tsx │ │ │ │ ├── NProgressDemo.tsx │ │ │ │ ├── NumberFieldCurrency.tsx │ │ │ │ ├── NumberFieldDemo.tsx │ │ │ │ ├── NumberFieldDisabled.tsx │ │ │ │ ├── NumberFieldForm.tsx │ │ │ │ ├── NumberFieldMinMax.tsx │ │ │ │ ├── NumberFieldPercentages.tsx │ │ │ │ ├── NumberFieldUnits.tsx │ │ │ │ ├── NumberFieldWithLabel.tsx │ │ │ │ ├── NumberFieldWithoutStepper.tsx │ │ │ │ ├── PaginationDemo.tsx │ │ │ │ ├── PaginationWithPageSelector.tsx │ │ │ │ ├── PaginationWithQueryParams.tsx │ │ │ │ ├── PopoverBottomRight.tsx │ │ │ │ ├── PopoverDemo.tsx │ │ │ │ ├── RadioGroupDemo.tsx │ │ │ │ ├── RadioGroupDisabled.tsx │ │ │ │ ├── RadioGroupForm.tsx │ │ │ │ ├── RadioGroupHorizontal.tsx │ │ │ │ ├── RangeCalendarControlled.tsx │ │ │ │ ├── RangeCalendarDefault.tsx │ │ │ │ ├── RangeCalendarDemo.tsx │ │ │ │ ├── RangeCalendarMinMax.tsx │ │ │ │ ├── RangeCalendarUnstyled.tsx │ │ │ │ ├── RecDependantValidation.tsx │ │ │ │ ├── RecFormBasic.tsx │ │ │ │ ├── RecFormConditionalFields.tsx │ │ │ │ ├── RecFormFieldArray.tsx │ │ │ │ ├── RecFormLargeForm.tsx │ │ │ │ ├── RecFormSubmissionErrors.tsx │ │ │ │ ├── RecFormValidation.tsx │ │ │ │ ├── RecFormWithLoading.tsx │ │ │ │ ├── SelectCustom.tsx │ │ │ │ ├── SelectDemo.tsx │ │ │ │ ├── SelectDisabled.tsx │ │ │ │ ├── SelectForm.tsx │ │ │ │ ├── SelectMultiple.tsx │ │ │ │ ├── SelectMultipleCustomization.tsx │ │ │ │ ├── SelectMultipleDisabled.tsx │ │ │ │ ├── SelectMultipleSearchable.tsx │ │ │ │ ├── SelectSearchable.tsx │ │ │ │ ├── SelectWithClearButton.tsx │ │ │ │ ├── SeparatorDemo.tsx │ │ │ │ ├── SheetDemo.tsx │ │ │ │ ├── SkeletonDemo.tsx │ │ │ │ ├── SkeletonScreen.tsx │ │ │ │ ├── SonnerDemo.tsx │ │ │ │ ├── SpinnerDemo.tsx │ │ │ │ ├── SwitchDemo.tsx │ │ │ │ ├── SwitchDisabled.tsx │ │ │ │ ├── SwitchForm.tsx │ │ │ │ ├── TableDemo.tsx │ │ │ │ ├── TextAreaDemo.tsx │ │ │ │ ├── TextAreaDisabled.tsx │ │ │ │ ├── TextAreaForm.tsx │ │ │ │ ├── TextAreaWithButton.tsx │ │ │ │ ├── TextAreaWithLabel.tsx │ │ │ │ ├── TimeFieldDemo.tsx │ │ │ │ ├── TimeFieldDisabled.tsx │ │ │ │ ├── TimeFieldForm.tsx │ │ │ │ ├── TimeFieldGranularity.tsx │ │ │ │ ├── TimeFieldWithLabel.tsx │ │ │ │ ├── TooltipBasic.tsx │ │ │ │ ├── TooltipCustom.tsx │ │ │ │ ├── TooltipDemo.tsx │ │ │ │ ├── UploaderCustom.tsx │ │ │ │ ├── UploaderDemo.tsx │ │ │ │ ├── UploaderDemo.utils.ts │ │ │ │ ├── UploaderDisabled.tsx │ │ │ │ ├── UploaderForm.tsx │ │ │ │ ├── UploaderRetry.tsx │ │ │ │ ├── UploaderValidation.tsx │ │ │ │ ├── UploaderVariantListType.tsx │ │ │ │ └── UploaderVariantTriggerType.tsx │ │ │ ├── icons │ │ │ │ ├── GithubIcon.tsx │ │ │ │ ├── NextJsIcon.tsx │ │ │ │ ├── ReactAriaIcon.tsx │ │ │ │ ├── ReactIcon.tsx │ │ │ │ ├── ReactQueryIcon.tsx │ │ │ │ ├── ShadcnIcon.tsx │ │ │ │ └── ViteIcon.tsx │ │ │ └── mdx-helpers │ │ │ │ ├── CodeCollapsible.tsx │ │ │ │ ├── ComponentPreview.tsx │ │ │ │ ├── Mdx.tsx │ │ │ │ ├── MdxImage.tsx │ │ │ │ ├── MdxSnippet.tsx │ │ │ │ └── MdxTip.tsx │ │ ├── consts │ │ │ └── common.ts │ │ ├── hooks │ │ │ └── useMounted.tsx │ │ ├── layouts │ │ │ ├── DocsLayout │ │ │ │ ├── DocContent.tsx │ │ │ │ ├── HamburgerMenu.tsx │ │ │ │ ├── Icons.tsx │ │ │ │ ├── ModulePicker.tsx │ │ │ │ ├── SidebarHeader.tsx │ │ │ │ ├── SidebarMenu.tsx │ │ │ │ └── index.tsx │ │ │ ├── DocsSearch.tsx │ │ │ ├── HeaderIconButtons.tsx │ │ │ ├── LandingPageLayout │ │ │ │ └── index.tsx │ │ │ └── TopNavLinks.tsx │ │ └── lib │ │ │ ├── composition.ts │ │ │ ├── highlight-code.ts │ │ │ └── toc.ts │ └── tsconfig.json ├── next │ ├── components.json │ ├── eslint.config.js │ ├── next-env.d.ts │ ├── next.config.mjs │ ├── package.json │ ├── postcss.config.mjs │ ├── src │ │ ├── app │ │ │ ├── favicon.ico │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ └── shared │ │ │ ├── components │ │ │ ├── Providers.tsx │ │ │ └── ThemeSwitcher.tsx │ │ │ ├── hooks │ │ │ └── useMounted.tsx │ │ │ ├── layouts │ │ │ └── DashboardLayout.tsx │ │ │ └── lib │ │ │ └── api.ts │ └── tsconfig.json └── tanstack-router │ ├── .gitignore │ ├── .vscode │ └── settings.json │ ├── README.md │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── postcss.config.mjs │ ├── src │ ├── main.tsx │ ├── routeTree.gen.ts │ ├── routes │ │ ├── __root.tsx │ │ └── index.tsx │ └── shared │ │ ├── components │ │ ├── Providers.tsx │ │ ├── ThemeProvider.tsx │ │ └── ThemeSwitcher.tsx │ │ ├── layouts │ │ └── DashboardLayout.tsx │ │ └── lib │ │ └── api.ts │ ├── tsconfig.json │ └── vite.config.js ├── images └── project-preview-1.png ├── lefthook.yml ├── package.json ├── packages ├── eslint-config │ ├── README.md │ ├── base.js │ ├── next.js │ ├── package.json │ └── react-internal.js ├── lib │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ ├── api │ │ │ ├── index.ts │ │ │ └── sdk │ │ │ │ ├── example.api.ts │ │ │ │ └── example.type.ts │ │ └── validation │ │ │ └── index.ts │ └── tsconfig.json ├── typescript-config │ ├── README.md │ ├── base.json │ ├── nextjs.json │ ├── package.json │ └── react-library.json └── ui │ ├── components.json │ ├── eslint.config.js │ ├── package.json │ ├── postcss.config.mjs │ ├── src │ ├── components │ │ ├── Accordion.tsx │ │ ├── Avatar.tsx │ │ ├── Badge.tsx │ │ ├── Breadcrumbs.tsx │ │ ├── Button.tsx │ │ ├── Calendar.helper.tsx │ │ ├── Calendar.tsx │ │ ├── Card.tsx │ │ ├── Checkbox.tsx │ │ ├── Collapsible.tsx │ │ ├── ConfirmDialog.tsx │ │ ├── DataTable.tsx │ │ ├── DataTable.utils.tsx │ │ ├── DatePicker.tsx │ │ ├── Datefield.tsx │ │ ├── Datefield.utils.ts │ │ ├── Dialog.tsx │ │ ├── Dropzone.tsx │ │ ├── Field.tsx │ │ ├── Form.tsx │ │ ├── GridList.tsx │ │ ├── ListBox.tsx │ │ ├── LoadingOverlay.tsx │ │ ├── Menu.tsx │ │ ├── NProgress.tsx │ │ ├── Numberfield.tsx │ │ ├── Pagination.tsx │ │ ├── Popover.tsx │ │ ├── Progress.tsx │ │ ├── Provider.tsx │ │ ├── RadioGroup.tsx │ │ ├── ScrollArea.tsx │ │ ├── Searchfield.tsx │ │ ├── Select.tsx │ │ ├── Separator.tsx │ │ ├── Sheet.tsx │ │ ├── Sidebar.helpers.tsx │ │ ├── Sidebar.tsx │ │ ├── Skeleton.tsx │ │ ├── Slider.tsx │ │ ├── Sonner.tsx │ │ ├── Spinner.tsx │ │ ├── Switch.tsx │ │ ├── Table.tsx │ │ ├── Tabs.tsx │ │ ├── Textfield.tsx │ │ ├── Toggle.tsx │ │ ├── Tooltip.tsx │ │ ├── Uploader.tsx │ │ ├── Uploader.util.tsx │ │ ├── UploaderIcon.tsx │ │ ├── UploaderItem.tsx │ │ └── UploaderTrigger.tsx │ ├── hooks │ │ ├── .gitkeep │ │ └── use-mobile.ts │ ├── lib │ │ ├── file.ts │ │ └── utils.ts │ └── styles │ │ └── globals.css │ ├── tsconfig.json │ └── tsconfig.lint.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts └── sync-templates.ts ├── tooling └── cli │ ├── .gitignore │ ├── README.md │ ├── commands │ ├── add.ts │ └── init.ts │ ├── consts.ts │ ├── index.ts │ ├── package.json │ ├── templates │ ├── base │ │ ├── .prettierignore │ │ ├── .prettierrc │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── README.md │ │ ├── gitignore │ │ ├── lefthook.yml │ │ ├── package.json │ │ ├── packages │ │ │ ├── eslint-config │ │ │ │ ├── README.md │ │ │ │ ├── base.js │ │ │ │ ├── next.js │ │ │ │ ├── package.json │ │ │ │ └── react-internal.js │ │ │ ├── lib │ │ │ │ ├── eslint.config.js │ │ │ │ ├── package.json │ │ │ │ ├── src │ │ │ │ │ ├── api │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── sdk │ │ │ │ │ │ │ ├── example.api.ts │ │ │ │ │ │ │ └── example.type.ts │ │ │ │ │ └── validation │ │ │ │ │ │ └── index.ts │ │ │ │ └── tsconfig.json │ │ │ ├── typescript-config │ │ │ │ ├── README.md │ │ │ │ ├── base.json │ │ │ │ ├── nextjs.json │ │ │ │ ├── package.json │ │ │ │ └── react-library.json │ │ │ └── ui │ │ │ │ ├── components.json │ │ │ │ ├── eslint.config.js │ │ │ │ ├── package.json │ │ │ │ ├── postcss.config.mjs │ │ │ │ ├── src │ │ │ │ ├── components │ │ │ │ │ ├── Accordion.tsx │ │ │ │ │ ├── Avatar.tsx │ │ │ │ │ ├── Badge.tsx │ │ │ │ │ ├── Breadcrumbs.tsx │ │ │ │ │ ├── Button.tsx │ │ │ │ │ ├── Calendar.helper.tsx │ │ │ │ │ ├── Calendar.tsx │ │ │ │ │ ├── Card.tsx │ │ │ │ │ ├── Checkbox.tsx │ │ │ │ │ ├── Collapsible.tsx │ │ │ │ │ ├── ConfirmDialog.tsx │ │ │ │ │ ├── DataTable.tsx │ │ │ │ │ ├── DataTable.utils.tsx │ │ │ │ │ ├── DatePicker.tsx │ │ │ │ │ ├── Datefield.tsx │ │ │ │ │ ├── Datefield.utils.ts │ │ │ │ │ ├── Dialog.tsx │ │ │ │ │ ├── Dropzone.tsx │ │ │ │ │ ├── Field.tsx │ │ │ │ │ ├── Form.tsx │ │ │ │ │ ├── GridList.tsx │ │ │ │ │ ├── ListBox.tsx │ │ │ │ │ ├── LoadingOverlay.tsx │ │ │ │ │ ├── Menu.tsx │ │ │ │ │ ├── NProgress.tsx │ │ │ │ │ ├── Numberfield.tsx │ │ │ │ │ ├── Pagination.tsx │ │ │ │ │ ├── Popover.tsx │ │ │ │ │ ├── Progress.tsx │ │ │ │ │ ├── Provider.tsx │ │ │ │ │ ├── RadioGroup.tsx │ │ │ │ │ ├── ScrollArea.tsx │ │ │ │ │ ├── Searchfield.tsx │ │ │ │ │ ├── Select.tsx │ │ │ │ │ ├── Separator.tsx │ │ │ │ │ ├── Sheet.tsx │ │ │ │ │ ├── Sidebar.helpers.tsx │ │ │ │ │ ├── Sidebar.tsx │ │ │ │ │ ├── Skeleton.tsx │ │ │ │ │ ├── Slider.tsx │ │ │ │ │ ├── Sonner.tsx │ │ │ │ │ ├── Spinner.tsx │ │ │ │ │ ├── Switch.tsx │ │ │ │ │ ├── Table.tsx │ │ │ │ │ ├── Tabs.tsx │ │ │ │ │ ├── Textfield.tsx │ │ │ │ │ ├── Toggle.tsx │ │ │ │ │ ├── Tooltip.tsx │ │ │ │ │ ├── Uploader.tsx │ │ │ │ │ ├── Uploader.util.tsx │ │ │ │ │ ├── UploaderIcon.tsx │ │ │ │ │ ├── UploaderItem.tsx │ │ │ │ │ └── UploaderTrigger.tsx │ │ │ │ ├── hooks │ │ │ │ │ ├── .gitkeep │ │ │ │ │ └── use-mobile.ts │ │ │ │ ├── lib │ │ │ │ │ ├── file.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── styles │ │ │ │ │ └── globals.css │ │ │ │ ├── tsconfig.json │ │ │ │ └── tsconfig.lint.json │ │ ├── pnpm-workspace.yaml │ │ ├── tsconfig.json │ │ └── turbo.json │ └── extras │ │ └── apps │ │ ├── docs │ │ ├── .gitignore │ │ ├── app │ │ │ ├── (home) │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ ├── docs │ │ │ │ ├── [[...slug]] │ │ │ │ │ └── page.tsx │ │ │ │ ├── layout.tsx │ │ │ │ └── not-found.tsx │ │ │ ├── error.tsx │ │ │ ├── layout-preview │ │ │ │ └── dashboard │ │ │ │ │ └── [id] │ │ │ │ │ ├── DashboardLayout.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ └── not-found.tsx │ │ ├── components.json │ │ ├── content │ │ │ └── docs │ │ │ │ ├── guide │ │ │ │ ├── cli.mdx │ │ │ │ ├── data-fetching-api-client.mdx │ │ │ │ ├── data-fetching-enhance-ux.mdx │ │ │ │ ├── data-fetching-invalidation.mdx │ │ │ │ ├── data-fetching-overview.mdx │ │ │ │ ├── decisions-on-dx.mdx │ │ │ │ ├── form-basic.mdx │ │ │ │ ├── form-conditional-fields.mdx │ │ │ │ ├── form-dependant-validation.mdx │ │ │ │ ├── form-field-array.mdx │ │ │ │ ├── form-large.mdx │ │ │ │ ├── form-overview.mdx │ │ │ │ ├── form-submission-errors.mdx │ │ │ │ ├── form-validation.mdx │ │ │ │ ├── form-with-loading.mdx │ │ │ │ ├── installation.mdx │ │ │ │ ├── introduction.mdx │ │ │ │ ├── philosophy.mdx │ │ │ │ ├── react-code-convention.mdx │ │ │ │ ├── react-folder-structure.mdx │ │ │ │ └── tech-stack.mdx │ │ │ │ └── ui │ │ │ │ ├── accordion.mdx │ │ │ │ ├── avatar.mdx │ │ │ │ ├── button.mdx │ │ │ │ ├── calendar.mdx │ │ │ │ ├── checkbox.mdx │ │ │ │ ├── combobox.mdx │ │ │ │ ├── confirm-dialog.mdx │ │ │ │ ├── data-table.mdx │ │ │ │ ├── date-field.mdx │ │ │ │ ├── date-picker.mdx │ │ │ │ ├── date-range-picker.mdx │ │ │ │ ├── dialog.mdx │ │ │ │ ├── file-trigger.mdx │ │ │ │ ├── input.mdx │ │ │ │ ├── loading-overlay.mdx │ │ │ │ ├── menu.mdx │ │ │ │ ├── nprogress.mdx │ │ │ │ ├── number-field.mdx │ │ │ │ ├── pagination.mdx │ │ │ │ ├── popover.mdx │ │ │ │ ├── radio-group.mdx │ │ │ │ ├── range-calendar.mdx │ │ │ │ ├── select.mdx │ │ │ │ ├── separator.mdx │ │ │ │ ├── sheet.mdx │ │ │ │ ├── sidebar.mdx │ │ │ │ ├── skeleton.mdx │ │ │ │ ├── sonner.mdx │ │ │ │ ├── spinner.mdx │ │ │ │ ├── switch.mdx │ │ │ │ ├── table.mdx │ │ │ │ ├── textarea.mdx │ │ │ │ ├── time-field.mdx │ │ │ │ ├── tooltip.mdx │ │ │ │ ├── unused.mdx │ │ │ │ └── uploader.mdx │ │ ├── contentlayer.config.ts │ │ ├── eslint.config.js │ │ ├── features │ │ │ ├── docs │ │ │ │ └── components │ │ │ │ │ ├── Article.tsx │ │ │ │ │ └── TocPortal.tsx │ │ │ └── home │ │ │ │ └── components │ │ │ │ ├── FeatureSection.tsx │ │ │ │ ├── FooterSection.tsx │ │ │ │ ├── HeroSection.tsx │ │ │ │ └── HomePage.tsx │ │ ├── next.config.ts │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── public │ │ │ ├── hero-background.webp │ │ │ ├── images │ │ │ │ ├── folder-feature-based.avif │ │ │ │ ├── folder-features.avif │ │ │ │ ├── folder-import-flow.avif │ │ │ │ ├── folder-overview.avif │ │ │ │ ├── folder-routing.avif │ │ │ │ ├── folder-shared.avif │ │ │ │ └── og-image-2.jpg │ │ │ └── logo.png │ │ ├── shared │ │ │ ├── actions │ │ │ │ └── examples │ │ │ │ │ ├── payments.data.ts │ │ │ │ │ ├── payments.ts │ │ │ │ │ └── payments.type.ts │ │ │ ├── components │ │ │ │ ├── CopyToClipboard.tsx │ │ │ │ ├── Logo.tsx │ │ │ │ ├── ProjectFeatures.tsx │ │ │ │ ├── Providers.tsx │ │ │ │ ├── ThemeSwitcher.tsx │ │ │ │ ├── Toc.tsx │ │ │ │ ├── examples │ │ │ │ │ ├── AccordionDemo.tsx │ │ │ │ │ ├── AvatarDemo.tsx │ │ │ │ │ ├── AvatarSizes.tsx │ │ │ │ │ ├── ButtonAsALink.tsx │ │ │ │ │ ├── ButtonDemo.tsx │ │ │ │ │ ├── ButtonDestructive.tsx │ │ │ │ │ ├── ButtonGhost.tsx │ │ │ │ │ ├── ButtonIcon.tsx │ │ │ │ │ ├── ButtonLoading.tsx │ │ │ │ │ ├── ButtonOutline.tsx │ │ │ │ │ ├── ButtonWithIcon.tsx │ │ │ │ │ ├── CalendarControlled.tsx │ │ │ │ │ ├── CalendarDemo.tsx │ │ │ │ │ ├── CalendarMinMax.tsx │ │ │ │ │ ├── CalendarUnstyled.tsx │ │ │ │ │ ├── CheckboxDemo.tsx │ │ │ │ │ ├── CheckboxDisabled.tsx │ │ │ │ │ ├── CheckboxForm.tsx │ │ │ │ │ ├── CheckboxGroupDemo.tsx │ │ │ │ │ ├── CheckboxIndeterminate.tsx │ │ │ │ │ ├── ConfirmDialogDemo.tsx │ │ │ │ │ ├── ConfirmDialogDestructive.tsx │ │ │ │ │ ├── DataTableColumnAlignment.tsx │ │ │ │ │ ├── DataTableDemo.tsx │ │ │ │ │ ├── DataTableLoadingState.tsx │ │ │ │ │ ├── DataTableRealworld.tsx │ │ │ │ │ ├── DataTableRowSelection.tsx │ │ │ │ │ ├── DataTableSorting.tsx │ │ │ │ │ ├── DataTableSticky.tsx │ │ │ │ │ ├── DateFieldDemo.tsx │ │ │ │ │ ├── DateFieldDisabled.tsx │ │ │ │ │ ├── DateFieldForm.tsx │ │ │ │ │ ├── DateFieldWithLabel.tsx │ │ │ │ │ ├── DatePickerDemo.tsx │ │ │ │ │ ├── DatePickerDisabled.tsx │ │ │ │ │ ├── DatePickerForm.tsx │ │ │ │ │ ├── DatePickerWithLabel.tsx │ │ │ │ │ ├── DateRangePickerDemo.tsx │ │ │ │ │ ├── DateRangePickerDisabled.tsx │ │ │ │ │ ├── DateRangePickerForm.tsx │ │ │ │ │ ├── DateRangePickerWithLabel.tsx │ │ │ │ │ ├── DialogDemo.tsx │ │ │ │ │ ├── FileTriggerAvatar.tsx │ │ │ │ │ ├── FileTriggerDemo.tsx │ │ │ │ │ ├── InputDemo.tsx │ │ │ │ │ ├── InputDisabled.tsx │ │ │ │ │ ├── InputFile.tsx │ │ │ │ │ ├── InputForm.tsx │ │ │ │ │ ├── InputWithButton.tsx │ │ │ │ │ ├── InputWithLabel.tsx │ │ │ │ │ ├── LoadingOverlayDemo.tsx │ │ │ │ │ ├── MenuDemo.tsx │ │ │ │ │ ├── MenuWithIcon.tsx │ │ │ │ │ ├── MenuWithKeyboard.tsx │ │ │ │ │ ├── MenuWithSubmenu.tsx │ │ │ │ │ ├── NProgressDemo.tsx │ │ │ │ │ ├── NumberFieldCurrency.tsx │ │ │ │ │ ├── NumberFieldDemo.tsx │ │ │ │ │ ├── NumberFieldDisabled.tsx │ │ │ │ │ ├── NumberFieldForm.tsx │ │ │ │ │ ├── NumberFieldMinMax.tsx │ │ │ │ │ ├── NumberFieldPercentages.tsx │ │ │ │ │ ├── NumberFieldUnits.tsx │ │ │ │ │ ├── NumberFieldWithLabel.tsx │ │ │ │ │ ├── NumberFieldWithoutStepper.tsx │ │ │ │ │ ├── PaginationDemo.tsx │ │ │ │ │ ├── PaginationWithPageSelector.tsx │ │ │ │ │ ├── PaginationWithQueryParams.tsx │ │ │ │ │ ├── PopoverBottomRight.tsx │ │ │ │ │ ├── PopoverDemo.tsx │ │ │ │ │ ├── RadioGroupDemo.tsx │ │ │ │ │ ├── RadioGroupDisabled.tsx │ │ │ │ │ ├── RadioGroupForm.tsx │ │ │ │ │ ├── RadioGroupHorizontal.tsx │ │ │ │ │ ├── RangeCalendarControlled.tsx │ │ │ │ │ ├── RangeCalendarDefault.tsx │ │ │ │ │ ├── RangeCalendarDemo.tsx │ │ │ │ │ ├── RangeCalendarMinMax.tsx │ │ │ │ │ ├── RangeCalendarUnstyled.tsx │ │ │ │ │ ├── RecDependantValidation.tsx │ │ │ │ │ ├── RecFormBasic.tsx │ │ │ │ │ ├── RecFormConditionalFields.tsx │ │ │ │ │ ├── RecFormFieldArray.tsx │ │ │ │ │ ├── RecFormLargeForm.tsx │ │ │ │ │ ├── RecFormSubmissionErrors.tsx │ │ │ │ │ ├── RecFormValidation.tsx │ │ │ │ │ ├── RecFormWithLoading.tsx │ │ │ │ │ ├── SelectCustom.tsx │ │ │ │ │ ├── SelectDemo.tsx │ │ │ │ │ ├── SelectDisabled.tsx │ │ │ │ │ ├── SelectForm.tsx │ │ │ │ │ ├── SelectMultiple.tsx │ │ │ │ │ ├── SelectMultipleCustomization.tsx │ │ │ │ │ ├── SelectMultipleDisabled.tsx │ │ │ │ │ ├── SelectMultipleSearchable.tsx │ │ │ │ │ ├── SelectSearchable.tsx │ │ │ │ │ ├── SelectWithClearButton.tsx │ │ │ │ │ ├── SeparatorDemo.tsx │ │ │ │ │ ├── SheetDemo.tsx │ │ │ │ │ ├── SkeletonDemo.tsx │ │ │ │ │ ├── SkeletonScreen.tsx │ │ │ │ │ ├── SonnerDemo.tsx │ │ │ │ │ ├── SpinnerDemo.tsx │ │ │ │ │ ├── SwitchDemo.tsx │ │ │ │ │ ├── SwitchDisabled.tsx │ │ │ │ │ ├── SwitchForm.tsx │ │ │ │ │ ├── TableDemo.tsx │ │ │ │ │ ├── TextAreaDemo.tsx │ │ │ │ │ ├── TextAreaDisabled.tsx │ │ │ │ │ ├── TextAreaForm.tsx │ │ │ │ │ ├── TextAreaWithButton.tsx │ │ │ │ │ ├── TextAreaWithLabel.tsx │ │ │ │ │ ├── TimeFieldDemo.tsx │ │ │ │ │ ├── TimeFieldDisabled.tsx │ │ │ │ │ ├── TimeFieldForm.tsx │ │ │ │ │ ├── TimeFieldGranularity.tsx │ │ │ │ │ ├── TimeFieldWithLabel.tsx │ │ │ │ │ ├── TooltipBasic.tsx │ │ │ │ │ ├── TooltipCustom.tsx │ │ │ │ │ ├── TooltipDemo.tsx │ │ │ │ │ ├── UploaderCustom.tsx │ │ │ │ │ ├── UploaderDemo.tsx │ │ │ │ │ ├── UploaderDemo.utils.ts │ │ │ │ │ ├── UploaderDisabled.tsx │ │ │ │ │ ├── UploaderForm.tsx │ │ │ │ │ ├── UploaderRetry.tsx │ │ │ │ │ ├── UploaderValidation.tsx │ │ │ │ │ ├── UploaderVariantListType.tsx │ │ │ │ │ └── UploaderVariantTriggerType.tsx │ │ │ │ ├── icons │ │ │ │ │ ├── GithubIcon.tsx │ │ │ │ │ ├── NextJsIcon.tsx │ │ │ │ │ ├── ReactAriaIcon.tsx │ │ │ │ │ ├── ReactIcon.tsx │ │ │ │ │ ├── ReactQueryIcon.tsx │ │ │ │ │ ├── ShadcnIcon.tsx │ │ │ │ │ └── ViteIcon.tsx │ │ │ │ └── mdx-helpers │ │ │ │ │ ├── CodeCollapsible.tsx │ │ │ │ │ ├── ComponentPreview.tsx │ │ │ │ │ ├── Mdx.tsx │ │ │ │ │ ├── MdxImage.tsx │ │ │ │ │ ├── MdxSnippet.tsx │ │ │ │ │ └── MdxTip.tsx │ │ │ ├── consts │ │ │ │ └── common.ts │ │ │ ├── hooks │ │ │ │ └── useMounted.tsx │ │ │ ├── layouts │ │ │ │ ├── DocsLayout │ │ │ │ │ ├── DocContent.tsx │ │ │ │ │ ├── HamburgerMenu.tsx │ │ │ │ │ ├── Icons.tsx │ │ │ │ │ ├── ModulePicker.tsx │ │ │ │ │ ├── SidebarHeader.tsx │ │ │ │ │ ├── SidebarMenu.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── DocsSearch.tsx │ │ │ │ ├── HeaderIconButtons.tsx │ │ │ │ ├── LandingPageLayout │ │ │ │ │ └── index.tsx │ │ │ │ └── TopNavLinks.tsx │ │ │ └── lib │ │ │ │ ├── composition.ts │ │ │ │ ├── highlight-code.ts │ │ │ │ └── toc.ts │ │ └── tsconfig.json │ │ ├── next │ │ ├── components.json │ │ ├── eslint.config.js │ │ ├── next-env.d.ts │ │ ├── next.config.mjs │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ │ ├── app │ │ │ │ ├── favicon.ico │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ └── shared │ │ │ │ ├── components │ │ │ │ ├── Providers.tsx │ │ │ │ └── ThemeSwitcher.tsx │ │ │ │ ├── hooks │ │ │ │ └── useMounted.tsx │ │ │ │ ├── layouts │ │ │ │ └── DashboardLayout.tsx │ │ │ │ └── lib │ │ │ │ └── api.ts │ │ └── tsconfig.json │ │ └── tanstack-router │ │ ├── .gitignore │ │ ├── .vscode │ │ └── settings.json │ │ ├── README.md │ │ ├── eslint.config.js │ │ ├── index.html │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ ├── main.tsx │ │ ├── routeTree.gen.ts │ │ ├── routes │ │ │ ├── __root.tsx │ │ │ └── index.tsx │ │ └── shared │ │ │ ├── components │ │ │ ├── Providers.tsx │ │ │ ├── ThemeProvider.tsx │ │ │ └── ThemeSwitcher.tsx │ │ │ ├── layouts │ │ │ └── DashboardLayout.tsx │ │ │ └── lib │ │ │ └── api.ts │ │ ├── tsconfig.json │ │ └── vite.config.js │ ├── tsconfig.json │ ├── tsup.config.ts │ └── utils │ └── error-handling.ts ├── tsconfig.json └── turbo.json /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # Dependencies 4 | node_modules 5 | .pnp 6 | .pnp.js 7 | 8 | # Local env files 9 | .env 10 | .env.local 11 | .env.development.local 12 | .env.test.local 13 | .env.production.local 14 | 15 | # Testing 16 | coverage 17 | 18 | # Turbo 19 | .turbo 20 | 21 | # Vercel 22 | .vercel 23 | 24 | # Build Outputs 25 | .next/ 26 | out/ 27 | build 28 | dist 29 | 30 | 31 | # Debug 32 | npm-debug.log* 33 | 34 | # Misc 35 | .DS_Store 36 | *.pem 37 | 38 | # contentlayer 39 | .contentlayer 40 | 41 | # next.js 42 | next-env.d.ts 43 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | routeTree.gen.ts -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "trailingComma": "all", 5 | "printWidth": 120, 6 | "tabWidth": 4, 7 | "useTabs": false, 8 | "bracketSpacing": true, 9 | "bracketSameLine": false, 10 | "jsxBracketSameLine": false, 11 | "jsxSingleQuote": false, 12 | "arrowParens": "avoid" 13 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "tailwindCSS.experimental.configFile": "packages/ui/src/styles/globals.css" 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Base Stack 2 | This is a **React starter kit** that provides an opinionated, production-ready foundation for building modern web applications. It's designed to give you everything you need to start building immediately, with carefully chosen tools and patterns that work together seamlessly. 3 | 4 | ![Project Preview](https://github.com/henry-phm/base-stack/blob/main/images/project-preview-1.png) 5 | 6 | ## Documentation 7 | https://base-stack.dev 8 | -------------------------------------------------------------------------------- /apps/docs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # env files (can opt-in for commiting if needed) 33 | .env* 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | 42 | # contentlayer 43 | .contentlayer 44 | 45 | # uploaded files (temporary storage) 46 | /public/uploads -------------------------------------------------------------------------------- /apps/docs/app/(home)/layout.tsx: -------------------------------------------------------------------------------- 1 | import { LandingPageLayout } from '@/shared/layouts/LandingPageLayout' 2 | 3 | export default function Layout({ children }: { children: React.ReactNode }) { 4 | return {children} 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/app/(home)/page.tsx: -------------------------------------------------------------------------------- 1 | import { HomePage } from '@/features/home/components/HomePage' 2 | 3 | export default function Home() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/app/docs/layout.tsx: -------------------------------------------------------------------------------- 1 | import { DocsLayout } from '@/shared/layouts/DocsLayout' 2 | 3 | export default function Layout({ children }: { children: React.ReactNode }) { 4 | return }>{children} 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/app/docs/not-found.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import Link from 'next/link' 3 | 4 | export default function NotFound() { 5 | return ( 6 |
7 |

Not Found

8 |

Could not find document

9 | 12 |
13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /apps/docs/app/error.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React from 'react' 4 | 5 | export default function Error({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) { 6 | React.useEffect(() => { 7 | console.error(error) 8 | }, [error]) 9 | 10 | return ( 11 |
12 |

Something went wrong!

13 | 14 |
15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /apps/docs/app/layout-preview/dashboard/[id]/layout.tsx: -------------------------------------------------------------------------------- 1 | import { DashboardLayout } from './DashboardLayout' 2 | import { cookies } from 'next/headers' 3 | 4 | interface LayoutProps { 5 | children: React.ReactNode 6 | } 7 | 8 | export default async function Layout({ children }: LayoutProps) { 9 | const cookieStore = await cookies() 10 | const defaultOpen = cookieStore.get('sidebar_state')?.value !== 'false' 11 | 12 | return {children} 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/app/not-found.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import Link from 'next/link' 3 | 4 | export default function NotFound() { 5 | return ( 6 |
7 |

Not Found

8 |

Could not find requested resource

9 | 12 |
13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /apps/docs/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "", 8 | "css": "../../packages/ui/src/styles/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true 11 | }, 12 | "iconLibrary": "lucide", 13 | "aliases": { 14 | "components": "@/components", 15 | "hooks": "@/hooks", 16 | "lib": "@/lib", 17 | "utils": "@workspace/ui/lib/utils", 18 | "ui": "@workspace/ui/components" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-basic.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Basic Form 3 | description: Learn how to create and use a basic form, including setup, input fields, and form submission handling. 4 | --- 5 | 6 | ## Usage 7 | 8 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-conditional-fields.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Conditional Fields 3 | description: Show and validate fields based on other field values. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-dependant-validation.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Dependent Validation 3 | description: Validate a field based on the value of another field. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-field-array.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Field Array 3 | description: Dynamically add and remove groups of fields with validation. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-large.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Large Form 3 | description: Build a multi-section form with arrays, selectors and toggles. 4 | --- 5 | 6 | ## Usage 7 | For large forms, you can split the form into multiple sub-sections. Within each section, use `useFormContext` to access the parent form. 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-submission-errors.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Submission Errors 3 | description: Handle server-side submission errors and map them to fields. 4 | --- 5 | 6 | ## Usage 7 | Submission errors generally fall into two categories: field-specific errors and general form errors. Here’s a common approach to display both types: 8 | - For field-specific errors, use `setSubmitErrors`. 9 | - For general form errors, simply display a toast message. 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-validation.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Validation Form 3 | description: Add client-side validation rules to inputs using our helpers. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/docs/content/docs/guide/form-with-loading.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Form with Loading 3 | description: Learn how to build a form with a loading overlay, handling form state and UX during async operations. 4 | --- 5 | 6 | ## Usage 7 | Simply wrap your form fields with the `LoadingOverlay` component and set `isLoading = true` when submitting data. 8 | 9 | If you're using a mutation from React Query, pass the `isPending` state to `isLoading`. 10 | 11 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/accordion.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Accordion 3 | description: A vertically stacked set of interactive headings that each reveal a section of content. 4 | originalDocs: https://www.radix-ui.com/primitives/docs/components/accordion 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Accordion.tsx 6 | --- 7 | 8 | ## Usage 9 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/avatar.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Avatar 3 | description: An image element with a fallback to represent the user, and displays a profile picture, initials, or an icon. 4 | originalDocs: https://www.radix-ui.com/primitives/docs/components/avatar 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Avatar.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Different Sizes 14 | 15 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/calendar.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Calendar 3 | description: A calendar displays a grid of days in one or more months and allows users to select a single date. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Calendar.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Calendar.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | 12 | ## Examples 13 | 14 | ### Default 15 | 16 | 17 | 18 | ### Controlled 19 | 20 | 21 | 22 | ### Unstyled 23 | 24 | 25 | 26 | ### With Min/Max Date 27 | 28 | 29 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/checkbox.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Checkbox 3 | description: A control that allows the user to toggle between checked and not checked states. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Checkbox.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Checkbox.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Default 14 | 15 | 16 | ### Disabled 17 | 18 | 19 | ### Indeterminate 20 | 21 | 22 | ### Group 23 | 24 | 25 | ### In Form 26 | 27 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/combobox.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: ComboBox 3 | description: A combobox combines a text input with a listbox, allowing users to filter a list of options to find the one they want. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/ComboBox.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/ComboBox.tsx 6 | --- 7 | 8 | ## Usage 9 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/confirm-dialog.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Confirm Dialog 3 | description: A confirm dialog is a modal window that asks users to confirm or cancel a critical action. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Dialog.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/ConfirmDialog.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Basic 14 | 15 | 16 | ### Destructive 17 | 18 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/dialog.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Dialog 3 | description: A dialog is a window overlaid on either the primary window or another dialog window. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Dialog.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Dialog.tsx 6 | --- 7 | 8 | ## Usage 9 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/file-trigger.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: FileTrigger 3 | description: A FileTrigger allows a user to access the file system with any pressable React Aria or React Spectrum component, or custom components built with usePress. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/FileTrigger.html 5 | --- 6 | 7 | ## Demo 8 | 9 | 10 | ## Examples 11 | 12 | ### Avatar 13 | We recommend validating files by their extensions, as MIME types may be inconsistent across platforms. 14 | 15 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/loading-overlay.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Loading Overlay 3 | description: A simple overlay spinner to indicate loading states and prevent user interaction. 4 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/LoadingOverlay.tsx 5 | --- 6 | 7 | ## Usage 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/menu.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Menu 3 | description: A menu displays a list of actions or options in a popover. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Menu.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Menu.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | 12 | ## Examples 13 | 14 | ### With Icon 15 | 16 | 17 | ### With Submenu 18 | 19 | 20 | ### With Keyboard Shortcuts 21 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/nprogress.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: NProgress 3 | description: Slim progress bars for Ajax'y applications. Inspired by Google, YouTube, and Medium. 4 | originalDocs: https://github.com/rstacruz/nprogress 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/NProgress.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/pagination.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Pagination 3 | description: A ReactJS component to render a pagination. 4 | originalDocs: https://www.npmjs.com/package/react-paginate 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Pagination.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | 12 | ## Examples 13 | 14 | ### Using query parameters 15 | 16 | 17 | 18 | ### With page selector 19 | 20 | 21 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/popover.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Popover 3 | description: A popover is an overlay element positioned relative to a trigger. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Popover.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Popover.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Bottom Left 14 | 15 | 16 | ### Bottom Right 17 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/radio-group.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Radio Group 3 | description: A set of checkable buttons, known as radio buttons, where no more than one of the buttons can be checked at a time. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/RadioGroup.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/RadioGroup.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Default 14 | 15 | 16 | ### Horizontal 17 | 18 | 19 | ### Disabled 20 | 21 | 22 | ### In Form 23 | 24 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/range-calendar.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: RangeCalendar 3 | description: A range calendar displays a grid of days in one or more months and allows users to select a contiguous range of dates. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/RangeCalendar.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Calendar.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Default 14 | 15 | 16 | 17 | ### Controlled 18 | 19 | 20 | 21 | ### Unstyled 22 | 23 | 24 | 25 | ### With Min/Max Date 26 | 27 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/separator.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Separator 3 | description: Visually or semantically separates content. 4 | originalDocs: https://www.radix-ui.com/primitives/docs/components/separator 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Separator.tsx 6 | --- 7 | 8 | ## Demo 9 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/sheet.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sheet 3 | description: Extends the Dialog component to display content that complements the main content of the screen. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Dialog.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Sheet.tsx 6 | --- 7 | 8 | ## Usage 9 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/skeleton.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Skeleton 3 | description: Use to show a placeholder while content is loading. 4 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Skeleton.tsx 5 | --- 6 | 7 | ## Demo 8 | 9 | 10 | ## Examples 11 | 12 | ### Skeleton screen 13 | Below is an example of a general-purpose skeleton used to represent a full screen layout while loading. 14 | Although this version works for many use cases, consider creating page-specific skeletons for a more accurate loading experience. 15 | 16 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/sonner.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sonner 3 | description: An opinionated toast component for React. 4 | originalDocs: https://sonner.emilkowal.ski 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Sonner.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/spinner.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spinner 3 | description: An indicator that can be used to show a loading state. 4 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Spinner.tsx 5 | --- 6 | 7 | ## Usage 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/switch.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Switch 3 | description: A control that allows the user to toggle between checked and not checked. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Switch.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Switch.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Default 14 | 15 | 16 | ### Disabled 17 | 18 | 19 | ### In Form 20 | 21 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/table.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Table 3 | description: A responsive table component. 4 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Table.tsx 5 | --- 6 | 7 | ## Usage 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/tooltip.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tooltip 3 | description: A tooltip provides a short description of an element on hover or focus. 4 | originalDocs: https://react-spectrum.adobe.com/react-aria/Tooltip.html 5 | sourceCode: https://github.com/henry-phm/base-stack/blob/main/packages/ui/src/components/Tooltip.tsx 6 | --- 7 | 8 | ## Usage 9 | 10 | 11 | ## Examples 12 | 13 | ### Basic Tooltip 14 | 15 | 16 | ### Tooltip with Custom Content 17 | 18 | -------------------------------------------------------------------------------- /apps/docs/content/docs/ui/unused.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: This is just a file to trigger deployment 3 | description: v5 4 | --- -------------------------------------------------------------------------------- /apps/docs/eslint.config.js: -------------------------------------------------------------------------------- 1 | import { nextJsConfig } from "@workspace/eslint-config/next-js" 2 | 3 | /** @type {import("eslint").Linter.Config} */ 4 | export default nextJsConfig 5 | -------------------------------------------------------------------------------- /apps/docs/features/docs/components/TocPortal.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import { useMounted } from '@/shared/hooks/useMounted' 3 | import * as Portal from '@radix-ui/react-portal' 4 | 5 | export function TocPortal({ children }: { children: React.ReactNode }) { 6 | const mounted = useMounted() 7 | 8 | if (!mounted) return null 9 | 10 | return {children} 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/features/home/components/HomePage.tsx: -------------------------------------------------------------------------------- 1 | import { HeroSection } from '@/features/home/components/HeroSection' 2 | import { Separator } from '@workspace/ui/components/Separator' 3 | import { FooterSection } from '@/features/home/components/FooterSection' 4 | import { FeatureSection } from '@/features/home/components/FeatureSection' 5 | 6 | export function HomePage() { 7 | return ( 8 | <> 9 | 10 | 11 | 12 | 13 | 14 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /apps/docs/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from 'next' 2 | import { withContentlayer } from 'next-contentlayer2' 3 | 4 | const nextConfig: NextConfig = withContentlayer({ 5 | images: { 6 | domains: ['images.unsplash.com'], 7 | }, 8 | async redirects() { 9 | return [ 10 | { 11 | source: '/docs/guide', 12 | destination: '/docs/guide/introduction', 13 | permanent: false, 14 | }, 15 | { 16 | source: '/docs/ui', 17 | destination: '/docs/ui/sidebar', 18 | permanent: false, 19 | }, 20 | ] 21 | }, 22 | }) 23 | 24 | export default nextConfig 25 | -------------------------------------------------------------------------------- /apps/docs/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from "@workspace/ui/postcss.config"; -------------------------------------------------------------------------------- /apps/docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/favicon.ico -------------------------------------------------------------------------------- /apps/docs/public/hero-background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/hero-background.webp -------------------------------------------------------------------------------- /apps/docs/public/images/folder-feature-based.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/images/folder-feature-based.avif -------------------------------------------------------------------------------- /apps/docs/public/images/folder-features.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/images/folder-features.avif -------------------------------------------------------------------------------- /apps/docs/public/images/folder-import-flow.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/images/folder-import-flow.avif -------------------------------------------------------------------------------- /apps/docs/public/images/folder-overview.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/images/folder-overview.avif -------------------------------------------------------------------------------- /apps/docs/public/images/folder-routing.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/images/folder-routing.avif -------------------------------------------------------------------------------- /apps/docs/public/images/folder-shared.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/images/folder-shared.avif -------------------------------------------------------------------------------- /apps/docs/public/images/og-image-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/images/og-image-2.jpg -------------------------------------------------------------------------------- /apps/docs/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henry-phm/base-stack/260b64035a0ebfbb440e238e5b66b5ee7d9feeed/apps/docs/public/logo.png -------------------------------------------------------------------------------- /apps/docs/shared/actions/examples/payments.type.ts: -------------------------------------------------------------------------------- 1 | export interface Payment { 2 | id: string 3 | amount: string 4 | status: 'pending' | 'processing' | 'success' | 'failed' 5 | email: string 6 | paymentMethod: 'credit_card' | 'debit_card' | 'paypal' | 'bank_transfer' 7 | transactionDate: string 8 | paymentReference: string 9 | } 10 | -------------------------------------------------------------------------------- /apps/docs/shared/components/Logo.tsx: -------------------------------------------------------------------------------- 1 | import { PROJECT_NAME } from '@/shared/consts/common' 2 | import { cn } from '@workspace/ui/lib/utils' 3 | import Link from 'next/link' 4 | 5 | interface LogoProps { 6 | className?: string 7 | textClassName?: string 8 | withName?: boolean 9 | } 10 | 11 | export function Logo({ className, textClassName, withName = true }: LogoProps) { 12 | return ( 13 | 14 | Logo 15 | {withName && ( 16 | {PROJECT_NAME} 17 | )} 18 | 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /apps/docs/shared/components/ThemeSwitcher.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useMounted } from '@/shared/hooks/useMounted' 4 | import { Button } from '@workspace/ui/components/Button' 5 | import { MoonStar, SunIcon } from 'lucide-react' 6 | import { useTheme } from 'next-themes' 7 | 8 | enum Theme { 9 | LIGHT = 'light', 10 | DARK = 'dark', 11 | } 12 | 13 | export function ThemeSwitcher() { 14 | const { theme, setTheme } = useTheme() 15 | const mounted = useMounted() 16 | 17 | return ( 18 | 26 | ) 27 | } 28 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/AvatarDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Avatar, AvatarFallback, AvatarImage } from '@workspace/ui/components/Avatar' 2 | 3 | export function AvatarDemo() { 4 | return ( 5 | 6 | 7 | HP 8 | 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonAsALink.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import { SquareArrowOutUpRight } from 'lucide-react' 3 | import Link from 'next/link' 4 | 5 | export function ButtonAsALink() { 6 | return ( 7 | 13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | 3 | export function ButtonDemo() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonDestructive.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | 3 | export function ButtonDestructive() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonGhost.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | 3 | export function ButtonGhost() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonIcon.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import { Trash } from 'lucide-react' 3 | 4 | export function ButtonIcon() { 5 | return ( 6 | 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonLoading.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import { Spinner } from '@workspace/ui/components/Spinner' 3 | 4 | export function ButtonLoading() { 5 | return ( 6 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonOutline.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | 3 | export function ButtonOutline() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/ButtonWithIcon.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import { Plus } from 'lucide-react' 3 | 4 | export function ButtonWithIcon() { 5 | return ( 6 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/CalendarControlled.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsCalendar } from '@workspace/ui/components/Calendar' 4 | import { useState } from 'react' 5 | 6 | export function CalendarControlled() { 7 | const [value, setValue] = useState() 8 | 9 | return ( 10 |
11 | 12 |
13 |                 {value ? JSON.stringify(value) : 'No value'}
14 |             
15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/CalendarDemo.tsx: -------------------------------------------------------------------------------- 1 | import { BsCalendar } from '@workspace/ui/components/Calendar' 2 | 3 | export function CalendarDemo() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/CalendarMinMax.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsCalendar } from '@workspace/ui/components/Calendar' 4 | import dayjs from 'dayjs' 5 | 6 | export function CalendarMinMax() { 7 | return ( 8 | 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/CalendarUnstyled.tsx: -------------------------------------------------------------------------------- 1 | import { BsCalendar } from '@workspace/ui/components/Calendar' 2 | 3 | export function CalendarUnstyled() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/CheckboxDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Checkbox } from '@workspace/ui/components/Checkbox' 2 | 3 | export function CheckboxDemo() { 4 | return Accept terms and conditions 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/CheckboxDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { Checkbox } from '@workspace/ui/components/Checkbox' 2 | 3 | export function CheckboxDisabled() { 4 | return Accept terms and conditions 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/CheckboxGroupDemo.tsx: -------------------------------------------------------------------------------- 1 | import { CheckboxGroup, Checkbox } from '@workspace/ui/components/Checkbox' 2 | import { Label } from '@workspace/ui/components/Field' 3 | 4 | export function CheckboxGroupDemo() { 5 | return ( 6 | 7 | 8 |
9 | Apple 10 | Banana 11 | Orange 12 |
13 |
14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DateFieldDemo.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsDateField } from '@workspace/ui/components/Datefield' 4 | 5 | export function DateFieldDemo() { 6 | return 7 | } 8 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DateFieldDisabled.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsDateField } from '@workspace/ui/components/Datefield' 4 | 5 | export function DateFieldDisabled() { 6 | return 7 | } 8 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DateFieldWithLabel.tsx: -------------------------------------------------------------------------------- 1 | import { BsDateField } from '@workspace/ui/components/Datefield' 2 | import { Label } from '@workspace/ui/components/Field' 3 | 4 | export function DateFieldWithLabel() { 5 | return ( 6 |
7 | 8 | 9 |
10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DatePickerDemo.tsx: -------------------------------------------------------------------------------- 1 | import { BsDatePicker } from '@workspace/ui/components/DatePicker' 2 | 3 | export function DatePickerDemo() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DatePickerDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { BsDatePicker } from '@workspace/ui/components/DatePicker' 2 | 3 | export function DatePickerDisabled() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DatePickerWithLabel.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsDatePicker } from '@workspace/ui/components/DatePicker' 4 | import { Label } from '@workspace/ui/components/Field' 5 | 6 | export function DatePickerWithLabel() { 7 | return ( 8 |
9 | 10 | 11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DateRangePickerDemo.tsx: -------------------------------------------------------------------------------- 1 | import { BsDateRangePicker } from '@workspace/ui/components/DatePicker' 2 | 3 | export function DateRangePickerDemo() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DateRangePickerDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { BsDateRangePicker } from '@workspace/ui/components/DatePicker' 2 | 3 | export function DateRangePickerDisabled() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/DateRangePickerWithLabel.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsDateRangePicker } from '@workspace/ui/components/DatePicker' 4 | import { Label } from '@workspace/ui/components/Field' 5 | 6 | export function DateRangePickerWithLabel() { 7 | return ( 8 |
9 | 10 | 11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/InputDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Input } from '@workspace/ui/components/Textfield' 2 | 3 | export function InputDemo() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/InputDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { Input } from '@workspace/ui/components/Textfield' 2 | 3 | export function InputDisabled() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/InputFile.tsx: -------------------------------------------------------------------------------- 1 | import { Input } from '@workspace/ui/components/Textfield' 2 | 3 | export function InputFile() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/InputWithButton.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import { Input } from '@workspace/ui/components/Textfield' 3 | 4 | export function InputWithButton() { 5 | return ( 6 |
7 | 8 | 9 |
10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/InputWithLabel.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Input } from '@workspace/ui/components/Textfield' 4 | import { Label } from '@workspace/ui/components/Field' 5 | 6 | export function InputWithLabel() { 7 | return ( 8 |
9 | 10 | 11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/MenuDemo.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Button } from '@workspace/ui/components/Button' 4 | import { Menu, MenuItem, MenuPopover, MenuTrigger } from '@workspace/ui/components/Menu' 5 | import { MenuIcon } from 'lucide-react' 6 | 7 | export function MenuDemo() { 8 | return ( 9 | 10 | 13 | 14 | 15 | Open 16 | Rename 17 | Duplicate 18 | 19 | 20 | 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/MenuWithKeyboard.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@workspace/ui/components/Button' 2 | import { MenuTrigger, MenuItem, MenuKeyboard, MenuPopover, Menu } from '@workspace/ui/components/Menu' 3 | 4 | export function MenuWithKeyboard() { 5 | return ( 6 | 7 | 8 | 9 | 10 | 11 | New Tab ⌘T 12 | 13 | 14 | Close Tab ⌘W 15 | 16 | 17 | 18 | 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldCurrency.tsx: -------------------------------------------------------------------------------- 1 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 2 | 3 | export function NumberFieldCurrency() { 4 | return ( 5 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldDemo.tsx: -------------------------------------------------------------------------------- 1 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 2 | 3 | export function NumberFieldDemo() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 2 | 3 | export function NumberFieldDisabled() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldMinMax.tsx: -------------------------------------------------------------------------------- 1 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 2 | 3 | export function NumberFieldMinMax() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldPercentages.tsx: -------------------------------------------------------------------------------- 1 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 2 | 3 | export function NumberFieldPercentages() { 4 | return ( 5 | 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldUnits.tsx: -------------------------------------------------------------------------------- 1 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 2 | 3 | export function NumberFieldUnits() { 4 | return ( 5 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldWithLabel.tsx: -------------------------------------------------------------------------------- 1 | import { Label } from '@workspace/ui/components/Field' 2 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 3 | 4 | export function NumberFieldWithLabel() { 5 | return ( 6 |
7 | 8 | 9 |
10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/NumberFieldWithoutStepper.tsx: -------------------------------------------------------------------------------- 1 | import { BsNumberField } from '@workspace/ui/components/Numberfield' 2 | 3 | export function NumberFieldWithoutStepper() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/PaginationDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Pagination } from '@workspace/ui/components/Pagination' 2 | 3 | export function PaginationDemo() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/PaginationWithPageSelector.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Pagination, PaginationPageSizeSelector } from '@workspace/ui/components/Pagination' 4 | 5 | export function PaginationWithPageSelector() { 6 | return ( 7 |
8 | 9 | 10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RadioGroupDemo.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Label } from '@workspace/ui/components/Field' 4 | import { RadioGroup, Radio } from '@workspace/ui/components/RadioGroup' 5 | 6 | export function RadioGroupDemo() { 7 | return ( 8 | 9 | 10 | Red 11 | Green 12 | Blue 13 | 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RadioGroupDisabled.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Label } from '@workspace/ui/components/Field' 4 | import { RadioGroup, Radio } from '@workspace/ui/components/RadioGroup' 5 | 6 | export function RadioGroupDisabled() { 7 | return ( 8 | 9 | 10 | Red 11 | Blue 12 | Green 13 | Yellow 14 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RadioGroupHorizontal.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Label } from '@workspace/ui/components/Field' 4 | import { RadioGroup, Radio } from '@workspace/ui/components/RadioGroup' 5 | 6 | export function RadioGroupHorizontal() { 7 | return ( 8 | 9 | 10 | xs 11 | sm 12 | md 13 | lg 14 | xl 15 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RangeCalendarControlled.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsRangeCalendar, BsRangeCalendarValue } from '@workspace/ui/components/Calendar' 4 | import { useState } from 'react' 5 | 6 | export function RangeCalendarControlled() { 7 | const [value, setValue] = useState() 8 | 9 | return ( 10 |
11 | 12 |
13 |                 {value ? JSON.stringify(value, null, 2) : 'No value'}
14 |             
15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RangeCalendarDefault.tsx: -------------------------------------------------------------------------------- 1 | import { BsRangeCalendar } from '@workspace/ui/components/Calendar' 2 | 3 | export function RangeCalendarDefault() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RangeCalendarDemo.tsx: -------------------------------------------------------------------------------- 1 | import { BsRangeCalendar } from '@workspace/ui/components/Calendar' 2 | import dayjs from 'dayjs' 3 | 4 | export function RangeCalendarDemo() { 5 | return ( 6 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RangeCalendarMinMax.tsx: -------------------------------------------------------------------------------- 1 | import { BsRangeCalendar } from '@workspace/ui/components/Calendar' 2 | import dayjs from 'dayjs' 3 | 4 | export function RangeCalendarMinMax() { 5 | return ( 6 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/RangeCalendarUnstyled.tsx: -------------------------------------------------------------------------------- 1 | import { BsRangeCalendar } from '@workspace/ui/components/Calendar' 2 | 3 | export function RangeCalendarUnstyled() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SelectDemo.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsSelect } from '@workspace/ui/components/Select' 4 | import React from 'react' 5 | 6 | const languages = [ 7 | { id: 1, name: 'English' }, 8 | { id: 2, name: 'Spanish' }, 9 | { id: 3, name: 'French' }, 10 | { id: 4, name: 'German' }, 11 | { id: 5, name: 'Italian' }, 12 | ] 13 | 14 | export function SelectDemo() { 15 | return ( 16 |
17 | 18 |
19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SelectDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { BsSelect } from '@workspace/ui/components/Select' 2 | 3 | export function SelectDisabled() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SelectMultiple.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsSelect } from '@workspace/ui/components/Select' 4 | 5 | const languages = [ 6 | { id: 1, name: 'English' }, 7 | { id: 2, name: 'Spanish' }, 8 | { id: 3, name: 'French' }, 9 | { id: 4, name: 'German' }, 10 | { id: 5, name: 'Italian' }, 11 | ] 12 | 13 | export function SelectMultiple() { 14 | return 15 | } 16 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SelectMultipleDisabled.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { BsSelect } from '@workspace/ui/components/Select' 4 | 5 | const languages = [ 6 | { id: 1, name: 'English' }, 7 | { id: 2, name: 'Spanish' }, 8 | { id: 3, name: 'French' }, 9 | { id: 4, name: 'German' }, 10 | { id: 5, name: 'Italian' }, 11 | ] 12 | 13 | export function SelectMultipleDisabled() { 14 | return 15 | } 16 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SelectMultipleSearchable.tsx: -------------------------------------------------------------------------------- 1 | import { BsSelect } from '@workspace/ui/components/Select' 2 | 3 | const languages = [ 4 | { id: 1, name: 'English' }, 5 | { id: 2, name: 'Spanish' }, 6 | { id: 3, name: 'French' }, 7 | { id: 4, name: 'German' }, 8 | { id: 5, name: 'Italian' }, 9 | ] 10 | 11 | export function SelectMultipleSearchable() { 12 | return 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SelectSearchable.tsx: -------------------------------------------------------------------------------- 1 | import { BsSelect } from '@workspace/ui/components/Select' 2 | 3 | const languages = [ 4 | { id: 1, name: 'English' }, 5 | { id: 2, name: 'Spanish' }, 6 | { id: 3, name: 'French' }, 7 | { id: 4, name: 'German' }, 8 | { id: 5, name: 'Italian' }, 9 | ] 10 | 11 | export function SelectSearchable() { 12 | return 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SelectWithClearButton.tsx: -------------------------------------------------------------------------------- 1 | import { BsSelect } from '@workspace/ui/components/Select' 2 | import React from 'react' 3 | 4 | const languages = [ 5 | { id: 1, name: 'English' }, 6 | { id: 2, name: 'Spanish' }, 7 | { id: 3, name: 'French' }, 8 | { id: 4, name: 'German' }, 9 | { id: 5, name: 'Italian' }, 10 | ] 11 | 12 | export function SelectWithClearButton() { 13 | return ( 14 |
15 | 16 |
17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SkeletonDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Skeleton } from '@workspace/ui/components/Skeleton' 2 | 3 | export function SkeletonDemo() { 4 | return ( 5 |
6 | 7 |
8 | 9 | 10 |
11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SpinnerDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Spinner } from '@workspace/ui/components/Spinner' 2 | 3 | export function SpinnerDemo() { 4 | return ( 5 |
6 | 7 | 8 | 9 | 10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SwitchDemo.tsx: -------------------------------------------------------------------------------- 1 | import { Switch } from '@workspace/ui/components/Switch' 2 | 3 | export function SwitchDemo() { 4 | return Airplane mode 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/SwitchDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { Switch } from '@workspace/ui/components/Switch' 2 | 3 | export function SwitchDisabled() { 4 | return Airplane mode 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/shared/components/examples/TextAreaDemo.tsx: -------------------------------------------------------------------------------- 1 | import { TextArea } from '@workspace/ui/components/Textfield' 2 | 3 | export function TextAreaDemo() { 4 | return