| 205 |
205 |
|
--radius-md: 4px;
|
| 206 |
206 |
|
--radius-round: 50%;
|
| 207 |
207 |
|
|
| 208 |
|
- |
/* Shadow scale */
|
|
208 |
+ |
/* Shadow scale.
|
|
209 |
+ |
--shadow-1/-2/-3 are blurred elevation (true floating: popovers,
|
|
210 |
+ |
dropdowns, modals). --shadow-raised/-card/-inset are hard-offset
|
|
211 |
+ |
"sticker on paper" depth for everyday affordance — buttons feel
|
|
212 |
+ |
pressable, cards feel layered, inputs feel recessed. Pick by role:
|
|
213 |
+ |
blurred = floats over page, hard-offset = is part of page. */
|
|
214 |
+ |
--shadow-edge: #bbb; /* heavier — pressable (button, tab) */
|
|
215 |
+ |
--shadow-edge-soft: #ddd; /* lighter — surface (card, input) */
|
|
216 |
+ |
--shadow-raised: 2px 2px var(--shadow-edge);
|
|
217 |
+ |
--shadow-card: 2px 2px var(--shadow-edge-soft);
|
|
218 |
+ |
--shadow-inset: inset 2px 2px var(--shadow-edge-soft);
|
| 209 |
219 |
|
--shadow-1: 0 1px 3px rgba(0, 0, 0, 0.06);
|
| 210 |
220 |
|
--shadow-2: 0 2px 8px rgba(0, 0, 0, 0.10);
|
| 211 |
221 |
|
--shadow-3: 0 4px 12px rgba(0, 0, 0, 0.15);
|
| 359 |
369 |
|
border: 1px solid var(--detail);
|
| 360 |
370 |
|
font-family: inherit;
|
| 361 |
371 |
|
cursor: pointer;
|
| 362 |
|
- |
transition: opacity 0.2s ease;
|
|
372 |
+ |
box-shadow: var(--shadow-raised);
|
|
373 |
+ |
transition: box-shadow 0.1s ease, transform 0.05s ease;
|
| 363 |
374 |
|
}
|
| 364 |
375 |
|
|
| 365 |
376 |
|
button:hover {
|
| 366 |
|
- |
opacity: 0.8;
|
|
377 |
+ |
box-shadow: 3px 3px var(--shadow-edge);
|
|
378 |
+ |
}
|
|
379 |
+ |
|
|
380 |
+ |
button:active {
|
|
381 |
+ |
box-shadow: none;
|
|
382 |
+ |
transform: translate(2px, 2px);
|
| 367 |
383 |
|
}
|
| 368 |
384 |
|
|
| 369 |
385 |
|
.btn-primary {
|
| 374 |
390 |
|
font-family: inherit;
|
| 375 |
391 |
|
font-size: 1rem;
|
| 376 |
392 |
|
cursor: pointer;
|
| 377 |
|
- |
transition: opacity 0.2s ease;
|
|
393 |
+ |
box-shadow: var(--shadow-raised);
|
|
394 |
+ |
transition: box-shadow 0.1s ease, transform 0.05s ease;
|
| 378 |
395 |
|
display: inline-block;
|
| 379 |
396 |
|
text-decoration: none;
|
| 380 |
397 |
|
}
|
| 381 |
398 |
|
|
| 382 |
399 |
|
.btn-primary:hover {
|
| 383 |
|
- |
opacity: 0.8;
|
|
400 |
+ |
box-shadow: 3px 3px var(--shadow-edge);
|
| 384 |
401 |
|
text-decoration: none;
|
| 385 |
402 |
|
}
|
| 386 |
403 |
|
|
|
404 |
+ |
.btn-primary:active {
|
|
405 |
+ |
box-shadow: none;
|
|
406 |
+ |
transform: translate(2px, 2px);
|
|
407 |
+ |
}
|
|
408 |
+ |
|
| 387 |
409 |
|
.btn-secondary {
|
| 388 |
410 |
|
background: var(--surface-muted);
|
| 389 |
411 |
|
color: var(--detail);
|
| 392 |
414 |
|
font-family: var(--font-mono);
|
| 393 |
415 |
|
font-size: 1rem;
|
| 394 |
416 |
|
cursor: pointer;
|
| 395 |
|
- |
transition: opacity 0.2s ease;
|
|
417 |
+ |
box-shadow: var(--shadow-raised);
|
|
418 |
+ |
transition: box-shadow 0.1s ease, transform 0.05s ease;
|
| 396 |
419 |
|
display: inline-block;
|
| 397 |
420 |
|
text-decoration: none;
|
| 398 |
421 |
|
}
|
| 399 |
422 |
|
|
| 400 |
423 |
|
.btn-secondary:hover {
|
| 401 |
|
- |
opacity: 0.8;
|
|
424 |
+ |
box-shadow: 3px 3px var(--shadow-edge);
|
| 402 |
425 |
|
text-decoration: none;
|
| 403 |
426 |
|
}
|
| 404 |
427 |
|
|
|
428 |
+ |
.btn-secondary:active {
|
|
429 |
+ |
box-shadow: none;
|
|
430 |
+ |
transform: translate(2px, 2px);
|
|
431 |
+ |
}
|
|
432 |
+ |
|
| 405 |
433 |
|
.btn-danger {
|
| 406 |
434 |
|
background: var(--danger);
|
| 407 |
435 |
|
color: var(--primary-light);
|
| 410 |
438 |
|
font-family: var(--font-mono);
|
| 411 |
439 |
|
font-size: 1rem;
|
| 412 |
440 |
|
cursor: pointer;
|
| 413 |
|
- |
transition: opacity 0.2s ease;
|
|
441 |
+ |
box-shadow: var(--shadow-raised);
|
|
442 |
+ |
transition: box-shadow 0.1s ease, transform 0.05s ease;
|
| 414 |
443 |
|
display: inline-block;
|
| 415 |
444 |
|
text-decoration: none;
|
| 416 |
445 |
|
}
|
| 417 |
446 |
|
|
| 418 |
447 |
|
.btn-danger:hover {
|
| 419 |
|
- |
opacity: 0.8;
|
|
448 |
+ |
box-shadow: 3px 3px var(--shadow-edge);
|
| 420 |
449 |
|
text-decoration: none;
|
| 421 |
450 |
|
}
|
| 422 |
451 |
|
|
|
452 |
+ |
.btn-danger:active {
|
|
453 |
+ |
box-shadow: none;
|
|
454 |
+ |
transform: translate(2px, 2px);
|
|
455 |
+ |
}
|
|
456 |
+ |
|
| 423 |
457 |
|
/* Disabled state for all button variants (charter rule).
|
| 424 |
458 |
|
Applies whether disabled via attribute or aria-disabled. */
|
| 425 |
459 |
|
button:disabled,
|
| 429 |
463 |
|
.btn-danger:disabled {
|
| 430 |
464 |
|
opacity: 0.5;
|
| 431 |
465 |
|
cursor: not-allowed;
|
|
466 |
+ |
box-shadow: none;
|
|
467 |
+ |
transform: none;
|
| 432 |
468 |
|
}
|
| 433 |
469 |
|
|
| 434 |
470 |
|
/* Button size + style modifiers (charter: docs/design-system.md).
|
| 470 |
506 |
|
font-family: var(--font-mono);
|
| 471 |
507 |
|
font-size: 1rem;
|
| 472 |
508 |
|
cursor: pointer;
|
|
509 |
+ |
/* Link semantics — flat, no depth. Overrides the shadow that would
|
|
510 |
+ |
otherwise cascade from `button` / `form button` when a .btn--link
|
|
511 |
+ |
happens to be a <button> inside a <form> (e.g. logout). */
|
|
512 |
+ |
box-shadow: none;
|
| 473 |
513 |
|
transition: opacity 0.2s ease;
|
| 474 |
514 |
|
}
|
| 475 |
515 |
|
|
| 476 |
516 |
|
.btn--link:hover {
|
| 477 |
517 |
|
opacity: 0.6;
|
|
518 |
+ |
box-shadow: none;
|
|
519 |
+ |
}
|
|
520 |
+ |
|
|
521 |
+ |
.btn--link:active {
|
|
522 |
+ |
box-shadow: none;
|
|
523 |
+ |
transform: none;
|
|
524 |
+ |
}
|
|
525 |
+ |
|
|
526 |
+ |
/* Menu / disclosure openers — buttons whose job is to reveal a menu,
|
|
527 |
+ |
filter panel, expander, or popover. They navigate UI, they don't
|
|
528 |
+ |
commit anything, so they override the base `button` depth-lift back
|
|
529 |
+ |
to flat. Add new opener selectors here as they appear. */
|
|
530 |
+ |
.context-menu-btn,
|
|
531 |
+ |
.discover-filter-toggle,
|
|
532 |
+ |
.tip-toggle,
|
|
533 |
+ |
.bundle-toggle {
|
|
534 |
+ |
box-shadow: none;
|
|
535 |
+ |
}
|
|
536 |
+ |
|
|
537 |
+ |
.context-menu-btn:hover,
|
|
538 |
+ |
.discover-filter-toggle:hover,
|
|
539 |
+ |
.tip-toggle:hover,
|
|
540 |
+ |
.bundle-toggle:hover {
|
|
541 |
+ |
box-shadow: none;
|
|
542 |
+ |
}
|
|
543 |
+ |
|
|
544 |
+ |
.context-menu-btn:active,
|
|
545 |
+ |
.discover-filter-toggle:active,
|
|
546 |
+ |
.tip-toggle:active,
|
|
547 |
+ |
.bundle-toggle:active {
|
|
548 |
+ |
box-shadow: none;
|
|
549 |
+ |
transform: none;
|
| 478 |
550 |
|
}
|
| 479 |
551 |
|
|
| 480 |
552 |
|
/* ===========================================
|
| 509 |
581 |
|
select {
|
| 510 |
582 |
|
width: 100%;
|
| 511 |
583 |
|
background: var(--input-background);
|
| 512 |
|
- |
border: none;
|
|
584 |
+ |
border: 1px solid var(--border);
|
| 513 |
585 |
|
padding: 0.75rem;
|
| 514 |
586 |
|
font-family: var(--font-mono);
|
| 515 |
587 |
|
font-size: 0.9rem;
|
| 516 |
588 |
|
color: var(--detail);
|
|
589 |
+ |
box-shadow: var(--shadow-inset);
|
| 517 |
590 |
|
}
|
| 518 |
591 |
|
|
| 519 |
592 |
|
input::placeholder,
|
| 528 |
601 |
|
textarea:focus,
|
| 529 |
602 |
|
select:focus {
|
| 530 |
603 |
|
outline: none;
|
| 531 |
|
- |
border: 2px solid var(--highlight);
|
|
604 |
+ |
border: 1px solid var(--highlight);
|
| 532 |
605 |
|
}
|
| 533 |
606 |
|
|
| 534 |
607 |
|
textarea {
|
| 549 |
622 |
|
padding: 12px 24px;
|
| 550 |
623 |
|
border: 1px solid var(--detail);
|
| 551 |
624 |
|
cursor: pointer;
|
|
625 |
+ |
box-shadow: var(--shadow-raised);
|
|
626 |
+ |
transition: box-shadow 0.1s ease, transform 0.05s ease, background 0.2s ease;
|
| 552 |
627 |
|
}
|
| 553 |
628 |
|
|
| 554 |
629 |
|
input[type="submit"]:hover,
|
| 555 |
630 |
|
form button:hover {
|
| 556 |
631 |
|
background: var(--background);
|
|
632 |
+ |
box-shadow: 3px 3px var(--shadow-edge);
|
|
633 |
+ |
}
|
|
634 |
+ |
|
|
635 |
+ |
input[type="submit"]:active,
|
|
636 |
+ |
form button:active {
|
|
637 |
+ |
box-shadow: none;
|
|
638 |
+ |
transform: translate(2px, 2px);
|
| 557 |
639 |
|
}
|
| 558 |
640 |
|
|
| 559 |
641 |
|
.form-group {
|
| 671 |
753 |
|
font-family: var(--font-mono);
|
| 672 |
754 |
|
font-size: 1rem;
|
| 673 |
755 |
|
cursor: pointer;
|
|
756 |
+ |
/* Tabs navigate, they don't commit — stay flat. Overrides the base
|
|
757 |
+ |
`button` shadow if a tab is a <button>. */
|
|
758 |
+ |
box-shadow: none;
|
| 674 |
759 |
|
transition:
|
| 675 |
760 |
|
background 0.2s ease,
|
| 676 |
761 |
|
opacity 0.2s ease;
|
| 701 |
786 |
|
background: var(--background);
|
| 702 |
787 |
|
border: 1px solid var(--border);
|
| 703 |
788 |
|
min-width: 180px;
|
| 704 |
|
- |
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
789 |
+ |
box-shadow: var(--shadow-2);
|
| 705 |
790 |
|
}
|
| 706 |
791 |
|
|
| 707 |
792 |
|
.tab-overflow-menu .tab {
|
| 1001 |
1086 |
|
text-decoration: none;
|
| 1002 |
1087 |
|
color: var(--detail);
|
| 1003 |
1088 |
|
display: block;
|
|
1089 |
+ |
border: 1px solid var(--border);
|
|
1090 |
+ |
box-shadow: var(--shadow-card);
|
| 1004 |
1091 |
|
transition: background 0.2s ease;
|
| 1005 |
1092 |
|
}
|
| 1006 |
1093 |
|
|
| 10135 |
10222 |
|
top: 100%;
|
| 10136 |
10223 |
|
background: var(--light-background);
|
| 10137 |
10224 |
|
border: 1px solid var(--border);
|
| 10138 |
|
- |
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
10225 |
+ |
box-shadow: var(--shadow-2);
|
| 10139 |
10226 |
|
min-width: 160px;
|
| 10140 |
10227 |
|
z-index: 100;
|
| 10141 |
10228 |
|
}
|