pinokiod 3.85.0 → 3.87.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 (88) hide show
  1. package/Dockerfile +61 -0
  2. package/docker-entrypoint.sh +75 -0
  3. package/kernel/api/hf/index.js +1 -1
  4. package/kernel/api/index.js +8 -1
  5. package/kernel/api/shell/index.js +6 -0
  6. package/kernel/api/terminal/index.js +166 -0
  7. package/kernel/bin/caddy.js +10 -4
  8. package/kernel/bin/conda.js +3 -2
  9. package/kernel/bin/index.js +53 -2
  10. package/kernel/bin/setup.js +32 -0
  11. package/kernel/bin/vs.js +11 -2
  12. package/kernel/index.js +42 -2
  13. package/kernel/info.js +36 -0
  14. package/kernel/peer.js +42 -18
  15. package/kernel/prototype.js +1 -0
  16. package/kernel/router/index.js +23 -15
  17. package/kernel/router/localhost_static_router.js +0 -3
  18. package/kernel/router/pinokio_domain_router.js +333 -0
  19. package/kernel/shell.js +43 -2
  20. package/kernel/shells.js +21 -1
  21. package/kernel/util.js +4 -2
  22. package/package.json +2 -1
  23. package/pipe/views/login.ejs +1 -1
  24. package/script/install-mode.js +33 -0
  25. package/script/pinokio.json +7 -0
  26. package/server/index.js +636 -246
  27. package/server/public/Socket.js +48 -0
  28. package/server/public/common.js +1956 -257
  29. package/server/public/fseditor.js +71 -12
  30. package/server/public/install.js +1 -1
  31. package/server/public/layout.js +740 -0
  32. package/server/public/modalinput.js +0 -1
  33. package/server/public/opener.js +12 -11
  34. package/server/public/serve/style.css +1 -1
  35. package/server/public/style.css +122 -129
  36. package/server/public/tab-idle-notifier.js +629 -0
  37. package/server/public/terminal_input_tracker.js +63 -0
  38. package/server/public/urldropdown.css +780 -45
  39. package/server/public/urldropdown.js +806 -156
  40. package/server/public/window_storage.js +97 -28
  41. package/server/socket.js +40 -9
  42. package/server/views/404.ejs +1 -1
  43. package/server/views/500.ejs +3 -3
  44. package/server/views/app.ejs +3146 -1381
  45. package/server/views/bookmarklet.ejs +197 -0
  46. package/server/views/bootstrap.ejs +1 -1
  47. package/server/views/columns.ejs +2 -13
  48. package/server/views/connect/x.ejs +4 -4
  49. package/server/views/connect.ejs +13 -14
  50. package/server/views/container.ejs +3 -4
  51. package/server/views/d.ejs +225 -55
  52. package/server/views/download.ejs +1 -1
  53. package/server/views/editor.ejs +2 -2
  54. package/server/views/env_editor.ejs +3 -3
  55. package/server/views/explore.ejs +2 -2
  56. package/server/views/file_explorer.ejs +3 -3
  57. package/server/views/git.ejs +7 -7
  58. package/server/views/github.ejs +3 -3
  59. package/server/views/help.ejs +2 -2
  60. package/server/views/index.ejs +17 -16
  61. package/server/views/index2.ejs +7 -7
  62. package/server/views/init/index.ejs +15 -79
  63. package/server/views/install.ejs +4 -4
  64. package/server/views/keys.ejs +2 -2
  65. package/server/views/layout.ejs +105 -0
  66. package/server/views/mini.ejs +2 -2
  67. package/server/views/net.ejs +45 -13
  68. package/server/views/network.ejs +41 -27
  69. package/server/views/network2.ejs +11 -11
  70. package/server/views/old_network.ejs +10 -10
  71. package/server/views/partials/dynamic.ejs +3 -5
  72. package/server/views/partials/menu.ejs +3 -5
  73. package/server/views/partials/running.ejs +1 -1
  74. package/server/views/pro.ejs +369 -0
  75. package/server/views/prototype/index.ejs +3 -3
  76. package/server/views/required_env_editor.ejs +2 -2
  77. package/server/views/review.ejs +15 -27
  78. package/server/views/rows.ejs +2 -13
  79. package/server/views/screenshots.ejs +298 -142
  80. package/server/views/settings.ejs +6 -7
  81. package/server/views/setup.ejs +3 -4
  82. package/server/views/setup_home.ejs +2 -2
  83. package/server/views/share_editor.ejs +4 -4
  84. package/server/views/shell.ejs +280 -29
  85. package/server/views/start.ejs +2 -2
  86. package/server/views/task.ejs +2 -2
  87. package/server/views/terminal.ejs +326 -52
  88. package/server/views/tools.ejs +461 -17
@@ -17,11 +17,14 @@
17
17
  <style>
18
18
  main {
19
19
  box-sizing: border-box;
20
+ padding: 0;
20
21
  /*
21
22
  flex-wrap: wrap;
22
23
  */
24
+ /*
23
25
  max-width: 800px;
24
26
  padding: 30px 45px;
27
+ */
25
28
  /*
26
29
  justify-content: center;
27
30
  */
@@ -29,72 +32,102 @@ main {
29
32
  .tab-content {
30
33
  display: flex;
31
34
  flex-wrap: wrap;
32
- gap: 5px;
33
35
  flex-grow: 1;
34
36
  width: 100%;
35
37
  }
36
38
  .submenu.tab {
37
39
  margin: 10px 0;
38
40
  }
39
- .tab:hover {
40
- color: royalblue;
41
- }
42
41
  .tab {
43
- /*
44
- min-width: 250px;
45
- */
46
42
  width: 100%;
47
43
  text-decoration: none;
48
44
  display: flex;
49
- /*
50
- flex-direction: column;
51
- */
52
45
  font-size: 14px;
53
46
  font-weight: bold;
54
47
  color: black;
55
48
  overflow: hidden;
56
49
  box-sizing: border-box;
57
- border-radius: 4px;
58
50
  align-items: center;
59
51
  gap: 10px;
60
- /*
61
- width: 120px;
62
- */
52
+ padding: 5px;
53
+ cursor: pointer;
54
+ transition: background 0.2s ease;
63
55
 
64
56
  /*
65
57
  margin-bottom: 10px;
66
58
  */
67
59
  background: rgba(0,0,0,0.05);
68
60
  }
61
+ .tab:hover,
62
+ .tab:focus-visible {
63
+ background: rgba(0, 0, 0, 0.1);
64
+ }
65
+ .tab:focus-visible {
66
+ outline: 2px solid rgba(127, 91, 243, 0.6);
67
+ outline-offset: 2px;
68
+ }
69
69
  body.dark .tab {
70
70
  color: white;
71
71
  background: rgba(255,255,255,0.03);
72
72
  }
73
+ body.dark .tab:hover,
74
+ body.dark .tab:focus-visible {
75
+ background: rgba(255, 255, 255, 0.08);
76
+ }
73
77
  .tab h2 {
74
78
  margin: 0;
75
- font-size: 18px;
79
+ font-weight: normal;
80
+ font-size: 14px;
76
81
  }
77
82
  .tab .col {
78
83
  flex-grow: 1;
79
84
  margin-left: 10px;
80
85
  }
81
86
  .tab i.img {
82
- height: 50px;
83
- width: 50px;
87
+ height: 30px;
88
+ width: 30px;
84
89
  background: white;
85
90
  color: black;
86
91
  display: flex;
87
92
  justify-content: center;
88
93
  font-size: 20px;
89
94
  align-items: center;
90
- border-radius: 3px;
91
95
  }
92
96
  .tab img {
93
- height: 50px;
94
- width: 50px;
95
- border-radius: 3px;
97
+ height: 30px;
98
+ width: 30px;
96
99
  background: white;
97
100
  }
101
+ .tab .disclosure-indicator {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ justify-content: center;
105
+ width: 20px;
106
+ height: 20px;
107
+ color: rgba(0, 0, 0, 0.4);
108
+ flex-shrink: 0;
109
+ pointer-events: none;
110
+ transition: transform 0.2s ease, color 0.2s ease;
111
+ }
112
+ .tab:hover .disclosure-indicator,
113
+ .tab:focus-visible .disclosure-indicator {
114
+ color: rgba(0, 0, 0, 0.7);
115
+ transform: translateX(2px);
116
+ }
117
+ .tab.is-starting {
118
+ cursor: wait;
119
+ opacity: 0.7;
120
+ }
121
+ .tab.is-starting .disclosure-indicator {
122
+ opacity: 0.85;
123
+ }
124
+ body.dark .tab .disclosure-indicator {
125
+ color: rgba(255, 255, 255, 0.4);
126
+ }
127
+ body.dark .tab:hover .disclosure-indicator,
128
+ body.dark .tab:focus-visible .disclosure-indicator {
129
+ color: rgba(255, 255, 255, 0.9);
130
+ }
98
131
  /*
99
132
  body.dark .tab i {
100
133
  background: rgba(0,0,0,0.1);
@@ -114,12 +147,6 @@ body.dark .tab i {
114
147
  }
115
148
  */
116
149
  .menu-container {
117
- /*
118
- border: 15px solid rgba(0,0,0,0.04);
119
- background: white;
120
- border-radius: 20px;
121
- */
122
- margin-bottom: 30px;
123
150
  align-items: flex-start;
124
151
  }
125
152
  /*
@@ -132,9 +159,15 @@ body.dark .menu-container {
132
159
  flex-direction: column;
133
160
  box-sizing: border-box;
134
161
  }
162
+ body.dark .tab-header {
163
+ background: rgba(255,255,255,0.04);
164
+ }
135
165
  .tab-header {
136
- margin-bottom: 10px;
137
166
  font-weight: bold;
167
+ width: 100%;
168
+ box-sizing: border-box;
169
+ padding: 10px;
170
+ background: rgba(0,0,0,0.04);
138
171
  }
139
172
  .container {
140
173
  margin: 0;
@@ -164,7 +197,7 @@ body.dark .btn {
164
197
  border: none;
165
198
  }
166
199
  .btn:hover {
167
- color: royalblue;
200
+ color: rgba(127, 91, 243, 0.9);
168
201
  }
169
202
  .btn {
170
203
  padding: 2px 10px;
@@ -228,13 +261,14 @@ body.dark .btn.run-btn {
228
261
  padding: 10px;
229
262
  border-radius: 0;
230
263
  /*
231
- background: royalblue !important;
264
+ background: rgba(127, 91, 243, 0.9) !important;
232
265
  */
233
266
  }
234
267
  .tab-header h3 {
235
268
  margin: 0;
236
- font-size: 16px;
237
- text-transform: capitalize;
269
+ font-size: 14px;
270
+ text-transform: uppercase;
271
+ opacity: 0.6;
238
272
  }
239
273
  .tab-header h3 i {
240
274
  }
@@ -268,6 +302,9 @@ header h1 {
268
302
  h4 {
269
303
  margin: 0 0 5px;
270
304
  }
305
+ form.search {
306
+ padding: 10px;
307
+ }
271
308
  body.dark .btn.file-open {
272
309
  background: rgba(255,255,255,0.1) !important;
273
310
  }
@@ -298,6 +335,7 @@ body.dark #update-spec {
298
335
  <form class='search'>
299
336
  <input type='search' class="flexible" placeholder='Filter tools'>
300
337
  </form>
338
+ <!--
301
339
  <header>
302
340
  <h1>Build</h1>
303
341
  <div class='flexible'></div>
@@ -309,20 +347,14 @@ body.dark #update-spec {
309
347
  </div>
310
348
  </div>
311
349
  </header>
350
+ -->
312
351
  <div class='spec'>
313
352
  <div class='explain'>
314
353
  <h3><i class="fa-regular fa-circle-check"></i> TODO</h3>
315
354
  <ol>
316
355
  <li><strong>Build manually:</strong> Open the project files and start building. <a class='btn file-open' data-filepath="<%=filepath%>"><i class="fa-solid fa-folder-open"></i> open project folder</a></li>
317
356
  <li><strong>Build with AI:</strong> Click any of the below AI tools to instantly start building with AI.</li>
318
- <!--
319
- <li><strong>Build with AI:</strong> Click any of the AI tools below to start building with AI. The AI will automatically build based on the spec:</li>
320
- -->
321
357
  </ol>
322
- <!--
323
- <textarea><%=spec%></textarea>
324
- <button id='update-spec'>Update</button>
325
- -->
326
358
  </div>
327
359
  </div>
328
360
 
@@ -332,13 +364,10 @@ body.dark #update-spec {
332
364
  <div class='menu-container'>
333
365
  <div class='tab-header'>
334
366
  <h3><i class='<%=item.icon%>'></i> <%=item.title%></h3>
335
- <% if (item.subtitle) { %>
336
- <div class='subtitle'><%=item.subtitle%></div>
337
- <% } %>
338
367
  </div>
339
368
  <div class='tab-content'>
340
369
  <% item.menu.forEach((i) => { %>
341
- <a href="<%=i.href%>" class='tab' data-index="<%=index++%>" data-target="@<%=i.href.split("?")[0].replace("/run", "")%>">
370
+ <div class='tab' role="button" tabindex="0" data-index="<%=index++%>" data-target="@<%=i.href%>" data-href="<%=i.href%>">
342
371
  <% if (i.image) { %>
343
372
  <img src="<%=i.image%>">
344
373
  <% } else if (i.icon) { %>
@@ -348,14 +377,14 @@ body.dark #update-spec {
348
377
  <% if (i.subtitle) { %>
349
378
  <div class='subtitle'><%=i.subtitle%></div>
350
379
  <% } %>
380
+ <div class='flexible'></div>
351
381
  <% if (i.link) { %>
352
382
  <div target="_blank" data-href="<%=i.link%>"><i class="fa-solid fa-circle-info"></i></div>
353
383
  <% } %>
354
- <div class='flexible'></div>
355
- <div class='btn'>
356
- <i class="fa-solid fa-angle-right"></i>
384
+ <div class='disclosure-indicator' aria-hidden="true">
385
+ <i class="fa-solid fa-chevron-right"></i>
357
386
  </div>
358
- </a>
387
+ </div>
359
388
  <% }) %>
360
389
  </div>
361
390
  </div>
@@ -397,6 +426,7 @@ setTimeout(() => {
397
426
  location.href = location.href
398
427
  }, 2000)
399
428
  <% } %>
429
+ /*
400
430
  document.querySelector("#git-pull").addEventListener("click", (e) => {
401
431
  e.preventDefault()
402
432
  e.stopPropagation()
@@ -415,6 +445,7 @@ document.querySelector("#git-pull").addEventListener("click", (e) => {
415
445
  }
416
446
  })
417
447
  })
448
+ */
418
449
  /*
419
450
  const resize = (textarea) => {
420
451
  textarea.style.height = "";
@@ -501,6 +532,74 @@ const renderSearch = () => {
501
532
  }
502
533
  }
503
534
  renderSearch()
535
+ const generateSession = () => {
536
+ if (typeof crypto !== 'undefined' && crypto.randomUUID) {
537
+ return crypto.randomUUID()
538
+ }
539
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`
540
+ }
541
+ const appendSessionParam = (value, session) => {
542
+ if (!value) return value
543
+ if (value.includes('session=')) {
544
+ return value
545
+ }
546
+ const delimiter = value.includes('?') ? '&' : '?'
547
+ return `${value}${delimiter}session=${session}`
548
+ }
549
+ const START_ICON_HTML = '<i class="fa-solid fa-chevron-right"></i>'
550
+ const STARTING_ICON_HTML = '<i class="fa-solid fa-circle-notch fa-spin"></i>'
551
+ const setTabLaunchState = (tab, state) => {
552
+ if (!tab) return
553
+ const indicator = tab.querySelector('.disclosure-indicator')
554
+ if (indicator) {
555
+ indicator.innerHTML = state === 'starting' ? STARTING_ICON_HTML : START_ICON_HTML
556
+ }
557
+ if (state === 'starting') {
558
+ tab.classList.add('is-starting')
559
+ } else {
560
+ tab.classList.remove('is-starting')
561
+ }
562
+ }
563
+ const pendingLaunchTabs = new Map()
564
+ const launchTab = (tab) => {
565
+ if (!tab) {
566
+ return false
567
+ }
568
+
569
+ if (tab.classList.contains('is-starting')) {
570
+ return false
571
+ }
572
+
573
+ const baseHref = tab.dataset.href
574
+ const baseTarget = tab.dataset.target
575
+
576
+ if (!baseHref || !baseTarget) {
577
+ return false
578
+ }
579
+
580
+ const session = generateSession()
581
+ pendingLaunchTabs.set(session, tab)
582
+ setTabLaunchState(tab, 'starting')
583
+
584
+ const href = appendSessionParam(baseHref, session)
585
+ const target = appendSessionParam(baseTarget, session)
586
+
587
+ window.parent.postMessage({
588
+ launch: {
589
+ name: target,
590
+ href
591
+ }
592
+ }, "*")
593
+
594
+ return true
595
+ }
596
+ const extractSession = (value) => {
597
+ if (!value || typeof value !== 'string') {
598
+ return null
599
+ }
600
+ const match = value.match(/session=([^&]+)/)
601
+ return match ? match[1] : null
602
+ }
504
603
  document.querySelector("form input[type=search]").addEventListener("input", (e) => {
505
604
  selectedIndex = 0
506
605
  selectedBtnIndex = 0
@@ -508,16 +607,87 @@ document.querySelector("form input[type=search]").addEventListener("input", (e)
508
607
  })
509
608
  document.querySelector("form input[type=search]").focus()
510
609
  document.addEventListener("click", (e) => {
511
- if (e.target.classList.contains("tab")) {
610
+ const infoTarget = e.target.closest('[data-href][target="_blank"]')
611
+ if (infoTarget) {
512
612
  e.preventDefault()
513
613
  e.stopPropagation()
514
- let href = e.target.href
515
- window.parent.postMessage({
516
- launch: {
517
- name: e.target.getAttribute("data-target"),
518
- href
519
- }
520
- }, "*")
614
+ window.open(infoTarget.getAttribute('data-href'), '_blank')
615
+ return
616
+ }
617
+
618
+ const tab = e.target.closest('.tab[data-href]')
619
+ if (!tab) {
620
+ return
621
+ }
622
+
623
+ if (launchTab(tab)) {
624
+ e.preventDefault()
625
+ e.stopPropagation()
626
+ }
627
+ })
628
+
629
+ document.addEventListener('keydown', (e) => {
630
+ if (!['Enter', ' ', 'Spacebar'].includes(e.key)) {
631
+ return
632
+ }
633
+
634
+ const target = e.target
635
+ if (!(target instanceof HTMLElement)) {
636
+ return
637
+ }
638
+
639
+ const tab = target.closest('.tab[data-href]')
640
+ if (!tab || tab !== target) {
641
+ return
642
+ }
643
+
644
+ const launched = launchTab(tab)
645
+ if (launched) {
646
+ e.preventDefault()
647
+ e.stopPropagation()
648
+ }
649
+ })
650
+
651
+ window.addEventListener('message', (event) => {
652
+ const data = event.data
653
+ if (!data || typeof data !== 'object') {
654
+ return
655
+ }
656
+
657
+ let session = null
658
+
659
+ if (typeof data.session === 'string') {
660
+ session = data.session
661
+ }
662
+
663
+ if (!session && typeof data.id === 'string') {
664
+ session = extractSession(data.id)
665
+ }
666
+
667
+ if (!session && data.data && typeof data.data.id === 'string') {
668
+ session = extractSession(data.data.id)
669
+ }
670
+
671
+ if (!session && data.launch && typeof data.launch.href === 'string') {
672
+ session = extractSession(data.launch.href)
673
+ }
674
+
675
+ if (!session && typeof data.href === 'string') {
676
+ session = extractSession(data.href)
677
+ }
678
+
679
+ if (session && pendingLaunchTabs.has(session)) {
680
+ const tab = pendingLaunchTabs.get(session)
681
+ pendingLaunchTabs.delete(session)
682
+ setTabLaunchState(tab, 'idle')
683
+ return
684
+ }
685
+
686
+ if (data.type === 'start' || data.type === 'result' || data.type === 'error' || data.type === 'disconnect') {
687
+ pendingLaunchTabs.forEach((tab) => {
688
+ setTabLaunchState(tab, 'idle')
689
+ })
690
+ pendingLaunchTabs.clear()
521
691
  }
522
692
  })
523
693
  </script>
@@ -70,7 +70,7 @@ body.frozen {
70
70
  }
71
71
  .item .title {
72
72
  text-decoration: none;
73
- color: royalblue;
73
+ color: rgba(127, 91, 243, 0.9);
74
74
  }
75
75
  .item .col {
76
76
  padding: 10px;
@@ -116,7 +116,7 @@ header .runner {
116
116
  padding: 10px 0 0;
117
117
  }
118
118
  #del-bin {
119
- color: royalblue;
119
+ color: rgba(127, 91, 243, 0.9);
120
120
  cursor: pointer;
121
121
  font-weight: bold;
122
122
  padding: 0 5px;
@@ -671,7 +671,7 @@ document.addEventListener("DOMContentLoaded", async () => {
671
671
  })
672
672
  let config = {
673
673
  scrollback: 9999999,
674
- fontSize: 14,
674
+ fontSize: 12,
675
675
  theme,
676
676
  }
677
677
  let res = await fetch("/xterm_config").then((res) => {
@@ -117,7 +117,7 @@ body.dark .env-item label {
117
117
  color: cornflowerblue;
118
118
  }
119
119
  .env-item label {
120
- color: royalblue;
120
+ color: rgba(127, 91, 243, 0.9);
121
121
  display: block;
122
122
  margin-bottom: 5px;
123
123
  font-weight: bold;
@@ -143,7 +143,7 @@ body.dark .comment {
143
143
  padding-left: 10px;
144
144
  }
145
145
  #save {
146
- background: royalblue;
146
+ background: rgba(127, 91, 243, 0.9);
147
147
  }
148
148
  a#customize {
149
149
  text-decoration: underline;
@@ -227,7 +227,7 @@ footer .btn.go-home {
227
227
  }
228
228
  .warning a {
229
229
  text-decoration: none;
230
- color: royalblue;
230
+ color: rgba(127, 91, 243, 0.9);
231
231
  }
232
232
  </style>
233
233
  <script>
@@ -58,7 +58,7 @@ body {
58
58
  text-decoration: none;
59
59
  font-weight: bold;
60
60
  font-size: 16px;
61
- color: royalblue;
61
+ color: rgba(127, 91, 243, 0.9);
62
62
  }
63
63
  .item .col {
64
64
  padding: 0 10px;
@@ -84,7 +84,7 @@ body {
84
84
  /*
85
85
  border: 3px solid black;
86
86
  */
87
- background: royalblue;
87
+ background: rgba(127, 91, 243, 0.9);
88
88
  }
89
89
  .selectors .selector {
90
90
  color: white;
@@ -106,12 +106,12 @@ header .runner {
106
106
  margin-top: 5px;
107
107
  }
108
108
  a.badge {
109
- color: royalblue;
109
+ color: rgba(127, 91, 243, 0.9);
110
110
  text-decoration: none;
111
111
  cursor: pointer;
112
112
  }
113
113
  .badge a {
114
- color: royalblue;
114
+ color: rgba(127, 91, 243, 0.9);
115
115
  text-decoration: none;
116
116
  }
117
117
  body.dark .btn {
@@ -196,7 +196,7 @@ body.dark .browser-options-row {
196
196
  <% if (dep.downloaded) { %>
197
197
  <div class='item'><i class="fa-solid fa-check"></i> <a class='downloaded' href="<%=dep.downloaded%>" target="_blank"><%=dep.uri%></a><div class='flexible'></div></div>
198
198
  <% } else { %>
199
- <div class='item'><a class='btn' href="/?mode=download&uri=<%=dep.uri%>" target="_blank"><i class="fa-solid fa-download"></i> Download</a> <%=dep.uri%><div class='flexible'></div></div>
199
+ <div class='item'><a class='btn' href="/home?mode=download&uri=<%=dep.uri%>" target="_blank"><i class="fa-solid fa-download"></i> Download</a> <%=dep.uri%><div class='flexible'></div></div>
200
200
  <% } %>
201
201
  <% }) %>
202
202
  </div>
@@ -33,7 +33,7 @@ body {
33
33
  }
34
34
  .changes .diffs .btn {
35
35
  margin-left: 5px !important;
36
- background: royalblue;
36
+ background: rgba(127, 91, 243, 0.9);
37
37
  }
38
38
  aside {
39
39
  width: 200px;
@@ -76,7 +76,7 @@ aside .item, .log .item {
76
76
  .item .switch {
77
77
  padding: 5px 10px;
78
78
  margin: 10px 0 0px;
79
- background: royalblue;
79
+ background: rgba(127, 91, 243, 0.9);
80
80
  display: block;
81
81
  text-align: center;
82
82
  }
@@ -106,12 +106,12 @@ nav {
106
106
  background: rgba(0,0,0,0.04);
107
107
  }
108
108
  body.dark nav a.btn, nav a.btn {
109
- background: royalblue;
109
+ background: rgba(127, 91, 243, 0.9);
110
110
  padding: 5px 10px;
111
111
  }
112
112
  nav a {
113
113
  display: block;
114
- color: royalblue;
114
+ color: rgba(127, 91, 243, 0.9);
115
115
  text-decoration: none;
116
116
  }
117
117
  label {
@@ -266,7 +266,7 @@ body.dark .chunk {
266
266
  height: 100%;
267
267
  }
268
268
  .chunk.selected, body.dark .chunk.selected {
269
- border: 3px solid royalblue;
269
+ border: 3px solid rgba(127, 91, 243, 0.9);
270
270
  }
271
271
 
272
272
  .add { background: #e6ffed; color: green; }
@@ -398,7 +398,7 @@ body.dark .branches .label {
398
398
  align-items: center;
399
399
  }
400
400
  .branches .btn {
401
- background: royalblue;
401
+ background: rgba(127, 91, 243, 0.9);
402
402
  padding: 2px 10px;
403
403
  }
404
404
  .branches .btn i {
@@ -464,7 +464,7 @@ body.dark .change-count {
464
464
  box-sizing: border-box;
465
465
  width: 100%;
466
466
  margin: 0;
467
- background: royalblue;
467
+ background: rgba(127, 91, 243, 0.9);
468
468
  }
469
469
 
470
470
  </style>
@@ -79,7 +79,7 @@ body {
79
79
  }
80
80
  .item .title {
81
81
  text-decoration: none;
82
- color: royalblue;
82
+ color: rgba(127, 91, 243, 0.9);
83
83
  }
84
84
  .item .col {
85
85
  padding: 10px;
@@ -174,7 +174,7 @@ body.dark .card {
174
174
  margin: 20px;
175
175
  }
176
176
  .card:hover {
177
- color: royalblue !important;
177
+ color: rgba(127, 91, 243, 0.9) !important;
178
178
  }
179
179
  .card .desc {
180
180
  opacity: 0.7;
@@ -187,7 +187,7 @@ body.dark .card {
187
187
  font-size: 50px;
188
188
  }
189
189
  a {
190
- color: royalblue;
190
+ color: rgba(127, 91, 243, 0.9);
191
191
  }
192
192
  body.dark hr {
193
193
  background: rgba(255,255,255,0.05);
@@ -124,7 +124,7 @@ body.dark .item select {
124
124
  }
125
125
  .item .title {
126
126
  text-decoration: none;
127
- color: royalblue;
127
+ color: rgba(127, 91, 243, 0.9);
128
128
  }
129
129
  .item .col {
130
130
  padding: 10px;
@@ -201,7 +201,7 @@ hr {
201
201
  margin-top: 10px;
202
202
  }
203
203
  a.link {
204
- color: royalblue;
204
+ color: rgba(127, 91, 243, 0.9);
205
205
  }
206
206
  .item .tile h2 {
207
207
  margin: 0;