@setsquare/ui 0.2.4 → 0.4.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/NOTICE +1 -1
  3. package/README.md +13 -6
  4. package/dist/index.d.ts +6 -4
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/page-items.d.ts +10 -0
  9. package/dist/lib/page-items.d.ts.map +1 -0
  10. package/dist/lib/page-items.js +26 -0
  11. package/dist/lib/page-items.js.map +1 -0
  12. package/dist/lint/index.d.ts.map +1 -1
  13. package/dist/lint/index.js +4 -0
  14. package/dist/lint/index.js.map +1 -1
  15. package/dist/shell/sidebar.d.ts +23 -0
  16. package/dist/shell/sidebar.d.ts.map +1 -1
  17. package/dist/shell/sidebar.js +22 -3
  18. package/dist/shell/sidebar.js.map +1 -1
  19. package/dist/styles/theme.css +548 -0
  20. package/dist/styles/tokens.css +8 -0
  21. package/dist/testing/index.d.ts +3 -2
  22. package/dist/testing/index.d.ts.map +1 -1
  23. package/dist/testing/index.js +30 -2
  24. package/dist/testing/index.js.map +1 -1
  25. package/dist/tokens.json +20 -0
  26. package/dist/ui/feature-card.d.ts.map +1 -1
  27. package/dist/ui/feature-card.js.map +1 -1
  28. package/dist/ui/pagination.d.ts +69 -14
  29. package/dist/ui/pagination.d.ts.map +1 -1
  30. package/dist/ui/pagination.js +177 -32
  31. package/dist/ui/pagination.js.map +1 -1
  32. package/dist/ui/tabs.d.ts +82 -15
  33. package/dist/ui/tabs.d.ts.map +1 -1
  34. package/dist/ui/tabs.js +274 -16
  35. package/dist/ui/tabs.js.map +1 -1
  36. package/dist/ui/time-of-day-icon.d.ts.map +1 -1
  37. package/dist/ui/time-of-day-icon.js.map +1 -1
  38. package/dist/ui/tree.d.ts +53 -0
  39. package/dist/ui/tree.d.ts.map +1 -0
  40. package/dist/ui/tree.js +36 -0
  41. package/dist/ui/tree.js.map +1 -0
  42. package/package.json +21 -25
  43. package/templates/next/page-transition.tsx +1 -1
@@ -38,6 +38,8 @@
38
38
  --color-border: var(--border);
39
39
  --color-input: var(--input);
40
40
  --color-ring: var(--ring);
41
+ --color-edge: var(--edge);
42
+ --color-edge-selected: var(--edge-selected);
41
43
  --color-destructive: var(--destructive);
42
44
  --color-destructive-foreground: var(--destructive-foreground);
43
45
  --color-destructive-subtle: var(--destructive-subtle);
@@ -164,6 +166,20 @@
164
166
  --site-gutter: clamp(20px, calc(3.2 * var(--site-vw, 1vw)), 44px);
165
167
  --section-y: clamp(56px, calc(7 * var(--site-vw, 1vw)), 112px);
166
168
  --section-y-tight: clamp(40px, calc(5 * var(--site-vw, 1vw)), 80px);
169
+ /* A preview isn't the page, so its shell leaves the page's view-transition names (site-header) to the page's
170
+ own. A name may be on one element only: two, and the browser abandons every page transition. Important,
171
+ to win over the name the header sets inline. */
172
+ & * {
173
+ view-transition-name: none !important;
174
+ }
175
+ }
176
+
177
+ /* The same for a dashboard shell, or a part of one, shown inside a page that has its own, such as a documentation
178
+ site: its header, sidebar and right panel leave shell-header, shell-sidebar and shell-panel to the page's. */
179
+ @utility shell-preview {
180
+ & * {
181
+ view-transition-name: none !important;
182
+ }
167
183
  }
168
184
 
169
185
  /* The content width of a public page, centred, with the gutter either side. */
@@ -259,6 +275,7 @@
259
275
  }
260
276
  }
261
277
  @utility card-surface {
278
+ --tabs-surface: var(--card);
262
279
  position: relative;
263
280
  padding: var(--space-6);
264
281
  border: 1px solid var(--border);
@@ -482,6 +499,537 @@
482
499
  @media (prefers-reduced-motion: reduce) { animation: none; }
483
500
  }
484
501
 
502
+ /* ---------- Tabs: icons, and the selected tab opens to show its name ----------
503
+ Tab (the target) > tabs-paint (the pill) > tabs-icon and tabs-name. The paint's data-display says what a closed
504
+ tab shows: expanding (the name opens when selected), text, or icon. Widths and heights animate at AA only; at
505
+ AAA the name still fades in (opacity is not motion), and under reduced motion nothing animates. */
506
+ @keyframes setsquare-tab-pop { 0% { scale: 0.82; } 60% { scale: 1.08; } 100% { scale: 1; } }
507
+ @keyframes setsquare-badge-beat { 0%, 40%, 100% { scale: 1; } 15% { scale: 1.15; } }
508
+ @keyframes setsquare-badge-halo { 0% { scale: 0.5; opacity: 0.6; } 100% { scale: 1; opacity: 0; } }
509
+ @keyframes setsquare-badge-glow { 0%, 100% { opacity: 0; } 50% { opacity: 0.45; } }
510
+ @keyframes setsquare-badge-out { to { opacity: 0; } }
511
+ @keyframes setsquare-tip-below { from { opacity: 0; translate: -50% calc(var(--motion-distance) * -0.5); } }
512
+ @keyframes setsquare-tip-beside { from { opacity: 0; translate: calc(var(--motion-distance) * -0.5) -50%; } }
513
+ @keyframes setsquare-panel-in { from { opacity: 0; translate: var(--tabs-from, 0 0); } }
514
+ @utility tabs-list {
515
+ position: relative;
516
+ display: flex;
517
+ flex-wrap: wrap;
518
+ align-items: center;
519
+ gap: 4px;
520
+ /* The rail: 104px of icon tiles, so it never changes width; the selected tile grows downwards. */
521
+ &[data-orientation='vertical'] {
522
+ flex: none;
523
+ flex-direction: column;
524
+ flex-wrap: nowrap;
525
+ align-items: stretch;
526
+ width: 104px;
527
+ }
528
+ }
529
+ @utility tabs-paint {
530
+ /* The badge's cut-out is the tab's own surface: the page (or --tabs-surface), the hover ground, the fill. */
531
+ --tabs-cut: var(--tabs-surface, var(--background));
532
+ position: relative;
533
+ display: inline-grid;
534
+ grid-template-columns: 20px 0fr;
535
+ align-items: center;
536
+ column-gap: 0;
537
+ height: var(--control-height);
538
+ padding: 0 8px;
539
+ border-radius: 999px;
540
+ font-size: 14px;
541
+ line-height: 20px;
542
+ font-weight: 500;
543
+ color: var(--muted-foreground);
544
+ white-space: nowrap;
545
+ transition: grid-template-columns 280ms var(--ease-standard), column-gap 280ms var(--ease-standard),
546
+ padding 280ms var(--ease-standard), background-color var(--duration-fast) var(--ease-standard),
547
+ color var(--duration-fast) var(--ease-standard);
548
+ [data-hovered] > & {
549
+ --tabs-cut: var(--accent);
550
+ background-color: var(--accent);
551
+ color: var(--foreground);
552
+ }
553
+ [data-selected] > & {
554
+ --tabs-cut: var(--brand-subtle);
555
+ grid-template-columns: 20px 1fr;
556
+ column-gap: 8px;
557
+ padding: 0 14px 0 10px;
558
+ background-color: var(--brand-subtle);
559
+ color: var(--foreground);
560
+ }
561
+ /* Text has no icon column: the name is the only one. */
562
+ &[data-display='text'] {
563
+ grid-template-columns: 1fr;
564
+ column-gap: 0;
565
+ padding: 0 14px;
566
+ }
567
+ [data-selected] > &[data-display='icon'] {
568
+ grid-template-columns: 20px 0fr;
569
+ column-gap: 0;
570
+ padding: 0 8px;
571
+ }
572
+ /* Where the name doesn't open to mark the selected tab, a brand marker does: selection never rests on the fill
573
+ alone (1.4.1, 1.4.11). */
574
+ [data-selected] > &:is([data-display='text'], [data-display='icon'])::after {
575
+ content: '';
576
+ position: absolute;
577
+ left: 10px;
578
+ right: 10px;
579
+ bottom: 3px;
580
+ height: 3px;
581
+ border-radius: 2px;
582
+ background-color: var(--brand);
583
+ }
584
+ @variant aaa {
585
+ transition: background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);
586
+ }
587
+ [role='tablist'][data-orientation='vertical'] & {
588
+ display: grid;
589
+ grid-template-columns: none;
590
+ grid-template-rows: 20px 0fr;
591
+ justify-items: center;
592
+ row-gap: 0;
593
+ width: 100%;
594
+ height: auto;
595
+ min-height: var(--control-height);
596
+ padding: 8px 4px;
597
+ border-radius: var(--radius-lg);
598
+ white-space: normal;
599
+ transition: grid-template-rows 280ms var(--ease-standard), row-gap 280ms var(--ease-standard),
600
+ background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);
601
+ @variant aaa {
602
+ transition: background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);
603
+ }
604
+ }
605
+ [role='tablist'][data-orientation='vertical'] [data-selected] > & {
606
+ grid-template-rows: 20px 1fr;
607
+ row-gap: 6px;
608
+ }
609
+ [role='tablist'][data-orientation='vertical'] &[data-display='text'] {
610
+ grid-template-rows: 1fr;
611
+ row-gap: 0;
612
+ }
613
+ [role='tablist'][data-orientation='vertical'] [data-selected] > &[data-display='icon'] {
614
+ grid-template-rows: 20px 0fr;
615
+ row-gap: 0;
616
+ }
617
+ [role='tablist'][data-orientation='vertical'] [data-selected] > &:is([data-display='text'], [data-display='icon'])::after {
618
+ left: 3px;
619
+ right: auto;
620
+ top: 10px;
621
+ bottom: 10px;
622
+ width: 3px;
623
+ height: auto;
624
+ }
625
+ @media (prefers-reduced-motion: reduce) {
626
+ transition: none !important;
627
+ }
628
+ }
629
+ @utility tabs-icon {
630
+ position: relative;
631
+ display: block;
632
+ width: 20px;
633
+ height: 20px;
634
+ & > :not(.tabs-badge) {
635
+ display: block;
636
+ }
637
+ /* The selected tab's icon turns brand and pops (at AA). */
638
+ [data-selected] & > :not(.tabs-badge) {
639
+ color: var(--brand);
640
+ animation: setsquare-tab-pop 300ms var(--ease-standard);
641
+ @variant aaa {
642
+ animation: none;
643
+ }
644
+ @media (prefers-reduced-motion: reduce) {
645
+ animation: none;
646
+ }
647
+ }
648
+ }
649
+ @utility tabs-name {
650
+ min-width: 0;
651
+ /* Clipped sideways only, so an important badge's ring after the name isn't cut off above or below. */
652
+ overflow-x: clip;
653
+ overflow-y: visible;
654
+ opacity: 0;
655
+ transition: opacity 160ms var(--ease-standard);
656
+ [data-selected] & {
657
+ opacity: 1;
658
+ transition-delay: 80ms;
659
+ }
660
+ [data-display='text'] > & {
661
+ opacity: 1;
662
+ }
663
+ [data-selected] [data-display='icon'] > & {
664
+ opacity: 0;
665
+ }
666
+ /* In the rail it fills its row, which opens from nothing, so a closing name is clipped below the icon rather
667
+ than spilling up over it. */
668
+ [role='tablist'][data-orientation='vertical'] & {
669
+ align-self: stretch;
670
+ width: 100%;
671
+ min-height: 0;
672
+ overflow: hidden;
673
+ }
674
+ [role='tablist'][data-orientation='vertical'] [data-display='text'] > & {
675
+ overflow: visible;
676
+ }
677
+ @media (prefers-reduced-motion: reduce) {
678
+ transition: none !important;
679
+ }
680
+ }
681
+ @utility tabs-name-row {
682
+ display: inline-flex;
683
+ align-items: center;
684
+ gap: 6px;
685
+ /* In the rail, names wrap and hyphenate inside the tile (1.4.12). */
686
+ [role='tablist'][data-orientation='vertical'] & {
687
+ display: block;
688
+ text-align: center;
689
+ font-size: 13px;
690
+ line-height: 16px;
691
+ hyphens: auto;
692
+ overflow-wrap: anywhere;
693
+ }
694
+ }
695
+ /* The name, over a hidden bold copy that holds the bold width from the start. */
696
+ @utility tabs-name-text {
697
+ display: inline-grid;
698
+ & > * {
699
+ grid-area: 1 / 1;
700
+ }
701
+ & > :last-child {
702
+ font-weight: 700;
703
+ visibility: hidden;
704
+ }
705
+ [data-selected] & > :first-child {
706
+ font-weight: 700;
707
+ }
708
+ }
709
+ @utility tabs-count {
710
+ font-size: 13px;
711
+ line-height: 20px;
712
+ font-weight: 500;
713
+ color: var(--muted-foreground);
714
+ font-variant-numeric: tabular-nums;
715
+ [role='tablist'][data-orientation='vertical'] & {
716
+ display: none;
717
+ }
718
+ }
719
+ /* A badge: pinned to the icon's top-right while the tab is closed, anchored by its right edge so a wide count
720
+ grows back over its own icon and never reaches the next tab, with a 2px cut-out in the tab's own surface. After
721
+ the name when the name shows beside the icon, so it never sits over text. */
722
+ @utility tabs-badge {
723
+ position: absolute;
724
+ top: -8px;
725
+ right: -8px;
726
+ isolation: isolate;
727
+ display: inline-flex;
728
+ align-items: center;
729
+ justify-content: center;
730
+ min-width: 18px;
731
+ height: 18px;
732
+ padding: 0 5px;
733
+ border-radius: 999px;
734
+ background-color: var(--foreground);
735
+ color: var(--background);
736
+ font-size: 13px;
737
+ line-height: 18px;
738
+ font-weight: 700;
739
+ font-variant-numeric: tabular-nums;
740
+ white-space: nowrap;
741
+ box-shadow: 0 0 0 2px var(--tabs-cut, var(--background));
742
+ pointer-events: none;
743
+ &[data-dot] {
744
+ top: -3px;
745
+ right: -4px;
746
+ min-width: 10px;
747
+ width: 10px;
748
+ height: 10px;
749
+ padding: 0;
750
+ }
751
+ &[data-place='inline'] {
752
+ position: relative;
753
+ top: auto;
754
+ right: auto;
755
+ box-shadow: none;
756
+ }
757
+ [role='tablist'][data-orientation='vertical'] &[data-place='inline'] {
758
+ margin-left: 6px;
759
+ vertical-align: middle;
760
+ }
761
+ /* Important: the destructive fill and a ring that stays, so importance never rests on colour or motion alone. */
762
+ &[data-important] {
763
+ background-color: var(--destructive);
764
+ color: var(--destructive-foreground);
765
+ }
766
+ &[data-important]::after {
767
+ content: '';
768
+ position: absolute;
769
+ inset: -4px;
770
+ border: 2px solid var(--destructive);
771
+ border-radius: inherit;
772
+ pointer-events: none;
773
+ }
774
+ /* The halo the pulse swells: 8px past the badge and no further, so it stays off the next tab and any text. */
775
+ &[data-important]::before {
776
+ content: '';
777
+ position: absolute;
778
+ inset: -8px;
779
+ z-index: -1;
780
+ border-radius: 999px;
781
+ background-color: var(--destructive);
782
+ opacity: 0;
783
+ pointer-events: none;
784
+ }
785
+ /* After a name: 10px from the text, a 5px halo and 6px of room on its right. */
786
+ &[data-important][data-place='inline'] {
787
+ margin: 0 6px 0 4px;
788
+ }
789
+ [role='tablist'][data-orientation='vertical'] &[data-important][data-place='inline'] {
790
+ margin-left: 10px;
791
+ }
792
+ &[data-important][data-place='inline']::after {
793
+ inset: -3px;
794
+ }
795
+ &[data-important][data-place='inline']::before {
796
+ inset: -5px;
797
+ }
798
+ /* The pulse: three times in 4.5s, so it stops by itself inside the 5 seconds 2.2.2 allows. At AAA nothing
799
+ grows: the halo glows in and out at its full size. */
800
+ &[data-pulse] {
801
+ animation: setsquare-badge-beat 1500ms var(--ease-standard) 3;
802
+ }
803
+ &[data-pulse]::before {
804
+ animation: setsquare-badge-halo 1500ms cubic-bezier(0, 0, 0.2, 1) 3;
805
+ }
806
+ @variant aaa {
807
+ &[data-pulse] {
808
+ animation: none;
809
+ }
810
+ &[data-pulse]::before {
811
+ animation: setsquare-badge-glow 1500ms ease-in-out 3;
812
+ }
813
+ }
814
+ /* Back on the icon as its tab closes: it waits for the name to fade, so it never lands on the text. */
815
+ &[data-returning] {
816
+ animation: setsquare-fade var(--duration-fast) var(--ease-standard) 200ms both;
817
+ }
818
+ &[data-clearing] {
819
+ animation: setsquare-badge-out 300ms var(--ease-standard) 700ms both;
820
+ }
821
+ /* Clearing and its tab closed before it went: it doesn't come back to the icon just to leave. */
822
+ &[data-clearing][data-returning] {
823
+ opacity: 0;
824
+ animation: none;
825
+ }
826
+ @media (prefers-reduced-motion: reduce) {
827
+ &, &::before {
828
+ animation: none !important;
829
+ }
830
+ }
831
+ }
832
+ /* A tooltip for a tab whose name isn't showing. It sits inside the tab, so the pointer can move onto it across an
833
+ 8px bridge without leaving. Hidden from assistive tech: the name is the tab's own. */
834
+ @utility tabs-tip {
835
+ position: absolute;
836
+ z-index: var(--z-popover);
837
+ padding: 4px 8px;
838
+ border-radius: var(--radius-md);
839
+ background-color: var(--foreground);
840
+ color: var(--background);
841
+ font-size: 13px;
842
+ line-height: 20px;
843
+ font-weight: 500;
844
+ white-space: nowrap;
845
+ box-shadow: var(--shadow-lg);
846
+ &::before {
847
+ content: '';
848
+ position: absolute;
849
+ }
850
+ &[data-side='bottom'] {
851
+ top: calc(100% + 6px);
852
+ left: 50%;
853
+ translate: -50% 0;
854
+ animation: setsquare-tip-below var(--duration-fast) var(--ease-standard) both;
855
+ }
856
+ &[data-side='bottom']::before {
857
+ left: 0;
858
+ right: 0;
859
+ top: -8px;
860
+ height: 8px;
861
+ }
862
+ &[data-side='right'] {
863
+ left: calc(100% + 6px);
864
+ top: 50%;
865
+ translate: 0 -50%;
866
+ animation: setsquare-tip-beside var(--duration-fast) var(--ease-standard) both;
867
+ }
868
+ &[data-side='right']::before {
869
+ top: 0;
870
+ bottom: 0;
871
+ left: -8px;
872
+ width: 8px;
873
+ }
874
+ @media (prefers-reduced-motion: reduce) {
875
+ animation: none !important;
876
+ }
877
+ }
878
+ /* A panel comes in from the side the selection moved towards: --motion-distance and a fade, a fade alone at AAA. */
879
+ @utility tabs-panel {
880
+ &[data-travel] {
881
+ animation: setsquare-panel-in var(--duration-enter) var(--ease-standard) both;
882
+ }
883
+ &[data-travel='forward'] {
884
+ --tabs-from: var(--motion-distance) 0;
885
+ }
886
+ &[data-travel='back'] {
887
+ --tabs-from: calc(var(--motion-distance) * -1) 0;
888
+ }
889
+ [data-orientation='vertical'] > &[data-travel='forward'] {
890
+ --tabs-from: 0 var(--motion-distance);
891
+ }
892
+ [data-orientation='vertical'] > &[data-travel='back'] {
893
+ --tabs-from: 0 calc(var(--motion-distance) * -1);
894
+ }
895
+ @media (prefers-reduced-motion: reduce) {
896
+ animation: none !important;
897
+ }
898
+ }
899
+
900
+ /* ---------- Pagination: the results footer ----------
901
+ The page links' paint (Layer 2), the range's figures coming in from the way you paged, the Go button arriving,
902
+ and the mark on a control whose page is slow to come. At AAA all of it fades; under reduced motion none of it
903
+ moves, and the pending mark holds still. */
904
+ @keyframes setsquare-current-pop { 0% { scale: 0.86; } 60% { scale: 1.04; } 100% { scale: 1; } }
905
+ @keyframes setsquare-roll-in { from { opacity: 0; translate: 0 var(--pagination-from, 0); } }
906
+ @keyframes setsquare-go-in { from { opacity: 0; translate: calc(var(--motion-distance) * -0.75) 0; } }
907
+ @keyframes setsquare-pending { 0%, 100% { opacity: 0.2; scale: 0.4 1; } 50% { opacity: 1; scale: 1 1; } }
908
+ @keyframes setsquare-pending-fade { 0%, 100% { opacity: 0.2; } 50% { opacity: 1; } }
909
+ @keyframes setsquare-pending-hold { to { opacity: 0.6; scale: 1 1; } }
910
+ @utility pagination-paint {
911
+ position: relative;
912
+ display: inline-flex;
913
+ align-items: center;
914
+ justify-content: center;
915
+ gap: 4px;
916
+ height: var(--control-height);
917
+ min-width: var(--control-height);
918
+ padding: 0 8px;
919
+ border-radius: var(--radius-md);
920
+ font-size: 14px;
921
+ line-height: 20px;
922
+ font-weight: 500;
923
+ font-variant-numeric: tabular-nums;
924
+ white-space: nowrap;
925
+ color: var(--foreground);
926
+ transition: background-color var(--duration-fast) var(--ease-standard);
927
+ [data-hovered] > & {
928
+ background-color: var(--accent);
929
+ }
930
+ [aria-current='page'] > & {
931
+ background-color: var(--primary);
932
+ color: var(--primary-foreground);
933
+ font-weight: 700;
934
+ }
935
+ /* The new current page pops, at AA, once the page has changed. */
936
+ [data-moved] [aria-current='page'] > & {
937
+ animation: setsquare-current-pop 240ms var(--ease-standard);
938
+ }
939
+ [data-pending] > &::after {
940
+ content: '';
941
+ position: absolute;
942
+ left: 8px;
943
+ right: 8px;
944
+ bottom: 4px;
945
+ height: 2px;
946
+ border-radius: 2px;
947
+ background-color: currentColor;
948
+ opacity: 0;
949
+ /* Five beats, then it holds still: it stops by itself inside the five seconds 2.2.2 allows. */
950
+ animation:
951
+ setsquare-pending 900ms var(--ease-standard) var(--duration-loading-delay) 5,
952
+ setsquare-pending-hold 0s calc(var(--duration-loading-delay) + 4500ms) forwards;
953
+ }
954
+ @variant aaa {
955
+ [data-moved] [aria-current='page'] > & {
956
+ animation: none;
957
+ }
958
+ [data-pending] > &::after {
959
+ animation-name: setsquare-pending-fade, setsquare-pending-hold;
960
+ }
961
+ }
962
+ @media (prefers-reduced-motion: reduce) {
963
+ transition: none;
964
+ [data-moved] [aria-current='page'] > & {
965
+ animation: none;
966
+ }
967
+ [data-pending] > &::after {
968
+ animation: none;
969
+ opacity: 0.6;
970
+ }
971
+ }
972
+ }
973
+ /* The page field's mark when its page is slow: the same underline, under the number. */
974
+ @utility pagination-field-pending {
975
+ position: relative;
976
+ &::after {
977
+ content: '';
978
+ position: absolute;
979
+ left: calc(var(--control-pad-x) + 2px);
980
+ right: calc(var(--control-pad-x) + 2px);
981
+ bottom: calc(var(--field-band, 0px) + 4px);
982
+ height: 2px;
983
+ border-radius: 2px;
984
+ background-color: currentColor;
985
+ opacity: 0;
986
+ pointer-events: none;
987
+ animation:
988
+ setsquare-pending 900ms var(--ease-standard) var(--duration-loading-delay) 5,
989
+ setsquare-pending-hold 0s calc(var(--duration-loading-delay) + 4500ms) forwards;
990
+ @media (prefers-reduced-motion: reduce) {
991
+ animation: none;
992
+ opacity: 0.6;
993
+ }
994
+ }
995
+ @variant aaa {
996
+ &::after {
997
+ animation-name: setsquare-pending-fade, setsquare-pending-hold;
998
+ }
999
+ }
1000
+ }
1001
+ /* The range's figures come in from the way you paged: up for later pages, down for earlier ones. */
1002
+ @utility pagination-roll {
1003
+ display: inline-block;
1004
+ &[data-direction] {
1005
+ animation: setsquare-roll-in 220ms var(--ease-standard);
1006
+ }
1007
+ &[data-direction='forward'] {
1008
+ --pagination-from: calc(var(--motion-distance) * 0.75);
1009
+ }
1010
+ &[data-direction='back'] {
1011
+ --pagination-from: calc(var(--motion-distance) * -0.75);
1012
+ }
1013
+ @media (prefers-reduced-motion: reduce) {
1014
+ animation: none !important;
1015
+ }
1016
+ }
1017
+ @utility pagination-go {
1018
+ animation: setsquare-go-in 180ms var(--ease-standard) both;
1019
+ @media (prefers-reduced-motion: reduce) {
1020
+ animation: none;
1021
+ }
1022
+ }
1023
+ /* A new page's rows fade in (no movement, at every level). Key the rows by page so they are new elements. */
1024
+ @utility rows-arrive {
1025
+ & > * {
1026
+ animation: setsquare-fade 200ms var(--ease-standard);
1027
+ @media (prefers-reduced-motion: reduce) {
1028
+ animation: none;
1029
+ }
1030
+ }
1031
+ }
1032
+
485
1033
  /* ---------- FeatureCard's ground: dots fading out from the icon, and one ripple across them ----------
486
1034
  The dots sit behind the title and the muted text, so they are light enough for that text to keep 4.5:1 on a
487
1035
  dot as well as on the card (scripts/lib/contrast.mjs measures it on the darkest dot). At AAA there are none:
@@ -152,6 +152,8 @@
152
152
  --border: #e0e4e9;
153
153
  --input: #7a838e;
154
154
  --ring: var(--brand);
155
+ --edge: var(--input);
156
+ --edge-selected: var(--brand);
155
157
  --destructive: #bf2a2a;
156
158
  --destructive-foreground: #ffffff;
157
159
  --destructive-subtle: #fdecec;
@@ -193,6 +195,8 @@
193
195
  --border: #28303a;
194
196
  --input: #6b7582;
195
197
  --ring: var(--brand);
198
+ --edge: var(--input);
199
+ --edge-selected: var(--brand);
196
200
  --destructive: #f47a70;
197
201
  --destructive-foreground: #0e1116;
198
202
  --destructive-subtle: #3a1616;
@@ -234,6 +238,8 @@
234
238
  --border: #7f8792;
235
239
  --input: #5d6570;
236
240
  --ring: var(--brand);
241
+ --edge: var(--input);
242
+ --edge-selected: var(--brand);
237
243
  --destructive: #8c1818;
238
244
  --destructive-foreground: #ffffff;
239
245
  --destructive-subtle: #fbe7e7;
@@ -275,6 +281,8 @@
275
281
  --border: #6c7580;
276
282
  --input: #8c96a3;
277
283
  --ring: var(--brand);
284
+ --edge: var(--input);
285
+ --edge-selected: var(--brand);
278
286
  --destructive: #ffa39b;
279
287
  --destructive-foreground: #07090c;
280
288
  --destructive-subtle: #3a1313;
@@ -285,8 +285,9 @@ export interface TextSpacingOptions {
285
285
  * reports every box whose content now runs out of it further than it did before. Measuring the difference
286
286
  * leaves alone anything that was already clipped on purpose (visually hidden text, a decorative bleed).
287
287
  * Scroll containers are left out too, since their content can still be scrolled to, and so is text that
288
- * spills from a box inside a scroller that scrolls that way (code in a code block). Only the innermost box
289
- * is reported. Takes the spacing off again before returning. Returns [] when everything still fits.
288
+ * spills from a box inside a scroller that scrolls that way (code in a code block), or inside a pane marked
289
+ * `data-setsquare-pannable`: one people move with pan controls instead of scrollbars, such as a React Flow
290
+ * diagram, which lays itself out again once its nodes have grown. Only the innermost box is reported. Takes the spacing off again before returning. Returns [] when everything still fits.
290
291
  */
291
292
  export declare function findClippedText(options?: TextSpacingOptions, root?: ParentNode): ClippedText[];
292
293
  /** Throws, listing every finding, unless all the text still fits with WCAG 1.4.12's spacing applied. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,mGAAmG;IACnG,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACzD,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,UAAqB,GAAG,kBAAkB,EAAE,CAmE5F;AAED,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,UAAqB,GAAG,oBAAoB,EAAE,CAkG7F;AAED,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;CAC/C;AAED,mCAAmC;AACnC,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAUlF;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/E;AAMD,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,0FAA0F;IAC1F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,kBAAuB,EAChC,IAAI,GAAE,UAAqB,GAC1B,aAAa,EAAE,CA4DjB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,UAAqB,GAAG,cAAc,EAAE,CA+EpF;AAED,uGAAuG;AACvG,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAcf;AAID,sFAAsF;AACtF,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,QAAQ,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAChD,UAAU,CAAC,OAAO,EAAE;QAClB,IAAI,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9D,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5B,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,EAAE,CAAC,CAqK3B;AAED,mHAAmH;AACnH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAaf;AAID,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,EAAE,aAAa,GAAG,cAAc,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,WAAgB,EACzB,IAAI,GAAE,UAAqB,GAC1B,WAAW,EAAE,CAuGf;AAED,yGAAyG;AACzG,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAaf;AAID,wFAAwF;AACxF,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,KAAK,EAAE;QAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;CACtD;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,MAAM,GACN,MAAM,GACN,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IACvD,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mGAAmG;IACnG,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAAA;KAAE,EAAE,CAAC;CACrD;AAQD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,aAAa,EAAE,CAAC,CAoJ1B;AAED,wFAAwF;AACxF,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAYf;AAID,MAAM,WAAW,YAAY;IAC3B,+FAA+F;IAC/F,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,mBAAwB,EACjC,IAAI,GAAE,UAAqB,GAC1B,YAAY,EAAE,CA8EhB;AAED,+GAA+G;AAC/G,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAaf;AAID,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,4GAA4G;IAC5G,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,kBAAuB,EAChC,IAAI,GAAE,UAAqB,GAC1B,WAAW,EAAE,CAyEf;AAED,wGAAwG;AACxG,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf;AAID,MAAM,WAAW,gBAAgB;IAC/B,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,6GAA6G;IAC7G,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,gBAAqB,EAC9B,IAAI,GAAE,UAAqB,GAC1B,gBAAgB,EAAE,CAgEpB;AAED,uGAAuG;AACvG,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAYf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}