|
13 | 13 | <meta name="distribution" content="global"> |
14 | 14 | <meta name="rating" content="general"> |
15 | 15 |
|
| 16 | + <!-- DNS Prefetch & Preconnect for external CDNs --> |
| 17 | + <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin> |
| 18 | + <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin> |
| 19 | + <link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"> |
| 20 | + <link rel="dns-prefetch" href="https://cdn.jsdelivr.net"> |
| 21 | + |
16 | 22 | <!-- Open Graph / Facebook --> |
17 | 23 | <meta property="og:type" content="website"> |
18 | 24 | <meta property="og:url" content="https://markdownviewer.pages.dev/"> |
|
29 | 35 |
|
30 | 36 | <title>Markdown Viewer</title> |
31 | 37 | <link href="assets/icon.jpg" rel="icon" type="image/jpg"> |
32 | | - <!-- Updated libraries to latest versions with Subresource Integrity (SRI) --> |
| 38 | + <!-- Style dependencies loaded synchronously for styling stability --> |
33 | 39 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/css/bootstrap.min.css" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> |
34 | 40 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.3.0/github-markdown.min.css" integrity="sha384-hZuxRjC/Dsr4zEx1JlUhDQqkvqBPp2VLHsgXfnxPq1ULDy1eIdWCiux7nvO1RIZP" crossorigin="anonymous"> |
35 | 41 | <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" integrity="sha384-XGjxtQfXaH2tnPFa9x+ruJTuLE3Aa6LhHSWRr1XeTyhezb4abCG4ccI5AkVDxqC+" crossorigin="anonymous"> |
36 | | - <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/emoji-toolkit@9.0.1/extras/css/joypixels.min.css" integrity="sha384-4ok+tBQQdy5hcPT56tzcE11yQ2BkN0Py1uDE8ZOiXYstHOpUB61pJafm+NidByp4" crossorigin="anonymous"> |
37 | 42 | <link rel="stylesheet" href="styles.css"> |
38 | 43 |
|
39 | | - <!-- Loading order optimized - ensure libraries are loaded before they're used --> |
40 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/9.1.6/marked.min.js" integrity="sha384-odPBjvtXVM/5hOYIr3A1dB+flh0c3wAT3bSesIOqEGmyUA4JoKf/YTWy0XKOYAY7" crossorigin="anonymous"></script> |
41 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js" integrity="sha384-F/bZzf7p3Joyp5psL90p/p89AZJsndkSoGwRpXcZhleCWhd8SnRuoYo4d0yirjJp" crossorigin="anonymous"></script> |
42 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.0.9/purify.min.js" integrity="sha384-3HPB1XT51W3gGRxAmZ+qbZwRpRlFQL632y8x+adAqCr4Wp3TaWwCLSTAJJKbyWEK" crossorigin="anonymous"></script> |
43 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js" integrity="sha384-PlRSzpewlarQuj5alIadXwjNUX+2eNMKwr0f07ShWYLy8B6TjEbm7ZlcN/ScSbwy" crossorigin="anonymous"></script> |
44 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js" integrity="sha384-Yv5O+t3uE3hunW8uyrbpPW3iw6/5/Y7HitWJBLgqfMoA36NogMmy+8wWZMpn3HWc" crossorigin="anonymous"></script> |
| 44 | + <!-- Inline configuration objects initialized prior to dynamic script imports --> |
45 | 45 | <script> |
46 | 46 | window.MathJax = { |
47 | 47 | loader: { load: ['[tex]/ams', '[tex]/boldsymbol'] }, |
|
53 | 53 | } |
54 | 54 | }; |
55 | 55 | </script> |
56 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js" integrity="sha384-M5jmNxKC9EVnuqeMwRHvFuYUE8Hhp0TgBruj/GZRkYtiMrCRgH7yvv5KY+Owi7TW" crossorigin="anonymous"></script> |
57 | | - <script src="https://cdn.jsdelivr.net/npm/mermaid@11.6.0/dist/mermaid.min.js" integrity="sha384-zkWMJO4sgpPUzyuOgDx8HB/K55glbAwajEpk1Go2NWRuPkPA/wIhoEJTuSkmOYrV" crossorigin="anonymous"></script> |
58 | | - <script src="https://cdn.jsdelivr.net/npm/emoji-toolkit@9.0.1/lib/js/joypixels.min.js" integrity="sha384-1+n1eMmP5I08CibRJ6JmycJ0hP3G6C0fuUtTb4bEuQgl9uFdS9pnPePfpmrXl9ll" crossorigin="anonymous"></script> |
59 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js" integrity="sha384-JcnsjUPPylna1s1fvi1u12X5qjY5OL56iySh75FdtrwhO/SWXgMjoVqcKyIIWOLk" crossorigin="anonymous"></script> |
60 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js" integrity="sha384-ZZ1pncU3bQe8y31yfZdMFdSpttDoPmOZg2wguVK9almUodir1PghgT0eY7Mrty8H" crossorigin="anonymous"></script> |
61 | | - |
62 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js" integrity="sha384-VFQrHzqBh5qiJIU0uGU5CIW3+OWpdGGJM9LBnGbuIH2mkICcFZ7lPd/AAtI7SNf7" crossorigin="anonymous"></script> |
63 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js" integrity="sha384-/RlQG9uf0M2vcTw3CX7fbqgbj/h8wKxw7C3zu9/GxcBPRKOEcESxaxufwRXqzq6n" crossorigin="anonymous"></script> |
64 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js" integrity="sha384-rNlaE5fs9dGIjmxWDALQh/RBAaGRYT5ChrzHo6tRfgrZ36iRFAiquP5g41Jsv+0j" crossorigin="anonymous"></script> |
65 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js" integrity="sha384-+pxiN6T7yvpryuJmE1gM9PX7yQit15auDb+ZwwvJOd/4be2Cie5/IuVXgQb/S9du" crossorigin="anonymous"></script> |
66 | 56 | </head> |
67 | 57 | <body> |
68 | 58 | <div class="app-container"> |
@@ -706,19 +696,22 @@ <h3 class="modal-section-title">Open-source credits</h3> |
706 | 696 |
|
707 | 697 | <div class="content-container"> |
708 | 698 | <div class="editor-pane"> |
| 699 | + <div class="visually-hidden" id="editor-accessibility-status" aria-live="polite"> |
| 700 | + Keyboard navigation active: Press Escape inside the editor, then press Tab to leave the editor pane. |
| 701 | + </div> |
709 | 702 | <div id="line-numbers" class="line-numbers" aria-hidden="true"></div> |
710 | 703 | <div id="editor-highlight-layer" class="editor-highlight-layer" aria-hidden="true"></div> |
711 | | - <textarea id="markdown-editor" placeholder="Type or paste your Markdown here..."></textarea> |
| 704 | + <textarea id="markdown-editor" placeholder="Type or paste your Markdown here..." aria-describedby="editor-accessibility-status"></textarea> |
712 | 705 | <div class="drop-hint" aria-hidden="true"> |
713 | 706 | <i class="bi bi-cloud-arrow-up me-1"></i>Drop a .md file anywhere to open it |
714 | 707 | </div> |
715 | 708 | </div> |
716 | 709 | <!-- Resize Divider - Story 1.3 --> |
717 | | - <div class="resize-divider" role="separator" aria-orientation="vertical" aria-label="Resize panes" tabindex="0"> |
| 710 | + <div class="resize-divider" role="separator" aria-orientation="vertical" aria-label="Resize panes" tabindex="0" aria-valuemin="20" aria-valuemax="80" aria-valuenow="50"> |
718 | 711 | <div class="resize-divider-handle"></div> |
719 | 712 | </div> |
720 | 713 | <div class="preview-pane"> |
721 | | - <div id="markdown-preview" class="markdown-body"></div> |
| 714 | + <div id="markdown-preview" class="markdown-body" aria-live="polite" aria-busy="false"></div> |
722 | 715 | </div> |
723 | 716 | </div> |
724 | 717 | </div> |
|
0 commit comments