git-ew 0.1.0__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.
@@ -0,0 +1,608 @@
1
+ /* Git-EW Styles - GitHub-inspired */
2
+
3
+ :root {
4
+ --color-bg-primary: #ffffff;
5
+ --color-bg-secondary: #f6f8fa;
6
+ --color-bg-tertiary: #f0f3f6;
7
+ --color-border: #d0d7de;
8
+ --color-text-primary: #1f2328;
9
+ --color-text-secondary: #59636e;
10
+ --color-link: #0969da;
11
+ --color-link-hover: #0550ae;
12
+ --color-success: #1a7f37;
13
+ --color-danger: #cf222e;
14
+ --color-accent: #0969da;
15
+ }
16
+
17
+ * {
18
+ margin: 0;
19
+ padding: 0;
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ body {
24
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
25
+ font-size: 14px;
26
+ line-height: 1.5;
27
+ color: var(--color-text-primary);
28
+ background-color: var(--color-bg-secondary);
29
+ }
30
+
31
+ .container {
32
+ max-width: 1280px;
33
+ margin: 0 auto;
34
+ padding: 0 16px;
35
+ }
36
+
37
+ /* Header */
38
+ .header {
39
+ background-color: var(--color-bg-primary);
40
+ border-bottom: 1px solid var(--color-border);
41
+ padding: 16px 0;
42
+ }
43
+
44
+ .header-content {
45
+ display: flex;
46
+ justify-content: space-between;
47
+ align-items: center;
48
+ }
49
+
50
+ .logo a {
51
+ font-size: 20px;
52
+ font-weight: 600;
53
+ color: var(--color-text-primary);
54
+ text-decoration: none;
55
+ }
56
+
57
+ .nav {
58
+ display: flex;
59
+ gap: 16px;
60
+ align-items: center;
61
+ }
62
+
63
+ .nav-link {
64
+ color: var(--color-text-primary);
65
+ text-decoration: none;
66
+ padding: 8px 16px;
67
+ border-radius: 6px;
68
+ transition: background-color 0.2s;
69
+ }
70
+
71
+ .nav-link:hover {
72
+ background-color: var(--color-bg-secondary);
73
+ }
74
+
75
+ .nav-link.active {
76
+ background-color: var(--color-bg-tertiary);
77
+ font-weight: 600;
78
+ }
79
+
80
+ /* Main Content */
81
+ .main {
82
+ padding: 24px 0;
83
+ min-height: calc(100vh - 200px);
84
+ }
85
+
86
+ /* Buttons */
87
+ .btn {
88
+ display: inline-block;
89
+ padding: 5px 16px;
90
+ font-size: 14px;
91
+ font-weight: 500;
92
+ line-height: 20px;
93
+ white-space: nowrap;
94
+ vertical-align: middle;
95
+ cursor: pointer;
96
+ border: 1px solid;
97
+ border-radius: 6px;
98
+ transition: all 0.2s;
99
+ text-decoration: none;
100
+ }
101
+
102
+ .btn-primary {
103
+ color: #ffffff;
104
+ background-color: var(--color-accent);
105
+ border-color: var(--color-accent);
106
+ }
107
+
108
+ .btn-primary:hover {
109
+ background-color: var(--color-link-hover);
110
+ border-color: var(--color-link-hover);
111
+ }
112
+
113
+ .btn-secondary {
114
+ color: var(--color-text-primary);
115
+ background-color: var(--color-bg-primary);
116
+ border-color: var(--color-border);
117
+ }
118
+
119
+ .btn-secondary:hover {
120
+ background-color: var(--color-bg-secondary);
121
+ }
122
+
123
+ .btn-sm {
124
+ padding: 3px 12px;
125
+ font-size: 12px;
126
+ }
127
+
128
+ /* Threads List */
129
+ .threads-list {
130
+ background-color: var(--color-bg-primary);
131
+ border: 1px solid var(--color-border);
132
+ border-radius: 6px;
133
+ }
134
+
135
+ .threads-header {
136
+ padding: 16px;
137
+ border-bottom: 1px solid var(--color-border);
138
+ }
139
+
140
+ .threads-header h2 {
141
+ font-size: 20px;
142
+ font-weight: 600;
143
+ }
144
+
145
+ .thread-items {
146
+ display: flex;
147
+ flex-direction: column;
148
+ }
149
+
150
+ .thread-item {
151
+ display: flex;
152
+ gap: 16px;
153
+ padding: 16px;
154
+ border-bottom: 1px solid var(--color-border);
155
+ transition: background-color 0.2s;
156
+ }
157
+
158
+ .thread-item:last-child {
159
+ border-bottom: none;
160
+ }
161
+
162
+ .thread-item:hover {
163
+ background-color: var(--color-bg-secondary);
164
+ }
165
+
166
+ .thread-icon {
167
+ font-size: 20px;
168
+ flex-shrink: 0;
169
+ }
170
+
171
+ .thread-content {
172
+ flex: 1;
173
+ }
174
+
175
+ .thread-title {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 8px;
179
+ margin-bottom: 4px;
180
+ }
181
+
182
+ .thread-link {
183
+ font-size: 16px;
184
+ font-weight: 600;
185
+ color: var(--color-text-primary);
186
+ text-decoration: none;
187
+ }
188
+
189
+ .thread-link:hover {
190
+ color: var(--color-link);
191
+ }
192
+
193
+ .thread-meta {
194
+ color: var(--color-text-secondary);
195
+ font-size: 12px;
196
+ }
197
+
198
+ /* Badges */
199
+ .badge {
200
+ display: inline-block;
201
+ padding: 2px 8px;
202
+ font-size: 12px;
203
+ font-weight: 500;
204
+ line-height: 1.5;
205
+ border-radius: 12px;
206
+ }
207
+
208
+ .badge-open {
209
+ color: var(--color-success);
210
+ background-color: #dafbe1;
211
+ }
212
+
213
+ .badge-closed {
214
+ color: var(--color-danger);
215
+ background-color: #ffebe9;
216
+ }
217
+
218
+ .badge-patch {
219
+ color: #0969da;
220
+ background-color: #ddf4ff;
221
+ }
222
+
223
+ /* Thread View */
224
+ .thread-view {
225
+ background-color: var(--color-bg-primary);
226
+ border: 1px solid var(--color-border);
227
+ border-radius: 6px;
228
+ }
229
+
230
+ .thread-header {
231
+ padding: 24px;
232
+ border-bottom: 1px solid var(--color-border);
233
+ }
234
+
235
+ .thread-title-row {
236
+ display: flex;
237
+ justify-content: space-between;
238
+ align-items: center;
239
+ margin-bottom: 12px;
240
+ }
241
+
242
+ .thread-title-row h2 {
243
+ font-size: 24px;
244
+ font-weight: 600;
245
+ }
246
+
247
+ /* Messages */
248
+ .messages-container {
249
+ padding: 16px;
250
+ }
251
+
252
+ .message {
253
+ padding: 16px;
254
+ margin-bottom: 16px;
255
+ border: 1px solid var(--color-border);
256
+ border-radius: 6px;
257
+ background-color: var(--color-bg-primary);
258
+ }
259
+
260
+ .message-flattened {
261
+ border-left: 3px solid var(--color-accent);
262
+ }
263
+
264
+ .message-header {
265
+ display: flex;
266
+ justify-content: space-between;
267
+ align-items: flex-start;
268
+ margin-bottom: 12px;
269
+ padding-bottom: 12px;
270
+ border-bottom: 1px solid var(--color-border);
271
+ gap: 12px;
272
+ }
273
+
274
+ .message-info {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 8px;
278
+ flex: 1;
279
+ }
280
+
281
+ .collapse-btn {
282
+ flex-shrink: 0;
283
+ background: none;
284
+ border: none;
285
+ cursor: pointer;
286
+ padding: 0;
287
+ font-size: 12px;
288
+ color: var(--color-text-secondary);
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ width: 20px;
293
+ height: 20px;
294
+ border-radius: 3px;
295
+ transition: background-color 0.2s, color 0.2s;
296
+ }
297
+
298
+ .collapse-btn:hover {
299
+ background-color: var(--color-bg-tertiary);
300
+ color: var(--color-text-primary);
301
+ }
302
+
303
+ .collapse-icon {
304
+ display: inline-block;
305
+ font-size: 10px;
306
+ transition: transform 0.2s;
307
+ }
308
+
309
+ .message-author strong {
310
+ font-weight: 600;
311
+ color: var(--color-text-primary);
312
+ }
313
+
314
+ .message-email {
315
+ color: var(--color-text-secondary);
316
+ font-size: 12px;
317
+ margin-left: 4px;
318
+ }
319
+
320
+ .message-date {
321
+ color: var(--color-text-secondary);
322
+ font-size: 12px;
323
+ display: flex;
324
+ align-items: center;
325
+ gap: 16px;
326
+ flex-shrink: 0;
327
+ text-align: right;
328
+ }
329
+
330
+ .message-date code {
331
+ overflow-wrap: anywhere;
332
+ }
333
+
334
+ .message-wrapper {
335
+ padding: 0;
336
+ margin: 0;
337
+ }
338
+
339
+ .message {
340
+ border: 1px solid var(--color-border);
341
+ border-radius: 8px;
342
+ margin-bottom: 12px;
343
+ padding: 12px;
344
+ background-color: var(--color-bg-secondary);
345
+ }
346
+
347
+ .message.collapsed > .message-body,
348
+ .message.collapsed > .message-patch,
349
+ .message.collapsed > .message-actions {
350
+ display: none;
351
+ }
352
+
353
+ .message.collapsed ~ .message-children {
354
+ display: none;
355
+ }
356
+
357
+ .message-children {
358
+ margin-left: 20px;
359
+ }
360
+
361
+ .message-body {
362
+ margin-bottom: 12px;
363
+ line-height: 1.6;
364
+ }
365
+
366
+ .message-text {
367
+ white-space: pre-wrap;
368
+ overflow-wrap: anywhere;
369
+ }
370
+
371
+ .message-body pre {
372
+ white-space: pre-wrap;
373
+ word-wrap: break-word;
374
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
375
+ font-size: 12px;
376
+ background-color: var(--color-bg-secondary);
377
+ padding: 12px;
378
+ border-radius: 6px;
379
+ overflow-x: auto;
380
+ }
381
+
382
+ /* Markdown rendered content */
383
+ .message-body h1,
384
+ .message-body h2,
385
+ .message-body h3,
386
+ .message-body h4,
387
+ .message-body h5,
388
+ .message-body h6 {
389
+ margin-top: 16px;
390
+ margin-bottom: 8px;
391
+ font-weight: 600;
392
+ }
393
+
394
+ .message-body h1 {
395
+ font-size: 24px;
396
+ border-bottom: 1px solid var(--color-border);
397
+ padding-bottom: 8px;
398
+ }
399
+
400
+ .message-body h2 {
401
+ font-size: 20px;
402
+ }
403
+
404
+ .message-body h3 {
405
+ font-size: 16px;
406
+ }
407
+
408
+ .message-body p {
409
+ margin-bottom: 8px;
410
+ }
411
+
412
+ .message-body ul,
413
+ .message-body ol {
414
+ margin-left: 20px;
415
+ margin-bottom: 8px;
416
+ }
417
+
418
+ .message-body li {
419
+ margin-bottom: 4px;
420
+ }
421
+
422
+ .message-body code {
423
+ background-color: var(--color-bg-secondary);
424
+ padding: 2px 6px;
425
+ border-radius: 3px;
426
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
427
+ font-size: 0.9em;
428
+ }
429
+
430
+ .message-body a {
431
+ color: var(--color-accent);
432
+ text-decoration: none;
433
+ }
434
+
435
+ .message-body a:hover {
436
+ text-decoration: underline;
437
+ }
438
+
439
+ .message-body blockquote {
440
+ border-left: 3px solid var(--color-border);
441
+ margin-left: 0;
442
+ padding-left: 12px;
443
+ color: var(--color-text-secondary);
444
+ }
445
+
446
+ .message-body table {
447
+ border-collapse: collapse;
448
+ margin-bottom: 8px;
449
+ width: 100%;
450
+ }
451
+
452
+ .message-body th,
453
+ .message-body td {
454
+ border: 1px solid var(--color-border);
455
+ padding: 8px;
456
+ text-align: left;
457
+ }
458
+
459
+ .message-body th {
460
+ background-color: var(--color-bg-secondary);
461
+ font-weight: 600;
462
+ }
463
+
464
+ .message-body details {
465
+ margin-bottom: 8px;
466
+ }
467
+
468
+ .message-body summary {
469
+ cursor: pointer;
470
+ font-weight: 500;
471
+ user-select: none;
472
+ }
473
+
474
+ .message-body hr {
475
+ border: none;
476
+ border-top: 1px solid var(--color-border);
477
+ margin: 16px 0;
478
+ }
479
+
480
+ .message-patch {
481
+ margin: 12px 0;
482
+ }
483
+
484
+ .message-patch details {
485
+ border: 1px solid var(--color-border);
486
+ border-radius: 6px;
487
+ padding: 8px;
488
+ }
489
+
490
+ .message-patch summary {
491
+ cursor: pointer;
492
+ font-weight: 600;
493
+ padding: 4px;
494
+ }
495
+
496
+ .patch-content {
497
+ margin-top: 8px;
498
+ padding: 12px;
499
+ background-color: var(--color-bg-tertiary);
500
+ border-radius: 6px;
501
+ overflow-x: auto;
502
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
503
+ font-size: 12px;
504
+ line-height: 1.5;
505
+ }
506
+
507
+ .message-actions {
508
+ display: flex;
509
+ gap: 8px;
510
+ }
511
+
512
+ /* Reply Form */
513
+ .reply-form {
514
+ margin: 16px;
515
+ padding: 16px;
516
+ border: 1px solid var(--color-border);
517
+ border-radius: 6px;
518
+ background-color: var(--color-bg-secondary);
519
+ }
520
+
521
+ .reply-form h3 {
522
+ font-size: 18px;
523
+ font-weight: 600;
524
+ margin-bottom: 16px;
525
+ }
526
+
527
+ .form-group {
528
+ margin-bottom: 16px;
529
+ }
530
+
531
+ .form-group label {
532
+ display: block;
533
+ font-weight: 600;
534
+ margin-bottom: 8px;
535
+ }
536
+
537
+ .form-group textarea {
538
+ width: 100%;
539
+ padding: 8px 12px;
540
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
541
+ font-size: 14px;
542
+ line-height: 1.5;
543
+ border: 1px solid var(--color-border);
544
+ border-radius: 6px;
545
+ resize: vertical;
546
+ }
547
+
548
+ .form-group textarea:focus {
549
+ outline: none;
550
+ border-color: var(--color-accent);
551
+ box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.1);
552
+ }
553
+
554
+ .form-actions {
555
+ display: flex;
556
+ gap: 8px;
557
+ }
558
+
559
+ /* Empty State */
560
+ .empty-state {
561
+ padding: 48px 24px;
562
+ text-align: center;
563
+ color: var(--color-text-secondary);
564
+ }
565
+
566
+ .empty-state p {
567
+ margin-bottom: 8px;
568
+ }
569
+
570
+ /* Footer */
571
+ .footer {
572
+ background-color: var(--color-bg-primary);
573
+ border-top: 1px solid var(--color-border);
574
+ padding: 24px 0;
575
+ margin-top: 48px;
576
+ text-align: center;
577
+ color: var(--color-text-secondary);
578
+ }
579
+
580
+ /* Quoted Text Sections */
581
+ .quoted-section {
582
+ margin-top: 12px;
583
+ padding: 0;
584
+ }
585
+
586
+ .quoted-section summary {
587
+ cursor: pointer;
588
+ color: var(--color-text-secondary);
589
+ font-size: 13px;
590
+ padding: 6px 8px;
591
+ border-radius: 4px;
592
+ transition: background-color 0.2s;
593
+ user-select: none;
594
+ }
595
+
596
+ .quoted-section summary:hover {
597
+ background-color: var(--color-bg-tertiary);
598
+ }
599
+
600
+ .quoted-section .quoted-text {
601
+ margin-top: 8px;
602
+ padding: 12px;
603
+ background-color: var(--color-bg-secondary);
604
+ border-left: 3px solid var(--color-border);
605
+ color: var(--color-text-secondary);
606
+ font-size: 13px;
607
+ opacity: 0.85;
608
+ }
@@ -0,0 +1,47 @@
1
+ // Main JavaScript for git-ew
2
+
3
+ document.addEventListener('DOMContentLoaded', function() {
4
+ // Setup sync button
5
+ const syncBtn = document.getElementById('sync-btn');
6
+ if (syncBtn) {
7
+ syncBtn.addEventListener('click', syncEmails);
8
+ }
9
+ });
10
+
11
+ async function syncEmails() {
12
+ const btn = document.getElementById('sync-btn');
13
+ const originalText = btn.textContent;
14
+
15
+ btn.disabled = true;
16
+ btn.textContent = 'Syncing...';
17
+
18
+ try {
19
+ const response = await fetch('/api/sync', {
20
+ method: 'POST'
21
+ });
22
+
23
+ if (response.ok) {
24
+ const data = await response.json();
25
+ if (data.success) {
26
+ alert(`Successfully synced ${data.synced} emails`);
27
+ location.reload();
28
+ } else {
29
+ alert('Sync failed: ' + (data.errors || ['Unknown error']).join('\n'));
30
+ }
31
+ } else {
32
+ const error = await response.json();
33
+ alert('Sync failed: ' + (error.detail || 'Unknown error'));
34
+ }
35
+ } catch (error) {
36
+ alert('Sync failed: ' + error.message);
37
+ } finally {
38
+ btn.disabled = false;
39
+ btn.textContent = originalText;
40
+ }
41
+ }
42
+
43
+ // Utility function to format dates
44
+ function formatDate(dateString) {
45
+ const date = new Date(dateString);
46
+ return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
47
+ }
@@ -0,0 +1,38 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{% block title %}git-ew{% endblock %}</title>
7
+ <link rel="stylesheet" href="/static/css/style.css">
8
+ </head>
9
+ <body>
10
+ <header class="header">
11
+ <div class="container">
12
+ <div class="header-content">
13
+ <h1 class="logo">
14
+ <a href="/">git-ew</a>
15
+ </h1>
16
+ <nav class="nav">
17
+ <button id="sync-btn" class="btn btn-primary">Sync Emails</button>
18
+ </nav>
19
+ </div>
20
+ </div>
21
+ </header>
22
+
23
+ <main class="main">
24
+ <div class="container">
25
+ {% block content %}{% endblock %}
26
+ </div>
27
+ </main>
28
+
29
+ <footer class="footer">
30
+ <div class="container">
31
+ <p>git-ew - Git Email Workflow</p>
32
+ </div>
33
+ </footer>
34
+
35
+ <script src="/static/js/main.js"></script>
36
+ {% block scripts %}{% endblock %}
37
+ </body>
38
+ </html>