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 CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "mockaton",
3
3
  "description": "HTTP Mock Server",
4
4
  "type": "module",
5
- "version": "12.2.3",
5
+ "version": "12.3.0",
6
6
  "exports": {
7
7
  ".": {
8
8
  "import": "./index.js",
@@ -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
- className, restoreFocus, Fragment, adoptCSS
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
- render.count++
27
- restoreFocus(() => document.body.replaceChildren(...App()))
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', className(CSS.SubToolbar),
46
+ r('div', classNames(CSS.SubToolbar),
46
47
  GroupByMethod(),
47
48
  BulkSelector()),
48
- r('div', className(CSS.Table),
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', className(CSS.GlobalDelayWrap),
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', className(CSS.Field, CSS.GlobalDelayField),
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', className(CSS.Field, CSS.GlobalDelayJitterField),
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', className(CSS.Field, CSS.CookieSelector),
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', className(CSS.Field, CSS.FallbackBackend),
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', className(CSS.SaveProxiedCheckbox),
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', className(CSS.checkboxBody), t`Save Mocks`)))
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', className(CSS.BulkSelector),
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', className(CSS.GroupByMethod),
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', className(CSS.checkboxBody), t`Group by Method`)))
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 => Fragment(
261
- r('div', className(CSS.TableHeading, store.canProxy && CSS.canProxy),
262
- method),
263
- store.brokersAsRowsByMethod(method).map(Row)))
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
- ...className(CSS.TableRow,
278
- render.count > 1 && row.isNew && CSS.animIn)
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) { store.setDelayed(method, urlMask, 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
- label: t`500`,
292
+ body: t`500`,
290
293
  disabled: row.opts.length === 1 && row.status === 500,
291
294
  checked: !row.proxied && row.status === 500,
292
- onChange() {
295
+ commit() {
293
296
  store.toggle500(method, urlMask)
294
297
  }
295
298
  }),
296
299
 
297
- !store.groupByMethod && r('span', className(CSS.Method), method),
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
- restoreFocus(() => {
306
- unChooseOld()
307
- const row = store.brokerAsRow(method, urlMask)
308
- trFor(row.key).replaceWith(Row(row))
309
- previewMock()
310
- })
311
-
312
- function trFor(key) {
313
- return leftSideRef.elem.querySelector(`.${CSS.TableRow}[key="${key}"]`)
314
- }
315
- function unChooseOld() {
316
- return leftSideRef.elem.querySelector(`a.${CSS.chosen}`)
317
- ?.classList.remove(CSS.chosen)
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
- ...className(CSS.PreviewLink, isChosen && CSS.chosen),
354
+ ...classNames(CSS.PreviewLink, isChosen && CSS.chosen),
332
355
  href: urlMask,
333
356
  autofocus,
334
357
  onClick
335
358
  }, ditto
336
- ? [r('span', className(CSS.dittoDir), ditto), tail]
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
- ...className(
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
- r('label', {
368
- className: CSS.ProxyToggler,
369
- title: t`Proxy Toggler`
370
- },
371
- r('input', {
372
- type: 'checkbox',
373
- checked,
374
- onChange() { store.setProxied(method, urlMask, this.checked) },
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
- className(CSS.TableHeading,
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
- ...className(CSS.TableRow,
406
- render.count > 1 && row.isNew && CSS.animIn)
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
- label: t`404`,
440
+ body: t`404`,
420
441
  checked: row.status === 404,
421
- onChange() {
422
- store.setStaticRouteStatus(row.urlMask, this.checked
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', className(CSS.Method), 'GET'),
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', className(CSS.dittoDir), ditto), tail]
456
+ ? [r('span', classNames(CSS.dittoDir), ditto), tail]
436
457
  : tail)))
437
458
  }
438
459
 
439
- function StatusCodeToggler({ title, label, onChange, checked }) {
440
- return (
441
- r('label', {
442
- title,
443
- className: CSS.StatusCodeToggler
444
- },
445
- r('input', {
446
- type: 'checkbox',
447
- checked,
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
- TimerIcon()))
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', className(CSS.PayloadViewer),
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', className(CSS.SubToolbar),
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', className(CSS.ProgressBar),
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 = undefined // undefined so it waits until next event or timeout
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_')
@@ -1,4 +1,4 @@
1
- export function className(...args) {
1
+ export function classNames(...args) {
2
2
  return {
3
3
  className: args.filter(Boolean).join(' ')
4
4
  }
@@ -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: 74px;
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: 110px;
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
- .DelayToggler,
509
- .ProxyToggler {
508
+
509
+ .Toggler {
510
510
  display: flex;
511
511
 
512
- > input {
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
- & + svg {
521
+ & + .checkboxBody {
522
522
  outline: 2px solid var(--colorAccent)
523
523
  }
524
524
  }
525
- }
526
525
 
527
- > svg {
528
- fill: none;
529
- stroke: var(--colorSecondaryAction);
530
- }
531
- }
526
+ &:disabled + .checkboxBody {
527
+ cursor: not-allowed;
528
+ opacity: 0.7;
529
+ }
532
530
 
533
- .DelayToggler {
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) + svg {
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
- > svg {
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: 36px;
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
- &:disabled + svg {
590
- stroke-opacity: 0.4;
591
- cursor: not-allowed;
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
- &:focus-visible {
620
- outline: 0;
621
- & + .checkboxBody {
622
- outline: 2px solid var(--colorAccent)
623
- }
624
- }
580
+ input {
581
+ width: 26px;
625
582
 
626
- &:disabled + .checkboxBody {
627
- cursor: not-allowed;
628
- opacity: 0.7;
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
- > .checkboxBody {
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