@wipcomputer/markdown-viewer 1.0.8 → 1.1.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 (74) hide show
  1. package/README.md +13 -0
  2. package/markdown-viewer.html +16 -16
  3. package/package.json +1 -1
  4. package/server.js +39 -4
  5. package/skills/markdown-viewer/SKILL.md +1 -1
  6. package/vendor/auto-render.min.js +1 -0
  7. package/vendor/fonts/KaTeX_AMS-Regular.ttf +0 -0
  8. package/vendor/fonts/KaTeX_AMS-Regular.woff +0 -0
  9. package/vendor/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  10. package/vendor/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  11. package/vendor/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  12. package/vendor/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  13. package/vendor/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  14. package/vendor/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  15. package/vendor/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  16. package/vendor/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  17. package/vendor/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  18. package/vendor/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  19. package/vendor/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  20. package/vendor/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  21. package/vendor/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  22. package/vendor/fonts/KaTeX_Main-Bold.ttf +0 -0
  23. package/vendor/fonts/KaTeX_Main-Bold.woff +0 -0
  24. package/vendor/fonts/KaTeX_Main-Bold.woff2 +0 -0
  25. package/vendor/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  26. package/vendor/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  27. package/vendor/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. package/vendor/fonts/KaTeX_Main-Italic.ttf +0 -0
  29. package/vendor/fonts/KaTeX_Main-Italic.woff +0 -0
  30. package/vendor/fonts/KaTeX_Main-Italic.woff2 +0 -0
  31. package/vendor/fonts/KaTeX_Main-Regular.ttf +0 -0
  32. package/vendor/fonts/KaTeX_Main-Regular.woff +0 -0
  33. package/vendor/fonts/KaTeX_Main-Regular.woff2 +0 -0
  34. package/vendor/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  35. package/vendor/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  36. package/vendor/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  37. package/vendor/fonts/KaTeX_Math-Italic.ttf +0 -0
  38. package/vendor/fonts/KaTeX_Math-Italic.woff +0 -0
  39. package/vendor/fonts/KaTeX_Math-Italic.woff2 +0 -0
  40. package/vendor/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  41. package/vendor/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  42. package/vendor/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  43. package/vendor/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  44. package/vendor/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  45. package/vendor/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  46. package/vendor/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  47. package/vendor/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  48. package/vendor/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  49. package/vendor/fonts/KaTeX_Script-Regular.ttf +0 -0
  50. package/vendor/fonts/KaTeX_Script-Regular.woff +0 -0
  51. package/vendor/fonts/KaTeX_Script-Regular.woff2 +0 -0
  52. package/vendor/fonts/KaTeX_Size1-Regular.ttf +0 -0
  53. package/vendor/fonts/KaTeX_Size1-Regular.woff +0 -0
  54. package/vendor/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  55. package/vendor/fonts/KaTeX_Size2-Regular.ttf +0 -0
  56. package/vendor/fonts/KaTeX_Size2-Regular.woff +0 -0
  57. package/vendor/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  58. package/vendor/fonts/KaTeX_Size3-Regular.ttf +0 -0
  59. package/vendor/fonts/KaTeX_Size3-Regular.woff +0 -0
  60. package/vendor/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  61. package/vendor/fonts/KaTeX_Size4-Regular.ttf +0 -0
  62. package/vendor/fonts/KaTeX_Size4-Regular.woff +0 -0
  63. package/vendor/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  64. package/vendor/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  65. package/vendor/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  66. package/vendor/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  67. package/vendor/github-dark.min.css +10 -0
  68. package/vendor/github.min.css +10 -0
  69. package/vendor/highlight.min.js +1213 -0
  70. package/vendor/katex.min.css +1 -0
  71. package/vendor/katex.min.js +1 -0
  72. package/vendor/marked.min.js +69 -0
  73. package/vendor/mermaid.min.js +2029 -0
  74. /package/{bbedit-preview-template.html → _not-used/bbedit-preview-template.html} +0 -0
package/README.md CHANGED
@@ -129,6 +129,19 @@ That's it. The server watches the file and pushes updates via SSE. You don't nee
129
129
 
130
130
  ---
131
131
 
132
+ ## Security
133
+
134
+ - Server binds to `127.0.0.1` only. It is not accessible from other machines.
135
+ - The `/view?path=` parameter reads files from your local filesystem. Use `--root` to restrict access to a specific directory tree:
136
+
137
+ ```bash
138
+ mdview --root /path/to/your/project
139
+ ```
140
+
141
+ When `--root` is set, the server will only serve files under that directory. Requests for files outside it return 404. Recommended when running in shared or multi-user environments.
142
+
143
+ ---
144
+
132
145
  ## License
133
146
 
134
147
  MIT
@@ -4,17 +4,17 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>WIP Computer: Live .md Viewer</title>
7
- <!-- Markdown parser -->
8
- <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
9
- <!-- Syntax highlighting -->
10
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/github.min.css" id="highlight-theme">
11
- <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/highlight.min.js"></script>
12
- <!-- Mermaid for diagrams -->
13
- <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
14
- <!-- KaTeX for math -->
15
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
16
- <script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
17
- <script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
7
+ <!-- Markdown parser (bundled, no CDN) -->
8
+ <script src="/vendor/marked.min.js"></script>
9
+ <!-- Syntax highlighting (bundled, no CDN) -->
10
+ <link rel="stylesheet" href="/vendor/github.min.css" id="highlight-theme">
11
+ <script src="/vendor/highlight.min.js"></script>
12
+ <!-- Mermaid for diagrams (bundled, no CDN) -->
13
+ <script src="/vendor/mermaid.min.js"></script>
14
+ <!-- KaTeX for math (bundled, no CDN) -->
15
+ <link rel="stylesheet" href="/vendor/katex.min.css">
16
+ <script src="/vendor/katex.min.js"></script>
17
+ <script src="/vendor/auto-render.min.js"></script>
18
18
  <style>
19
19
  :root {
20
20
  --bg-primary: #fcfbf9;
@@ -1312,10 +1312,10 @@
1312
1312
  // Update highlight.js theme
1313
1313
  const highlightTheme = document.getElementById('highlight-theme');
1314
1314
  if (newTheme === 'dark') {
1315
- highlightTheme.href = 'https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/github-dark.min.css';
1315
+ highlightTheme.href = '/vendor/github-dark.min.css';
1316
1316
  mermaid.initialize({ theme: 'dark' });
1317
1317
  } else {
1318
- highlightTheme.href = 'https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/github.min.css';
1318
+ highlightTheme.href = '/vendor/github.min.css';
1319
1319
  mermaid.initialize({ theme: 'default' });
1320
1320
  }
1321
1321
 
@@ -1336,7 +1336,7 @@
1336
1336
  // Update highlight.js theme
1337
1337
  const highlightTheme = document.getElementById('highlight-theme');
1338
1338
  if (savedTheme === 'dark') {
1339
- highlightTheme.href = 'https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/github-dark.min.css';
1339
+ highlightTheme.href = '/vendor/github-dark.min.css';
1340
1340
  mermaid.initialize({ theme: 'dark' });
1341
1341
  }
1342
1342
  }
@@ -1371,8 +1371,8 @@
1371
1371
  <meta charset="UTF-8">
1372
1372
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
1373
1373
  <title>${currentFile.name}</title>
1374
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/github.min.css">
1375
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
1374
+ <link rel="stylesheet" href="/vendor/github.min.css">
1375
+ <link rel="stylesheet" href="/vendor/katex.min.css">
1376
1376
  <style>
1377
1377
  body {
1378
1378
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/markdown-viewer",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "Live markdown viewer for AI pair-editing. When you collaborate, the updates render instantly. Works with any AI agent and web browser.",
5
5
  "type": "module",
6
6
  "main": "server.js",
package/server.js CHANGED
@@ -5,6 +5,7 @@
5
5
  // Usage:
6
6
  // mdview Start server, open homepage
7
7
  // mdview --port 8080 Use custom port
8
+ // mdview --root /path/to/dir Restrict file access to this directory
8
9
  //
9
10
  // Opens browser to http://127.0.0.1:3000/ — pick files, view with live reload.
10
11
 
@@ -20,18 +21,28 @@ const __dirname = dirname(__filename);
20
21
  // ── Parse args ───────────────────────────────────────────────────────
21
22
 
22
23
  let port = 3000;
24
+ let rootDir = null;
23
25
 
24
26
  const args = process.argv.slice(2);
25
27
  for (let i = 0; i < args.length; i++) {
26
28
  if (args[i] === "--port" && args[i + 1]) {
27
29
  port = parseInt(args[i + 1], 10);
28
30
  i++;
31
+ } else if (args[i] === "--root" && args[i + 1]) {
32
+ rootDir = resolve(args[i + 1]);
33
+ i++;
29
34
  } else if (args[i] === "--help" || args[i] === "-h") {
30
35
  console.log(`mdview: live markdown viewer
31
36
 
32
37
  Usage:
33
38
  mdview Start server, open homepage
34
39
  mdview --port 8080 Use custom port
40
+ mdview --root /path/to/dir Restrict file access to this directory
41
+
42
+ Options:
43
+ --root <dir> Only serve files under this directory. Prevents access
44
+ to files outside the specified path. Recommended for
45
+ shared or multi-user environments.
35
46
 
36
47
  Opens browser to http://127.0.0.1:PORT/ — pick files, view with live reload.
37
48
  Works in all browsers (Safari, Chrome, Firefox).`);
@@ -39,6 +50,16 @@ Works in all browsers (Safari, Chrome, Firefox).`);
39
50
  }
40
51
  }
41
52
 
53
+ // Validate that a file path is allowed. Returns the resolved path or null.
54
+ function validateFilePath(filePath) {
55
+ if (!filePath) return null;
56
+ const resolved = resolve(filePath);
57
+ if (rootDir && !resolved.startsWith(rootDir + "/") && resolved !== rootDir) {
58
+ return null;
59
+ }
60
+ return resolved;
61
+ }
62
+
42
63
  // ── Multi-file watcher ──────────────────────────────────────────────
43
64
 
44
65
  // Map<absolutePath, { clients: Set<res>, lastMtime: number }>
@@ -209,6 +230,7 @@ const mimeTypes = {
209
230
  ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
210
231
  ".gif": "image/gif", ".svg": "image/svg+xml", ".webp": "image/webp",
211
232
  ".ico": "image/x-icon", ".css": "text/css", ".js": "application/javascript",
233
+ ".woff": "font/woff", ".woff2": "font/woff2", ".ttf": "font/ttf",
212
234
  };
213
235
 
214
236
  const server = createServer((req, res) => {
@@ -224,7 +246,7 @@ const server = createServer((req, res) => {
224
246
 
225
247
  // Viewer — file loaded with live reload (path) or sessionStorage (name)
226
248
  if (url.pathname === "/view") {
227
- const filePath = url.searchParams.get("path");
249
+ const filePath = validateFilePath(url.searchParams.get("path"));
228
250
  const fileName = url.searchParams.get("name");
229
251
 
230
252
  if (filePath && existsSync(filePath)) {
@@ -244,7 +266,7 @@ const server = createServer((req, res) => {
244
266
 
245
267
  // API: read a specific file
246
268
  if (url.pathname === "/api/file") {
247
- const filePath = url.searchParams.get("path");
269
+ const filePath = validateFilePath(url.searchParams.get("path"));
248
270
  if (!filePath || !existsSync(filePath)) {
249
271
  res.writeHead(404, { "Content-Type": "text/plain" });
250
272
  res.end("File not found");
@@ -263,7 +285,7 @@ const server = createServer((req, res) => {
263
285
 
264
286
  // API: SSE events for a specific file
265
287
  if (url.pathname === "/api/events") {
266
- const filePath = url.searchParams.get("path");
288
+ const filePath = validateFilePath(url.searchParams.get("path"));
267
289
  if (!filePath || !existsSync(filePath)) {
268
290
  res.writeHead(404, { "Content-Type": "text/plain" });
269
291
  res.end("File not found");
@@ -280,6 +302,17 @@ const server = createServer((req, res) => {
280
302
  return;
281
303
  }
282
304
 
305
+ // Serve bundled vendor files (no CDN dependency)
306
+ if (url.pathname.startsWith("/vendor/")) {
307
+ const vendorPath = join(__dirname, url.pathname);
308
+ if (existsSync(vendorPath) && statSync(vendorPath).isFile()) {
309
+ const ext = extname(vendorPath).toLowerCase();
310
+ res.writeHead(200, { "Content-Type": mimeTypes[ext] || "application/octet-stream" });
311
+ res.end(readFileSync(vendorPath));
312
+ return;
313
+ }
314
+ }
315
+
283
316
  // Serve static files relative to a viewed file's directory
284
317
  const referer = req.headers.referer;
285
318
  if (referer) {
@@ -289,7 +322,8 @@ const server = createServer((req, res) => {
289
322
  if (refPath) {
290
323
  const fileDir = dirname(refPath);
291
324
  const requestedPath = resolve(fileDir, url.pathname.slice(1));
292
- if (requestedPath.startsWith(fileDir) && existsSync(requestedPath) && statSync(requestedPath).isFile()) {
325
+ const validatedStatic = validateFilePath(requestedPath);
326
+ if (validatedStatic && requestedPath.startsWith(fileDir) && existsSync(requestedPath) && statSync(requestedPath).isFile()) {
293
327
  const ext = extname(requestedPath).toLowerCase();
294
328
  res.writeHead(200, { "Content-Type": mimeTypes[ext] || "application/octet-stream" });
295
329
  res.end(readFileSync(requestedPath));
@@ -308,6 +342,7 @@ const server = createServer((req, res) => {
308
342
  server.listen(port, "127.0.0.1", () => {
309
343
  const url = `http://127.0.0.1:${port}`;
310
344
  console.log(`mdview: ${url}`);
345
+ if (rootDir) console.log(`root: ${rootDir} (file access restricted)`);
311
346
  console.log(`Press Ctrl+C to stop.\n`);
312
347
 
313
348
  const openCmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
@@ -71,7 +71,7 @@ Open multiple tabs to work on multiple documents at once.
71
71
  ## Security
72
72
 
73
73
  - Server binds to `127.0.0.1` only. It is not accessible from other machines.
74
- - The `/view?path=` parameter reads files from your local filesystem. This is expected behavior for a local viewer. Do not expose the port to untrusted networks.
74
+ - The `/view?path=` parameter reads files from your local filesystem. Use `--root <dir>` to restrict access to a specific directory tree. Recommended for shared environments.
75
75
  - Zero npm dependencies. No supply chain risk beyond Node.js itself.
76
76
 
77
77
  ## Features
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},r={};function n(e){var i=r[e];if(void 0!==i)return i.exports;var a=r[e]={exports:{}};return t[e](a,a.exports,n),a.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var i={};return function(){n.d(i,{default:function(){return s}});var e=n(771),t=n.n(e),r=function(e,t,r){for(var n=r,i=0,a=e.length;n<t.length;){var o=t[n];if(i<=0&&t.slice(n,n+a)===e)return n;"\\"===o?n++:"{"===o?i++:"}"===o&&i--,n++}return-1},a=/^\\begin{/,o=function(e,t){for(var n,i=[],o=new RegExp("("+t.map((function(e){return e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")})).join("|")+")");-1!==(n=e.search(o));){n>0&&(i.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=a.test(d)?d:e.slice(t[l].left.length,n);i.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&i.push({type:"text",data:e}),i},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var i=document.createDocumentFragment(),a=0;a<n.length;a++)if("text"===n[a].type)i.appendChild(document.createTextNode(n[a].data));else{var l=document.createElement("span"),d=n[a].data;r.displayMode=n[a].display;try{r.preProcess&&(d=r.preProcess(d)),t().render(d,l,r)}catch(e){if(!(e instanceof t().ParseError))throw e;r.errorCallback("KaTeX auto-render: Failed to parse `"+n[a].data+"` with ",e),i.appendChild(document.createTextNode(n[a].rawData));continue}i.appendChild(l)}return i},d=function e(t,r){for(var n=0;n<t.childNodes.length;n++){var i=t.childNodes[n];if(3===i.nodeType){for(var a=i.textContent,o=i.nextSibling,d=0;o&&o.nodeType===Node.TEXT_NODE;)a+=o.textContent,o=o.nextSibling,d++;var s=l(a,r);if(s){for(var f=0;f<d;f++)i.nextSibling.remove();n+=s.childNodes.length-1,t.replaceChild(s,i)}else n+=d}else 1===i.nodeType&&function(){var t=" "+i.className+" ";-1===r.ignoredTags.indexOf(i.nodeName.toLowerCase())&&r.ignoredClasses.every((function(e){return-1===t.indexOf(" "+e+" ")}))&&e(i,r)}()}},s=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},d(e,r)}}(),i=i.default}()}));
Binary file
@@ -0,0 +1,10 @@
1
+ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
+ Theme: GitHub Dark
3
+ Description: Dark theme as seen on github.com
4
+ Author: github.com
5
+ Maintainer: @Hirse
6
+ Updated: 2021-05-15
7
+
8
+ Outdated base version: https://github.com/primer/github-syntax-dark
9
+ Current colors taken from GitHub's CSS
10
+ */.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}
@@ -0,0 +1,10 @@
1
+ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
+ Theme: GitHub
3
+ Description: Light theme as seen on github.com
4
+ Author: github.com
5
+ Maintainer: @Hirse
6
+ Updated: 2021-05-15
7
+
8
+ Outdated base version: https://github.com/primer/github-syntax-light
9
+ Current colors taken from GitHub's CSS
10
+ */.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}