@artilingo/artiframe-cli 2.0.3 → 2.0.5

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 (90) hide show
  1. package/LICENSE +660 -660
  2. package/bin/artiframe.js +0 -0
  3. package/bin/artiframe.php +0 -0
  4. package/core-stubs/app/ApiAuthControl.php +76 -0
  5. package/core-stubs/app/ApiControl.php +81 -35
  6. package/core-stubs/app/AuthControl.php +39 -0
  7. package/core-stubs/app/Database.php +36 -35
  8. package/core-stubs/app/DotEnv.php +19 -1
  9. package/core-stubs/app/ViewControl.php +47 -1
  10. package/core-stubs/bin/SQLMethod.php +261 -0
  11. package/core-stubs/bin/SystemMethod.php +115 -74
  12. package/core-stubs/bin/ViewMethod.php +19 -5
  13. package/core-stubs/docs/de.html +4325 -4347
  14. package/core-stubs/docs/en.html +4325 -4347
  15. package/core-stubs/docs/es.html +4325 -4347
  16. package/core-stubs/docs/fr.html +4325 -4347
  17. package/core-stubs/docs/tr.html +117 -46
  18. package/core-stubs/public/403.php +52 -0
  19. package/core-stubs/public/assets/css/components/header.css +174 -0
  20. package/core-stubs/public/assets/css/components/mobilenav.css +198 -0
  21. package/core-stubs/public/assets/css/components/sidebar.css +184 -0
  22. package/core-stubs/public/assets/css/root/app.css +975 -38
  23. package/core-stubs/public/assets/css/root/root.css +64 -0
  24. package/core-stubs/public/assets/js/components/header.js +380 -0
  25. package/core-stubs/public/assets/js/components/mobilenav.js +97 -0
  26. package/core-stubs/public/assets/js/components/theme-modal.js +74 -0
  27. package/core-stubs/public/assets/js/root/app.js +1870 -0
  28. package/core-stubs/public/includes/footer.php +4 -5
  29. package/core-stubs/public/includes/head-auth.php +65 -0
  30. package/core-stubs/public/includes/head.php +56 -17
  31. package/core-stubs/public/includes/header.php +135 -1
  32. package/core-stubs/public/includes/mobilenav.php +75 -3
  33. package/core-stubs/public/includes/sidebar.php +186 -1
  34. package/core-stubs/public/includes/theme-modal.php +1 -0
  35. package/db-studio/debug.log +3 -0
  36. package/db-studio/index.html +1755 -0
  37. package/db-studio/launcher.html +102 -0
  38. package/db-studio/launcher.js +180 -0
  39. package/db-studio/logo.svg +22 -0
  40. package/db-studio/main.js +568 -0
  41. package/db-studio/package-lock.json +1034 -0
  42. package/db-studio/package.json +16 -0
  43. package/db-studio/preload.js +29 -0
  44. package/devops-studio/api-inspector.js +222 -0
  45. package/devops-studio/index.html +1892 -0
  46. package/devops-studio/logo.svg +22 -0
  47. package/devops-studio/main.js +67 -0
  48. package/devops-studio/make-wizard.js +635 -0
  49. package/devops-studio/package-lock.json +871 -0
  50. package/devops-studio/package.json +12 -0
  51. package/package.json +5 -2
  52. package/scripts/postinstall.js +44 -8
  53. package/server-studio/.json-404-guard +1 -0
  54. package/server-studio/index.html +283 -0
  55. package/server-studio/logo.svg +22 -0
  56. package/server-studio/main.js +133 -0
  57. package/server-studio/package-lock.json +1179 -0
  58. package/server-studio/package.json +15 -0
  59. package/server-studio/router.php +99 -0
  60. package/src/App.php +29 -0
  61. package/src/Commands/AddCommand.php +26 -9
  62. package/src/Commands/DbExportCommand.php +131 -0
  63. package/src/Commands/DbStartCommand.php +46 -0
  64. package/src/Commands/DevopsCommand.php +35 -0
  65. package/src/Commands/GoCommand.php +48 -48
  66. package/src/Commands/ListCommand.php +68 -68
  67. package/src/Commands/MakeApiCommand.php +6 -1
  68. package/src/Commands/MakeViewCommand.php +25 -2
  69. package/src/Commands/NewProjectCommand.php +16 -11
  70. package/src/Commands/OptimizeCommand.php +61 -0
  71. package/src/Commands/RemoveCommand.php +36 -7
  72. package/src/Commands/ServeCommand.php +46 -91
  73. package/src/Commands/ShowCommand.php +24 -24
  74. package/src/Commands/UpgradeCommand.php +39 -10
  75. package/stubs/make/api-switch-case.stub +1 -1
  76. package/stubs/make/auth-api-standart.stub +20 -0
  77. package/stubs/make/auth-api-switch-case.stub +38 -0
  78. package/stubs/make/auth-view.stub +26 -0
  79. package/stubs/make/class.stub +10 -2
  80. package/stubs/make/view.stub +3 -0
  81. package/stubs/service/image.stub +334 -334
  82. package/stubs/service/iyzico.stub +637 -637
  83. package/stubs/service/jwt.stub +312 -312
  84. package/stubs/service/phpmailer.stub +143 -143
  85. package/stubs/service/pusher.stub +232 -232
  86. package/stubs/service/qrcode.stub +169 -169
  87. package/stubs/service/redis.stub +361 -361
  88. package/stubs/service/s3.stub +377 -377
  89. package/stubs/service/stripe.stub +526 -526
  90. package/stubs/service/twilio.stub +361 -361
@@ -1,39 +1,5 @@
1
- /* ==========================================================================
2
- ArtiFrame Global Variables & Base Styles
3
- (Driven by data-attributes: data-theme and data-mode)
4
- ========================================================================== */
1
+ @import 'root.css';
5
2
 
6
- /* Light Mode (Varsayılan) */
7
- html[data-theme="default"][data-mode="light"] {
8
- --accent: #3b82f6;
9
- --accent-hover: #2563eb;
10
- --accent-bg: rgba(59, 130, 246, 0.08);
11
- --menu-bg: #ffffff;
12
- --canvas-bg: #f8fafc;
13
- --card-bg: #ffffff;
14
- --border: #e2e8f0;
15
- --text-main: #0f172a;
16
- --text-muted: #64748b;
17
- --danger: #ef4444;
18
- --success: #10b981;
19
- --warning: #f59e0b;
20
- }
21
-
22
- /* Dark Mode */
23
- html[data-theme="default"][data-mode="dark"] {
24
- --accent: #60a5fa;
25
- --accent-hover: #93c5fd;
26
- --accent-bg: rgba(96, 165, 250, 0.15);
27
- --menu-bg: #141619;
28
- --canvas-bg: #0b0c0e;
29
- --card-bg: #1a1d21;
30
- --border: #262b32;
31
- --text-main: #f8fafc;
32
- --text-muted: #94a3b8;
33
- --danger: #f87171;
34
- --success: #34d399;
35
- --warning: #fbbf24;
36
- }
37
3
 
38
4
  /* Base Reset & Genel Stiller */
39
5
  *, *::before, *::after {
@@ -45,17 +11,988 @@ html[data-theme="default"][data-mode="dark"] {
45
11
  body {
46
12
  background-color: var(--canvas-bg);
47
13
  color: var(--text-main);
48
- font-family: 'Inter', system-ui, -apple-system, sans-serif;
14
+ font-family: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;
49
15
  line-height: 1.5;
50
16
  transition: background-color 0.3s ease, color 0.3s ease;
51
17
  }
52
18
 
53
19
  a {
54
- color: var(--accent);
20
+ color: var(--brand-primary);
55
21
  text-decoration: none;
56
22
  transition: color 0.2s ease;
57
23
  }
58
24
 
59
25
  a:hover {
60
- color: var(--accent-hover);
26
+ color: var(--brand-secondary);
27
+ }
28
+
29
+ /* ==========================================================================
30
+ Toaster (Toast Notifications)
31
+ ========================================================================== */
32
+ .toast-container {
33
+ position: fixed;
34
+ bottom: 2rem;
35
+ right: 2rem;
36
+ z-index: 10005;
37
+ display: flex;
38
+ flex-direction: column;
39
+ gap: 1rem;
40
+ pointer-events: none;
41
+ }
42
+
43
+ .toast {
44
+ background: var(--card-bg);
45
+ color: var(--text-main);
46
+ border: 1px solid var(--border);
47
+ border-left: 4px solid var(--success);
48
+ border-radius: 8px;
49
+ padding: 1rem 1.5rem;
50
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
51
+ }
52
+
53
+ /* ==========================================================================
54
+ Global Dropdown Menüler (Sil/Düzenle vb. için)
55
+ ========================================================================== */
56
+ .arti-dropdown {
57
+ display: none;
58
+ position: absolute;
59
+ right: 0;
60
+ top: 100%;
61
+ margin-top: 5px;
62
+ border: 1px solid var(--border);
63
+ border-radius: 12px;
64
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
65
+ z-index: 100;
66
+ min-width: 150px;
67
+ padding: 6px 0;
68
+ text-align: left;
69
+ backdrop-filter: blur(16px);
70
+ -webkit-backdrop-filter: blur(16px);
71
+ overflow: hidden;
72
+ }
73
+
74
+ html[data-mode="light"] .arti-dropdown {
75
+ background: rgba(255, 255, 255, 0.75);
76
+ }
77
+
78
+ html[data-mode="dark"] .arti-dropdown {
79
+ background: rgba(37, 34, 51, 0.75);
80
+ }
81
+
82
+ .arti-dropdown-item {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: 8px;
86
+ padding: 10px 16px;
87
+ text-decoration: none;
88
+ font-size: 0.9rem;
89
+ font-weight: 500;
90
+ transition: background-color 0.2s ease, color 0.2s ease;
91
+ }
92
+
93
+ html[data-mode="light"] .arti-dropdown-item:hover {
94
+ background-color: rgba(0, 0, 0, 0.05);
95
+ }
96
+
97
+ html[data-mode="dark"] .arti-dropdown-item:hover {
98
+ background-color: rgba(255, 255, 255, 0.1);
99
+ }
100
+
101
+ .arti-dropdown-item.edit-btn {
102
+ color: var(--text-main);
103
+ }
104
+ .arti-dropdown-item.delete-btn {
105
+ color: var(--danger);
106
+ }
107
+ .arti-dropdown-item i {
108
+ width: 16px;
109
+ text-align: center;
110
+ }
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 1rem;
114
+ pointer-events: auto;
115
+ transform: translateX(120%);
116
+ opacity: 0;
117
+ transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
118
+ }
119
+
120
+ .toast.show {
121
+ transform: translateX(0);
122
+ opacity: 1;
123
+ }
124
+
125
+ .toast.success { border-left-color: var(--success); }
126
+ .toast.error { border-left-color: var(--danger); }
127
+ .toast.warning { border-left-color: var(--warning); }
128
+ .toast.info { border-left-color: var(--info); }
129
+
130
+ .toast-message {
131
+ font-size: 0.9rem;
132
+ font-weight: 600;
133
+ }
134
+ @media (max-width: 576px) {
135
+ .toast-container { bottom: 1rem; right: 1rem; left: 1rem; }
136
+ .toast { width: 100%; justify-content: center; transform: translateY(120%); }
137
+ .toast.show { transform: translateY(0); }
138
+ }
139
+
140
+ /* ==========================================================================
141
+ Main Application Layout
142
+ ========================================================================== */
143
+ .app-layout {
144
+ display: flex;
145
+ min-height: 100vh;
146
+ width: 100%;
147
+ background-color: var(--canvas-bg);
148
+ overflow: hidden;
149
+ position: relative;
150
+ }
151
+
152
+ .app-main-content {
153
+ flex: 1;
154
+ display: flex;
155
+ flex-direction: column;
156
+ height: 100vh;
157
+ overflow-y: auto;
158
+ overflow-x: hidden;
159
+ position: relative;
160
+ padding: 0; /* Header'ın tepeye yapışabilmesi için sıfırlandı */
161
+ z-index: 1;
162
+ }
163
+
164
+ /* Sayfaların asıl içerik alanı */
165
+ .main-content {
166
+ flex: 1;
167
+ padding: 2rem;
168
+ }
169
+
170
+ @media (max-width: 992px) {
171
+ .main-content {
172
+ padding: 1.25rem;
173
+ }
174
+ }
175
+
176
+ /* Mobil Scroll Düzeltmesi (Native Body Scroll) */
177
+ @media (max-width: 768px) {
178
+ html, body {
179
+ overflow-x: clip; /* Sadece yatay taşmaları kırpar, dikey scroll'u bozmaz (iOS uyumlu) */
180
+ overflow-y: visible; /* Sayfanın kendisi kaydırılır */
181
+ }
182
+ .app-layout {
183
+ display: block;
184
+ min-height: 100vh;
185
+ overflow: visible !important; /* Asla iç scroll olmamalı */
186
+ }
187
+ .app-main-content {
188
+ display: block;
189
+ height: auto !important;
190
+ overflow: visible !important; /* Asla iç scroll olmamalı */
191
+ padding-bottom: 100px; /* FAB menüsü yüksekliği (60px) + bottom (32px) için kesin boşluk */
192
+ }
193
+ }
194
+
195
+ /* --- Global Animasyonlu Arka Plan Şekilleri --- */
196
+ .bg-shape {
197
+ position: absolute;
198
+ border-radius: 50%;
199
+ filter: blur(100px);
200
+ z-index: 0;
201
+ opacity: 0.2;
202
+ animation: float 12s infinite alternate ease-in-out;
203
+ pointer-events: none;
204
+ }
205
+
206
+ .bg-primary {
207
+ background: var(--brand-primary);
208
+ width: 600px;
209
+ height: 600px;
210
+ top: -200px;
211
+ left: -200px;
212
+ animation-delay: 0s;
213
+ }
214
+
215
+ .bg-secondary {
216
+ background: var(--brand-secondary);
217
+ width: 500px;
218
+ height: 500px;
219
+ bottom: -150px;
220
+ right: -100px;
221
+ animation-delay: -4s;
222
+ }
223
+
224
+ .bg-accent {
225
+ background: var(--brand-accent);
226
+ width: 400px;
227
+ height: 400px;
228
+ bottom: 30%;
229
+ left: 40%;
230
+ animation-delay: -8s;
231
+ opacity: 0.3;
232
+ }
233
+
234
+ @keyframes float {
235
+ 0% { transform: translate(0, 0) scale(1); }
236
+ 100% { transform: translate(40px, 50px) scale(1.1); }
237
+ }
238
+
239
+ /* ==========================================================================
240
+ Global Buttons (Brand Guidelines)
241
+ ========================================================================== */
242
+ .btn {
243
+ padding: 0.75rem 1.5rem;
244
+ font-weight: 600;
245
+ font-size: 0.95rem;
246
+ border-radius: 0.75rem;
247
+ transition: all 0.2s ease;
248
+ cursor: pointer;
249
+ display: inline-flex;
250
+ align-items: center;
251
+ justify-content: center;
252
+ border: 1px solid transparent;
253
+ font-family: inherit;
254
+ text-align: center;
255
+ line-height: 1.5;
256
+ }
257
+
258
+ .btn:disabled {
259
+ opacity: 0.6;
260
+ cursor: not-allowed;
261
+ }
262
+
263
+ .btn-primary {
264
+ background-color: var(--brand-primary);
265
+ color: #ffffff;
266
+ }
267
+
268
+ .btn-primary:hover:not(:disabled) {
269
+ background-color: var(--brand-secondary);
270
+ color: #ffffff;
271
+ }
272
+
273
+ .btn-secondary {
274
+ background-color: var(--brand-secondary);
275
+ color: #ffffff;
276
+ }
277
+
278
+ .btn-secondary:hover:not(:disabled) {
279
+ background-color: var(--brand-primary);
280
+ color: #ffffff;
281
+ }
282
+
283
+ .btn-outline {
284
+ background-color: transparent;
285
+ border-color: var(--border);
286
+ color: var(--text-main);
287
+ }
288
+
289
+ .btn-outline:hover:not(:disabled) {
290
+ background-color: var(--border);
291
+ color: var(--text-main);
292
+ }
293
+
294
+ [data-mode="dark"] .btn-outline:hover:not(:disabled) {
295
+ background-color: rgba(255, 255, 255, 0.05);
296
+ }
297
+
298
+ /* ==========================================================================
299
+ Page Headers (Inside App)
300
+ ========================================================================== */
301
+ .page-header {
302
+ margin-bottom: 2rem;
303
+ padding: 1rem 1.5rem;
304
+ background: var(--card-bg);
305
+ border: 1px solid var(--border);
306
+ border-radius: 1rem;
307
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.02);
308
+ position: relative;
309
+ overflow: hidden;
310
+ }
311
+
312
+ /* Yan vurgu çizgisi (İnce ve minimal) */
313
+ .page-header::before {
314
+ content: '';
315
+ position: absolute;
316
+ top: 0;
317
+ left: 0;
318
+ width: 4px;
319
+ height: 100%;
320
+ background: linear-gradient(to bottom, var(--brand-primary), var(--brand-secondary));
321
+ border-radius: 1rem 0 0 1rem;
322
+ }
323
+
324
+ .page-header h1 {
325
+ font-size: 1.5rem;
326
+ font-weight: 700;
327
+ color: var(--text-main);
328
+ margin-bottom: 0.2rem;
329
+ position: relative;
330
+ z-index: 1;
331
+ }
332
+
333
+ .page-header p {
334
+ color: var(--text-muted);
335
+ font-size: 0.9rem;
336
+ position: relative;
337
+ z-index: 1;
338
+ }
339
+
340
+ @media (max-width: 768px) {
341
+ .page-header {
342
+ padding: 0.75rem 1rem 0.75rem 1.25rem;
343
+ margin-bottom: 1.5rem;
344
+ border-radius: 0.75rem;
345
+ }
346
+ .page-header::before {
347
+ border-radius: 0.75rem 0 0 0.75rem;
348
+ width: 3px;
349
+ }
350
+ .page-header h1 {
351
+ font-size: 1.25rem;
352
+ }
353
+ }
354
+
355
+ /* --- Global Confirm Modal --- */
356
+ .confirm-overlay {
357
+ position: fixed;
358
+ top: 0; left: 0; width: 100%; height: 100%;
359
+ background: rgba(0, 0, 0, 0.4);
360
+ backdrop-filter: blur(12px);
361
+ -webkit-backdrop-filter: blur(12px);
362
+ z-index: 9999;
363
+ display: flex;
364
+ align-items: center;
365
+ justify-content: center;
366
+ opacity: 0;
367
+ visibility: hidden;
368
+ transition: all 0.3s ease;
369
+ }
370
+
371
+ .confirm-overlay.show {
372
+ opacity: 1;
373
+ visibility: visible;
374
+ }
375
+
376
+ .confirm-modal {
377
+ background: var(--card-bg);
378
+ border: 1px solid var(--border);
379
+ border-radius: 16px;
380
+ padding: 24px;
381
+ width: 90%;
382
+ max-width: 400px;
383
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
384
+ transform: scale(0.95) translateY(10px);
385
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
386
+ }
387
+
388
+ .confirm-overlay.show .confirm-modal {
389
+ transform: scale(1) translateY(0);
390
+ }
391
+
392
+ .confirm-title {
393
+ font-size: 1.2rem;
394
+ font-weight: 600;
395
+ color: var(--text-main);
396
+ margin-bottom: 12px;
397
+ }
398
+
399
+ .confirm-message {
400
+ font-size: 0.95rem;
401
+ color: var(--text-muted);
402
+ line-height: 1.5;
403
+ margin-bottom: 24px;
404
+ }
405
+
406
+ .confirm-prompt-input {
407
+ width: 100%;
408
+ margin-bottom: 24px;
409
+ margin-top: -8px; /* Pulled up slightly closer to the message */
410
+ padding: 0.75rem 1rem;
411
+ background: var(--canvas-bg);
412
+ border: 1px solid var(--border);
413
+ border-radius: 8px;
414
+ color: var(--text-main);
415
+ font-family: inherit;
416
+ transition: border-color 0.2s, box-shadow 0.2s;
417
+ }
418
+
419
+ .confirm-prompt-input:focus {
420
+ border-color: var(--brand-primary);
421
+ box-shadow: 0 0 0 3px rgba(var(--brand-primary-rgb), 0.15);
422
+ outline: none;
423
+ }
424
+
425
+ .confirm-actions {
426
+ display: flex;
427
+ justify-content: flex-end;
428
+ gap: 12px;
429
+ }
430
+
431
+ .confirm-actions .btn {
432
+ padding: 8px 20px;
433
+ font-size: 0.95rem;
434
+ }
435
+
436
+ /* --- Global Comment Bottom Sheet Modal --- */
437
+ .cm-overlay {
438
+ position: fixed;
439
+ top: 0; left: 0; right: 0; bottom: 0;
440
+ background: rgba(0, 0, 0, 0.5);
441
+ z-index: 9999;
442
+ opacity: 0;
443
+ visibility: hidden;
444
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
445
+ display: flex;
446
+ align-items: flex-end;
447
+ /* Mobilde overlay'e dokunulduğunda sayfanın kaymasını engelle */
448
+ touch-action: none;
449
+ overscroll-behavior: none;
450
+ }
451
+ .cm-overlay.show {
452
+ opacity: 1;
453
+ visibility: visible;
454
+ }
455
+ .cm-modal {
456
+ width: 100%;
457
+ max-width: 600px;
458
+ margin: 0 auto;
459
+ background: var(--canvas-bg);
460
+ border-radius: 20px 20px 0 0;
461
+ transform: translateY(100%);
462
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
463
+ display: flex;
464
+ flex-direction: column;
465
+ max-height: 85vh; /* 85% of viewport height */
466
+ box-shadow: 0 -4px 20px rgba(0,0,0,0.1);
467
+ }
468
+ @media (min-width: 640px) {
469
+ .cm-overlay {
470
+ align-items: center; /* Center on desktop */
471
+ }
472
+ .cm-modal {
473
+ border-radius: 16px;
474
+ max-height: 80vh;
475
+ }
476
+ }
477
+ .cm-overlay.show .cm-modal {
478
+ transform: translateY(0);
479
+ }
480
+ .cm-header {
481
+ padding: 1rem 1.25rem;
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: space-between;
485
+ border-bottom: 1px solid var(--border);
486
+ flex-shrink: 0;
487
+ }
488
+ .cm-header h2 {
489
+ font-size: 1.1rem;
490
+ font-weight: 700;
491
+ display: flex;
492
+ align-items: center;
493
+ gap: .5rem;
494
+ margin: 0;
495
+ }
496
+ .cm-close {
497
+ background: transparent;
498
+ border: none;
499
+ color: var(--text-muted);
500
+ font-size: 1.25rem;
501
+ cursor: pointer;
502
+ width: 36px;
503
+ height: 36px;
504
+ display: flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ border-radius: 50%;
508
+ transition: all 0.2s;
509
+ }
510
+ .cm-close:hover {
511
+ background: var(--bg-hover);
512
+ color: var(--text-main);
513
+ }
514
+ .cm-body {
515
+ flex: 1;
516
+ overflow-y: auto;
517
+ -webkit-overflow-scrolling: touch; /* iOS momentum scrolling */
518
+ overscroll-behavior: contain; /* Scroll zincirini kır */
519
+ padding: 1rem 1.25rem;
520
+ display: flex;
521
+ flex-direction: column;
522
+ gap: .75rem;
523
+ }
524
+ /* Input Container Fixed at Bottom */
525
+ .cm-footer {
526
+ padding: .75rem 1.25rem;
527
+ border-top: 1px solid var(--border);
528
+ background: var(--canvas-bg);
529
+ flex-shrink: 0;
530
+ /* Safe Area Inset Bottom for Mobile Navigation Bars */
531
+ padding-bottom: calc(0.75rem + env(safe-area-inset-bottom));
532
+ }
533
+
534
+ /* ---- Yorum Listesi ve Öğeleri (Global) ---- */
535
+ .sq-yorumlar-list { display: flex; flex-direction: column; gap: .6rem; }
536
+ .sq-yorumlar-loading { text-align: center; color: var(--text-muted); font-size: .85rem; padding: 1rem; }
537
+
538
+ .sq-yorum-item {
539
+ display: flex;
540
+ gap: .6rem;
541
+ font-size: .87rem;
542
+ position: relative;
543
+ }
544
+ .sq-yorum-item.sq-yorum-reply {
545
+ margin-left: 2.8rem;
546
+ }
547
+ .sq-yorum-item .sq-avatar { width: 32px; height: 32px; flex-shrink: 0; border-radius: 50%; object-fit: cover; }
548
+ .sq-yorum-bubble {
549
+ background: transparent;
550
+ padding: .2rem 0;
551
+ flex: 1;
552
+ }
553
+ .sq-yorum-header {
554
+ display: flex;
555
+ align-items: center;
556
+ gap: .5rem;
557
+ margin-bottom: .2rem;
558
+ flex-wrap: wrap;
559
+ }
560
+ .sq-yorum-header strong { font-size: .82rem; color: var(--text-main); }
561
+ .sq-yorum-header span { font-size: .75rem; color: var(--text-muted); }
562
+ .sq-yorum-header .sq-yorum-role { color: var(--brand-secondary); font-weight: 600; }
563
+ .sq-yorum-metin { color: var(--text-main); line-height: 1.45; word-break: break-word; }
564
+ .sq-yorum-footer {
565
+ display: flex;
566
+ align-items: center;
567
+ gap: .75rem;
568
+ margin-top: .4rem;
569
+ }
570
+ .sq-yorum-action {
571
+ background: transparent;
572
+ border: none;
573
+ color: var(--text-muted);
574
+ font-size: .75rem;
575
+ font-weight: 600;
576
+ cursor: pointer;
577
+ padding: 0;
578
+ display: flex;
579
+ align-items: center;
580
+ gap: .3rem;
581
+ transition: color .2s;
582
+ }
583
+ .sq-yorum-action:hover { color: var(--brand-primary); }
584
+ .sq-yorum-action.delete:hover { color: var(--danger); }
585
+ .sq-yorum-action.edit:hover { color: var(--brand-secondary, #7c3aed); }
586
+
587
+ .sq-edit-area {
588
+ display: flex;
589
+ flex-direction: column;
590
+ gap: .5rem;
591
+ margin-top: .5rem;
592
+ position: relative;
593
+ }
594
+ .sq-edit-textarea {
595
+ width: 100%;
596
+ min-height: 72px;
597
+ padding: .6rem .75rem;
598
+ border-radius: .6rem;
599
+ border: 1px solid var(--border);
600
+ background: var(--bg-main);
601
+ color: var(--text-main);
602
+ font-size: .9rem;
603
+ font-family: inherit;
604
+ outline: none;
605
+ transition: border-color .2s;
606
+ cursor: text;
607
+ white-space: pre-wrap;
608
+ word-break: break-word;
609
+ box-sizing: border-box;
610
+ }
611
+ .sq-edit-textarea:focus { border-color: var(--brand-primary); }
612
+ .sq-edit-textarea:empty::before {
613
+ content: attr(data-placeholder);
614
+ color: var(--text-muted);
615
+ pointer-events: none;
616
+ }
617
+ .sq-edit-mention-dropdown {
618
+ position: absolute;
619
+ bottom: 100%;
620
+ left: 0;
621
+ right: 0;
622
+ background: var(--card-bg);
623
+ border: 1px solid var(--border);
624
+ border-radius: .75rem;
625
+ box-shadow: 0 8px 24px rgba(0,0,0,0.12);
626
+ max-height: 180px;
627
+ overflow-y: auto;
628
+ z-index: 200;
629
+ display: none;
630
+ }
631
+ .sq-edit-actions {
632
+ display: flex;
633
+ gap: .5rem;
634
+ justify-content: flex-end;
635
+ }
636
+
637
+ /* Yorum Input Alanı */
638
+ .sq-yorum-input-wrap {
639
+ display: flex;
640
+ flex-direction: column;
641
+ gap: .5rem;
642
+ }
643
+ .sq-reply-status {
644
+ display: none;
645
+ align-items: center;
646
+ justify-content: space-between;
647
+ background: var(--bg-hover);
648
+ padding: .4rem .8rem;
649
+ border-radius: .5rem;
650
+ font-size: .82rem;
651
+ color: var(--text-muted);
652
+ }
653
+ .sq-reply-status.active { display: flex; }
654
+ .sq-reply-status strong { color: var(--text-main); margin-left: .3rem; }
655
+ .sq-cancel-reply {
656
+ background: transparent;
657
+ border: none;
658
+ color: var(--danger);
659
+ cursor: pointer;
660
+ font-size: .75rem;
661
+ padding: 0 .4rem;
662
+ }
663
+ .sq-yorum-input-row {
664
+ display: flex;
665
+ gap: .5rem;
666
+ align-items: flex-end;
667
+ }
668
+ .sq-yorum-input {
669
+ flex: 1;
670
+ border: 1.5px solid var(--border);
671
+ border-radius: .75rem;
672
+ padding: .6rem .9rem;
673
+ font-size: .88rem;
674
+ font-family: inherit;
675
+ resize: none;
676
+ background: var(--canvas-bg);
677
+ color: var(--text-main);
678
+ transition: border-color .2s;
679
+ }
680
+ .sq-yorum-input:focus { outline: none; border-color: var(--brand-primary); }
681
+
682
+ .sq-toggle-replies {
683
+ background: transparent;
684
+ border: none;
685
+ color: var(--text-muted);
686
+ font-size: .8rem;
687
+ font-weight: 600;
688
+ cursor: pointer;
689
+ padding: .3rem 0;
690
+ margin-left: 2.8rem;
691
+ display: flex;
692
+ align-items: center;
693
+ gap: .4rem;
694
+ align-self: flex-start;
695
+ }
696
+ .sq-toggle-replies::before {
697
+ content: "—";
698
+ margin-right: .2rem;
699
+ }
700
+ .sq-toggle-replies:hover { color: var(--text-main); }
701
+ .sq-replies-container {
702
+ display: none;
703
+ flex-direction: column;
704
+ gap: .6rem;
705
+ margin-top: .2rem;
706
+ }
707
+ .sq-replies-container.open {
708
+ display: flex;
709
+ }
710
+
711
+ /* ---- Mention (Etiket) Sistemi ---- */
712
+
713
+ /* Contenteditable editor - textarea görünümünü taklit eder */
714
+ .cm-editor {
715
+ min-height: 44px;
716
+ max-height: 120px;
717
+ overflow-y: auto;
718
+ -webkit-overflow-scrolling: touch;
719
+ line-height: 1.5;
720
+ word-break: break-word;
721
+ white-space: pre-wrap;
722
+ cursor: text;
723
+ }
724
+ /* Placeholder emülasyonu */
725
+ .cm-editor:empty::before {
726
+ content: attr(data-placeholder);
727
+ color: var(--text-muted);
728
+ pointer-events: none;
729
+ }
730
+ .cm-editor:focus { outline: none; border-color: var(--brand-primary); }
731
+
732
+ /* @mention tag - input içinde mor hap gibi görünür */
733
+ .cm-mention-tag {
734
+ display: inline-block;
735
+ background: rgba(139, 92, 246, 0.15);
736
+ color: var(--brand-primary);
737
+ border-radius: 4px;
738
+ padding: 0 3px;
739
+ font-weight: 600;
740
+ font-size: .87em;
741
+ cursor: default;
742
+ user-select: all;
743
+ white-space: nowrap;
744
+ }
745
+
746
+ /* @mention link - yorum metninde mor tıklanabilir bağlantı */
747
+ .cm-mention-link {
748
+ color: var(--brand-primary);
749
+ font-weight: 600;
750
+ text-decoration: none;
751
+ border-radius: 3px;
752
+ padding: 0 2px;
753
+ transition: background .15s;
754
+ }
755
+ .cm-mention-link:hover {
756
+ background: rgba(139, 92, 246, 0.12);
757
+ text-decoration: underline;
758
+ }
759
+
760
+ /* Autocomplete Dropdown */
761
+ .cm-mention-dropdown {
762
+ display: none;
763
+ position: absolute;
764
+ bottom: calc(100% + 4px);
765
+ left: 0;
766
+ right: 0;
767
+ background: var(--card-bg);
768
+ border: 1px solid var(--border);
769
+ border-radius: .75rem;
770
+ box-shadow: 0 -4px 16px rgba(0,0,0,0.15);
771
+ overflow: hidden;
772
+ z-index: 10001;
773
+ max-height: 220px;
774
+ overflow-y: auto;
775
+ }
776
+ /* Footer'ı relative yap ki dropdown absolute çalışsın */
777
+ .cm-footer .sq-yorum-input-wrap {
778
+ position: relative;
779
+ }
780
+
781
+ .cm-mention-dropdown {
782
+ position: absolute;
783
+ bottom: calc(100% + 5px);
784
+ left: 0;
785
+ width: 250px;
786
+ background: var(--card-bg);
787
+ border: 1px solid var(--border);
788
+ border-radius: .75rem;
789
+ box-shadow: 0 -4px 16px rgba(0,0,0,0.15);
790
+ overflow: hidden;
791
+ z-index: 10001;
792
+ max-height: 220px;
793
+ overflow-y: auto;
794
+ }
795
+
796
+ @media (max-width: 576px) {
797
+ .cm-mention-dropdown { width: 100%; left: 0; right: 0; }
798
+ .cm-mention-item { padding: 8px 12px; }
799
+ }
800
+
801
+ .cm-mention-item {
802
+ display: flex;
803
+ align-items: center;
804
+ gap: .6rem;
805
+ padding: .55rem .9rem;
806
+ cursor: pointer;
807
+ transition: background .15s;
808
+ }
809
+ .cm-mention-item:hover,
810
+ .cm-mention-item.active {
811
+ background: var(--bg-hover);
812
+ }
813
+ .cm-mention-item img {
814
+ width: 32px;
815
+ height: 32px;
816
+ border-radius: 50%;
817
+ object-fit: cover;
818
+ flex-shrink: 0;
819
+ }
820
+ .cm-mention-info {
821
+ display: flex;
822
+ flex-direction: column;
823
+ gap: .1rem;
824
+ }
825
+ .cm-mention-info strong {
826
+ font-size: .85rem;
827
+ color: var(--text-main);
828
+ line-height: 1.2;
829
+ }
830
+ .cm-mention-info span {
831
+ font-size: .75rem;
832
+ color: var(--text-muted);
833
+ }
834
+
835
+ /* ==========================================================================
836
+ Viewer.js Custom Theme (Premium Mobile Feel)
837
+ ========================================================================== */
838
+ .viewer-container {
839
+ background-color: rgba(0, 0, 0, 0.95) !important;
840
+ backdrop-filter: blur(8px);
841
+ z-index: 10005 !important;
842
+ }
843
+ .viewer-button {
844
+ background-color: rgba(255, 255, 255, 0.1) !important;
845
+ border-radius: 50% !important;
846
+ transition: background-color 0.2s;
847
+ }
848
+ .viewer-button:hover {
849
+ background-color: rgba(255, 255, 255, 0.25) !important;
850
+ }
851
+ .viewer-close {
852
+ top: 15px !important;
853
+ right: 15px !important;
854
+ width: 40px !important;
855
+ height: 40px !important;
856
+ }
857
+
858
+ /* Özel Masaüstü Okları (Enjekte Edilen DOM) */
859
+ .custom-viewer-arrow {
860
+ position: absolute;
861
+ top: 50%;
862
+ transform: translateY(-50%);
863
+ width: 48px;
864
+ height: 48px;
865
+ background-color: rgba(255, 255, 255, 0.1);
866
+ border-radius: 50%;
867
+ color: #fff;
868
+ font-size: 1.25rem;
869
+ z-index: 10010;
870
+ cursor: pointer;
871
+ display: flex;
872
+ align-items: center;
873
+ justify-content: center;
874
+ transition: background-color 0.2s, transform 0.2s;
875
+ }
876
+ .custom-viewer-arrow:hover {
877
+ background-color: rgba(255, 255, 255, 0.25);
878
+ transform: translateY(-50%) scale(1.05);
879
+ }
880
+ .custom-viewer-arrow.prev { left: 20px; }
881
+ .custom-viewer-arrow.next { right: 20px; }
882
+
883
+ /* Sadece Masaüstünde Göster */
884
+ @media (max-width: 768px) {
885
+ .custom-viewer-arrow { display: none !important; }
886
+ }
887
+
888
+ /* ==========================================================================
889
+ MODERATÖR GLOBAL STİLLERİ
890
+ ========================================================================== */
891
+
892
+ /* Avatar Çerçeve Animasyonu */
893
+ .is-mod-avatar {
894
+ border: none;
895
+ padding: 4px; /* Gradient kalınlığı */
896
+ background: transparent;
897
+ position: relative;
898
+ border-radius: 50%;
899
+ display: inline-flex;
900
+ z-index: 1;
901
+ }
902
+ .is-mod-avatar::before {
903
+ content: '';
904
+ position: absolute;
905
+ inset: 0;
906
+ border-radius: 50%;
907
+ background: linear-gradient(45deg, var(--brand-primary), #a855f7, var(--brand-primary));
908
+ background-size: 200% 200%;
909
+ animation: modAvatarGlow 3s ease infinite;
910
+ z-index: -1;
911
+ }
912
+ .is-mod-avatar img {
913
+ border: 3px solid var(--card-bg); /* Görseli arka plandan koparır */
914
+ width: 100%;
915
+ height: 100%;
916
+ border-radius: 50%;
917
+ object-fit: cover;
918
+ display: block;
919
+ }
920
+
921
+ @keyframes modAvatarGlow {
922
+ 0% { background-position: 0% 50%; }
923
+ 50% { background-position: 100% 50%; }
924
+ 100% { background-position: 0% 50%; }
925
+ }
926
+
927
+ /* Tipografi (İsim / Kullanıcı Adı) */
928
+ .is-mod-text {
929
+ background: linear-gradient(90deg, var(--brand-primary), #a855f7);
930
+ -webkit-background-clip: text;
931
+ -webkit-text-fill-color: transparent;
932
+ display: inline-block;
933
+ font-weight: 800;
934
+ }
935
+ [data-mode="dark"] .is-mod-text {
936
+ background: linear-gradient(90deg, #818cf8, #c084fc);
937
+ -webkit-background-clip: text;
938
+ -webkit-text-fill-color: transparent;
939
+ }
940
+
941
+ /* Iyzico Secure Wrapper */
942
+ .iyzico-secure-wrapper {
943
+ background: var(--card-bg);
944
+ border: 1px solid var(--border-color);
945
+ border-radius: 12px;
946
+ padding: 15px;
947
+ display: flex;
948
+ flex-direction: column;
949
+ align-items: center;
950
+ gap: 12px;
951
+ margin-top: 20px;
952
+ text-align: center;
953
+ }
954
+
955
+ .iyzico-header {
956
+ font-size: 0.85rem;
957
+ font-weight: 600;
958
+ color: var(--text-muted);
959
+ display: flex;
960
+ align-items: center;
961
+ gap: 6px;
962
+ }
963
+
964
+ .iyzico-header i {
965
+ color: var(--success);
966
+ }
967
+
968
+ .iyzico-logo {
969
+ height: 24px;
970
+ }
971
+
972
+ .iyzico-logo img {
973
+ height: 100%;
974
+ object-fit: contain;
975
+ }
976
+
977
+ .iyzico-schemes {
978
+ display: flex;
979
+ align-items: center;
980
+ justify-content: center;
981
+ gap: 8px;
982
+ flex-wrap: wrap;
983
+ background: #fff; /* Şemalar renkli olduğu için beyaz zemin */
984
+ padding: 6px 10px;
985
+ border-radius: 8px;
986
+ border: 1px solid rgba(0,0,0,0.05);
987
+ }
988
+
989
+ .iyzico-schemes img {
990
+ height: 20px;
991
+ object-fit: contain;
992
+ }
993
+
994
+ .iyzico-schemes img[alt="Amex"] {
995
+ background: #006fcf; /* Amex Mavi Zemin */
996
+ padding: 2px 4px;
997
+ border-radius: 4px;
61
998
  }