@ai.weget.jp/bot 0.1.8 → 0.1.10

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 (34) hide show
  1. package/README.md +41 -16
  2. package/dist/src/config/systemConfig.js +1 -0
  3. package/dist/src/gmoCoinRuntime.js +1 -0
  4. package/dist/src/gmoFxRuntime.js +1 -0
  5. package/dist/src/index.js +1 -0
  6. package/dist/src/ipc/registerHandlers.js +1 -1
  7. package/dist/src/main.js +1 -1
  8. package/dist/src/platformApi.js +1 -0
  9. package/dist/src/preload.cjs +37 -8
  10. package/dist/src/renderer/app.js +1 -1
  11. package/dist/src/renderer/index.html +415 -20
  12. package/dist/src/renderer/styles.css +775 -3
  13. package/dist/src/services/authApiService.js +1 -1
  14. package/dist/src/services/codexService.js +1 -0
  15. package/dist/src/services/windowManagerService.js +1 -1
  16. package/dist/src/skillHostState.js +1 -0
  17. package/dist/src/skills.js +1 -0
  18. package/dist/src/wsClient.js +1 -1
  19. package/package.json +6 -19
  20. package/scripts/build-ts.cjs +8 -2
  21. package/dist/src/renderer/chat.css +0 -128
  22. package/dist/src/renderer/chat.html +0 -27
  23. package/dist/src/renderer/chat.js +0 -1
  24. package/dist/src/services/aiMemoryService.js +0 -1
  25. package/dist/src/services/commandOrchestratorService.js +0 -1
  26. package/dist/src/services/debugLogService.js +0 -1
  27. package/dist/src/services/taskExecutorService.js +0 -1
  28. package/dist/src/services/taskParsingService.js +0 -1
  29. package/dist/src/services/textService.js +0 -1
  30. package/dist/src/services/workflowService.js +0 -1
  31. package/scripts/backtest-loop.cjs +0 -137
  32. package/scripts/prepare-playwright-browsers.cjs +0 -181
  33. package/scripts/run-workflow.cjs +0 -381
  34. package/scripts/workflows/kaitori-login.json +0 -17
@@ -11,6 +11,31 @@ body {
11
11
  padding: 0 12px 16px;
12
12
  }
13
13
 
14
+ .user-notice {
15
+ position: fixed;
16
+ top: 14px;
17
+ left: 50%;
18
+ transform: translateX(-50%);
19
+ z-index: 1200;
20
+ width: min(560px, calc(100vw - 24px));
21
+ border-radius: 10px;
22
+ padding: 10px 12px;
23
+ font-size: 14px;
24
+ box-shadow: 0 10px 22px rgba(20, 25, 45, 0.18);
25
+ }
26
+
27
+ .user-notice.notice-error {
28
+ background: #fee2e2;
29
+ color: #7f1d1d;
30
+ border: 1px solid #fecaca;
31
+ }
32
+
33
+ .user-notice.notice-success {
34
+ background: #dcfce7;
35
+ color: #14532d;
36
+ border: 1px solid #bbf7d0;
37
+ }
38
+
14
39
  .login-screen {
15
40
  min-height: 100vh;
16
41
  display: grid;
@@ -85,6 +110,44 @@ body {
85
110
  color: #5e6b81;
86
111
  }
87
112
 
113
+ .codex-auth-box {
114
+ margin-top: 14px;
115
+ padding: 12px;
116
+ border: 1px solid #d9e2ef;
117
+ border-radius: 10px;
118
+ background: #f7faff;
119
+ }
120
+
121
+ .codex-auth-head {
122
+ display: flex;
123
+ justify-content: space-between;
124
+ gap: 12px;
125
+ align-items: center;
126
+ margin-bottom: 10px;
127
+ }
128
+
129
+ .codex-auth-head h3 {
130
+ margin: 0;
131
+ }
132
+
133
+ .codex-auth-actions {
134
+ display: flex;
135
+ gap: 8px;
136
+ flex-wrap: wrap;
137
+ margin-bottom: 10px;
138
+ }
139
+
140
+ .codex-command {
141
+ display: block;
142
+ padding: 10px 12px;
143
+ border-radius: 8px;
144
+ background: #0f172a;
145
+ color: #e2e8f0;
146
+ font-family: Consolas, "Courier New", monospace;
147
+ font-size: 13px;
148
+ overflow-x: auto;
149
+ }
150
+
88
151
  .status-pill {
89
152
  display: inline-block;
90
153
  border-radius: 999px;
@@ -107,10 +170,29 @@ body {
107
170
  color: #92400e;
108
171
  }
109
172
 
173
+ .tabs-shell {
174
+ display: grid;
175
+ gap: 10px;
176
+ margin-bottom: 12px;
177
+ }
178
+
179
+ .tab-group {
180
+ display: grid;
181
+ gap: 6px;
182
+ }
183
+
184
+ .tab-group-label {
185
+ color: #60708a;
186
+ font-size: 12px;
187
+ font-weight: 700;
188
+ letter-spacing: 0.04em;
189
+ text-transform: uppercase;
190
+ }
191
+
110
192
  .tabs {
111
193
  display: flex;
112
194
  gap: 8px;
113
- margin-bottom: 12px;
195
+ flex-wrap: wrap;
114
196
  }
115
197
 
116
198
  .tab-btn {
@@ -144,6 +226,408 @@ body {
144
226
  box-shadow: 0 8px 20px rgba(20, 25, 45, 0.08);
145
227
  }
146
228
 
229
+ .panel-title-block {
230
+ display: grid;
231
+ gap: 4px;
232
+ margin-bottom: 12px;
233
+ }
234
+
235
+ .panel-title-block h2,
236
+ .host-section h3 {
237
+ margin: 0;
238
+ }
239
+
240
+ .panel-title-block p {
241
+ margin: 0;
242
+ }
243
+
244
+ .host-section {
245
+ display: grid;
246
+ gap: 10px;
247
+ padding: 14px;
248
+ margin-top: 14px;
249
+ border: 1px solid #dbe4f1;
250
+ border-radius: 12px;
251
+ background: #fbfdff;
252
+ }
253
+
254
+ .host-section-head {
255
+ display: flex;
256
+ justify-content: space-between;
257
+ align-items: baseline;
258
+ gap: 12px;
259
+ flex-wrap: wrap;
260
+ }
261
+
262
+ .market-shell {
263
+ background: #eef2f6;
264
+ }
265
+
266
+ .skill-surface-head {
267
+ display: flex;
268
+ justify-content: space-between;
269
+ align-items: flex-start;
270
+ gap: 16px;
271
+ margin-bottom: 12px;
272
+ }
273
+
274
+ .skill-surface-kicker {
275
+ color: #60708a;
276
+ font-size: 12px;
277
+ font-weight: 700;
278
+ letter-spacing: 0.04em;
279
+ text-transform: uppercase;
280
+ margin-bottom: 4px;
281
+ }
282
+
283
+ .skill-surface-package {
284
+ color: #49617f;
285
+ font-family: Consolas, "Courier New", monospace;
286
+ font-size: 13px;
287
+ }
288
+
289
+ .skill-surface-statuses {
290
+ display: flex;
291
+ gap: 8px;
292
+ flex-wrap: wrap;
293
+ justify-content: flex-end;
294
+ }
295
+
296
+ .skill-surface-badge {
297
+ border-radius: 999px;
298
+ padding: 5px 10px;
299
+ font-size: 12px;
300
+ font-weight: 700;
301
+ background: #dcfce7;
302
+ color: #166534;
303
+ }
304
+
305
+ .skill-surface-badge.is-disabled {
306
+ background: #fee2e2;
307
+ color: #991b1b;
308
+ }
309
+
310
+ .skill-surface-badge.is-muted {
311
+ background: #e8eef8;
312
+ color: #294267;
313
+ }
314
+
315
+ .tab-btn.is-disabled {
316
+ background: #f3f4f6;
317
+ color: #76859b;
318
+ border-color: #d8dee8;
319
+ }
320
+
321
+ .market-layout {
322
+ display: grid;
323
+ grid-template-columns: 1fr 340px;
324
+ gap: 12px;
325
+ }
326
+
327
+ .market-main {
328
+ display: grid;
329
+ gap: 12px;
330
+ }
331
+
332
+ .market-side {
333
+ display: grid;
334
+ align-content: start;
335
+ gap: 12px;
336
+ }
337
+
338
+ .market-panel-header {
339
+ display: flex;
340
+ justify-content: space-between;
341
+ align-items: center;
342
+ margin-bottom: 8px;
343
+ }
344
+
345
+ .quote-table {
346
+ width: 100%;
347
+ border-collapse: collapse;
348
+ background: #fff;
349
+ }
350
+
351
+ .quote-table th {
352
+ background: #273445;
353
+ color: #fff;
354
+ font-weight: 600;
355
+ padding: 10px;
356
+ border-right: 1px solid #52657a;
357
+ }
358
+
359
+ .quote-table td {
360
+ padding: 10px;
361
+ border-bottom: 1px solid #e4e9f0;
362
+ text-align: right;
363
+ font-variant-numeric: tabular-nums;
364
+ }
365
+
366
+ .quote-table tbody tr {
367
+ cursor: pointer;
368
+ }
369
+
370
+ .quote-table tbody tr:hover {
371
+ background: #f6f9fd;
372
+ }
373
+
374
+ .quote-table td:first-child,
375
+ .quote-table th:first-child {
376
+ text-align: left;
377
+ }
378
+
379
+ .quote-table tr.selected {
380
+ outline: 2px solid #f4b400;
381
+ outline-offset: -2px;
382
+ }
383
+
384
+ .quote-table td.up {
385
+ color: #16924f;
386
+ }
387
+
388
+ .up {
389
+ color: #16924f;
390
+ }
391
+
392
+ .order-panel {
393
+ background: #1f3042;
394
+ color: #fff;
395
+ }
396
+
397
+ .side-title-row h3 {
398
+ margin: 0;
399
+ }
400
+
401
+ .side-price-box {
402
+ display: grid;
403
+ grid-template-columns: 1fr 1fr;
404
+ gap: 0;
405
+ margin-bottom: 10px;
406
+ border-radius: 8px;
407
+ overflow: hidden;
408
+ }
409
+
410
+ .side-bid,
411
+ .side-ask {
412
+ padding: 10px;
413
+ display: grid;
414
+ gap: 4px;
415
+ }
416
+
417
+ .side-price-box {
418
+ position: relative;
419
+ }
420
+
421
+ .side-spread {
422
+ position: absolute;
423
+ left: 50%;
424
+ top: 50%;
425
+ transform: translate(-50%, -50%);
426
+ width: 52px;
427
+ height: 52px;
428
+ border-radius: 50%;
429
+ background: #082744;
430
+ border: 2px solid #0c3f66;
431
+ color: #ffffff;
432
+ display: grid;
433
+ place-items: center;
434
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
435
+ }
436
+
437
+ .side-spread strong {
438
+ font-size: 14px;
439
+ line-height: 1;
440
+ font-variant-numeric: tabular-nums;
441
+ }
442
+
443
+ .side-bid {
444
+ background: #1f9d55;
445
+ }
446
+
447
+ .side-ask {
448
+ background: #e24646;
449
+ text-align: right;
450
+ justify-items: end;
451
+ }
452
+
453
+ .side-label {
454
+ width: 48px;
455
+ color: #d8e4f2;
456
+ align-self: center;
457
+ }
458
+
459
+ .order-qty-row {
460
+ display: grid;
461
+ grid-template-columns: 1fr 1fr;
462
+ gap: 0;
463
+ width: 100%;
464
+ }
465
+
466
+ .order-qty-row .side-label {
467
+ width: auto;
468
+ justify-self: start;
469
+ }
470
+
471
+ .qty-input-wrap {
472
+ display: flex;
473
+ justify-content: flex-end;
474
+ }
475
+
476
+ .qty-input-wrap input {
477
+ width: 66.666%;
478
+ min-width: 140px;
479
+ }
480
+
481
+ .market-icon {
482
+ width: 22px;
483
+ height: 22px;
484
+ border-radius: 50%;
485
+ background: #fff;
486
+ border: 1px solid #d8e1f0;
487
+ }
488
+
489
+ .order-panel input {
490
+ background: #fff;
491
+ color: #1c2a3b;
492
+ }
493
+
494
+ .required-amount-box {
495
+ margin-top: 8px;
496
+ background: #5f99cc;
497
+ border-radius: 8px;
498
+ padding: 8px 10px;
499
+ display: grid;
500
+ gap: 4px;
501
+ }
502
+
503
+ .required-amount-box span {
504
+ color: #eef5ff;
505
+ font-size: 13px;
506
+ }
507
+
508
+ .required-amount-box strong {
509
+ color: #ffffff;
510
+ font-size: 24px;
511
+ line-height: 1;
512
+ font-variant-numeric: tabular-nums;
513
+ justify-self: end;
514
+ }
515
+
516
+ .buying-power-head {
517
+ display: flex;
518
+ align-items: center;
519
+ justify-content: space-between;
520
+ }
521
+
522
+ .buying-power-refresh-btn {
523
+ width: 28px;
524
+ height: 28px;
525
+ border-radius: 6px;
526
+ padding: 0;
527
+ display: inline-flex;
528
+ align-items: center;
529
+ justify-content: center;
530
+ font-size: 15px;
531
+ line-height: 1;
532
+ }
533
+
534
+ .order-account-info {
535
+ margin-top: 12px;
536
+ background: #f3f6fb;
537
+ border: 1px solid #b9c9df;
538
+ border-radius: 8px;
539
+ padding: 8px;
540
+ display: grid;
541
+ gap: 6px;
542
+ }
543
+
544
+ .order-account-info .buying-power-head span {
545
+ color: #2b3f5d;
546
+ font-weight: 600;
547
+ }
548
+
549
+ .info-row {
550
+ display: flex;
551
+ justify-content: space-between;
552
+ align-items: center;
553
+ gap: 12px;
554
+ }
555
+
556
+ .info-row span {
557
+ color: #3f526f;
558
+ font-size: 13px;
559
+ }
560
+
561
+ .info-row strong {
562
+ color: #243a57;
563
+ font-size: 36px;
564
+ line-height: 1;
565
+ font-variant-numeric: tabular-nums;
566
+ }
567
+
568
+ .order-account-info .info-row strong {
569
+ font-size: 18px;
570
+ }
571
+
572
+ .position-panel {
573
+ padding: 10px;
574
+ }
575
+
576
+ .position-head {
577
+ display: flex;
578
+ justify-content: space-between;
579
+ align-items: center;
580
+ margin-bottom: 8px;
581
+ }
582
+
583
+ .position-head h3 {
584
+ margin: 0;
585
+ font-size: 24px;
586
+ color: #1a2a44;
587
+ }
588
+
589
+ .position-table {
590
+ width: 100%;
591
+ border-collapse: collapse;
592
+ background: #fff;
593
+ font-size: 13px;
594
+ }
595
+
596
+ .position-table th {
597
+ background: #273445;
598
+ color: #fff;
599
+ padding: 8px 6px;
600
+ border-right: 1px solid #4d6278;
601
+ text-align: center;
602
+ line-height: 1.1;
603
+ }
604
+
605
+ .position-table td {
606
+ border-bottom: 1px solid #e4e9f0;
607
+ padding: 8px 6px;
608
+ text-align: center;
609
+ }
610
+
611
+ .empty-cell {
612
+ color: #5f7089;
613
+ }
614
+
615
+ .close-btn {
616
+ border: 1px solid #9aa8bd;
617
+ background: #fff;
618
+ color: #334862;
619
+ padding: 3px 8px;
620
+ border-radius: 6px;
621
+ font-size: 12px;
622
+ }
623
+
624
+ .positions-grid {
625
+ display: grid;
626
+ grid-template-columns: 1fr 1fr;
627
+ gap: 12px;
628
+ margin-top: 12px;
629
+ }
630
+
147
631
  h2 {
148
632
  margin: 0 0 10px;
149
633
  }
@@ -184,12 +668,100 @@ textarea {
184
668
  gap: 10px;
185
669
  }
186
670
 
671
+ .inline-input-row {
672
+ display: grid;
673
+ grid-template-columns: 1fr auto;
674
+ gap: 0;
675
+ }
676
+
677
+ .inline-input-row input {
678
+ border-top-right-radius: 0;
679
+ border-bottom-right-radius: 0;
680
+ }
681
+
682
+ .inline-input-row button {
683
+ border-top-left-radius: 0;
684
+ border-bottom-left-radius: 0;
685
+ min-width: 64px;
686
+ }
687
+
187
688
  .config-actions {
188
689
  margin: 10px 0;
189
690
  align-items: center;
190
691
  flex-wrap: wrap;
191
692
  }
192
693
 
694
+ .order-action-row {
695
+ display: grid;
696
+ grid-template-columns: 1fr 1fr;
697
+ gap: 0;
698
+ width: 100%;
699
+ margin-top: 8px;
700
+ }
701
+
702
+ .order-action-row .order-buy-btn,
703
+ .order-action-row .order-sell-btn {
704
+ width: 100%;
705
+ min-height: 40px;
706
+ border-radius: 0;
707
+ }
708
+
709
+ .order-action-row .order-buy-btn {
710
+ background: #1f9d55;
711
+ color: #ffffff;
712
+ border-top-left-radius: 8px;
713
+ border-bottom-left-radius: 8px;
714
+ }
715
+
716
+ .order-action-row .order-sell-btn {
717
+ background: #e24646;
718
+ color: #ffffff;
719
+ border-top-right-radius: 8px;
720
+ border-bottom-right-radius: 8px;
721
+ }
722
+
723
+ .market-pair-row {
724
+ justify-content: flex-start;
725
+ gap: 8px;
726
+ margin-left: 0;
727
+ }
728
+
729
+ .kline-toolbar {
730
+ display: flex;
731
+ gap: 8px;
732
+ margin-bottom: 6px;
733
+ }
734
+
735
+ .kline-toolbar .interval-btn {
736
+ background: #e6edf8;
737
+ color: #223451;
738
+ border: 1px solid #c7d4ea;
739
+ padding: 7px 12px;
740
+ }
741
+
742
+ .kline-toolbar .interval-btn.is-active {
743
+ background: #2359d1;
744
+ color: #fff;
745
+ border-color: #2359d1;
746
+ }
747
+
748
+ #coin-kline-canvas,
749
+ #fx-kline-canvas {
750
+ width: 100%;
751
+ border: 1px solid #dde4f0;
752
+ border-radius: 10px;
753
+ background: #ffffff;
754
+ margin: 6px 0 10px;
755
+ }
756
+
757
+ .fx-theme #fx-kline-canvas {
758
+ background: #f7fbff;
759
+ }
760
+
761
+ .coin-theme #coin-kline-canvas {
762
+ background: #fffdf7;
763
+ }
764
+
193
765
  button {
194
766
  border: none;
195
767
  border-radius: 8px;
@@ -249,6 +821,176 @@ button.is-loading::before {
249
821
  word-break: break-all;
250
822
  }
251
823
 
824
+ .skill-panel {
825
+ display: grid;
826
+ gap: 10px;
827
+ }
828
+
829
+ .skill-panel-head {
830
+ display: flex;
831
+ justify-content: space-between;
832
+ align-items: baseline;
833
+ gap: 12px;
834
+ flex-wrap: wrap;
835
+ }
836
+
837
+ .skill-panel-head h3 {
838
+ margin: 0;
839
+ }
840
+
841
+ .skill-state-list {
842
+ display: grid;
843
+ gap: 10px;
844
+ }
845
+
846
+ .skill-card {
847
+ border: 1px solid #dbe4f1;
848
+ border-radius: 10px;
849
+ padding: 12px;
850
+ background: #f8fbff;
851
+ display: grid;
852
+ gap: 10px;
853
+ }
854
+
855
+ .skill-card.is-disabled {
856
+ background: #f6f7f9;
857
+ border-color: #d7dde7;
858
+ }
859
+
860
+ .skill-card-head {
861
+ display: flex;
862
+ justify-content: space-between;
863
+ align-items: flex-start;
864
+ gap: 10px;
865
+ }
866
+
867
+ .skill-card-title {
868
+ display: grid;
869
+ gap: 4px;
870
+ }
871
+
872
+ .skill-card-title strong {
873
+ font-size: 15px;
874
+ }
875
+
876
+ .skill-card-title code {
877
+ color: #5a6a84;
878
+ }
879
+
880
+ .skill-card-section {
881
+ display: grid;
882
+ gap: 6px;
883
+ }
884
+
885
+ .skill-section-label {
886
+ color: #62748f;
887
+ font-size: 12px;
888
+ font-weight: 700;
889
+ letter-spacing: 0.03em;
890
+ text-transform: uppercase;
891
+ }
892
+
893
+ .skill-package-code {
894
+ color: #334862;
895
+ word-break: break-all;
896
+ }
897
+
898
+ .skill-badges {
899
+ display: flex;
900
+ gap: 6px;
901
+ flex-wrap: wrap;
902
+ justify-content: flex-end;
903
+ }
904
+
905
+ .skill-badge {
906
+ border-radius: 999px;
907
+ padding: 3px 8px;
908
+ font-size: 12px;
909
+ font-weight: 600;
910
+ }
911
+
912
+ .skill-badge.enabled {
913
+ background: #dcfce7;
914
+ color: #166534;
915
+ }
916
+
917
+ .skill-badge.disabled {
918
+ background: #fee2e2;
919
+ color: #991b1b;
920
+ }
921
+
922
+ .skill-badge.status {
923
+ background: #e8eef8;
924
+ color: #294267;
925
+ }
926
+
927
+ .skill-meta {
928
+ display: grid;
929
+ grid-template-columns: repeat(2, minmax(0, 1fr));
930
+ gap: 8px 12px;
931
+ font-size: 13px;
932
+ }
933
+
934
+ .skill-meta-row {
935
+ display: grid;
936
+ gap: 2px;
937
+ }
938
+
939
+ .skill-meta-row span {
940
+ color: #62748f;
941
+ }
942
+
943
+ .skill-meta-row strong,
944
+ .skill-meta-row code {
945
+ word-break: break-word;
946
+ }
947
+
948
+ .skill-tags {
949
+ display: flex;
950
+ gap: 6px;
951
+ flex-wrap: wrap;
952
+ }
953
+
954
+ .skill-tag {
955
+ background: #e7f0ff;
956
+ color: #1f4d8f;
957
+ border-radius: 999px;
958
+ padding: 4px 8px;
959
+ font-size: 12px;
960
+ }
961
+
962
+ .skill-tag.permissions {
963
+ background: #fff1db;
964
+ color: #8a4b08;
965
+ }
966
+
967
+ .skill-empty {
968
+ border: 1px dashed #cbd6e5;
969
+ border-radius: 10px;
970
+ padding: 16px;
971
+ color: #617289;
972
+ background: #f8fbff;
973
+ }
974
+
975
+ .browser-skill-shell {
976
+ display: grid;
977
+ grid-template-columns: repeat(2, minmax(0, 1fr));
978
+ gap: 12px;
979
+ }
980
+
981
+ .browser-skill-card {
982
+ border: 1px solid #dbe4f1;
983
+ border-radius: 12px;
984
+ background: #f8fbff;
985
+ padding: 14px;
986
+ display: grid;
987
+ gap: 10px;
988
+ }
989
+
990
+ .browser-skill-card h3 {
991
+ margin: 0;
992
+ }
993
+
252
994
  .chat-tools {
253
995
  display: flex;
254
996
  gap: 8px;
@@ -261,8 +1003,8 @@ button.is-loading::before {
261
1003
  border: 1px solid #dde4f0;
262
1004
  border-radius: 12px;
263
1005
  padding: 12px;
264
- min-height: 320px;
265
- max-height: 420px;
1006
+ min-height: 280px;
1007
+ max-height: none;
266
1008
  overflow: auto;
267
1009
  margin-bottom: 10px;
268
1010
  }
@@ -299,6 +1041,22 @@ button.is-loading::before {
299
1041
  justify-self: end;
300
1042
  }
301
1043
 
1044
+ #tab-ai .panel {
1045
+ display: flex;
1046
+ flex-direction: column;
1047
+ height: calc(100vh - 180px);
1048
+ min-height: 520px;
1049
+ }
1050
+
1051
+ #tab-ai .messages {
1052
+ flex: 1 1 auto;
1053
+ margin-bottom: 8px;
1054
+ }
1055
+
1056
+ #tab-ai .composer {
1057
+ flex: 0 0 auto;
1058
+ }
1059
+
302
1060
  .logs-list {
303
1061
  background: #10141f;
304
1062
  color: #ddedff;
@@ -377,3 +1135,17 @@ button.is-loading::before {
377
1135
  .json-value-null {
378
1136
  color: #9aa6bf;
379
1137
  }
1138
+
1139
+ @media (max-width: 980px) {
1140
+ .positions-grid {
1141
+ grid-template-columns: 1fr;
1142
+ }
1143
+
1144
+ .skill-meta {
1145
+ grid-template-columns: 1fr;
1146
+ }
1147
+
1148
+ .browser-skill-shell {
1149
+ grid-template-columns: 1fr;
1150
+ }
1151
+ }