mockaton 12.2.3 → 12.3.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.
- package/package.json +1 -1
- package/src/client/app-store.js +0 -2
- package/src/client/app.js +119 -98
- package/src/client/dom-utils.js +1 -1
- package/src/client/styles.css +32 -83
package/package.json
CHANGED
package/src/client/app-store.js
CHANGED
|
@@ -196,7 +196,6 @@ export const store = {
|
|
|
196
196
|
const response = await api.toggle500(method, urlMask)
|
|
197
197
|
if (!response.ok) throw response
|
|
198
198
|
store.setBroker(await response.json())
|
|
199
|
-
store.setChosenLink(method, urlMask)
|
|
200
199
|
store.renderRow(method, urlMask)
|
|
201
200
|
}
|
|
202
201
|
catch (error) { store.onError(error) }
|
|
@@ -207,7 +206,6 @@ export const store = {
|
|
|
207
206
|
const response = await api.setRouteIsProxied(method, urlMask, checked)
|
|
208
207
|
if (!response.ok) throw response
|
|
209
208
|
store.setBroker(await response.json())
|
|
210
|
-
store.setChosenLink(method, urlMask)
|
|
211
209
|
store.renderRow(method, urlMask)
|
|
212
210
|
}
|
|
213
211
|
catch (error) { store.onError(error) }
|
package/src/client/app.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createElement as r,
|
|
3
3
|
createSvgElement as s,
|
|
4
|
-
|
|
4
|
+
classNames, restoreFocus, Fragment, adoptCSS
|
|
5
5
|
} from './dom-utils.js'
|
|
6
6
|
|
|
7
7
|
import { store } from './app-store.js'
|
|
@@ -18,17 +18,18 @@ store.onError = onError
|
|
|
18
18
|
store.render = render
|
|
19
19
|
store.renderRow = renderRow
|
|
20
20
|
|
|
21
|
-
store.fetchState()
|
|
22
21
|
initRealTimeUpdates()
|
|
23
22
|
initKeyboardNavigation()
|
|
24
23
|
|
|
24
|
+
let mounted = false
|
|
25
25
|
function render() {
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
restoreFocus(() => {
|
|
27
|
+
document.body.replaceChildren(...App())
|
|
28
|
+
})
|
|
28
29
|
if (store.hasChosenLink)
|
|
29
30
|
previewMock()
|
|
31
|
+
mounted = true
|
|
30
32
|
}
|
|
31
|
-
render.count = 0
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
const leftSideRef = {}
|
|
@@ -42,10 +43,10 @@ function App() {
|
|
|
42
43
|
style: { width: leftSideRef.width },
|
|
43
44
|
className: CSS.leftSide
|
|
44
45
|
},
|
|
45
|
-
r('div',
|
|
46
|
+
r('div', classNames(CSS.SubToolbar),
|
|
46
47
|
GroupByMethod(),
|
|
47
48
|
BulkSelector()),
|
|
48
|
-
r('div',
|
|
49
|
+
r('div', classNames(CSS.Table),
|
|
49
50
|
MockList(),
|
|
50
51
|
StaticFilesList())),
|
|
51
52
|
r('div', { className: CSS.rightSide },
|
|
@@ -64,7 +65,7 @@ function Header() {
|
|
|
64
65
|
},
|
|
65
66
|
Logo()),
|
|
66
67
|
r('div', null,
|
|
67
|
-
r('div',
|
|
68
|
+
r('div', classNames(CSS.GlobalDelayWrap),
|
|
68
69
|
GlobalDelayField(),
|
|
69
70
|
GlobalDelayJitterField()),
|
|
70
71
|
CookieSelector(),
|
|
@@ -88,7 +89,7 @@ function GlobalDelayField() {
|
|
|
88
89
|
onWheel.timer = setTimeout(onChange.bind(this), 300)
|
|
89
90
|
}
|
|
90
91
|
return (
|
|
91
|
-
r('label',
|
|
92
|
+
r('label', classNames(CSS.Field, CSS.GlobalDelayField),
|
|
92
93
|
r('span', null, t`Delay (ms)`),
|
|
93
94
|
r('input', {
|
|
94
95
|
type: 'number',
|
|
@@ -117,7 +118,7 @@ function GlobalDelayJitterField() {
|
|
|
117
118
|
onWheel.timer = setTimeout(onChange.bind(this), 300)
|
|
118
119
|
}
|
|
119
120
|
return (
|
|
120
|
-
r('label',
|
|
121
|
+
r('label', classNames(CSS.Field, CSS.GlobalDelayJitterField),
|
|
121
122
|
r('span', null, t`Max Jitter %`),
|
|
122
123
|
r('input', {
|
|
123
124
|
type: 'number',
|
|
@@ -137,7 +138,7 @@ function CookieSelector() {
|
|
|
137
138
|
const disabled = cookies.length <= 1
|
|
138
139
|
const list = cookies.length ? cookies : [[t`None`, true]]
|
|
139
140
|
return (
|
|
140
|
-
r('label',
|
|
141
|
+
r('label', classNames(CSS.Field, CSS.CookieSelector),
|
|
141
142
|
r('span', null, t`Cookie`),
|
|
142
143
|
r('select', {
|
|
143
144
|
autocomplete: 'off',
|
|
@@ -161,7 +162,7 @@ function ProxyFallbackField() {
|
|
|
161
162
|
store.setProxyFallback(this.value.trim())
|
|
162
163
|
}
|
|
163
164
|
return (
|
|
164
|
-
r('div',
|
|
165
|
+
r('div', classNames(CSS.Field, CSS.FallbackBackend),
|
|
165
166
|
r('label', null,
|
|
166
167
|
r('span', null, t`Fallback`),
|
|
167
168
|
r('input', {
|
|
@@ -176,7 +177,7 @@ function ProxyFallbackField() {
|
|
|
176
177
|
|
|
177
178
|
function SaveProxiedCheckbox(ref) {
|
|
178
179
|
return (
|
|
179
|
-
r('label',
|
|
180
|
+
r('label', classNames(CSS.SaveProxiedCheckbox),
|
|
180
181
|
r('input', {
|
|
181
182
|
ref,
|
|
182
183
|
type: 'checkbox',
|
|
@@ -184,7 +185,7 @@ function SaveProxiedCheckbox(ref) {
|
|
|
184
185
|
checked: store.collectProxied,
|
|
185
186
|
onChange() { store.setCollectProxied(this.checked) }
|
|
186
187
|
}),
|
|
187
|
-
r('span',
|
|
188
|
+
r('span', classNames(CSS.checkboxBody), t`Save Mocks`)))
|
|
188
189
|
}
|
|
189
190
|
|
|
190
191
|
|
|
@@ -221,7 +222,7 @@ function BulkSelector() {
|
|
|
221
222
|
}
|
|
222
223
|
const disabled = !comments.length
|
|
223
224
|
return (
|
|
224
|
-
r('label',
|
|
225
|
+
r('label', classNames(CSS.BulkSelector),
|
|
225
226
|
r('span', null, t`Bulk Select`),
|
|
226
227
|
r('select', {
|
|
227
228
|
autocomplete: 'off',
|
|
@@ -240,13 +241,13 @@ function BulkSelector() {
|
|
|
240
241
|
|
|
241
242
|
function GroupByMethod() {
|
|
242
243
|
return (
|
|
243
|
-
r('label',
|
|
244
|
+
r('label', classNames(CSS.GroupByMethod),
|
|
244
245
|
r('input', {
|
|
245
246
|
type: 'checkbox',
|
|
246
247
|
checked: store.groupByMethod,
|
|
247
248
|
onChange: store.toggleGroupByMethod
|
|
248
249
|
}),
|
|
249
|
-
r('span',
|
|
250
|
+
r('span', classNames(CSS.checkboxBody), t`Group by Method`)))
|
|
250
251
|
}
|
|
251
252
|
|
|
252
253
|
|
|
@@ -257,10 +258,10 @@ function MockList() {
|
|
|
257
258
|
return r('div', null, t`No mocks found`)
|
|
258
259
|
|
|
259
260
|
if (store.groupByMethod)
|
|
260
|
-
return Object.keys(store.brokersByMethod).map(method =>
|
|
261
|
-
|
|
262
|
-
method),
|
|
263
|
-
|
|
261
|
+
return Object.keys(store.brokersByMethod).map(method =>
|
|
262
|
+
Fragment(
|
|
263
|
+
r('div', classNames(CSS.TableHeading, store.canProxy && CSS.canProxy), method),
|
|
264
|
+
store.brokersAsRowsByMethod(method).map(Row)))
|
|
264
265
|
|
|
265
266
|
return store.brokersAsRowsByMethod('*').map(Row)
|
|
266
267
|
}
|
|
@@ -274,27 +275,29 @@ function Row(row, i) {
|
|
|
274
275
|
return (
|
|
275
276
|
r('div', {
|
|
276
277
|
key: row.key,
|
|
277
|
-
...
|
|
278
|
-
|
|
278
|
+
...classNames(CSS.TableRow,
|
|
279
|
+
mounted && row.isNew && CSS.animIn)
|
|
279
280
|
},
|
|
280
281
|
store.canProxy && ProxyToggler(method, urlMask, row.proxied),
|
|
281
282
|
|
|
282
283
|
DelayToggler({
|
|
283
284
|
checked: row.delayed,
|
|
284
|
-
commit(checked) {
|
|
285
|
+
commit(checked) {
|
|
286
|
+
store.setDelayed(method, urlMask, checked)
|
|
287
|
+
},
|
|
285
288
|
}),
|
|
286
289
|
|
|
287
290
|
StatusCodeToggler({
|
|
288
291
|
title: t`Internal Server Error`,
|
|
289
|
-
|
|
292
|
+
body: t`500`,
|
|
290
293
|
disabled: row.opts.length === 1 && row.status === 500,
|
|
291
294
|
checked: !row.proxied && row.status === 500,
|
|
292
|
-
|
|
295
|
+
commit() {
|
|
293
296
|
store.toggle500(method, urlMask)
|
|
294
297
|
}
|
|
295
298
|
}),
|
|
296
299
|
|
|
297
|
-
!store.groupByMethod && r('span',
|
|
300
|
+
!store.groupByMethod && r('span', classNames(CSS.Method), method),
|
|
298
301
|
|
|
299
302
|
PreviewLink(method, urlMask, row.urlMaskDittoed, i === 0),
|
|
300
303
|
|
|
@@ -302,38 +305,58 @@ function Row(row, i) {
|
|
|
302
305
|
}
|
|
303
306
|
|
|
304
307
|
function renderRow(method, urlMask) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
308
|
+
const row = store.brokerAsRow(method, urlMask)
|
|
309
|
+
const tr = leftSideRef.elem.querySelector(`.${CSS.TableRow}[key="${row.key}"]`)
|
|
310
|
+
mergeTableRow(tr, Row(row))
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function mergeTableRow(oldRow, newRow) {
|
|
314
|
+
for (let i = 0; i < newRow.children.length; i++) {
|
|
315
|
+
const oldEl = oldRow.children[i]
|
|
316
|
+
const newEl = newRow.children[i]
|
|
317
|
+
switch (newEl.tagName) {
|
|
318
|
+
case 'LABEL': {
|
|
319
|
+
const oldInput = oldEl.querySelector('[type="checkbox"]')
|
|
320
|
+
const newInput = newEl.querySelector('[type="checkbox"]')
|
|
321
|
+
oldInput.checked = newInput.checked
|
|
322
|
+
oldInput.disabled = newInput.disabled
|
|
323
|
+
break
|
|
324
|
+
}
|
|
325
|
+
case 'A':
|
|
326
|
+
oldEl.className = newEl.className
|
|
327
|
+
break
|
|
328
|
+
case 'SELECT':
|
|
329
|
+
oldEl.disabled = newEl.disabled
|
|
330
|
+
oldEl.replaceChildren(...newEl.cloneNode(true).children)
|
|
331
|
+
break
|
|
332
|
+
}
|
|
318
333
|
}
|
|
319
334
|
}
|
|
320
335
|
|
|
321
336
|
|
|
337
|
+
|
|
322
338
|
function PreviewLink(method, urlMask, urlMaskDittoed, autofocus) {
|
|
323
339
|
function onClick(event) {
|
|
340
|
+
unChooseOld()
|
|
324
341
|
event.preventDefault()
|
|
325
342
|
store.previewLink(method, urlMask)
|
|
343
|
+
previewMock()
|
|
326
344
|
}
|
|
345
|
+
function unChooseOld() {
|
|
346
|
+
return leftSideRef.elem.querySelector(`a.${CSS.chosen}`)
|
|
347
|
+
?.classList.remove(CSS.chosen)
|
|
348
|
+
}
|
|
349
|
+
|
|
327
350
|
const isChosen = store.chosenLink.method === method && store.chosenLink.urlMask === urlMask
|
|
328
351
|
const [ditto, tail] = urlMaskDittoed
|
|
329
352
|
return (
|
|
330
353
|
r('a', {
|
|
331
|
-
...
|
|
354
|
+
...classNames(CSS.PreviewLink, isChosen && CSS.chosen),
|
|
332
355
|
href: urlMask,
|
|
333
356
|
autofocus,
|
|
334
357
|
onClick
|
|
335
358
|
}, ditto
|
|
336
|
-
? [r('span',
|
|
359
|
+
? [r('span', classNames(CSS.dittoDir), ditto), tail]
|
|
337
360
|
: tail))
|
|
338
361
|
}
|
|
339
362
|
|
|
@@ -353,7 +376,7 @@ function MockSelector(row) {
|
|
|
353
376
|
},
|
|
354
377
|
'aria-label': t`Mock Selector`,
|
|
355
378
|
disabled: row.opts.length < 2,
|
|
356
|
-
...
|
|
379
|
+
...classNames(
|
|
357
380
|
CSS.MockSelector,
|
|
358
381
|
row.selectedIdx > 0 && CSS.nonDefault,
|
|
359
382
|
row.selectedFileIs4xx && CSS.status4xx)
|
|
@@ -363,17 +386,15 @@ function MockSelector(row) {
|
|
|
363
386
|
|
|
364
387
|
|
|
365
388
|
function ProxyToggler(method, urlMask, checked) {
|
|
366
|
-
return (
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
}),
|
|
376
|
-
CloudIcon()))
|
|
389
|
+
return ClickDragToggler({
|
|
390
|
+
className: CSS.ProxyToggler,
|
|
391
|
+
title: t`Proxy Toggler`,
|
|
392
|
+
checked,
|
|
393
|
+
commit(checked) {
|
|
394
|
+
store.setProxied(method, urlMask, checked)
|
|
395
|
+
},
|
|
396
|
+
body: CloudIcon()
|
|
397
|
+
})
|
|
377
398
|
}
|
|
378
399
|
|
|
379
400
|
|
|
@@ -386,7 +407,7 @@ function StaticFilesList() {
|
|
|
386
407
|
? null
|
|
387
408
|
: Fragment(
|
|
388
409
|
r('div',
|
|
389
|
-
|
|
410
|
+
classNames(CSS.TableHeading,
|
|
390
411
|
store.canProxy && CSS.canProxy,
|
|
391
412
|
!store.groupByMethod && CSS.nonGroupedByMethod),
|
|
392
413
|
store.groupByMethod
|
|
@@ -402,8 +423,8 @@ function StaticRow(row) {
|
|
|
402
423
|
return (
|
|
403
424
|
r('div', {
|
|
404
425
|
key: row.key,
|
|
405
|
-
...
|
|
406
|
-
|
|
426
|
+
...classNames(CSS.TableRow,
|
|
427
|
+
mounted && row.isNew && CSS.animIn)
|
|
407
428
|
},
|
|
408
429
|
|
|
409
430
|
DelayToggler({
|
|
@@ -416,42 +437,48 @@ function StaticRow(row) {
|
|
|
416
437
|
|
|
417
438
|
StatusCodeToggler({
|
|
418
439
|
title: t`Not Found`,
|
|
419
|
-
|
|
440
|
+
body: t`404`,
|
|
420
441
|
checked: row.status === 404,
|
|
421
|
-
|
|
422
|
-
store.setStaticRouteStatus(row.urlMask,
|
|
442
|
+
commit(checked) {
|
|
443
|
+
store.setStaticRouteStatus(row.urlMask, checked
|
|
423
444
|
? 404
|
|
424
445
|
: 200)
|
|
425
446
|
}
|
|
426
447
|
}),
|
|
427
448
|
|
|
428
|
-
!groupByMethod && r('span',
|
|
449
|
+
!groupByMethod && r('span', classNames(CSS.Method), 'GET'),
|
|
429
450
|
|
|
430
451
|
r('a', {
|
|
431
452
|
href: row.urlMask,
|
|
432
453
|
target: '_blank',
|
|
433
454
|
className: CSS.PreviewLink,
|
|
434
455
|
}, ditto
|
|
435
|
-
? [r('span',
|
|
456
|
+
? [r('span', classNames(CSS.dittoDir), ditto), tail]
|
|
436
457
|
: tail)))
|
|
437
458
|
}
|
|
438
459
|
|
|
439
|
-
function StatusCodeToggler({ title,
|
|
440
|
-
return (
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
onChange
|
|
449
|
-
}),
|
|
450
|
-
r('span', className(CSS.checkboxBody), label)))
|
|
460
|
+
function StatusCodeToggler({ title, body, commit, checked, disabled }) {
|
|
461
|
+
return ClickDragToggler({
|
|
462
|
+
title,
|
|
463
|
+
disabled,
|
|
464
|
+
className: CSS.StatusCodeToggler,
|
|
465
|
+
commit,
|
|
466
|
+
checked,
|
|
467
|
+
body
|
|
468
|
+
})
|
|
451
469
|
}
|
|
452
470
|
|
|
453
|
-
|
|
454
471
|
function DelayToggler({ checked, commit, optClassName }) {
|
|
472
|
+
return ClickDragToggler({
|
|
473
|
+
checked,
|
|
474
|
+
commit,
|
|
475
|
+
...classNames(CSS.DelayToggler, optClassName),
|
|
476
|
+
title: t`Delay`,
|
|
477
|
+
body: TimerIcon()
|
|
478
|
+
})
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
function ClickDragToggler({ checked, commit, className, title, body }) {
|
|
455
482
|
function onPointerEnter(event) {
|
|
456
483
|
if (event.buttons === 1)
|
|
457
484
|
onPointerDown.call(this)
|
|
@@ -469,10 +496,7 @@ function DelayToggler({ checked, commit, optClassName }) {
|
|
|
469
496
|
commit(this.checked)
|
|
470
497
|
}
|
|
471
498
|
return (
|
|
472
|
-
r('label', {
|
|
473
|
-
...className(CSS.DelayToggler, optClassName),
|
|
474
|
-
title: t`Delay`
|
|
475
|
-
},
|
|
499
|
+
r('label', { ...classNames(CSS.Toggler, className), title },
|
|
476
500
|
r('input', {
|
|
477
501
|
type: 'checkbox',
|
|
478
502
|
checked,
|
|
@@ -481,7 +505,7 @@ function DelayToggler({ checked, commit, optClassName }) {
|
|
|
481
505
|
onClick,
|
|
482
506
|
onChange
|
|
483
507
|
}),
|
|
484
|
-
|
|
508
|
+
r('span', classNames(CSS.checkboxBody), body)))
|
|
485
509
|
}
|
|
486
510
|
|
|
487
511
|
function Resizer(ref) {
|
|
@@ -536,7 +560,7 @@ const payloadViewerCodeRef = {}
|
|
|
536
560
|
|
|
537
561
|
function PayloadViewer() {
|
|
538
562
|
return (
|
|
539
|
-
r('div',
|
|
563
|
+
r('div', classNames(CSS.PayloadViewer),
|
|
540
564
|
RightToolbar(),
|
|
541
565
|
r('pre', null,
|
|
542
566
|
r('code', { ref: payloadViewerCodeRef },
|
|
@@ -545,7 +569,7 @@ function PayloadViewer() {
|
|
|
545
569
|
|
|
546
570
|
function RightToolbar() {
|
|
547
571
|
return (
|
|
548
|
-
r('div',
|
|
572
|
+
r('div', classNames(CSS.SubToolbar),
|
|
549
573
|
r('h2', { ref: payloadViewerTitleRef },
|
|
550
574
|
!store.hasChosenLink && t`Preview`)))
|
|
551
575
|
}
|
|
@@ -576,7 +600,7 @@ function PayloadViewerTitleWhenProxied(response) {
|
|
|
576
600
|
const SPINNER_DELAY = 80
|
|
577
601
|
function PayloadViewerProgressBar() {
|
|
578
602
|
return (
|
|
579
|
-
r('div',
|
|
603
|
+
r('div', classNames(CSS.ProgressBar),
|
|
580
604
|
r('div', {
|
|
581
605
|
style: {
|
|
582
606
|
animationDuration: store.delay - SPINNER_DELAY + 'ms'
|
|
@@ -716,7 +740,7 @@ function HelpIcon() {
|
|
|
716
740
|
* The version increments when a mock file is added, removed, or renamed.
|
|
717
741
|
*/
|
|
718
742
|
function initRealTimeUpdates() {
|
|
719
|
-
let oldVersion =
|
|
743
|
+
let oldVersion = -1
|
|
720
744
|
let controller = new AbortController()
|
|
721
745
|
|
|
722
746
|
longPoll()
|
|
@@ -732,21 +756,18 @@ function initRealTimeUpdates() {
|
|
|
732
756
|
async function longPoll() {
|
|
733
757
|
try {
|
|
734
758
|
const response = await store.getSyncVersion(oldVersion, controller.signal)
|
|
735
|
-
if (response.ok)
|
|
736
|
-
if (ErrorToast.isOffline)
|
|
737
|
-
ErrorToast.close()
|
|
738
|
-
|
|
739
|
-
const version = await response.json()
|
|
740
|
-
const shouldSkip = oldVersion === undefined
|
|
741
|
-
if (oldVersion !== version) { // because it could be < or >
|
|
742
|
-
oldVersion = version
|
|
743
|
-
if (!shouldSkip)
|
|
744
|
-
store.fetchState()
|
|
745
|
-
}
|
|
746
|
-
longPoll()
|
|
747
|
-
}
|
|
748
|
-
else
|
|
759
|
+
if (!response.ok)
|
|
749
760
|
throw response.status
|
|
761
|
+
|
|
762
|
+
if (ErrorToast.isOffline)
|
|
763
|
+
ErrorToast.close()
|
|
764
|
+
|
|
765
|
+
const version = await response.json()
|
|
766
|
+
if (oldVersion !== version) { // because it could be < or >
|
|
767
|
+
oldVersion = version
|
|
768
|
+
store.fetchState()
|
|
769
|
+
}
|
|
770
|
+
longPoll()
|
|
750
771
|
}
|
|
751
772
|
catch (error) {
|
|
752
773
|
if (error !== '_hidden_tab_')
|
package/src/client/dom-utils.js
CHANGED
package/src/client/styles.css
CHANGED
|
@@ -400,7 +400,7 @@ main {
|
|
|
400
400
|
padding-bottom: 4px;
|
|
401
401
|
padding-left: 1px;
|
|
402
402
|
border-top: 24px solid transparent;
|
|
403
|
-
margin-left:
|
|
403
|
+
margin-left: 71px;
|
|
404
404
|
font-weight: bold;
|
|
405
405
|
text-align: left;
|
|
406
406
|
|
|
@@ -409,7 +409,7 @@ main {
|
|
|
409
409
|
}
|
|
410
410
|
|
|
411
411
|
&.canProxy {
|
|
412
|
-
margin-left:
|
|
412
|
+
margin-left: 100px;
|
|
413
413
|
}
|
|
414
414
|
&.nonGroupedByMethod {
|
|
415
415
|
margin-left: 122px;
|
|
@@ -505,11 +505,11 @@ main {
|
|
|
505
505
|
}
|
|
506
506
|
}
|
|
507
507
|
|
|
508
|
-
|
|
509
|
-
.
|
|
508
|
+
|
|
509
|
+
.Toggler {
|
|
510
510
|
display: flex;
|
|
511
511
|
|
|
512
|
-
|
|
512
|
+
input {
|
|
513
513
|
/* For click drag target */
|
|
514
514
|
position: absolute;
|
|
515
515
|
width: 22px;
|
|
@@ -518,136 +518,85 @@ main {
|
|
|
518
518
|
|
|
519
519
|
&:focus-visible {
|
|
520
520
|
outline: 0;
|
|
521
|
-
& +
|
|
521
|
+
& + .checkboxBody {
|
|
522
522
|
outline: 2px solid var(--colorAccent)
|
|
523
523
|
}
|
|
524
524
|
}
|
|
525
|
-
}
|
|
526
525
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
}
|
|
526
|
+
&:disabled + .checkboxBody {
|
|
527
|
+
cursor: not-allowed;
|
|
528
|
+
opacity: 0.7;
|
|
529
|
+
}
|
|
532
530
|
|
|
533
|
-
.
|
|
534
|
-
> input {
|
|
535
|
-
&:checked + svg {
|
|
531
|
+
&:checked + .checkboxBody {
|
|
536
532
|
border-color: var(--colorAccent);
|
|
537
533
|
fill: var(--colorAccent);
|
|
538
534
|
background: var(--colorAccent);
|
|
539
535
|
stroke: var(--colorBackground);
|
|
540
536
|
}
|
|
541
537
|
|
|
542
|
-
&:enabled:hover:not(:checked) +
|
|
538
|
+
&:enabled:hover:not(:checked) + .checkboxBody {
|
|
543
539
|
border-color: var(--colorHover);
|
|
544
540
|
background: var(--colorHover);
|
|
545
541
|
stroke: var(--colorText);
|
|
546
542
|
}
|
|
547
543
|
}
|
|
548
544
|
|
|
549
|
-
|
|
545
|
+
.checkboxBody {
|
|
546
|
+
display: flex;
|
|
550
547
|
width: 22px;
|
|
551
548
|
height: 22px;
|
|
549
|
+
align-items: center;
|
|
550
|
+
justify-content: center;
|
|
552
551
|
border: 1px solid var(--colorSecondaryActionBorder);
|
|
552
|
+
fill: none;
|
|
553
|
+
stroke: var(--colorSecondaryAction);
|
|
553
554
|
stroke-width: 2.5px;
|
|
554
555
|
border-radius: 50%;
|
|
555
556
|
}
|
|
556
557
|
|
|
557
558
|
&.canProxy {
|
|
558
|
-
margin-left:
|
|
559
|
+
margin-left: 30px;
|
|
559
560
|
}
|
|
560
561
|
}
|
|
561
562
|
|
|
563
|
+
.DelayToggler {
|
|
564
|
+
}
|
|
565
|
+
|
|
562
566
|
.ProxyToggler {
|
|
563
|
-
border: 1px solid var(--colorSecondaryActionBorder);
|
|
564
567
|
margin-right: 8px;
|
|
565
|
-
border-radius: var(--radius);
|
|
566
|
-
|
|
567
|
-
&:has(input:checked),
|
|
568
|
-
&:has(input:disabled) {
|
|
569
|
-
background: transparent;
|
|
570
|
-
box-shadow: none;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
> input {
|
|
574
|
-
&:checked + svg {
|
|
575
|
-
fill: var(--colorAccent);
|
|
576
|
-
stroke: var(--colorAccent);
|
|
577
|
-
|
|
578
|
-
path:last-of-type { /* inner cloud curve */
|
|
579
|
-
stroke: var(--colorBackground);
|
|
580
|
-
}
|
|
581
|
-
transform: scale(1.1);
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
&:enabled:hover:not(:checked) + svg {
|
|
585
|
-
fill: var(--colorHover);
|
|
586
|
-
stroke: var(--colorText);
|
|
587
|
-
}
|
|
588
568
|
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
box-shadow: none;
|
|
593
|
-
fill: transparent;
|
|
594
|
-
|
|
595
|
-
path:last-of-type {
|
|
596
|
-
stroke-opacity: 0;
|
|
597
|
-
stroke: transparent;
|
|
598
|
-
}
|
|
569
|
+
.checkboxBody {
|
|
570
|
+
svg {
|
|
571
|
+
width: 16px;
|
|
599
572
|
}
|
|
600
573
|
}
|
|
601
|
-
|
|
602
|
-
> svg {
|
|
603
|
-
width: 26px;
|
|
604
|
-
padding: 1px 4px;
|
|
605
|
-
stroke-width: 2px;
|
|
606
|
-
border-radius: var(--radius);
|
|
607
|
-
}
|
|
608
574
|
}
|
|
609
575
|
|
|
610
576
|
.StatusCodeToggler {
|
|
611
|
-
display: flex;
|
|
612
577
|
margin-right: 10px;
|
|
613
578
|
margin-left: 8px;
|
|
614
|
-
cursor: pointer;
|
|
615
|
-
|
|
616
|
-
> input {
|
|
617
|
-
appearance: none;
|
|
618
579
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
& + .checkboxBody {
|
|
622
|
-
outline: 2px solid var(--colorAccent)
|
|
623
|
-
}
|
|
624
|
-
}
|
|
580
|
+
input {
|
|
581
|
+
width: 26px;
|
|
625
582
|
|
|
626
|
-
&:
|
|
627
|
-
|
|
628
|
-
|
|
583
|
+
&:not(:checked):enabled:hover + .checkboxBody {
|
|
584
|
+
border-color: var(--colorRed);
|
|
585
|
+
color: var(--colorRed);
|
|
629
586
|
}
|
|
630
587
|
&:checked + .checkboxBody {
|
|
631
588
|
border-color: var(--colorRed);
|
|
632
589
|
color: white;
|
|
633
590
|
background: var(--colorRed);
|
|
634
591
|
}
|
|
635
|
-
&:not(:checked):enabled:hover + .checkboxBody {
|
|
636
|
-
border-color: var(--colorRed);
|
|
637
|
-
color: var(--colorRed);
|
|
638
|
-
}
|
|
639
|
-
&:enabled:active + .checkboxBody {
|
|
640
|
-
cursor: grabbing;
|
|
641
|
-
}
|
|
642
592
|
}
|
|
643
593
|
|
|
644
|
-
|
|
594
|
+
.checkboxBody {
|
|
595
|
+
width: 27px;
|
|
645
596
|
padding: 4px;
|
|
646
|
-
border: 1px solid var(--colorSecondaryActionBorder);
|
|
647
597
|
font-size: 10px;
|
|
648
598
|
font-weight: bold;
|
|
649
599
|
color: var(--colorSecondaryAction);
|
|
650
|
-
border-radius: var(--radius);
|
|
651
600
|
}
|
|
652
601
|
}
|
|
653
602
|
|