zero-http 0.2.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +311 -0
  3. package/documentation/controllers/cleanup.js +25 -0
  4. package/documentation/controllers/echo.js +14 -0
  5. package/documentation/controllers/headers.js +1 -0
  6. package/documentation/controllers/proxy.js +112 -0
  7. package/documentation/controllers/root.js +1 -0
  8. package/documentation/controllers/uploads.js +289 -0
  9. package/documentation/full-server.js +129 -0
  10. package/documentation/public/data/api.json +167 -0
  11. package/documentation/public/data/examples.json +62 -0
  12. package/documentation/public/data/options.json +13 -0
  13. package/documentation/public/index.html +414 -0
  14. package/documentation/public/prism-overrides.css +40 -0
  15. package/documentation/public/scripts/app.js +44 -0
  16. package/documentation/public/scripts/data-sections.js +300 -0
  17. package/documentation/public/scripts/helpers.js +166 -0
  18. package/documentation/public/scripts/playground.js +71 -0
  19. package/documentation/public/scripts/proxy.js +98 -0
  20. package/documentation/public/scripts/ui.js +210 -0
  21. package/documentation/public/scripts/uploads.js +459 -0
  22. package/documentation/public/styles.css +310 -0
  23. package/documentation/public/vendor/icons/fetch.svg +23 -0
  24. package/documentation/public/vendor/icons/plug.svg +27 -0
  25. package/documentation/public/vendor/icons/static.svg +35 -0
  26. package/documentation/public/vendor/icons/stream.svg +22 -0
  27. package/documentation/public/vendor/icons/zero.svg +21 -0
  28. package/documentation/public/vendor/prism-copy-to-clipboard.min.js +27 -0
  29. package/documentation/public/vendor/prism-javascript.min.js +1 -0
  30. package/documentation/public/vendor/prism-json.min.js +1 -0
  31. package/documentation/public/vendor/prism-okaidia.css +1 -0
  32. package/documentation/public/vendor/prism-toolbar.css +27 -0
  33. package/documentation/public/vendor/prism-toolbar.min.js +41 -0
  34. package/documentation/public/vendor/prism.min.js +1 -0
  35. package/index.js +43 -0
  36. package/lib/app.js +159 -0
  37. package/lib/body/index.js +14 -0
  38. package/lib/body/json.js +54 -0
  39. package/lib/body/multipart.js +310 -0
  40. package/lib/body/raw.js +40 -0
  41. package/lib/body/rawBuffer.js +74 -0
  42. package/lib/body/sendError.js +17 -0
  43. package/lib/body/text.js +43 -0
  44. package/lib/body/typeMatch.js +22 -0
  45. package/lib/body/urlencoded.js +166 -0
  46. package/lib/cors.js +72 -0
  47. package/lib/fetch.js +218 -0
  48. package/lib/logger.js +68 -0
  49. package/lib/rateLimit.js +64 -0
  50. package/lib/request.js +76 -0
  51. package/lib/response.js +165 -0
  52. package/lib/router.js +87 -0
  53. package/lib/static.js +196 -0
  54. package/package.json +44 -0
@@ -0,0 +1,310 @@
1
+ :root{
2
+ --bg:#0e1114;
3
+ --panel:#0b0d10;
4
+ --muted:#98a0aa;
5
+ --text:#e6eef8;
6
+ --accent:#5865f2;
7
+ --accent-2:#1f8efd;
8
+ --success:#2ecc71;
9
+ --danger:#ff6b6b;
10
+ --surface-border:rgba(255,255,255,0.03);
11
+ --header-height:64px;
12
+ color-scheme: dark;
13
+ }
14
+
15
+ @media (min-width:641px) {
16
+ .controls{display:flex;flex-direction:row;align-items:stretch;gap:14px}
17
+ .controls .left-controls{display:flex;flex-direction:row;gap:10px}
18
+ .controls .left-controls .btn{margin-right:0}
19
+ .right-controls{display:flex;align-items:center;gap:12px;align-self:flex-end}
20
+ .pager{display:flex;align-items:center;gap:10px}
21
+ .pager #pageInfo{background:linear-gradient(180deg, rgba(255,255,255,0.01), transparent);padding:6px 12px;border-radius:10px;border:1px solid rgba(255,255,255,0.02);color:var(--muted);font-weight:600;display:inline-block}
22
+ }
23
+ .base-font{font-family:Inter,ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,'Helvetica Neue',Arial}
24
+ .base-font{font-family: 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif}
25
+ html{font-size:18px}
26
+ body{height:100%;margin:0;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;line-height:1.6;font-family:'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif}
27
+ .ui-shell{max-width:1300px;margin:24px auto;padding:28px}
28
+ .ui-header{display:flex;align-items:center;gap:16px;margin-bottom:14px;position:fixed;top:0;left:50%;transform:translateX(-50%);width:calc(100% - 48px);max-width:1300px;height:var(--header-height);z-index:140;background:linear-gradient(180deg, rgba(11,13,16,0.96), rgba(11,13,16,0.92));backdrop-filter:blur(6px);padding:10px 20px;border-radius:10px}
29
+ .repo-buttons{margin-left:auto;display:flex;gap:12px;align-items:center}
30
+ .icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;padding:10px 12px;border-radius:12px;color:var(--text);background:transparent;border:1px solid rgba(255,255,255,0.03);cursor:pointer;text-decoration:none;font-weight:700;transition:transform .08s ease,box-shadow .12s ease,background .12s ease;min-width:44px;min-height:44px}
31
+ .icon-btn svg, .icon-btn .icon-svg{display:block;width:28px;height:28px}
32
+ .icon-btn:hover{transform:translateY(-3px);box-shadow:0 10px 24px rgba(2,4,8,0.6);background:linear-gradient(180deg,rgba(255,255,255,0.01),transparent)}
33
+ .icon-btn:active{transform:translateY(0)}
34
+ .icon-btn .sr{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden}
35
+
36
+ @media(min-width:900px){
37
+ .repo-buttons{gap:14px}
38
+ .icon-btn{padding:5px 8px;min-width:56px;min-height:56px;border-radius:14px}
39
+ .icon-btn svg, .icon-btn .icon-svg{width:50px;height:auto}
40
+ }
41
+
42
+ @media(max-width:640px){
43
+ .repo-buttons{gap:8px}
44
+ .icon-btn{min-width:44px;min-height:44px;padding:8px;border-radius:10px}
45
+ .icon-btn svg, .icon-btn .icon-svg{width:24px;height:24px}
46
+ }
47
+ .brand .logo{font-weight:800;font-size:22px;letter-spacing:0.2px}
48
+ .brand .subtitle{font-size:14px;color:var(--muted)}
49
+ .card{background:var(--panel);border:1px solid var(--surface-border);padding:16px;border-radius:10px;margin-bottom:14px;box-shadow:0 2px 8px rgba(3,4,6,0.6)}
50
+ .card{background:var(--panel);border:1px solid var(--surface-border);padding:20px;border-radius:12px;margin-bottom:18px;box-shadow:0 6px 18px rgba(3,4,6,0.6)}
51
+ .card-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
52
+ .card-head h3{margin:0;font-size:18px}
53
+ .small{font-size:13px}
54
+ .muted{color:var(--muted);line-height:1.5}
55
+ .constrained{max-width:1300px;margin-left:auto;margin-right:auto}
56
+ .section-divider{padding:28px 0 8px 20px;margin-top:18px;border-top:1px solid rgba(255,255,255,0.06)}
57
+ .section-divider .section-title{font-size:1.35rem;font-weight:800;letter-spacing:-0.02em;margin:0 0 4px}
58
+ .section-divider .muted{margin:0;font-size:0.92rem}
59
+
60
+ /* Inputs and buttons */
61
+ .textInput, textarea{width:100%;box-sizing:border-box;padding:12px;border-radius:10px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:var(--text);font-size:15px}
62
+ textarea{min-height:100px}
63
+ .btn{background:linear-gradient(180deg,var(--accent),var(--accent-2));color:white;border:none;padding:10px 16px;border-radius:12px;cursor:pointer;font-weight:700;display:inline-flex;align-items:center;gap:8px;box-shadow:0 6px 18px rgba(5,6,8,0.6);transition:transform .08s ease,box-shadow .12s ease,opacity .12s ease}
64
+ .btn:hover{transform:translateY(-1px);box-shadow:0 10px 26px rgba(5,6,8,0.65)}
65
+ .btn:active{transform:translateY(0);box-shadow:0 4px 10px rgba(5,6,8,0.5)}
66
+ .btn:disabled{opacity:.5;cursor:not-allowed;transform:none}
67
+ .btn.small{padding:6px 10px;font-size:14px;border-radius:10px}
68
+ .btn.warn{background:linear-gradient(180deg,#ff7b5a,#ff6b6b)}
69
+ .btn.ghost{background:transparent;border:1px solid rgba(255,255,255,0.06);color:var(--text);box-shadow:none}
70
+
71
+ /* Controls: select and pager */
72
+ .selectWrap{display:inline-flex;align-items:center;gap:8px;background:transparent}
73
+ .selectWrap select, #sortSelect, #sortOrder{appearance:none;-webkit-appearance:none;border:1px solid rgba(255,255,255,0.06);background:var(--panel);color:var(--text);padding:8px 12px;border-radius:10px;font-size:14px;min-width:110px}
74
+ .selectWrap select option, #sortSelect option, #sortOrder option{background:var(--panel);color:var(--text)}
75
+ .selectWrap select:focus, #sortSelect:focus, #sortOrder:focus{outline:none;box-shadow:0 0 0 4px rgba(88,101,242,0.12)}
76
+
77
+ .pager{display:flex;align-items:center;gap:10px}
78
+ .pager button{min-width:36px;height:36px;padding:0;border-radius:10px;background:linear-gradient(180deg, rgba(255,255,255,0.02), transparent);border:1px solid rgba(255,255,255,0.03);display:inline-flex;align-items:center;justify-content:center}
79
+ .pager button svg{width:18px;height:18px}
80
+ .pager .pageInfo{background:linear-gradient(180deg, rgba(255,255,255,0.01), transparent);padding:6px 12px;border-radius:10px;border:1px solid rgba(255,255,255,0.02);color:var(--muted);font-weight:600}
81
+
82
+ .file-grid{display:flex;flex-wrap:wrap;gap:12px}
83
+ .file{background:linear-gradient(180deg,rgba(255,255,255,0.02),transparent);padding:12px;border-radius:12px;border:1px solid rgba(255,255,255,0.03);min-width:150px}
84
+
85
+ /* Uploaded file card */
86
+ .file-card{display:flex;gap:14px;align-items:flex-start;padding:12px;background:transparent;border-radius:8px}
87
+ .file-card .thumb{width:96px;height:96px;border-radius:8px;object-fit:cover;flex:0 0 96px;border:1px solid rgba(255,255,255,0.03);background:linear-gradient(180deg,rgba(255,255,255,0.02),transparent)}
88
+ .file-card .file-meta{flex:1}
89
+ .file-card .file-title{font-weight:700;margin-bottom:6px}
90
+ .file-card .file-submeta{color:var(--muted);font-size:13px;margin-bottom:8px}
91
+ .file-card .file-actions{display:flex;flex-direction:column;gap:8px}
92
+ .file-card .file-actions .btn{padding:6px 10px;font-size:13px}
93
+ .file-card .file-actions{display:flex;flex-direction:column;gap:10px;align-items:flex-start}
94
+ .file-card .file-actions .btn{padding:6px 12px;font-size:13px;border-radius:999px;background:linear-gradient(180deg,var(--accent),var(--accent-2));box-shadow:0 6px 18px rgba(5,6,8,0.45)}
95
+ .file-card .file-actions a.btn{display:inline-flex;align-items:center;gap:8px;color:white;text-decoration:none}
96
+ .file-card .file-actions button.btn{border:none}
97
+ .file-card .file-actions button.btn.warn{background:linear-gradient(180deg,#ff7b5a,#ff6b6b)}
98
+ .file-card .file-actions a.btn:visited{color:white}
99
+ .file-card .file-actions .btn.small{padding:5px 10px}
100
+ .muted.summary {
101
+ font-size: 0.85rem !important;
102
+ padding: 0 !important;
103
+ margin-top: -0.50em !important;
104
+ }
105
+ /* Trash list rows */
106
+ .fileRow.trash{display:flex;gap:10px;align-items:center;padding:8px 0;border-bottom:1px dashed rgba(255,255,255,0.02)}
107
+ .fileRow.trash .btn{margin-left:8px}
108
+
109
+ .result{white-space:pre-wrap;background:#081018;padding:14px;border-radius:12px;border:1px solid rgba(255,255,255,0.03);font-size:14px;width:100%;box-sizing:border-box}
110
+ .result pre, .result pre.code{white-space:pre;overflow:auto;max-width:100%;box-sizing:border-box}
111
+ .mono{font-family:Menlo,Monaco,monospace}
112
+
113
+ /* Code blocks and Prism helpers */
114
+ pre[class*="language-"]{background:linear-gradient(180deg, rgba(11,13,16,0.96), rgba(6,8,10,0.96));padding:18px;border-radius:10px;overflow:auto;border:1px solid rgba(255,255,255,0.04);color:var(--text);box-shadow:inset 0 1px 0 rgba(255,255,255,0.02)}
115
+ code[class*="language-"]{font-family:Consolas,Menlo,Monaco,monospace;font-size:14px;color:var(--text)}
116
+
117
+ .token.comment, .token.prolog, .token.doctype, .token.cdata { color: var(--muted); font-style: italic; }
118
+ .token.punctuation { color: rgba(255,255,255,0.6); }
119
+ .token.namespace { opacity: .7; }
120
+ .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: var(--accent-2); }
121
+ .token.boolean, .token.number { color: #f6c177; }
122
+ .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: var(--success); }
123
+ .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #9fe6a0; }
124
+ .token.atrule, .token.attr-value, .token.keyword { color: var(--accent); font-weight:700; }
125
+ .token.function { color: #8ad1ff; }
126
+ .token.regex, .token.important { color: #ffd580; }
127
+ .token.variable { color: #ffd580; }
128
+
129
+ code.inline, :not(pre) > code { background: rgba(255,255,255,0.02); padding:2px 6px; border-radius:6px; font-size:0.95em }
130
+
131
+ pre[class*="language-"], pre.code, pre[class*="language-"] code, pre.code code {
132
+ white-space: pre;
133
+ tab-size: 4;
134
+ -moz-tab-size: 4;
135
+ -o-tab-size: 4;
136
+ }
137
+ code[class*="language-"], pre[class*="language-"] code {
138
+ display: block;
139
+ font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
140
+ line-height: 1.5;
141
+ }
142
+
143
+ /* Layout helpers */
144
+ .playgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
145
+ .controls{display:flex;justify-content:space-between;align-items:center;gap:14px;margin-top:12px}
146
+
147
+ /* file drop */
148
+ .fileDrop{border:1px dashed rgba(255,255,255,0.04);border-radius:12px;padding:22px 18px;text-align:center;color:var(--muted);min-height:86px;display:flex;align-items:center;justify-content:center}
149
+ .fileDrop-inner{font-size:14px}
150
+
151
+ /* file input and choose label */
152
+ .fileInput{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;padding:0}
153
+ .fileDrop label.linkish{display:inline-block;padding:8px 12px;margin-left:8px;background:linear-gradient(180deg,var(--accent),var(--accent-2));color:#fff;border-radius:10px;cursor:pointer;font-weight:700}
154
+
155
+ .ui-footer{margin-top:8px;color:var(--muted);font-size:13px;text-align:center}
156
+
157
+ .card .acc-body table{width:100%;border-collapse:collapse;margin-top:10px}
158
+ .card .acc-body th, .card .acc-body td{padding:10px 12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.03);vertical-align:top;font-size:14px}
159
+ .card .acc-body thead th{color:var(--muted);font-weight:700}
160
+ .card .acc-body tbody tr:nth-child(odd){background:transparent}
161
+
162
+ details.acc{background:linear-gradient(180deg,rgba(255,255,255,0.01),transparent);border:1px solid rgba(255,255,255,0.03);border-radius:10px;padding:8px;margin:8px 0}
163
+ details.acc[open]{box-shadow:0 8px 24px rgba(0,0,0,0.6)}
164
+ details.acc summary{
165
+ list-style:none;
166
+ list-style-type:none;
167
+ -webkit-appearance:none;
168
+ appearance:none;
169
+ cursor:pointer;
170
+ padding:8px 10px;border-radius:8px;display:flex;align-items:center;gap:12px;font-weight:700;position:relative
171
+ }
172
+ details.acc summary::-webkit-details-marker{display:none !important}
173
+ details.acc summary::marker{display:none !important; color: transparent !important; font-size: 0 !important}
174
+ details.acc summary::-moz-list-bullet{display:none !important}
175
+ details.acc summary{list-style:none !important}
176
+ .summary-arrow{display:inline-block;min-width:14px;text-align:center;margin-right:8px;color:var(--accent);font-weight:900}
177
+ details.acc summary .summary-arrow{transition:transform .18s ease}
178
+ details.acc[open] > summary .summary-arrow{transform:rotate(90deg)}
179
+ details.acc summary:before{content:'';display:inline-block;width:0;height:0;border-style:solid;border-width:5px 0 5px 7px;border-color:transparent transparent transparent var(--accent);transform:rotate(0deg);transition:transform .18s ease;margin-right:6px;flex-shrink:0}
180
+ details.acc[open] > summary:before{transform:rotate(90deg)}
181
+ .acc-body{padding:12px 10px;border-top:1px solid rgba(255,255,255,0.02);margin-top:8px}
182
+
183
+ /* Feature tabs UI */
184
+ .feature-tabs{margin:12px 0}
185
+ .tabs-nav{display:flex;gap:8px;margin-bottom:12px}
186
+ .tab{background:transparent;border:1px solid rgba(255,255,255,0.04);color:var(--text);padding:8px 12px;border-radius:10px;cursor:pointer;font-weight:700}
187
+ .tab.active{background:linear-gradient(180deg,var(--accent),var(--accent-2));color:#fff;box-shadow:0 8px 24px rgba(2,4,6,0.45);border-color:transparent}
188
+ .tabs-content{display:block}
189
+ .tab-panel{display:none;padding:6px 2px;transition:opacity .18s ease}
190
+ .tab-panel.active{display:block}
191
+ .feature-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
192
+ .feature-card{background:linear-gradient(180deg,rgba(255,255,255,0.02),transparent);padding:14px;border-radius:12px;border:1px solid rgba(255,255,255,0.03);display:flex;flex-direction:column;align-items:flex-start;gap:10px;transition:transform .12s ease,box-shadow .12s ease}
193
+ .feature-card:hover{transform:translateY(-6px);box-shadow:0 12px 36px rgba(0,0,0,0.6)}
194
+ .feature-icon{width:56px;height:56px;border-radius:12px;background:linear-gradient(180deg, rgba(88,101,242,0.12), rgba(31,142,253,0.06));display:grid;place-items:center;font-size:20px;color:var(--accent);}
195
+ .feature-icon svg{width:34px;height:34px;display:block;fill:var(--accent);}
196
+ .feature-icon img.icon-svg{width:40px;height:40px;display:block;object-fit:contain;margin:0 auto}
197
+ /* .feature-icon img.icon-svg[src$="/fetch.svg"], .feature-icon img.icon-svg[src$="fetch.svg"]{transform:translateY(-5px)translateX(1px);display:block} */
198
+ .feature-icon img.icon-svg[src$="/static.svg"], .feature-icon img.icon-svg[src$="static.svg"]{transform:translateY(2px);display:block}
199
+ /* .feature-icon img.icon-svg[src$="/plug.svg"], .feature-icon img.icon-svg[src$="plug.svg"]{transform:translateY(2px);display:block} */
200
+ .feature-card h5{margin:0;font-size:15px}
201
+ .feature-card p{margin:0;color:var(--muted);font-size:14px}
202
+ .behavior-list{display:flex;flex-direction:column;gap:10px}
203
+ .behavior-step{display:flex;gap:12px;align-items:flex-start;padding:12px;border-radius:10px;border:1px solid rgba(255,255,255,0.03);background:linear-gradient(180deg,rgba(255,255,255,0.01),transparent)}
204
+ .step-num{width:44px;height:44px;border-radius:10px;background:var(--accent);display:flex;align-items:center;justify-content:center;font-weight:800;color:#fff;box-shadow:0 8px 18px rgba(31,142,253,0.08)}
205
+ .step-body h5{margin:0 0 6px 0}
206
+ .step-body p{margin:0;color:var(--muted)}
207
+
208
+ @media(max-width:900px){.feature-grid{grid-template-columns:1fr}.tabs-nav{flex-wrap:wrap}}
209
+
210
+ @media(max-width:900px){.playgrid{grid-template-columns:1fr}.ui-shell{padding:16px}}
211
+
212
+ @media(max-width:900px){.playgrid{grid-template-columns:1fr}.ui-shell{padding:12px}}
213
+
214
+ /* Mobile specific fixes */
215
+ @media (max-width:640px) {
216
+ :root{--panel:#0b0d10}
217
+ html{font-size:16px}
218
+ .ui-shell{max-width:100%;margin:0px auto;padding:8px}
219
+ .card{padding:12px;border-radius:8px}
220
+
221
+ .card-head h3{font-size:16px}
222
+ .card .acc-body{padding:8px 0}
223
+ .card .acc-body table{display:block;width:auto;overflow:auto;-webkit-overflow-scrolling:touch;margin-top:8px}
224
+ .card .acc-body th, .card .acc-body td{padding:6px 8px;font-size:13px;white-space:normal;word-break:break-word}
225
+ .card .acc-body thead{display:table-header-group}
226
+ .card .acc-body tbody{display:table-row-group}
227
+ pre[class*="language-"]{padding:12px;font-size:13px;border-radius:8px}
228
+ code[class*="language-"]{font-size:13px}
229
+
230
+ pre[class*="language-"], pre.code { max-width:100%; box-sizing:border-box; overflow:auto; }
231
+ pre[class*="language-"] code, pre.code code { box-sizing:border-box; display:block; }
232
+ .controls{gap:8px}
233
+ .right-controls{display:flex;gap:8px;width:100%;justify-content:center;}
234
+ .playgrid{grid-template-columns:1fr;gap:10px}
235
+ .fileDrop{padding:14px}
236
+
237
+ .docs-card, .card.docs-card { max-width:640px; margin-left:auto; margin-right:auto }
238
+ .docs-card .acc-body, .docs-card details.acc { margin-left:0; margin-right:0; padding: 5px; }
239
+ .docs-card pre[class*="language-"]{ margin:0px }
240
+
241
+ .card .acc-body table{width:auto}
242
+ .card .acc-body th:nth-child(1), .card .acc-body td:nth-child(1){min-width:120px}
243
+ .card .acc-body th:nth-child(2), .card .acc-body td:nth-child(2){min-width:90px}
244
+ .card .acc-body th:nth-child(3), .card .acc-body td:nth-child(3){min-width:90px}
245
+ .card .acc-body th:last-child, .card .acc-body td:last-child{min-width:160px}
246
+
247
+ .controls{flex-direction:column;align-items:flex-start;gap:10px;justify-content:center;width:100%;}
248
+ .controls .left-controls{width:100%;display:flex;flex-wrap:wrap;gap:8px;justify-content:center;}
249
+ .controls .left-controls .btn{margin-right:0}
250
+
251
+ .btn{padding:8px 12px;font-size:14px}
252
+ .pager button{min-width:32px;height:32px}
253
+ .selectWrap select, #sortSelect, #sortOrder{min-width:90px}
254
+
255
+ .result {padding: 5px;}
256
+
257
+ }
258
+
259
+ .upload-button-wrap { display:flex;justify-content:flex-end;align-items:center;gap:10px; width:100%; margin:10px 0 }
260
+
261
+ .toc-toggle{background:transparent;border:1px solid rgba(255,255,255,0.04);color:var(--text);padding:8px;border-radius:10px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;z-index:150}
262
+ .toc-sidebar{position:fixed;left:12px;top:20px;width:220px;max-height:calc(100vh - 40px);overflow:auto;background:var(--panel);border:1px solid var(--surface-border);border-radius:12px;padding:12px;box-shadow:0 12px 34px rgba(0,0,0,0.6);opacity:0;transform:translateX(-8px);transition:transform .18s ease,opacity .18s ease;pointer-events:none;z-index:120;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,0.08) transparent}
263
+ .toc-sidebar::-webkit-scrollbar{width:4px}
264
+ .toc-sidebar::-webkit-scrollbar-track{background:transparent}
265
+ .toc-sidebar::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.08);border-radius:4px}
266
+ .toc-sidebar::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,0.14)}
267
+ .toc-sidebar nav ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
268
+ .toc-sidebar nav a{display:block;padding:8px 10px;border-radius:8px;color:var(--muted);text-decoration:none}
269
+ .toc-sidebar nav a:hover{background:linear-gradient(180deg,rgba(255,255,255,0.01),transparent);color:var(--text)}
270
+ body.toc-open .toc-sidebar{opacity:1;transform:translateX(0);pointer-events:auto}
271
+
272
+ /* TOC icon toolbar */
273
+ .toc-toolbar{display:flex;gap:6px;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid rgba(255,255,255,0.04)}
274
+ .toc-tool-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:var(--muted);cursor:pointer;transition:color .12s ease,background .12s ease,transform .12s ease}
275
+ .toc-tool-btn:hover{color:var(--accent);background:rgba(88,101,242,0.08)}
276
+ .toc-tool-btn:active{transform:scale(0.92)}
277
+ .toc-tool-btn.acc-expanded svg{transform:rotate(180deg);transition:transform .18s ease}
278
+ .toc-tool-btn svg{transition:transform .18s ease}
279
+
280
+ /* Sub-TOC items (API reference entries) */
281
+ .toc-sidebar nav ul.toc-sub{list-style:none;margin:6px 0 0 12px;padding:0;display:flex;flex-direction:column;gap:6px}
282
+ .toc-sidebar nav li.toc-sub-item{padding-left:6px}
283
+ .toc-sidebar nav li.toc-sub-item a{font-size:13px;color:rgba(255,255,255,0.65);padding:6px 10px;border-radius:6px;display:block}
284
+ .toc-sidebar nav li.toc-sub-item a:hover{color:var(--text);background:linear-gradient(180deg,rgba(255,255,255,0.01),transparent)}
285
+ .toc-sidebar nav li.toc-sub-item a:visited{color:rgba(255,255,255,0.6)}
286
+
287
+
288
+ @media(min-width:900px){
289
+ .ui-shell{display:flex;align-items:flex-start}
290
+ .toc-sidebar{position:sticky;top:calc(var(--header-height) + 20px);width:230px;flex-shrink:0;opacity:1;transform:none;pointer-events:auto;left:auto;max-height:calc(100vh - var(--header-height) - 40px);box-shadow:none;z-index:auto;transition:none}
291
+ .ui-main{flex:1;min-width:0}
292
+ body.toc-hidden .toc-sidebar{display:none}
293
+ }
294
+
295
+ @media(max-width:640px){
296
+ .toc-sidebar{left:10px;top:64px;width:86%;max-height:calc(100vh - 84px)}
297
+ .ui-main{margin-left:0}
298
+ }
299
+
300
+ /* Keep the hamburger always accessible on small screens */
301
+ @media(max-width:640px){
302
+ :root{--header-height:56px}
303
+ .ui-header{width:calc(100% - 16px);padding:8px 12px;border-radius:0}
304
+ .brand .subtitle{display:none}
305
+ .brand .logo{font-size:18px}
306
+ }
307
+
308
+ /* Ensure page content is not hidden behind the fixed header */
309
+ body{padding-top:calc(var(--header-height) + 12px)}
310
+ .ui-shell{margin-top:0}
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" aria-hidden="true">
2
+ <defs>
3
+ <linearGradient id="g-fetch" x1="0" x2="1">
4
+ <stop offset="0" stop-color="#7b61ff"/>
5
+ <stop offset="1" stop-color="#3ec6ff"/>
6
+ </linearGradient>
7
+ <!-- Cloud silhouette via clipPath so gradient is seamless across the whole shape -->
8
+ <clipPath id="cloud-clip">
9
+ <circle cx="18" cy="26" r="11"/>
10
+ <circle cx="32" cy="17" r="14"/>
11
+ <circle cx="46" cy="24" r="11"/>
12
+ <rect x="8" y="28" width="48" height="12" rx="6"/>
13
+ </clipPath>
14
+ </defs>
15
+ <rect width="64" height="64" rx="8" fill="transparent"/>
16
+
17
+ <!-- Large centered cloud filled with flat gradient, clipped to cloud silhouette -->
18
+ <rect x="0" y="0" width="64" height="64" fill="url(#g-fetch)" clip-path="url(#cloud-clip)"/>
19
+
20
+ <!-- Centered down arrow below the cloud -->
21
+ <path d="M32 43v13" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round"/>
22
+ <path d="M27 56l5 5 5-5" fill="none" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
23
+ </svg>
@@ -0,0 +1,27 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" aria-hidden="true">
2
+ <defs>
3
+ <linearGradient id="g-plug" x1="0" x2="1">
4
+ <stop offset="0" stop-color="#7b61ff"/>
5
+ <stop offset="1" stop-color="#3ec6ff"/>
6
+ </linearGradient>
7
+ <linearGradient id="g-cord" x1="0" x2="0" y1="0" y2="1">
8
+ <stop offset="0" stop-color="#a084ff"/>
9
+ <stop offset="1" stop-color="#3ec6ff"/>
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="64" height="64" rx="8" fill="transparent"/>
13
+
14
+ <!-- Prong pins -->
15
+ <rect x="22" y="4" width="5" height="13" rx="2.5" fill="rgba(255,255,255,0.92)"/>
16
+ <rect x="37" y="4" width="5" height="13" rx="2.5" fill="rgba(255,255,255,0.92)"/>
17
+
18
+ <!-- Plug body -->
19
+ <rect x="11" y="17" width="42" height="20" rx="7" fill="url(#g-plug)"/>
20
+
21
+ <!-- Strain relief neck -->
22
+ <rect x="24" y="37" width="16" height="8" rx="4" fill="url(#g-plug)"/>
23
+
24
+ <!-- Cord: sweeps down from neck and curls to the right -->
25
+ <path d="M 32 45 C 32 54, 16 52, 16 58 C 16 63, 26 64, 36 61"
26
+ fill="none" stroke="url(#g-cord)" stroke-width="4" stroke-linecap="round"/>
27
+ </svg>
@@ -0,0 +1,35 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" aria-hidden="true">
2
+ <defs>
3
+ <linearGradient id="g-static" x1="0" x2="1">
4
+ <stop offset="0" stop-color="#7b61ff"/>
5
+ <stop offset="1" stop-color="#3ec6ff"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="64" height="64" rx="8" fill="transparent"/>
9
+
10
+ <!-- Antenna arms from top-center -->
11
+ <line x1="32" y1="10" x2="22" y2="1" stroke="#ffffff" stroke-width="2" stroke-linecap="round" opacity="0.92"/>
12
+ <line x1="32" y1="10" x2="42" y2="1" stroke="#ffffff" stroke-width="2" stroke-linecap="round" opacity="0.92"/>
13
+
14
+ <!-- TV outer body -->
15
+ <rect x="6" y="10" width="52" height="34" rx="6" fill="url(#g-static)"/>
16
+
17
+ <!-- Screen (dark inset) -->
18
+ <rect x="11" y="14" width="42" height="22" rx="3" fill="rgba(8,10,20,0.5)"/>
19
+
20
+ <!-- Static zig-zag noise lines on screen -->
21
+ <g fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" opacity="0.82">
22
+ <path d="M13 20 L17 24 L21 20 L25 24 L29 20 L33 24 L37 20 L41 24 L45 20 L49 24"/>
23
+ <path d="M13 29 L17 33 L21 29 L25 33 L29 29 L33 33 L37 29 L41 33 L45 29 L49 33"/>
24
+ </g>
25
+
26
+ <!-- Control knobs below screen (inside body) -->
27
+ <circle cx="20" cy="41" r="2.2" fill="rgba(255,255,255,0.55)"/>
28
+ <circle cx="32" cy="41" r="2.2" fill="rgba(255,255,255,0.25)"/>
29
+ <circle cx="44" cy="41" r="2.2" fill="rgba(255,255,255,0.15)"/>
30
+
31
+ <!-- Stand neck -->
32
+ <rect x="27" y="44" width="10" height="5" rx="2" fill="url(#g-static)"/>
33
+ <!-- Stand base -->
34
+ <rect x="17" y="49" width="30" height="5" rx="3" fill="url(#g-static)"/>
35
+ </svg>
@@ -0,0 +1,22 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" aria-hidden="true">
2
+ <defs>
3
+ <linearGradient id="g-stream" x1="0" x2="1">
4
+ <stop offset="0" stop-color="#7b61ff"/>
5
+ <stop offset="1" stop-color="#3ec6ff"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="64" height="64" rx="8" fill="transparent"/>
9
+
10
+ <!-- Hard disk on the right, big thin white arrow pointing into it from the left -->
11
+ <!-- Hard disk body -->
12
+ <rect x="34" y="14" width="22" height="36" rx="5" fill="url(#g-stream)"/>
13
+ <!-- disk platter slot line -->
14
+ <line x1="38" y1="26" x2="52" y2="26" stroke="rgba(255,255,255,0.25)" stroke-width="1.5" stroke-linecap="round"/>
15
+ <!-- small read-head dot -->
16
+ <circle cx="44" cy="38" r="3" fill="rgba(255,255,255,0.2)"/>
17
+ <circle cx="44" cy="38" r="1.4" fill="rgba(255,255,255,0.55)"/>
18
+
19
+ <!-- Big thin white arrow pointing right into the disk -->
20
+ <path d="M6 32h22" stroke="#ffffff" stroke-width="2" stroke-linecap="round"/>
21
+ <path d="M22 25l12 7-12 7" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
22
+ </svg>
@@ -0,0 +1,21 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" aria-hidden="true">
2
+ <defs>
3
+ <linearGradient id="g-zero" x1="0" x2="1">
4
+ <stop offset="0" stop-color="#7b61ff"/>
5
+ <stop offset="1" stop-color="#3ec6ff"/>
6
+ </linearGradient>
7
+ <filter id="soft" x="-20%" y="-20%" width="140%" height="140%">
8
+ <feGaussianBlur stdDeviation="1" result="b" />
9
+ <feBlend in="SourceGraphic" in2="b" />
10
+ </filter>
11
+ </defs>
12
+ <rect width="64" height="64" rx="8" fill="transparent"/>
13
+ <g transform="translate(0 0)">
14
+ <!-- lightning bolt centered -->
15
+ <path d="M30 8 L18 36 L28 36 L20 56 L44 24 L34 24 L42 8 Z" fill="url(#g-zero)" filter="url(#soft)"/>
16
+ <!-- subtle highlight -->
17
+ <path d="M30 12 L22 36 L28 36 L24 48 L40 22 L34 22 L38 12 Z" fill="rgba(255,255,255,0.12)"/>
18
+ <!-- white oval-outline '0' badge (slightly smaller) -->
19
+ <ellipse cx="47" cy="47" rx="5" ry="7.5" fill="none" stroke="#ffffff" stroke-width="1.8" opacity="0.98"/>
20
+ </g>
21
+ </svg>
@@ -0,0 +1,27 @@
1
+ /* Minimal copy-to-clipboard helper for code blocks */
2
+ (function(){
3
+ window.PrismCopyToClipboard = async function(pre){
4
+ if (!pre) return false;
5
+ // prefer code element content
6
+ const code = pre.querySelector('code') || pre;
7
+ const text = code ? code.textContent : pre.textContent;
8
+ if (!text) return false;
9
+ try {
10
+ if (navigator.clipboard && navigator.clipboard.writeText) {
11
+ await navigator.clipboard.writeText(text);
12
+ return true;
13
+ }
14
+ } catch(e){}
15
+ // fallback using textarea
16
+ try {
17
+ const ta = document.createElement('textarea');
18
+ ta.value = text;
19
+ ta.style.position = 'fixed'; ta.style.left = '-9999px';
20
+ document.body.appendChild(ta);
21
+ ta.select();
22
+ document.execCommand('copy');
23
+ ta.remove();
24
+ return true;
25
+ } catch(e) { return false; }
26
+ };
27
+ })();
@@ -0,0 +1 @@
1
+ Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
@@ -0,0 +1 @@
1
+ Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json;
@@ -0,0 +1 @@
1
+ code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8292a2}.token.punctuation{color:#f8f8f2}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a6e22e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.important,.token.regex{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
@@ -0,0 +1,27 @@
1
+ /* Minimal toolbar styling for Prism code blocks */
2
+ .prism-toolbar {
3
+ position: absolute;
4
+ top: 8px;
5
+ right: 8px;
6
+ display: flex;
7
+ gap: 6px;
8
+ z-index: 2;
9
+ }
10
+
11
+ .prism-toolbar button {
12
+ background: rgba(255, 255, 255, 0.04);
13
+ color: inherit;
14
+ border: 1px solid rgba(255, 255, 255, 0.06);
15
+ padding: 6px 8px;
16
+ border-radius: 6px;
17
+ font-size: 12px;
18
+ cursor: pointer;
19
+ }
20
+
21
+ .prism-toolbar button:active {
22
+ transform: translateY(1px);
23
+ }
24
+
25
+ .prism-code-wrap {
26
+ position: relative;
27
+ }
@@ -0,0 +1,41 @@
1
+ /* Minimal Prism toolbar implementation that adds a copy button to <pre class="code"> blocks */
2
+ (function(){
3
+ function addToolbar(pre){
4
+ if (pre.dataset.prismToolbarAdded) return;
5
+ pre.dataset.prismToolbarAdded = '1';
6
+ pre.classList.add('prism-code-wrap');
7
+ const toolbar = document.createElement('div'); toolbar.className = 'prism-toolbar';
8
+ const copyBtn = document.createElement('button'); copyBtn.type = 'button'; copyBtn.textContent = 'Copy';
9
+ copyBtn.addEventListener('click', async function(){
10
+ const ok = (window.PrismCopyToClipboard) ? await window.PrismCopyToClipboard(pre) : await fallbackCopy(pre);
11
+ copyBtn.textContent = ok ? 'Copied' : 'Error';
12
+ setTimeout(()=>{ copyBtn.textContent = 'Copy'; }, 1600);
13
+ });
14
+ toolbar.appendChild(copyBtn);
15
+ pre.style.position = pre.style.position || 'relative';
16
+ pre.appendChild(toolbar);
17
+ }
18
+
19
+ async function fallbackCopy(pre){
20
+ try { const code = pre.querySelector('code') || pre; const ta = document.createElement('textarea'); ta.value = code.textContent || pre.textContent || ''; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); ta.remove(); return true; } catch(e){ return false; }
21
+ }
22
+
23
+ function scanAndAttach(){
24
+ // attach to programmatic blocks (pre.code) and static Prism blocks (pre[class*="language-"])
25
+ const preds = Array.from(document.querySelectorAll('pre.code'))
26
+ .concat(Array.from(document.querySelectorAll('pre[class*="language-"]')));
27
+ // dedupe
28
+ const set = new Set();
29
+ preds.forEach(p => { if (!set.has(p)) { set.add(p); addToolbar(p); } });
30
+ }
31
+
32
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', scanAndAttach); else scanAndAttach();
33
+ // also attach after Prism highlights run
34
+ if (window.Prism && typeof window.Prism === 'object'){
35
+ const original = window.Prism.highlightAll;
36
+ window.Prism.highlightAll = function(){
37
+ try { original && original.apply(window.Prism, arguments); } catch(e){}
38
+ scanAndAttach();
39
+ };
40
+ }
41
+ })();
@@ -0,0 +1 @@
1
+ var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(l){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,e={},j={manual:l.Prism&&l.Prism.manual,disableWorkerMessageHandler:l.Prism&&l.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof C?new C(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function n(e,a){var r,t;switch(a=a||{},j.util.type(e)){case"Object":if(t=j.util.objId(e),a[t])return a[t];for(var s in r={},a[t]=r,e)e.hasOwnProperty(s)&&(r[s]=n(e[s],a));return r;case"Array":return(t=j.util.objId(e),a[t])?a[t]:(r=[],a[t]=r,e.forEach(function(e,t){r[t]=n(e,a)}),r);default:return e}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,"gi"),""),e.classList.add("language-"+t)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var t=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(t){var n,a=document.getElementsByTagName("script");for(n in a)if(a[n].src==t)return a[n]}return null}},isActive:function(e,t,n){for(var a="no-"+t;e;){var r=e.classList;if(r.contains(t))return!0;if(r.contains(a))return!1;e=e.parentElement}return!!n}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,t){var n,a=j.util.clone(j.languages[e]);for(n in t)a[n]=t[n];return a},insertBefore:function(n,e,t,a){var r,s=(a=a||j.languages)[n],i={};for(r in s)if(s.hasOwnProperty(r)){if(r==e)for(var o in t)t.hasOwnProperty(o)&&(i[o]=t[o]);t.hasOwnProperty(r)||(i[r]=s[r])}var l=a[n];return a[n]=i,j.languages.DFS(j.languages,function(e,t){t===l&&e!=n&&(this[e]=i)}),i},DFS:function e(t,n,a,r){r=r||{};var s,i,o,l=j.util.objId;for(s in t)t.hasOwnProperty(s)&&(n.call(t,s,t[s],a||s),i=t[s],"Object"!==(o=j.util.type(i))||r[l(i)]?"Array"!==o||r[l(i)]||(r[l(i)]=!0,e(i,n,s,r)):(r[l(i)]=!0,e(i,n,null,r)))}},plugins:{},highlightAll:function(e,t){j.highlightAllUnder(document,e,t)},highlightAllUnder:function(e,t,n){var a={callback:n,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};j.hooks.run("before-highlightall",a),a.elements=Array.prototype.slice.apply(a.container.querySelectorAll(a.selector)),j.hooks.run("before-all-elements-highlight",a);for(var r,s=0;r=a.elements[s++];)j.highlightElement(r,!0===t,a.callback)},highlightElement:function(e,t,n){var a=j.util.getLanguage(e),r=j.languages[a],s=(j.util.setLanguage(e,a),e.parentElement);s&&"pre"===s.nodeName.toLowerCase()&&j.util.setLanguage(s,a);var i={element:e,language:a,grammar:r,code:e.textContent};function o(e){i.highlightedCode=e,j.hooks.run("before-insert",i),i.element.innerHTML=i.highlightedCode,j.hooks.run("after-highlight",i),j.hooks.run("complete",i),n&&n.call(i.element)}if(j.hooks.run("before-sanity-check",i),(s=i.element.parentElement)&&"pre"===s.nodeName.toLowerCase()&&!s.hasAttribute("tabindex")&&s.setAttribute("tabindex","0"),!i.code)return j.hooks.run("complete",i),void(n&&n.call(i.element));j.hooks.run("before-highlight",i),i.grammar?t&&l.Worker?((a=new Worker(j.filename)).onmessage=function(e){o(e.data)},a.postMessage(JSON.stringify({language:i.language,code:i.code,immediateClose:!0}))):o(j.highlight(i.code,i.grammar,i.language)):o(j.util.encode(i.code))},highlight:function(e,t,n){e={code:e,grammar:t,language:n};if(j.hooks.run("before-tokenize",e),e.grammar)return e.tokens=j.tokenize(e.code,e.grammar),j.hooks.run("after-tokenize",e),C.stringify(j.util.encode(e.tokens),e.language);throw new Error('The language "'+e.language+'" has no grammar.')},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest}for(var r=new u,s=(z(r,r.head,e),!function e(t,n,a,r,s,i){for(var o in a)if(a.hasOwnProperty(o)&&a[o]){var l=a[o];l=Array.isArray(l)?l:[l];for(var u=0;u<l.length;++u){if(i&&i.cause==o+","+u)return;for(var g,c=l[u],d=c.inside,p=!!c.lookbehind,m=!!c.greedy,h=c.alias,f=(m&&!c.pattern.global&&(g=c.pattern.toString().match(/[imsuy]*$/)[0],c.pattern=RegExp(c.pattern.source,g+"g")),c.pattern||c),b=r.next,y=s;b!==n.tail&&!(i&&y>=i.reach);y+=b.value.length,b=b.next){var v=b.value;if(n.length>t.length)return;if(!(v instanceof C)){var F,x=1;if(m){if(!(F=L(f,y,t,p))||F.index>=t.length)break;var k=F.index,w=F.index+F[0].length,A=y;for(A+=b.value.length;A<=k;)b=b.next,A+=b.value.length;if(A-=b.value.length,y=A,b.value instanceof C)continue;for(var P=b;P!==n.tail&&(A<w||"string"==typeof P.value);P=P.next)x++,A+=P.value.length;x--,v=t.slice(y,A),F.index-=y}else if(!(F=L(f,0,v,p)))continue;var k=F.index,$=F[0],S=v.slice(0,k),E=v.slice(k+$.length),v=y+v.length,_=(i&&v>i.reach&&(i.reach=v),b.prev),S=(S&&(_=z(n,_,S),y+=S.length),O(n,_,x),new C(o,d?j.tokenize($,d):$,h,$));b=z(n,_,S),E&&z(n,b,E),1<x&&($={cause:o+","+u,reach:v},e(t,n,a,b.prev,y,$),i&&$.reach>i.reach&&(i.reach=$.reach))}}}}}(e,r,t,r.head,0),r),i=[],o=s.head.next;o!==s.tail;)i.push(o.value),o=o.next;return i},hooks:{all:{},add:function(e,t){var n=j.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=j.hooks.all[e];if(n&&n.length)for(var a,r=0;a=n[r++];)a(t)}},Token:C};function C(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function L(e,t,n,a){e.lastIndex=t;t=e.exec(n);return t&&a&&t[1]&&(e=t[1].length,t.index+=e,t[0]=t[0].slice(e)),t}function u(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function z(e,t,n){var a=t.next,n={value:n,prev:t,next:a};return t.next=n,a.prev=n,e.length++,n}function O(e,t,n){for(var a=t.next,r=0;r<n&&a!==e.tail;r++)a=a.next;(t.next=a).prev=t,e.length-=r}if(l.Prism=j,C.stringify=function t(e,n){if("string"==typeof e)return e;var a;if(Array.isArray(e))return a="",e.forEach(function(e){a+=t(e,n)}),a;var r,s={type:e.type,content:t(e.content,n),tag:"span",classes:["token",e.type],attributes:{},language:n},e=e.alias,i=(e&&(Array.isArray(e)?Array.prototype.push.apply(s.classes,e):s.classes.push(e)),j.hooks.run("wrap",s),"");for(r in s.attributes)i+=" "+r+'="'+(s.attributes[r]||"").replace(/"/g,"&quot;")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'"'+i+">"+s.content+"</"+s.tag+">"},!l.document)return l.addEventListener&&(j.disableWorkerMessageHandler||l.addEventListener("message",function(e){var e=JSON.parse(e.data),t=e.language,n=e.code,e=e.immediateClose;l.postMessage(j.highlight(n,j.languages[t],t)),e&&l.close()},!1)),j;var a,e=j.util.currentScript();function r(){j.manual||j.highlightAll()}return e&&(j.filename=e.src,e.hasAttribute("data-manual")&&(j.manual=!0)),j.manual||("loading"===(a=document.readyState)||"interactive"===a&&e&&e.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),j}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,t){var n={},n=(n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}),t=(n["language-"+t]={pattern:/[\s\S]+/,inside:Prism.languages[t]},{});t[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,t){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:Prism.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup);t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,function(){var l,u,g,c,e;void 0!==Prism&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),l={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},c="pre[data-src]:not(["+(u="data-src-status")+'="loaded"]):not(['+u+'="'+(g="loading")+'"])',Prism.hooks.add("before-highlightall",function(e){e.selector+=", "+c}),Prism.hooks.add("before-sanity-check",function(e){var r,t,n,a,s,i,o=e.element;o.matches(c)&&(e.code="",o.setAttribute(u,g),(r=o.appendChild(document.createElement("CODE"))).textContent="Loading…",t=o.getAttribute("data-src"),"none"===(e=e.language)&&(n=(/\.(\w+)$/.exec(t)||[,"none"])[1],e=l[n]||n),Prism.util.setLanguage(r,e),Prism.util.setLanguage(o,e),(n=Prism.plugins.autoloader)&&n.loadLanguages(e),n=t,a=function(e){o.setAttribute(u,"loaded");var t,n,a=function(e){var t,n;if(e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||""))return t=Number(e[1]),n=e[2],e=e[3],n?e?[t,Number(e)]:[t,void 0]:[t,t]}(o.getAttribute("data-range"));a&&(t=e.split(/\r\n?|\n/g),n=a[0],a=null==a[1]?t.length:a[1],n<0&&(n+=t.length),n=Math.max(0,Math.min(n-1,t.length)),a<0&&(a+=t.length),a=Math.max(0,Math.min(a,t.length)),e=t.slice(n,a).join("\n"),o.hasAttribute("data-start")||o.setAttribute("data-start",String(n+1))),r.textContent=e,Prism.highlightElement(r)},s=function(e){o.setAttribute(u,"failed"),r.textContent=e},(i=new XMLHttpRequest).open("GET",n,!0),i.onreadystatechange=function(){4==i.readyState&&(i.status<400&&i.responseText?a(i.responseText):400<=i.status?s("✖ Error "+i.status+" while fetching file: "+i.statusText):s("✖ Error: File does not exist or is empty"))},i.send(null))}),e=!(Prism.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(c),a=0;t=n[a++];)Prism.highlightElement(t)}}),Prism.fileHighlight=function(){e||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),e=!0),Prism.plugins.fileHighlight.highlight.apply(this,arguments)})}();