sqlalchemy-connection 2.0.1__py3-none-any.whl

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.
Files changed (33) hide show
  1. sqlalchemy_connection-2.0.1.dist-info/METADATA +26 -0
  2. sqlalchemy_connection-2.0.1.dist-info/RECORD +33 -0
  3. sqlalchemy_connection-2.0.1.dist-info/WHEEL +5 -0
  4. sqlalchemy_connection-2.0.1.dist-info/entry_points.txt +2 -0
  5. sqlalchemy_connection-2.0.1.dist-info/top_level.txt +1 -0
  6. sqlalchemy_connector/__init__.py +3 -0
  7. sqlalchemy_connector/_builder.py +425 -0
  8. sqlalchemy_connector/cli.py +200 -0
  9. sqlalchemy_connector/real_generator.py +2908 -0
  10. sqlalchemy_connector/templates/admin_cart_html_template.html +372 -0
  11. sqlalchemy_connector/templates/admin_html_template.html +364 -0
  12. sqlalchemy_connector/templates/admin_users_html_template.html +82 -0
  13. sqlalchemy_connector/templates/app_template.py +434 -0
  14. sqlalchemy_connector/templates/base_html_template.html +100 -0
  15. sqlalchemy_connector/templates/cart_html_template.html +103 -0
  16. sqlalchemy_connector/templates/catalog_html_template.html +98 -0
  17. sqlalchemy_connector/templates/checkout_html_template.html +70 -0
  18. sqlalchemy_connector/templates/dashboard_html_template.html +121 -0
  19. sqlalchemy_connector/templates/index_html_template.html +91 -0
  20. sqlalchemy_connector/templates/login_html_template.html +59 -0
  21. sqlalchemy_connector/templates/models_template.py +65 -0
  22. sqlalchemy_connector/templates/new_request_html_template.html +49 -0
  23. sqlalchemy_connector/templates/orders_html_template.html +65 -0
  24. sqlalchemy_connector/templates/product_form_html_template.html +142 -0
  25. sqlalchemy_connector/templates/product_html_template.html +131 -0
  26. sqlalchemy_connector/templates/profile_html_template.html +104 -0
  27. sqlalchemy_connector/templates/register_html_template.html +183 -0
  28. sqlalchemy_connector/templates/reviews_html_template.html +104 -0
  29. sqlalchemy_connector/templates/service_detail_html_template.html +67 -0
  30. sqlalchemy_connector/templates/service_form_html_template.html +86 -0
  31. sqlalchemy_connector/templates/services_html_template.html +47 -0
  32. sqlalchemy_connector/templates/slider_js_template.js +99 -0
  33. sqlalchemy_connector/templates/style_css_template.css +502 -0
@@ -0,0 +1,502 @@
1
+ /* ═══════════════════════════════════════════════════════════
2
+ Основные стили — адаптивный дизайн + анимации
3
+ ═══════════════════════════════════════════════════════════ */
4
+
5
+ * {
6
+ margin: 0;
7
+ padding: 0;
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ body {
12
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
13
+ background-color: #f8f9fa;
14
+ min-height: 100vh;
15
+ display: flex;
16
+ flex-direction: column;
17
+ }
18
+
19
+ main {
20
+ flex: 1;
21
+ }
22
+
23
+ /* ─── Слайдер ─────────────────────────────────────────────── */
24
+ .slider-wrapper {
25
+ width: 100%;
26
+ }
27
+
28
+ .slider-container {
29
+ position: relative;
30
+ width: 100%;
31
+ border-radius: 12px;
32
+ overflow: hidden;
33
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
34
+ background: #e9ecef;
35
+ }
36
+
37
+ .slides {
38
+ display: flex;
39
+ transition: transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
40
+ }
41
+
42
+ .slide {
43
+ min-width: 100%;
44
+ flex-shrink: 0;
45
+ }
46
+
47
+ .slide img {
48
+ width: 100%;
49
+ height: 400px;
50
+ object-fit: cover;
51
+ display: block;
52
+ }
53
+
54
+ /* Кнопки слайдера */
55
+ .prev, .next {
56
+ position: absolute;
57
+ top: 50%;
58
+ transform: translateY(-50%);
59
+ background: rgba(0, 0, 0, 0.55);
60
+ color: #fff;
61
+ border: none;
62
+ width: 44px;
63
+ height: 44px;
64
+ border-radius: 50%;
65
+ font-size: 18px;
66
+ cursor: pointer;
67
+ transition: background 0.25s, transform 0.25s;
68
+ z-index: 10;
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ }
73
+
74
+ .prev:hover, .next:hover {
75
+ background: rgba(0, 0, 0, 0.8);
76
+ transform: translateY(-50%) scale(1.1);
77
+ }
78
+
79
+ .prev { left: 14px; }
80
+ .next { right: 14px; }
81
+
82
+ /* Точки-индикаторы */
83
+ .slider-dots {
84
+ position: absolute;
85
+ bottom: 12px;
86
+ left: 50%;
87
+ transform: translateX(-50%);
88
+ display: flex;
89
+ gap: 8px;
90
+ z-index: 10;
91
+ }
92
+
93
+ .dot {
94
+ width: 10px;
95
+ height: 10px;
96
+ border-radius: 50%;
97
+ background: rgba(255, 255, 255, 0.6);
98
+ cursor: pointer;
99
+ transition: background 0.3s, transform 0.3s;
100
+ }
101
+
102
+ .dot.active {
103
+ background: #fff;
104
+ transform: scale(1.3);
105
+ }
106
+
107
+ /* ─── Карточки ────────────────────────────────────────────── */
108
+ .card {
109
+ border-radius: 12px;
110
+ overflow: hidden;
111
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.07);
112
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
113
+ }
114
+
115
+ .card:hover {
116
+ transform: translateY(-3px);
117
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
118
+ }
119
+
120
+ /* ═══ ПОЛНЫЙ ФИКС дёрганья модальных окон ═══ */
121
+ /* Убираем ВСЕ hover-эффекты внутри модальных окон */
122
+ .modal * {
123
+ transition: none !important;
124
+ animation: none !important;
125
+ will-change: auto !important;
126
+ }
127
+ .modal *:hover {
128
+ transform: none !important;
129
+ box-shadow: inherit !important;
130
+ }
131
+ .modal .card:hover,
132
+ .modal .btn:hover,
133
+ .modal .btn:active,
134
+ .modal a:hover,
135
+ .modal tr:hover,
136
+ .modal .table-hover tbody tr:hover {
137
+ transform: none !important;
138
+ box-shadow: none !important;
139
+ }
140
+
141
+ /* Всегда показываем скроллбар — убираем сдвиг при открытии модалки */
142
+ html {
143
+ overflow-y: scroll !important;
144
+ scrollbar-gutter: stable;
145
+ }
146
+ body.modal-open {
147
+ padding-right: 0 !important;
148
+ overflow: hidden !important;
149
+ }
150
+ body.modal-open .navbar,
151
+ body.modal-open .fixed-top {
152
+ padding-right: 0 !important;
153
+ }
154
+ .modal {
155
+ padding-right: 0 !important;
156
+ }
157
+ .modal-backdrop {
158
+ width: 100vw !important;
159
+ }
160
+ /* Отключаем анимации модального окна */
161
+ .modal.fade .modal-dialog {
162
+ transform: none !important;
163
+ transition: none !important;
164
+ }
165
+ .modal.fade {
166
+ transition: none !important;
167
+ }
168
+ .modal-dialog {
169
+ margin: 80px auto !important;
170
+ transform: none !important;
171
+ transition: none !important;
172
+ will-change: auto !important;
173
+ pointer-events: auto;
174
+ }
175
+ .modal-content {
176
+ transform: none !important;
177
+ transition: none !important;
178
+ animation: none !important;
179
+ will-change: auto !important;
180
+ position: relative;
181
+ }
182
+
183
+ /* Отключаем hover-эффекты на элементах ПОД модальным окном */
184
+ body.modal-open .card:hover,
185
+ body.modal-open .btn:hover,
186
+ body.modal-open .table-hover tbody tr:hover,
187
+ body.modal-open .product-card:hover {
188
+ transform: none !important;
189
+ box-shadow: inherit !important;
190
+ }
191
+
192
+ /* ─── Кнопки ──────────────────────────────────────────────── */
193
+ .btn {
194
+ border-radius: 8px;
195
+ transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.2s;
196
+ font-weight: 500;
197
+ }
198
+
199
+ .btn:hover:not(:disabled) {
200
+ transform: translateY(-1px);
201
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
202
+ }
203
+
204
+ .btn:active:not(:disabled) {
205
+ transform: translateY(0);
206
+ }
207
+
208
+ /* ─── Формы ───────────────────────────────────────────────── */
209
+ .form-control:focus,
210
+ .form-select:focus {
211
+ border-color: #0d6efd;
212
+ box-shadow: 0 0 0 0.2rem rgba(13, 110, 253, 0.2);
213
+ }
214
+
215
+ /* ─── Бейджи статусов ─────────────────────────────────────── */
216
+ .badge {
217
+ font-size: 12px;
218
+ padding: 5px 10px;
219
+ border-radius: 20px;
220
+ font-weight: 500;
221
+ }
222
+
223
+ /* ─── Анимации появления ──────────────────────────────────── */
224
+ @keyframes fadeInUp {
225
+ from {
226
+ opacity: 0;
227
+ transform: translateY(24px);
228
+ }
229
+ to {
230
+ opacity: 1;
231
+ transform: translateY(0);
232
+ }
233
+ }
234
+
235
+ @keyframes fadeIn {
236
+ from { opacity: 0; }
237
+ to { opacity: 1; }
238
+ }
239
+
240
+ @keyframes countUp {
241
+ from { transform: scale(0.8); opacity: 0; }
242
+ to { transform: scale(1); opacity: 1; }
243
+ }
244
+
245
+ .animate-fade-up {
246
+ animation: fadeInUp 0.5s ease both;
247
+ }
248
+
249
+ /* Задержки для каскадного появления карточек */
250
+ .animate-fade-up:nth-child(1) { animation-delay: 0.05s; }
251
+ .animate-fade-up:nth-child(2) { animation-delay: 0.12s; }
252
+ .animate-fade-up:nth-child(3) { animation-delay: 0.19s; }
253
+ .animate-fade-up:nth-child(4) { animation-delay: 0.26s; }
254
+
255
+ .counter-value {
256
+ animation: countUp 0.6s ease both;
257
+ }
258
+
259
+ /* ─── Фото до/после ───────────────────────────────────────── */
260
+ .before-after-card {
261
+ position: relative;
262
+ overflow: hidden;
263
+ border-radius: 10px;
264
+ cursor: pointer;
265
+ }
266
+
267
+ .before-after-card .photo-before {
268
+ display: block;
269
+ width: 100%;
270
+ height: 220px;
271
+ object-fit: cover;
272
+ transition: opacity 0.4s ease;
273
+ }
274
+
275
+ .before-after-card .photo-after {
276
+ position: absolute;
277
+ top: 0;
278
+ left: 0;
279
+ width: 100%;
280
+ height: 220px;
281
+ object-fit: cover;
282
+ opacity: 0;
283
+ transition: opacity 0.4s ease;
284
+ }
285
+
286
+ .before-after-card:hover .photo-before {
287
+ opacity: 0;
288
+ }
289
+
290
+ .before-after-card:hover .photo-after {
291
+ opacity: 1;
292
+ }
293
+
294
+ .before-after-label {
295
+ position: absolute;
296
+ bottom: 8px;
297
+ left: 8px;
298
+ background: rgba(0, 0, 0, 0.6);
299
+ color: #fff;
300
+ font-size: 11px;
301
+ padding: 2px 8px;
302
+ border-radius: 4px;
303
+ transition: opacity 0.3s;
304
+ }
305
+
306
+ .before-after-card:hover .before-after-label {
307
+ opacity: 0;
308
+ }
309
+
310
+ /* ─── Профиль / аватар ────────────────────────────────────── */
311
+ .avatar-wrapper {
312
+ position: relative;
313
+ display: inline-block;
314
+ }
315
+
316
+ .avatar-wrapper img,
317
+ .avatar-placeholder {
318
+ width: 100px;
319
+ height: 100px;
320
+ border-radius: 50%;
321
+ object-fit: cover;
322
+ border: 3px solid #dee2e6;
323
+ }
324
+
325
+ .avatar-placeholder {
326
+ background: #0d6efd;
327
+ color: #fff;
328
+ font-size: 40px;
329
+ display: flex;
330
+ align-items: center;
331
+ justify-content: center;
332
+ }
333
+
334
+ /* ─── Корзина ─────────────────────────────────────────────── */
335
+ .cart-badge {
336
+ position: relative;
337
+ display: inline-block;
338
+ }
339
+
340
+ .cart-count {
341
+ position: absolute;
342
+ top: -6px;
343
+ right: -8px;
344
+ background: #dc3545;
345
+ color: #fff;
346
+ border-radius: 50%;
347
+ width: 18px;
348
+ height: 18px;
349
+ font-size: 10px;
350
+ display: flex;
351
+ align-items: center;
352
+ justify-content: center;
353
+ font-weight: bold;
354
+ }
355
+
356
+ /* ─── Каталог товаров ─────────────────────────────────────── */
357
+ .product-card {
358
+ transition: transform 0.2s, box-shadow 0.2s;
359
+ }
360
+
361
+ .product-card:hover {
362
+ transform: translateY(-4px);
363
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
364
+ }
365
+
366
+ .product-card .card-img-top {
367
+ height: 200px;
368
+ object-fit: cover;
369
+ }
370
+
371
+ /* ─── Звёзды рейтинга ─────────────────────────────────────── */
372
+ .stars {
373
+ color: #ffc107;
374
+ font-size: 18px;
375
+ letter-spacing: 2px;
376
+ }
377
+
378
+ .stars-input label {
379
+ cursor: pointer;
380
+ font-size: 28px;
381
+ color: #dee2e6;
382
+ transition: color 0.15s;
383
+ }
384
+
385
+ .stars-input input[type="radio"] {
386
+ display: none;
387
+ }
388
+
389
+ .stars-input input[type="radio"]:checked ~ label,
390
+ .stars-input label:hover,
391
+ .stars-input label:hover ~ label {
392
+ color: #ffc107;
393
+ }
394
+
395
+ /* ─── Адаптив: телефоны (≤ 390px) ────────────────────────── */
396
+ @media (max-width: 390px) {
397
+ body {
398
+ font-size: 14px;
399
+ }
400
+
401
+ .container {
402
+ padding-left: 10px;
403
+ padding-right: 10px;
404
+ }
405
+
406
+ .slide img {
407
+ height: 200px;
408
+ }
409
+
410
+ .prev, .next {
411
+ width: 34px;
412
+ height: 34px;
413
+ font-size: 14px;
414
+ }
415
+
416
+ .card-header h4,
417
+ .card-header h5 {
418
+ font-size: 16px;
419
+ }
420
+
421
+ .btn {
422
+ font-size: 13px;
423
+ padding: 7px 14px;
424
+ }
425
+
426
+ table {
427
+ font-size: 12px;
428
+ }
429
+
430
+ .navbar-brand {
431
+ font-size: 16px;
432
+ }
433
+
434
+ .display-5 {
435
+ font-size: 1.6rem;
436
+ }
437
+
438
+ .slider-wrapper {
439
+ margin-left: -10px;
440
+ margin-right: -10px;
441
+ border-radius: 0;
442
+ }
443
+
444
+ .slider-container {
445
+ border-radius: 0;
446
+ }
447
+ }
448
+
449
+ /* ─── Адаптив: планшеты (391px – 768px) ──────────────────── */
450
+ @media (min-width: 391px) and (max-width: 768px) {
451
+ .slide img {
452
+ height: 260px;
453
+ }
454
+
455
+ .container {
456
+ max-width: 100%;
457
+ }
458
+
459
+ .product-card .card-img-top {
460
+ height: 160px;
461
+ }
462
+ }
463
+
464
+ /* ─── Адаптив: компьютеры (≥ 1200px) ─────────────────────── */
465
+ @media (min-width: 1200px) {
466
+ .container {
467
+ max-width: 1140px;
468
+ }
469
+
470
+ .slider-container {
471
+ max-width: 80%;
472
+ margin: 0 auto;
473
+ }
474
+
475
+ .slide img {
476
+ height: 480px;
477
+ }
478
+ }
479
+
480
+ /* ─── Утилиты ─────────────────────────────────────────────── */
481
+ .text-truncate-2 {
482
+ display: -webkit-box;
483
+ -webkit-line-clamp: 2;
484
+ -webkit-box-orient: vertical;
485
+ overflow: hidden;
486
+ }
487
+
488
+ /* Плавный скролл (overflow-y: scroll уже задан выше для фикса модалки) */
489
+ html {
490
+ scroll-behavior: smooth;
491
+ }
492
+
493
+ /* Таблицы */
494
+ .table th {
495
+ font-weight: 600;
496
+ white-space: nowrap;
497
+ }
498
+
499
+ /* Navbar */
500
+ .navbar-brand span {
501
+ font-size: 10px;
502
+ }