Fossil SCM

Fixes to the new script element of skins.

drh 2018-09-11 00:52 trunk
Commit c22b71dfc823860c4297d4219e341cd05d9bb645783b3d50fc6b252de970e57e
--- skins/default/footer.txt
+++ skins/default/footer.txt
@@ -1,131 +1,8 @@
11
<div class="footer">
22
This page was generated in about
33
<th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by
44
Fossil $release_version $manifest_version $manifest_date
55
</div>
6
-
7
-<th1>
8
- html "<script nonce='$nonce'>"
9
- html " (function() { var home='$home'; "
10
-</th1>
11
- var panel = document.getElementById("hbdrop");
12
- if (!panel) return; // site admin might've nuked it
13
- var panelBorder = panel.style.border;
14
- var animate = panel.style.hasOwnProperty('transition');
15
- var animMS = 400;
16
-
17
- // Calculate panel height despite its being hidden at call time.
18
- // Based on https://stackoverflow.com/a/29047447/142454
19
- var panelHeight; // computed on sitemap load
20
- function calculatePanelHeight() {
21
- // Get initial panel styles so we can restore them below.
22
- var es = window.getComputedStyle(panel),
23
- edis = es.display,
24
- epos = es.position,
25
- evis = es.visibility;
26
-
27
- // Restyle the panel so we can measure its height while invisible.
28
- panel.style.visibility = 'hidden';
29
- panel.style.position = 'absolute';
30
- panel.style.display = 'block';
31
- panelHeight = panel.offsetHeight + 'px';
32
-
33
- // Revert styles now that job is done.
34
- panel.style.display = edis;
35
- panel.style.position = epos;
36
- panel.style.visibility = evis;
37
- }
38
-
39
- // Show the panel by changing the panel height, which kicks off the
40
- // slide-open/closed transition set up in the XHR onload handler.
41
- //
42
- // Schedule the change for a near-future time in case this is the
43
- // first call, where the div was initially invisible. That causes
44
- // the browser to consider the height change as part of the same
45
- // state change as the visibility change, so it doesn't see a state
46
- // *transition*, hence never kicks off the *CSS* transition:
47
- //
48
- // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions#JavaScript_examples
49
- function showPanel() {
50
- if (animate) {
51
- setTimeout(function() {
52
- panel.style.maxHeight = panelHeight;
53
- panel.style.border = panelBorder;
54
- }, 40); // 25ms is insufficient with Firefox 62
55
- }
56
- else {
57
- panel.style.display = 'block';
58
- }
59
- }
60
-
61
- // Return true if the panel is showing.
62
- function panelShowing() {
63
- if (animate) {
64
- return panel.style.maxHeight == panelHeight;
65
- }
66
- else {
67
- return panel.style.display == 'block';
68
- }
69
- }
70
-
71
- // Click handler for the hamburger button.
72
- var needSitemapHTML = true;
73
- document.querySelector("div.mainmenu > a").onclick = function() {
74
- if (panelShowing()) {
75
- // Transition back to hidden state.
76
- if (animate) {
77
- panel.style.maxHeight = '0';
78
- setTimeout(function() {
79
- // Browsers show a 1px high border line when maxHeight == 0,
80
- // our "hidden" state, so hide the borders in that state, too.
81
- panel.style.border = 'none';
82
- }, animMS);
83
- }
84
- else {
85
- panel.style.display = 'none';
86
- }
87
- }
88
- else if (needSitemapHTML) {
89
- // Only get it once per page load: it isn't likely to
90
- // change on us.
91
- var xhr = new XMLHttpRequest();
92
- xhr.onload = function() {
93
- var doc = xhr.responseXML;
94
- if (doc) {
95
- var sm = doc.querySelector("ul#sitemap");
96
- if (sm && xhr.status == 200) {
97
- // Got sitemap. Insert it into the drop-down panel.
98
- needSitemapHTML = false;
99
- panel.innerHTML = sm.outerHTML;
100
- if (window.setAllHrefs) {
101
- setAllHrefs(); // don't need anti-robot defense here
102
- }
103
-
104
- // Display the panel
105
- if (animate) {
106
- // Set up a CSS transition to animate the panel open and
107
- // closed. Only needs to be done once per page load.
108
- // Based on https://stackoverflow.com/a/29047447/142454
109
- calculatePanelHeight();
110
- panel.style.transition = 'max-height ' +
111
- (animMS / 1000) + 's ease-in-out';
112
- panel.style.overflowY = 'hidden';
113
- panel.style.maxHeight = '0';
114
- showPanel();
115
- }
116
- panel.style.display = 'block';
117
- }
118
- }
119
- // else, can't parse response as HTML or XML
120
- }
121
- xhr.open("GET", home + "/sitemap");
122
- xhr.responseType = "document";
123
- xhr.send();
124
- }
125
- else {
126
- showPanel(); // just show what we built above
127
- }
128
- return false; // prevent browser from acting on <a> click
129
- }
130
- })();
6
+<script nonce="$nonce">
7
+<th1>styleScript</th1>
1318
</script>
1329
13310
ADDED skins/default/js.txt
13411
DELETED skins/default/script.txt
--- skins/default/footer.txt
+++ skins/default/footer.txt
@@ -1,131 +1,8 @@
1 <div class="footer">
2 This page was generated in about
3 <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by
4 Fossil $release_version $manifest_version $manifest_date
5 </div>
6
7 <th1>
8 html "<script nonce='$nonce'>"
9 html " (function() { var home='$home'; "
10 </th1>
11 var panel = document.getElementById("hbdrop");
12 if (!panel) return; // site admin might've nuked it
13 var panelBorder = panel.style.border;
14 var animate = panel.style.hasOwnProperty('transition');
15 var animMS = 400;
16
17 // Calculate panel height despite its being hidden at call time.
18 // Based on https://stackoverflow.com/a/29047447/142454
19 var panelHeight; // computed on sitemap load
20 function calculatePanelHeight() {
21 // Get initial panel styles so we can restore them below.
22 var es = window.getComputedStyle(panel),
23 edis = es.display,
24 epos = es.position,
25 evis = es.visibility;
26
27 // Restyle the panel so we can measure its height while invisible.
28 panel.style.visibility = 'hidden';
29 panel.style.position = 'absolute';
30 panel.style.display = 'block';
31 panelHeight = panel.offsetHeight + 'px';
32
33 // Revert styles now that job is done.
34 panel.style.display = edis;
35 panel.style.position = epos;
36 panel.style.visibility = evis;
37 }
38
39 // Show the panel by changing the panel height, which kicks off the
40 // slide-open/closed transition set up in the XHR onload handler.
41 //
42 // Schedule the change for a near-future time in case this is the
43 // first call, where the div was initially invisible. That causes
44 // the browser to consider the height change as part of the same
45 // state change as the visibility change, so it doesn't see a state
46 // *transition*, hence never kicks off the *CSS* transition:
47 //
48 // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions#JavaScript_examples
49 function showPanel() {
50 if (animate) {
51 setTimeout(function() {
52 panel.style.maxHeight = panelHeight;
53 panel.style.border = panelBorder;
54 }, 40); // 25ms is insufficient with Firefox 62
55 }
56 else {
57 panel.style.display = 'block';
58 }
59 }
60
61 // Return true if the panel is showing.
62 function panelShowing() {
63 if (animate) {
64 return panel.style.maxHeight == panelHeight;
65 }
66 else {
67 return panel.style.display == 'block';
68 }
69 }
70
71 // Click handler for the hamburger button.
72 var needSitemapHTML = true;
73 document.querySelector("div.mainmenu > a").onclick = function() {
74 if (panelShowing()) {
75 // Transition back to hidden state.
76 if (animate) {
77 panel.style.maxHeight = '0';
78 setTimeout(function() {
79 // Browsers show a 1px high border line when maxHeight == 0,
80 // our "hidden" state, so hide the borders in that state, too.
81 panel.style.border = 'none';
82 }, animMS);
83 }
84 else {
85 panel.style.display = 'none';
86 }
87 }
88 else if (needSitemapHTML) {
89 // Only get it once per page load: it isn't likely to
90 // change on us.
91 var xhr = new XMLHttpRequest();
92 xhr.onload = function() {
93 var doc = xhr.responseXML;
94 if (doc) {
95 var sm = doc.querySelector("ul#sitemap");
96 if (sm && xhr.status == 200) {
97 // Got sitemap. Insert it into the drop-down panel.
98 needSitemapHTML = false;
99 panel.innerHTML = sm.outerHTML;
100 if (window.setAllHrefs) {
101 setAllHrefs(); // don't need anti-robot defense here
102 }
103
104 // Display the panel
105 if (animate) {
106 // Set up a CSS transition to animate the panel open and
107 // closed. Only needs to be done once per page load.
108 // Based on https://stackoverflow.com/a/29047447/142454
109 calculatePanelHeight();
110 panel.style.transition = 'max-height ' +
111 (animMS / 1000) + 's ease-in-out';
112 panel.style.overflowY = 'hidden';
113 panel.style.maxHeight = '0';
114 showPanel();
115 }
116 panel.style.display = 'block';
117 }
118 }
119 // else, can't parse response as HTML or XML
120 }
121 xhr.open("GET", home + "/sitemap");
122 xhr.responseType = "document";
123 xhr.send();
124 }
125 else {
126 showPanel(); // just show what we built above
127 }
128 return false; // prevent browser from acting on <a> click
129 }
130 })();
131 </script>
132
133 DDED skins/default/js.txt
134 ELETED skins/default/script.txt
--- skins/default/footer.txt
+++ skins/default/footer.txt
@@ -1,131 +1,8 @@
1 <div class="footer">
2 This page was generated in about
3 <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by
4 Fossil $release_version $manifest_version $manifest_date
5 </div>
6 <script nonce="$nonce">
7 <th1>styleScript</th1>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8 </script>
9
10 DDED skins/default/js.txt
11 ELETED skins/default/script.txt
--- a/skins/default/js.txt
+++ b/skins/default/js.txt
@@ -1,6 +1,6 @@
11
2
- (animMS / 1000) + home='$home'; "000) + 'That causes
2
+ (animMS / 1000) + home='$home';000) + 'That causes
33
// the browser to consider the height change as part of the same
44
// state change as the visibility change, so it doesn't see a state
55
// *transition*, hence never kicks off the *CSS*home + "/sitemap");
6
- (animMS / 1000) + '+ 'GE);
6
+ (animMS / 1000) + '+ '
--- a/skins/default/js.txt
+++ b/skins/default/js.txt
@@ -1,6 +1,6 @@
1
2 (animMS / 1000) + home='$home'; "000) + 'That causes
3 // the browser to consider the height change as part of the same
4 // state change as the visibility change, so it doesn't see a state
5 // *transition*, hence never kicks off the *CSS*home + "/sitemap");
6 (animMS / 1000) + '+ 'GE);
--- a/skins/default/js.txt
+++ b/skins/default/js.txt
@@ -1,6 +1,6 @@
1
2 (animMS / 1000) + home='$home';000) + 'That causes
3 // the browser to consider the height change as part of the same
4 // state change as the visibility change, so it doesn't see a state
5 // *transition*, hence never kicks off the *CSS*home + "/sitemap");
6 (animMS / 1000) + '+ '
D skins/default/script.txt
-6
--- a/skins/default/script.txt
+++ b/skins/default/script.txt
@@ -1,6 +0,0 @@
1
-
2
- (animMS / 1000) + home='$home'; "000) + 'That causes
3
- // the browser to consider the height change as part of the same
4
- // state change as the visibility change, so it doesn't see a state
5
- // *transition*, hence never kicks off the *CSS*home + "/sitemap");
6
- (animMS / 1000) + '+ 'GE);
--- a/skins/default/script.txt
+++ b/skins/default/script.txt
@@ -1,6 +0,0 @@
1
2 (animMS / 1000) + home='$home'; "000) + 'That causes
3 // the browser to consider the height change as part of the same
4 // state change as the visibility change, so it doesn't see a state
5 // *transition*, hence never kicks off the *CSS*home + "/sitemap");
6 (animMS / 1000) + '+ 'GE);
--- a/skins/default/script.txt
+++ b/skins/default/script.txt
@@ -1,6 +0,0 @@
 
 
 
 
 
 
--- src/main.mk
+++ src/main.mk
@@ -178,10 +178,11 @@
178178
$(SRCDIR)/../skins/bootstrap/header.txt \
179179
$(SRCDIR)/../skins/default/css.txt \
180180
$(SRCDIR)/../skins/default/details.txt \
181181
$(SRCDIR)/../skins/default/footer.txt \
182182
$(SRCDIR)/../skins/default/header.txt \
183
+ $(SRCDIR)/../skins/default/js.txt \
183184
$(SRCDIR)/../skins/eagle/css.txt \
184185
$(SRCDIR)/../skins/eagle/details.txt \
185186
$(SRCDIR)/../skins/eagle/footer.txt \
186187
$(SRCDIR)/../skins/eagle/header.txt \
187188
$(SRCDIR)/../skins/enhanced1/css.txt \
188189
--- src/main.mk
+++ src/main.mk
@@ -178,10 +178,11 @@
178 $(SRCDIR)/../skins/bootstrap/header.txt \
179 $(SRCDIR)/../skins/default/css.txt \
180 $(SRCDIR)/../skins/default/details.txt \
181 $(SRCDIR)/../skins/default/footer.txt \
182 $(SRCDIR)/../skins/default/header.txt \
 
183 $(SRCDIR)/../skins/eagle/css.txt \
184 $(SRCDIR)/../skins/eagle/details.txt \
185 $(SRCDIR)/../skins/eagle/footer.txt \
186 $(SRCDIR)/../skins/eagle/header.txt \
187 $(SRCDIR)/../skins/enhanced1/css.txt \
188
--- src/main.mk
+++ src/main.mk
@@ -178,10 +178,11 @@
178 $(SRCDIR)/../skins/bootstrap/header.txt \
179 $(SRCDIR)/../skins/default/css.txt \
180 $(SRCDIR)/../skins/default/details.txt \
181 $(SRCDIR)/../skins/default/footer.txt \
182 $(SRCDIR)/../skins/default/header.txt \
183 $(SRCDIR)/../skins/default/js.txt \
184 $(SRCDIR)/../skins/eagle/css.txt \
185 $(SRCDIR)/../skins/eagle/details.txt \
186 $(SRCDIR)/../skins/eagle/footer.txt \
187 $(SRCDIR)/../skins/eagle/header.txt \
188 $(SRCDIR)/../skins/enhanced1/css.txt \
189
+15 -3
--- src/sitemap.c
+++ src/sitemap.c
@@ -31,10 +31,11 @@
3131
*/
3232
void sitemap_page(void){
3333
int srchFlags;
3434
int inSublist = 0;
3535
int i;
36
+ int isPopup = 0; /* This is an XMLHttpRequest() for /sitemap */
3637
const struct {
3738
const char *zTitle;
3839
const char *zProperty;
3940
} aExtra[] = {
4041
{ "Documentation", "sitemap-docidx" },
@@ -42,13 +43,22 @@
4243
{ "License", "sitemap-license" },
4344
{ "Contact", "sitemap-contact" },
4445
};
4546
4647
login_check_credentials();
48
+ if( P("popup")!=0 && cgi_csrf_safe(1) ){
49
+ /* If this is a POST from the same origin with the popup=1 parameter,
50
+ ** then disable anti-robot defenses */
51
+ isPopup = 1;
52
+ g.perm.Hyperlink = 1;
53
+ g.javascriptHyperlink = 0;
54
+ }
4755
srchFlags = search_restrict(SRCH_ALL);
48
- style_header("Site Map");
49
- style_adunit_config(ADUNIT_RIGHT_OK);
56
+ if( !isPopup ){
57
+ style_header("Site Map");
58
+ style_adunit_config(ADUNIT_RIGHT_OK);
59
+ }
5060
@ <ul id="sitemap" class="columns" style="column-width:20em">
5161
@ <li>%z(href("%R/home"))Home Page</a>
5262
for(i=0; i<sizeof(aExtra)/sizeof(aExtra[0]); i++){
5363
char *z = db_get(aExtra[i].zProperty,0);
5464
if( z==0 || z[0]==0 ) continue;
@@ -210,7 +220,9 @@
210220
@ <li>%z(href("%R/hash-color-test"))Page to experiment with the automatic
211221
@ colors assigned to branch names</a>
212222
@ <li>%z(href("%R/test-captcha"))Random ASCII-art Captcha image</a></li>
213223
@ </ul></li>
214224
@ </ul>
215
- style_footer();
225
+ if( !isPopup ){
226
+ style_footer();
227
+ }
216228
}
217229
--- src/sitemap.c
+++ src/sitemap.c
@@ -31,10 +31,11 @@
31 */
32 void sitemap_page(void){
33 int srchFlags;
34 int inSublist = 0;
35 int i;
 
36 const struct {
37 const char *zTitle;
38 const char *zProperty;
39 } aExtra[] = {
40 { "Documentation", "sitemap-docidx" },
@@ -42,13 +43,22 @@
42 { "License", "sitemap-license" },
43 { "Contact", "sitemap-contact" },
44 };
45
46 login_check_credentials();
 
 
 
 
 
 
 
47 srchFlags = search_restrict(SRCH_ALL);
48 style_header("Site Map");
49 style_adunit_config(ADUNIT_RIGHT_OK);
 
 
50 @ <ul id="sitemap" class="columns" style="column-width:20em">
51 @ <li>%z(href("%R/home"))Home Page</a>
52 for(i=0; i<sizeof(aExtra)/sizeof(aExtra[0]); i++){
53 char *z = db_get(aExtra[i].zProperty,0);
54 if( z==0 || z[0]==0 ) continue;
@@ -210,7 +220,9 @@
210 @ <li>%z(href("%R/hash-color-test"))Page to experiment with the automatic
211 @ colors assigned to branch names</a>
212 @ <li>%z(href("%R/test-captcha"))Random ASCII-art Captcha image</a></li>
213 @ </ul></li>
214 @ </ul>
215 style_footer();
 
 
216 }
217
--- src/sitemap.c
+++ src/sitemap.c
@@ -31,10 +31,11 @@
31 */
32 void sitemap_page(void){
33 int srchFlags;
34 int inSublist = 0;
35 int i;
36 int isPopup = 0; /* This is an XMLHttpRequest() for /sitemap */
37 const struct {
38 const char *zTitle;
39 const char *zProperty;
40 } aExtra[] = {
41 { "Documentation", "sitemap-docidx" },
@@ -42,13 +43,22 @@
43 { "License", "sitemap-license" },
44 { "Contact", "sitemap-contact" },
45 };
46
47 login_check_credentials();
48 if( P("popup")!=0 && cgi_csrf_safe(1) ){
49 /* If this is a POST from the same origin with the popup=1 parameter,
50 ** then disable anti-robot defenses */
51 isPopup = 1;
52 g.perm.Hyperlink = 1;
53 g.javascriptHyperlink = 0;
54 }
55 srchFlags = search_restrict(SRCH_ALL);
56 if( !isPopup ){
57 style_header("Site Map");
58 style_adunit_config(ADUNIT_RIGHT_OK);
59 }
60 @ <ul id="sitemap" class="columns" style="column-width:20em">
61 @ <li>%z(href("%R/home"))Home Page</a>
62 for(i=0; i<sizeof(aExtra)/sizeof(aExtra[0]); i++){
63 char *z = db_get(aExtra[i].zProperty,0);
64 if( z==0 || z[0]==0 ) continue;
@@ -210,7 +220,9 @@
220 @ <li>%z(href("%R/hash-color-test"))Page to experiment with the automatic
221 @ colors assigned to branch names</a>
222 @ <li>%z(href("%R/test-captcha"))Random ASCII-art Captcha image</a></li>
223 @ </ul></li>
224 @ </ul>
225 if( !isPopup ){
226 style_footer();
227 }
228 }
229
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -600,10 +600,11 @@
600600
$(SRCDIR)/../skins/bootstrap/header.txt \
601601
$(SRCDIR)/../skins/default/css.txt \
602602
$(SRCDIR)/../skins/default/details.txt \
603603
$(SRCDIR)/../skins/default/footer.txt \
604604
$(SRCDIR)/../skins/default/header.txt \
605
+ $(SRCDIR)/../skins/default/js.txt \
605606
$(SRCDIR)/../skins/eagle/css.txt \
606607
$(SRCDIR)/../skins/eagle/details.txt \
607608
$(SRCDIR)/../skins/eagle/footer.txt \
608609
$(SRCDIR)/../skins/eagle/header.txt \
609610
$(SRCDIR)/../skins/enhanced1/css.txt \
610611
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -600,10 +600,11 @@
600 $(SRCDIR)/../skins/bootstrap/header.txt \
601 $(SRCDIR)/../skins/default/css.txt \
602 $(SRCDIR)/../skins/default/details.txt \
603 $(SRCDIR)/../skins/default/footer.txt \
604 $(SRCDIR)/../skins/default/header.txt \
 
605 $(SRCDIR)/../skins/eagle/css.txt \
606 $(SRCDIR)/../skins/eagle/details.txt \
607 $(SRCDIR)/../skins/eagle/footer.txt \
608 $(SRCDIR)/../skins/eagle/header.txt \
609 $(SRCDIR)/../skins/enhanced1/css.txt \
610
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -600,10 +600,11 @@
600 $(SRCDIR)/../skins/bootstrap/header.txt \
601 $(SRCDIR)/../skins/default/css.txt \
602 $(SRCDIR)/../skins/default/details.txt \
603 $(SRCDIR)/../skins/default/footer.txt \
604 $(SRCDIR)/../skins/default/header.txt \
605 $(SRCDIR)/../skins/default/js.txt \
606 $(SRCDIR)/../skins/eagle/css.txt \
607 $(SRCDIR)/../skins/eagle/details.txt \
608 $(SRCDIR)/../skins/eagle/footer.txt \
609 $(SRCDIR)/../skins/eagle/header.txt \
610 $(SRCDIR)/../skins/enhanced1/css.txt \
611
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -541,10 +541,11 @@
541541
$(SRCDIR)\..\skins\bootstrap\header.txt \
542542
$(SRCDIR)\..\skins\default\css.txt \
543543
$(SRCDIR)\..\skins\default\details.txt \
544544
$(SRCDIR)\..\skins\default\footer.txt \
545545
$(SRCDIR)\..\skins\default\header.txt \
546
+ $(SRCDIR)\..\skins\default\js.txt \
546547
$(SRCDIR)\..\skins\eagle\css.txt \
547548
$(SRCDIR)\..\skins\eagle\details.txt \
548549
$(SRCDIR)\..\skins\eagle\footer.txt \
549550
$(SRCDIR)\..\skins\eagle\header.txt \
550551
$(SRCDIR)\..\skins\enhanced1\css.txt \
551552
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -541,10 +541,11 @@
541 $(SRCDIR)\..\skins\bootstrap\header.txt \
542 $(SRCDIR)\..\skins\default\css.txt \
543 $(SRCDIR)\..\skins\default\details.txt \
544 $(SRCDIR)\..\skins\default\footer.txt \
545 $(SRCDIR)\..\skins\default\header.txt \
 
546 $(SRCDIR)\..\skins\eagle\css.txt \
547 $(SRCDIR)\..\skins\eagle\details.txt \
548 $(SRCDIR)\..\skins\eagle\footer.txt \
549 $(SRCDIR)\..\skins\eagle\header.txt \
550 $(SRCDIR)\..\skins\enhanced1\css.txt \
551
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -541,10 +541,11 @@
541 $(SRCDIR)\..\skins\bootstrap\header.txt \
542 $(SRCDIR)\..\skins\default\css.txt \
543 $(SRCDIR)\..\skins\default\details.txt \
544 $(SRCDIR)\..\skins\default\footer.txt \
545 $(SRCDIR)\..\skins\default\header.txt \
546 $(SRCDIR)\..\skins\default\js.txt \
547 $(SRCDIR)\..\skins\eagle\css.txt \
548 $(SRCDIR)\..\skins\eagle\details.txt \
549 $(SRCDIR)\..\skins\eagle\footer.txt \
550 $(SRCDIR)\..\skins\eagle\header.txt \
551 $(SRCDIR)\..\skins\enhanced1\css.txt \
552

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button