diff --git a/apps/web/components/common/spinner.tsx b/apps/web/components/common/spinner.tsx
deleted file mode 100644
index 2d31776..0000000
--- a/apps/web/components/common/spinner.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Loader2 } from 'lucide-react';
-
-export function LoadingSpinner() {
- return (
-
-
-
- );
-}
diff --git a/apps/web/components/contacts/contacts-list.tsx b/apps/web/components/contacts/contacts-list.tsx
index 748424b..d3f890d 100644
--- a/apps/web/components/contacts/contacts-list.tsx
+++ b/apps/web/components/contacts/contacts-list.tsx
@@ -1,9 +1,9 @@
'use client';
-import { LoadingSpinner } from '../common/spinner';
import { useCustomerContacts } from '@/hooks/api/contacts';
import * as GQL from '@repo/graphql/types';
import { Avatar, AvatarFallback, AvatarImage } from '@repo/ui/components/ui/avatar';
+import { LoadingSpinner } from '@repo/ui/components/ui/spinner';
import Link from 'next/link';
import { memo } from 'react';
diff --git a/apps/web/components/navigation/bottom-nav.tsx b/apps/web/components/navigation/bottom-nav/index.tsx
similarity index 94%
rename from apps/web/components/navigation/bottom-nav.tsx
rename to apps/web/components/navigation/bottom-nav/index.tsx
index 36d3ac0..ee74506 100644
--- a/apps/web/components/navigation/bottom-nav.tsx
+++ b/apps/web/components/navigation/bottom-nav/index.tsx
@@ -1,6 +1,6 @@
'use client';
-import { NavButton } from './components/nav-button';
+import { NavButton } from './nav-button';
import { BookOpen, Newspaper, PlusCircle, User, Users } from 'lucide-react';
import { usePathname } from 'next/navigation';
diff --git a/apps/web/components/navigation/components/nav-button.tsx b/apps/web/components/navigation/bottom-nav/nav-button.tsx
similarity index 100%
rename from apps/web/components/navigation/components/nav-button.tsx
rename to apps/web/components/navigation/bottom-nav/nav-button.tsx
diff --git a/apps/web/components/navigation/components/back-button.tsx b/apps/web/components/navigation/header/back-button.tsx
similarity index 100%
rename from apps/web/components/navigation/components/back-button.tsx
rename to apps/web/components/navigation/header/back-button.tsx
diff --git a/apps/web/components/navigation/header.tsx b/apps/web/components/navigation/header/index.tsx
similarity index 85%
rename from apps/web/components/navigation/header.tsx
rename to apps/web/components/navigation/header/index.tsx
index d8c70d9..59f83d0 100644
--- a/apps/web/components/navigation/header.tsx
+++ b/apps/web/components/navigation/header/index.tsx
@@ -1,6 +1,6 @@
'use client';
-import { BackButton } from './components/back-button';
+import { BackButton } from './back-button';
type Props = { title: string | undefined };
diff --git a/apps/web/components/orders/components/index.ts b/apps/web/components/orders/components/index.ts
deleted file mode 100644
index 6b7f476..0000000
--- a/apps/web/components/orders/components/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export * from './back-button';
-export * from './contacts-grid';
-export * from './datetime-select';
-export * from './next-button';
-export * from './result';
-export * from './service-select';
-export * from './submit-button';
diff --git a/apps/web/components/orders/components/back-button.tsx b/apps/web/components/orders/order-form/back-button.tsx
similarity index 100%
rename from apps/web/components/orders/components/back-button.tsx
rename to apps/web/components/orders/order-form/back-button.tsx
diff --git a/apps/web/components/orders/components/contacts-grid.tsx b/apps/web/components/orders/order-form/contacts-grid.tsx
similarity index 98%
rename from apps/web/components/orders/components/contacts-grid.tsx
rename to apps/web/components/orders/order-form/contacts-grid.tsx
index 903f308..c44fe5e 100644
--- a/apps/web/components/orders/components/contacts-grid.tsx
+++ b/apps/web/components/orders/order-form/contacts-grid.tsx
@@ -1,6 +1,5 @@
'use client';
-import { LoadingSpinner } from '@/components/common/spinner';
import { CardSectionHeader } from '@/components/ui';
import { ContactsContextProvider } from '@/context/contacts';
import { useCustomerContacts } from '@/hooks/api/contacts';
@@ -11,6 +10,7 @@ import { withContext } from '@/utils/context';
import { type CustomerFieldsFragment } from '@repo/graphql/types';
import { Card } from '@repo/ui/components/ui/card';
import { Label } from '@repo/ui/components/ui/label';
+import { LoadingSpinner } from '@repo/ui/components/ui/spinner';
import { cn } from '@repo/ui/lib/utils';
import Image from 'next/image';
import { useEffect } from 'react';
diff --git a/apps/web/components/orders/components/datetime-select.tsx b/apps/web/components/orders/order-form/datetime-select.tsx
similarity index 100%
rename from apps/web/components/orders/components/datetime-select.tsx
rename to apps/web/components/orders/order-form/datetime-select.tsx
diff --git a/apps/web/components/orders/order-form.tsx b/apps/web/components/orders/order-form/index.tsx
similarity index 73%
rename from apps/web/components/orders/order-form.tsx
rename to apps/web/components/orders/order-form/index.tsx
index 0a613bf..943a28a 100644
--- a/apps/web/components/orders/order-form.tsx
+++ b/apps/web/components/orders/order-form/index.tsx
@@ -1,19 +1,15 @@
'use client';
-import { LoadingSpinner } from '../common/spinner';
-import {
- BackButton,
- ClientsGrid,
- DateTimeSelect,
- ErrorPage,
- MastersGrid,
- NextButton,
- ServiceSelect,
- SuccessPage,
-} from './components';
-import { SubmitButton } from './components/submit-button';
+import { BackButton } from './back-button';
+import { ClientsGrid, MastersGrid } from './contacts-grid';
+import { DateTimeSelect } from './datetime-select';
+import { NextButton } from './next-button';
+import { ErrorPage, SuccessPage } from './result';
+import { ServiceSelect } from './service-select';
+import { SubmitButton } from './submit-button';
import { OrderStoreProvider, useInitOrderStore, useOrderStore } from '@/stores/order';
import { withContext } from '@/utils/context';
+import { LoadingSpinner } from '@repo/ui/components/ui/spinner';
import { type JSX } from 'react';
const STEP_COMPONENTS: Record = {
diff --git a/apps/web/components/orders/components/next-button.tsx b/apps/web/components/orders/order-form/next-button.tsx
similarity index 100%
rename from apps/web/components/orders/components/next-button.tsx
rename to apps/web/components/orders/order-form/next-button.tsx
diff --git a/apps/web/components/orders/components/result.tsx b/apps/web/components/orders/order-form/result.tsx
similarity index 100%
rename from apps/web/components/orders/components/result.tsx
rename to apps/web/components/orders/order-form/result.tsx
diff --git a/apps/web/components/orders/components/service-select.tsx b/apps/web/components/orders/order-form/service-select.tsx
similarity index 100%
rename from apps/web/components/orders/components/service-select.tsx
rename to apps/web/components/orders/order-form/service-select.tsx
diff --git a/apps/web/components/orders/components/submit-button.tsx b/apps/web/components/orders/order-form/submit-button.tsx
similarity index 100%
rename from apps/web/components/orders/components/submit-button.tsx
rename to apps/web/components/orders/order-form/submit-button.tsx
diff --git a/apps/web/components/profile/components/index.ts b/apps/web/components/profile/components/index.ts
deleted file mode 100644
index a1e6bef..0000000
--- a/apps/web/components/profile/components/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './checkbox-field';
-export * from './link-button';
-export * from './text-field';
diff --git a/apps/web/components/profile/components/checkbox-field.tsx b/apps/web/components/profile/data-card/checkbox-field.tsx
similarity index 100%
rename from apps/web/components/profile/components/checkbox-field.tsx
rename to apps/web/components/profile/data-card/checkbox-field.tsx
diff --git a/apps/web/components/profile/data-card.tsx b/apps/web/components/profile/data-card/index.tsx
similarity index 91%
rename from apps/web/components/profile/data-card.tsx
rename to apps/web/components/profile/data-card/index.tsx
index f13993f..1aae939 100644
--- a/apps/web/components/profile/data-card.tsx
+++ b/apps/web/components/profile/data-card/index.tsx
@@ -1,8 +1,9 @@
'use client';
-import { CardSectionHeader } from '../ui';
-import { CheckboxWithText, DataField } from './components';
-import { type ProfileProps } from './types';
+import { type ProfileProps } from '../types';
+import { CheckboxWithText } from './checkbox-field';
+import { DataField } from './text-field';
+import { CardSectionHeader } from '@/components/ui';
import { useCustomerMutation, useCustomerQuery } from '@/hooks/api/customers';
import { Enum_Customer_Role as Role } from '@repo/graphql/types';
import { Button } from '@repo/ui/components/ui/button';
diff --git a/apps/web/components/profile/components/text-field.tsx b/apps/web/components/profile/data-card/text-field.tsx
similarity index 100%
rename from apps/web/components/profile/components/text-field.tsx
rename to apps/web/components/profile/data-card/text-field.tsx
diff --git a/apps/web/components/profile/links-card.tsx b/apps/web/components/profile/links-card/index.tsx
similarity index 88%
rename from apps/web/components/profile/links-card.tsx
rename to apps/web/components/profile/links-card/index.tsx
index b6f8262..b938d54 100644
--- a/apps/web/components/profile/links-card.tsx
+++ b/apps/web/components/profile/links-card/index.tsx
@@ -1,8 +1,8 @@
/* eslint-disable canonical/id-match */
'use client';
-import { LinkButton } from './components';
-import { type ProfileProps } from './types';
+import { type ProfileProps } from '../types';
+import { LinkButton } from './link-button';
import { useCustomerQuery } from '@/hooks/api/customers';
import { Enum_Customer_Role } from '@repo/graphql/types';
diff --git a/apps/web/components/profile/components/link-button.tsx b/apps/web/components/profile/links-card/link-button.tsx
similarity index 100%
rename from apps/web/components/profile/components/link-button.tsx
rename to apps/web/components/profile/links-card/link-button.tsx
diff --git a/apps/web/components/profile/person-card.tsx b/apps/web/components/profile/person-card.tsx
index f7ac660..a7f7a1b 100644
--- a/apps/web/components/profile/person-card.tsx
+++ b/apps/web/components/profile/person-card.tsx
@@ -1,10 +1,10 @@
'use client';
-import { LoadingSpinner } from '../common/spinner';
import { type ProfileProps } from './types';
import { useCustomerQuery } from '@/hooks/api/customers';
import { Avatar, AvatarFallback, AvatarImage } from '@repo/ui/components/ui/avatar';
import { Card } from '@repo/ui/components/ui/card';
+import { LoadingSpinner } from '@repo/ui/components/ui/spinner';
export function PersonCard({ telegramId }: Readonly) {
const { data: { customer } = {}, isLoading } = useCustomerQuery({ telegramId });
diff --git a/apps/web/components/schedule/day-slot-add-form.tsx b/apps/web/components/schedule/day-slots-list/day-slot-add-form.tsx
similarity index 94%
rename from apps/web/components/schedule/day-slot-add-form.tsx
rename to apps/web/components/schedule/day-slots-list/day-slot-add-form.tsx
index f8990e8..b0633c9 100644
--- a/apps/web/components/schedule/day-slot-add-form.tsx
+++ b/apps/web/components/schedule/day-slots-list/day-slot-add-form.tsx
@@ -1,7 +1,7 @@
/* eslint-disable canonical/id-match */
'use client';
-import { EditableTimeRangeForm } from './components/time-range';
+import { EditableTimeRangeForm } from '@/components/shared/time-range';
import { useSlotCreate } from '@/hooks/api/slots';
import { ScheduleStoreProvider, useScheduleStore } from '@/stores/schedule';
import { withContext } from '@/utils/context';
diff --git a/apps/web/components/schedule/day-slots-list.tsx b/apps/web/components/schedule/day-slots-list/index.tsx
similarity index 85%
rename from apps/web/components/schedule/day-slots-list.tsx
rename to apps/web/components/schedule/day-slots-list/index.tsx
index 40007c5..a432993 100644
--- a/apps/web/components/schedule/day-slots-list.tsx
+++ b/apps/web/components/schedule/day-slots-list/index.tsx
@@ -1,10 +1,10 @@
'use client';
-import { SlotCard } from './components/slot-card';
import { DaySlotAddForm } from './day-slot-add-form';
-import { LoadingSpinner } from '@/components/common/spinner';
+import { SlotCard } from './slot-card';
import { DateContext } from '@/context/date';
import { useSlotsQuery } from '@/hooks/api/slots';
+import { LoadingSpinner } from '@repo/ui/components/ui/spinner';
import { use } from 'react';
export function DaySlotsList() {
diff --git a/apps/web/components/schedule/components/slot-card.tsx b/apps/web/components/schedule/day-slots-list/slot-card.tsx
similarity index 100%
rename from apps/web/components/schedule/components/slot-card.tsx
rename to apps/web/components/schedule/day-slots-list/slot-card.tsx
diff --git a/apps/web/components/schedule/index.ts b/apps/web/components/schedule/index.ts
index 0251181..5fd891e 100644
--- a/apps/web/components/schedule/index.ts
+++ b/apps/web/components/schedule/index.ts
@@ -1,5 +1,4 @@
export * from './calendar';
-export * from './day-slot-add-form';
export * from './day-slots-list';
export * from './slot-buttons';
export * from './slot-datetime';
diff --git a/apps/web/components/schedule/slot-datetime.tsx b/apps/web/components/schedule/slot-datetime/index.tsx
similarity index 70%
rename from apps/web/components/schedule/slot-datetime.tsx
rename to apps/web/components/schedule/slot-datetime/index.tsx
index dd213b3..4c84846 100644
--- a/apps/web/components/schedule/slot-datetime.tsx
+++ b/apps/web/components/schedule/slot-datetime/index.tsx
@@ -1,8 +1,8 @@
'use client';
-import { SlotDate } from './components/slot-date';
-import { SlotTime } from './components/slot-time';
-import { type SlotComponentProps } from './types';
+import { type SlotComponentProps } from '../types';
+import { SlotDate } from './slot-date';
+import { SlotTime } from './slot-time';
import { ScheduleStoreProvider } from '@/stores/schedule';
import { withContext } from '@/utils/context';
diff --git a/apps/web/components/schedule/components/slot-date.tsx b/apps/web/components/schedule/slot-datetime/slot-date.tsx
similarity index 100%
rename from apps/web/components/schedule/components/slot-date.tsx
rename to apps/web/components/schedule/slot-datetime/slot-date.tsx
diff --git a/apps/web/components/schedule/components/slot-time.tsx b/apps/web/components/schedule/slot-datetime/slot-time.tsx
similarity index 95%
rename from apps/web/components/schedule/components/slot-time.tsx
rename to apps/web/components/schedule/slot-datetime/slot-time.tsx
index 4006960..7fa5a66 100644
--- a/apps/web/components/schedule/components/slot-time.tsx
+++ b/apps/web/components/schedule/slot-datetime/slot-time.tsx
@@ -2,8 +2,7 @@
'use client';
import { type SlotComponentProps } from '../types';
-import { EditableTimeRangeForm } from './time-range';
-import { ReadonlyTimeRange } from '@/components/shared/time-range';
+import { EditableTimeRangeForm, ReadonlyTimeRange } from '@/components/shared/time-range';
import { useSlotMutation, useSlotQuery } from '@/hooks/api/slots';
import { useZustandStore } from '@/stores/schedule';
import { Button } from '@repo/ui/components/ui/button';
diff --git a/apps/web/components/schedule/slot-orders-list.tsx b/apps/web/components/schedule/slot-orders-list.tsx
index 7880ddd..a0a1e6c 100644
--- a/apps/web/components/schedule/slot-orders-list.tsx
+++ b/apps/web/components/schedule/slot-orders-list.tsx
@@ -1,7 +1,7 @@
'use client';
-import { OrderCard } from '../shared/order-card';
import { type SlotComponentProps } from './types';
+import { OrderCard } from '@/components/shared/order-card';
import { useSlotQuery } from '@/hooks/api/slots';
export function SlotOrdersList({ documentId }: Readonly) {
diff --git a/apps/web/components/shared/order-card.tsx b/apps/web/components/shared/order-card.tsx
index 2227033..125674a 100644
--- a/apps/web/components/shared/order-card.tsx
+++ b/apps/web/components/shared/order-card.tsx
@@ -2,7 +2,7 @@
'use client';
import { type OrderClient, type OrderComponentProps } from '../schedule/types';
-import { ReadonlyTimeRange } from './time-range';
+import { ReadonlyTimeRange } from './time-range/readonly';
import { useOrderQuery } from '@/hooks/api/orders';
import { Enum_Order_State } from '@repo/graphql/types';
import { Avatar, AvatarFallback, AvatarImage } from '@repo/ui/components/ui/avatar';
diff --git a/apps/web/components/schedule/components/time-range.tsx b/apps/web/components/shared/time-range/editable.tsx
similarity index 99%
rename from apps/web/components/schedule/components/time-range.tsx
rename to apps/web/components/shared/time-range/editable.tsx
index 3ab64c9..47e2727 100644
--- a/apps/web/components/schedule/components/time-range.tsx
+++ b/apps/web/components/shared/time-range/editable.tsx
@@ -1,4 +1,5 @@
'use client';
+
import { useScheduleStore } from '@/stores/schedule';
import { Input } from '@repo/ui/components/ui/input';
import { type FormEvent, type PropsWithChildren } from 'react';
diff --git a/apps/web/components/shared/time-range/index.ts b/apps/web/components/shared/time-range/index.ts
new file mode 100644
index 0000000..291f5af
--- /dev/null
+++ b/apps/web/components/shared/time-range/index.ts
@@ -0,0 +1,2 @@
+export * from './editable';
+export * from './readonly';
diff --git a/apps/web/components/shared/time-range.tsx b/apps/web/components/shared/time-range/readonly.tsx
similarity index 100%
rename from apps/web/components/shared/time-range.tsx
rename to apps/web/components/shared/time-range/readonly.tsx