Initial commit: HotelSync PMS v0.1.0

- React 18 + TypeScript + Vite + Tailwind CSS
- Шахматка бронирований (drag-to-book)
- Страницы: Calendar, Bookings, Rooms, Housekeeping, Channels, API Docs, Settings
- Роли: super_admin, hotel_manager, housekeeper
- Светлая/тёмная тема
- Docker + Nginx конфигурация
- Лендинг hotelsync.ru
This commit is contained in:
2026-03-10 20:38:32 +03:00
commit 420d55d57e
45 changed files with 7274 additions and 0 deletions

117
src/index.css Normal file
View File

@@ -0,0 +1,117 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
* {
box-sizing: border-box;
}
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
@apply bg-slate-50 text-slate-900 font-sans;
@apply dark:bg-slate-900 dark:text-slate-100;
}
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
@apply bg-transparent;
}
::-webkit-scrollbar-thumb {
@apply bg-slate-300 dark:bg-slate-600 rounded-full;
}
::-webkit-scrollbar-thumb:hover {
@apply bg-slate-400 dark:bg-slate-500;
}
}
@layer components {
.booking-block {
@apply absolute inset-y-1 rounded-md text-white text-xs font-medium
flex items-center px-2 overflow-hidden cursor-pointer
select-none transition-all duration-100 hover:brightness-110;
}
.cal-cell {
@apply relative border-r border-b border-slate-200 dark:border-slate-700
min-w-[52px] h-14;
}
.cal-cell.today {
@apply bg-brand-50 dark:bg-brand-900/20;
}
.cal-cell.weekend {
@apply bg-slate-100/60 dark:bg-slate-800/60;
}
.sidebar-link {
@apply flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium
text-slate-600 dark:text-slate-400
hover:bg-slate-100 dark:hover:bg-slate-800
hover:text-slate-900 dark:hover:text-slate-100
transition-all duration-150;
}
.sidebar-link.active {
@apply bg-brand-50 dark:bg-brand-900/30
text-brand-700 dark:text-brand-300;
}
.card {
@apply bg-white dark:bg-slate-800
border border-slate-200 dark:border-slate-700
rounded-xl shadow-card;
}
.btn-primary {
@apply inline-flex items-center gap-2 px-4 py-2 rounded-lg
bg-brand-600 hover:bg-brand-700
text-white text-sm font-medium
transition-colors duration-150
disabled:opacity-50 disabled:cursor-not-allowed;
}
.btn-secondary {
@apply inline-flex items-center gap-2 px-4 py-2 rounded-lg
bg-white dark:bg-slate-800
border border-slate-200 dark:border-slate-700
text-slate-700 dark:text-slate-300
text-sm font-medium
hover:bg-slate-50 dark:hover:bg-slate-700
transition-colors duration-150;
}
.btn-ghost {
@apply inline-flex items-center gap-2 px-3 py-2 rounded-lg
text-slate-600 dark:text-slate-400
text-sm font-medium
hover:bg-slate-100 dark:hover:bg-slate-800
transition-colors duration-150;
}
.input {
@apply w-full px-3 py-2 rounded-lg text-sm
bg-white dark:bg-slate-800
border border-slate-300 dark:border-slate-600
text-slate-900 dark:text-slate-100
placeholder-slate-400 dark:placeholder-slate-500
focus:outline-none focus:ring-2 focus:ring-brand-500/40
focus:border-brand-500 dark:focus:border-brand-400
transition-colors duration-150;
}
.badge {
@apply inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium;
}
}