med-cms 1.0.0-beta.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +13 -0
- package/README.md +117 -0
- package/database/config/db-init.js +67 -53
- package/database/models/appointments.js +35 -20
- package/database/models/clinics.js +25 -13
- package/database/models/diseases.js +21 -13
- package/database/models/districts.js +55 -0
- package/database/models/news.js +25 -0
- package/database/models/user-addresses.js +21 -14
- package/database/models/users.js +69 -26
- package/database/services/admin/create-clinic.js +18 -6
- package/database/services/admin/db-analytics.js +42 -16
- package/database/services/admin/index.js +6 -6
- package/database/services/admin/manage-staff.js +47 -17
- package/database/services/doctor/conduct-exam.js +26 -20
- package/database/services/doctor/get-schedule.js +26 -18
- package/database/services/doctor/index.js +6 -6
- package/database/services/doctor/patient-access.js +34 -25
- package/database/services/patient/book-appointment.js +37 -17
- package/database/services/patient/calc-district.js +70 -21
- package/database/services/patient/get-profile.js +49 -21
- package/database/services/patient/index.js +5 -5
- package/env_init.js +55 -0
- package/index.d.ts +38 -24
- package/index.js +48 -25
- package/migrate-diseases.js +192 -120
- package/package.json +3 -3
- package/public/css/admin.css +80 -80
- package/public/css/auth.css +52 -44
- package/public/css/doctor.css +131 -125
- package/public/css/home.css +155 -0
- package/public/html/dashboard-admin.html +423 -101
- package/public/html/dashboard-doctor.html +155 -66
- package/public/html/dashboard-patient.html +199 -94
- package/public/html/home/about.html +0 -0
- package/public/html/home/contact.html +0 -0
- package/public/html/home/info.html +0 -0
- package/public/html/home.html +159 -0
- package/public/html/login.html +73 -43
- package/public/js/admin.js +329 -165
- package/public/js/auth.js +45 -41
- package/public/js/doctor.js +117 -103
- package/public/js/home.js +113 -0
- package/public/js/patient.js +130 -108
- package/server/midleware.js +33 -13
- package/server/permissions.js +105 -43
- package/server/server.js +517 -176
- package/README +0 -161
- package/test.js +0 -27
package/migrate-diseases.js
CHANGED
|
@@ -1,134 +1,206 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
const path = require("path");
|
|
2
|
+
const fs = require("fs"); // ИСПРАВЛЕНИЕ: Добавлен обязательный импорт fs
|
|
3
|
+
const logger = require("custom-color-logs").print;
|
|
4
|
+
|
|
5
|
+
// Импортируем синглтон конфигурации базы данных
|
|
6
|
+
const dbConfig = require(
|
|
7
|
+
path.join(__dirname, "database", "config", "db-init.js"),
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
// Расширенный список распространенных в РБ диагнозов
|
|
6
11
|
const externalDiseasesList = [
|
|
7
|
-
{
|
|
8
|
-
name:
|
|
9
|
-
code:
|
|
10
|
-
treatmentRecommendations:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
recommendedMedications:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
recommendedMedications:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
name:
|
|
93
|
-
code:
|
|
94
|
-
treatmentRecommendations:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
12
|
+
{
|
|
13
|
+
name: "Острая респираторная вирусная инфекция (ОРВИ) верхних дыхательных путей",
|
|
14
|
+
code: "J06.9",
|
|
15
|
+
treatmentRecommendations:
|
|
16
|
+
"Домашний режим, обильное теплое питье, проветривание помещения, промывание носа изотоническими растворами.",
|
|
17
|
+
recommendedMedications:
|
|
18
|
+
"Ибупрофен (при лихорадке), Ксилометазолин (капли в нос), Витамин C",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "Острый бронхит",
|
|
22
|
+
code: "J20.9",
|
|
23
|
+
treatmentRecommendations:
|
|
24
|
+
"Постельный режим, ингаляции при отсутствии лихорадки, отказ от курения, теплое щелочное питье.",
|
|
25
|
+
recommendedMedications: "Амброксол, Ацетилцистеин (АЦЦ), Парацетамол",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "Внебольничная пневмония бактериальная",
|
|
29
|
+
code: "J15.9",
|
|
30
|
+
treatmentRecommendations:
|
|
31
|
+
"Строгий постельный режим, контроль сатурации, повторный осмотр врача через 48 часов, при тяжелом течении — госпитализация.",
|
|
32
|
+
recommendedMedications:
|
|
33
|
+
"Амоксициллин + Клавулановая кислота, Азитромицин, Левофлоксацин",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "Острый тонзиллит (Ангина стрептококковая)",
|
|
37
|
+
code: "J03.0",
|
|
38
|
+
treatmentRecommendations:
|
|
39
|
+
"Щадящая диета (жидкая и теплая пища), полоскание зева антисептиками, строгий постельный режим во избежание осложнений на сердце и почки.",
|
|
40
|
+
recommendedMedications:
|
|
41
|
+
"Феноксиметилпенициллин, Цефуроксим, Хлоргексидин (спрей)",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "Артериальная гипертензия (Гипертоническая болезнь II стадии)",
|
|
45
|
+
code: "I11.9",
|
|
46
|
+
treatmentRecommendations:
|
|
47
|
+
"Ограничение поваренной соли до 5 г/сутки, снижение веса, отказ от алкоголя и курения, ежедневный пожизненный прием препаратов под контролем АД.",
|
|
48
|
+
recommendedMedications: "Лизиноприл, Амлодипин, Бисопролол, Индапамид",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "Стабильная стенокардия напряжения (ИБС), II функциональный класс",
|
|
52
|
+
code: "I20.8",
|
|
53
|
+
treatmentRecommendations:
|
|
54
|
+
"Ограничение интенсивных физических нагрузок, диета с низким содержанием животных жиров, контроль уровня холестерина.",
|
|
55
|
+
recommendedMedications:
|
|
56
|
+
"Ацетилсалициловая кислота (Аспирин-Кардио), Аторвастатин, Нитроглицерин (при приступе)",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "Хроническая ишемическая болезнь сердца (Атеросклеротический кардиосклероз)",
|
|
60
|
+
code: "I25.1",
|
|
61
|
+
treatmentRecommendations:
|
|
62
|
+
"Умеренная физическая активность (ходьба), контроль веса, терапия сопутствующей гипертензии.",
|
|
63
|
+
recommendedMedications: "Периндоприл, Розувастатин, Клопидогрел",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "Остеохондроз позвоночника (Радикулопатия, люмбалгия)",
|
|
67
|
+
code: "M42.1",
|
|
68
|
+
treatmentRecommendations:
|
|
69
|
+
"Покой на жестком матрасе в острый период, ограничение наклонов и подъема тяжестей. После стихания болей — ЛФК и плавание.",
|
|
70
|
+
recommendedMedications:
|
|
71
|
+
"Диклофенак (инъекции/гель), Мидокалм (толперизон), Комбилипен",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "Первичный гонартроз двусторонний (Артроз коленных суставов)",
|
|
75
|
+
code: "M17.0",
|
|
76
|
+
treatmentRecommendations:
|
|
77
|
+
"Снижение нагрузки на суставы (снижение веса), использование трости при ходьбе, лечебная гимнастика для укрепления мышц бедра.",
|
|
78
|
+
recommendedMedications: "Мелоксикам, Хондроитина сульфат, Нимесулид гель",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "Хронический гастрит, обострение. Ассоциированный с Helicobacter pylori",
|
|
82
|
+
code: "K29.5",
|
|
83
|
+
treatmentRecommendations:
|
|
84
|
+
"Диета №1 по Певзнеру (исключить острое, жареное, копченое, газировку). Дробное питание 5-6 раз в день.",
|
|
85
|
+
recommendedMedications:
|
|
86
|
+
"Омепразол (или Эзомепразол), Кларитромицин, Амоксициллин",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "Язвенная болезнь двенадцатиперстной кишки, стадия обострения",
|
|
90
|
+
code: "K26.4",
|
|
91
|
+
treatmentRecommendations:
|
|
92
|
+
"Строгий отказ от курения и алкоголя, постельный или щадящий режим, контроль стула (исключить скрытое кровотечение).",
|
|
93
|
+
recommendedMedications:
|
|
94
|
+
"Рабепразол, Де-Нол (висмута трикалия дицитрат), Фамотидин",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: "Хронический панкреатит в стадии неполной ремиссии",
|
|
98
|
+
code: "K86.1",
|
|
99
|
+
treatmentRecommendations:
|
|
100
|
+
"Диета №5п (полное исключение жирной, острой пищи и алкоголя). Дробный прием пищи.",
|
|
101
|
+
recommendedMedications: "Панкреатин (Креон/Мезим), Спазмалгон",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "Сахарный диабет 2-го типа без осложнений",
|
|
105
|
+
code: "E11.9",
|
|
106
|
+
treatmentRecommendations:
|
|
107
|
+
"Низкоуглеводная диета (Стол №9), строгое исключение сахара, регулярный контроль глюкозы крови натощак и через 2 часа после еды.",
|
|
108
|
+
recommendedMedications: "Метформин, Гликлазид",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "Эндемический зоб, связанный с йодной недостаточностью (Очень актуально для РБ)",
|
|
112
|
+
code: "E01.0",
|
|
113
|
+
treatmentRecommendations:
|
|
114
|
+
"Использование в пищу исключительно йодированной соли, употребление морепродуктов, контроль уровня ТТГ раз в год.",
|
|
115
|
+
recommendedMedications: "Калия йодид (Йодомарин)",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "Острый аппендицит (Подозрение, направление на госпитализацию)",
|
|
119
|
+
code: "K35.8",
|
|
120
|
+
treatmentRecommendations:
|
|
121
|
+
"Экстренная госпитализация скорой помощью в хирургический стационар. Категорически запрещено прикладывать грелку к животу и принимать обезболивающие до осмотра хирурга.",
|
|
122
|
+
recommendedMedications:
|
|
123
|
+
"Медикаментозное лечение противопоказано. Показана экстренная операция.",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: "Почечная колика (Мочекаменная болезнь)",
|
|
127
|
+
code: "N20.1",
|
|
128
|
+
treatmentRecommendations:
|
|
129
|
+
"Теплые ванны (при отсутствии макрогематурии и лихорадки), обильное питье при стихании боли для отхождения конкремента.",
|
|
130
|
+
recommendedMedications:
|
|
131
|
+
"Дротаверин (Но-Шпа) внутримышечно, Кеторолак, Тамсулозин",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "Острый цистит бактериальный",
|
|
135
|
+
code: "N30.0",
|
|
136
|
+
treatmentRecommendations:
|
|
137
|
+
"Обильное питье (до 2.5 литров в сутки, предпочтительно клюквенный морс), сухое тепло на низ живота, исключение половой жизни на время лечения.",
|
|
138
|
+
recommendedMedications:
|
|
139
|
+
"Фосфомицин (Монурал), Канефрон Н, Фуразидин (Фурамаг)",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "Соматоформная дисфункция вегетативной нервной системы (НЦД / ВСД)",
|
|
143
|
+
code: "F45.3",
|
|
144
|
+
treatmentRecommendations:
|
|
145
|
+
"Нормализация режима сна и бодрствования, контрастный душ, регулярные кардионагрузки (бег, велосипед), психотерапия.",
|
|
146
|
+
recommendedMedications: "Адаптол (Мебикар), Магний B6, пустырника экстракт",
|
|
147
|
+
},
|
|
115
148
|
];
|
|
149
|
+
|
|
116
150
|
async function runMigration() {
|
|
117
151
|
try {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
152
|
+
const dbPath = path.join(__dirname, "db", "med-cms.sqlite");
|
|
153
|
+
|
|
154
|
+
// Проверяем и создаем папку для базы, если её нет
|
|
155
|
+
const dbDir = path.dirname(dbPath);
|
|
156
|
+
if (!fs.existsSync(dbDir)) {
|
|
157
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
console.log(
|
|
161
|
+
logger.ServerMedInfo(
|
|
162
|
+
"MIGRATION: Подключение к базе данных для импорта справочника...",
|
|
163
|
+
),
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
// Инициализируем фабричную БД
|
|
167
|
+
await dbConfig.initDatabase(dbPath);
|
|
168
|
+
|
|
169
|
+
// ИСПРАВЛЕНИЕ: Достаем проинициализированную модель Disease из синглтона базы данных онлайн
|
|
170
|
+
const Disease = dbConfig.models.Disease || dbConfig.Disease;
|
|
171
|
+
|
|
172
|
+
console.log(
|
|
173
|
+
logger.ServerMedInfo(
|
|
174
|
+
"MIGRATION: Проверка текущего состояния таблицы Diseases...",
|
|
175
|
+
),
|
|
176
|
+
);
|
|
121
177
|
const count = await Disease.count();
|
|
178
|
+
|
|
122
179
|
if (count === 0) {
|
|
180
|
+
// Массово заливаем массив в чистую таблицу
|
|
123
181
|
await Disease.bulkCreate(externalDiseasesList);
|
|
124
|
-
console.log(
|
|
182
|
+
console.log(
|
|
183
|
+
logger.ServerMedInfo(
|
|
184
|
+
`🌱 MIGRATION: УСПЕШНО! В отдельную таблицу Diseases импортировано ${externalDiseasesList.length} диагнозов РБ.`,
|
|
185
|
+
),
|
|
186
|
+
);
|
|
125
187
|
} else {
|
|
126
|
-
console.log(
|
|
188
|
+
console.log(
|
|
189
|
+
logger.ServerMedInfo(
|
|
190
|
+
`ℹ️ MIGRATION: Таблица Diseases уже содержит записи (${count} шт.). Импорт пропущен.`,
|
|
191
|
+
),
|
|
192
|
+
);
|
|
127
193
|
}
|
|
194
|
+
|
|
128
195
|
process.exit(0);
|
|
129
196
|
} catch (error) {
|
|
130
|
-
console.log(
|
|
197
|
+
console.log(
|
|
198
|
+
logger.ServerMedError(
|
|
199
|
+
"MIGRATION: Критическая ошибка миграции справочника: " + error.stack,
|
|
200
|
+
),
|
|
201
|
+
);
|
|
131
202
|
process.exit(1);
|
|
132
203
|
}
|
|
133
204
|
}
|
|
134
|
-
|
|
205
|
+
|
|
206
|
+
runMigration();
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "med-cms",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Медицинская мультитендантная CMS на Express и Sequelize (SQLite3) с системой ролей и автоматическим расчетом участков",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"test": "
|
|
8
|
+
"test": "node test.js"
|
|
9
9
|
},
|
|
10
10
|
"keywords": [
|
|
11
11
|
"medical",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"cookies"
|
|
18
18
|
],
|
|
19
19
|
"author": "prm-programmmer",
|
|
20
|
-
"license": "
|
|
20
|
+
"license": "ICS",
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"bcrypt": "^6.0.0",
|
|
23
23
|
"chalk-palette": "^3.0.0",
|
package/public/css/admin.css
CHANGED
|
@@ -1,129 +1,129 @@
|
|
|
1
1
|
body {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
font-family: "Segoe UI", system-ui, sans-serif;
|
|
3
|
+
background-color: #f8fafc;
|
|
4
|
+
color: #0f172a;
|
|
5
|
+
margin: 0;
|
|
6
|
+
padding: 0;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
.admin-panel {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
max-width: 1200px;
|
|
11
|
+
margin: 0 auto;
|
|
12
|
+
padding: 30px 20px;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
header {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
display: flex;
|
|
17
|
+
justify-content: space-between;
|
|
18
|
+
align-items: center;
|
|
19
|
+
border-bottom: 2px solid #e2e8f0;
|
|
20
|
+
padding-bottom: 20px;
|
|
21
|
+
margin-bottom: 30px;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
header h1 {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
margin: 0;
|
|
26
|
+
font-size: 24px;
|
|
27
|
+
color: #1e3a8a;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
.btn-logout {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
background-color: #ef4444;
|
|
32
|
+
color: white;
|
|
33
|
+
border: none;
|
|
34
|
+
padding: 10px 20px;
|
|
35
|
+
border-radius: 6px;
|
|
36
|
+
font-weight: bold;
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
transition: background 0.2s;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
.btn-logout:hover {
|
|
42
|
-
|
|
42
|
+
background-color: #dc2626;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/* Карточки аналитики БД */
|
|
46
46
|
.stats-cards {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
display: grid;
|
|
48
|
+
grid-template-columns: repeat(3, 1fr);
|
|
49
|
+
gap: 20px;
|
|
50
|
+
margin-bottom: 40px;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
.card {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
background: white;
|
|
55
|
+
padding: 20px;
|
|
56
|
+
border-radius: 8px;
|
|
57
|
+
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03);
|
|
58
|
+
font-size: 16px;
|
|
59
|
+
font-weight: 500;
|
|
60
|
+
color: #475569;
|
|
61
|
+
border-top: 4px solid #2563eb;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
.card span {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
display: block;
|
|
66
|
+
font-size: 32px;
|
|
67
|
+
font-weight: 700;
|
|
68
|
+
color: #0f172a;
|
|
69
|
+
margin-top: 10px;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
/* Сетка с формами задач */
|
|
73
73
|
.grid-forms {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
display: grid;
|
|
75
|
+
grid-template-columns: 1fr 1fr;
|
|
76
|
+
gap: 30px;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
.form-box {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
background: white;
|
|
81
|
+
padding: 25px;
|
|
82
|
+
border-radius: 8px;
|
|
83
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
.form-box h3 {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
margin-top: 0;
|
|
88
|
+
margin-bottom: 20px;
|
|
89
|
+
color: #0f172a;
|
|
90
|
+
font-size: 18px;
|
|
91
|
+
border-left: 4px solid #2563eb;
|
|
92
|
+
padding-left: 10px;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
.form-box form input,
|
|
95
|
+
.form-box form input,
|
|
96
96
|
.form-box form select {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
97
|
+
width: 100%;
|
|
98
|
+
padding: 12px;
|
|
99
|
+
margin-bottom: 15px;
|
|
100
|
+
border: 1px solid #cbd5e1;
|
|
101
|
+
border-radius: 6px;
|
|
102
|
+
font-size: 14px;
|
|
103
|
+
box-sizing: border-box;
|
|
104
|
+
background-color: #fff;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
.form-box form input:focus,
|
|
107
|
+
.form-box form input:focus,
|
|
108
108
|
.form-box form select:focus {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
border-color: #2563eb;
|
|
110
|
+
outline: none;
|
|
111
|
+
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
.form-box form button {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
115
|
+
width: 100%;
|
|
116
|
+
padding: 12px;
|
|
117
|
+
background-color: #2563eb;
|
|
118
|
+
color: white;
|
|
119
|
+
border: none;
|
|
120
|
+
border-radius: 6px;
|
|
121
|
+
font-weight: bold;
|
|
122
|
+
font-size: 15px;
|
|
123
|
+
cursor: pointer;
|
|
124
|
+
transition: background 0.2s;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
.form-box form button:hover {
|
|
128
|
-
|
|
128
|
+
background-color: #1d4ed8;
|
|
129
129
|
}
|