bosun 0.36.2 → 0.36.3

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.
@@ -59,6 +59,17 @@ import {
59
59
 
60
60
  /* ─── Scoped Styles ─── */
61
61
  const SETTINGS_STYLES = `
62
+ /* Category navigation */
63
+ .settings-category-mobile {
64
+ display: none;
65
+ margin-bottom: 10px;
66
+ }
67
+ .settings-category-mobile-label {
68
+ display: block;
69
+ font-size: 12px;
70
+ color: var(--text-tertiary, #8a8a8a);
71
+ margin: 0 0 6px 2px;
72
+ }
62
73
  /* Category pill tabs — horizontal scrollable row */
63
74
  .settings-category-tabs {
64
75
  display: flex;
@@ -111,9 +122,9 @@ const SETTINGS_STYLES = `
111
122
  flex-wrap: wrap;
112
123
  row-gap: 8px;
113
124
  padding: 10px 16px;
114
- min-width: 240px;
125
+ min-width: min(240px, calc(100vw - 24px));
115
126
  max-width: 480px;
116
- width: auto;
127
+ width: min(480px, calc(100vw - 24px));
117
128
  background: var(--glass-bg, rgba(30,30,46,0.95));
118
129
  backdrop-filter: blur(20px);
119
130
  -webkit-backdrop-filter: blur(20px);
@@ -340,6 +351,10 @@ const SETTINGS_STYLES = `
340
351
  color: var(--accent, #5a7cff);
341
352
  }
342
353
  .settings-banner-text { flex: 1; }
354
+ .settings-banner code {
355
+ overflow-wrap: anywhere;
356
+ word-break: break-word;
357
+ }
343
358
  /* Diff display for confirm dialog */
344
359
  .settings-diff {
345
360
  max-height: 300px;
@@ -388,6 +403,18 @@ const SETTINGS_STYLES = `
388
403
  width: 100%;
389
404
  box-sizing: border-box;
390
405
  padding-bottom: 80px;
406
+ overflow-x: clip;
407
+ }
408
+
409
+ .setting-row .segmented-control {
410
+ display: flex;
411
+ width: 100%;
412
+ flex-wrap: wrap;
413
+ margin-bottom: 0;
414
+ }
415
+ .setting-row .segmented-btn {
416
+ flex: 1 1 96px;
417
+ min-width: 0;
391
418
  }
392
419
 
393
420
  body.settings-save-open .main-content {
@@ -455,6 +482,78 @@ body.settings-save-open .main-content {
455
482
  color: var(--text-tertiary, #666);
456
483
  text-align: center;
457
484
  }
485
+
486
+ @media (max-width: 900px) {
487
+ .settings-category-mobile {
488
+ display: block;
489
+ }
490
+ .settings-category-tabs {
491
+ display: grid;
492
+ grid-template-columns: repeat(2, minmax(0, 1fr));
493
+ gap: 8px;
494
+ overflow-x: visible;
495
+ padding: 4px 0 8px;
496
+ }
497
+ .settings-category-tab {
498
+ width: 100%;
499
+ border-radius: 12px;
500
+ min-height: 42px;
501
+ padding: 10px 12px;
502
+ justify-content: flex-start;
503
+ white-space: normal;
504
+ line-height: 1.25;
505
+ }
506
+ }
507
+
508
+ @media (max-width: 700px) {
509
+ .settings-save-bar {
510
+ left: 12px;
511
+ right: 12px;
512
+ width: auto;
513
+ max-width: none;
514
+ transform: none;
515
+ padding: 10px 12px;
516
+ }
517
+ @keyframes slideUp {
518
+ from { transform: translateY(20px); opacity: 0; }
519
+ to { transform: translateY(0); opacity: 1; }
520
+ }
521
+ .settings-save-bar .save-bar-actions {
522
+ width: 100%;
523
+ justify-content: flex-end;
524
+ }
525
+ .setting-input-wrap {
526
+ flex-direction: column;
527
+ align-items: stretch;
528
+ gap: 6px;
529
+ }
530
+ .setting-input-wrap input[type="text"],
531
+ .setting-input-wrap input[type="number"],
532
+ .setting-input-wrap input[type="password"],
533
+ .setting-input-wrap textarea,
534
+ .setting-input-wrap select {
535
+ width: 100%;
536
+ flex: 1 1 auto;
537
+ }
538
+ .setting-unit {
539
+ align-self: flex-end;
540
+ }
541
+ .setting-help-tooltip {
542
+ left: 0;
543
+ transform: none;
544
+ min-width: 0;
545
+ max-width: min(92vw, 360px);
546
+ }
547
+ }
548
+
549
+ @media (max-width: 640px) {
550
+ .settings-category-tabs {
551
+ display: none;
552
+ }
553
+ .setting-row .segmented-btn {
554
+ flex: 1 1 calc(50% - 4px);
555
+ }
556
+ }
458
557
  `;
459
558
 
460
559
  /* ─── Inject styles once ─── */
@@ -1172,6 +1271,21 @@ function ServerConfigMode() {
1172
1271
  const activeCat = CATEGORIES.find((c) => c.id === activeCategory);
1173
1272
 
1174
1273
  return html`
1274
+ <div class="settings-category-mobile">
1275
+ <label class="settings-category-mobile-label">Category</label>
1276
+ <div class="setting-input-wrap">
1277
+ <select
1278
+ value=${activeCategory}
1279
+ onChange=${(e) => {
1280
+ setActiveCategory(e.target.value);
1281
+ haptic("light");
1282
+ }}
1283
+ >
1284
+ ${CATEGORIES.map((cat) => html`<option key=${cat.id} value=${cat.id}>${cat.label}</option>`)}
1285
+ </select>
1286
+ </div>
1287
+ </div>
1288
+
1175
1289
  <!-- Category tabs -->
1176
1290
  <div class="settings-category-tabs">
1177
1291
  ${CATEGORIES.map(