atlas-browser 0.2.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.
Files changed (56) hide show
  1. package/.github/FUNDING.yml +1 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +26 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +16 -0
  4. package/CONTRIBUTING.md +63 -0
  5. package/LICENSE +21 -0
  6. package/PRIVACY.md +37 -0
  7. package/README.md +163 -0
  8. package/SECURITY.md +29 -0
  9. package/assets/logo.png +0 -0
  10. package/bin/cli.js +142 -0
  11. package/dist-electron/main/blocker.js +109 -0
  12. package/dist-electron/main/blocker.js.map +1 -0
  13. package/dist-electron/main/bookmark-manager.js +121 -0
  14. package/dist-electron/main/bookmark-manager.js.map +1 -0
  15. package/dist-electron/main/download-manager.js +118 -0
  16. package/dist-electron/main/download-manager.js.map +1 -0
  17. package/dist-electron/main/index.js +116 -0
  18. package/dist-electron/main/index.js.map +1 -0
  19. package/dist-electron/main/ipc-handlers.js +303 -0
  20. package/dist-electron/main/ipc-handlers.js.map +1 -0
  21. package/dist-electron/main/menu.js +229 -0
  22. package/dist-electron/main/menu.js.map +1 -0
  23. package/dist-electron/main/security-analyzer.js +71 -0
  24. package/dist-electron/main/security-analyzer.js.map +1 -0
  25. package/dist-electron/main/settings-manager.js +105 -0
  26. package/dist-electron/main/settings-manager.js.map +1 -0
  27. package/dist-electron/main/tab-manager.js +205 -0
  28. package/dist-electron/main/tab-manager.js.map +1 -0
  29. package/dist-electron/main/tor-manager.js +59 -0
  30. package/dist-electron/main/tor-manager.js.map +1 -0
  31. package/dist-electron/preload/preload.js +73 -0
  32. package/dist-electron/preload/preload.js.map +1 -0
  33. package/install.sh +120 -0
  34. package/package.json +67 -0
  35. package/src/main/blocker.ts +121 -0
  36. package/src/main/bookmark-manager.ts +99 -0
  37. package/src/main/download-manager.ts +103 -0
  38. package/src/main/index.ts +93 -0
  39. package/src/main/ipc-handlers.ts +283 -0
  40. package/src/main/menu.ts +192 -0
  41. package/src/main/security-analyzer.ts +97 -0
  42. package/src/main/settings-manager.ts +84 -0
  43. package/src/main/tab-manager.ts +249 -0
  44. package/src/main/tor-manager.ts +59 -0
  45. package/src/preload/preload.ts +85 -0
  46. package/src/renderer/bookmarks.html +84 -0
  47. package/src/renderer/browser-ui.js +427 -0
  48. package/src/renderer/downloads.html +94 -0
  49. package/src/renderer/history.html +111 -0
  50. package/src/renderer/index.html +152 -0
  51. package/src/renderer/internet-map.html +313 -0
  52. package/src/renderer/network-map.js +131 -0
  53. package/src/renderer/security-panel.js +13 -0
  54. package/src/renderer/settings.html +138 -0
  55. package/src/renderer/styles.css +688 -0
  56. package/tsconfig.json +18 -0
@@ -0,0 +1,688 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ /* ── Loading Progress Bar ────────────────────────────────── */
8
+ .progress-bar-container {
9
+ position: fixed;
10
+ top: 0;
11
+ left: 0;
12
+ width: 100%;
13
+ height: 3px;
14
+ z-index: 9999;
15
+ background: transparent;
16
+ }
17
+
18
+ .progress-bar-container.hidden { display: none; }
19
+
20
+ .progress-fill {
21
+ height: 100%;
22
+ background: linear-gradient(90deg, var(--accent), #00ffcc, var(--accent));
23
+ background-size: 200% 100%;
24
+ animation: progressShimmer 1.5s linear infinite;
25
+ transition: width 0.3s ease;
26
+ width: 0%;
27
+ box-shadow: 0 0 8px var(--accent);
28
+ }
29
+
30
+ @keyframes progressShimmer {
31
+ 0% { background-position: 200% 0; }
32
+ 100% { background-position: -200% 0; }
33
+ }
34
+
35
+ /* ── Context Menu ────────────────────────────────────────── */
36
+ .context-menu {
37
+ position: fixed;
38
+ z-index: 10000;
39
+ background: var(--surface);
40
+ border: 1px solid var(--border);
41
+ border-radius: 8px;
42
+ padding: 4px 0;
43
+ min-width: 180px;
44
+ box-shadow: 0 8px 32px rgba(0,0,0,0.6);
45
+ backdrop-filter: blur(12px);
46
+ }
47
+
48
+ .context-menu.hidden { display: none; }
49
+
50
+ .ctx-item {
51
+ padding: 7px 16px;
52
+ font-size: 12px;
53
+ cursor: pointer;
54
+ color: var(--text);
55
+ transition: background 0.1s;
56
+ }
57
+
58
+ .ctx-item:hover {
59
+ background: var(--accent);
60
+ color: var(--bg);
61
+ }
62
+
63
+ .ctx-separator {
64
+ height: 1px;
65
+ background: var(--border);
66
+ margin: 4px 0;
67
+ }
68
+
69
+ :root {
70
+ --bg: #0a0a0f;
71
+ --surface: #12121a;
72
+ --surface2: #1a1a28;
73
+ --border: #1e1e2e;
74
+ --text: #e2e2e8;
75
+ --muted: #8888a0;
76
+ --accent: #00d4ff;
77
+ --accent-dim: #00a3c4;
78
+ --green: #22c55e;
79
+ --amber: #eab308;
80
+ --red: #ef4444;
81
+ --purple: #a855f7;
82
+ --chrome-height: 110px;
83
+ }
84
+
85
+ body {
86
+ background: var(--bg);
87
+ color: var(--text);
88
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', sans-serif;
89
+ font-size: 13px;
90
+ overflow: hidden;
91
+ height: 100vh;
92
+ user-select: none;
93
+ }
94
+
95
+ /* ── Tab Bar ─────────────────────────────────────────────── */
96
+ .tab-bar {
97
+ display: flex;
98
+ align-items: center;
99
+ height: 38px;
100
+ background: var(--surface);
101
+ border-bottom: 1px solid var(--border);
102
+ padding-left: 80px; /* Space for traffic lights */
103
+ -webkit-app-region: drag;
104
+ }
105
+
106
+ .tab-bar-drag-region {
107
+ flex: 0;
108
+ }
109
+
110
+ .tabs-container {
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 2px;
114
+ flex: 1;
115
+ overflow-x: auto;
116
+ padding: 4px 4px;
117
+ -webkit-app-region: no-drag;
118
+ }
119
+
120
+ .tab {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: 6px;
124
+ padding: 5px 12px;
125
+ background: var(--bg);
126
+ border: 1px solid var(--border);
127
+ border-radius: 8px;
128
+ color: var(--muted);
129
+ font-size: 12px;
130
+ cursor: pointer;
131
+ max-width: 200px;
132
+ min-width: 100px;
133
+ transition: all 0.15s;
134
+ white-space: nowrap;
135
+ overflow: hidden;
136
+ }
137
+
138
+ .tab:hover {
139
+ background: var(--surface2);
140
+ color: var(--text);
141
+ }
142
+
143
+ .tab.active {
144
+ background: var(--surface2);
145
+ border-color: var(--accent);
146
+ color: var(--text);
147
+ }
148
+
149
+ .tab-title {
150
+ flex: 1;
151
+ overflow: hidden;
152
+ text-overflow: ellipsis;
153
+ }
154
+
155
+ .tab-favicon {
156
+ width: 14px;
157
+ height: 14px;
158
+ border-radius: 2px;
159
+ flex-shrink: 0;
160
+ }
161
+
162
+ .tab-close {
163
+ font-size: 14px;
164
+ color: var(--muted);
165
+ cursor: pointer;
166
+ padding: 2px 4px;
167
+ border-radius: 4px;
168
+ line-height: 1;
169
+ opacity: 0;
170
+ transition: all 0.15s;
171
+ }
172
+
173
+ .tab:hover .tab-close { opacity: 1; }
174
+
175
+ .tab-close:hover {
176
+ color: var(--red);
177
+ background: rgba(239, 68, 68, 0.15);
178
+ }
179
+
180
+ .tab-loading {
181
+ width: 10px;
182
+ height: 10px;
183
+ border: 2px solid var(--accent);
184
+ border-top-color: transparent;
185
+ border-radius: 50%;
186
+ animation: spin 0.8s linear infinite;
187
+ }
188
+
189
+ @keyframes spin {
190
+ to { transform: rotate(360deg); }
191
+ }
192
+
193
+ .new-tab-btn {
194
+ background: none;
195
+ border: 1px solid var(--border);
196
+ border-radius: 6px;
197
+ color: var(--muted);
198
+ font-size: 18px;
199
+ width: 28px;
200
+ height: 28px;
201
+ cursor: pointer;
202
+ display: flex;
203
+ align-items: center;
204
+ justify-content: center;
205
+ margin-left: 4px;
206
+ -webkit-app-region: no-drag;
207
+ transition: all 0.15s;
208
+ }
209
+
210
+ .new-tab-btn:hover {
211
+ background: var(--surface2);
212
+ color: var(--accent);
213
+ border-color: var(--accent);
214
+ }
215
+
216
+ /* ── Navigation Bar ──────────────────────────────────────── */
217
+ .nav-bar {
218
+ display: flex;
219
+ align-items: center;
220
+ height: 44px;
221
+ background: var(--surface);
222
+ border-bottom: 1px solid var(--border);
223
+ padding: 0 12px;
224
+ gap: 8px;
225
+ }
226
+
227
+ .nav-controls {
228
+ display: flex;
229
+ gap: 4px;
230
+ }
231
+
232
+ .nav-btn {
233
+ background: none;
234
+ border: none;
235
+ color: var(--muted);
236
+ font-size: 16px;
237
+ width: 30px;
238
+ height: 30px;
239
+ border-radius: 6px;
240
+ cursor: pointer;
241
+ display: flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ transition: all 0.15s;
245
+ }
246
+
247
+ .nav-btn:hover:not(:disabled) {
248
+ background: var(--surface2);
249
+ color: var(--text);
250
+ }
251
+
252
+ .nav-btn:disabled {
253
+ opacity: 0.3;
254
+ cursor: default;
255
+ }
256
+
257
+ .address-bar-wrapper {
258
+ flex: 1;
259
+ display: flex;
260
+ align-items: center;
261
+ background: var(--bg);
262
+ border: 1px solid var(--border);
263
+ border-radius: 10px;
264
+ padding: 0 12px;
265
+ height: 32px;
266
+ transition: border-color 0.2s;
267
+ }
268
+
269
+ .address-bar-wrapper:focus-within {
270
+ border-color: var(--accent);
271
+ box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.1);
272
+ }
273
+
274
+ .ssl-indicator {
275
+ font-size: 14px;
276
+ margin-right: 8px;
277
+ }
278
+
279
+ .ssl-secure { color: var(--green); }
280
+ .ssl-insecure { color: var(--red); }
281
+
282
+ .address-bar {
283
+ flex: 1;
284
+ background: none;
285
+ border: none;
286
+ color: var(--text);
287
+ font-size: 13px;
288
+ font-family: 'SF Mono', 'Menlo', monospace;
289
+ outline: none;
290
+ }
291
+
292
+ .address-bar::placeholder {
293
+ color: var(--muted);
294
+ font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', sans-serif;
295
+ }
296
+
297
+ /* ── Bookmark Star ────────────────────────────────────────── */
298
+ .bookmark-star {
299
+ background: none;
300
+ border: none;
301
+ color: var(--muted);
302
+ font-size: 18px;
303
+ cursor: pointer;
304
+ padding: 0 4px;
305
+ transition: color 0.15s;
306
+ }
307
+
308
+ .bookmark-star:hover { color: var(--amber); }
309
+ .bookmark-star.active { color: var(--amber); }
310
+
311
+ /* ── Phantom Mode Bar ────────────────────────────────────── */
312
+ .phantom-bar {
313
+ display: flex;
314
+ align-items: center;
315
+ height: 28px;
316
+ background: linear-gradient(90deg, rgba(168,85,247,0.12), rgba(168,85,247,0.06));
317
+ border-bottom: 1px solid rgba(168,85,247,0.25);
318
+ padding: 0 16px;
319
+ gap: 10px;
320
+ font-size: 11px;
321
+ }
322
+
323
+ .phantom-bar.hidden { display: none; }
324
+
325
+ .phantom-pulse {
326
+ width: 7px;
327
+ height: 7px;
328
+ border-radius: 50%;
329
+ background: #a855f7;
330
+ animation: pulse 1.5s ease-in-out infinite;
331
+ }
332
+
333
+ @keyframes pulse {
334
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(168,85,247,0.4); }
335
+ 50% { opacity: 0.7; box-shadow: 0 0 0 6px rgba(168,85,247,0); }
336
+ }
337
+
338
+ .phantom-label {
339
+ color: #a855f7;
340
+ font-weight: 700;
341
+ letter-spacing: 1px;
342
+ font-family: 'SF Mono', monospace;
343
+ }
344
+
345
+ .phantom-info {
346
+ color: rgba(168,85,247,0.6);
347
+ flex: 1;
348
+ font-family: 'SF Mono', monospace;
349
+ }
350
+
351
+ .phantom-timer {
352
+ color: #a855f7;
353
+ font-family: 'SF Mono', monospace;
354
+ font-weight: 600;
355
+ }
356
+
357
+ .phantom-destroy-btn {
358
+ background: none;
359
+ border: 1px solid rgba(239,68,68,0.3);
360
+ color: #ef4444;
361
+ padding: 2px 10px;
362
+ border-radius: 5px;
363
+ font-size: 10px;
364
+ cursor: pointer;
365
+ transition: all 0.15s;
366
+ }
367
+
368
+ .phantom-destroy-btn:hover {
369
+ background: rgba(239,68,68,0.1);
370
+ border-color: #ef4444;
371
+ }
372
+
373
+ .toolbar-btn.phantom-active {
374
+ color: var(--purple);
375
+ border-color: var(--purple);
376
+ background: rgba(168, 85, 247, 0.15);
377
+ animation: pulse 2s ease-in-out infinite;
378
+ }
379
+
380
+ /* ── Bookmarks Bar ───────────────────────────────────────── */
381
+ .bookmarks-bar {
382
+ display: flex;
383
+ align-items: center;
384
+ height: 28px;
385
+ background: var(--surface);
386
+ border-bottom: 1px solid var(--border);
387
+ padding: 0 12px 0 80px;
388
+ gap: 4px;
389
+ }
390
+
391
+ .bookmarks-container {
392
+ display: flex;
393
+ align-items: center;
394
+ gap: 2px;
395
+ flex: 1;
396
+ overflow-x: auto;
397
+ }
398
+
399
+ .bookmarks-container::-webkit-scrollbar { height: 0; }
400
+
401
+ .bookmarks-empty {
402
+ font-size: 11px;
403
+ color: var(--muted);
404
+ opacity: 0.5;
405
+ }
406
+
407
+ .bm-item {
408
+ display: flex;
409
+ align-items: center;
410
+ gap: 4px;
411
+ padding: 2px 8px;
412
+ border-radius: 4px;
413
+ font-size: 11px;
414
+ color: var(--muted);
415
+ cursor: pointer;
416
+ white-space: nowrap;
417
+ transition: all 0.15s;
418
+ border: 1px solid transparent;
419
+ }
420
+
421
+ .bm-item:hover {
422
+ background: var(--surface2);
423
+ color: var(--text);
424
+ border-color: var(--border);
425
+ }
426
+
427
+ .bm-item img { width: 14px; height: 14px; border-radius: 2px; }
428
+
429
+ .all-bookmarks-btn {
430
+ background: none;
431
+ border: none;
432
+ color: var(--muted);
433
+ font-size: 14px;
434
+ cursor: pointer;
435
+ padding: 2px 6px;
436
+ border-radius: 4px;
437
+ }
438
+
439
+ .all-bookmarks-btn:hover { background: var(--surface2); color: var(--text); }
440
+
441
+ /* ── Zoom Controls ───────────────────────────────────────── */
442
+ .zoom-controls {
443
+ display: flex;
444
+ align-items: center;
445
+ gap: 2px;
446
+ background: var(--bg);
447
+ border: 1px solid var(--border);
448
+ border-radius: 6px;
449
+ padding: 0 2px;
450
+ height: 28px;
451
+ }
452
+
453
+ .zoom-btn {
454
+ background: none;
455
+ border: none;
456
+ color: var(--muted);
457
+ font-size: 14px;
458
+ width: 22px;
459
+ height: 22px;
460
+ cursor: pointer;
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: center;
464
+ border-radius: 4px;
465
+ font-weight: 700;
466
+ }
467
+
468
+ .zoom-btn:hover { background: var(--surface2); color: var(--text); }
469
+
470
+ .zoom-level {
471
+ font-size: 10px;
472
+ font-family: 'SF Mono', monospace;
473
+ color: var(--muted);
474
+ min-width: 32px;
475
+ text-align: center;
476
+ }
477
+
478
+ .toolbar-separator {
479
+ width: 1px;
480
+ height: 20px;
481
+ background: var(--border);
482
+ margin: 0 4px;
483
+ }
484
+
485
+ .toolbar-actions {
486
+ display: flex;
487
+ gap: 4px;
488
+ align-items: center;
489
+ }
490
+
491
+ .toolbar-btn {
492
+ background: none;
493
+ border: 1px solid transparent;
494
+ border-radius: 6px;
495
+ color: var(--muted);
496
+ font-size: 16px;
497
+ width: 32px;
498
+ height: 32px;
499
+ cursor: pointer;
500
+ display: flex;
501
+ align-items: center;
502
+ justify-content: center;
503
+ position: relative;
504
+ transition: all 0.15s;
505
+ }
506
+
507
+ .toolbar-btn:hover {
508
+ background: var(--surface2);
509
+ color: var(--text);
510
+ }
511
+
512
+ .toolbar-btn.shield-active {
513
+ color: var(--green);
514
+ }
515
+
516
+ .toolbar-btn.tor-active {
517
+ color: var(--purple);
518
+ border-color: var(--purple);
519
+ background: rgba(168, 85, 247, 0.1);
520
+ }
521
+
522
+ .blocked-badge {
523
+ position: absolute;
524
+ top: -2px;
525
+ right: -4px;
526
+ background: var(--green);
527
+ color: #000;
528
+ font-size: 9px;
529
+ font-weight: 700;
530
+ padding: 1px 4px;
531
+ border-radius: 8px;
532
+ min-width: 14px;
533
+ text-align: center;
534
+ transition: transform 0.15s;
535
+ }
536
+
537
+ .blocked-badge.pop {
538
+ animation: badgePop 0.3s ease;
539
+ }
540
+
541
+ @keyframes badgePop {
542
+ 0% { transform: scale(1); }
543
+ 50% { transform: scale(1.4); }
544
+ 100% { transform: scale(1); }
545
+ }
546
+
547
+ /* ── Security Sidebar ────────────────────────────────────── */
548
+ .security-sidebar {
549
+ position: fixed;
550
+ top: var(--chrome-height);
551
+ right: 0;
552
+ width: 300px;
553
+ height: calc(100vh - var(--chrome-height));
554
+ background: var(--surface);
555
+ border-left: 1px solid var(--border);
556
+ z-index: 100;
557
+ overflow-y: auto;
558
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s;
559
+ }
560
+
561
+ .security-sidebar.hidden {
562
+ transform: translateX(100%);
563
+ opacity: 0;
564
+ pointer-events: none;
565
+ }
566
+
567
+ .sidebar-header {
568
+ display: flex;
569
+ align-items: center;
570
+ justify-content: space-between;
571
+ padding: 12px 16px;
572
+ border-bottom: 1px solid var(--border);
573
+ }
574
+
575
+ .sidebar-header h3 {
576
+ font-size: 14px;
577
+ font-weight: 600;
578
+ }
579
+
580
+ .close-btn {
581
+ background: none;
582
+ border: none;
583
+ color: var(--muted);
584
+ font-size: 20px;
585
+ cursor: pointer;
586
+ }
587
+
588
+ .sidebar-content {
589
+ padding: 8px;
590
+ }
591
+
592
+ .security-section {
593
+ padding: 12px;
594
+ margin-bottom: 4px;
595
+ border-radius: 8px;
596
+ background: var(--bg);
597
+ }
598
+
599
+ .security-section h4 {
600
+ font-size: 11px;
601
+ text-transform: uppercase;
602
+ letter-spacing: 0.5px;
603
+ color: var(--muted);
604
+ margin-bottom: 8px;
605
+ }
606
+
607
+ .privacy-score-container {
608
+ text-align: center;
609
+ padding: 12px 0;
610
+ }
611
+
612
+ .privacy-score {
613
+ font-size: 48px;
614
+ font-weight: 700;
615
+ font-family: 'SF Mono', monospace;
616
+ color: var(--green);
617
+ }
618
+
619
+ .privacy-score-label {
620
+ font-size: 11px;
621
+ color: var(--muted);
622
+ margin-top: 4px;
623
+ }
624
+
625
+ .info-rows {
626
+ display: flex;
627
+ flex-direction: column;
628
+ gap: 6px;
629
+ }
630
+
631
+ .info-row {
632
+ display: flex;
633
+ justify-content: space-between;
634
+ align-items: center;
635
+ }
636
+
637
+ .info-row .label {
638
+ color: var(--muted);
639
+ font-size: 12px;
640
+ }
641
+
642
+ .info-row .value {
643
+ font-family: 'SF Mono', monospace;
644
+ font-size: 12px;
645
+ }
646
+
647
+ .badge-green { color: var(--green); }
648
+ .badge-amber { color: var(--amber); }
649
+ .badge-red { color: var(--red); }
650
+
651
+ .tor-circuit {
652
+ display: flex;
653
+ flex-direction: column;
654
+ gap: 4px;
655
+ font-size: 12px;
656
+ }
657
+
658
+ .tor-disabled {
659
+ color: var(--muted);
660
+ font-style: italic;
661
+ }
662
+
663
+ .tor-node {
664
+ display: flex;
665
+ align-items: center;
666
+ gap: 6px;
667
+ padding: 4px 8px;
668
+ background: var(--surface2);
669
+ border-radius: 4px;
670
+ font-size: 11px;
671
+ font-family: 'SF Mono', monospace;
672
+ }
673
+
674
+ .tor-node::before {
675
+ content: '';
676
+ width: 6px;
677
+ height: 6px;
678
+ border-radius: 50%;
679
+ background: var(--purple);
680
+ }
681
+
682
+ #network-canvas {
683
+ width: 100%;
684
+ height: 200px;
685
+ border-radius: 6px;
686
+ background: var(--bg);
687
+ border: 1px solid var(--border);
688
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "commonjs",
5
+ "lib": ["ES2022"],
6
+ "outDir": "dist-electron",
7
+ "rootDir": "src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "resolveJsonModule": true,
13
+ "declaration": false,
14
+ "sourceMap": true
15
+ },
16
+ "include": ["src/main/**/*", "src/preload/**/*"],
17
+ "exclude": ["node_modules", "dist", "dist-electron"]
18
+ }