nitropack-nightly 2.11.4-20250306-175805.31dde1e4 → 2.11.4-20250307-005815.a4569493
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.
- package/dist/core/index.mjs +4 -3
- package/dist/meta/index.d.mts +1 -1
- package/dist/meta/index.d.ts +1 -1
- package/dist/meta/index.mjs +1 -1
- package/dist/presets/_nitro/runtime/nitro-dev.mjs +7 -10
- package/dist/runtime/internal/error/dev.mjs +4 -3
- package/package.json +4 -4
- package/dist/deps/youch/public/error_cause/style.css +0 -5
- package/dist/deps/youch/public/error_info/style.css +0 -55
- package/dist/deps/youch/public/error_stack/script.js +0 -74
- package/dist/deps/youch/public/error_stack/style.css +0 -206
- package/dist/deps/youch/public/error_stack_source/style.css +0 -122
- package/dist/deps/youch/public/header/script.js +0 -16
- package/dist/deps/youch/public/header/style.css +0 -55
- package/dist/deps/youch/public/layout/script.js +0 -11
- package/dist/deps/youch/public/layout/style.css +0 -414
- package/dist/deps/youch/youch.mjs +0 -239
package/dist/core/index.mjs
CHANGED
|
@@ -45,7 +45,7 @@ import { Worker } from 'node:worker_threads';
|
|
|
45
45
|
import { createProxyServer } from 'httpxy';
|
|
46
46
|
import nodeCrypto from 'node:crypto';
|
|
47
47
|
import { resolve as resolve$1, dirname as dirname$1 } from 'node:path';
|
|
48
|
-
import * as _youch from '
|
|
48
|
+
import * as _youch from 'youch-redist';
|
|
49
49
|
import { SourceMapConsumer } from 'source-map';
|
|
50
50
|
import serveStatic from 'serve-static';
|
|
51
51
|
import { listen } from 'listhen';
|
|
@@ -2392,6 +2392,7 @@ function defineNitroErrorHandler(handler) {
|
|
|
2392
2392
|
return handler;
|
|
2393
2393
|
}
|
|
2394
2394
|
|
|
2395
|
+
const { Youch, ErrorParser } = _youch;
|
|
2395
2396
|
const devErrorHandler = defineNitroErrorHandler(
|
|
2396
2397
|
async function defaultNitroErrorHandler(error, event) {
|
|
2397
2398
|
const res = await defaultHandler(error, event);
|
|
@@ -2421,7 +2422,7 @@ async function defaultHandler(error, event, opts) {
|
|
|
2421
2422
|
}
|
|
2422
2423
|
}
|
|
2423
2424
|
await loadStackTrace(error).catch(consola.error);
|
|
2424
|
-
const youch = new
|
|
2425
|
+
const youch = new Youch();
|
|
2425
2426
|
if (isSensitive && !opts?.silent) {
|
|
2426
2427
|
const tags = [error.unhandled && "[unhandled]", error.fatal && "[fatal]"].filter(Boolean).join(" ");
|
|
2427
2428
|
const ansiError = await (await youch.toANSI(error)).replaceAll(process.cwd(), ".");
|
|
@@ -2476,7 +2477,7 @@ async function loadStackTrace(error) {
|
|
|
2476
2477
|
if (!(error instanceof Error)) {
|
|
2477
2478
|
return;
|
|
2478
2479
|
}
|
|
2479
|
-
const parsed = await new
|
|
2480
|
+
const parsed = await new ErrorParser().defineSourceLoader(sourceLoader).parse(error);
|
|
2480
2481
|
const stack = error.message + "\n" + parsed.frames.map((frame) => fmtFrame(frame)).join("\n");
|
|
2481
2482
|
Object.defineProperty(error, "stack", { value: stack });
|
|
2482
2483
|
if (error.cause) {
|
package/dist/meta/index.d.mts
CHANGED
package/dist/meta/index.d.ts
CHANGED
package/dist/meta/index.mjs
CHANGED
|
@@ -9,6 +9,7 @@ import { join } from "node:path";
|
|
|
9
9
|
import nodeCrypto from "node:crypto";
|
|
10
10
|
import { parentPort, threadId } from "node:worker_threads";
|
|
11
11
|
import wsAdapter from "crossws/adapters/node";
|
|
12
|
+
import { isCI } from "std-env";
|
|
12
13
|
import {
|
|
13
14
|
defineEventHandler,
|
|
14
15
|
getQuery,
|
|
@@ -94,17 +95,13 @@ function listen(useRandomPort = Boolean(
|
|
|
94
95
|
function getSocketAddress() {
|
|
95
96
|
const socketName = `worker-${process.pid}-${threadId}-${Math.round(Math.random() * 1e4)}-${NITRO_DEV_WORKER_ID}.sock`;
|
|
96
97
|
const socketPath = join(NITRO_DEV_WORKER_DIR, socketName);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return `\0${socketPath}`;
|
|
103
|
-
}
|
|
104
|
-
default: {
|
|
105
|
-
return socketPath;
|
|
106
|
-
}
|
|
98
|
+
if (process.platform === "win32") {
|
|
99
|
+
return join(String.raw`\\.\pipe\nitro`, socketPath);
|
|
100
|
+
}
|
|
101
|
+
if (process.platform === "linux" && !isCI) {
|
|
102
|
+
return `\0${socketPath}`;
|
|
107
103
|
}
|
|
104
|
+
return socketPath;
|
|
108
105
|
}
|
|
109
106
|
async function shutdown() {
|
|
110
107
|
server.closeAllConnections?.();
|
|
@@ -11,9 +11,10 @@ import nodeCrypto from "node:crypto";
|
|
|
11
11
|
import { readFile } from "node:fs/promises";
|
|
12
12
|
import { resolve, dirname } from "node:path";
|
|
13
13
|
import consola from "consola";
|
|
14
|
-
import * as _youch from "
|
|
14
|
+
import * as _youch from "youch-redist";
|
|
15
15
|
import { SourceMapConsumer } from "source-map";
|
|
16
16
|
import { defineNitroErrorHandler } from "./utils.mjs";
|
|
17
|
+
const { Youch, ErrorParser } = _youch;
|
|
17
18
|
export default defineNitroErrorHandler(
|
|
18
19
|
async function defaultNitroErrorHandler(error, event) {
|
|
19
20
|
const res = await defaultHandler(error, event);
|
|
@@ -43,7 +44,7 @@ export async function defaultHandler(error, event, opts) {
|
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
await loadStackTrace(error).catch(consola.error);
|
|
46
|
-
const youch = new
|
|
47
|
+
const youch = new Youch();
|
|
47
48
|
if (isSensitive && !opts?.silent) {
|
|
48
49
|
const tags = [error.unhandled && "[unhandled]", error.fatal && "[fatal]"].filter(Boolean).join(" ");
|
|
49
50
|
const ansiError = await (await youch.toANSI(error)).replaceAll(process.cwd(), ".");
|
|
@@ -98,7 +99,7 @@ export async function loadStackTrace(error) {
|
|
|
98
99
|
if (!(error instanceof Error)) {
|
|
99
100
|
return;
|
|
100
101
|
}
|
|
101
|
-
const parsed = await new
|
|
102
|
+
const parsed = await new ErrorParser().defineSourceLoader(sourceLoader).parse(error);
|
|
102
103
|
const stack = error.message + "\n" + parsed.frames.map((frame) => fmtFrame(frame)).join("\n");
|
|
103
104
|
Object.defineProperty(error, "stack", { value: stack });
|
|
104
105
|
if (error.cause) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nitropack-nightly",
|
|
3
|
-
"version": "2.11.4-
|
|
3
|
+
"version": "2.11.4-20250307-005815.a4569493",
|
|
4
4
|
"description": "Build and Deploy Universal JavaScript Servers",
|
|
5
5
|
"repository": "nitrojs/nitro",
|
|
6
6
|
"license": "MIT",
|
|
@@ -62,7 +62,6 @@
|
|
|
62
62
|
"types": "./types.d.ts",
|
|
63
63
|
"import": "./dist/types/index.mjs"
|
|
64
64
|
},
|
|
65
|
-
"./internal/deps/youch": "./dist/deps/youch/youch.mjs",
|
|
66
65
|
"./package.json": "./package.json"
|
|
67
66
|
},
|
|
68
67
|
"main": "./dist/core/index.mjs",
|
|
@@ -170,7 +169,8 @@
|
|
|
170
169
|
"unplugin-utils": "^0.2.4",
|
|
171
170
|
"unstorage": "^1.15.0",
|
|
172
171
|
"untyped": "^2.0.0",
|
|
173
|
-
"unwasm": "^0.3.9"
|
|
172
|
+
"unwasm": "^0.3.9",
|
|
173
|
+
"youch-redist": "4.1.0-beta.5-1"
|
|
174
174
|
},
|
|
175
175
|
"devDependencies": {
|
|
176
176
|
"@azure/functions": "^3.5.1",
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
"undici": "^7.4.0",
|
|
208
208
|
"vitest": "^3.0.7",
|
|
209
209
|
"xml2js": "^0.6.2",
|
|
210
|
-
"youch": "4.1.0-beta.5",
|
|
210
|
+
"youch": "^4.1.0-beta.5",
|
|
211
211
|
"youch-core": "^0.3.1"
|
|
212
212
|
},
|
|
213
213
|
"peerDependencies": {
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
#error-name {
|
|
2
|
-
color: var(--danger-fg);
|
|
3
|
-
font-size: 16px;
|
|
4
|
-
-webkit-font-smoothing: antialiased;
|
|
5
|
-
-moz-osx-font-smoothing: grayscale;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
#error-title {
|
|
9
|
-
color: var(--title-fg);
|
|
10
|
-
font-size: 32px;
|
|
11
|
-
-webkit-font-smoothing: antialiased;
|
|
12
|
-
-moz-osx-font-smoothing: grayscale;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
#error-message {
|
|
16
|
-
color: var(--danger-fg);
|
|
17
|
-
font-size: 22px;
|
|
18
|
-
font-weight: 700;
|
|
19
|
-
display: flex;
|
|
20
|
-
align-items: center;
|
|
21
|
-
align-items: flex-start;
|
|
22
|
-
gap: 12px;
|
|
23
|
-
-webkit-font-smoothing: antialiased;
|
|
24
|
-
-moz-osx-font-smoothing: grayscale;
|
|
25
|
-
}
|
|
26
|
-
#error-message svg {
|
|
27
|
-
margin-top: 1.5px;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
#error-hint {
|
|
31
|
-
border-top: 1px solid var(--border);
|
|
32
|
-
padding-top: 15px;
|
|
33
|
-
margin-top: 15px;
|
|
34
|
-
font-size: 15px;
|
|
35
|
-
font-style: italic;
|
|
36
|
-
display: flex;
|
|
37
|
-
gap: 12px;
|
|
38
|
-
align-items: flex-start;
|
|
39
|
-
padding-left: 1px;
|
|
40
|
-
}
|
|
41
|
-
#error-hint svg {
|
|
42
|
-
margin-bottom: -2px;
|
|
43
|
-
}
|
|
44
|
-
#error-hint strong {
|
|
45
|
-
color: var(--title-fg);
|
|
46
|
-
}
|
|
47
|
-
#error-hint a {
|
|
48
|
-
color: var(--links-fg);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@media (min-width: 1024px) {
|
|
52
|
-
#error-hint {
|
|
53
|
-
align-items: center;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
function showFormattedFrames(button) {
|
|
2
|
-
document.querySelector('#all-frames-toggle input[type="checkbox"]').disabled = false
|
|
3
|
-
const parent = button.closest('section')
|
|
4
|
-
|
|
5
|
-
const formattedFrames = parent.querySelector('#stack-frames-formatted')
|
|
6
|
-
formattedFrames.classList.add('visible')
|
|
7
|
-
|
|
8
|
-
const rawFrames = parent.querySelector('#stack-frames-raw')
|
|
9
|
-
rawFrames.classList.remove('visible')
|
|
10
|
-
|
|
11
|
-
button.parentElement.querySelectorAll('button').forEach((btn) => btn.classList.remove('active'))
|
|
12
|
-
button.classList.add('active')
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function showRawFrames(button) {
|
|
16
|
-
document.querySelector('#all-frames-toggle input[type="checkbox"]').disabled = true
|
|
17
|
-
const parent = button.closest('section')
|
|
18
|
-
|
|
19
|
-
const formattedFrames = parent.querySelector('#stack-frames-formatted')
|
|
20
|
-
formattedFrames.classList.remove('visible')
|
|
21
|
-
|
|
22
|
-
const rawFrames = parent.querySelector('#stack-frames-raw')
|
|
23
|
-
rawFrames.classList.add('visible')
|
|
24
|
-
|
|
25
|
-
button.parentElement.querySelectorAll('button').forEach((btn) => btn.classList.remove('active'))
|
|
26
|
-
button.classList.add('active')
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function toggleFrameSource(parent) {
|
|
30
|
-
if (parent.classList.contains('expanded')) {
|
|
31
|
-
parent.classList.remove('expanded')
|
|
32
|
-
} else {
|
|
33
|
-
parent.classList.add('expanded')
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function toggleAllFrames() {
|
|
38
|
-
const wrapper = document.querySelector('#stack-frames-wrapper')
|
|
39
|
-
const indicator = document.querySelector('#all-frames-toggle input[type="checkbox"]')
|
|
40
|
-
if (indicator.checked) {
|
|
41
|
-
wrapper.classList.add('display-all')
|
|
42
|
-
} else {
|
|
43
|
-
wrapper.classList.remove('display-all')
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
window.addEventListener('DOMContentLoaded', () => {
|
|
48
|
-
document.querySelector('#formatted-frames-toggle').addEventListener('click', function () {
|
|
49
|
-
showFormattedFrames(this)
|
|
50
|
-
})
|
|
51
|
-
document.querySelector('#raw-frames-toggle').addEventListener('click', function () {
|
|
52
|
-
showRawFrames(this)
|
|
53
|
-
})
|
|
54
|
-
document
|
|
55
|
-
.querySelector('#all-frames-toggle input[type="checkbox"]')
|
|
56
|
-
.addEventListener('change', function () {
|
|
57
|
-
toggleAllFrames()
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
document.querySelectorAll('button[class="stack-frame-location"]').forEach((sfl) => {
|
|
61
|
-
sfl.addEventListener('click', function (e) {
|
|
62
|
-
if (e.target.tagName === 'A') {
|
|
63
|
-
return
|
|
64
|
-
}
|
|
65
|
-
toggleFrameSource(e.target.closest('li'))
|
|
66
|
-
})
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
document.querySelectorAll('button[class="stack-frame-toggle-indicator"]').forEach((sfl) => {
|
|
70
|
-
sfl.addEventListener('click', function (e) {
|
|
71
|
-
toggleFrameSource(e.target.closest('li'))
|
|
72
|
-
})
|
|
73
|
-
})
|
|
74
|
-
})
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--frame-bg: var(--slate-2);
|
|
3
|
-
--label-bg: var(--green-5);
|
|
4
|
-
--label-fg: var(--green-12);
|
|
5
|
-
--switch-bg: var(--slate-3);
|
|
6
|
-
--switch-active-bg: var(--slate-a4);
|
|
7
|
-
--switch-border: var(--slate-7);
|
|
8
|
-
}
|
|
9
|
-
html.dark {
|
|
10
|
-
--frame-bg: var(--slate-2);
|
|
11
|
-
--label-bg: var(--green-3);
|
|
12
|
-
--label-fg: var(--green-11);
|
|
13
|
-
--switch-bg: var(--slate-3);
|
|
14
|
-
--switch-active-bg: var(--slate-a4);
|
|
15
|
-
--switch-border: var(--slate-7);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
#stack-frames-wrapper {
|
|
19
|
-
border: 1px solid var(--border);
|
|
20
|
-
border-radius: var(--radius);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
#stack-frames-header {
|
|
24
|
-
display: flex;
|
|
25
|
-
justify-content: space-between;
|
|
26
|
-
align-items: center;
|
|
27
|
-
padding: 10px 16px;
|
|
28
|
-
border-radius: var(--radius) var(--radius) 0 0;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
#all-frames-toggle {
|
|
32
|
-
display: flex;
|
|
33
|
-
align-items: center;
|
|
34
|
-
gap: 6px;
|
|
35
|
-
font-size: 13px;
|
|
36
|
-
font-weight: 500;
|
|
37
|
-
user-select: none;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
#stack-frames {
|
|
41
|
-
list-style: none;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
.stack-frame {
|
|
45
|
-
border-top: 1px solid var(--border);
|
|
46
|
-
font-size: 14px;
|
|
47
|
-
}
|
|
48
|
-
.stack-frame.stack-frame-native {
|
|
49
|
-
display: none;
|
|
50
|
-
font-style: italic;
|
|
51
|
-
}
|
|
52
|
-
.stack-frame.stack-frame-native a,
|
|
53
|
-
.stack-frame.stack-frame-native code {
|
|
54
|
-
color: var(--muted-fg);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
#stack-frames-wrapper.display-all .stack-frame.stack-frame-native {
|
|
58
|
-
display: block;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.stack-frame-contents {
|
|
62
|
-
background: var(--frame-bg);
|
|
63
|
-
display: flex;
|
|
64
|
-
padding: 0 12px;
|
|
65
|
-
align-items: center;
|
|
66
|
-
justify-content: space-between;
|
|
67
|
-
}
|
|
68
|
-
.stack-frame:not(.stack-frame-native) .stack-frame-contents:hover {
|
|
69
|
-
background: var(--card-bg);
|
|
70
|
-
}
|
|
71
|
-
.stack-frame:last-child:not(.expanded) .stack-frame-contents {
|
|
72
|
-
border-radius: 0 0 var(--radius) var(--radius);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.stack-frame-location {
|
|
76
|
-
display: flex;
|
|
77
|
-
flex-direction: column;
|
|
78
|
-
overflow: hidden;
|
|
79
|
-
gap: 7px;
|
|
80
|
-
border: none;
|
|
81
|
-
background: none;
|
|
82
|
-
flex: 1;
|
|
83
|
-
color: inherit;
|
|
84
|
-
font: inherit;
|
|
85
|
-
padding: 9px 0;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.stack-frame-location a {
|
|
89
|
-
text-decoration: none;
|
|
90
|
-
white-space: nowrap;
|
|
91
|
-
overflow: hidden;
|
|
92
|
-
text-overflow: ellipsis;
|
|
93
|
-
}
|
|
94
|
-
.stack-frame-location span {
|
|
95
|
-
white-space: nowrap;
|
|
96
|
-
overflow: hidden;
|
|
97
|
-
text-overflow: ellipsis;
|
|
98
|
-
}
|
|
99
|
-
.stack-frame-location code {
|
|
100
|
-
font-family: var(--font-sans);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
.stack-frame-extras {
|
|
104
|
-
display: flex;
|
|
105
|
-
gap: 6px;
|
|
106
|
-
align-items: center;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
.stack-frame-toggle-indicator {
|
|
110
|
-
border: none;
|
|
111
|
-
border-radius: var(--radius);
|
|
112
|
-
height: 22px;
|
|
113
|
-
width: 22px;
|
|
114
|
-
display: flex;
|
|
115
|
-
justify-content: center;
|
|
116
|
-
align-items: center;
|
|
117
|
-
background: none;
|
|
118
|
-
color: inherit;
|
|
119
|
-
font: inherit;
|
|
120
|
-
}
|
|
121
|
-
.stack-frame-toggle-indicator:hover {
|
|
122
|
-
border: 1px solid var(--switch-border);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.stack-frame-toggle-indicator svg {
|
|
126
|
-
width: 16px;
|
|
127
|
-
display: block;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
.stack-frame.expanded .stack-frame-toggle-indicator svg {
|
|
131
|
-
transform: rotate(180deg);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
.frame-label {
|
|
135
|
-
padding: 0px 8px;
|
|
136
|
-
border-radius: 20px;
|
|
137
|
-
align-items: center;
|
|
138
|
-
height: 20px;
|
|
139
|
-
background: var(--label-bg);
|
|
140
|
-
font-size: 12px;
|
|
141
|
-
font-weight: 500;
|
|
142
|
-
color: var(--label-fg);
|
|
143
|
-
display: none;
|
|
144
|
-
}
|
|
145
|
-
.stack-frame-source {
|
|
146
|
-
display: none;
|
|
147
|
-
}
|
|
148
|
-
.stack-frame.expanded .stack-frame-source {
|
|
149
|
-
display: block;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
#stack-frames-raw {
|
|
153
|
-
--pre-bg-color: transparent;
|
|
154
|
-
border-top: 1px solid var(--border);
|
|
155
|
-
}
|
|
156
|
-
#stack-frames-formatted,
|
|
157
|
-
#stack-frames-raw {
|
|
158
|
-
display: none;
|
|
159
|
-
}
|
|
160
|
-
#stack-frames-formatted.visible,
|
|
161
|
-
#stack-frames-raw.visible {
|
|
162
|
-
display: block;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
.toggle-switch {
|
|
166
|
-
display: flex;
|
|
167
|
-
background: var(--switch-bg);
|
|
168
|
-
border: 1px solid var(--switch-border);
|
|
169
|
-
border-radius: var(--radius);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
.toggle-switch button {
|
|
173
|
-
background: none;
|
|
174
|
-
border: none;
|
|
175
|
-
font-family: inherit;
|
|
176
|
-
color: inherit;
|
|
177
|
-
font-size: 13px;
|
|
178
|
-
font-weight: 500;
|
|
179
|
-
padding: 4px 8px;
|
|
180
|
-
border-right: 1px solid var(--switch-border);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
.toggle-switch button:first-child {
|
|
184
|
-
border-radius: var(--radius) 0 0 var(--radius);
|
|
185
|
-
}
|
|
186
|
-
.toggle-switch button:last-child {
|
|
187
|
-
border-radius: 0 var(--radius) var(--radius) 0;
|
|
188
|
-
border: none;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
.toggle-switch button.active {
|
|
192
|
-
background: var(--switch-active-bg);
|
|
193
|
-
color: var(--title-fg);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
@media (min-width: 768px) {
|
|
197
|
-
.stack-frame-location {
|
|
198
|
-
flex-direction: row;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
@media (min-width: 1024px) {
|
|
203
|
-
.frame-label {
|
|
204
|
-
display: inline-flex;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--error-bg: #ff000632;
|
|
3
|
-
--pre-selection-bg: var(--slate-a5);
|
|
4
|
-
--line-numbers-fg: var(--slate-a11);
|
|
5
|
-
}
|
|
6
|
-
html.dark {
|
|
7
|
-
--error-bg: #ff173f2d;
|
|
8
|
-
--pre-selection-bg: var(--slate-a5);
|
|
9
|
-
--line-numbers-fg: var(--slate-a11);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.line-highlight {
|
|
13
|
-
position: absolute;
|
|
14
|
-
left: 0;
|
|
15
|
-
right: 0;
|
|
16
|
-
background: var(--error-bg);
|
|
17
|
-
height: 24px;
|
|
18
|
-
pointer-events: none;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
[class*='shj-lang-'] {
|
|
22
|
-
white-space: pre;
|
|
23
|
-
border-top: 1px solid var(--border);
|
|
24
|
-
background: var(--pre-bg-color);
|
|
25
|
-
color: var(--pre-fg-color);
|
|
26
|
-
line-height: 24px;
|
|
27
|
-
box-sizing: border-box;
|
|
28
|
-
max-width: min(100%, 100vw);
|
|
29
|
-
display: block;
|
|
30
|
-
font-size: 12px;
|
|
31
|
-
font-family: var(--font-mono);
|
|
32
|
-
position: relative;
|
|
33
|
-
padding: 10px 12px 12px 12px;
|
|
34
|
-
}
|
|
35
|
-
[class*='shj-lang-'] * {
|
|
36
|
-
-webkit-font-smoothing: initial;
|
|
37
|
-
-moz-osx-font-smoothing: initial;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.shj-inline {
|
|
41
|
-
margin: 0;
|
|
42
|
-
padding: 2px 5px;
|
|
43
|
-
display: inline-block;
|
|
44
|
-
border-radius: 5px;
|
|
45
|
-
}
|
|
46
|
-
[class*='shj-lang-']::selection,
|
|
47
|
-
[class*='shj-lang-'] ::selection {
|
|
48
|
-
background: var(--pre-selection-bg);
|
|
49
|
-
}
|
|
50
|
-
[class*='shj-lang-'] > div {
|
|
51
|
-
display: flex;
|
|
52
|
-
overflow: auto;
|
|
53
|
-
}
|
|
54
|
-
[class*='shj-lang-'] > div :last-child {
|
|
55
|
-
flex: 1;
|
|
56
|
-
outline: none;
|
|
57
|
-
}
|
|
58
|
-
.shj-numbers {
|
|
59
|
-
padding-left: 5px;
|
|
60
|
-
counter-reset: line;
|
|
61
|
-
}
|
|
62
|
-
.shj-numbers div {
|
|
63
|
-
padding-right: 5px;
|
|
64
|
-
}
|
|
65
|
-
.shj-numbers div:before {
|
|
66
|
-
color: var(--line-numbers-fg);
|
|
67
|
-
display: block;
|
|
68
|
-
content: counter(line);
|
|
69
|
-
opacity: 0.5;
|
|
70
|
-
text-align: right;
|
|
71
|
-
margin-right: 5px;
|
|
72
|
-
counter-increment: line;
|
|
73
|
-
}
|
|
74
|
-
.shj-syn-cmnt {
|
|
75
|
-
font-style: italic;
|
|
76
|
-
}
|
|
77
|
-
.shj-syn-err,
|
|
78
|
-
.shj-syn-kwd {
|
|
79
|
-
color: var(--dt-symbol-fg-color);
|
|
80
|
-
}
|
|
81
|
-
.shj-syn-num {
|
|
82
|
-
color: var(--dt-number-fg-color);
|
|
83
|
-
}
|
|
84
|
-
.shj-syn-class {
|
|
85
|
-
color: var(--class-label-fg-color);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.shj-numbers,
|
|
89
|
-
.shj-syn-cmnt {
|
|
90
|
-
color: var(--dt-undefined-fg-color);
|
|
91
|
-
}
|
|
92
|
-
.shj-syn-insert,
|
|
93
|
-
.shj-syn-str {
|
|
94
|
-
color: var(--dt-string-fg-color);
|
|
95
|
-
}
|
|
96
|
-
.shj-syn-bool {
|
|
97
|
-
color: var(--dt-boolean-fg-color);
|
|
98
|
-
}
|
|
99
|
-
.shj-syn-type,
|
|
100
|
-
.shj-syn-oper {
|
|
101
|
-
color: var(--braces-fg-color);
|
|
102
|
-
}
|
|
103
|
-
.shj-syn-section,
|
|
104
|
-
.shj-syn-func {
|
|
105
|
-
color: var(--pre-fg-color);
|
|
106
|
-
}
|
|
107
|
-
.shj-syn-deleted,
|
|
108
|
-
.shj-syn-var {
|
|
109
|
-
color: var(--brackets-fg-color);
|
|
110
|
-
}
|
|
111
|
-
.shj-oneline {
|
|
112
|
-
padding: 12px 10px;
|
|
113
|
-
}
|
|
114
|
-
.shj-multiline.shj-mode-header {
|
|
115
|
-
padding: 20px;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
@media (min-width: 768px) {
|
|
119
|
-
[class*='shj-lang-'] {
|
|
120
|
-
border-top: none;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
function toggleTheme(input) {
|
|
2
|
-
if (input.checked) {
|
|
3
|
-
document.documentElement.classList.add('dark')
|
|
4
|
-
localStorage.setItem('youch-theme', 'dark')
|
|
5
|
-
} else {
|
|
6
|
-
document.documentElement.classList.remove('dark')
|
|
7
|
-
localStorage.setItem('youch-theme', 'light')
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
window.addEventListener('DOMContentLoaded', () => {
|
|
12
|
-
document.querySelector('#toggle-theme-checkbox').checked = usesDarkMode()
|
|
13
|
-
document.querySelector('#toggle-theme-checkbox').addEventListener('change', function () {
|
|
14
|
-
toggleTheme(this)
|
|
15
|
-
})
|
|
16
|
-
})
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
#header-actions {
|
|
2
|
-
display: flex;
|
|
3
|
-
flex-direction: row-reverse;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
#toggle-theme-container {
|
|
7
|
-
position: relative;
|
|
8
|
-
display: inline-block;
|
|
9
|
-
padding-right: 10px;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
#toggle-theme-container input[type='checkbox'] {
|
|
13
|
-
opacity: 0;
|
|
14
|
-
position: absolute;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
#toggle-theme-label {
|
|
18
|
-
position: relative;
|
|
19
|
-
cursor: pointer;
|
|
20
|
-
border-radius: 50px;
|
|
21
|
-
display: inline-flex;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
#toggle-theme-checkbox:focus + #toggle-theme-label {
|
|
25
|
-
outline: 2px solid var(--slate-a6);
|
|
26
|
-
outline-offset: 4px;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
#light-theme-indicator,
|
|
30
|
-
#dark-theme-indicator {
|
|
31
|
-
position: relative;
|
|
32
|
-
z-index: 1;
|
|
33
|
-
display: flex;
|
|
34
|
-
align-items: center;
|
|
35
|
-
justify-content: center;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
#toggle-theme-label svg {
|
|
39
|
-
width: 30px;
|
|
40
|
-
height: 30px;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
#toggle-theme-container #dark-theme-indicator {
|
|
44
|
-
display: none;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
#toggle-theme-container
|
|
48
|
-
input[type='checkbox']:checked
|
|
49
|
-
+ #toggle-theme-label
|
|
50
|
-
#light-theme-indicator {
|
|
51
|
-
display: none;
|
|
52
|
-
}
|
|
53
|
-
#toggle-theme-container input[type='checkbox']:checked + #toggle-theme-label #dark-theme-indicator {
|
|
54
|
-
display: flex;
|
|
55
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
function usesDarkMode() {
|
|
2
|
-
let youchTheme = localStorage.getItem('youch-theme')
|
|
3
|
-
let hasDarkMode = false
|
|
4
|
-
if (youchTheme === null) {
|
|
5
|
-
hasDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
6
|
-
} else if (youchTheme === 'dark') {
|
|
7
|
-
hasDarkMode = true
|
|
8
|
-
}
|
|
9
|
-
return hasDarkMode
|
|
10
|
-
}
|
|
11
|
-
document.documentElement.classList.add(usesDarkMode() ? 'dark' : 'light')
|