@agent-link/server 0.1.157 → 0.1.159

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/web/style.css CHANGED
@@ -255,7 +255,7 @@ body {
255
255
  }
256
256
 
257
257
  .sidebar-section {
258
- padding: 0.75rem;
258
+ padding: 0.5rem 0.75rem;
259
259
  border-bottom: 1px solid var(--border);
260
260
  }
261
261
 
@@ -292,7 +292,9 @@ body {
292
292
  font-size: 0.8rem;
293
293
  color: var(--text-primary);
294
294
  font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
295
- word-break: break-all;
295
+ overflow: hidden;
296
+ text-overflow: ellipsis;
297
+ white-space: nowrap;
296
298
  line-height: 1.3;
297
299
  }
298
300
 
@@ -314,6 +316,8 @@ body {
314
316
  display: flex;
315
317
  flex-direction: column;
316
318
  gap: 2px;
319
+ max-height: 120px;
320
+ overflow-y: auto;
317
321
  }
318
322
  .workdir-history-item {
319
323
  display: flex;
@@ -365,7 +369,6 @@ body {
365
369
  }
366
370
 
367
371
  .sidebar-sessions {
368
- flex: 1;
369
372
  display: flex;
370
373
  flex-direction: column;
371
374
  overflow: hidden;
@@ -390,19 +393,19 @@ body {
390
393
  display: flex;
391
394
  align-items: center;
392
395
  justify-content: space-between;
393
- font-size: 0.75rem;
396
+ font-size: 0.7rem;
394
397
  text-transform: uppercase;
395
398
  letter-spacing: 0.05em;
396
399
  color: var(--text-secondary);
397
- margin-bottom: 8px;
400
+ margin-bottom: 4px;
398
401
  }
399
402
 
400
403
  .sidebar-refresh-btn {
401
404
  display: flex;
402
405
  align-items: center;
403
406
  justify-content: center;
404
- width: 24px;
405
- height: 24px;
407
+ width: 20px;
408
+ height: 20px;
406
409
  background: none;
407
410
  border: none;
408
411
  border-radius: 4px;
@@ -2907,6 +2910,18 @@ body {
2907
2910
  color: var(--text-primary);
2908
2911
  }
2909
2912
 
2913
+ .team-mode-select {
2914
+ display: none;
2915
+ padding: 4px 8px;
2916
+ border: 1px solid var(--border);
2917
+ border-radius: 6px;
2918
+ background: var(--bg-tertiary);
2919
+ color: var(--text-primary);
2920
+ font-size: 0.75rem;
2921
+ font-weight: 500;
2922
+ cursor: pointer;
2923
+ }
2924
+
2910
2925
  /* ── Team create panel ── */
2911
2926
  .team-create-panel {
2912
2927
  flex: 1;
@@ -3702,12 +3717,29 @@ body {
3702
3717
 
3703
3718
  /* ── Teams sidebar section (history list in sidebar) ── */
3704
3719
  .sidebar-teams {
3705
- padding: 0.75rem;
3706
- max-height: 35%;
3720
+ padding: 0.5rem 0.75rem;
3707
3721
  overflow: hidden;
3708
- flex-shrink: 0;
3709
3722
  display: flex;
3710
3723
  flex-direction: column;
3724
+ min-height: 0;
3725
+ }
3726
+
3727
+ /* ── Loops sidebar section ── */
3728
+ .sidebar-loops {
3729
+ padding: 0.5rem 0.75rem;
3730
+ overflow: hidden;
3731
+ display: flex;
3732
+ flex-direction: column;
3733
+ min-height: 0;
3734
+ }
3735
+
3736
+ .loop-history-list {
3737
+ flex: 1 1 auto;
3738
+ overflow-y: auto;
3739
+ min-height: 0;
3740
+ display: flex;
3741
+ flex-direction: column;
3742
+ gap: 2px;
3711
3743
  }
3712
3744
 
3713
3745
  .team-history-list {
@@ -4180,9 +4212,12 @@ body {
4180
4212
  gap: 0.4rem;
4181
4213
  }
4182
4214
 
4183
- .team-mode-btn {
4184
- padding: 4px 10px;
4185
- font-size: 0.7rem;
4215
+ .team-mode-toggle {
4216
+ display: none;
4217
+ }
4218
+
4219
+ .team-mode-select {
4220
+ display: block;
4186
4221
  }
4187
4222
 
4188
4223
  /* Message area */
@@ -4319,6 +4354,73 @@ body {
4319
4354
  .team-create-panel {
4320
4355
  padding: 1rem;
4321
4356
  }
4357
+
4358
+ /* Loop dashboard — responsive */
4359
+ .loop-active-item {
4360
+ flex-direction: column;
4361
+ align-items: flex-start;
4362
+ gap: 8px;
4363
+ }
4364
+
4365
+ .loop-active-item-actions {
4366
+ width: 100%;
4367
+ justify-content: flex-start;
4368
+ flex-wrap: wrap;
4369
+ gap: 6px;
4370
+ }
4371
+
4372
+ .loop-active-item-actions .loop-action-btn {
4373
+ min-height: 36px;
4374
+ padding: 6px 14px;
4375
+ }
4376
+
4377
+ .loop-active-item-meta {
4378
+ flex-wrap: wrap;
4379
+ }
4380
+
4381
+ .loop-detail-actions {
4382
+ flex-wrap: wrap;
4383
+ }
4384
+
4385
+ .loop-detail-actions .loop-action-btn {
4386
+ min-height: 36px;
4387
+ padding: 6px 14px;
4388
+ }
4389
+
4390
+ .loop-exec-item {
4391
+ flex-direction: column;
4392
+ align-items: flex-start;
4393
+ gap: 6px;
4394
+ }
4395
+
4396
+ .loop-exec-item-left {
4397
+ flex-wrap: wrap;
4398
+ }
4399
+
4400
+ .loop-exec-item-right {
4401
+ width: 100%;
4402
+ }
4403
+
4404
+ .loop-exec-item-right .loop-action-btn {
4405
+ min-height: 36px;
4406
+ width: 100%;
4407
+ text-align: center;
4408
+ }
4409
+
4410
+ .loop-schedule-detail {
4411
+ flex-wrap: wrap;
4412
+ }
4413
+
4414
+ .loop-running-banner {
4415
+ left: 1rem;
4416
+ right: 1rem;
4417
+ transform: none;
4418
+ bottom: 70px;
4419
+ }
4420
+
4421
+ .loop-exec-messages {
4422
+ max-height: calc(100vh - 160px);
4423
+ }
4322
4424
  }
4323
4425
 
4324
4426
  /* ══════════════════════════════════════════
@@ -4340,4 +4442,571 @@ body {
4340
4442
  .folder-picker-dialog {
4341
4443
  width: calc(100vw - 1rem);
4342
4444
  }
4445
+
4446
+ /* Loop — extra-small adjustments */
4447
+ .loop-detail-name {
4448
+ font-size: 1rem;
4449
+ }
4450
+
4451
+ .loop-active-item-name {
4452
+ font-size: 0.82rem;
4453
+ }
4454
+
4455
+ .loop-schedule-options {
4456
+ padding: 8px;
4457
+ }
4458
+
4459
+ .loop-schedule-radio {
4460
+ font-size: 0.82rem;
4461
+ }
4462
+
4463
+ .loop-cron-input {
4464
+ width: 110px;
4465
+ }
4466
+ }
4467
+
4468
+ /* ══════════════════════════════════════════════════════════════════════════════
4469
+ Loop Mode Styles
4470
+ ══════════════════════════════════════════════════════════════════════════════ */
4471
+
4472
+ /* ── Loop name input ── */
4473
+ .loop-name-input {
4474
+ width: 100%;
4475
+ padding: 8px 10px;
4476
+ border: 1px solid var(--border);
4477
+ border-radius: 6px;
4478
+ background: var(--bg-secondary);
4479
+ color: var(--text-primary);
4480
+ font-size: 0.9rem;
4481
+ font-family: inherit;
4482
+ }
4483
+ .loop-name-input:focus {
4484
+ outline: none;
4485
+ border-color: var(--accent);
4486
+ }
4487
+
4488
+ /* ── Schedule selector ── */
4489
+ .loop-schedule-options {
4490
+ display: flex;
4491
+ flex-direction: column;
4492
+ gap: 8px;
4493
+ border: 1px solid var(--border);
4494
+ border-radius: 8px;
4495
+ padding: 12px;
4496
+ background: var(--bg-secondary);
4497
+ }
4498
+ .loop-schedule-radio {
4499
+ display: flex;
4500
+ align-items: center;
4501
+ gap: 8px;
4502
+ font-size: 0.85rem;
4503
+ color: var(--text-primary);
4504
+ cursor: pointer;
4505
+ }
4506
+ .loop-schedule-radio input[type="radio"] {
4507
+ margin: 0;
4508
+ accent-color: var(--accent);
4509
+ }
4510
+ .loop-schedule-detail {
4511
+ display: inline-flex;
4512
+ align-items: center;
4513
+ gap: 4px;
4514
+ font-size: 0.82rem;
4515
+ color: var(--text-secondary);
4516
+ margin-left: 4px;
4517
+ }
4518
+ .loop-time-input {
4519
+ width: 46px;
4520
+ padding: 3px 6px;
4521
+ border: 1px solid var(--border);
4522
+ border-radius: 4px;
4523
+ background: var(--bg-primary);
4524
+ color: var(--text-primary);
4525
+ font-size: 0.82rem;
4526
+ font-family: inherit;
4527
+ text-align: center;
4528
+ }
4529
+ .loop-time-input:focus {
4530
+ outline: none;
4531
+ border-color: var(--accent);
4532
+ }
4533
+ .loop-day-select {
4534
+ padding: 3px 6px;
4535
+ border: 1px solid var(--border);
4536
+ border-radius: 4px;
4537
+ background: var(--bg-primary);
4538
+ color: var(--text-primary);
4539
+ font-size: 0.82rem;
4540
+ font-family: inherit;
4541
+ cursor: pointer;
4542
+ }
4543
+ .loop-day-select:focus {
4544
+ outline: none;
4545
+ border-color: var(--accent);
4546
+ }
4547
+ .loop-cron-input {
4548
+ width: 140px;
4549
+ padding: 3px 8px;
4550
+ border: 1px solid var(--border);
4551
+ border-radius: 4px;
4552
+ background: var(--bg-primary);
4553
+ color: var(--text-primary);
4554
+ font-size: 0.82rem;
4555
+ font-family: 'SF Mono', 'Fira Code', monospace;
4556
+ }
4557
+ .loop-cron-input:focus {
4558
+ outline: none;
4559
+ border-color: var(--accent);
4560
+ }
4561
+
4562
+ /* ── Template selected highlight ── */
4563
+ .loop-template-selected {
4564
+ border-color: rgba(59,130,246,0.4) !important;
4565
+ background: linear-gradient(135deg, rgba(59,130,246,0.08) 0%, rgba(59,130,246,0.03) 100%) !important;
4566
+ }
4567
+
4568
+ /* ── Active Loops list ── */
4569
+ .loop-active-section {
4570
+ margin-top: 24px;
4571
+ border-top: 1px solid var(--border);
4572
+ padding-top: 16px;
4573
+ }
4574
+ .loop-active-header {
4575
+ font-size: 0.8rem;
4576
+ font-weight: 600;
4577
+ color: var(--text-secondary);
4578
+ text-transform: uppercase;
4579
+ letter-spacing: 0.04em;
4580
+ margin-bottom: 10px;
4581
+ }
4582
+ .loop-active-list {
4583
+ display: flex;
4584
+ flex-direction: column;
4585
+ gap: 6px;
4586
+ }
4587
+ .loop-active-item {
4588
+ display: flex;
4589
+ align-items: center;
4590
+ justify-content: space-between;
4591
+ gap: 12px;
4592
+ padding: 10px 14px;
4593
+ border: 1px solid var(--border);
4594
+ border-radius: 8px;
4595
+ transition: border-color 0.15s;
4596
+ }
4597
+ .loop-active-item:hover {
4598
+ border-color: rgba(59,130,246,0.3);
4599
+ }
4600
+ .loop-active-item-info {
4601
+ flex: 1;
4602
+ min-width: 0;
4603
+ cursor: pointer;
4604
+ }
4605
+ .loop-active-item-top {
4606
+ display: flex;
4607
+ align-items: center;
4608
+ gap: 8px;
4609
+ margin-bottom: 2px;
4610
+ }
4611
+ .loop-active-item-name {
4612
+ font-size: 0.85rem;
4613
+ font-weight: 600;
4614
+ color: var(--text-primary);
4615
+ overflow: hidden;
4616
+ text-overflow: ellipsis;
4617
+ white-space: nowrap;
4618
+ }
4619
+ .loop-status-dot {
4620
+ width: 8px;
4621
+ height: 8px;
4622
+ border-radius: 50%;
4623
+ flex-shrink: 0;
4624
+ }
4625
+ .loop-status-dot-on {
4626
+ background: #10B981;
4627
+ }
4628
+ .loop-status-dot-off {
4629
+ background: var(--text-secondary);
4630
+ opacity: 0.4;
4631
+ }
4632
+ .loop-active-item-meta {
4633
+ display: flex;
4634
+ align-items: center;
4635
+ gap: 10px;
4636
+ font-size: 0.75rem;
4637
+ color: var(--text-secondary);
4638
+ }
4639
+ .loop-active-item-actions {
4640
+ display: flex;
4641
+ gap: 4px;
4642
+ flex-shrink: 0;
4643
+ }
4644
+
4645
+ /* ── Loop action buttons ── */
4646
+ .loop-action-btn {
4647
+ padding: 5px 12px;
4648
+ font-size: 0.78rem;
4649
+ font-weight: 500;
4650
+ color: var(--text-primary);
4651
+ background: var(--bg-secondary);
4652
+ border: 1px solid var(--border);
4653
+ border-radius: 6px;
4654
+ cursor: pointer;
4655
+ transition: all 0.15s;
4656
+ white-space: nowrap;
4657
+ }
4658
+ .loop-action-btn:hover:not(:disabled) {
4659
+ border-color: var(--accent);
4660
+ color: var(--accent);
4661
+ }
4662
+ .loop-action-btn:disabled {
4663
+ opacity: 0.4;
4664
+ cursor: not-allowed;
4665
+ }
4666
+ .loop-action-btn.loop-action-sm {
4667
+ padding: 3px 8px;
4668
+ font-size: 0.72rem;
4669
+ }
4670
+ .loop-action-btn.loop-action-run {
4671
+ color: #10B981;
4672
+ border-color: rgba(16,185,129,0.3);
4673
+ }
4674
+ .loop-action-btn.loop-action-run:hover:not(:disabled) {
4675
+ background: rgba(16,185,129,0.1);
4676
+ border-color: #10B981;
4677
+ }
4678
+ .loop-action-btn.loop-action-cancel {
4679
+ color: var(--error);
4680
+ border-color: rgba(239,68,68,0.3);
4681
+ }
4682
+ .loop-action-btn.loop-action-cancel:hover {
4683
+ background: rgba(239,68,68,0.1);
4684
+ border-color: var(--error);
4685
+ }
4686
+ .loop-action-btn.loop-action-delete {
4687
+ color: var(--error);
4688
+ border-color: rgba(239,68,68,0.3);
4689
+ }
4690
+ .loop-action-btn.loop-action-delete:hover {
4691
+ background: rgba(239,68,68,0.1);
4692
+ border-color: var(--error);
4693
+ }
4694
+
4695
+ /* ── Loop detail view ── */
4696
+ .loop-detail-header {
4697
+ margin-bottom: 16px;
4698
+ }
4699
+ .loop-detail-info {
4700
+ margin-bottom: 16px;
4701
+ }
4702
+ .loop-detail-name {
4703
+ font-size: 1.15rem;
4704
+ font-weight: 600;
4705
+ color: var(--text-primary);
4706
+ margin: 0 0 6px;
4707
+ }
4708
+ .loop-detail-meta {
4709
+ display: flex;
4710
+ align-items: center;
4711
+ gap: 10px;
4712
+ margin-bottom: 10px;
4713
+ }
4714
+ .loop-detail-schedule {
4715
+ font-size: 0.82rem;
4716
+ color: var(--text-secondary);
4717
+ }
4718
+ .loop-status-badge {
4719
+ font-size: 0.72rem;
4720
+ font-weight: 600;
4721
+ padding: 2px 8px;
4722
+ border-radius: 10px;
4723
+ text-transform: uppercase;
4724
+ letter-spacing: 0.03em;
4725
+ }
4726
+ .loop-status-enabled {
4727
+ background: rgba(16,185,129,0.15);
4728
+ color: #10B981;
4729
+ }
4730
+ .loop-status-disabled {
4731
+ background: rgba(156,163,175,0.15);
4732
+ color: var(--text-secondary);
4733
+ }
4734
+ .loop-detail-actions {
4735
+ display: flex;
4736
+ gap: 6px;
4737
+ }
4738
+ .loop-detail-prompt-section {
4739
+ margin-bottom: 20px;
4740
+ padding: 12px 14px;
4741
+ border: 1px solid var(--border);
4742
+ border-radius: 8px;
4743
+ background: var(--bg-secondary);
4744
+ }
4745
+ .loop-detail-prompt-label {
4746
+ font-size: 0.75rem;
4747
+ font-weight: 600;
4748
+ color: var(--text-secondary);
4749
+ text-transform: uppercase;
4750
+ letter-spacing: 0.03em;
4751
+ margin-bottom: 6px;
4752
+ }
4753
+ .loop-detail-prompt-text {
4754
+ font-size: 0.84rem;
4755
+ color: var(--text-primary);
4756
+ line-height: 1.6;
4757
+ white-space: pre-wrap;
4758
+ }
4759
+
4760
+ /* ── Execution history ── */
4761
+ .loop-exec-history-section {
4762
+ border-top: 1px solid var(--border);
4763
+ padding-top: 16px;
4764
+ }
4765
+ .loop-exec-history-header {
4766
+ font-size: 0.8rem;
4767
+ font-weight: 600;
4768
+ color: var(--text-secondary);
4769
+ text-transform: uppercase;
4770
+ letter-spacing: 0.04em;
4771
+ margin-bottom: 10px;
4772
+ }
4773
+ .loop-loading {
4774
+ display: flex;
4775
+ align-items: center;
4776
+ gap: 10px;
4777
+ padding: 20px 0;
4778
+ font-size: 0.85rem;
4779
+ color: var(--text-secondary);
4780
+ }
4781
+ .loop-exec-empty {
4782
+ font-size: 0.85rem;
4783
+ color: var(--text-secondary);
4784
+ padding: 16px 0;
4785
+ }
4786
+ .loop-exec-list {
4787
+ display: flex;
4788
+ flex-direction: column;
4789
+ gap: 4px;
4790
+ }
4791
+ .loop-exec-item {
4792
+ display: flex;
4793
+ align-items: center;
4794
+ justify-content: space-between;
4795
+ gap: 12px;
4796
+ padding: 8px 12px;
4797
+ border: 1px solid var(--border);
4798
+ border-radius: 6px;
4799
+ transition: border-color 0.15s;
4800
+ }
4801
+ .loop-exec-item:hover {
4802
+ border-color: rgba(59,130,246,0.2);
4803
+ }
4804
+ .loop-exec-item-left {
4805
+ display: flex;
4806
+ align-items: center;
4807
+ gap: 10px;
4808
+ flex: 1;
4809
+ min-width: 0;
4810
+ font-size: 0.82rem;
4811
+ }
4812
+ .loop-exec-item-right {
4813
+ flex-shrink: 0;
4814
+ }
4815
+ .loop-exec-status-icon {
4816
+ font-size: 0.9rem;
4817
+ width: 18px;
4818
+ text-align: center;
4819
+ flex-shrink: 0;
4820
+ }
4821
+ .loop-exec-status-running {
4822
+ color: var(--accent);
4823
+ animation: loop-spin 1s linear infinite;
4824
+ }
4825
+ @keyframes loop-spin {
4826
+ from { transform: rotate(0deg); }
4827
+ to { transform: rotate(360deg); }
4828
+ }
4829
+ .loop-exec-status-success {
4830
+ color: #10B981;
4831
+ }
4832
+ .loop-exec-status-error {
4833
+ color: var(--error);
4834
+ }
4835
+ .loop-exec-status-cancelled {
4836
+ color: var(--text-secondary);
4837
+ }
4838
+ .loop-exec-time {
4839
+ color: var(--text-primary);
4840
+ font-weight: 500;
4841
+ white-space: nowrap;
4842
+ }
4843
+ .loop-exec-running-label {
4844
+ color: var(--accent);
4845
+ font-weight: 500;
4846
+ font-size: 0.78rem;
4847
+ }
4848
+ .loop-exec-duration {
4849
+ color: var(--text-secondary);
4850
+ white-space: nowrap;
4851
+ }
4852
+ .loop-exec-error-text {
4853
+ color: var(--error);
4854
+ font-size: 0.75rem;
4855
+ overflow: hidden;
4856
+ text-overflow: ellipsis;
4857
+ white-space: nowrap;
4858
+ }
4859
+ .loop-exec-trigger-badge {
4860
+ font-size: 0.68rem;
4861
+ padding: 1px 6px;
4862
+ border-radius: 8px;
4863
+ background: rgba(139,92,246,0.15);
4864
+ color: #8B5CF6;
4865
+ text-transform: uppercase;
4866
+ letter-spacing: 0.03em;
4867
+ }
4868
+
4869
+ /* ── Execution messages ── */
4870
+ .loop-exec-messages {
4871
+ max-height: calc(100vh - 200px);
4872
+ overflow-y: auto;
4873
+ }
4874
+
4875
+ /* ── Running Loop notification banner ── */
4876
+ .loop-running-banner {
4877
+ position: fixed;
4878
+ bottom: 80px;
4879
+ left: 50%;
4880
+ transform: translateX(-50%);
4881
+ display: flex;
4882
+ align-items: center;
4883
+ gap: 10px;
4884
+ padding: 8px 16px;
4885
+ background: var(--bg-secondary);
4886
+ border: 1px solid var(--accent);
4887
+ border-radius: 20px;
4888
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
4889
+ z-index: 100;
4890
+ font-size: 0.82rem;
4891
+ color: var(--text-primary);
4892
+ }
4893
+ .loop-running-banner-dot {
4894
+ width: 8px;
4895
+ height: 8px;
4896
+ border-radius: 50%;
4897
+ background: var(--accent);
4898
+ animation: loop-pulse 1.5s ease-in-out infinite;
4899
+ }
4900
+ @keyframes loop-pulse {
4901
+ 0%, 100% { opacity: 1; }
4902
+ 50% { opacity: 0.3; }
4903
+ }
4904
+
4905
+ /* ── Modal dialog (generic) ── */
4906
+ .modal-overlay {
4907
+ position: fixed;
4908
+ top: 0; left: 0; right: 0; bottom: 0;
4909
+ background: rgba(0, 0, 0, 0.5);
4910
+ z-index: 1000;
4911
+ display: flex;
4912
+ align-items: center;
4913
+ justify-content: center;
4914
+ }
4915
+ .modal-dialog {
4916
+ width: 380px;
4917
+ max-width: 90vw;
4918
+ background: var(--bg-secondary);
4919
+ border: 1px solid var(--border);
4920
+ border-radius: 12px;
4921
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
4922
+ }
4923
+ .modal-title {
4924
+ padding: 12px 16px;
4925
+ font-size: 0.95rem;
4926
+ font-weight: 600;
4927
+ border-bottom: 1px solid var(--border);
4928
+ color: var(--text-primary);
4929
+ }
4930
+ .modal-body {
4931
+ padding: 16px;
4932
+ font-size: 0.88rem;
4933
+ line-height: 1.5;
4934
+ color: var(--text-primary);
4935
+ }
4936
+ .modal-actions {
4937
+ padding: 10px 16px;
4938
+ display: flex;
4939
+ justify-content: flex-end;
4940
+ gap: 8px;
4941
+ border-top: 1px solid var(--border);
4942
+ }
4943
+ .modal-confirm-btn {
4944
+ padding: 6px 20px;
4945
+ background: var(--error);
4946
+ color: #fff;
4947
+ border: none;
4948
+ border-radius: 8px;
4949
+ font-size: 0.85rem;
4950
+ font-weight: 600;
4951
+ cursor: pointer;
4952
+ transition: background 0.15s;
4953
+ }
4954
+ .modal-confirm-btn:hover {
4955
+ background: #c04444;
4956
+ }
4957
+ .modal-cancel-btn {
4958
+ padding: 6px 20px;
4959
+ background: transparent;
4960
+ color: var(--text-primary);
4961
+ border: 1px solid var(--border);
4962
+ border-radius: 8px;
4963
+ font-size: 0.85rem;
4964
+ cursor: pointer;
4965
+ transition: border-color 0.15s;
4966
+ }
4967
+ .modal-cancel-btn:hover {
4968
+ border-color: var(--text-primary);
4969
+ }
4970
+
4971
+ /* ── Loop error banner ── */
4972
+ .loop-error-banner {
4973
+ display: flex;
4974
+ align-items: center;
4975
+ gap: 8px;
4976
+ margin-top: 12px;
4977
+ padding: 10px 14px;
4978
+ background: rgba(239, 68, 68, 0.1);
4979
+ border: 1px solid rgba(239, 68, 68, 0.3);
4980
+ border-radius: 8px;
4981
+ color: var(--error);
4982
+ font-size: 0.84rem;
4983
+ cursor: pointer;
4984
+ transition: background 0.15s;
4985
+ }
4986
+ .loop-error-banner:hover {
4987
+ background: rgba(239, 68, 68, 0.15);
4988
+ }
4989
+ .loop-error-icon {
4990
+ flex-shrink: 0;
4991
+ font-size: 1rem;
4992
+ }
4993
+ .loop-error-text {
4994
+ flex: 1;
4995
+ min-width: 0;
4996
+ overflow-wrap: anywhere;
4997
+ }
4998
+ .loop-error-dismiss {
4999
+ flex-shrink: 0;
5000
+ opacity: 0.6;
5001
+ font-size: 0.8rem;
5002
+ }
5003
+ .loop-error-dismiss:hover {
5004
+ opacity: 1;
5005
+ }
5006
+
5007
+ /* ── Load more executions ── */
5008
+ .loop-load-more {
5009
+ display: flex;
5010
+ justify-content: center;
5011
+ padding: 12px 0 4px;
4343
5012
  }