@planningcenter/topbar 12.4.1 → 12.5.0-qa-988.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.
package/dist/topbar.css CHANGED
@@ -16,6 +16,12 @@
16
16
  --topbar-nav-link-background-color-hover: var(--t-fill-color-transparency-light-040);
17
17
  --topbar-nav-link-background-color-active: var(--t-fill-color-transparency-light-060);
18
18
  --topbar-nav-link-border-color-active: var(--t-fill-color-transparency-light-030);
19
+ --topbar-app-menu-margin-left: var(--t-spacing-2);
20
+ --topbar-app-menu-padding-x: var(--t-spacing-half);
21
+ --topbar-app-menu-offset: calc(
22
+ var(--topbar-app-menu-padding-x) - var(--t-spacing-1) * 2 - var(--t-border-width)
23
+ );
24
+ --topbar-action-size: 48px;
19
25
  --toolbar-width: 64px;
20
26
  --toolbar-inner-width: 48px;
21
27
  --toolbar-drawer-width: 360px;
@@ -27,6 +33,7 @@
27
33
  @media (min-width: 600px) {
28
34
  :root {
29
35
  --topbar-height: 64px;
36
+ --topbar-action-size: var(--topbar-nav-link-height);
30
37
  --content-wrap-shadow-dimensions: 0 0 0 1px;
31
38
  }
32
39
  }
@@ -294,29 +301,32 @@ Caused by products overriding .topbar-wrap’s z-index.
294
301
 
295
302
  .button-XMbeQ {
296
303
  --tds-btn-color: var(--topbar-nav-link-font-color);
297
- --tds-btn-bg: var(--t-fill-color-transparency-light-020);
298
- --tds-btn-border-color: var(--topbar-nav-link-border-color);
304
+ --tds-btn-bg: transparent;
305
+ --tds-btn-border-color: transparent;
299
306
  --tds-btn-color-hover: var(--topbar-nav-link-font-color);
300
- --tds-btn-bg-hover: var(--topbar-nav-link-background-color-hover);
301
- --tds-btn-border-color-hover: var(--topbar-nav-link-border-color);
307
+ --tds-btn-bg-hover: transparent;
308
+ --tds-btn-border-color-hover: transparent;
302
309
  --tds-btn-color-active: var(--topbar-nav-link-font-color);
303
- --tds-btn-bg-active: var(--topbar-nav-link-background-color-active);
304
- --tds-btn-border-color-active: var(--topbar-nav-link-border-color-active);
310
+ --tds-btn-bg-active: transparent;
311
+ --tds-btn-border-color-active: transparent;
305
312
  --tds-btn-text-decoration: none;
306
313
  --tds-btn-font-size: var(--t-font-size-md);
307
314
  --tds-btn-font-weight: var(--t-font-weight-semibold);
308
- --tds-btn-line-height: 2;
309
- --tds-btn-min-height: var(--topbar-nav-link-height);
310
- --tds-btn-border-radius: var(--t-border-radius-lg);
311
- --tds-btn-padding-y: 0;
315
+ --tds-btn-padding-x: var(--topbar-app-menu-padding-x);
316
+ --tds-btn-padding-truncated-x: var(--topbar-app-menu-padding-x);
317
+ --tds-btn-padding-y: var(--t-spacing-half);
318
+ gap: 6px;
312
319
  font-family: inherit;
320
+ margin-left: var(--topbar-app-menu-margin-left);
313
321
  }
314
322
  .button-XMbeQ:hover, .button-XMbeQ:focus-visible {
315
323
  --tds-btn-text-decoration: none;
316
324
  }
317
- .button-XMbeQ[aria-expanded=true] {
318
- --tds-btn-bg: var(--topbar-nav-link-background-color-active);
319
- --tds-btn-border-color: var(--topbar-nav-link-border-color-active);
325
+
326
+ .button-XMbeQ svg:first-child {
327
+ width: 24px !important;
328
+ height: 24px !important;
329
+ flex-shrink: 0;
320
330
  }
321
331
 
322
332
  .label-884of {
@@ -329,10 +339,27 @@ Caused by products overriding .topbar-wrap’s z-index.
329
339
  }
330
340
 
331
341
  .chevron-RRg9k {
332
- width: 1em !important;
333
- height: 1em !important;
334
- color: var(--t-icon-color-secondary);
342
+ box-sizing: border-box;
343
+ width: 16px !important;
344
+ height: 16px !important;
345
+ margin-left: -1px;
346
+ padding: var(--t-spacing-fourth);
347
+ border-radius: 100%;
348
+ color: var(--t-text-color);
335
349
  flex-shrink: 0;
350
+ transition: background-color 0.12s ease-in, transform 0.12s ease-in;
351
+ }
352
+ .chevron-RRg9k polygon {
353
+ transform: translateY(0.5px);
354
+ }
355
+ .button-XMbeQ[aria-expanded=true] .chevron-RRg9k {
356
+ background-color: var(--t-fill-color-transparency-light-050);
357
+ transform: rotate(180deg);
358
+ }
359
+ @media (hover: hover) {
360
+ .button-XMbeQ:hover .chevron-RRg9k {
361
+ background-color: var(--t-fill-color-transparency-light-050);
362
+ }
336
363
  }
337
364
  .nav-y-6ML {
338
365
  display: flex;
@@ -343,6 +370,7 @@ Caused by products overriding .topbar-wrap’s z-index.
343
370
  }
344
371
 
345
372
  .popover-content-jOAAY {
373
+ margin-left: var(--topbar-app-menu-offset);
346
374
  min-width: calc(var(--t-spacing-6) * 6);
347
375
  border-radius: var(--t-border-radius-lg);
348
376
  }
@@ -360,11 +388,11 @@ Caused by products overriding .topbar-wrap’s z-index.
360
388
  display: flex;
361
389
  align-items: center;
362
390
  gap: var(--t-spacing-1);
363
- min-height: var(--t-container-size-lg);
391
+ min-height: var(--t-container-size-md);
364
392
  padding: 0 var(--t-spacing-1);
365
393
  border-radius: var(--t-border-radius-lg);
366
394
  font-family: inherit;
367
- font-size: var(--t-font-size-md);
395
+ font-size: var(--t-font-size-sm);
368
396
  font-weight: var(--t-font-weight-semibold);
369
397
  text-decoration: none;
370
398
  color: var(--t-text-color-headline);
@@ -380,6 +408,11 @@ Caused by products overriding .topbar-wrap’s z-index.
380
408
  outline-offset: calc(var(--t-focus-ring-width) * -1);
381
409
  }
382
410
 
411
+ .link-LMp2h svg {
412
+ width: 20px;
413
+ height: 20px;
414
+ }
415
+
383
416
  .current-4U4VL {
384
417
  background: var(--t-fill-color-button-interaction-ghost-active);
385
418
  }
@@ -389,8 +422,7 @@ Caused by products overriding .topbar-wrap’s z-index.
389
422
  }
390
423
 
391
424
  .accounts-item-erJW0 {
392
- margin-top: var(--t-spacing-half);
393
- padding-top: var(--t-spacing-1);
425
+ padding-top: var(--t-spacing-half);
394
426
  border-top: var(--t-border-width) solid var(--t-border-color-dim);
395
427
  }
396
428
 
@@ -504,24 +536,70 @@ Caused by products overriding .topbar-wrap’s z-index.
504
536
  max-height: calc(100% - var(--topbar-height) - var(--t-spacing-3));
505
537
  }
506
538
 
507
- /* Placeholder until design lands: just enough to tell which product is selected. */
508
- .tab-dz8ki[aria-selected="true"] {
509
- background-color: var(--t-fill-color-interaction);
510
- color: var(--t-text-color-inverted);
511
- font-weight: var(--t-font-weight-semibold);
539
+ .searchButton-fYa5- {
540
+ display: inline-flex;
541
+ align-items: center;
542
+ justify-content: center;
543
+ flex-shrink: 0;
544
+ width: var(--topbar-action-size);
545
+ height: var(--topbar-action-size);
546
+ padding: 0;
547
+ margin-right: var(--t-spacing-half);
548
+ background-color: var(--topbar-nav-link-background-color-active);
549
+ color: var(--topbar-nav-link-font-color);
550
+ border: var(--t-border-width) solid var(--topbar-nav-link-border-color-active);
551
+ border-radius: var(--topbar-nav-link-border-radius);
552
+ cursor: pointer;
553
+ transition: var(--topbar-nav-link-transition);
512
554
  }
513
555
 
514
- /* Placeholder until design lands: just enough to see which result is highlighted. */
515
- .result-Thq2C {
516
- display: block;
556
+ /*
557
+ * At phone widths, where the small topbar shows, it sits bare in the header,
558
+ * the same target as the avatar's.
559
+ */
560
+ @media (max-width: 599px) {
561
+ .searchButton-fYa5- {
562
+ margin-right: 0;
563
+ background-color: transparent;
564
+ color: var(--t-text-color-headline);
565
+ border: 0;
566
+ border-radius: 0;
567
+ }
517
568
  }
518
569
 
519
- .result-Thq2C[aria-selected="true"] {
520
- background-color: var(--t-fill-color-interaction);
521
- color: var(--t-text-color-inverted);
570
+ .modal-NR3TO {
571
+ --product-search-padding-inline: var(--t-spacing-2);
572
+ --product-search-padding-block: var(--t-spacing-2);
573
+ --product-search-tab-padding-inline: var(--t-spacing-2);
574
+ --product-search-heading-inset: calc(
575
+ var(--product-search-tab-padding-inline) + var(--t-border-width)
576
+ );
577
+
578
+ height: 640px;
579
+ max-height: calc(100vh - var(--t-spacing-3) * 2);
580
+ /* Keeps the results panel's background inside the rounded corners. */
581
+ overflow: hidden;
522
582
  }
523
583
 
524
- .visuallyHidden-S9VG5 {
584
+ /*
585
+ * Tapestry's .tds-modal sets padding and border on the same element with
586
+ * equal weight, and some products load Tapestry after topbar. The modal's ID
587
+ * outranks it whatever the order. Only these two properties use it, so the
588
+ * phone-width .modal rules below still override the rest.
589
+ */
590
+ .modal-NR3TO#product_search_modal {
591
+ padding: 0;
592
+ border: var(--t-border-width) solid var(--t-border-color);
593
+ }
594
+
595
+ /* Fits mobile Safari's visible viewport, between its toolbars. */
596
+ @supports (height: 100dvh) {
597
+ .modal-NR3TO {
598
+ max-height: calc(100dvh - var(--t-spacing-3) * 2);
599
+ }
600
+ }
601
+
602
+ .visuallyHidden-C28ju {
525
603
  position: absolute;
526
604
  width: 1px;
527
605
  height: 1px;
@@ -530,6 +608,636 @@ Caused by products overriding .topbar-wrap’s z-index.
530
608
  white-space: nowrap;
531
609
  }
532
610
 
611
+ /* Scrolls the results under the product picker, tabs or dropdown. */
612
+ .panel-HlF7S {
613
+ flex: 1;
614
+ min-height: 0;
615
+ padding: var(--product-search-padding-block)
616
+ var(--product-search-results-inset, var(--product-search-padding-inline));
617
+ /* Lets results lay out by the panel's width rather than the viewport's. */
618
+ container-type: inline-size;
619
+ scroll-padding-block: var(--product-search-padding-block);
620
+ overflow-y: auto;
621
+ overscroll-behavior: contain;
622
+ }
623
+
624
+ /*
625
+ * Phone widths, where the small topbar shows (DisplaySwitch's default "xs"
626
+ * and "sm" breakpoints). The modal fills the screen rather than floating at a
627
+ * desktop height, with tighter padding above and below each section.
628
+ * Result rows and headings pad themselves by --product-search-row-inset,
629
+ * narrower here so the highlight sits closer to the content, and the panel's
630
+ * sides take that off to line their images and text up with the search icon.
631
+ * There are no tabs here, so headings line up with the results instead.
632
+ */
633
+ @media (max-width: 599px) {
634
+ .modal-NR3TO {
635
+ --product-search-padding-block: var(--t-spacing-2);
636
+ --product-search-row-inset: var(--t-spacing-1);
637
+ --product-search-heading-inset: var(--product-search-row-inset);
638
+ --product-search-results-inset: calc(
639
+ var(--product-search-padding-inline) - var(--product-search-row-inset)
640
+ );
641
+
642
+ height: calc(100vh - var(--t-spacing-3) * 2);
643
+ }
644
+
645
+ @supports (height: 100dvh) {
646
+ .modal-NR3TO {
647
+ height: calc(100dvh - var(--t-spacing-3) * 2);
648
+ }
649
+ }
650
+
651
+ /* Section headings pad themselves, so they start just under the select. */
652
+ .panel-HlF7S {
653
+ padding-block-start: 0;
654
+ }
655
+
656
+ /*
657
+ * Tapestry only takes a class for the dialog, so its overlay and frame are
658
+ * reached through it. Top and bottom margins narrow to 8px; the sides keep
659
+ * 16px of backdrop to tap. The frame fills the dynamic viewport, which
660
+ * follows Safari's toolbars as they show and hide. The dialog stretches to
661
+ * fill the frame.
662
+ *
663
+ * Mobile Safari draws the keyboard over the page without shrinking 100dvh,
664
+ * so while it's open the frame sizes to the visible viewport instead. A
665
+ * bottom margin the keyboard's height keeps the overlay's centering above
666
+ * it.
667
+ *
668
+ * Browsers without :has() drop these rules, so the modal keeps its own
669
+ * height there. No @supports selector() guard: consuming apps run this file
670
+ * through libsass, which can't parse it.
671
+ */
672
+ .tds-modal-overlay:has(.modal-NR3TO) {
673
+ --tds-modal-min-margin-block: var(--t-spacing-1);
674
+ }
675
+
676
+ .tds-modal-frame:has(> .modal-NR3TO) {
677
+ --tds-modal-edge-margin-inline: var(--t-spacing-2);
678
+
679
+ height: calc(100vh - var(--t-spacing-1) * 2);
680
+ height: calc(
681
+ var(--visual-viewport-height, 100dvh) - var(--t-spacing-1) * 2
682
+ );
683
+ margin-block-end: calc(100dvh - var(--visual-viewport-height, 100dvh));
684
+ }
685
+
686
+ .tds-modal-frame:has(> .modal-NR3TO) > .modal-NR3TO {
687
+ height: auto;
688
+ max-height: none;
689
+ }
690
+ }
691
+
692
+ .container-YDdM1 {
693
+ display: flex;
694
+ flex-shrink: 0;
695
+ flex-wrap: wrap;
696
+ gap: var(--t-spacing-1);
697
+ /* Each hint pads itself by --t-spacing-1, so its keycaps line up with
698
+ the tabs. */
699
+ padding: var(--t-spacing-half)
700
+ calc(var(--product-search-padding-inline) - var(--t-spacing-1));
701
+ margin: 0;
702
+ list-style: none;
703
+ border-top: var(--t-border-width) solid var(--t-border-color);
704
+ }
705
+
706
+ .hint-017Rd {
707
+ display: flex;
708
+ flex-shrink: 0;
709
+ align-items: center;
710
+ gap: var(--t-spacing-half);
711
+ padding: var(--t-spacing-half) var(--t-spacing-1);
712
+ border-radius: var(--t-border-radius-lg);
713
+ color: var(--t-text-color-placeholder);
714
+ font-size: var(--t-font-size-xs);
715
+ }
716
+
717
+ .keycap-ENJM2 {
718
+ --keycap-size: 20px;
719
+ --keycap-padding: 4px;
720
+
721
+ display: inline-flex;
722
+ align-items: center;
723
+ justify-content: center;
724
+ width: var(--keycap-size);
725
+ height: var(--keycap-size);
726
+ padding: var(--keycap-padding);
727
+ margin-block: var(--t-spacing-fourth);
728
+ background-color: var(--t-fill-color-neutral-070);
729
+ color: var(--t-text-color-placeholder);
730
+ font-family: inherit;
731
+ font-size: calc(var(--keycap-size) - var(--keycap-padding) * 2);
732
+ font-weight: var(--t-font-weight-semibold);
733
+ border-radius: var(--t-border-radius-md);
734
+ }
735
+
736
+ .keycap-ENJM2 svg {
737
+ flex-shrink: 0;
738
+ width: 1.4em;
739
+ width: 2cap;
740
+ height: 1.4em;
741
+ height: 2cap;
742
+ stroke-width: 2;
743
+ }
744
+
745
+ .container-YDdM1[data-platform="pc"] .keycap-ENJM2 {
746
+ width: auto;
747
+ min-width: var(--keycap-size);
748
+ }
749
+
750
+ .container-YDdM1[data-platform="pc"] .keycap-ENJM2 svg {
751
+ margin-inline: calc(var(--keycap-padding) * -1);
752
+ }
753
+
754
+ .labels-GHPqL {
755
+ display: grid;
756
+ overflow: clip;
757
+ }
758
+
759
+ .labels-GHPqL > * {
760
+ grid-area: 1 / 1;
761
+ }
762
+
763
+ @property --copied {
764
+ syntax: "<percentage>";
765
+ inherits: true;
766
+ initial-value: 0%;
767
+ }
768
+
769
+ .copied-DUFa1 {
770
+ position: relative;
771
+ background-color: color-mix(
772
+ in srgb,
773
+ var(--t-fill-color-status-success-ghost) calc(var(--copied) * 0.3),
774
+ transparent
775
+ );
776
+ animation:
777
+ copied-enter-k4P4y var(--copied-enter) var(--t-ease-out) forwards,
778
+ copied-exit-oCDAu var(--copied-exit) var(--t-ease-out)
779
+ calc(var(--copied-enter) + var(--copied-active)) forwards;
780
+ }
781
+
782
+ .copied-DUFa1 .keycap-ENJM2 {
783
+ animation: copied-keypress-znahZ 350ms cubic-bezier(0.34, 1.56, 0.64, 1);
784
+ }
785
+
786
+ .copied-DUFa1 .labels-GHPqL > :first-child {
787
+ translate: 0 calc(var(--copied) * -1);
788
+ }
789
+
790
+ .copied-DUFa1 .labels-GHPqL > :last-child {
791
+ translate: 0 calc(100% - var(--copied));
792
+ }
793
+
794
+ .copied-DUFa1::after {
795
+ content: "";
796
+ position: absolute;
797
+ inset: 0;
798
+ border-radius: inherit;
799
+ pointer-events: none;
800
+ border: var(--t-border-width-thick) solid var(--t-border-color-status-success);
801
+ opacity: var(--copied);
802
+ }
803
+
804
+ @keyframes copied-enter-k4P4y {
805
+ to { --copied: 100% }
806
+ }
807
+
808
+ @keyframes copied-exit-oCDAu {
809
+ from { --copied: 100% }
810
+ to { --copied: 0% }
811
+ }
812
+
813
+ @keyframes copied-keypress-znahZ {
814
+ 20%,
815
+ 26% {
816
+ translate: 0 1px;
817
+ scale: 0.88;
818
+ }
819
+ }
820
+
821
+ @media (prefers-reduced-motion: reduce) {
822
+ .copied-DUFa1 {
823
+ --copied: 100%;
824
+ animation: none;
825
+ }
826
+
827
+ .copied-DUFa1 .keycap-ENJM2 {
828
+ animation: none;
829
+ }
830
+ }
831
+
832
+ .icon-XKLvN {
833
+ position: relative;
834
+ display: block;
835
+ flex-shrink: 0;
836
+ }
837
+
838
+ .icon-XKLvN::before {
839
+ content: "";
840
+ position: absolute;
841
+ inset: 12.5%;
842
+ background-color: hsl(0, 0%, 100%);
843
+ border-radius: 20%;
844
+ }
845
+
846
+ .squircle-JCHr6 {
847
+ position: absolute;
848
+ inset: 0;
849
+ mask-size: 100%;
850
+ }
851
+
852
+ .picker-iuzzj {
853
+ flex-shrink: 0;
854
+ padding: 0 var(--product-search-padding-inline) var(--t-spacing-1);
855
+ }
856
+
857
+ .option--7LXg {
858
+ display: inline-flex;
859
+ align-items: center;
860
+ gap: var(--t-spacing-1);
861
+ }
862
+
863
+ .tablist-7ASvc {
864
+ display: flex;
865
+ flex-shrink: 0;
866
+ gap: var(--t-spacing-half);
867
+ padding-inline: var(--product-search-padding-inline);
868
+ padding-top: var(--t-spacing-half);
869
+ border-bottom: var(--t-border-width) solid var(--t-border-color);
870
+ }
871
+
872
+ .tab-dz8ki {
873
+ position: relative;
874
+ display: inline-flex;
875
+ align-items: center;
876
+ justify-content: center;
877
+ gap: var(--t-spacing-1);
878
+ min-width: 48px;
879
+ height: 40px;
880
+ padding: 0 var(--product-search-tab-padding-inline);
881
+ margin-bottom: calc(var(--t-border-width) * -1);
882
+ background-color: var(--t-fill-color-neutral-070);
883
+ color: var(--t-text-color-secondary);
884
+ font-size: var(--t-font-size-md);
885
+ border: var(--t-border-width) solid transparent;
886
+ border-bottom-color: var(--t-border-color);
887
+ border-radius: var(--t-border-radius-md) var(--t-border-radius-md) 0 0;
888
+ cursor: pointer;
889
+ }
890
+
891
+ .tab-dz8ki:hover {
892
+ background-color: var(--t-fill-color-neutral-060);
893
+ }
894
+
895
+ .tab-dz8ki:focus-visible {
896
+ outline: none;
897
+ }
898
+
899
+ /* Set by useKeyboardFocus: Safari leaves :focus-visible off focus the modal's
900
+ focus scope moves here by script, as it does when Tab is pressed. */
901
+ .tab-dz8ki[data-focus-visible] {
902
+ z-index: 1;
903
+ }
904
+
905
+ .tab-dz8ki[data-focus-visible]::after {
906
+ content: "";
907
+ position: absolute;
908
+ /* Measured from inside the tab's border, so step out past it too. */
909
+ inset: calc((var(--t-focus-ring-offset) + var(--t-border-width)) * -1);
910
+ border-radius: calc(var(--t-border-radius-md) + var(--t-focus-ring-offset));
911
+ box-shadow: 0 0 0 var(--t-focus-ring-width) var(--t-focus-ring-color);
912
+ pointer-events: none;
913
+ }
914
+
915
+ .tab-dz8ki[aria-selected="true"] {
916
+ background-color: var(--t-surface-color-card);
917
+ border-color: var(--t-border-color);
918
+ border-bottom-color: var(--t-surface-color-card);
919
+ cursor: default;
920
+ }
921
+
922
+ .blank_state-wMOWN {
923
+ max-width: 300px;
924
+ margin-inline: auto;
925
+ padding-block: var(--t-spacing-2);
926
+ text-align: center;
927
+ }
928
+ @media screen and (min-width: 600px) {
929
+ .blank_state-wMOWN {
930
+ padding-block: var(--t-spacing-5);
931
+ }
932
+ }
933
+ .blank_state-wMOWN h2 {
934
+ color: var(--t-text-color-headline);
935
+ font-size: var(--t-font-size-xl);
936
+ font-weight: var(--t-font-weight-semibold);
937
+ margin: 0;
938
+ }
939
+ .blank_state-wMOWN p {
940
+ color: var(--t-text-color-secondary);
941
+ font-size: var(--t-font-size-md);
942
+ margin: 0;
943
+ }
944
+
945
+ .image-uy0Fd {
946
+ color: var(--t-fill-color-status-info-ghost);
947
+ }
948
+ .image-uy0Fd svg {
949
+ width: 30vw;
950
+ max-width: 240px;
951
+ height: auto;
952
+ }
953
+ @media screen and (min-width: 600px) {
954
+ .image-uy0Fd svg {
955
+ width: 18vw;
956
+ }
957
+ }
958
+ :root[data-color-mode="dark"] .image-uy0Fd {
959
+ color: var(--t-fill-color-status-neutral-ghost);
960
+ }
961
+ @media (prefers-color-scheme: dark) {
962
+ :root[data-color-mode="system"] .image-uy0Fd {
963
+ color: var(--t-fill-color-status-neutral-ghost);
964
+ }
965
+ }
966
+ .result-Thq2C {
967
+ display: flex;
968
+ align-items: center;
969
+ gap: var(--t-spacing-1-half);
970
+ min-height: 56px;
971
+ padding: var(--t-spacing-1) var(--product-search-row-inset, var(--t-spacing-1-half));
972
+ color: var(--t-text-color);
973
+ text-decoration: none;
974
+ border-radius: var(--t-border-radius-md);
975
+ /* Taps get the highlight below instead of the browser's grey flash. */
976
+ -webkit-tap-highlight-color: transparent;
977
+ }
978
+
979
+ .result-Thq2C:hover,
980
+ .result-Thq2C:focus,
981
+ .result-Thq2C:active,
982
+ .result-Thq2C:visited {
983
+ color: var(--t-text-color);
984
+ text-decoration: none;
985
+ }
986
+
987
+ .result-Thq2C[aria-selected="true"],
988
+ .result-Thq2C:active {
989
+ background-color: var(--t-fill-color-button-interaction-ghost-hover);
990
+ }
991
+
992
+ .title-KYUEn {
993
+ flex-shrink: 0;
994
+ max-width: 60%;
995
+ /* Clips sideways for the ellipsis, leaving room below for descenders,
996
+ which Segoe UI on Windows draws past the line. */
997
+ overflow-x: clip;
998
+ font-size: var(--t-font-size-lg);
999
+ text-overflow: ellipsis;
1000
+ white-space: nowrap;
1001
+ }
1002
+
1003
+ .subtitle-R2haq {
1004
+ min-width: 0;
1005
+ overflow-x: clip;
1006
+ color: var(--t-text-color-secondary);
1007
+ font-size: var(--t-font-size-sm);
1008
+ text-overflow: ellipsis;
1009
+ white-space: nowrap;
1010
+ }
1011
+
1012
+ .image-KVDor {
1013
+ --result-image-size: 32px;
1014
+
1015
+ position: relative;
1016
+ flex-shrink: 0;
1017
+ width: var(--result-image-size);
1018
+ height: var(--result-image-size);
1019
+ }
1020
+
1021
+ .avatar-6Gh62,
1022
+ .photo-FZR3Q {
1023
+ display: block;
1024
+ width: 100%;
1025
+ height: 100%;
1026
+ object-fit: cover;
1027
+ }
1028
+
1029
+ .avatar-6Gh62 {
1030
+ border-radius: 50%;
1031
+ }
1032
+
1033
+ .photo-FZR3Q {
1034
+ border-radius: var(--t-border-radius-md);
1035
+ }
1036
+
1037
+ .badge-trUKt {
1038
+ position: absolute;
1039
+ right: -4px;
1040
+ bottom: -4px;
1041
+ filter: drop-shadow(0 1px 1px var(--t-fill-color-transparency-dark-static-010));
1042
+ }
1043
+
1044
+ /*
1045
+ * Too narrow for the title and meta to share a line, as on a phone, so they
1046
+ * stack beside a smaller image.
1047
+ */
1048
+ @container (max-width: 480px) {
1049
+ .result-Thq2C {
1050
+ display: grid;
1051
+ grid-template-columns: auto minmax(0, 1fr);
1052
+ align-content: center;
1053
+ gap: 0 var(--t-spacing-1-half);
1054
+ }
1055
+
1056
+ .image-KVDor {
1057
+ --result-image-size: 28px;
1058
+
1059
+ grid-row: span 2;
1060
+ align-self: center;
1061
+ }
1062
+
1063
+ .title-KYUEn {
1064
+ max-width: none;
1065
+ }
1066
+ }
1067
+
1068
+ .heading-LioUF {
1069
+ padding: var(--t-spacing-half)
1070
+ var(--product-search-heading-inset, var(--product-search-row-inset, var(--t-spacing-1-half)));
1071
+ color: var(--t-text-color-secondary);
1072
+ font-size: var(--t-font-size-sm);
1073
+ }
1074
+
1075
+ .group-cKChg:not(:first-child) > .heading-LioUF {
1076
+ margin-top: var(--t-spacing-2);
1077
+ }
1078
+
1079
+ /*
1080
+ * The field is a box of its own, so keyboard focus can ring it like an input.
1081
+ * Padding all around gives the ring room, and the row's padding is that much
1082
+ * less than the section padding, so the icon lines up with the tabs.
1083
+ */
1084
+ .row-5P7UQ {
1085
+ --header-inset-block: var(--t-spacing-1);
1086
+ --header-inset-inline: var(--t-spacing-half);
1087
+
1088
+ display: flex;
1089
+ flex-shrink: 0;
1090
+ align-items: center;
1091
+ gap: var(--t-spacing-1);
1092
+ padding-top: calc(
1093
+ var(--product-search-padding-block) - var(--header-inset-block)
1094
+ );
1095
+ padding-inline: calc(
1096
+ var(--product-search-padding-inline) - var(--header-inset-inline)
1097
+ );
1098
+ padding-bottom: calc(var(--t-spacing-1-half) - var(--header-inset-block));
1099
+ }
1100
+
1101
+ /*
1102
+ * A label, so a click anywhere in it focuses the input. Products style labels
1103
+ * app-wide, with margins, line heights, weights and even display, so like the
1104
+ * input below, these rules add its ID to outrank them.
1105
+ */
1106
+ .header-sXEyG#topbar_product_search_label {
1107
+ display: flex;
1108
+ flex: 1;
1109
+ align-items: center;
1110
+ gap: var(--t-spacing-1);
1111
+ min-width: 0;
1112
+ margin: 0;
1113
+ padding: var(--header-inset-block) var(--header-inset-inline);
1114
+ color: inherit;
1115
+ font: inherit;
1116
+ letter-spacing: inherit;
1117
+ text-transform: none;
1118
+ border-radius: var(--t-border-radius-lg);
1119
+ outline: var(--t-focus-ring-width) solid transparent;
1120
+ cursor: text;
1121
+ transition: outline-color var(--t-duration-200) var(--t-ease-in-out);
1122
+ }
1123
+
1124
+ /* Only from the keyboard, since a click or tap already shows where it is. */
1125
+ .header-sXEyG#topbar_product_search_label:has([data-focus-visible]) {
1126
+ outline-color: var(--t-focus-ring-color);
1127
+ }
1128
+
1129
+ /* A 48px tap target around the 32px button, like the small topbar's. */
1130
+ .closeButton-rPJJV {
1131
+ position: relative;
1132
+ flex-shrink: 0;
1133
+ }
1134
+
1135
+ .closeButton-rPJJV::before {
1136
+ position: absolute;
1137
+ inset: calc((var(--t-container-size-xl) - var(--t-container-size-md)) / -2);
1138
+ content: "";
1139
+ }
1140
+
1141
+ /*
1142
+ * Products style their own inputs, often by element and type with states
1143
+ * like :focus. There's only ever one product search field, so these rules
1144
+ * add its ID, set as a plain string in SearchInput, which outranks any
1145
+ * product rule without one.
1146
+ */
1147
+ .input-YQkTC#product_search {
1148
+ position: static;
1149
+ flex: 1;
1150
+ min-width: 0;
1151
+ height: auto;
1152
+ margin: 0;
1153
+ padding: 0;
1154
+ background: none;
1155
+ color: var(--t-text-color);
1156
+ font: inherit;
1157
+ font-size: var(--t-font-size-xl);
1158
+ line-height: normal;
1159
+ border: 0 solid transparent;
1160
+ border-radius: 0;
1161
+ box-shadow: none;
1162
+ outline: none;
1163
+ }
1164
+
1165
+ .input-YQkTC#product_search::placeholder {
1166
+ color: var(--t-text-color-placeholder);
1167
+ }
1168
+
1169
+ .input-YQkTC#product_search::-webkit-search-cancel-button {
1170
+ appearance: none;
1171
+ }
1172
+
1173
+ .clearButton-9Yh9w {
1174
+ --clear-button-size: 20px;
1175
+ --clear-button-background: var(--t-fill-color-neutral-030);
1176
+ --clear-button-background-hover: var(--t-fill-color-neutral-025);
1177
+
1178
+ flex-shrink: 0;
1179
+ width: var(--clear-button-size);
1180
+ height: var(--clear-button-size);
1181
+ padding: 0;
1182
+ background: none;
1183
+ border: 0;
1184
+ cursor: pointer;
1185
+ }
1186
+
1187
+ :root[data-color-mode="dark"] .clearButton-9Yh9w {
1188
+ --clear-button-background: var(--t-fill-color-neutral-040);
1189
+ --clear-button-background-hover: var(--t-fill-color-neutral-050);
1190
+ }
1191
+
1192
+ @media (prefers-color-scheme: dark) {
1193
+ :root[data-color-mode="system"] .clearButton-9Yh9w {
1194
+ --clear-button-background: var(--t-fill-color-neutral-040);
1195
+ --clear-button-background-hover: var(--t-fill-color-neutral-050);
1196
+ }
1197
+ }
1198
+
1199
+ .clearButton-9Yh9w svg {
1200
+ display: block;
1201
+ width: 100%;
1202
+ height: 100%;
1203
+ }
1204
+
1205
+ .clearButton-9Yh9w circle {
1206
+ fill: var(--clear-button-background);
1207
+ transition: fill var(--topbar-slight-transition);
1208
+ }
1209
+
1210
+ .clearButton-9Yh9w:hover circle {
1211
+ fill: var(--clear-button-background-hover);
1212
+ }
1213
+
1214
+ .clearButton-9Yh9w path {
1215
+ stroke: #fff;
1216
+ stroke-width: 2;
1217
+ stroke-linecap: round;
1218
+ }
1219
+
1220
+ .spinner-b5tlz {
1221
+ --spinner-size: 54px;
1222
+ --spinner-track-width: 6px;
1223
+ --spinner-track-color: var(--t-border-color-dim);
1224
+ --spinner-color: var(--t-border-color-status-info);
1225
+
1226
+ display: inline-block;
1227
+ box-sizing: border-box;
1228
+ width: var(--spinner-size);
1229
+ height: var(--spinner-size);
1230
+ border: var(--spinner-track-width) solid var(--spinner-track-color);
1231
+ border-bottom-color: var(--spinner-color);
1232
+ border-radius: 50%;
1233
+ animation: rotation-q2xiP .75s linear infinite;
1234
+ }
1235
+
1236
+ @keyframes rotation-q2xiP {
1237
+ to {
1238
+ transform: rotate(1turn);
1239
+ }
1240
+ }
533
1241
  .route--8BWe {
534
1242
  font-size: var(--topbar-nav-link-font-size);
535
1243
  font-family: inherit;
@@ -576,6 +1284,9 @@ Caused by products overriding .topbar-wrap’s z-index.
576
1284
  }
577
1285
 
578
1286
  .trigger-wrap-Jd-KR {
1287
+ /* Lets the trigger shrink, truncating the org name, when the nav runs out
1288
+ of room */
1289
+ min-width: 0;
579
1290
  margin-left: var(--t-spacing-1);
580
1291
  position: relative;
581
1292
  white-space: nowrap;
@@ -590,7 +1301,8 @@ Caused by products overriding .topbar-wrap’s z-index.
590
1301
  padding: 0 var(--topbar-nav-link-padding-x);
591
1302
  border: var(--t-border-width) solid var(--topbar-nav-link-border-color-active);
592
1303
  border-radius: var(--topbar-nav-link-border-radius);
593
- min-width: var(--t-container-size-md);
1304
+ min-width: var(--topbar-nav-link-height);
1305
+ max-width: 100%;
594
1306
  transition: var(--topbar-nav-link-transition);
595
1307
  display: flex;
596
1308
  align-items: center;
@@ -601,6 +1313,7 @@ Caused by products overriding .topbar-wrap’s z-index.
601
1313
  }
602
1314
 
603
1315
  .trigger-WgRT5 svg {
1316
+ flex-shrink: 0;
604
1317
  transition: transform var(--topbar-slight-transition);
605
1318
  /* Negative margin ensures button is a circle when orgname isn’t visible */
606
1319
  margin-left: calc(var(--t-spacing-1) * -1);
@@ -864,6 +1577,10 @@ Caused by products overriding .topbar-wrap’s z-index.
864
1577
  column-gap: var(--t-spacing-half);
865
1578
  appearance: none;
866
1579
  }
1580
+
1581
+ .current-route-wpJgz:has(~ .actions-INQ7- [data-search-button]) {
1582
+ margin-left: var(--topbar-action-size);
1583
+ }
867
1584
  .current-route-wpJgz svg {
868
1585
  vertical-align: middle;
869
1586
  transition: transform var(--topbar-slight-transition);
@@ -915,13 +1632,35 @@ Caused by products overriding .topbar-wrap’s z-index.
915
1632
  background-color: var(--t-fill-color-button-interaction-outline-active);
916
1633
  }
917
1634
 
1635
+ /*
1636
+ * Spaces the header's buttons on the right. Each is the same touch target;
1637
+ * the padding keeps the avatar, and the title's width, where they were
1638
+ * before search joined it.
1639
+ */
1640
+ .actions-INQ7- {
1641
+ display: flex;
1642
+ flex-shrink: 0;
1643
+ align-items: center;
1644
+ padding-inline: var(--t-spacing-1-half) var(--t-spacing-1);
1645
+ }
1646
+
918
1647
  .profile-button-a2WO2 {
1648
+ display: flex;
1649
+ align-items: center;
1650
+ justify-content: center;
1651
+ width: var(--topbar-action-size);
1652
+ height: var(--topbar-action-size);
1653
+ padding: 0;
919
1654
  background-color: transparent;
920
1655
  border-width: 0;
921
- padding: var(--t-spacing-2);
922
1656
  appearance: none;
923
1657
  }
924
1658
 
1659
+ /* Centers the avatar in its target, without its own leading margin. */
1660
+ .profile-button-a2WO2 > div {
1661
+ margin-left: 0;
1662
+ }
1663
+
925
1664
  .debug-pco-resource-sLteM {
926
1665
  display: flex;
927
1666
  flex-direction: column;