uabc-web/ ├── .github/ │ ├── composite-actions/ │ │ └── vitest-coverage/ │ │ └── action.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── backend-feature-template.md │ │ ├── bug_report.md │ │ ├── design-template.md │ │ ├── devops-feature-template.md │ │ └── frontend-feature-template.md │ ├── workflows/ │ │ ├── cd-pipeline.yml │ │ ├── ci-pipeline.yml │ │ ├── deploy-github-pages.yml │ │ ├── notification.yml │ │ └── renovate.yml │ └── pull_request_template.md ├── .husky/ │ ├── commit-msg │ └── pre-commit ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ └── settings.json ├── apps/ │ ├── backend/ │ │ ├── media/ │ │ │ └── Logo.png │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── api/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ └── semesters/ │ │ │ │ │ │ └── [id]/ │ │ │ │ │ │ ├── route.test.ts │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── auth/ │ │ │ │ │ │ └── google/ │ │ │ │ │ │ ├── callback/ │ │ │ │ │ │ │ ├── route.test.ts │ │ │ │ │ │ │ └── route.ts │ │ │ │ │ │ ├── route.test.ts │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── globals/ │ │ │ │ │ │ ├── faq/ │ │ │ │ │ │ │ ├── route.test.ts │ │ │ │ │ │ │ └── route.ts │ │ │ │ │ │ ├── footer/ │ │ │ │ │ │ │ ├── route.test.ts │ │ │ │ │ │ │ └── route.ts │ │ │ │ │ │ └── navbar/ │ │ │ │ │ │ ├── route.test.ts │ │ │ │ │ │ └── route.ts │ │ │ │ │ └── semesters/ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ ├── route.test.ts │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── route.test.ts │ │ │ │ │ └── route.ts │ │ │ │ └── payload/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── [[...segments]]/ │ │ │ │ │ │ ├── not-found.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── importMap.js │ │ │ │ ├── api/ │ │ │ │ │ └── [...slug]/ │ │ │ │ │ └── route.ts │ │ │ │ ├── custom.scss │ │ │ │ └── layout.tsx │ │ │ ├── business-layer/ │ │ │ │ ├── middleware/ │ │ │ │ │ └── Security.ts │ │ │ │ ├── provider/ │ │ │ │ │ ├── google.ts │ │ │ │ │ ├── standard.test.ts │ │ │ │ │ └── standard.ts │ │ │ │ ├── security/ │ │ │ │ │ ├── authentication.ts │ │ │ │ │ └── errors.ts │ │ │ │ └── services/ │ │ │ │ ├── AuthService.test.ts │ │ │ │ └── AuthService.ts │ │ │ ├── data-layer/ │ │ │ │ ├── adapters/ │ │ │ │ │ └── Payload.ts │ │ │ │ ├── collections/ │ │ │ │ │ ├── Admin.ts │ │ │ │ │ ├── Authentication.ts │ │ │ │ │ ├── Booking.ts │ │ │ │ │ ├── GameSession.ts │ │ │ │ │ ├── GameSessionSchedule.ts │ │ │ │ │ ├── Media.ts │ │ │ │ │ ├── Semester.ts │ │ │ │ │ └── User.ts │ │ │ │ ├── fields/ │ │ │ │ │ ├── date-time.test.ts │ │ │ │ │ └── date-time.ts │ │ │ │ ├── globals/ │ │ │ │ │ ├── Faq.ts │ │ │ │ │ ├── Footer.ts │ │ │ │ │ └── Navbar.ts │ │ │ │ └── services/ │ │ │ │ ├── AuthDataService.test.ts │ │ │ │ ├── AuthDataService.ts │ │ │ │ ├── BookingDataService.test.ts │ │ │ │ ├── BookingDataService.ts │ │ │ │ ├── GameSessionDataService.test.ts │ │ │ │ ├── GameSessionDataService.ts │ │ │ │ ├── SemesterDataService.test.ts │ │ │ │ ├── SemesterDataService.ts │ │ │ │ ├── UserDataService.test.ts │ │ │ │ └── UserDataService.ts │ │ │ ├── test-config/ │ │ │ │ ├── mocks/ │ │ │ │ │ ├── Authentication.mock.ts │ │ │ │ │ ├── AuthService.mock.ts │ │ │ │ │ ├── Booking.mock.ts │ │ │ │ │ ├── GameSession.mock.ts │ │ │ │ │ ├── GameSessionSchedule.mock.ts │ │ │ │ │ ├── GoogleAuth.mock.ts │ │ │ │ │ ├── Semester.mock.ts │ │ │ │ │ └── User.mock.ts │ │ │ │ ├── backend-utils.ts │ │ │ │ └── vitest.setup.ts │ │ │ └── payload.config.ts │ │ ├── .dockerignore │ │ ├── .env.example │ │ ├── Dockerfile │ │ ├── environment.d.ts │ │ ├── fly.staging.toml │ │ ├── next-env.d.ts │ │ ├── next.config.mjs │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── frontend/ │ │ ├── public/ │ │ │ ├── file.svg │ │ │ ├── globe.svg │ │ │ ├── next.svg │ │ │ ├── vercel.svg │ │ │ └── window.svg │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── favicon.ico │ │ │ │ ├── layout.tsx │ │ │ │ ├── page.tsx │ │ │ │ └── smoke.test.ts │ │ │ ├── assets/ │ │ │ │ ├── BadmintonRacketLogo.png │ │ │ │ ├── shuttle.png │ │ │ │ └── uabc-logo.svg │ │ │ ├── components/ │ │ │ │ └── Footer/ │ │ │ │ ├── constants.ts │ │ │ │ ├── Footer.test.tsx │ │ │ │ ├── FooterBottom.tsx │ │ │ │ ├── FooterBrand.tsx │ │ │ │ ├── FooterDecoration.tsx │ │ │ │ ├── FooterLinks.tsx │ │ │ │ ├── FooterSocialLinks.tsx │ │ │ │ └── index.tsx │ │ │ ├── icons/ │ │ │ │ ├── LinkTreeIcon.test.tsx │ │ │ │ └── LinkTreeIcon.tsx │ │ │ └── test-config/ │ │ │ ├── test-utils.tsx │ │ │ └── vitest.setup.tsx │ │ ├── .dockerignore │ │ ├── .env.example │ │ ├── Dockerfile │ │ ├── environment.d.ts │ │ ├── fly.staging.toml │ │ ├── next-env.d.ts │ │ ├── next.config.ts │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ └── portal/ │ ├── public/ │ │ ├── images/ │ │ │ ├── BadmintonRacketLogo.png │ │ │ └── googleIcon.svg │ │ ├── svgs/ │ │ │ ├── icon-darkmode.svg │ │ │ ├── icon.svg │ │ │ ├── logo-darkmode.svg │ │ │ └── logo.svg │ │ └── google8d6fa1357d045b13.html │ ├── src/ │ │ ├── app/ │ │ │ ├── (dev)/ │ │ │ │ ├── account/ │ │ │ │ │ ├── client-page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── payment/ │ │ │ │ ├── direct-debit/ │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── admin/ │ │ │ │ ├── member-approval/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── members/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── semesters/ │ │ │ │ │ ├── [semesterId]/ │ │ │ │ │ │ └── schedules/ │ │ │ │ │ │ ├── loading.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── loading.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── view-sessions/ │ │ │ │ │ ├── [gameSessionId]/ │ │ │ │ │ │ ├── client-page.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── client-page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── auth/ │ │ │ │ ├── (auth)/ │ │ │ │ │ ├── forgot-password/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── login/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── signup/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── layout.tsx │ │ │ │ └── reset-password/ │ │ │ │ └── page.tsx │ │ │ ├── booking-confirmation/ │ │ │ │ └── [bookingId]/ │ │ │ │ └── page.tsx │ │ │ ├── onboarding/ │ │ │ │ ├── member/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── name/ │ │ │ │ │ └── page.tsx │ │ │ │ └── layout.tsx │ │ │ ├── privacy/ │ │ │ │ └── page.tsx │ │ │ ├── sessions/ │ │ │ │ ├── select-play-level/ │ │ │ │ │ ├── client-page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── client-page.tsx │ │ │ │ ├── page.test.tsx │ │ │ │ └── page.tsx │ │ │ ├── globals.css │ │ │ ├── layout.tsx │ │ │ ├── middleware.ts │ │ │ ├── not-found.tsx │ │ │ └── page.tsx │ │ ├── components/ │ │ │ ├── Composite/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── members/ │ │ │ │ │ │ ├── MemberApprovalTable/ │ │ │ │ │ │ │ ├── columns.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── MemberApprovalCard.tsx │ │ │ │ │ │ │ ├── MemberApprovalModal.tsx │ │ │ │ │ │ │ ├── MemberApprovalTable.tsx │ │ │ │ │ │ │ ├── MemberApprovalTablePagination.tsx │ │ │ │ │ │ │ └── MemberApprovalTableRow.tsx │ │ │ │ │ │ ├── MemberManagementTable/ │ │ │ │ │ │ │ ├── Columns.tsx │ │ │ │ │ │ │ ├── Filter.tsx │ │ │ │ │ │ │ ├── FilterInput.tsx │ │ │ │ │ │ │ ├── FilterResetButton.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── PagingTable.tsx │ │ │ │ │ │ │ ├── SkeletonTable.tsx │ │ │ │ │ │ │ ├── Table.tsx │ │ │ │ │ │ │ └── TablePagination.tsx │ │ │ │ │ │ └── MemberApprovalPing.tsx │ │ │ │ │ ├── schedules/ │ │ │ │ │ │ ├── CreateScheduleFormDialog.tsx │ │ │ │ │ │ ├── DeleteScheduleFormDialog.tsx │ │ │ │ │ │ ├── EditScheduleFormDialog.tsx │ │ │ │ │ │ ├── ScheduleCreateButton.tsx │ │ │ │ │ │ ├── ScheduleDetailCard.tsx │ │ │ │ │ │ ├── SchedulesContext.tsx │ │ │ │ │ │ ├── SchedulesList.tsx │ │ │ │ │ │ └── SkeletonScheduleCard.tsx │ │ │ │ │ ├── semesters/ │ │ │ │ │ │ ├── CreateSemesterFormDialog.tsx │ │ │ │ │ │ ├── DeleteSemesterFormDialog.tsx │ │ │ │ │ │ ├── EditSemesterFormDialog.tsx │ │ │ │ │ │ ├── SemesterCreateButton.tsx │ │ │ │ │ │ ├── SemesterDetailCard.tsx │ │ │ │ │ │ ├── SemestersContext.tsx │ │ │ │ │ │ ├── SemestersList.tsx │ │ │ │ │ │ ├── SkeletonSemesterCard.tsx │ │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── view-sessions/ │ │ │ │ │ │ ├── gameSessionId/ │ │ │ │ │ │ │ ├── Attendees/ │ │ │ │ │ │ │ │ ├── Filter.tsx │ │ │ │ │ │ │ │ ├── FilterInput.tsx │ │ │ │ │ │ │ │ ├── FilterResetButton.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── Table.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── Loading.tsx │ │ │ │ │ │ ├── AdminViewSessionCard.tsx │ │ │ │ │ │ ├── CreateGameSessionFormDialog.tsx │ │ │ │ │ │ ├── DeleteGameSessionFormDialog.tsx │ │ │ │ │ │ ├── EditGameSessionFormDialog.tsx │ │ │ │ │ │ ├── EmptyAdminViewSessionCard.tsx │ │ │ │ │ │ ├── GameSessionContext.tsx │ │ │ │ │ │ ├── SkeletonViewSessionCard.tsx │ │ │ │ │ │ └── utils.ts │ │ │ │ │ └── DashboardButton.tsx │ │ │ │ ├── auth/ │ │ │ │ │ ├── BreakLine.tsx │ │ │ │ │ ├── EmailLoginForm.tsx │ │ │ │ │ ├── EmailSignUpForm.tsx │ │ │ │ │ ├── ForgotPasswordForm.tsx │ │ │ │ │ ├── formSchema.tsx │ │ │ │ │ ├── GoogleLoginButton.tsx │ │ │ │ │ ├── OTPFormAlertDialog.tsx │ │ │ │ │ ├── ResetPasswordForm.tsx │ │ │ │ │ └── SkeletonEmailResetPassword.tsx │ │ │ │ ├── booking/ │ │ │ │ │ ├── confirmation/ │ │ │ │ │ │ ├── CartClearer.tsx │ │ │ │ │ │ ├── ConfirmationMessage.tsx │ │ │ │ │ │ └── ConfirmedSessionCard.tsx │ │ │ │ │ └── sessions/ │ │ │ │ │ ├── ExpandedSessionCard/ │ │ │ │ │ │ ├── ExpandedSessionCard.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── LevelSelector.tsx │ │ │ │ │ ├── SelectSessionList/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── SelectSessionCard.test.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── SelectSessionCard.tsx │ │ │ │ │ │ ├── SelectSessionList.tsx │ │ │ │ │ │ └── SkeletonSessionCard.tsx │ │ │ │ │ ├── PendingApprovalCard.tsx │ │ │ │ │ └── PrepaidSessionsCounter.tsx │ │ │ │ ├── payment/ │ │ │ │ │ ├── DebitDetailsCard.tsx │ │ │ │ │ ├── PaymentInfoCard.tsx │ │ │ │ │ └── PaymentOptionCard.tsx │ │ │ │ ├── providers/ │ │ │ │ │ ├── OriginTracker.tsx │ │ │ │ │ ├── QueryClientProvider.tsx │ │ │ │ │ └── SessionProvider.tsx │ │ │ │ ├── BackNavigationBar.tsx │ │ │ │ ├── Card.tsx │ │ │ │ ├── CountIndicator.tsx │ │ │ │ ├── Icons.tsx │ │ │ │ ├── LogOutButton.tsx │ │ │ │ ├── MembershipTypeSelector.tsx │ │ │ │ ├── UabcHeaderText.tsx │ │ │ │ ├── UabcLogo.tsx │ │ │ │ └── UabcLogoNotFound.tsx │ │ │ └── Generic/ │ │ │ └── ui/ │ │ │ ├── options-popover/ │ │ │ │ ├── OptionsButtonUtils.tsx │ │ │ │ └── OptionsPopover.tsx │ │ │ ├── utils/ │ │ │ │ └── DialogUtils.tsx │ │ │ ├── accordion.tsx │ │ │ ├── alert-dialog.tsx │ │ │ ├── alert.tsx │ │ │ ├── badge.tsx │ │ │ ├── button.tsx │ │ │ ├── dialog.tsx │ │ │ ├── drawer.tsx │ │ │ ├── pagination.tsx │ │ │ ├── popover.tsx │ │ │ ├── select.tsx │ │ │ ├── skeleton.tsx │ │ │ ├── table.tsx │ │ │ ├── toast.tsx │ │ │ ├── toaster.tsx │ │ │ └── use-toast.ts │ │ ├── hooks/ │ │ │ ├── mutations/ │ │ │ │ ├── booking.ts │ │ │ │ ├── forgot-password.ts │ │ │ │ ├── game-sessions.ts │ │ │ │ ├── registration.ts │ │ │ │ ├── reset-password.ts │ │ │ │ ├── schedules.ts │ │ │ │ └── user.ts │ │ │ └── query/ │ │ │ ├── active-dates.ts │ │ │ ├── game-sessions.ts │ │ │ ├── semesters.ts │ │ │ ├── useAttendees.ts │ │ │ ├── useMembers.ts │ │ │ ├── usePendingMembers.ts │ │ │ └── useSchedules.ts │ │ ├── lib/ │ │ │ ├── utils/ │ │ │ │ ├── dates.test.ts │ │ │ │ ├── dates.ts │ │ │ │ ├── game-sessions.ts │ │ │ │ ├── index.ts │ │ │ │ └── queryKeys.ts │ │ │ └── constants.ts │ │ ├── public/ │ │ │ ├── images/ │ │ │ │ ├── BadmintonRacketLogo.png │ │ │ │ └── googleIcon.svg │ │ │ ├── svgs/ │ │ │ │ ├── icon-darkmode.svg │ │ │ │ ├── icon.svg │ │ │ │ ├── logo-darkmode.svg │ │ │ │ └── logo.svg │ │ │ └── google8d6fa1357d045b13.html │ │ ├── services/ │ │ │ ├── booking.ts │ │ │ ├── forgot-password.ts │ │ │ ├── game-sessions.ts │ │ │ ├── reset-password.ts │ │ │ ├── semester.ts │ │ │ ├── stub-user.ts │ │ │ └── user.ts │ │ ├── stores/ │ │ │ ├── useCartStore.ts │ │ │ └── useOnboardingDetailsStore.ts │ │ ├── test-config/ │ │ │ └── test-utils.tsx │ │ └── theme/ │ │ ├── components/ │ │ │ ├── button.ts │ │ │ └── index.ts │ │ ├── semantics/ │ │ │ ├── color-schemes.ts │ │ │ ├── colors.ts │ │ │ └── index.ts │ │ ├── tokens/ │ │ │ ├── colors.ts │ │ │ ├── font-sizes.ts │ │ │ ├── font-weights.ts │ │ │ ├── fonts.ts │ │ │ └── index.ts │ │ ├── config.ts │ │ └── index.ts │ ├── .dockerignore │ ├── .env.example │ ├── Dockerfile │ ├── environment.d.ts │ ├── fly.staging.toml │ ├── next-env.d.ts │ ├── next.config.mjs │ ├── package.json.temp │ ├── postcss.config.mjs │ ├── tailwind.config.ts │ └── tsconfig.json ├── packages/ │ ├── shared/ │ │ ├── src/ │ │ │ ├── schemas/ │ │ │ │ ├── auth.ts │ │ │ │ └── index.ts │ │ │ ├── types/ │ │ │ │ ├── auth.ts │ │ │ │ ├── collections.ts │ │ │ │ ├── enums.ts │ │ │ │ ├── game-session.ts │ │ │ │ ├── index.ts │ │ │ │ └── member.ts │ │ │ ├── index.ts │ │ │ └── payload-types.ts │ │ ├── package.json │ │ └── tsconfig.json │ ├── tailwind-config/ │ │ ├── package.json │ │ ├── tailwind.config.ts │ │ └── tsconfig.json │ ├── test-config/ │ │ ├── src/ │ │ │ ├── configs/ │ │ │ │ ├── backend-config.ts │ │ │ │ ├── base-config.ts │ │ │ │ ├── frontend-config.ts │ │ │ │ └── ui-config.ts │ │ │ ├── scripts/ │ │ │ │ └── merge-coverage.ts │ │ │ └── setups/ │ │ │ ├── dom-setup.ts │ │ │ ├── index.ts │ │ │ └── mongodb-setup.ts │ │ ├── package.json │ │ └── tsconfig.json │ ├── theme/ │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── accordion.ts │ │ │ │ ├── airy.ts │ │ │ │ ├── alert.ts │ │ │ │ ├── alpha-slider.ts │ │ │ │ ├── area-chart.ts │ │ │ │ ├── autocomplete.ts │ │ │ │ ├── avatar.ts │ │ │ │ ├── badge.ts │ │ │ │ ├── bar-chart.ts │ │ │ │ ├── blockquote.ts │ │ │ │ ├── breadcrumb.ts │ │ │ │ ├── button.ts │ │ │ │ ├── calendar.ts │ │ │ │ ├── card.ts │ │ │ │ ├── carousel.ts │ │ │ │ ├── checkbox-card.ts │ │ │ │ ├── checkbox.ts │ │ │ │ ├── circle-progress.ts │ │ │ │ ├── close-button.ts │ │ │ │ ├── code.ts │ │ │ │ ├── collapse.ts │ │ │ │ ├── color-picker.ts │ │ │ │ ├── color-selector.ts │ │ │ │ ├── color-swatch.ts │ │ │ │ ├── container.ts │ │ │ │ ├── context-menu.ts │ │ │ │ ├── data-list.ts │ │ │ │ ├── date-picker.ts │ │ │ │ ├── dialog.ts │ │ │ │ ├── divider.ts │ │ │ │ ├── donut-chart.ts │ │ │ │ ├── drawer.ts │ │ │ │ ├── dropzone.ts │ │ │ │ ├── editable.ts │ │ │ │ ├── em.ts │ │ │ │ ├── empty-state.ts │ │ │ │ ├── fade.ts │ │ │ │ ├── fieldset.ts │ │ │ │ ├── file-button.ts │ │ │ │ ├── file-input.ts │ │ │ │ ├── flip.ts │ │ │ │ ├── for.ts │ │ │ │ ├── form-control.ts │ │ │ │ ├── format-byte.ts │ │ │ │ ├── format-number.ts │ │ │ │ ├── heading.ts │ │ │ │ ├── hue-slider.ts │ │ │ │ ├── icon.ts │ │ │ │ ├── image.ts │ │ │ │ ├── index.ts │ │ │ │ ├── indicator.ts │ │ │ │ ├── infinite-scroll-area.ts │ │ │ │ ├── input.ts │ │ │ │ ├── kbd.ts │ │ │ │ ├── line-chart.ts │ │ │ │ ├── link-box.ts │ │ │ │ ├── link.ts │ │ │ │ ├── list.ts │ │ │ │ ├── loading.ts │ │ │ │ ├── mark.ts │ │ │ │ ├── markdown.ts │ │ │ │ ├── menu.ts │ │ │ │ ├── modal.ts │ │ │ │ ├── month-picker.ts │ │ │ │ ├── multi-autocomplete.ts │ │ │ │ ├── multi-date-picker.ts │ │ │ │ ├── multi-select.ts │ │ │ │ ├── native-select.ts │ │ │ │ ├── native-table.ts │ │ │ │ ├── number-input.ts │ │ │ │ ├── pagination.ts │ │ │ │ ├── paging-table.ts │ │ │ │ ├── password-input.ts │ │ │ │ ├── pie-chart.ts │ │ │ │ ├── pin-input.ts │ │ │ │ ├── popover.ts │ │ │ │ ├── progress.ts │ │ │ │ ├── radar-chart.ts │ │ │ │ ├── radial-chart.ts │ │ │ │ ├── radio-card.ts │ │ │ │ ├── radio.ts │ │ │ │ ├── range-date-picker.ts │ │ │ │ ├── range-slider.ts │ │ │ │ ├── rating.ts │ │ │ │ ├── reorder.ts │ │ │ │ ├── resizable.ts │ │ │ │ ├── rotate.ts │ │ │ │ ├── saturation-slider.ts │ │ │ │ ├── scale-fade.ts │ │ │ │ ├── scroll-area.ts │ │ │ │ ├── segmented-control.ts │ │ │ │ ├── select.ts │ │ │ │ ├── separator.ts │ │ │ │ ├── skeleton.ts │ │ │ │ ├── slide-fade.ts │ │ │ │ ├── slide.ts │ │ │ │ ├── slider.ts │ │ │ │ ├── stat.ts │ │ │ │ ├── status.ts │ │ │ │ ├── stepper.ts │ │ │ │ ├── switch.ts │ │ │ │ ├── table.ts │ │ │ │ ├── tabs.ts │ │ │ │ ├── tag.ts │ │ │ │ ├── text.ts │ │ │ │ ├── textarea.ts │ │ │ │ ├── toggle.ts │ │ │ │ ├── tooltip.ts │ │ │ │ └── year-picker.ts │ │ │ ├── semantics/ │ │ │ │ ├── color-schemes.ts │ │ │ │ ├── colors.ts │ │ │ │ └── index.ts │ │ │ ├── styles/ │ │ │ │ ├── global-style.ts │ │ │ │ ├── index.ts │ │ │ │ ├── layer-styles.ts │ │ │ │ ├── reset-style.ts │ │ │ │ └── text-styles.ts │ │ │ ├── tokens/ │ │ │ │ ├── animations.ts │ │ │ │ ├── blurs.ts │ │ │ │ ├── borders.ts │ │ │ │ ├── breakpoints.ts │ │ │ │ ├── colors.ts │ │ │ │ ├── font-sizes.ts │ │ │ │ ├── font-weights.ts │ │ │ │ ├── fonts.ts │ │ │ │ ├── gradients.ts │ │ │ │ ├── index.ts │ │ │ │ ├── letter-spacings.ts │ │ │ │ ├── line-heights.ts │ │ │ │ ├── radii.ts │ │ │ │ ├── shadows.ts │ │ │ │ ├── sizes.ts │ │ │ │ ├── spaces.ts │ │ │ │ ├── transitions.ts │ │ │ │ └── z-indices.ts │ │ │ ├── config.ts │ │ │ └── index.ts │ │ ├── package.json │ │ └── tsconfig.json │ ├── typescript-config/ │ │ ├── base.json │ │ ├── nextjs.json │ │ ├── package.json │ │ └── react-library.json │ └── ui/ │ ├── .storybook/ │ │ ├── components/ │ │ │ ├── app.tsx │ │ │ ├── colors.tsx │ │ │ ├── gradients.tsx │ │ │ ├── index.ts │ │ │ └── props-table.tsx │ │ ├── main.ts │ │ ├── manager-head.html │ │ ├── preview-head.html │ │ ├── preview.tsx │ │ ├── styles.css │ │ └── themes.ts │ ├── src/ │ │ ├── components/ │ │ │ ├── Button/ │ │ │ │ ├── Button.stories.tsx │ │ │ │ ├── Button.test.tsx │ │ │ │ ├── Button.tsx │ │ │ │ └── index.ts │ │ │ ├── Heading/ │ │ │ │ ├── Heading.stories.tsx │ │ │ │ ├── Heading.test.tsx │ │ │ │ ├── Heading.tsx │ │ │ │ ├── index.ts │ │ │ │ └── namespace.tsx │ │ │ ├── Image/ │ │ │ │ ├── base.tsx │ │ │ │ ├── Image.stories.tsx │ │ │ │ ├── Image.test.tsx │ │ │ │ ├── Image.tsx │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── TextInput/ │ │ │ │ ├── index.ts │ │ │ │ ├── TextInput.stories.tsx │ │ │ │ ├── TextInput.test.tsx │ │ │ │ └── TextInput.tsx │ │ │ ├── Colors.stories.tsx │ │ │ └── Gradients.stories.tsx │ │ ├── providers/ │ │ │ ├── index.ts │ │ │ └── UIProvider.tsx │ │ ├── test-config/ │ │ │ └── constants.ts │ │ └── test-utils/ │ │ ├── drag.ts │ │ ├── icon.tsx │ │ ├── index.ts │ │ ├── render.tsx │ │ └── utils.ts │ ├── package.json │ ├── tsconfig.json │ ├── turbo.json │ └── vitest.config.ts ├── patches/ │ └── storybook-dark-mode.patch ├── .dockerignore ├── .env.example ├── .gitattributes ├── .gitignore ├── .lintstagedrc ├── .npmrc ├── .nvmrc ├── biome.json ├── commitlint.config.js ├── CONTRIBUTING.md ├── docker-compose.yml ├── environment.d.ts ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── README.md ├── renovate.json ├── turbo.json └── vitest.config.mts