fossbook 0.0.2

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 (53) hide show
  1. package/README.md +246 -0
  2. package/bin/fossbook.js +119 -0
  3. package/lib/all_posts.js +32 -0
  4. package/lib/assets/placeholder.svg +4 -0
  5. package/lib/deploy.js +202 -0
  6. package/lib/home.js +59 -0
  7. package/lib/index.js +79 -0
  8. package/lib/init.js +253 -0
  9. package/lib/mod/config.js +98 -0
  10. package/lib/mod/marked.js +95 -0
  11. package/lib/mod/page.js +115 -0
  12. package/lib/mod/page_base.js +97 -0
  13. package/lib/new.js +48 -0
  14. package/lib/posts.js +42 -0
  15. package/lib/server.js +14 -0
  16. package/lib/tag/index.js +69 -0
  17. package/lib/tag/tag.js +29 -0
  18. package/package.json +45 -0
  19. package/themes/archie/assets/fonts/ComicNeue-Bold.ttf +0 -0
  20. package/themes/archie/assets/fonts/ComicNeue-BoldItalic.ttf +0 -0
  21. package/themes/archie/assets/fonts/ComicNeue-Italic.ttf +0 -0
  22. package/themes/archie/assets/fonts/ComicNeue-Light.ttf +0 -0
  23. package/themes/archie/assets/fonts/ComicNeue-LightItalic.ttf +0 -0
  24. package/themes/archie/assets/fonts/ComicNeue-Regular.ttf +0 -0
  25. package/themes/archie/assets/fonts/LyonDisplay-Bold.otf +0 -0
  26. package/themes/archie/assets/fonts/OFL.txt +93 -0
  27. package/themes/archie/assets/fonts/fira-sans-v10-latin-regular.eot +0 -0
  28. package/themes/archie/assets/fonts/fira-sans-v10-latin-regular.svg +330 -0
  29. package/themes/archie/assets/fonts/fira-sans-v10-latin-regular.ttf +0 -0
  30. package/themes/archie/assets/fonts/fira-sans-v10-latin-regular.woff +0 -0
  31. package/themes/archie/assets/fonts/fira-sans-v10-latin-regular.woff2 +0 -0
  32. package/themes/archie/assets/fonts/ibm-plex-mono-v6-latin-500italic.eot +0 -0
  33. package/themes/archie/assets/fonts/ibm-plex-mono-v6-latin-500italic.svg +365 -0
  34. package/themes/archie/assets/fonts/ibm-plex-mono-v6-latin-500italic.ttf +0 -0
  35. package/themes/archie/assets/fonts/ibm-plex-mono-v6-latin-500italic.woff +0 -0
  36. package/themes/archie/assets/fonts/ibm-plex-mono-v6-latin-500italic.woff2 +0 -0
  37. package/themes/archie/assets/fonts/roboto-mono-v12-latin-regular.eot +0 -0
  38. package/themes/archie/assets/fonts/roboto-mono-v12-latin-regular.svg +405 -0
  39. package/themes/archie/assets/fonts/roboto-mono-v12-latin-regular.ttf +0 -0
  40. package/themes/archie/assets/fonts/roboto-mono-v12-latin-regular.woff +0 -0
  41. package/themes/archie/assets/fonts/roboto-mono-v12-latin-regular.woff2 +0 -0
  42. package/themes/archie/assets/images/node-ssg-1.png +0 -0
  43. package/themes/archie/assets/images/node-ssg-2.png +0 -0
  44. package/themes/archie/assets/styles/fonts.css +51 -0
  45. package/themes/archie/assets/styles/highlights.css +75 -0
  46. package/themes/archie/assets/styles/main.css +402 -0
  47. package/themes/archie/layouts/all_posts.html +42 -0
  48. package/themes/archie/layouts/home.html +62 -0
  49. package/themes/archie/layouts/page.html +50 -0
  50. package/themes/archie/layouts/partials/footer.html +10 -0
  51. package/themes/archie/layouts/post.html +82 -0
  52. package/themes/archie/layouts/tag.html +43 -0
  53. package/themes/archie/layouts/tag_list.html +44 -0
@@ -0,0 +1,75 @@
1
+ /* Tomorrow Night Blue Theme */
2
+ /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
3
+ /* Original theme - https://github.com/chriskempson/tomorrow-theme */
4
+ /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
5
+
6
+ /* Tomorrow Comment */
7
+ .hljs-comment,
8
+ .hljs-quote {
9
+ color: #7285b7;
10
+ }
11
+
12
+ /* Tomorrow Red */
13
+ .hljs-variable,
14
+ .hljs-template-variable,
15
+ .hljs-tag,
16
+ .hljs-name,
17
+ .hljs-selector-id,
18
+ .hljs-selector-class,
19
+ .hljs-regexp,
20
+ .hljs-deletion {
21
+ color: #ff9da4;
22
+ }
23
+
24
+ /* Tomorrow Orange */
25
+ .hljs-number,
26
+ .hljs-built_in,
27
+ .hljs-builtin-name,
28
+ .hljs-literal,
29
+ .hljs-type,
30
+ .hljs-params,
31
+ .hljs-meta,
32
+ .hljs-link {
33
+ color: #ffc58f;
34
+ }
35
+
36
+ /* Tomorrow Yellow */
37
+ .hljs-attribute {
38
+ color: #ffeead;
39
+ }
40
+
41
+ /* Tomorrow Green */
42
+ .hljs-string,
43
+ .hljs-symbol,
44
+ .hljs-bullet,
45
+ .hljs-addition {
46
+ color: #d1f1a9;
47
+ }
48
+
49
+ /* Tomorrow Blue */
50
+ .hljs-title,
51
+ .hljs-section {
52
+ color: #bbdaff;
53
+ }
54
+
55
+ /* Tomorrow Purple */
56
+ .hljs-keyword,
57
+ .hljs-selector-tag {
58
+ color: #ebbbff;
59
+ }
60
+
61
+ .hljs {
62
+ display: block;
63
+ overflow-x: auto;
64
+ background: #002451;
65
+ color: white;
66
+ padding: 0.5em;
67
+ }
68
+
69
+ .hljs-emphasis {
70
+ font-style: italic;
71
+ }
72
+
73
+ .hljs-strong {
74
+ font-weight: bold;
75
+ }
@@ -0,0 +1,402 @@
1
+ /* Markdown */
2
+ :root{
3
+ --maincolor: #bcc9fc;
4
+ --bordercl:rgb(99, 108, 118);
5
+ --callouctcolor:dodgerblue;
6
+ --hovercolor:navy;
7
+ --darkMaincolor: #50fa7b;
8
+ }
9
+ html {
10
+ color: #232333;
11
+ font-family: 'Roboto Mono', monospace;
12
+ font-size: 15px;
13
+ line-height: 1.6em;
14
+ }
15
+
16
+ /* for iOS */
17
+ @media only screen and (hover: none) and (pointer: coarse){
18
+
19
+ }
20
+
21
+ /* for desktop */
22
+ @media (min-width: 1025px) and (orientation: landscape) {
23
+ blockquote {
24
+ display: none;
25
+ }
26
+ }
27
+
28
+ body{
29
+ display: block;
30
+ margin: 8px;
31
+ }
32
+ * {
33
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
34
+ }
35
+
36
+ ::selection {
37
+ background: var(--maincolor);
38
+ color: #fff;
39
+ }
40
+
41
+ p {
42
+ line-height: 1.5;
43
+ }
44
+
45
+ hr {
46
+ border: 0;
47
+ border-top: 3px dotted var(--bordercl);
48
+ margin: 1em 0;
49
+ }
50
+
51
+
52
+ .blockquote-container {
53
+ display: flex;
54
+ justify-content: center;
55
+ }
56
+
57
+
58
+ blockquote {
59
+ margin: 0;
60
+ font-family: "Playpen Sans", cursive;
61
+ font-optical-sizing: auto;
62
+ font-weight: 400;
63
+ font-style: normal;
64
+ font-size: 1rem;
65
+ }
66
+
67
+ a {
68
+ border-bottom: 3px solid var(--maincolor);
69
+ color: inherit;
70
+ text-decoration: none;
71
+ }
72
+ a:hover {
73
+ background-color: var(--hovercolor);
74
+ color: #fff;
75
+ }
76
+
77
+ ul {
78
+ list-style: none;
79
+ padding-left: 2ch;
80
+ }
81
+ ul li {
82
+ text-indent: -2ch;
83
+ }
84
+ ul > li::before {
85
+ content: '* ';
86
+ font-weight: bold;
87
+ }
88
+
89
+ /*
90
+ ul.pagination {
91
+ display: flex;
92
+ justify-content: space-between;
93
+ }
94
+ ul.pagination {
95
+ display: block;
96
+ text-align: right;
97
+ }
98
+ */
99
+
100
+ ul.pagination-post {
101
+ font-size: small;
102
+ display: flex;
103
+ justify-content: space-between;
104
+ }
105
+
106
+ /* Images */
107
+ img {
108
+ max-width: 100%;
109
+ }
110
+
111
+ /* Default style */
112
+ .responsive-image {
113
+ width: 40%;
114
+ }
115
+
116
+ /* for iOS */
117
+ @media only screen and (hover: none) and (pointer: coarse){
118
+ .responsive-image {
119
+ width: 80%;
120
+ }
121
+ }
122
+
123
+ figure {
124
+ box-sizing: border-box;
125
+ display: inline-block;
126
+ margin: 0;
127
+ max-width: 100%;
128
+ }
129
+
130
+ figure img {
131
+ max-height: 500px;
132
+ }
133
+
134
+ @media screen and (min-width: 600px) {
135
+ figure {
136
+ padding: 0 40px;
137
+ }
138
+ }
139
+
140
+ figure h4 {
141
+ font-size: 1rem;
142
+ margin: 0;
143
+ margin-bottom: 1em;
144
+ }
145
+ figure h4::before {
146
+ content: '↳ ';
147
+ }
148
+
149
+ /* Code blocks */
150
+ code {
151
+ background-color: #f1f1f1;
152
+ padding: .1em .2em;
153
+ }
154
+
155
+ pre {
156
+ background-color: #ececec;
157
+ line-height: 1.4;
158
+ overflow-x: auto;
159
+ padding: 1em;
160
+ }
161
+
162
+ .highlight pre ::selection {
163
+ background: rgba(255, 255, 255, 0.2);
164
+ color: inherit;
165
+ }
166
+
167
+ pre code {
168
+ background-color: transparent;
169
+ color: inherit;
170
+ font-size: 100%;
171
+ padding: 0;
172
+ }
173
+
174
+ /* Containers */
175
+ .content {
176
+ margin-bottom: 4em;
177
+ margin-left: auto;
178
+ margin-right: auto;
179
+ max-width: 700px;
180
+ padding: 0 1ch;
181
+ word-wrap: break-word;
182
+ }
183
+
184
+ /* Header */
185
+ header {
186
+ display: flex;
187
+ flex-wrap: wrap;
188
+ justify-content: space-between;
189
+ margin: 1em 0;
190
+ line-height: 2.5em;
191
+ }
192
+
193
+ header .main {
194
+ font-size: 1.5rem;
195
+ }
196
+ h1, h2, h3, h4, h5, h6 {
197
+ font-size: 1.2rem;
198
+ margin-top: 2em;
199
+ }
200
+
201
+ h1::before { color: var(--maincolor); content: '# '; }
202
+ h2::before { color: var(--maincolor); content: '## '; }
203
+ h3::before { color: var(--maincolor); content: '### '; }
204
+ h4::before { color: var(--maincolor); content: '#### '; }
205
+ h5::before { color: var(--maincolor); content: '##### '; }
206
+ h6::before { color: var(--maincolor); content: '###### '; }
207
+
208
+ .meta {
209
+ color: #999;
210
+ letter-spacing: -0.5px;
211
+ }
212
+
213
+ .description {
214
+ font-size: 1rem;
215
+ }
216
+
217
+ /* navigation */
218
+ h1.assistive-text {
219
+ display: none;
220
+ }
221
+ nav.post-navigation {
222
+ display: flex;
223
+ justify-content: end;
224
+ margin: 2em 0;
225
+ font-size: small;
226
+ }
227
+ /* delete */
228
+
229
+ /* Footer */
230
+ footer {
231
+ display: flex;
232
+ align-items: center;
233
+ border-top: 0.4rem dotted var(--bordercl);
234
+ padding: 2rem 0rem;
235
+ margin-top: 2rem;
236
+ }
237
+ .soc {
238
+ display: flex;
239
+ align-items: center;
240
+ border-bottom: none;
241
+ }
242
+ .border {
243
+ margin-left: 0.5rem;
244
+ margin-right: 0.5rem;
245
+ border: 1px solid;
246
+ border-color: var(--bordercl);
247
+ }
248
+ .footer-info {
249
+ padding: var(--footer-padding);
250
+ }
251
+
252
+ /* Common */
253
+ .title h1 {
254
+ margin-bottom: 0;
255
+ }
256
+
257
+ time {
258
+ color: grey;
259
+ }
260
+
261
+ /* Posts */
262
+ article .title {
263
+ margin-bottom: 1em;
264
+ }
265
+
266
+ .disable-link {
267
+ color: grey;
268
+ }
269
+
270
+ /* Callout */
271
+ .callout {
272
+ background-color: var(--callouctcolor);
273
+ color: #fff;
274
+ padding: 1em;
275
+ }
276
+
277
+ .callout p {
278
+ font-family: 'IBM Plex Mono', monospace;
279
+ margin: 0;
280
+ }
281
+
282
+ .callout a {
283
+ border-bottom: 3px solid #fff;
284
+ }
285
+
286
+ .callout a:hover {
287
+ background-color: #fff;
288
+ color: var(--callouctcolor);
289
+ }
290
+
291
+ .site-description {
292
+ display: flex;
293
+ justify-content: space-between;
294
+ }
295
+ .tags li::before{
296
+ content: "🏷 ";
297
+ }
298
+ .tags a{
299
+ border-bottom: 3px solid var(--maincolor);
300
+ }
301
+ .tags a:hover{
302
+ color:white;
303
+ background-color: var(--hovercolor);
304
+ }
305
+ svg{
306
+ max-height: 15px;
307
+ }
308
+ .soc:hover{
309
+ color: white;
310
+ }
311
+ .draft-label{
312
+ color: var(--bordercl);
313
+ text-decoration: none;
314
+ padding: 2px 4px;
315
+ border-radius: 4px;
316
+ margin-left: 6px;
317
+ background-color: #f9f2f4;
318
+ }
319
+ .highlight {
320
+ position: relative;
321
+ -webkit-overflow-scrolling: touch;
322
+ }
323
+ .highlight pre code[class*="language-"] {
324
+ -webkit-overflow-scrolling: touch;
325
+ }
326
+ .highlight pre code[class*="language-"]::before {
327
+ background: black;
328
+ border-radius: 0 0 0.25rem 0.25rem;
329
+ color: white;
330
+ font-size: 12px;
331
+ letter-spacing: 0.025rem;
332
+ padding: 0.1rem 0.5rem;
333
+ position: absolute;
334
+ right: 1rem;
335
+ text-align: right;
336
+ text-transform: uppercase;
337
+ top: 0;
338
+ }
339
+
340
+ .highlight pre code[class=language-javaScript]::before,
341
+ .highlight pre code[class="language-js"]::before {
342
+ content: "js";
343
+ background: #f7df1e;
344
+ color: black;
345
+ }
346
+ .highlight pre code[class*='language-yml']::before,
347
+ .highlight pre code[class*='language-yaml']::before {
348
+ content: 'yaml';
349
+ background: #f71e6a;
350
+ color: white;
351
+ }
352
+ .highlight pre code[class*='language-shell']::before,
353
+ .highlight pre code[class*='language-bash']::before,
354
+ .highlight pre code[class*='language-sh']::before {
355
+ content: 'shell';
356
+ background: green;
357
+ color:white
358
+ }
359
+ .highlight pre code[class*='language-json']::before{
360
+ content: 'json';
361
+ background: dodgerblue;
362
+ color: #000000
363
+ }
364
+ .highlight pre code[class*='language-python']::before,
365
+ .highlight pre code[class*='language-py']::before {
366
+ content: 'py';
367
+ background: blue;
368
+ color: yellow ;
369
+ }
370
+ .highlight pre code[class*='language-css']::before{
371
+ content: 'css';
372
+ background: cyan;
373
+ color: black ;
374
+ }
375
+ .highlight pre code[class*='language-go']::before{
376
+ content: 'Go';
377
+ background: cyan;
378
+ color: royalblue ;
379
+ }
380
+ .highlight pre code[class*='language-md']::before,
381
+ .highlight pre code[class*='language-md']::before{
382
+ content: 'Markdown';
383
+ background: royalblue;
384
+ color: whitesmoke ;
385
+ }
386
+
387
+ /* table */
388
+ table {
389
+ border-spacing: 0;
390
+ border-collapse: collapse;
391
+ }
392
+
393
+ table th{
394
+ padding: 6px 13px;
395
+ border: 1px solid #dfe2e5;
396
+ font-size: large;
397
+ }
398
+
399
+ table td{
400
+ padding: 6px 13px;
401
+ border: 1px solid #dfe2e5;
402
+ }
@@ -0,0 +1,42 @@
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
+ <meta name="description" content="${page.config.blogDescription}" />
7
+ <link rel="stylesheet" href="/styles/fonts.css">
8
+ <link rel="stylesheet" href="/styles/main.css">
9
+ <link rel="icon" type="image/png" href="/images/favicon.png">
10
+ <!-- Google tag (gtag.js) -->
11
+ ${page.config.googleAnalyticsID ? page.googleAnalytics(page.config.googleAnalyticsID) : ""}
12
+ <title>${page.config.blogName}: ${data.pageTitle}</title>
13
+ ${page.openGraph("website")}
14
+ </head>
15
+ <body>
16
+ <div class="content">
17
+ <header>
18
+ <div class="main">${page.config.blogName}</div>
19
+ <nav>
20
+ <a href="/">Home</a>
21
+ ${data.pageTitle}
22
+ <a href="/about">About</a>
23
+ <a href="/tags">Tags</a>
24
+ </nav>
25
+ </header>
26
+ <h1 class="page-title">${data.pageTitle}</h1>
27
+ <ul class="posts">
28
+ ${data.posts
29
+ .map(
30
+ (post) => `<li class="post">
31
+ <a href="/${post.path}">${post.title}</a><span class="meta">
32
+ ${new Date(post.date).toDateString()}</span>
33
+ </li>`,
34
+ )
35
+ .join("")}
36
+ </ul>
37
+ <footer>
38
+ ${page.footer()}
39
+ </footer>
40
+ </div>
41
+ </body>
42
+ </html>
@@ -0,0 +1,62 @@
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
+ <link rel="stylesheet" href="/styles/fonts.css">
7
+ <link rel="stylesheet" href="/styles/main.css">
8
+ <link rel="icon" type="image/png" href="/images/favicon.png">
9
+ <!-- Google tag (gtag.js) -->
10
+ ${page.config.googleAnalyticsID ? page.googleAnalytics(page.config.googleAnalyticsID) : ""}
11
+ <title>${page.config.blogName}</title>
12
+ <meta name="description" content="${page.config.blogDescription}" />
13
+ ${page.openGraph("website")}
14
+ <!-- Twitter Card -->
15
+ ${page.twitterCard("summary")}
16
+ </head>
17
+ <body>
18
+ <div class="content">
19
+ <header>
20
+ <div class="main">${page.config.blogName}</div>
21
+ <nav>
22
+ Home
23
+ <a href="/all_posts">All posts</a>
24
+ <a href="/about">About</a>
25
+ <a href="/tags">Tags</a>
26
+ </nav>
27
+ </header>
28
+
29
+ <main class="list">
30
+ <div class="site-description" aria-label="Site description">
31
+ <p>${page.config.blogDescription}</p>
32
+ </div>
33
+ ${data.posts
34
+ .map(
35
+ (
36
+ post,
37
+ ) => `<section class="list-item" aria-label="Summary of post">
38
+ <h1><a href="/${post.path}">${post.title}</a></h1>
39
+ <time>${page.formatDate(new Date(post.date))}</time>
40
+ ${post.image ? `<div class="responsive-image">
41
+ <img src="/${post.path}/images/${post.image}" alt="${post.title}">
42
+ </div>` : ''}
43
+ <div class="description">${post.description || ''}</div>
44
+ <a class="readmore" href="/${post.path}">Read more ⟶</a>
45
+ </section>`,
46
+ )
47
+ .join("")}
48
+ <ul class="pagination" role="navigation">
49
+ <span class="page-item page-prev">
50
+ ${data.prev ? `<a href="/page/${data.prev}.html" class="page-link" aria-label="Previous">← Prev</a>` : `<span class="page-link disable-link"><span aria-hidden="true">← Prev</span></span>`}
51
+ </span>
52
+ <span class="page-item page-next">
53
+ ${data.next ? `<a href="page/${data.next}.html" class="page-link" aria-label="Next">Next →</a>` : `<span class="page-link disable-link"><span aria-hidden="true">Next →</span></span>`}
54
+ </span>
55
+ </ul>
56
+ </main>
57
+ <footer>
58
+ ${page.footer()}
59
+ </footer>
60
+ </div>
61
+ </body>
62
+ </html>
@@ -0,0 +1,50 @@
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
+ <link rel="stylesheet" href="../styles/fonts.css">
7
+ <link rel="stylesheet" href="../styles/main.css">
8
+ <link rel="icon" type="image/png" href="../images/favicon.png">
9
+ <!-- Google tag (gtag.js) -->
10
+ ${page.config.googleAnalyticsID ? page.googleAnalytics(page.config.googleAnalyticsID) : ""}
11
+ <title>${page.config.blogName}: ${page.title}</title>
12
+ <meta name="description" content="${page.config.blogDescription}" />
13
+ ${page.openGraph("website")}
14
+
15
+ <meta name="twitter:card" content="summary_large_image" />
16
+ <meta name="twitter:site" content="${page.config.blogsite}" />
17
+ <meta name="twitter:title" content="${page.config.blogName}: ${page.title}" />
18
+ <meta name="twitter:description" content="${page.config.blogDescription}" />
19
+ <meta name="twitter:image" content="${page.imageURL}" />
20
+ </head>
21
+ <body>
22
+ <div class="content">
23
+ <header>
24
+ <div class="main">
25
+ ${page.config.blogName}
26
+ </div>
27
+ <nav class="site-navigation">
28
+ <a href="/">Home</a>
29
+ <a href="/all_posts">All posts</a>
30
+ About
31
+ <a href="/tags">Tags</a>
32
+ </nav>
33
+ </header>
34
+ <main>
35
+ <article class="content">
36
+ <div class="title">
37
+ <h1 class="title">${page.title}</h1>
38
+ </div>
39
+ <section class="body">
40
+ ${page.body}
41
+ </section>
42
+ </article>
43
+ </main>
44
+
45
+ <footer>
46
+ ${page.footer()}
47
+ </footer>
48
+ </div>
49
+ </body>
50
+ </html>
@@ -0,0 +1,10 @@
1
+ <div style="display:flex">
2
+ <a class="soc" href="${config.githubRepository}" rel="me" title="GitHub"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-github"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg></a>
3
+ <a class="border"></a><a class="soc" href="https://twitter.com/${config.siteTwitter}" rel="me" title="Twitter"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-twitter"><path d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z"></path></svg></a>
4
+ <a class="border"></a>
5
+ </div>
6
+ <div class="footer-info">
7
+ ${`© ${new Date().getFullYear()} ${
8
+ config.authorName
9
+ } | <a href="https://github.com/joone/fossbook">fossbook v${config.version}</a> | Published on ${config.date_time}`}
10
+ </div>