niuma-ui 2.0.0 → 2.0.2

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 (119) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.en.md +1 -118
  3. package/README.md +58 -62
  4. package/README.zh-CN.md +128 -0
  5. package/dist/brand-icons.css +40 -0
  6. package/dist/components/_shared/src/reka.d.ts +1 -1
  7. package/dist/components/_shared/src/reka.js +2 -2
  8. package/dist/components/_shared/src/resolve-radius.js +1 -1
  9. package/dist/components/avatar/src/RsAvatar.impl.js +1 -1
  10. package/dist/components/button/src/RsButton.impl.js +1 -1
  11. package/dist/components/card/src/RsCard.impl.js +1 -1
  12. package/dist/components/cascader/src/RsCascader.css +20 -20
  13. package/dist/components/cascader/src/RsCascader.js +1 -1
  14. package/dist/components/code-block/src/RsCodeBlock.d.ts +1 -1
  15. package/dist/components/code-editor/src/code-editor-utils.js +2 -2
  16. package/dist/components/code-editor/src/code-mirror-lang.js +1 -1
  17. package/dist/components/config-provider/src/RsConfigProvider.css +2 -2
  18. package/dist/components/config-provider/src/RsConfigProvider.d.ts +8 -6
  19. package/dist/components/config-provider/src/RsConfigProvider.impl.js +64 -15
  20. package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
  21. package/dist/components/context-menu/src/RsContextMenu.css +2 -2
  22. package/dist/components/context-menu/src/RsContextMenuItems.impl.js +1 -1
  23. package/dist/components/date-picker/src/RsDatePicker.css +17 -17
  24. package/dist/components/date-picker/src/RsDatePicker.impl.js +2 -2
  25. package/dist/components/date-picker/src/RsDatePicker.js +1 -1
  26. package/dist/components/dialog/src/RsConfirmDialog.impl.js +1 -1
  27. package/dist/components/dialog/src/RsDialog.css +1 -2
  28. package/dist/components/dialog/src/RsDialog.impl.js +1 -1
  29. package/dist/components/divider/src/RsDivider.css +13 -13
  30. package/dist/components/divider/src/RsDivider.js +1 -1
  31. package/dist/components/drawer/src/RsDrawer.css +2 -4
  32. package/dist/components/drawer/src/RsDrawer.impl.js +1 -1
  33. package/dist/components/dropdown/src/RsDropdown.css +2 -2
  34. package/dist/components/dropdown/src/RsDropdown.impl.js +1 -1
  35. package/dist/components/dropdown/src/RsDropdownItemView.impl.js +1 -1
  36. package/dist/components/form/src/form-rules.js +2 -2
  37. package/dist/components/icon/src/RsIcon.css +4 -4
  38. package/dist/components/icon/src/RsIcon.impl.js +6 -1
  39. package/dist/components/icon/src/RsIcon.js +1 -1
  40. package/dist/components/input/src/RsInput.css +86 -86
  41. package/dist/components/input/src/RsInput.js +1 -1
  42. package/dist/components/input/src/input-rules.js +3 -3
  43. package/dist/components/input-number/src/RsInputNumber.css +32 -32
  44. package/dist/components/input-number/src/RsInputNumber.js +1 -1
  45. package/dist/components/label/src/RsLabel.css +7 -7
  46. package/dist/components/label/src/RsLabel.js +1 -1
  47. package/dist/components/loading-bar/src/RsLoadingBar.css +4 -5
  48. package/dist/components/loading-bar/src/RsLoadingBar.js +1 -1
  49. package/dist/components/log/src/RsLog.css +39 -39
  50. package/dist/components/log/src/RsLog.d.ts +1 -1
  51. package/dist/components/log/src/RsLog.impl.js +1 -1
  52. package/dist/components/log/src/RsLog.js +1 -1
  53. package/dist/components/markdown/src/RsMarkdown.css +9 -7
  54. package/dist/components/menu/src/RsMenu.css +5 -5
  55. package/dist/components/menu/src/RsMenuItems.impl.js +1 -1
  56. package/dist/components/pagination/src/RsPagination.css +18 -18
  57. package/dist/components/pagination/src/RsPagination.impl.js +1 -1
  58. package/dist/components/pagination/src/RsPagination.js +1 -1
  59. package/dist/components/radio/src/RsRadio.impl.js +1 -1
  60. package/dist/components/radio/src/RsRadioItem.impl.js +1 -1
  61. package/dist/components/select/src/RsSelect.css +42 -42
  62. package/dist/components/select/src/RsSelect.impl.js +2 -2
  63. package/dist/components/select/src/RsSelect.js +1 -1
  64. package/dist/components/steps/src/RsSteps.css +18 -18
  65. package/dist/components/steps/src/RsSteps.js +1 -1
  66. package/dist/components/switch/src/RsSwitch.css +4 -6
  67. package/dist/components/switch/src/RsSwitch.impl.js +1 -1
  68. package/dist/components/table/style/rs-table.css +15 -15
  69. package/dist/components/tabs/src/RsTabs.impl.js +1 -1
  70. package/dist/components/terminal/src/RsTerminal.css +24 -24
  71. package/dist/components/terminal/src/RsTerminal.js +1 -1
  72. package/dist/components/textarea/src/RsTextarea.css +26 -26
  73. package/dist/components/textarea/src/RsTextarea.js +1 -1
  74. package/dist/components/time-picker/src/RsTimePicker.css +20 -20
  75. package/dist/components/time-picker/src/RsTimePicker.impl.js +2 -2
  76. package/dist/components/time-picker/src/RsTimePicker.js +1 -1
  77. package/dist/components/toaster/src/RsToaster.css +6 -6
  78. package/dist/components/toaster/src/RsToaster.impl.js +3 -6
  79. package/dist/components/tooltip/src/RsTooltip.impl.js +1 -1
  80. package/dist/components/tree/src/RsTree.css +72 -73
  81. package/dist/components/tree/src/RsTree.js +1 -1
  82. package/dist/components/tree-select/src/RsTreeSelect.css +11 -11
  83. package/dist/components/tree-select/src/RsTreeSelect.js +1 -1
  84. package/dist/components/virtual-list/src/RsVirtualList.css +7 -8
  85. package/dist/components/virtual-list/src/RsVirtualList.js +1 -1
  86. package/dist/composables/createRsDialog.js +6 -5
  87. package/dist/composables/useRsConfig.d.ts +11 -3
  88. package/dist/composables/useRsConfig.js +18 -6
  89. package/dist/composables/useRsI18n.d.ts +1 -1
  90. package/dist/composables/useRsI18n.js +5 -5
  91. package/dist/icons/brand.d.ts +6 -0
  92. package/dist/icons/brand.js +26 -0
  93. package/dist/icons/registry.d.ts +2 -0
  94. package/dist/icons/registry.js +2 -1
  95. package/dist/index.d.ts +8 -4
  96. package/dist/index.js +19 -0
  97. package/dist/locale/apply.d.ts +8 -0
  98. package/dist/locale/apply.js +20 -0
  99. package/dist/locale/interpolate.d.ts +4 -3
  100. package/dist/locale/interpolate.js +108 -5
  101. package/dist/locale/messages.d.ts +2 -4
  102. package/dist/locale/messages.js +7 -9
  103. package/dist/locale/registry-public.d.ts +3 -0
  104. package/dist/locale/registry.d.ts +19 -0
  105. package/dist/locale/registry.js +50 -0
  106. package/dist/locale/resolve-host.d.ts +7 -0
  107. package/dist/locale/resolve-host.js +46 -0
  108. package/dist/locale/types.d.ts +13 -2
  109. package/dist/locale/types.js +6 -1
  110. package/dist/styles.css +245 -250
  111. package/dist/theme/apply.d.ts +15 -3
  112. package/dist/theme/apply.js +41 -4
  113. package/dist/theme/brand.example.css +5 -1
  114. package/dist/theme/presets.d.ts +6 -5
  115. package/dist/theme/presets.js +4 -3
  116. package/dist/theme/types.d.ts +15 -7
  117. package/dist/theme/types.js +4 -1
  118. package/dist/vite-plugins/niuma-ui-host.js +7 -0
  119. package/package.json +3 -1
package/dist/styles.css CHANGED
@@ -642,6 +642,180 @@ to {
642
642
  }
643
643
 
644
644
 
645
+ /*
646
+ * 内置图标:Lucide 走 --rs-icon-color;品牌 mark 走 --rs-icon-{name}-accent。
647
+ * 色值在 styles/index.css 的主题块里,这里只写图形规则。
648
+ */
649
+
650
+ .rs-icon {
651
+ color: var(--rs-icon-color, currentColor);
652
+ }
653
+
654
+ .lucide-api-icon .api-icon__label {
655
+ fill: currentColor;
656
+ stroke: none;
657
+ font-family: var(--rs-font-rounded);
658
+ font-size: 9.5px;
659
+ font-weight: 800;
660
+ letter-spacing: -0.04em;
661
+ text-anchor: middle;
662
+ -webkit-font-smoothing: antialiased;
663
+ }
664
+
665
+ .lucide-ftp-icon .ftp-icon__folder {
666
+ fill: var(--rs-icon-ftp-accent, currentColor);
667
+ stroke: color-mix(in srgb, var(--rs-icon-ftp-accent, currentColor) 55%, #1a1a1a);
668
+ stroke-width: 1.1;
669
+ }
670
+
671
+ .lucide-ftp-icon .ftp-icon__label {
672
+ fill: var(--rs-icon-ftp-on-accent, #ffffff);
673
+ stroke: none;
674
+ font-family: var(--rs-font-mono);
675
+ font-size: 6.2px;
676
+ font-weight: 900;
677
+ letter-spacing: -0.08em;
678
+ text-anchor: middle;
679
+ -webkit-font-smoothing: antialiased;
680
+ }
681
+
682
+ .rs-context-menu__item[data-highlighted] .lucide-ftp-icon .ftp-icon__folder,
683
+ .rs-context-menu__item[data-state='open'] .lucide-ftp-icon .ftp-icon__folder {
684
+ fill: rgb(255 255 255 / 0.95);
685
+ stroke: rgb(255 255 255 / 0.55);
686
+ }
687
+
688
+ .rs-context-menu__item[data-highlighted] .lucide-ftp-icon .ftp-icon__label,
689
+ .rs-context-menu__item[data-state='open'] .lucide-ftp-icon .ftp-icon__label {
690
+ fill: var(--rs-icon-ftp-accent);
691
+ }
692
+
693
+ .lucide-redis-icon .redis-icon__mark {
694
+ fill: var(--rs-icon-redis-accent, currentColor);
695
+ }
696
+
697
+ .rs-context-menu__item[data-highlighted] .lucide-redis-icon .redis-icon__mark,
698
+ .rs-context-menu__item[data-state='open'] .lucide-redis-icon .redis-icon__mark {
699
+ fill: rgb(255 255 255 / 0.95);
700
+ }
701
+
702
+ .lucide-mongodb-icon .mongodb-icon__mark {
703
+ fill: var(--rs-icon-mongodb-accent, currentColor);
704
+ }
705
+
706
+ .rs-context-menu__item[data-highlighted] .lucide-mongodb-icon .mongodb-icon__mark,
707
+ .rs-context-menu__item[data-state='open'] .lucide-mongodb-icon .mongodb-icon__mark {
708
+ fill: rgb(255 255 255 / 0.95);
709
+ }
710
+
711
+ .lucide-vastbase-icon .vastbase-icon__mark {
712
+ fill: var(--rs-icon-vastbase-accent, currentColor);
713
+ }
714
+
715
+ .rs-context-menu__item[data-highlighted] .lucide-vastbase-icon .vastbase-icon__mark,
716
+ .rs-context-menu__item[data-state='open'] .lucide-vastbase-icon .vastbase-icon__mark {
717
+ fill: rgb(255 255 255 / 0.95);
718
+ }
719
+
720
+ .lucide-mysql-icon .mysql-icon__mark {
721
+ fill: var(--rs-icon-mysql-accent, currentColor);
722
+ }
723
+
724
+ .rs-context-menu__item[data-highlighted] .lucide-mysql-icon .mysql-icon__mark,
725
+ .rs-context-menu__item[data-state='open'] .lucide-mysql-icon .mysql-icon__mark {
726
+ fill: rgb(255 255 255 / 0.95);
727
+ }
728
+
729
+ .lucide-dameng-icon .dameng-icon__oval {
730
+ fill: var(--rs-icon-dameng-accent);
731
+ }
732
+
733
+ .lucide-dameng-icon .dameng-icon__wave {
734
+ fill: var(--rs-icon-dameng-wave, currentColor);
735
+ }
736
+
737
+ .rs-context-menu__item[data-highlighted] .lucide-dameng-icon .dameng-icon__oval,
738
+ .rs-context-menu__item[data-state='open'] .lucide-dameng-icon .dameng-icon__oval,
739
+ .rs-context-menu__item[data-highlighted] .lucide-dameng-icon .dameng-icon__wave,
740
+ .rs-context-menu__item[data-state='open'] .lucide-dameng-icon .dameng-icon__wave {
741
+ fill: rgb(255 255 255 / 0.95);
742
+ }
743
+
744
+ .lucide-sqlite-icon .sqlite-icon__mark {
745
+ fill: var(--rs-icon-sqlite-accent, currentColor);
746
+ }
747
+
748
+ .rs-context-menu__item[data-highlighted] .lucide-sqlite-icon .sqlite-icon__mark,
749
+ .rs-context-menu__item[data-state='open'] .lucide-sqlite-icon .sqlite-icon__mark {
750
+ fill: rgb(255 255 255 / 0.95);
751
+ }
752
+
753
+ .lucide-oracle-icon .oracle-icon__mark {
754
+ fill: var(--rs-icon-oracle-accent, currentColor);
755
+ }
756
+
757
+ .rs-context-menu__item[data-highlighted] .lucide-oracle-icon .oracle-icon__mark,
758
+ .rs-context-menu__item[data-state='open'] .lucide-oracle-icon .oracle-icon__mark {
759
+ fill: rgb(255 255 255 / 0.95);
760
+ }
761
+
762
+ .lucide-clickhouse-icon .clickhouse-icon__mark {
763
+ fill: var(--rs-icon-clickhouse-accent, currentColor);
764
+ }
765
+
766
+ .rs-context-menu__item[data-highlighted] .lucide-clickhouse-icon .clickhouse-icon__mark,
767
+ .rs-context-menu__item[data-state='open'] .lucide-clickhouse-icon .clickhouse-icon__mark {
768
+ fill: rgb(255 255 255 / 0.95);
769
+ }
770
+
771
+ .lucide-kingbase-icon .kingbase-icon__mark {
772
+ fill: var(--rs-icon-kingbase-accent, currentColor);
773
+ }
774
+
775
+ .rs-context-menu__item[data-highlighted] .lucide-kingbase-icon .kingbase-icon__mark,
776
+ .rs-context-menu__item[data-state='open'] .lucide-kingbase-icon .kingbase-icon__mark {
777
+ fill: rgb(255 255 255 / 0.95);
778
+ }
779
+
780
+ .lucide-sqlserver-icon .sqlserver-icon__mark {
781
+ fill: var(--rs-icon-sqlserver-accent, currentColor);
782
+ }
783
+
784
+ .rs-context-menu__item[data-highlighted] .lucide-sqlserver-icon .sqlserver-icon__mark,
785
+ .rs-context-menu__item[data-state='open'] .lucide-sqlserver-icon .sqlserver-icon__mark {
786
+ fill: rgb(255 255 255 / 0.95);
787
+ }
788
+
789
+ .lucide-postgres-icon .postgres-icon__mark {
790
+ fill: var(--rs-icon-postgres-accent, currentColor);
791
+ }
792
+
793
+ .rs-context-menu__item[data-highlighted] .lucide-postgres-icon .postgres-icon__mark,
794
+ .rs-context-menu__item[data-state='open'] .lucide-postgres-icon .postgres-icon__mark {
795
+ fill: rgb(255 255 255 / 0.95);
796
+ }
797
+
798
+ @media (forced-colors: active) {
799
+ .lucide-ftp-icon .ftp-icon__folder,
800
+ .lucide-ftp-icon .ftp-icon__label,
801
+ .lucide-redis-icon .redis-icon__mark,
802
+ .lucide-mongodb-icon .mongodb-icon__mark,
803
+ .lucide-vastbase-icon .vastbase-icon__mark,
804
+ .lucide-mysql-icon .mysql-icon__mark,
805
+ .lucide-dameng-icon .dameng-icon__oval,
806
+ .lucide-dameng-icon .dameng-icon__wave,
807
+ .lucide-sqlite-icon .sqlite-icon__mark,
808
+ .lucide-oracle-icon .oracle-icon__mark,
809
+ .lucide-clickhouse-icon .clickhouse-icon__mark,
810
+ .lucide-kingbase-icon .kingbase-icon__mark,
811
+ .lucide-sqlserver-icon .sqlserver-icon__mark,
812
+ .lucide-postgres-icon .postgres-icon__mark,
813
+ .lucide-api-icon .api-icon__label {
814
+ fill: CanvasText;
815
+ stroke: CanvasText;
816
+ }
817
+ }
818
+
645
819
  /*
646
820
  * 盒模型由本包收口。html 定 border-box,其余 inherit(弹出层挂 body 也一致)。
647
821
  */
@@ -802,51 +976,15 @@ html {
802
976
  --rs-label-font-weight: var(--rs-font-weight-medium);
803
977
  --rs-label-line-height: var(--rs-line-height-normal);
804
978
 
805
- /* FTP 图标内嵌字样默认强调色 */
806
- --rs-icon-ftp-accent: #ea580c;
807
- --rs-icon-ftp-on-accent: #ffffff;
808
-
809
- /* Redis 品牌图标默认强调色(Redis 官方红) */
810
- --rs-icon-redis-accent: #dc382d;
811
-
812
- /* MongoDB 品牌图标默认强调色(MongoDB 官方绿) */
813
- --rs-icon-mongodb-accent: #47a248;
814
-
815
- /* Vastbase 品牌图标默认强调色(海量数据官网橙) */
816
- --rs-icon-vastbase-accent: #ff6f1a;
817
-
818
- /* MySQL 品牌图标默认强调色(MySQL 官方蓝) */
819
- --rs-icon-mysql-accent: #4479a1;
820
-
821
- /* Dameng 品牌图标默认色(官网 logo 取样:蓝 / 红) */
822
- --rs-icon-dameng-accent: #0000d2;
823
- --rs-icon-dameng-wave: #ec1b34;
824
-
825
- /* SQLite 品牌图标默认强调色(SQLite 官方蓝) */
826
- --rs-icon-sqlite-accent: #003b57;
827
-
828
- /* Oracle 品牌图标默认强调色(Oracle 官方红) */
829
- --rs-icon-oracle-accent: #f80000;
830
-
831
- /* ClickHouse 品牌图标默认强调色(ClickHouse 官方黄) */
832
- --rs-icon-clickhouse-accent: #ffcc01;
833
-
834
- /* 人大金仓品牌图标默认强调色(官网政务红) */
835
- --rs-icon-kingbase-accent: #c9151e;
836
-
837
- /* SQL Server 品牌图标默认强调色(Simple Icons / 产品红) */
838
- --rs-icon-sqlserver-accent: #cc2927;
839
-
840
- /* PostgreSQL 品牌图标默认强调色(官方大象蓝) */
841
- --rs-icon-postgres-accent: #336791;
979
+ /* Lucide / 线性图标。品牌 mark 色在可选 niuma-ui/brand-icons.css */
980
+ --rs-icon-color: currentColor;
842
981
 
843
982
  /* macOS 风格原生滚动条(与 RsScrollbar 视觉一致) */
844
983
  --rs-scrollbar-size: 13px;
845
984
  --rs-scrollbar-padding: 2px;
846
985
  }
847
986
 
848
- /* ── 公共暗色:VS Code Dark Modern 中性灰阶 × macOS 深色规范 ── */
849
- :root,
987
+ /* ── 公共暗色:仅 data-rs-theme=dark(system 由 JS 解析后再写该值)── */
850
988
  [data-rs-theme='dark'] {
851
989
  color-scheme: dark;
852
990
 
@@ -928,18 +1066,17 @@ html {
928
1066
  --rs-btn-secondary-bg: var(--rs-surface-hover);
929
1067
  --rs-btn-secondary-bg-hover: color-mix(in srgb, var(--rs-primary) 16%, var(--rs-surface-hover));
930
1068
  --rs-btn-secondary-bg-active: color-mix(in srgb, var(--rs-primary) 24%, var(--rs-surface-hover));
931
- --rs-text: #cccccc;
932
- --rs-muted: #9d9d9d;
933
- --rs-placeholder: #919191;
934
- /* 文字语义 alias(Ant / Arco 四级 + link;底层仍可用 --rs-text / --rs-muted) */
935
- --rs-text-primary: var(--rs-text);
936
- --rs-text-secondary: var(--rs-muted);
937
- --rs-text-tertiary: var(--rs-placeholder);
1069
+ --rs-text-primary: #cccccc;
1070
+ --rs-text-secondary: #9d9d9d;
1071
+ --rs-text-tertiary: #919191;
938
1072
  --rs-text-disabled: #6e6e6e;
939
1073
  --rs-text-inverse: #ffffff;
940
1074
  --rs-text-link: var(--rs-primary);
941
1075
  --rs-text-link-hover: var(--rs-primary-hover);
942
- --rs-label-color: var(--rs-text);
1076
+ --rs-text: var(--rs-text-primary);
1077
+ --rs-muted: var(--rs-text-secondary);
1078
+ --rs-placeholder: var(--rs-text-tertiary);
1079
+ --rs-label-color: var(--rs-text-primary);
943
1080
  --rs-danger: #ff453a;
944
1081
  --rs-danger-container: #3b1210;
945
1082
  --rs-on-danger-container: #ff8a84;
@@ -953,20 +1090,6 @@ html {
953
1090
  --rs-info-container: #0a2540;
954
1091
  --rs-on-info-container: #6cb4ff;
955
1092
 
956
- --rs-icon-ftp-accent: #fb923c;
957
- --rs-icon-ftp-on-accent: #ffffff;
958
- --rs-icon-redis-accent: #ff6f61;
959
- --rs-icon-mongodb-accent: #5cb85c;
960
- --rs-icon-vastbase-accent: #ff8a3d;
961
- --rs-icon-mysql-accent: #5a9fd4;
962
- --rs-icon-sqlite-accent: #5aafd4;
963
- --rs-icon-dameng-accent: #4d4dff;
964
- --rs-icon-dameng-wave: #ff4d63;
965
- --rs-icon-oracle-accent: #ff4d4d;
966
- --rs-icon-clickhouse-accent: #ffe066;
967
- --rs-icon-kingbase-accent: #ff4d57;
968
- --rs-icon-sqlserver-accent: #ff5a57;
969
- --rs-icon-postgres-accent: #6a9ec4;
970
1093
  --rs-focus-border: var(--rs-primary);
971
1094
  --rs-focus-ring: color-mix(in srgb, var(--rs-primary) 28%, transparent);
972
1095
  --rs-focus-ring-width: 2px;
@@ -1108,7 +1231,8 @@ html {
1108
1231
  --rs-shadow-lg: 0 12px 32px rgb(0 0 0 / 0.5), 0 0 0 0.5px rgb(255 255 255 / 0.1);
1109
1232
  }
1110
1233
 
1111
- /* ── 公共亮色:macOS systemBackground / label 色阶 ── */
1234
+ /* ── 公共亮色:无属性 = light,避免盖住后面的 dark(:root 与属性选择器同权)── */
1235
+ :root:not([data-rs-theme]),
1112
1236
  [data-rs-theme='light'] {
1113
1237
  color-scheme: light;
1114
1238
 
@@ -1187,18 +1311,17 @@ html {
1187
1311
  --rs-btn-secondary-bg: var(--rs-surface-hover);
1188
1312
  --rs-btn-secondary-bg-hover: color-mix(in srgb, var(--rs-primary) 12%, var(--rs-surface-hover));
1189
1313
  --rs-btn-secondary-bg-active: color-mix(in srgb, var(--rs-primary) 18%, var(--rs-surface-hover));
1190
- --rs-text: #1d1d1f;
1191
- --rs-muted: #6e6e73;
1192
- --rs-placeholder: #909090;
1193
- /* 文字语义 alias(Ant / Arco 四级 + link;底层仍可用 --rs-text / --rs-muted) */
1194
- --rs-text-primary: var(--rs-text);
1195
- --rs-text-secondary: var(--rs-muted);
1196
- --rs-text-tertiary: var(--rs-placeholder);
1314
+ --rs-text-primary: #1d1d1f;
1315
+ --rs-text-secondary: #6e6e73;
1316
+ --rs-text-tertiary: #909090;
1197
1317
  --rs-text-disabled: #aeaeb2;
1198
1318
  --rs-text-inverse: #ffffff;
1199
1319
  --rs-text-link: var(--rs-primary);
1200
1320
  --rs-text-link-hover: var(--rs-primary-hover);
1201
- --rs-label-color: var(--rs-text);
1321
+ --rs-text: var(--rs-text-primary);
1322
+ --rs-muted: var(--rs-text-secondary);
1323
+ --rs-placeholder: var(--rs-text-tertiary);
1324
+ --rs-label-color: var(--rs-text-primary);
1202
1325
  --rs-danger: #ff3b30;
1203
1326
  --rs-danger-container: #ffe5e3;
1204
1327
  --rs-on-danger-container: #c41e16;
@@ -1347,21 +1470,6 @@ html {
1347
1470
  --rs-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.04), 0 0 0 0.5px rgb(0 0 0 / 0.04);
1348
1471
  --rs-shadow: 0 4px 16px rgb(0 0 0 / 0.08), 0 0 0 0.5px rgb(0 0 0 / 0.06);
1349
1472
  --rs-shadow-lg: 0 12px 32px rgb(0 0 0 / 0.12), 0 0 0 0.5px rgb(0 0 0 / 0.08);
1350
-
1351
- --rs-icon-ftp-accent: #ea580c;
1352
- --rs-icon-ftp-on-accent: #ffffff;
1353
- --rs-icon-redis-accent: #dc382d;
1354
- --rs-icon-mongodb-accent: #47a248;
1355
- --rs-icon-vastbase-accent: #ff6f1a;
1356
- --rs-icon-mysql-accent: #4479a1;
1357
- --rs-icon-sqlite-accent: #003b57;
1358
- --rs-icon-dameng-accent: #0000d2;
1359
- --rs-icon-dameng-wave: #ec1b34;
1360
- --rs-icon-oracle-accent: #f80000;
1361
- --rs-icon-clickhouse-accent: #ffcc01;
1362
- --rs-icon-kingbase-accent: #c9151e;
1363
- --rs-icon-sqlserver-accent: #cc2927;
1364
- --rs-icon-postgres-accent: #336791;
1365
1473
  }
1366
1474
 
1367
1475
  /**
@@ -1377,6 +1485,51 @@ html {
1377
1485
  }
1378
1486
  }
1379
1487
 
1488
+ /*
1489
+ * 高对比:把语义 token 映射到系统色。组件继续读 --rs-*,不必每组件写 forced-colors。
1490
+ */
1491
+ @media (forced-colors: active) {
1492
+ :root:not([data-rs-theme]),
1493
+ [data-rs-theme='light'],
1494
+ [data-rs-theme='dark'] {
1495
+ --rs-bg: Canvas;
1496
+ --rs-surface: Canvas;
1497
+ --rs-surface-elevated: Canvas;
1498
+ --rs-surface-hover: Highlight;
1499
+ --rs-item-hover: Highlight;
1500
+ --rs-input-bg: Field;
1501
+ --rs-input-border: ButtonText;
1502
+ --rs-input-border-hover: Highlight;
1503
+ --rs-border: ButtonText;
1504
+ --rs-border-subtle: ButtonText;
1505
+ --rs-text-primary: CanvasText;
1506
+ --rs-text-secondary: GrayText;
1507
+ --rs-text-tertiary: GrayText;
1508
+ --rs-text-disabled: GrayText;
1509
+ --rs-text-inverse: Canvas;
1510
+ --rs-text-link: LinkText;
1511
+ --rs-text-link-hover: LinkText;
1512
+ --rs-text: CanvasText;
1513
+ --rs-muted: GrayText;
1514
+ --rs-placeholder: GrayText;
1515
+ --rs-label-color: CanvasText;
1516
+ --rs-primary: Highlight;
1517
+ --rs-primary-hover: Highlight;
1518
+ --rs-primary-foreground: HighlightText;
1519
+ --rs-primary-container: Canvas;
1520
+ --rs-on-primary-container: CanvasText;
1521
+ --rs-danger: Mark;
1522
+ --rs-success: CanvasText;
1523
+ --rs-warning: CanvasText;
1524
+ --rs-info: Highlight;
1525
+ --rs-focus-border: Highlight;
1526
+ --rs-focus-ring: Highlight;
1527
+ --rs-shadow-sm: none;
1528
+ --rs-shadow: none;
1529
+ --rs-shadow-lg: none;
1530
+ }
1531
+ }
1532
+
1380
1533
  /* 原生滚动条:WebKit + Firefox,颜色随 --rs-* 主题 token 变化 */
1381
1534
  .rs-native-scrollbar {
1382
1535
  scrollbar-width: thin;
@@ -1631,7 +1784,7 @@ code {
1631
1784
  top: -0.55em;
1632
1785
  margin-bottom: 0.125rem;
1633
1786
  padding: 0 0.375rem;
1634
- margin-left: var(--rs-space-sm);
1787
+ margin-inline-start: var(--rs-space-sm);
1635
1788
  width: fit-content;
1636
1789
  max-width: calc(100% - var(--rs-space-sm) * 2);
1637
1790
  background: var(--rs-surface-elevated);
@@ -1663,14 +1816,14 @@ code {
1663
1816
  overflow: hidden;
1664
1817
  text-overflow: ellipsis;
1665
1818
  white-space: nowrap;
1666
- text-align: left;
1819
+ text-align: start;
1667
1820
  }
1668
1821
 
1669
1822
  .rs-select__item-check {
1670
1823
  display: inline-flex;
1671
1824
  width: 0.875rem;
1672
1825
  flex-shrink: 0;
1673
- margin-left: auto;
1826
+ margin-inline-start: auto;
1674
1827
  color: var(--rs-primary);
1675
1828
  }
1676
1829
 
@@ -1741,8 +1894,7 @@ code {
1741
1894
 
1742
1895
  .rs-select__content--sm .rs-select__viewport,
1743
1896
  .rs-select__content--ssm .rs-select__viewport {
1744
- padding-left: 0.25rem;
1745
- padding-right: 0.25rem;
1897
+ padding-inline: 0.25rem;
1746
1898
  padding-bottom: 0.25rem;
1747
1899
  }
1748
1900
 
@@ -1794,7 +1946,7 @@ code {
1794
1946
  }
1795
1947
 
1796
1948
  .rs-auto-complete--clearable .rs-auto-complete__input {
1797
- padding-right: calc(var(--rs-space-md) + 1.25rem);
1949
+ padding-inline-end: calc(var(--rs-space-md) + 1.25rem);
1798
1950
  }
1799
1951
 
1800
1952
  .rs-auto-complete__input::placeholder {
@@ -1822,7 +1974,7 @@ code {
1822
1974
  .rs-auto-complete__clear {
1823
1975
  position: absolute;
1824
1976
  top: 50%;
1825
- right: var(--rs-space-sm);
1977
+ inset-inline-end: var(--rs-space-sm);
1826
1978
  display: inline-flex;
1827
1979
  align-items: center;
1828
1980
  justify-content: center;
@@ -2085,7 +2237,7 @@ code {
2085
2237
  .rs-toast__close {
2086
2238
  position: absolute;
2087
2239
  top: 0;
2088
- left: 0;
2240
+ inset-inline-start: 0;
2089
2241
  display: flex;
2090
2242
  align-items: center;
2091
2243
  justify-content: center;
@@ -2114,160 +2266,3 @@ code {
2114
2266
  outline: none;
2115
2267
  box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
2116
2268
  }
2117
-
2118
- /* Activity Bar「API」字标:粗圆角字重,随 currentColor */
2119
- .lucide-api-icon .api-icon__label {
2120
- fill: currentColor;
2121
- stroke: none;
2122
- font-family: var(--rs-font-rounded);
2123
- font-size: 9.5px;
2124
- font-weight: 800;
2125
- letter-spacing: -0.04em;
2126
- text-anchor: middle;
2127
- -webkit-font-smoothing: antialiased;
2128
- }
2129
-
2130
- /* FTP 自定义图标:橙色实心文件夹 + 白色 FTP 字样 */
2131
- .lucide-ftp-icon .ftp-icon__folder {
2132
- fill: var(--rs-icon-ftp-accent);
2133
- stroke: color-mix(in srgb, var(--rs-icon-ftp-accent) 55%, #1a1a1a);
2134
- stroke-width: 1.1;
2135
- }
2136
-
2137
- .lucide-ftp-icon .ftp-icon__label {
2138
- fill: var(--rs-icon-ftp-on-accent);
2139
- stroke: none;
2140
- font-family: var(--rs-font-mono);
2141
- font-size: 6.2px;
2142
- font-weight: 900;
2143
- letter-spacing: -0.08em;
2144
- text-anchor: middle;
2145
- -webkit-font-smoothing: antialiased;
2146
- }
2147
-
2148
- .rs-context-menu__item[data-highlighted] .lucide-ftp-icon .ftp-icon__folder,
2149
- .rs-context-menu__item[data-state='open'] .lucide-ftp-icon .ftp-icon__folder {
2150
- fill: rgb(255 255 255 / 0.95);
2151
- stroke: rgb(255 255 255 / 0.55);
2152
- }
2153
-
2154
- .rs-context-menu__item[data-highlighted] .lucide-ftp-icon .ftp-icon__label,
2155
- .rs-context-menu__item[data-state='open'] .lucide-ftp-icon .ftp-icon__label {
2156
- fill: var(--rs-icon-ftp-accent);
2157
- }
2158
-
2159
- /* Redis 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
2160
- .lucide-redis-icon .redis-icon__mark {
2161
- fill: var(--rs-icon-redis-accent);
2162
- }
2163
-
2164
- .rs-context-menu__item[data-highlighted] .lucide-redis-icon .redis-icon__mark,
2165
- .rs-context-menu__item[data-state='open'] .lucide-redis-icon .redis-icon__mark {
2166
- fill: rgb(255 255 255 / 0.95);
2167
- }
2168
-
2169
- /* MongoDB 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
2170
- .lucide-mongodb-icon .mongodb-icon__mark {
2171
- fill: var(--rs-icon-mongodb-accent);
2172
- }
2173
-
2174
- .rs-context-menu__item[data-highlighted] .lucide-mongodb-icon .mongodb-icon__mark,
2175
- .rs-context-menu__item[data-state='open'] .lucide-mongodb-icon .mongodb-icon__mark {
2176
- fill: rgb(255 255 255 / 0.95);
2177
- }
2178
-
2179
- /* Vastbase 自定义图标:海量数据官方品牌 mark,单色填充随主题调整明暗对比度 */
2180
- .lucide-vastbase-icon .vastbase-icon__mark {
2181
- fill: var(--rs-icon-vastbase-accent);
2182
- }
2183
-
2184
- .rs-context-menu__item[data-highlighted] .lucide-vastbase-icon .vastbase-icon__mark,
2185
- .rs-context-menu__item[data-state='open'] .lucide-vastbase-icon .vastbase-icon__mark {
2186
- fill: rgb(255 255 255 / 0.95);
2187
- }
2188
-
2189
- /* MySQL 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
2190
- .lucide-mysql-icon .mysql-icon__mark {
2191
- fill: var(--rs-icon-mysql-accent);
2192
- }
2193
-
2194
- .rs-context-menu__item[data-highlighted] .lucide-mysql-icon .mysql-icon__mark,
2195
- .rs-context-menu__item[data-state='open'] .lucide-mysql-icon .mysql-icon__mark {
2196
- fill: rgb(255 255 255 / 0.95);
2197
- }
2198
-
2199
- /* Dameng 自定义图标:官方品牌 mark(蓝椭圆 + 红波浪) */
2200
- .lucide-dameng-icon .dameng-icon__oval {
2201
- fill: var(--rs-icon-dameng-accent);
2202
- }
2203
-
2204
- .lucide-dameng-icon .dameng-icon__wave {
2205
- fill: var(--rs-icon-dameng-wave);
2206
- }
2207
-
2208
- .rs-context-menu__item[data-highlighted] .lucide-dameng-icon .dameng-icon__oval,
2209
- .rs-context-menu__item[data-state='open'] .lucide-dameng-icon .dameng-icon__oval,
2210
- .rs-context-menu__item[data-highlighted] .lucide-dameng-icon .dameng-icon__wave,
2211
- .rs-context-menu__item[data-state='open'] .lucide-dameng-icon .dameng-icon__wave {
2212
- fill: rgb(255 255 255 / 0.95);
2213
- }
2214
-
2215
- /* SQLite 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
2216
- .lucide-sqlite-icon .sqlite-icon__mark {
2217
- fill: var(--rs-icon-sqlite-accent);
2218
- }
2219
-
2220
- .rs-context-menu__item[data-highlighted] .lucide-sqlite-icon .sqlite-icon__mark,
2221
- .rs-context-menu__item[data-state='open'] .lucide-sqlite-icon .sqlite-icon__mark {
2222
- fill: rgb(255 255 255 / 0.95);
2223
- }
2224
-
2225
- /* Oracle 自定义图标:官方品牌 oval mark,单色填充随主题调整明暗对比度 */
2226
- .lucide-oracle-icon .oracle-icon__mark {
2227
- fill: var(--rs-icon-oracle-accent);
2228
- }
2229
-
2230
- .rs-context-menu__item[data-highlighted] .lucide-oracle-icon .oracle-icon__mark,
2231
- .rs-context-menu__item[data-state='open'] .lucide-oracle-icon .oracle-icon__mark {
2232
- fill: rgb(255 255 255 / 0.95);
2233
- }
2234
-
2235
- /* ClickHouse 自定义图标:官方品牌 barcode mark,单色填充随主题调整明暗对比度 */
2236
- .lucide-clickhouse-icon .clickhouse-icon__mark {
2237
- fill: var(--rs-icon-clickhouse-accent);
2238
- }
2239
-
2240
- .rs-context-menu__item[data-highlighted] .lucide-clickhouse-icon .clickhouse-icon__mark,
2241
- .rs-context-menu__item[data-state='open'] .lucide-clickhouse-icon .clickhouse-icon__mark {
2242
- fill: rgb(255 255 255 / 0.95);
2243
- }
2244
-
2245
- /* 人大金仓自定义图标:官方品牌 K lettermark,单色填充随主题调整明暗对比度 */
2246
- .lucide-kingbase-icon .kingbase-icon__mark {
2247
- fill: var(--rs-icon-kingbase-accent);
2248
- }
2249
-
2250
- .rs-context-menu__item[data-highlighted] .lucide-kingbase-icon .kingbase-icon__mark,
2251
- .rs-context-menu__item[data-state='open'] .lucide-kingbase-icon .kingbase-icon__mark {
2252
- fill: rgb(255 255 255 / 0.95);
2253
- }
2254
-
2255
- /* SQL Server 自定义图标:官方品牌火焰/翼形 mark,单色填充随主题调整明暗对比度 */
2256
- .lucide-sqlserver-icon .sqlserver-icon__mark {
2257
- fill: var(--rs-icon-sqlserver-accent);
2258
- }
2259
-
2260
- .rs-context-menu__item[data-highlighted] .lucide-sqlserver-icon .sqlserver-icon__mark,
2261
- .rs-context-menu__item[data-state='open'] .lucide-sqlserver-icon .sqlserver-icon__mark {
2262
- fill: rgb(255 255 255 / 0.95);
2263
- }
2264
-
2265
- /* PostgreSQL 自定义图标:官方大象(Slonik)mark,单色填充随主题调整明暗对比度 */
2266
- .lucide-postgres-icon .postgres-icon__mark {
2267
- fill: var(--rs-icon-postgres-accent);
2268
- }
2269
-
2270
- .rs-context-menu__item[data-highlighted] .lucide-postgres-icon .postgres-icon__mark,
2271
- .rs-context-menu__item[data-state='open'] .lucide-postgres-icon .postgres-icon__mark {
2272
- fill: rgb(255 255 255 / 0.95);
2273
- }
@@ -1,6 +1,18 @@
1
- import type { RsThemeMode } from './types';
1
+ import { type RsResolvedTheme, type RsThemeMode } from './types';
2
+ /** 系统是否偏好暗色。无 window 时视为浅色(与 :root 默认一致)。 */
3
+ export declare function prefersColorSchemeDark(): boolean;
4
+ /** 把偏好解析成 light / dark。色值仍只认 CSS,不读 themePresets。 */
5
+ export declare function resolveThemeMode(mode: RsThemeMode): RsResolvedTheme;
2
6
  /**
3
- * 切换明暗主题:仅设置 data-rs-theme,色值由 styles.css 中的 CSS 变量提供。
4
- * 业务定制请写 CSS 覆盖 --rs-*,见 theme/brand.example.css
7
+ * 读已落到元素上的明暗。无属性或无法识别时按 light,
8
+ * 与 styles.css 的 `:root` 默认一致,避免编辑器 / 弹层先闪暗色。
9
+ */
10
+ export declare function readResolvedTheme(el?: HTMLElement | null): RsResolvedTheme;
11
+ /**
12
+ * 切换主题:只写属性。
13
+ * `system` 解析后写 `data-rs-theme="light|dark"`,另标 `data-rs-theme-pref="system"`。
14
+ * 组件选择器继续认 light / dark,不必为 system 再复制一套。
5
15
  */
6
16
  export declare function applyTheme(mode: RsThemeMode, el?: HTMLElement): void;
17
+ /** 系统明暗变化时回调;返回取消订阅。 */
18
+ export declare function subscribePreferredColorScheme(onChange: () => void): () => void;
@@ -1,10 +1,47 @@
1
+ import { themeAttribute, themePrefAttribute } from "./types.js";
1
2
  //#region src/theme/apply.ts
3
+ function matchPrefersColorSchemeDark() {
4
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return null;
5
+ return window.matchMedia("(prefers-color-scheme: dark)");
6
+ }
7
+ /** 系统是否偏好暗色。无 window 时视为浅色(与 :root 默认一致)。 */
8
+ function prefersColorSchemeDark() {
9
+ return matchPrefersColorSchemeDark()?.matches === true;
10
+ }
11
+ /** 把偏好解析成 light / dark。色值仍只认 CSS,不读 themePresets。 */
12
+ function resolveThemeMode(mode) {
13
+ if (mode === "light" || mode === "dark") return mode;
14
+ return prefersColorSchemeDark() ? "dark" : "light";
15
+ }
2
16
  /**
3
- * 切换明暗主题:仅设置 data-rs-theme,色值由 styles.css 中的 CSS 变量提供。
4
- * 业务定制请写 CSS 覆盖 --rs-*,见 theme/brand.example.css
17
+ * 读已落到元素上的明暗。无属性或无法识别时按 light,
18
+ * 与 styles.css 的 `:root` 默认一致,避免编辑器 / 弹层先闪暗色。
19
+ */
20
+ function readResolvedTheme(el) {
21
+ if (typeof document === "undefined") return "light";
22
+ const raw = (el ?? document.documentElement).getAttribute(themeAttribute);
23
+ if (raw === "light" || raw === "dark") return raw;
24
+ if (raw === "system") return resolveThemeMode("system");
25
+ return "light";
26
+ }
27
+ /**
28
+ * 切换主题:只写属性。
29
+ * `system` 解析后写 `data-rs-theme="light|dark"`,另标 `data-rs-theme-pref="system"`。
30
+ * 组件选择器继续认 light / dark,不必为 system 再复制一套。
5
31
  */
6
32
  function applyTheme(mode, el = document.documentElement) {
7
- el.setAttribute("data-rs-theme", mode);
33
+ const resolved = resolveThemeMode(mode);
34
+ el.setAttribute(themeAttribute, resolved);
35
+ if (mode === "system") el.setAttribute(themePrefAttribute, "system");
36
+ else el.removeAttribute(themePrefAttribute);
37
+ }
38
+ /** 系统明暗变化时回调;返回取消订阅。 */
39
+ function subscribePreferredColorScheme(onChange) {
40
+ const mq = matchPrefersColorSchemeDark();
41
+ if (!mq) return () => {};
42
+ const handler = () => onChange();
43
+ mq.addEventListener("change", handler);
44
+ return () => mq.removeEventListener("change", handler);
8
45
  }
9
46
  //#endregion
10
- export { applyTheme };
47
+ export { applyTheme, prefersColorSchemeDark, readResolvedTheme, resolveThemeMode, subscribePreferredColorScheme };