@xfilecom/front-core 0.2.28 → 0.2.29

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 (49) hide show
  1. package/README.md +1 -0
  2. package/dist/base.css +717 -0
  3. package/dist/components/atoms/Accordion.d.ts +18 -0
  4. package/dist/components/atoms/Accordion.js +68 -0
  5. package/dist/components/atoms/Alert.d.ts +12 -0
  6. package/dist/components/atoms/Alert.js +24 -0
  7. package/dist/components/atoms/AspectRatio.d.ts +8 -0
  8. package/dist/components/atoms/AspectRatio.js +10 -0
  9. package/dist/components/atoms/Avatar.d.ts +22 -0
  10. package/dist/components/atoms/Avatar.js +32 -0
  11. package/dist/components/atoms/Breadcrumb.d.ts +15 -0
  12. package/dist/components/atoms/Breadcrumb.js +27 -0
  13. package/dist/components/atoms/Collapsible.d.ts +12 -0
  14. package/dist/components/atoms/Collapsible.js +42 -0
  15. package/dist/components/atoms/Label.d.ts +8 -0
  16. package/dist/components/atoms/Label.js +10 -0
  17. package/dist/components/atoms/Pagination.d.ts +13 -0
  18. package/dist/components/atoms/Pagination.js +25 -0
  19. package/dist/components/atoms/Progress.d.ts +8 -0
  20. package/dist/components/atoms/Progress.js +9 -0
  21. package/dist/components/atoms/RadioGroup.d.ts +15 -0
  22. package/dist/components/atoms/RadioGroup.js +37 -0
  23. package/dist/components/atoms/ScrollArea.d.ts +8 -0
  24. package/dist/components/atoms/ScrollArea.js +15 -0
  25. package/dist/components/atoms/Separator.d.ts +10 -0
  26. package/dist/components/atoms/Separator.js +17 -0
  27. package/dist/components/atoms/Skeleton.d.ts +6 -0
  28. package/dist/components/atoms/Skeleton.js +15 -0
  29. package/dist/components/atoms/Slider.d.ts +4 -0
  30. package/dist/components/atoms/Slider.js +9 -0
  31. package/dist/components/atoms/Switch.d.ts +10 -0
  32. package/dist/components/atoms/Switch.js +12 -0
  33. package/dist/components/atoms/Table.d.ts +20 -0
  34. package/dist/components/atoms/Table.js +38 -0
  35. package/dist/components/atoms/Tabs.d.ts +20 -0
  36. package/dist/components/atoms/Tabs.js +54 -0
  37. package/dist/components/atoms/Toggle.d.ts +8 -0
  38. package/dist/components/atoms/Toggle.js +23 -0
  39. package/dist/components/atoms/Tooltip.d.ts +10 -0
  40. package/dist/components/atoms/Tooltip.js +12 -0
  41. package/dist/components/atoms/index.d.ts +22 -3
  42. package/dist/components/atoms/index.js +76 -7
  43. package/dist/generatedVersion.d.ts +1 -1
  44. package/dist/generatedVersion.js +1 -1
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +51 -1
  47. package/docs/COMPONENTS.md +26 -0
  48. package/docs/SHADCN.md +66 -0
  49. package/package.json +1 -1
package/README.md CHANGED
@@ -8,6 +8,7 @@ Design tokens (`tokens.css`), atomic layout (`base.css`), browser-only React com
8
8
  |------|------|
9
9
  | [docs/DESIGN_SYSTEM.md](./docs/DESIGN_SYSTEM.md) | MUI Paper / react-native-paper 등과 **개념 매핑**, elevation·역할 색 |
10
10
  | [docs/COMPONENTS.md](./docs/COMPONENTS.md) | 컴포넌트별 **소스 경로**, props 요약, **복붙 예제 코드** |
11
+ | [docs/SHADCN.md](./docs/SHADCN.md) | [shadcn/ui](https://ui.shadcn.com/) **대응표** — Radix 없이 쓰는 범위·앱 의존 권장 |
11
12
 
12
13
  npm 패키지에 `docs/`가 포함되므로, 설치 후 `node_modules/@xfilecom/front-core/docs/`에서도 동일 파일을 볼 수 있다.
13
14
 
package/dist/base.css CHANGED
@@ -512,6 +512,723 @@ a:hover {
512
512
  color: var(--xfc-danger);
513
513
  }
514
514
 
515
+ /* —— shadcn/ui-style primitives (토큰만, Radix 미사용) —— */
516
+
517
+ .xfc-label {
518
+ display: inline-block;
519
+ font-size: var(--xfc-text-small);
520
+ font-weight: 600;
521
+ line-height: var(--xfc-leading-normal);
522
+ color: var(--xfc-fg-label);
523
+ cursor: default;
524
+ user-select: none;
525
+ }
526
+
527
+ label.xfc-label {
528
+ cursor: pointer;
529
+ }
530
+
531
+ .xfc-label--disabled {
532
+ opacity: 0.5;
533
+ cursor: not-allowed;
534
+ pointer-events: none;
535
+ }
536
+
537
+ .xfc-separator {
538
+ flex-shrink: 0;
539
+ background: var(--xfc-border);
540
+ border: none;
541
+ }
542
+
543
+ .xfc-separator--horizontal {
544
+ width: 100%;
545
+ height: 1px;
546
+ margin: var(--xfc-space-sm) 0;
547
+ }
548
+
549
+ .xfc-separator--vertical {
550
+ width: 1px;
551
+ min-height: 1em;
552
+ align-self: stretch;
553
+ margin: 0 var(--xfc-space-sm);
554
+ }
555
+
556
+ .xfc-skeleton {
557
+ display: block;
558
+ border-radius: var(--xfc-radius-sm);
559
+ background: linear-gradient(
560
+ 90deg,
561
+ var(--xfc-bg-muted) 0%,
562
+ color-mix(in srgb, var(--xfc-bg-elevated) 55%, var(--xfc-bg-muted)) 50%,
563
+ var(--xfc-bg-muted) 100%
564
+ );
565
+ background-size: 200% 100%;
566
+ animation: xfc-skeleton-shimmer 1.2s ease-in-out infinite;
567
+ }
568
+
569
+ .xfc-skeleton--circle {
570
+ border-radius: 50%;
571
+ }
572
+
573
+ @keyframes xfc-skeleton-shimmer {
574
+ 0% {
575
+ background-position: 200% 0;
576
+ }
577
+ 100% {
578
+ background-position: -200% 0;
579
+ }
580
+ }
581
+
582
+ @media (prefers-reduced-motion: reduce) {
583
+ .xfc-skeleton {
584
+ animation: none;
585
+ background: var(--xfc-bg-muted);
586
+ }
587
+ }
588
+
589
+ .xfc-switch {
590
+ display: inline-flex;
591
+ align-items: center;
592
+ gap: var(--xfc-space-sm);
593
+ cursor: pointer;
594
+ vertical-align: middle;
595
+ }
596
+
597
+ .xfc-switch--disabled {
598
+ opacity: 0.5;
599
+ cursor: not-allowed;
600
+ pointer-events: none;
601
+ }
602
+
603
+ .xfc-switch__input {
604
+ position: absolute;
605
+ width: 1px;
606
+ height: 1px;
607
+ padding: 0;
608
+ margin: -1px;
609
+ overflow: hidden;
610
+ clip: rect(0, 0, 0, 0);
611
+ white-space: nowrap;
612
+ border: 0;
613
+ }
614
+
615
+ .xfc-switch__track {
616
+ position: relative;
617
+ width: 2.75rem;
618
+ height: 1.5rem;
619
+ flex-shrink: 0;
620
+ border-radius: var(--xfc-radius-full);
621
+ background: var(--xfc-bg-muted);
622
+ border: 1px solid var(--xfc-border-strong);
623
+ transition:
624
+ background 0.18s ease,
625
+ border-color 0.18s ease;
626
+ }
627
+
628
+ .xfc-switch__thumb {
629
+ position: absolute;
630
+ top: 2px;
631
+ left: 2px;
632
+ width: calc(1.5rem - 6px);
633
+ height: calc(1.5rem - 6px);
634
+ border-radius: 50%;
635
+ background: var(--xfc-bg-elevated);
636
+ box-shadow: var(--xfc-shadow-xs);
637
+ transition: transform 0.18s ease;
638
+ }
639
+
640
+ .xfc-switch__input:focus-visible + .xfc-switch__track {
641
+ box-shadow: var(--xfc-focus-ring);
642
+ }
643
+
644
+ .xfc-switch__input:checked + .xfc-switch__track {
645
+ background: color-mix(in srgb, var(--xfc-accent) 35%, var(--xfc-bg-muted));
646
+ border-color: color-mix(in srgb, var(--xfc-accent) 45%, var(--xfc-border-strong));
647
+ }
648
+
649
+ .xfc-switch__input:checked + .xfc-switch__track .xfc-switch__thumb {
650
+ transform: translateX(1.25rem);
651
+ }
652
+
653
+ .xfc-progress {
654
+ position: relative;
655
+ width: 100%;
656
+ height: 0.5rem;
657
+ overflow: hidden;
658
+ border-radius: var(--xfc-radius-full);
659
+ background: var(--xfc-bg-muted);
660
+ border: 1px solid var(--xfc-border);
661
+ }
662
+
663
+ .xfc-progress__indicator {
664
+ height: 100%;
665
+ border-radius: inherit;
666
+ background: var(--xfc-accent);
667
+ transition: width 0.28s ease;
668
+ }
669
+
670
+ .xfc-tabs {
671
+ width: 100%;
672
+ }
673
+
674
+ .xfc-tabs-list {
675
+ display: inline-flex;
676
+ flex-wrap: wrap;
677
+ gap: var(--xfc-space-xs);
678
+ padding: var(--xfc-space-xs);
679
+ border-radius: var(--xfc-radius-md);
680
+ background: color-mix(in srgb, var(--xfc-bg-muted) 55%, var(--xfc-bg-elevated));
681
+ border: 1px solid var(--xfc-border);
682
+ }
683
+
684
+ .xfc-tabs-trigger {
685
+ display: inline-flex;
686
+ align-items: center;
687
+ justify-content: center;
688
+ min-height: 2.25rem;
689
+ padding: 0 var(--xfc-space-md);
690
+ font: inherit;
691
+ font-size: var(--xfc-text-small);
692
+ font-weight: 600;
693
+ color: var(--xfc-fg-muted);
694
+ background: transparent;
695
+ border: none;
696
+ border-radius: var(--xfc-radius-sm);
697
+ cursor: pointer;
698
+ transition:
699
+ color 0.15s ease,
700
+ background 0.15s ease;
701
+ }
702
+
703
+ .xfc-tabs-trigger:hover:not(:disabled) {
704
+ color: var(--xfc-fg-label);
705
+ }
706
+
707
+ .xfc-tabs-trigger:disabled {
708
+ opacity: 0.45;
709
+ cursor: not-allowed;
710
+ }
711
+
712
+ .xfc-tabs-trigger--active {
713
+ color: var(--xfc-fg-strong);
714
+ background: var(--xfc-bg-elevated);
715
+ box-shadow: var(--xfc-shadow-xs);
716
+ }
717
+
718
+ .xfc-tabs-trigger:focus-visible {
719
+ outline: none;
720
+ box-shadow: var(--xfc-focus-ring);
721
+ }
722
+
723
+ .xfc-tabs-content {
724
+ margin-top: var(--xfc-space-md);
725
+ outline: none;
726
+ }
727
+
728
+ .xfc-tabs-content[hidden] {
729
+ display: none;
730
+ }
731
+
732
+ .xfc-accordion {
733
+ width: 100%;
734
+ border-radius: var(--xfc-radius-md);
735
+ border: 1px solid var(--xfc-border);
736
+ background: var(--xfc-bg-elevated);
737
+ overflow: hidden;
738
+ }
739
+
740
+ .xfc-accordion-item + .xfc-accordion-item {
741
+ border-top: 1px solid var(--xfc-border);
742
+ }
743
+
744
+ .xfc-accordion-trigger {
745
+ display: flex;
746
+ width: 100%;
747
+ align-items: center;
748
+ justify-content: space-between;
749
+ gap: var(--xfc-space-md);
750
+ padding: var(--xfc-space-md) var(--xfc-space-lg);
751
+ font: inherit;
752
+ font-size: var(--xfc-text-body);
753
+ font-weight: 600;
754
+ text-align: left;
755
+ color: var(--xfc-fg-strong);
756
+ background: transparent;
757
+ border: none;
758
+ cursor: pointer;
759
+ transition: background 0.15s ease;
760
+ }
761
+
762
+ .xfc-accordion-trigger:hover:not(:disabled) {
763
+ background: color-mix(in srgb, var(--xfc-bg-muted) 40%, transparent);
764
+ }
765
+
766
+ .xfc-accordion-trigger:disabled {
767
+ opacity: 0.5;
768
+ cursor: not-allowed;
769
+ }
770
+
771
+ .xfc-accordion-trigger__chevron {
772
+ flex-shrink: 0;
773
+ width: 1rem;
774
+ height: 1rem;
775
+ transition: transform 0.2s ease;
776
+ color: var(--xfc-fg-muted);
777
+ }
778
+
779
+ .xfc-accordion-trigger[aria-expanded='true'] .xfc-accordion-trigger__chevron {
780
+ transform: rotate(180deg);
781
+ }
782
+
783
+ .xfc-accordion-content {
784
+ padding: 0 var(--xfc-space-lg) var(--xfc-space-md);
785
+ font-size: var(--xfc-text-body);
786
+ line-height: var(--xfc-leading-normal);
787
+ color: var(--xfc-fg);
788
+ }
789
+
790
+ .xfc-accordion-content[hidden] {
791
+ display: none;
792
+ }
793
+
794
+ .xfc-collapsible-content[hidden] {
795
+ display: none;
796
+ }
797
+
798
+ .xfc-collapsible-trigger {
799
+ display: inline-flex;
800
+ align-items: center;
801
+ gap: var(--xfc-space-sm);
802
+ padding: var(--xfc-space-xs) var(--xfc-space-sm);
803
+ font: inherit;
804
+ font-size: var(--xfc-text-small);
805
+ font-weight: 600;
806
+ color: var(--xfc-accent);
807
+ background: transparent;
808
+ border: none;
809
+ border-radius: var(--xfc-radius-sm);
810
+ cursor: pointer;
811
+ transition: background 0.15s ease;
812
+ }
813
+
814
+ .xfc-collapsible-trigger:hover:not(:disabled) {
815
+ background: var(--xfc-accent-soft);
816
+ }
817
+
818
+ .xfc-collapsible-trigger:disabled {
819
+ opacity: 0.45;
820
+ cursor: not-allowed;
821
+ }
822
+
823
+ .xfc-collapsible-trigger:focus-visible {
824
+ outline: none;
825
+ box-shadow: var(--xfc-focus-ring);
826
+ }
827
+
828
+ .xfc-collapsible-panel {
829
+ margin-top: var(--xfc-space-sm);
830
+ font-size: var(--xfc-text-body);
831
+ line-height: var(--xfc-leading-normal);
832
+ color: var(--xfc-fg);
833
+ }
834
+
835
+ .xfc-alert {
836
+ position: relative;
837
+ width: 100%;
838
+ padding: var(--xfc-space-md) var(--xfc-space-lg);
839
+ border-radius: var(--xfc-radius-md);
840
+ border: 1px solid var(--xfc-border);
841
+ background: color-mix(in srgb, var(--xfc-bg-muted) 35%, var(--xfc-bg-elevated));
842
+ color: var(--xfc-fg);
843
+ }
844
+
845
+ .xfc-alert--destructive {
846
+ border-color: color-mix(in srgb, var(--xfc-danger) 35%, var(--xfc-border));
847
+ background: color-mix(in srgb, var(--xfc-danger) 10%, var(--xfc-bg-elevated));
848
+ color: var(--xfc-fg-strong);
849
+ }
850
+
851
+ .xfc-alert__title {
852
+ margin: 0 0 var(--xfc-space-xs);
853
+ font-size: var(--xfc-text-body);
854
+ font-weight: 700;
855
+ line-height: var(--xfc-leading-tight);
856
+ }
857
+
858
+ .xfc-alert__description {
859
+ margin: 0;
860
+ font-size: var(--xfc-text-small);
861
+ line-height: var(--xfc-leading-normal);
862
+ color: var(--xfc-fg-muted);
863
+ }
864
+
865
+ .xfc-alert--destructive .xfc-alert__description {
866
+ color: color-mix(in srgb, var(--xfc-danger) 55%, var(--xfc-fg-muted));
867
+ }
868
+
869
+ .xfc-avatar {
870
+ position: relative;
871
+ display: inline-flex;
872
+ width: 2.5rem;
873
+ height: 2.5rem;
874
+ flex-shrink: 0;
875
+ overflow: hidden;
876
+ border-radius: 50%;
877
+ border: 1px solid var(--xfc-border);
878
+ background: var(--xfc-bg-muted);
879
+ align-items: center;
880
+ justify-content: center;
881
+ font-size: var(--xfc-text-small);
882
+ font-weight: 700;
883
+ color: var(--xfc-fg-label);
884
+ }
885
+
886
+ .xfc-avatar__image {
887
+ width: 100%;
888
+ height: 100%;
889
+ object-fit: cover;
890
+ }
891
+
892
+ .xfc-avatar__fallback {
893
+ display: flex;
894
+ align-items: center;
895
+ justify-content: center;
896
+ width: 100%;
897
+ height: 100%;
898
+ }
899
+
900
+ .xfc-breadcrumb {
901
+ width: 100%;
902
+ }
903
+
904
+ .xfc-breadcrumb-list {
905
+ display: flex;
906
+ flex-wrap: wrap;
907
+ align-items: center;
908
+ gap: var(--xfc-space-xs);
909
+ margin: 0;
910
+ padding: 0;
911
+ list-style: none;
912
+ font-size: var(--xfc-text-small);
913
+ }
914
+
915
+ .xfc-breadcrumb-item {
916
+ display: inline-flex;
917
+ align-items: center;
918
+ gap: var(--xfc-space-xs);
919
+ }
920
+
921
+ .xfc-breadcrumb-link {
922
+ color: var(--xfc-fg-muted);
923
+ text-decoration: none;
924
+ font-weight: 500;
925
+ transition: color 0.15s ease;
926
+ }
927
+
928
+ .xfc-breadcrumb-link:hover {
929
+ color: var(--xfc-accent);
930
+ }
931
+
932
+ .xfc-breadcrumb-page {
933
+ font-weight: 600;
934
+ color: var(--xfc-fg-strong);
935
+ }
936
+
937
+ .xfc-breadcrumb-sep {
938
+ color: var(--xfc-fg-muted);
939
+ user-select: none;
940
+ }
941
+
942
+ .xfc-table-wrap {
943
+ width: 100%;
944
+ overflow-x: auto;
945
+ border-radius: var(--xfc-radius-md);
946
+ border: 1px solid var(--xfc-border);
947
+ }
948
+
949
+ .xfc-table {
950
+ width: 100%;
951
+ border-collapse: collapse;
952
+ font-size: var(--xfc-text-small);
953
+ }
954
+
955
+ .xfc-table-caption {
956
+ caption-side: bottom;
957
+ padding: var(--xfc-space-sm) var(--xfc-space-md);
958
+ font-size: var(--xfc-text-small);
959
+ color: var(--xfc-fg-muted);
960
+ text-align: left;
961
+ }
962
+
963
+ .xfc-table-header {
964
+ background: color-mix(in srgb, var(--xfc-bg-muted) 50%, var(--xfc-bg-elevated));
965
+ }
966
+
967
+ .xfc-table-row {
968
+ border-bottom: 1px solid var(--xfc-border);
969
+ transition: background 0.12s ease;
970
+ }
971
+
972
+ .xfc-table-row:last-child {
973
+ border-bottom: none;
974
+ }
975
+
976
+ @media (hover: hover) {
977
+ .xfc-table-row:hover {
978
+ background: color-mix(in srgb, var(--xfc-bg-muted) 25%, transparent);
979
+ }
980
+ }
981
+
982
+ .xfc-table-head {
983
+ padding: var(--xfc-space-sm) var(--xfc-space-md);
984
+ text-align: left;
985
+ font-weight: 700;
986
+ color: var(--xfc-fg-label);
987
+ white-space: nowrap;
988
+ }
989
+
990
+ .xfc-table-cell {
991
+ padding: var(--xfc-space-md);
992
+ color: var(--xfc-fg);
993
+ vertical-align: middle;
994
+ }
995
+
996
+ .xfc-table-footer .xfc-table-cell {
997
+ font-weight: 600;
998
+ background: color-mix(in srgb, var(--xfc-bg-muted) 35%, var(--xfc-bg-elevated));
999
+ }
1000
+
1001
+ .xfc-scroll-area {
1002
+ overflow: auto;
1003
+ border-radius: var(--xfc-radius-sm);
1004
+ border: 1px solid var(--xfc-border);
1005
+ background: var(--xfc-bg-elevated);
1006
+ }
1007
+
1008
+ .xfc-scroll-area:focus-visible {
1009
+ outline: none;
1010
+ box-shadow: var(--xfc-focus-ring);
1011
+ }
1012
+
1013
+ .xfc-toggle {
1014
+ display: inline-flex;
1015
+ align-items: center;
1016
+ justify-content: center;
1017
+ min-height: 2.25rem;
1018
+ min-width: 2.25rem;
1019
+ padding: 0 var(--xfc-space-sm);
1020
+ font: inherit;
1021
+ font-size: var(--xfc-text-small);
1022
+ font-weight: 600;
1023
+ color: var(--xfc-fg-muted);
1024
+ background: transparent;
1025
+ border: 1px solid transparent;
1026
+ border-radius: var(--xfc-radius-sm);
1027
+ cursor: pointer;
1028
+ transition:
1029
+ background 0.15s ease,
1030
+ color 0.15s ease,
1031
+ border-color 0.15s ease;
1032
+ }
1033
+
1034
+ .xfc-toggle:hover:not(:disabled) {
1035
+ background: var(--xfc-bg-muted);
1036
+ color: var(--xfc-fg-label);
1037
+ }
1038
+
1039
+ .xfc-toggle:disabled {
1040
+ opacity: 0.45;
1041
+ cursor: not-allowed;
1042
+ }
1043
+
1044
+ .xfc-toggle--pressed {
1045
+ background: color-mix(in srgb, var(--xfc-accent) 14%, var(--xfc-bg-elevated));
1046
+ color: var(--xfc-accent);
1047
+ border-color: color-mix(in srgb, var(--xfc-accent) 28%, var(--xfc-border));
1048
+ }
1049
+
1050
+ .xfc-toggle:focus-visible {
1051
+ outline: none;
1052
+ box-shadow: var(--xfc-focus-ring);
1053
+ }
1054
+
1055
+ .xfc-radio-group {
1056
+ display: flex;
1057
+ flex-direction: column;
1058
+ gap: var(--xfc-space-sm);
1059
+ border: none;
1060
+ margin: 0;
1061
+ padding: 0;
1062
+ }
1063
+
1064
+ .xfc-radio-group__legend {
1065
+ font-size: var(--xfc-text-small);
1066
+ font-weight: 600;
1067
+ color: var(--xfc-fg-label);
1068
+ margin-bottom: var(--xfc-space-xs);
1069
+ padding: 0;
1070
+ }
1071
+
1072
+ .xfc-radio-row {
1073
+ display: inline-flex;
1074
+ align-items: center;
1075
+ gap: var(--xfc-space-sm);
1076
+ }
1077
+
1078
+ .xfc-radio {
1079
+ width: 1.125rem;
1080
+ height: 1.125rem;
1081
+ flex-shrink: 0;
1082
+ accent-color: var(--xfc-accent);
1083
+ cursor: pointer;
1084
+ }
1085
+
1086
+ .xfc-radio:disabled {
1087
+ cursor: not-allowed;
1088
+ opacity: 0.55;
1089
+ }
1090
+
1091
+ .xfc-radio-label {
1092
+ font-size: var(--xfc-text-body);
1093
+ color: var(--xfc-fg-label);
1094
+ cursor: pointer;
1095
+ }
1096
+
1097
+ .xfc-aspect {
1098
+ position: relative;
1099
+ width: 100%;
1100
+ overflow: hidden;
1101
+ border-radius: var(--xfc-radius-md);
1102
+ }
1103
+
1104
+ .xfc-aspect__inner {
1105
+ position: absolute;
1106
+ inset: 0;
1107
+ }
1108
+
1109
+ .xfc-tooltip {
1110
+ position: relative;
1111
+ display: inline-flex;
1112
+ }
1113
+
1114
+ .xfc-tooltip__trigger {
1115
+ display: inline-flex;
1116
+ }
1117
+
1118
+ .xfc-tooltip__content {
1119
+ position: absolute;
1120
+ z-index: 50;
1121
+ left: 50%;
1122
+ bottom: calc(100% + 6px);
1123
+ transform: translateX(-50%);
1124
+ max-width: 240px;
1125
+ padding: var(--xfc-space-xs) var(--xfc-space-sm);
1126
+ font-size: var(--xfc-text-small);
1127
+ font-weight: 500;
1128
+ line-height: var(--xfc-leading-normal);
1129
+ color: var(--xfc-accent-fg);
1130
+ background: var(--xfc-fg-strong);
1131
+ border-radius: var(--xfc-radius-sm);
1132
+ box-shadow: var(--xfc-shadow-md);
1133
+ pointer-events: none;
1134
+ white-space: normal;
1135
+ text-align: center;
1136
+ }
1137
+
1138
+ .xfc-tooltip__content::after {
1139
+ content: '';
1140
+ position: absolute;
1141
+ top: 100%;
1142
+ left: 50%;
1143
+ margin-left: -5px;
1144
+ border: 5px solid transparent;
1145
+ border-top-color: var(--xfc-fg-strong);
1146
+ }
1147
+
1148
+ .xfc-slider {
1149
+ width: 100%;
1150
+ height: 1.25rem;
1151
+ margin: 0;
1152
+ accent-color: var(--xfc-accent);
1153
+ cursor: pointer;
1154
+ }
1155
+
1156
+ .xfc-slider:disabled {
1157
+ opacity: 0.5;
1158
+ cursor: not-allowed;
1159
+ }
1160
+
1161
+ .xfc-pagination {
1162
+ width: 100%;
1163
+ }
1164
+
1165
+ .xfc-pagination__list {
1166
+ display: flex;
1167
+ flex-wrap: wrap;
1168
+ align-items: center;
1169
+ gap: var(--xfc-space-xs);
1170
+ margin: 0;
1171
+ padding: 0;
1172
+ list-style: none;
1173
+ }
1174
+
1175
+ .xfc-pagination__ellipsis {
1176
+ display: inline-flex;
1177
+ align-items: center;
1178
+ justify-content: center;
1179
+ min-width: 2.25rem;
1180
+ height: 2.25rem;
1181
+ font-size: var(--xfc-text-small);
1182
+ color: var(--xfc-fg-muted);
1183
+ user-select: none;
1184
+ }
1185
+
1186
+ .xfc-pagination__link {
1187
+ display: inline-flex;
1188
+ align-items: center;
1189
+ justify-content: center;
1190
+ min-width: 2.25rem;
1191
+ height: 2.25rem;
1192
+ padding: 0 var(--xfc-space-sm);
1193
+ font: inherit;
1194
+ font-size: var(--xfc-text-small);
1195
+ font-weight: 600;
1196
+ color: var(--xfc-fg);
1197
+ text-decoration: none;
1198
+ background: var(--xfc-bg-elevated);
1199
+ border: 1px solid var(--xfc-border);
1200
+ border-radius: var(--xfc-radius-sm);
1201
+ cursor: pointer;
1202
+ transition:
1203
+ background 0.15s ease,
1204
+ border-color 0.15s ease;
1205
+ }
1206
+
1207
+ button.xfc-pagination__link {
1208
+ font: inherit;
1209
+ }
1210
+
1211
+ .xfc-pagination__link:hover:not(:disabled) {
1212
+ background: var(--xfc-bg-muted);
1213
+ border-color: var(--xfc-border-strong);
1214
+ }
1215
+
1216
+ .xfc-pagination__link:disabled {
1217
+ opacity: 0.45;
1218
+ cursor: not-allowed;
1219
+ }
1220
+
1221
+ .xfc-pagination__link--active {
1222
+ background: color-mix(in srgb, var(--xfc-accent) 18%, var(--xfc-bg-elevated));
1223
+ border-color: color-mix(in srgb, var(--xfc-accent) 40%, var(--xfc-border-strong));
1224
+ color: var(--xfc-accent);
1225
+ }
1226
+
1227
+ .xfc-pagination__link:focus-visible {
1228
+ outline: none;
1229
+ box-shadow: var(--xfc-focus-ring);
1230
+ }
1231
+
515
1232
  /* —— Badges —— */
516
1233
 
517
1234
  .xfc-badge {