barua-ui 0.13.0 → 0.14.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.
@@ -58,7 +58,9 @@
58
58
  selector inside a container is (0,1,1) and quietly beat .b-btn--primary's
59
59
  (0,1,0), which left the landing page's call to action grey on blue. */
60
60
  .b-marketing-nav a:not(.b-btn) { color: var(--b-text-secondary); text-decoration: none; }
61
- .b-marketing-nav a:not(.b-btn):hover { color: var(--b-text); }
61
+ @media (hover: hover) {
62
+ .b-marketing-nav a:not(.b-btn):hover { color: var(--b-text); }
63
+ }
62
64
 
63
65
  /* ---- Chapter: one idea, centred, with room around it --------------------- */
64
66
  .b-chapter {
@@ -187,10 +189,14 @@
187
189
  border-radius: var(--b-radius-full);
188
190
  text-decoration: none;
189
191
  }
190
- .b-announce:hover { text-decoration: none; background: color-mix(in srgb, var(--b-color-accent) 18%, transparent); }
192
+ @media (hover: hover) {
193
+ .b-announce:hover { text-decoration: none; background: color-mix(in srgb, var(--b-color-accent) 18%, transparent); }
194
+ }
191
195
  .b-announce .b-icon { width: 1rem; height: 1rem; }
192
196
  .b-announce__go { transition: translate var(--b-duration-fast) var(--b-ease-out); }
193
- .b-announce:hover .b-announce__go { translate: 2px 0; }
197
+ @media (hover: hover) {
198
+ .b-announce:hover .b-announce__go { translate: 2px 0; }
199
+ }
194
200
 
195
201
  /* ---- Rating: borrowed credibility, stated plainly ------------------------ */
196
202
  /* Five marks and who is vouching. The stars are the library's own star at
@@ -262,7 +268,9 @@
262
268
  other space in the belt. Half at each end restores it. */
263
269
  padding-inline: calc(var(--b-marquee-gap) / 2);
264
270
  }
265
- .b-marquee:hover .b-marquee__track { animation-play-state: paused; }
271
+ @media (hover: hover) {
272
+ .b-marquee:hover .b-marquee__track { animation-play-state: paused; }
273
+ }
266
274
  @keyframes b-marquee { to { translate: -50% 0; } }
267
275
  @media (prefers-reduced-motion: reduce) {
268
276
  .b-marquee { overflow-x: auto; -webkit-mask-image: none; mask-image: none; }
@@ -329,7 +337,9 @@
329
337
  border-radius: var(--b-radius-xl);
330
338
  transition: translate var(--b-duration-normal) var(--b-ease-out), box-shadow var(--b-duration-normal);
331
339
  }
332
- .b-resource-card:hover { text-decoration: none; }
340
+ @media (hover: hover) {
341
+ .b-resource-card:hover { text-decoration: none; }
342
+ }
333
343
  @media (hover: hover) {
334
344
  .b-resource-card:hover { translate: 0 -2px; box-shadow: var(--b-elevation-3); }
335
345
  }
@@ -405,7 +415,9 @@
405
415
  opacity: 0.7;
406
416
  transition: opacity var(--b-duration-fast);
407
417
  }
408
- .b-logo-wall__logo:hover { opacity: 1; }
418
+ @media (hover: hover) {
419
+ .b-logo-wall__logo:hover { opacity: 1; }
420
+ }
409
421
  .b-logo-wall__logo :is(svg, img) { height: 100%; width: auto; }
410
422
  .b-logo-wall__logo img { filter: grayscale(1); }
411
423
 
@@ -619,7 +631,9 @@
619
631
  font-weight: var(--b-weight-semibold);
620
632
  align-items: flex-start;
621
633
  }
622
- .b-accordion--plain > .b-disclosure > summary:hover { background: none; color: var(--b-color-accent-text); }
634
+ @media (hover: hover) {
635
+ .b-accordion--plain > .b-disclosure > summary:hover { background: none; color: var(--b-color-accent-text); }
636
+ }
623
637
  .b-accordion--plain > .b-disclosure > summary::after {
624
638
  content: "+";
625
639
  display: grid;
@@ -701,7 +715,9 @@
701
715
  border-radius: var(--b-radius-full);
702
716
  transition: background var(--b-duration-fast) var(--b-ease-out), color var(--b-duration-fast) var(--b-ease-out);
703
717
  }
704
- .b-pill-nav a:hover { background: var(--b-fill-tertiary); color: var(--b-text); }
718
+ @media (hover: hover) {
719
+ .b-pill-nav a:hover { background: var(--b-fill-tertiary); color: var(--b-text); }
720
+ }
705
721
  .b-pill-nav a.is-active { background: var(--b-text); color: var(--b-bg); }
706
722
 
707
723
  /* ---- Card rail: a row you push sideways ---------------------------------- */
@@ -783,7 +799,9 @@
783
799
  color: var(--b-text);
784
800
  }
785
801
  .b-site-footer__group a:not(.b-btn) { display: block; padding-block: 0.2rem; color: var(--b-text-secondary); text-decoration: none; }
786
- .b-site-footer__group a:hover { color: var(--b-text); text-decoration: underline; }
802
+ @media (hover: hover) {
803
+ .b-site-footer__group a:hover { color: var(--b-text); text-decoration: underline; }
804
+ }
787
805
  .b-site-footer__legal {
788
806
  max-width: var(--b-container-xl);
789
807
  margin: var(--b-space-8) auto 0;
@@ -50,7 +50,9 @@
50
50
  object-fit: cover;
51
51
  transition: scale var(--b-duration-normal) var(--b-ease-out);
52
52
  }
53
- .b-gallery :is(a, button):hover img { scale: 1.05; }
53
+ @media (hover: hover) {
54
+ .b-gallery :is(a, button):hover img { scale: 1.05; }
55
+ }
54
56
 
55
57
  /* ---- Carousel (scroll-snap) ------------------------------------------------ */
56
58
  .b-carousel { position: relative; }
@@ -179,7 +181,9 @@
179
181
  color: inherit;
180
182
  text-decoration: none;
181
183
  }
182
- .b-poster:hover { color: inherit; text-decoration: none; }
184
+ @media (hover: hover) {
185
+ .b-poster:hover { color: inherit; text-decoration: none; }
186
+ }
183
187
  .b-poster__frame {
184
188
  position: relative;
185
189
  display: grid;
@@ -264,9 +268,10 @@
264
268
  opacity: 0;
265
269
  transition: opacity var(--b-duration-normal);
266
270
  }
267
- .b-video:hover .b-video__overlay,
268
- .b-video:focus-within .b-video__overlay,
269
- .b-video.is-paused .b-video__overlay { opacity: 1; }
271
+ .b-video:focus-within .b-video__overlay, .b-video.is-paused .b-video__overlay { opacity: 1; }
272
+ @media (hover: hover) {
273
+ .b-video:hover .b-video__overlay { opacity: 1; }
274
+ }
270
275
  .b-video__play {
271
276
  display: grid;
272
277
  place-items: center;
@@ -281,7 +286,9 @@
281
286
  cursor: pointer;
282
287
  transition: scale var(--b-duration-fast) var(--b-ease-bounce);
283
288
  }
284
- .b-video__play:hover { scale: 1.08; }
289
+ @media (hover: hover) {
290
+ .b-video__play:hover { scale: 1.08; }
291
+ }
285
292
 
286
293
  /* ---- Film player controls -------------------------------------------------------
287
294
  `.b-media-controls` is the generic bar. A film needs its controls over the
@@ -303,9 +310,10 @@
303
310
  opacity: 0;
304
311
  transition: opacity var(--b-duration-normal) var(--b-ease-out);
305
312
  }
306
- .b-video:hover .b-video__bar,
307
- .b-video:focus-within .b-video__bar,
308
- .b-video.is-paused .b-video__bar { opacity: 1; }
313
+ .b-video:focus-within .b-video__bar, .b-video.is-paused .b-video__bar { opacity: 1; }
314
+ @media (hover: hover) {
315
+ .b-video:hover .b-video__bar { opacity: 1; }
316
+ }
309
317
  /* A touch screen has no hover, so the bar would otherwise appear only by
310
318
  pausing — which is exactly when someone full screen cannot reach it. */
311
319
  @media (hover: none) {
@@ -327,7 +335,9 @@
327
335
  cursor: pointer;
328
336
  transition: background var(--b-duration-fast) var(--b-ease-out);
329
337
  }
330
- .b-video__btn:hover { background: rgb(255 255 255 / 0.18); }
338
+ @media (hover: hover) {
339
+ .b-video__btn:hover { background: rgb(255 255 255 / 0.18); }
340
+ }
331
341
  .b-video__btn svg { width: 1.5rem; height: 1.5rem; fill: currentColor; }
332
342
 
333
343
  .b-video__time {
@@ -362,7 +372,9 @@
362
372
  color: #fff;
363
373
  background: transparent;
364
374
  }
365
- .b-media-controls .b-icon-btn:hover { background: rgba(255, 255, 255, 0.16); }
375
+ @media (hover: hover) {
376
+ .b-media-controls .b-icon-btn:hover { background: rgba(255, 255, 255, 0.16); }
377
+ }
366
378
  .b-media-controls .b-slider { flex: 1; }
367
379
  .b-media-controls__time {
368
380
  font-size: var(--b-text-caption);
@@ -554,7 +566,9 @@
554
566
  border-radius: 50%;
555
567
  cursor: pointer;
556
568
  }
557
- .b-upload-preview__remove:hover { background: var(--b-color-danger); }
569
+ @media (hover: hover) {
570
+ .b-upload-preview__remove:hover { background: var(--b-color-danger); }
571
+ }
558
572
  .b-upload-preview .b-progress {
559
573
  position: absolute;
560
574
  inset-inline: 0.4rem;
@@ -94,7 +94,9 @@
94
94
  cursor: pointer;
95
95
  text-align: start;
96
96
  }
97
- .b-mobile-menu :is(a, button):hover { background: var(--b-fill-tertiary); text-decoration: none; }
97
+ @media (hover: hover) {
98
+ .b-mobile-menu :is(a, button):hover { background: var(--b-fill-tertiary); text-decoration: none; }
99
+ }
98
100
  .b-mobile-menu .is-active { color: var(--b-color-accent-text); background: var(--b-color-accent-soft); }
99
101
 
100
102
  /* ---- Mobile Toolbar (bottom action bar) --------------------------------------- */
@@ -42,7 +42,9 @@
42
42
  font-size: var(--b-text-callout);
43
43
  color: var(--b-text);
44
44
  }
45
- .b-topnav__brand:hover { text-decoration: none; }
45
+ @media (hover: hover) {
46
+ .b-topnav__brand:hover { text-decoration: none; }
47
+ }
46
48
  .b-topnav__links {
47
49
  display: flex;
48
50
  align-items: center;
@@ -62,7 +64,9 @@
62
64
  border-radius: var(--b-radius-md);
63
65
  transition: color var(--b-duration-fast), background var(--b-duration-fast);
64
66
  }
65
- .b-topnav__link:hover { color: var(--b-text); background: var(--b-fill-tertiary); text-decoration: none; }
67
+ @media (hover: hover) {
68
+ .b-topnav__link:hover { color: var(--b-text); background: var(--b-fill-tertiary); text-decoration: none; }
69
+ }
66
70
  .b-topnav__link.is-active { color: var(--b-color-accent-text); background: var(--b-color-accent-soft); }
67
71
  /* Trailing controls keep their size. A button that shrinks below its touch
68
72
  target is not a button anyone can press. */
@@ -138,7 +142,7 @@
138
142
  display: flex;
139
143
  align-items: center;
140
144
  gap: var(--b-space-2);
141
- padding: var(--b-space-2) var(--b-space-3);
145
+ padding: var(--b-item-py) var(--b-item-px);
142
146
  font-size: var(--b-text-subheadline);
143
147
  font-weight: var(--b-weight-medium);
144
148
  color: var(--b-text-secondary);
@@ -146,7 +150,9 @@
146
150
  cursor: pointer;
147
151
  transition: background var(--b-duration-fast), color var(--b-duration-fast);
148
152
  }
149
- .b-sidebar__item:hover { background: var(--b-fill-tertiary); color: var(--b-text); text-decoration: none; }
153
+ @media (hover: hover) {
154
+ .b-sidebar__item:hover { background: var(--b-fill-tertiary); color: var(--b-text); text-decoration: none; }
155
+ }
150
156
  .b-sidebar__item.is-active {
151
157
  background: var(--b-color-accent-soft);
152
158
  color: var(--b-color-accent-text);
@@ -196,7 +202,9 @@
196
202
  cursor: pointer;
197
203
  }
198
204
  .b-rail__item svg { width: 1.35rem; height: 1.35rem; }
199
- .b-rail__item:hover { background: var(--b-fill-tertiary); color: var(--b-text); text-decoration: none; }
205
+ @media (hover: hover) {
206
+ .b-rail__item:hover { background: var(--b-fill-tertiary); color: var(--b-text); text-decoration: none; }
207
+ }
200
208
  .b-rail__item.is-active { color: var(--b-color-accent-text); background: var(--b-color-accent-soft); }
201
209
 
202
210
  /* ---- Bottom Navigation / Bottom Tab Bar --------------------------------- */
@@ -215,6 +223,24 @@
215
223
  border-top: 1px solid light-dark(rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.04));
216
224
  box-shadow: var(--b-glass-ambient);
217
225
  }
226
+ /* Press feedback for the rows a finger taps; the hover fill is for pointers. */
227
+ :is(.b-menu__item, .b-sidebar__item, .b-rail__item, .b-cmdk__item, .b-bottomnav__item, .b-tab):active {
228
+ background: var(--b-fill-secondary);
229
+ transition: none;
230
+ }
231
+
232
+ /* The reserve. A fixed tab bar covers the last 58px of whatever scrolls
233
+ under it, and every page used to hand-write a spacer for it. When a
234
+ bottom nav is on the page, every scroll pane keeps that much clear, and
235
+ a toast or a FAB stands above it. */
236
+ :root:has(.b-bottomnav) { --b-bottomnav-h: 3.75rem; }
237
+ :root:has(.b-bottomnav) :is(.b-scroll-area, .b-workspace__main),
238
+ :root:has(.b-bottomnav) body:not(:has(.b-stage)) {
239
+ padding-block-end: calc(var(--b-bottomnav-h) + env(safe-area-inset-bottom));
240
+ scroll-padding-block-end: var(--b-bottomnav-h);
241
+ }
242
+ /* Tucked away while somebody reads, one row of it left to pull back. */
243
+ .b-bottomnav.is-minimized { translate: 0 calc(100% - var(--b-space-6)); }
218
244
  .b-bottomnav::before {
219
245
  content: "";
220
246
  position: absolute;
@@ -237,8 +263,12 @@
237
263
  }
238
264
  .b-bottomnav__item svg { width: 1.4rem; height: 1.4rem; }
239
265
  .b-bottomnav__item.is-active { color: var(--b-color-accent-text); }
240
- .b-bottomnav__item:hover { text-decoration: none; color: var(--b-text-secondary); }
241
- .b-bottomnav__item.is-active:hover { color: var(--b-color-accent-text); }
266
+ @media (hover: hover) {
267
+ .b-bottomnav__item:hover { text-decoration: none; color: var(--b-text-secondary); }
268
+ }
269
+ @media (hover: hover) {
270
+ .b-bottomnav__item.is-active:hover { color: var(--b-color-accent-text); }
271
+ }
242
272
 
243
273
  /* ---- Tab Bar (segmented, iOS-style) ------------------------------------- */
244
274
  .b-segmented {
@@ -269,7 +299,9 @@
269
299
  transition: background var(--b-duration-fast), color var(--b-duration-fast),
270
300
  box-shadow var(--b-duration-fast);
271
301
  }
272
- .b-segmented__item:hover { color: var(--b-text); }
302
+ @media (hover: hover) {
303
+ .b-segmented__item:hover { color: var(--b-text); }
304
+ }
273
305
  .b-segmented__item.is-active, .b-segmented__item[aria-selected="true"] {
274
306
  color: var(--b-text);
275
307
  background: light-dark(#ffffff, var(--b-surface-3));
@@ -298,7 +330,7 @@
298
330
  .b-tabs::-webkit-scrollbar { display: none; }
299
331
  .b-tab {
300
332
  position: relative;
301
- padding: var(--b-space-2) var(--b-space-3);
333
+ padding: var(--b-item-py) var(--b-item-px);
302
334
  font-size: var(--b-text-subheadline);
303
335
  font-weight: var(--b-weight-medium);
304
336
  color: var(--b-text-secondary);
@@ -309,7 +341,9 @@
309
341
  white-space: nowrap;
310
342
  transition: color var(--b-duration-fast);
311
343
  }
312
- .b-tab:hover { color: var(--b-text); background: var(--b-fill-quaternary); text-decoration: none; }
344
+ @media (hover: hover) {
345
+ .b-tab:hover { color: var(--b-text); background: var(--b-fill-quaternary); text-decoration: none; }
346
+ }
313
347
  .b-tab.is-active, .b-tab[aria-selected="true"] { color: var(--b-color-accent-text); }
314
348
  .b-tab.is-active::after, .b-tab[aria-selected="true"]::after {
315
349
  content: "";
@@ -341,8 +375,28 @@
341
375
  padding-inline: var(--b-space-1);
342
376
  }
343
377
  .b-breadcrumbs a:not(.b-btn) { color: var(--b-text-secondary); }
344
- .b-breadcrumbs a:hover { color: var(--b-text); text-decoration: none; }
378
+ @media (hover: hover) {
379
+ .b-breadcrumbs a:hover { color: var(--b-text); text-decoration: none; }
380
+ }
345
381
  .b-breadcrumbs [aria-current="page"] { color: var(--b-text); font-weight: var(--b-weight-medium); }
382
+ /* A deep path never wraps. --collapse keeps the first crumb and the last
383
+ two and folds the middle into an overflow crumb, which is a .b-dropdown
384
+ listing the hidden ones. Under 768px the CSS does the folding on its
385
+ own; data-b-breadcrumbs measures the row and folds only what does not
386
+ fit at any width. */
387
+ .b-breadcrumbs--collapse { flex-wrap: nowrap; min-width: 0; overflow: hidden; }
388
+ .b-breadcrumbs--collapse li { min-width: 0; flex: none; }
389
+ /* The current page is the last thing to give: it may ellipsise, but not
390
+ below six characters, so the middle folds first. */
391
+ .b-breadcrumbs--collapse li:last-child { flex: 0 1 auto; min-width: 6ch; }
392
+ .b-breadcrumbs--collapse li > a,
393
+ .b-breadcrumbs--collapse [aria-current="page"] { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
394
+ .b-breadcrumbs--collapse li.is-collapsed { display: none; }
395
+ .b-breadcrumbs__overflow { position: relative; }
396
+ .b-breadcrumbs__overflow > .b-dropdown > summary { display: inline-flex; }
397
+ @media (max-width: 767px) {
398
+ .b-breadcrumbs--collapse:not([data-b-breadcrumbs-armed]) li:not(:first-child):not(.b-breadcrumbs__overflow):not(:nth-last-child(-n+2)) { display: none; }
399
+ }
346
400
 
347
401
  /* ---- Pagination ----------------------------------------------------------- */
348
402
  .b-pagination {
@@ -369,7 +423,9 @@
369
423
  background: none;
370
424
  cursor: pointer;
371
425
  }
372
- .b-pagination__item:hover { background: var(--b-fill-tertiary); color: var(--b-text); text-decoration: none; }
426
+ @media (hover: hover) {
427
+ .b-pagination__item:hover { background: var(--b-fill-tertiary); color: var(--b-text); text-decoration: none; }
428
+ }
373
429
  .b-pagination__item.is-active, .b-pagination__item[aria-current="page"] {
374
430
  color: var(--b-color-on-accent);
375
431
  background: var(--b-color-accent-fill);
@@ -451,11 +507,16 @@
451
507
  cursor: pointer;
452
508
  color: var(--b-text);
453
509
  }
454
- .b-menubar__item:hover, .b-menubar__item.is-active,
455
- .b-menubar__item[aria-expanded="true"] {
510
+ .b-menubar__item.is-active, .b-menubar__item[aria-expanded="true"] {
456
511
  background: var(--b-color-accent-fill);
457
512
  color: var(--b-color-on-accent);
458
513
  }
514
+ @media (hover: hover) {
515
+ .b-menubar__item:hover {
516
+ background: var(--b-color-accent-fill);
517
+ color: var(--b-color-on-accent);
518
+ }
519
+ }
459
520
 
460
521
  /* ---- Menu (dropdown / context / action) ------------------------------------
461
522
  Works with [popover] or .b-menu inside a positioned wrapper.
@@ -497,7 +558,7 @@
497
558
  align-items: center;
498
559
  gap: var(--b-space-2);
499
560
  width: 100%;
500
- padding: var(--b-space-2) var(--b-space-3);
561
+ padding: var(--b-item-py) var(--b-item-px);
501
562
  font-size: var(--b-text-subheadline);
502
563
  text-align: start;
503
564
  color: var(--b-text);
@@ -507,19 +568,30 @@
507
568
  cursor: pointer;
508
569
  white-space: nowrap;
509
570
  }
510
- .b-menu__item:hover, .b-menu__item.is-active {
571
+ .b-menu__item.is-active {
511
572
  background: var(--b-color-accent-fill);
512
573
  color: var(--b-color-on-accent);
513
574
  text-decoration: none;
514
575
  }
515
- .b-menu__item:hover .b-menu__shortcut { color: rgba(255, 255, 255, 0.75); }
576
+ @media (hover: hover) {
577
+ .b-menu__item:hover {
578
+ background: var(--b-color-accent-fill);
579
+ color: var(--b-color-on-accent);
580
+ text-decoration: none;
581
+ }
582
+ }
583
+ @media (hover: hover) {
584
+ .b-menu__item:hover .b-menu__shortcut { color: rgba(255, 255, 255, 0.75); }
585
+ }
516
586
  .b-menu__item.is-disabled, .b-menu__item:disabled {
517
587
  color: var(--b-text-tertiary);
518
588
  background: none;
519
589
  cursor: not-allowed;
520
590
  }
521
591
  .b-menu__item--danger { color: var(--b-color-danger-text); }
522
- .b-menu__item--danger:hover { background: var(--b-color-danger); color: #fff; }
592
+ @media (hover: hover) {
593
+ .b-menu__item--danger:hover { background: var(--b-color-danger-fill); color: var(--b-color-on-danger); }
594
+ }
523
595
  .b-menu__item svg { width: 1rem; height: 1rem; flex: none; opacity: 0.85; }
524
596
  .b-menu__shortcut {
525
597
  margin-inline-start: auto;
@@ -542,9 +614,13 @@
542
614
  display: none;
543
615
  z-index: 1;
544
616
  }
545
- .b-menu__sub:hover > .b-menu,
546
617
  .b-menu__sub:focus-within > .b-menu { display: block; }
547
- .b-menu__sub:hover > .b-menu__item { background: var(--b-color-accent-fill); color: var(--b-color-on-accent); }
618
+ @media (hover: hover) {
619
+ .b-menu__sub:hover > .b-menu { display: block; }
620
+ }
621
+ @media (hover: hover) {
622
+ .b-menu__sub:hover > .b-menu__item { background: var(--b-color-accent-fill); color: var(--b-color-on-accent); }
623
+ }
548
624
 
549
625
  .b-menu__separator {
550
626
  height: 1px;
@@ -643,7 +719,7 @@
643
719
  align-items: center;
644
720
  gap: var(--b-space-3);
645
721
  width: 100%;
646
- padding: var(--b-space-2) var(--b-space-3);
722
+ padding: var(--b-item-py) var(--b-item-px);
647
723
  font-size: var(--b-text-subheadline);
648
724
  text-align: start;
649
725
  color: var(--b-text);
@@ -652,7 +728,9 @@
652
728
  border-radius: var(--b-radius-md);
653
729
  cursor: pointer;
654
730
  }
655
- .b-cmdk__item:hover { background: var(--b-fill-quaternary); }
731
+ @media (hover: hover) {
732
+ .b-cmdk__item:hover { background: var(--b-fill-quaternary); }
733
+ }
656
734
  .b-cmdk__item.is-active { background: var(--b-color-accent-soft); color: var(--b-color-accent-text); }
657
735
  .b-cmdk__item svg { width: 1.1rem; height: 1.1rem; opacity: 0.8; }
658
736
  .b-cmdk__item kbd { margin-inline-start: auto; }
@@ -95,7 +95,9 @@
95
95
  cursor: pointer;
96
96
  transition: background var(--b-duration-fast);
97
97
  }
98
- .b-modal__close:hover { background: var(--b-fill-secondary); color: var(--b-text); }
98
+ @media (hover: hover) {
99
+ .b-modal__close:hover { background: var(--b-fill-secondary); color: var(--b-text); }
100
+ }
99
101
 
100
102
  /* ---- Alert Dialog (centered, compact) --------------------------------------- */
101
103
  /* Composed onto .b-modal like .b-cmdk; explicit so a reorder cannot break it. */
@@ -124,7 +126,9 @@
124
126
  border: none;
125
127
  cursor: pointer;
126
128
  }
127
- .b-alert-dialog__actions button:hover { background: var(--b-fill-quaternary); }
129
+ @media (hover: hover) {
130
+ .b-alert-dialog__actions button:hover { background: var(--b-fill-quaternary); }
131
+ }
128
132
  .b-alert-dialog__actions button + button { border-top: 1px solid var(--b-separator); }
129
133
  .b-alert-dialog__actions .is-destructive { color: var(--b-color-danger-text); }
130
134
  .b-alert-dialog__actions .is-primary { font-weight: var(--b-weight-semibold); }
@@ -305,8 +309,11 @@
305
309
  cursor: pointer;
306
310
  }
307
311
  .b-action-sheet__group button:first-child { border-top: none; }
308
- .b-action-sheet__group button:hover { background: var(--b-fill-quaternary); }
312
+ @media (hover: hover) {
313
+ .b-action-sheet__group button:hover { background: var(--b-fill-quaternary); }
314
+ }
309
315
  .b-action-sheet__group button.is-destructive { color: var(--b-color-danger-text); }
316
+ .b-action-sheet__group button:active { background: var(--b-fill-secondary); transition: none; }
310
317
  .b-action-sheet__cancel {
311
318
  margin-block-start: var(--b-space-2);
312
319
  font-weight: var(--b-weight-semibold);
@@ -451,18 +458,26 @@
451
458
  transition: opacity var(--b-duration-fast) var(--b-ease-out),
452
459
  translate var(--b-duration-fast) var(--b-ease-out);
453
460
  }
454
- .b-tooltip-host:hover::after,
455
461
  .b-tooltip-host:focus-visible::after {
456
462
  opacity: 1;
457
463
  translate: -50% 0;
458
464
  transition-delay: 350ms;
459
465
  }
466
+ @media (hover: hover) {
467
+ .b-tooltip-host:hover::after {
468
+ opacity: 1;
469
+ translate: -50% 0;
470
+ transition-delay: 350ms;
471
+ }
472
+ }
460
473
  .b-tooltip-host--bottom::after {
461
474
  inset-block-end: auto;
462
475
  inset-block-start: calc(100% + var(--b-space-2));
463
476
  translate: -50% -4px;
464
477
  }
465
- .b-tooltip-host--bottom:hover::after { translate: -50% 0; }
478
+ @media (hover: hover) {
479
+ .b-tooltip-host--bottom:hover::after { translate: -50% 0; }
480
+ }
466
481
 
467
482
  /* ---- Hover Card ----------------------------------------------------------------------- */
468
483
  .b-hover-card-host { position: relative; display: inline-block; }
@@ -495,13 +510,20 @@
495
510
  box-shadow: var(--b-glass-edge);
496
511
  pointer-events: none;
497
512
  }
498
- .b-hover-card-host:hover .b-hover-card,
499
513
  .b-hover-card-host:focus-within .b-hover-card {
500
514
  opacity: 1;
501
515
  translate: 0 0;
502
516
  visibility: visible;
503
517
  transition-delay: 250ms;
504
518
  }
519
+ @media (hover: hover) {
520
+ .b-hover-card-host:hover .b-hover-card {
521
+ opacity: 1;
522
+ translate: 0 0;
523
+ visibility: visible;
524
+ transition-delay: 250ms;
525
+ }
526
+ }
505
527
 
506
528
  /* ---- Lightbox --------------------------------------------------------------------------- */
507
529
  .b-lightbox {
@@ -156,7 +156,9 @@
156
156
  cursor: grab;
157
157
  transition: box-shadow var(--b-duration-fast), translate var(--b-duration-fast) var(--b-ease-out);
158
158
  }
159
- .b-task:hover { box-shadow: var(--b-shadow-sm); translate: 0 -1px; }
159
+ @media (hover: hover) {
160
+ .b-task:hover { box-shadow: var(--b-shadow-sm); translate: 0 -1px; }
161
+ }
160
162
  .b-task.is-dragging { opacity: 0.55; rotate: 2deg; cursor: grabbing; }
161
163
  .b-task__title { font-size: var(--b-text-footnote); font-weight: var(--b-weight-medium); }
162
164
  .b-task__meta {
@@ -177,7 +179,9 @@
177
179
  border-radius: var(--b-radius-md);
178
180
  font-size: var(--b-text-subheadline);
179
181
  }
180
- .b-task-row:hover { background: var(--b-fill-quaternary); }
182
+ @media (hover: hover) {
183
+ .b-task-row:hover { background: var(--b-fill-quaternary); }
184
+ }
181
185
  .b-task-row.is-done .b-task-row__title {
182
186
  color: var(--b-text-tertiary);
183
187
  text-decoration: line-through;
@@ -294,7 +298,9 @@
294
298
  cursor: pointer;
295
299
  transition: filter var(--b-duration-fast);
296
300
  }
297
- .b-gantt__bar:hover { filter: brightness(1.1); }
301
+ @media (hover: hover) {
302
+ .b-gantt__bar:hover { filter: brightness(1.1); }
303
+ }
298
304
  .b-gantt__bar > i {
299
305
  position: absolute;
300
306
  inset: 0;
@@ -384,7 +390,9 @@
384
390
  color: var(--b-text);
385
391
  cursor: pointer;
386
392
  }
387
- .b-app-tile:hover { text-decoration: none; }
393
+ @media (hover: hover) {
394
+ .b-app-tile:hover { text-decoration: none; }
395
+ }
388
396
  .b-app-tile__icon {
389
397
  display: grid;
390
398
  place-items: center;
@@ -396,7 +404,9 @@
396
404
  box-shadow: var(--b-glass-edge), var(--b-shadow-sm);
397
405
  transition: scale var(--b-duration-fast) var(--b-ease-bounce);
398
406
  }
399
- .b-app-tile:hover .b-app-tile__icon { scale: 1.06; }
407
+ @media (hover: hover) {
408
+ .b-app-tile:hover .b-app-tile__icon { scale: 1.06; }
409
+ }
400
410
  .b-app-tile:active .b-app-tile__icon { scale: 0.94; }
401
411
  .b-app-tile__label {
402
412
  font-size: var(--b-text-caption);
@@ -447,7 +457,9 @@
447
457
  transition: scale var(--b-duration-fast) var(--b-ease-bounce),
448
458
  translate var(--b-duration-fast) var(--b-ease-bounce);
449
459
  }
450
- .b-dock__item:hover { scale: 1.28; translate: 0 -6px; }
460
+ @media (hover: hover) {
461
+ .b-dock__item:hover { scale: 1.28; translate: 0 -6px; }
462
+ }
451
463
  .b-dock__item.is-active { position: relative; }
452
464
  .b-dock__item.is-active::after {
453
465
  content: "";
@@ -533,7 +545,9 @@
533
545
  padding: var(--b-space-1);
534
546
  border-radius: var(--b-radius-xs);
535
547
  }
536
- .b-drag-handle:hover { color: var(--b-text-secondary); background: var(--b-fill-quaternary); }
548
+ @media (hover: hover) {
549
+ .b-drag-handle:hover { color: var(--b-text-secondary); background: var(--b-fill-quaternary); }
550
+ }
537
551
  .b-drag-handle:active { cursor: grabbing; }
538
552
  .b-drag-ghost { opacity: 0.5; }
539
553
  .b-drop-indicator {