niuma-ui 2.0.0 → 2.0.1

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 (98) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.en.md +1 -1
  3. package/README.md +1 -1
  4. package/dist/brand-icons.css +40 -0
  5. package/dist/components/_shared/src/resolve-radius.js +1 -1
  6. package/dist/components/button/src/RsButton.impl.js +1 -1
  7. package/dist/components/cascader/src/RsCascader.css +20 -20
  8. package/dist/components/cascader/src/RsCascader.js +1 -1
  9. package/dist/components/code-block/src/RsCodeBlock.d.ts +1 -1
  10. package/dist/components/code-editor/src/code-editor-utils.js +2 -2
  11. package/dist/components/code-editor/src/code-mirror-lang.js +1 -1
  12. package/dist/components/config-provider/src/RsConfigProvider.css +2 -2
  13. package/dist/components/config-provider/src/RsConfigProvider.d.ts +6 -3
  14. package/dist/components/config-provider/src/RsConfigProvider.impl.js +47 -7
  15. package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
  16. package/dist/components/context-menu/src/RsContextMenu.css +2 -2
  17. package/dist/components/date-picker/src/RsDatePicker.css +17 -17
  18. package/dist/components/date-picker/src/RsDatePicker.impl.js +1 -1
  19. package/dist/components/date-picker/src/RsDatePicker.js +1 -1
  20. package/dist/components/dialog/src/RsDialog.css +1 -2
  21. package/dist/components/divider/src/RsDivider.css +13 -13
  22. package/dist/components/divider/src/RsDivider.js +1 -1
  23. package/dist/components/drawer/src/RsDrawer.css +2 -4
  24. package/dist/components/dropdown/src/RsDropdown.css +2 -2
  25. package/dist/components/dropdown/src/RsDropdownItemView.impl.js +1 -1
  26. package/dist/components/icon/src/RsIcon.css +4 -4
  27. package/dist/components/icon/src/RsIcon.impl.js +6 -1
  28. package/dist/components/icon/src/RsIcon.js +1 -1
  29. package/dist/components/input/src/RsInput.css +86 -86
  30. package/dist/components/input/src/RsInput.js +1 -1
  31. package/dist/components/input-number/src/RsInputNumber.css +32 -32
  32. package/dist/components/input-number/src/RsInputNumber.js +1 -1
  33. package/dist/components/label/src/RsLabel.css +7 -7
  34. package/dist/components/label/src/RsLabel.js +1 -1
  35. package/dist/components/loading-bar/src/RsLoadingBar.css +4 -5
  36. package/dist/components/loading-bar/src/RsLoadingBar.js +1 -1
  37. package/dist/components/log/src/RsLog.css +39 -39
  38. package/dist/components/log/src/RsLog.d.ts +1 -1
  39. package/dist/components/log/src/RsLog.impl.js +1 -1
  40. package/dist/components/log/src/RsLog.js +1 -1
  41. package/dist/components/markdown/src/RsMarkdown.css +9 -7
  42. package/dist/components/menu/src/RsMenu.css +5 -5
  43. package/dist/components/pagination/src/RsPagination.css +18 -18
  44. package/dist/components/pagination/src/RsPagination.impl.js +1 -1
  45. package/dist/components/pagination/src/RsPagination.js +1 -1
  46. package/dist/components/select/src/RsSelect.css +42 -42
  47. package/dist/components/select/src/RsSelect.impl.js +1 -1
  48. package/dist/components/select/src/RsSelect.js +1 -1
  49. package/dist/components/steps/src/RsSteps.css +18 -18
  50. package/dist/components/steps/src/RsSteps.js +1 -1
  51. package/dist/components/switch/src/RsSwitch.css +4 -6
  52. package/dist/components/table/style/rs-table.css +15 -15
  53. package/dist/components/terminal/src/RsTerminal.css +24 -24
  54. package/dist/components/terminal/src/RsTerminal.js +1 -1
  55. package/dist/components/textarea/src/RsTextarea.css +26 -26
  56. package/dist/components/textarea/src/RsTextarea.js +1 -1
  57. package/dist/components/time-picker/src/RsTimePicker.css +20 -20
  58. package/dist/components/time-picker/src/RsTimePicker.impl.js +1 -1
  59. package/dist/components/time-picker/src/RsTimePicker.js +1 -1
  60. package/dist/components/toaster/src/RsToaster.css +6 -6
  61. package/dist/components/toaster/src/RsToaster.impl.js +3 -6
  62. package/dist/components/tree/src/RsTree.css +72 -73
  63. package/dist/components/tree/src/RsTree.js +1 -1
  64. package/dist/components/tree-select/src/RsTreeSelect.css +11 -11
  65. package/dist/components/tree-select/src/RsTreeSelect.js +1 -1
  66. package/dist/components/virtual-list/src/RsVirtualList.css +7 -8
  67. package/dist/components/virtual-list/src/RsVirtualList.js +1 -1
  68. package/dist/composables/createRsDialog.js +4 -3
  69. package/dist/composables/useRsConfig.d.ts +11 -3
  70. package/dist/composables/useRsConfig.js +17 -5
  71. package/dist/composables/useRsI18n.js +2 -2
  72. package/dist/icons/brand.d.ts +6 -0
  73. package/dist/icons/brand.js +26 -0
  74. package/dist/icons/registry.d.ts +2 -0
  75. package/dist/icons/registry.js +2 -1
  76. package/dist/index.d.ts +7 -4
  77. package/dist/index.js +16 -0
  78. package/dist/locale/apply.d.ts +8 -0
  79. package/dist/locale/apply.js +20 -0
  80. package/dist/locale/interpolate.d.ts +4 -3
  81. package/dist/locale/interpolate.js +96 -5
  82. package/dist/locale/messages.d.ts +0 -4
  83. package/dist/locale/messages.js +5 -9
  84. package/dist/locale/registry-public.d.ts +2 -0
  85. package/dist/locale/registry.d.ts +19 -0
  86. package/dist/locale/registry.js +50 -0
  87. package/dist/locale/types.d.ts +11 -2
  88. package/dist/locale/types.js +4 -1
  89. package/dist/styles.css +245 -250
  90. package/dist/theme/apply.d.ts +15 -3
  91. package/dist/theme/apply.js +41 -4
  92. package/dist/theme/brand.example.css +5 -1
  93. package/dist/theme/presets.d.ts +6 -5
  94. package/dist/theme/presets.js +4 -3
  95. package/dist/theme/types.d.ts +15 -7
  96. package/dist/theme/types.js +4 -1
  97. package/dist/vite-plugins/niuma-ui-host.js +7 -0
  98. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.0.1] - 2026-09-21
10
+
9
11
  ### 变更
10
12
 
11
13
  - 单测放到对应模块的 `__tests__/`;跨组件冒烟仍留在 `src/__tests__/`。
@@ -15,6 +17,20 @@
15
17
  - 每个组件内部为 `index.ts` + `src/` + 可选 `style/` + `__tests__/`。
16
18
  - 表格 `src/` 再拆:`table-header` / `table-body` / `table-footer` / `composables` / `context` / `features` / `utils`。
17
19
  - 架构契约补齐目录规范:组件四槽、`src/` 再拆门槛、仓库根、`package.json` 发布面(`docs/components.md` §3)。
20
+ - `:root` 不再默认暗色。未写属性时用浅色 token。暗色宿主请在 `index.html` 写 `data-rs-theme="dark"` 或 `theme="dark"`,避免首屏闪浅色。
21
+ - `themePresets` 标明仅参考,不驱动画面。
22
+ - 文字公开 token 改为 `--rs-text-primary` 等;`--rs-text` / `--rs-muted` / `--rs-placeholder` 降为别名。
23
+ - 数据源品牌色移出通用 `styles.css`。需要官方色的宿主加 `import 'niuma-ui/brand-icons.css'`。
24
+
25
+ ### 新增
26
+
27
+ - `RsConfigProvider` `theme` 支持 `system`,跟随 `prefers-color-scheme`。`applyTheme` 仍写解析后的 `data-rs-theme="light|dark"`,并标 `data-rs-theme-pref="system"`。
28
+ - `resolveThemeMode` / `readResolvedTheme` / `useRsConfig().resolvedTheme`。无 `data-rs-theme` 时按浅色,与 Provider 默认一致。
29
+ - 内置品牌图标名单 `rsBrandIconNames`;Lucide 走 `--rs-icon-color`。图形规则在 `src/icons/style/brand-icons.css`。
30
+ - `registerRsLocale`:第三方登记 BCP-47 文案;缺 key 回退 en-US。
31
+ - `RsConfigProvider dir`(`ltr` / `rtl` / `auto`),写入 `dir` / `lang` / `data-rs-dir`。
32
+ - 高对比:`forced-colors` 下语义 token 映射系统色。
33
+ - 可选 `niuma-ui/brand-icons.css`:数据源 mark 色。不引入则 mark 为 currentColor。
18
34
 
19
35
  ## [2.0.0] - 2026-09-21
20
36
 
package/README.en.md CHANGED
@@ -15,7 +15,7 @@ Built for ops consoles, database workbenches, and internal admin UIs. Marketing
15
15
 
16
16
  ## Features
17
17
 
18
- - **Design tokens** — light / dark via `data-rs-theme` and CSS variables; hosts override a brand layer
18
+ - **Design tokens** — light / dark / system via `data-rs-theme` and CSS variables; hosts override a brand layer
19
19
  - **Rs\* components** — Button, Form, Dialog, Table, Tree, Tabs, Anchor, and more
20
20
  - **Tooling** — Monaco, CodeMirror, xterm (import only on routes that need them)
21
21
  - **Accessibility** — [Reka UI](https://reka-ui.com/) underneath; apps depend only on `niuma-ui`
package/README.md CHANGED
@@ -15,7 +15,7 @@ Vue 3 **工作台**设计系统:一致的 `Rs*` 组件与 `--rs-*` Token,以
15
15
 
16
16
  ## 特性
17
17
 
18
- - **Design Token**:明暗主题走 `data-rs-theme` 与 CSS 变量,宿主用品牌层覆盖
18
+ - **Design Token**:明暗主题走 `data-rs-theme`(`light` / `dark` / `system`)与 CSS 变量,宿主用品牌层覆盖
19
19
  - **Rs\* 组件**:Button、Form、Dialog、Table、Tree、Tabs、Anchor 等
20
20
  - **专业工具**:Monaco、CodeMirror、xterm(只在用到的路由引入)
21
21
  - **无障碍**:底层 [Reka UI](https://reka-ui.com/),应用只依赖 `niuma-ui`
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 工作台品牌 mark 色(可选)。
3
+ * 用法:在 styles.css 之后 `import 'niuma-ui/brand-icons.css'`。
4
+ * 不引入时,mark 走 currentColor,与 Lucide 一致。
5
+ */
6
+
7
+ :root:not([data-rs-theme]),
8
+ [data-rs-theme='light'] {
9
+ --rs-icon-ftp-accent: #ea580c;
10
+ --rs-icon-ftp-on-accent: #ffffff;
11
+ --rs-icon-redis-accent: #dc382d;
12
+ --rs-icon-mongodb-accent: #47a248;
13
+ --rs-icon-vastbase-accent: #ff6f1a;
14
+ --rs-icon-mysql-accent: #4479a1;
15
+ --rs-icon-sqlite-accent: #003b57;
16
+ --rs-icon-dameng-accent: #0000d2;
17
+ --rs-icon-dameng-wave: #ec1b34;
18
+ --rs-icon-oracle-accent: #f80000;
19
+ --rs-icon-clickhouse-accent: #ffcc01;
20
+ --rs-icon-kingbase-accent: #c9151e;
21
+ --rs-icon-sqlserver-accent: #cc2927;
22
+ --rs-icon-postgres-accent: #336791;
23
+ }
24
+
25
+ [data-rs-theme='dark'] {
26
+ --rs-icon-ftp-accent: #fb923c;
27
+ --rs-icon-ftp-on-accent: #ffffff;
28
+ --rs-icon-redis-accent: #ff6f61;
29
+ --rs-icon-mongodb-accent: #5cb85c;
30
+ --rs-icon-vastbase-accent: #ff8a3d;
31
+ --rs-icon-mysql-accent: #5a9fd4;
32
+ --rs-icon-sqlite-accent: #5aafd4;
33
+ --rs-icon-dameng-accent: #4d4dff;
34
+ --rs-icon-dameng-wave: #ff4d63;
35
+ --rs-icon-oracle-accent: #ff4d4d;
36
+ --rs-icon-clickhouse-accent: #ffe066;
37
+ --rs-icon-kingbase-accent: #ff4d57;
38
+ --rs-icon-sqlserver-accent: #ff5a57;
39
+ --rs-icon-postgres-accent: #6a9ec4;
40
+ }
@@ -1,5 +1,5 @@
1
- import { useRsConfigOptional } from "../../../composables/useRsConfig.js";
2
1
  import { RS_RADIUS_CSS } from "../../../theme/types.js";
2
+ import { useRsConfigOptional } from "../../../composables/useRsConfig.js";
3
3
  import { computed } from "vue";
4
4
  //#region src/components/_shared/src/resolve-radius.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
- import RsIcon_default from "../../icon/src/RsIcon.js";
2
1
  import { RS_COMPONENT_SIZE_ICON_PX } from "../../../theme/types.js";
2
+ import RsIcon_default from "../../icon/src/RsIcon.js";
3
3
  import { resolveRsButtonTone, resolveRsButtonVariant } from "./button-utils.js";
4
4
  import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
5
5
  import { rsRadiusCss, useResolvedRsRadius } from "../../_shared/src/resolve-radius.js";
@@ -1,5 +1,5 @@
1
1
 
2
- .rs-cascader[data-v-05f0e9c1] {
2
+ .rs-cascader[data-v-4b45dd5a] {
3
3
  display: inline-flex;
4
4
  align-items: center;
5
5
  gap: var(--rs-space-sm);
@@ -15,54 +15,54 @@
15
15
  font-size: var(--rs-font-size-sm);
16
16
  cursor: pointer;
17
17
  }
18
- .rs-cascader--sm[data-v-05f0e9c1] {
18
+ .rs-cascader--sm[data-v-4b45dd5a] {
19
19
  height: var(--rs-control-height-sm);
20
20
  }
21
- .rs-cascader--lg[data-v-05f0e9c1] {
21
+ .rs-cascader--lg[data-v-4b45dd5a] {
22
22
  height: var(--rs-control-height-lg);
23
23
  }
24
- .rs-cascader--disabled[data-v-05f0e9c1] {
24
+ .rs-cascader--disabled[data-v-4b45dd5a] {
25
25
  opacity: 0.38;
26
26
  cursor: not-allowed;
27
27
  }
28
- .rs-cascader__placeholder[data-v-05f0e9c1] {
28
+ .rs-cascader__placeholder[data-v-4b45dd5a] {
29
29
  flex: 1;
30
30
  color: var(--rs-muted);
31
- text-align: left;
31
+ text-align: start;
32
32
  }
33
- .rs-cascader__value[data-v-05f0e9c1] {
33
+ .rs-cascader__value[data-v-4b45dd5a] {
34
34
  flex: 1;
35
35
  overflow: hidden;
36
- text-align: left;
36
+ text-align: start;
37
37
  text-overflow: ellipsis;
38
38
  white-space: nowrap;
39
39
  }
40
- .rs-cascader__clear[data-v-05f0e9c1],
41
- .rs-cascader__icon[data-v-05f0e9c1] {
40
+ .rs-cascader__clear[data-v-4b45dd5a],
41
+ .rs-cascader__icon[data-v-4b45dd5a] {
42
42
  color: var(--rs-muted);
43
43
  }
44
- .rs-cascader__clear[data-v-05f0e9c1] {
44
+ .rs-cascader__clear[data-v-4b45dd5a] {
45
45
  border: 0;
46
46
  background: transparent;
47
47
  cursor: pointer;
48
48
  }
49
- .rs-cascader__panel[data-v-05f0e9c1] {
49
+ .rs-cascader__panel[data-v-4b45dd5a] {
50
50
  display: flex;
51
51
  min-height: 8rem;
52
52
  max-height: 16rem;
53
53
  }
54
- .rs-cascader__col[data-v-05f0e9c1] {
54
+ .rs-cascader__col[data-v-4b45dd5a] {
55
55
  min-width: 8rem;
56
56
  margin: 0;
57
57
  padding: var(--rs-space-xs);
58
58
  overflow: auto;
59
- border-right: 1px solid var(--rs-border);
59
+ border-inline-end: 1px solid var(--rs-border);
60
60
  list-style: none;
61
61
  }
62
- .rs-cascader__col[data-v-05f0e9c1]:last-child {
63
- border-right: 0;
62
+ .rs-cascader__col[data-v-4b45dd5a]:last-child {
63
+ border-inline-end: 0;
64
64
  }
65
- .rs-cascader__item[data-v-05f0e9c1] {
65
+ .rs-cascader__item[data-v-4b45dd5a] {
66
66
  display: flex;
67
67
  align-items: center;
68
68
  justify-content: space-between;
@@ -71,11 +71,11 @@
71
71
  border-radius: var(--rs-radius-xs);
72
72
  cursor: pointer;
73
73
  }
74
- .rs-cascader__item--active[data-v-05f0e9c1],
75
- .rs-cascader__item[data-v-05f0e9c1]:hover:not(.rs-cascader__item--disabled) {
74
+ .rs-cascader__item--active[data-v-4b45dd5a],
75
+ .rs-cascader__item[data-v-4b45dd5a]:hover:not(.rs-cascader__item--disabled) {
76
76
  background: var(--rs-surface-hover);
77
77
  }
78
- .rs-cascader__item--disabled[data-v-05f0e9c1] {
78
+ .rs-cascader__item--disabled[data-v-4b45dd5a] {
79
79
  opacity: 0.4;
80
80
  cursor: not-allowed;
81
81
  }
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
3
3
  import RsCascader_vue_vue_type_script_setup_true_lang_default from "./RsCascader.impl.js";
4
4
 
5
5
  //#region src/components/cascader/src/RsCascader.vue
6
- var RsCascader_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsCascader_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-05f0e9c1"]]);
6
+ var RsCascader_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsCascader_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-4b45dd5a"]]);
7
7
  //#endregion
8
8
  export { RsCascader_default as default };
@@ -26,8 +26,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
26
26
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
27
27
  "onUpdate:code"?: ((value: string) => any) | undefined;
28
28
  }>, {
29
- editable: boolean;
30
29
  lang: string;
30
+ editable: boolean;
31
31
  showBar: boolean;
32
32
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
33
33
  declare const _default: typeof __VLS_export;
@@ -1,3 +1,4 @@
1
+ import { readResolvedTheme } from "../../../theme/apply.js";
1
2
  //#region src/components/code-editor/src/code-editor-utils.ts
2
3
  var SUPPORTED_LANGUAGES = [
3
4
  "plaintext",
@@ -50,8 +51,7 @@ function codeEditorLanguageLabel(language) {
50
51
  return LANGUAGE_DISPLAY_NAME[lang] ?? lang;
51
52
  }
52
53
  function readDocumentTheme() {
53
- if (typeof document === "undefined") return "dark";
54
- return document.documentElement.dataset.rsTheme === "light" ? "light" : "dark";
54
+ return readResolvedTheme();
55
55
  }
56
56
  function resolveCodeEditorTheme(theme = "auto") {
57
57
  return theme === "auto" ? readDocumentTheme() : theme;
@@ -103,7 +103,7 @@ async function resolveCodeMirrorLanguage(lang, options) {
103
103
  }
104
104
  }
105
105
  function isCodeMirrorLightTheme() {
106
- return typeof document !== "undefined" && document.documentElement.dataset.rsTheme === "light";
106
+ return typeof document === "undefined" || document.documentElement.dataset.rsTheme !== "dark";
107
107
  }
108
108
  /** 预加载 CodeMirror 核心与目标语言包(供辅助窗口 reveal 前调用) */
109
109
  async function prewarmCodeMirrorEditor(language) {
@@ -1,6 +1,6 @@
1
1
 
2
- .rs-config-provider[data-v-16401a38] {
3
- color: var(--rs-text);
2
+ .rs-config-provider[data-v-175ca1a4] {
3
+ color: var(--rs-text-primary);
4
4
  background: var(--rs-bg);
5
5
  height: 100%;
6
6
  min-height: 0;
@@ -1,8 +1,10 @@
1
- import { type RsLocale } from '../../../locale/types';
1
+ import { type RsDirMode, type RsLocale } from '../../../locale/types';
2
2
  import type { RsComponentSize, RsRadius, RsThemeMode } from '../../../theme/types';
3
3
  type __VLS_Props = {
4
4
  theme?: RsThemeMode;
5
5
  locale?: RsLocale;
6
+ /** auto:跟 locale(ar / he 等为 rtl);也可强制 ltr / rtl */
7
+ dir?: RsDirMode;
6
8
  /** 全局默认控件尺寸:ssm 极小 / sm 小号 / md 中号 / lg 大号 */
7
9
  controlSize?: RsComponentSize;
8
10
  /**
@@ -11,8 +13,8 @@ type __VLS_Props = {
11
13
  */
12
14
  controlRadius?: RsRadius;
13
15
  /**
14
- * global:data-rs-theme 写到 document(默认,Portal 弹出层同步)
15
- * local:写到 Provider 根节点(子树隔离,业务 CSS 可 scoped 到 .rs-app-*)
16
+ * global:主题与 dir 写到 document(默认,Portal 弹出层同步)
17
+ * local:写到 Provider 根节点
16
18
  */
17
19
  themeScope?: 'global' | 'local';
18
20
  };
@@ -21,6 +23,7 @@ type __VLS_Slots = {} & {
21
23
  default?: (props: typeof __VLS_1) => any;
22
24
  };
23
25
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
26
+ dir: RsDirMode;
24
27
  theme: RsThemeMode;
25
28
  locale: RsLocale;
26
29
  controlSize: RsComponentSize;
@@ -1,13 +1,16 @@
1
1
  import { defaultLocale } from "../../../locale/types.js";
2
+ import { applyTheme, subscribePreferredColorScheme } from "../../../theme/apply.js";
2
3
  import { createRsConfigState, provideRsConfig } from "../../../composables/useRsConfig.js";
3
- import { applyTheme } from "../../../theme/apply.js";
4
- import { createElementBlock, defineComponent, openBlock, ref, renderSlot, watch } from "vue";
4
+ import { applyLocale } from "../../../locale/apply.js";
5
+ import { createElementBlock, defineComponent, onBeforeUnmount, openBlock, ref, renderSlot, watch } from "vue";
5
6
  //#region src/components/config-provider/src/RsConfigProvider.vue?vue&type=script&setup=true&lang.ts
6
7
  var RsConfigProvider_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
8
+ name: "RsConfigProvider",
7
9
  __name: "RsConfigProvider",
8
10
  props: {
9
11
  theme: { default: "light" },
10
12
  locale: { default: defaultLocale },
13
+ dir: { default: "auto" },
11
14
  controlSize: { default: "md" },
12
15
  controlRadius: {},
13
16
  themeScope: { default: "global" }
@@ -15,12 +18,30 @@ var RsConfigProvider_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
15
18
  setup(__props) {
16
19
  const props = __props;
17
20
  const rootEl = ref(null);
18
- const config = createRsConfigState(props.theme, props.locale, props.controlSize, props.controlRadius);
21
+ const config = createRsConfigState(props.theme, props.locale, props.controlSize, props.controlRadius, props.dir);
19
22
  provideRsConfig(config);
23
+ let stopPreferred;
24
+ function chromeTarget() {
25
+ if (typeof document === "undefined") return void 0;
26
+ if (props.themeScope === "local" && rootEl.value) return rootEl.value;
27
+ return document.documentElement;
28
+ }
20
29
  function syncTheme() {
21
- if (typeof document === "undefined") return;
22
- const el = props.themeScope === "local" && rootEl.value ? rootEl.value : document.documentElement;
30
+ const el = chromeTarget();
31
+ if (!el) return;
23
32
  applyTheme(config.theme.value, el);
33
+ config.syncResolvedTheme();
34
+ }
35
+ function syncLocale() {
36
+ const el = chromeTarget();
37
+ if (!el) return;
38
+ applyLocale(config.locale.value, config.dir.value, el);
39
+ }
40
+ function bindPreferredListener(mode) {
41
+ stopPreferred?.();
42
+ stopPreferred = void 0;
43
+ if (mode !== "system") return;
44
+ stopPreferred = subscribePreferredColorScheme(syncTheme);
24
45
  }
25
46
  watch(() => props.theme, (value) => {
26
47
  if (value !== config.theme.value) config.setTheme(value);
@@ -28,14 +49,33 @@ var RsConfigProvider_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
28
49
  watch(() => props.locale, (value) => {
29
50
  if (value !== config.locale.value) config.setLocale(value);
30
51
  });
52
+ watch(() => props.dir, (value) => {
53
+ if (value !== config.dir.value) config.setDir(value);
54
+ });
31
55
  watch(() => props.controlSize, (value) => {
32
56
  if (value && value !== config.controlSize.value) config.setControlSize(value);
33
57
  });
34
58
  watch(() => props.controlRadius, (value) => {
35
59
  if (value !== config.controlRadius.value) config.setControlRadius(value);
36
60
  });
37
- watch(() => config.theme.value, syncTheme, { immediate: true });
38
- watch(() => props.themeScope, syncTheme);
61
+ watch(() => config.theme.value, (mode) => {
62
+ syncTheme();
63
+ bindPreferredListener(mode);
64
+ }, { immediate: true });
65
+ watch([() => config.locale.value, () => config.dir.value], syncLocale, { immediate: true });
66
+ watch(() => props.themeScope, () => {
67
+ syncTheme();
68
+ syncLocale();
69
+ });
70
+ watch(rootEl, () => {
71
+ if (props.themeScope === "local") {
72
+ syncTheme();
73
+ syncLocale();
74
+ }
75
+ });
76
+ onBeforeUnmount(() => {
77
+ stopPreferred?.();
78
+ });
39
79
  return (_ctx, _cache) => {
40
80
  return openBlock(), createElementBlock("div", {
41
81
  ref_key: "rootEl",
@@ -3,6 +3,6 @@ import RsConfigProvider_vue_vue_type_script_setup_true_lang_default from "./RsCo
3
3
 
4
4
  import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_export-helper.js";
5
5
  //#region src/components/config-provider/src/RsConfigProvider.vue
6
- var RsConfigProvider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsConfigProvider_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-16401a38"]]);
6
+ var RsConfigProvider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsConfigProvider_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-175ca1a4"]]);
7
7
  //#endregion
8
8
  export { RsConfigProvider_default as default };
@@ -90,7 +90,7 @@ to {
90
90
  /* 键盘快捷键 */
91
91
  .rs-context-menu__shortcut {
92
92
  flex-shrink: 0;
93
- margin-left: 16px;
93
+ margin-inline-start: 16px;
94
94
  font-size: var(--rs-font-size-xs);
95
95
  font-weight: var(--rs-font-weight-regular);
96
96
  color: var(--rs-ctx-shortcut);
@@ -101,7 +101,7 @@ to {
101
101
  /* 子菜单展开箭头 */
102
102
  .rs-context-menu__arrow {
103
103
  flex-shrink: 0;
104
- margin-left: 6px;
104
+ margin-inline-start: 6px;
105
105
  color: var(--rs-ctx-icon);
106
106
  }
107
107
 
@@ -1,8 +1,8 @@
1
1
 
2
- .rs-date-picker[data-v-82aed16d] {
2
+ .rs-date-picker[data-v-816760df] {
3
3
  width: 100%;
4
4
  }
5
- .rs-date-picker__trigger[data-v-82aed16d] {
5
+ .rs-date-picker__trigger[data-v-816760df] {
6
6
  display: inline-flex;
7
7
  align-items: center;
8
8
  justify-content: space-between;
@@ -19,7 +19,7 @@
19
19
  font: inherit;
20
20
  font-size: var(--rs-font-size-sm);
21
21
  line-height: var(--rs-line-height-tight);
22
- text-align: left;
22
+ text-align: start;
23
23
  cursor: pointer;
24
24
  outline: none;
25
25
  box-shadow: var(--rs-input-shadow, none);
@@ -28,28 +28,28 @@
28
28
  box-shadow var(--rs-transition-fast),
29
29
  background var(--rs-transition-fast);
30
30
  }
31
- .rs-date-picker--ssm .rs-date-picker__trigger[data-v-82aed16d] {
31
+ .rs-date-picker--ssm .rs-date-picker__trigger[data-v-816760df] {
32
32
  height: var(--rs-control-height-ssm);
33
33
  min-height: var(--rs-control-height-ssm);
34
34
  padding: 0 var(--rs-space-xs);
35
35
  font-size: var(--rs-font-size-xs);
36
36
  }
37
- .rs-date-picker--sm .rs-date-picker__trigger[data-v-82aed16d] {
37
+ .rs-date-picker--sm .rs-date-picker__trigger[data-v-816760df] {
38
38
  height: var(--rs-control-height-sm);
39
39
  min-height: var(--rs-control-height-sm);
40
40
  padding: 0 var(--rs-space-sm);
41
41
  font-size: var(--rs-font-size-xs);
42
42
  }
43
- .rs-date-picker--lg .rs-date-picker__trigger[data-v-82aed16d] {
43
+ .rs-date-picker--lg .rs-date-picker__trigger[data-v-816760df] {
44
44
  height: var(--rs-control-height-lg);
45
45
  min-height: var(--rs-control-height-lg);
46
46
  padding: 0 var(--rs-space-lg);
47
47
  font-size: var(--rs-font-size-base);
48
48
  }
49
- .rs-date-picker__trigger[data-v-82aed16d]:hover:not(:disabled) {
49
+ .rs-date-picker__trigger[data-v-816760df]:hover:not(:disabled) {
50
50
  border-color: var(--rs-input-border-hover, var(--rs-border));
51
51
  }
52
- .rs-date-picker__trigger[data-v-82aed16d]:focus-visible {
52
+ .rs-date-picker__trigger[data-v-816760df]:focus-visible {
53
53
  outline: none;
54
54
  border-color: var(--rs-focus-border, var(--rs-primary));
55
55
  background: var(--rs-input-bg);
@@ -57,42 +57,42 @@
57
57
  var(--rs-input-shadow, none),
58
58
  0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
59
59
  }
60
- .rs-date-picker__trigger[data-v-82aed16d]:disabled {
60
+ .rs-date-picker__trigger[data-v-816760df]:disabled {
61
61
  opacity: 0.38;
62
62
  cursor: not-allowed;
63
63
  }
64
- .rs-date-picker__trigger--placeholder .rs-date-picker__value[data-v-82aed16d] {
64
+ .rs-date-picker__trigger--placeholder .rs-date-picker__value[data-v-816760df] {
65
65
  color: var(--rs-placeholder);
66
66
  }
67
- .rs-date-picker__trigger--invalid[data-v-82aed16d] {
67
+ .rs-date-picker__trigger--invalid[data-v-816760df] {
68
68
  border-color: var(--rs-danger, var(--rs-color-danger, #dc2626));
69
69
  }
70
- .rs-date-picker__trigger--invalid[data-v-82aed16d]:focus-visible {
70
+ .rs-date-picker__trigger--invalid[data-v-816760df]:focus-visible {
71
71
  border-color: var(--rs-danger, var(--rs-color-danger, #dc2626));
72
72
  box-shadow:
73
73
  var(--rs-input-shadow, none),
74
74
  0 0 0 var(--rs-focus-ring-width, 2px)
75
75
  color-mix(in srgb, var(--rs-danger, #dc2626) 14%, transparent);
76
76
  }
77
- .rs-date-picker-field__error[data-v-82aed16d] {
77
+ .rs-date-picker-field__error[data-v-816760df] {
78
78
  margin: var(--rs-space-xs) 0 0;
79
79
  color: var(--rs-danger, var(--rs-color-danger, #dc2626));
80
80
  font-size: var(--rs-font-size-xs);
81
81
  line-height: var(--rs-line-height-tight);
82
82
  }
83
- .rs-date-picker__leading[data-v-82aed16d] {
83
+ .rs-date-picker__leading[data-v-816760df] {
84
84
  display: inline-flex;
85
85
  min-width: 0;
86
86
  flex: 1;
87
87
  align-items: center;
88
88
  gap: var(--rs-space-sm);
89
89
  }
90
- .rs-date-picker__icon[data-v-82aed16d],
91
- .rs-date-picker__chevron[data-v-82aed16d] {
90
+ .rs-date-picker__icon[data-v-816760df],
91
+ .rs-date-picker__chevron[data-v-816760df] {
92
92
  flex-shrink: 0;
93
93
  color: var(--rs-muted);
94
94
  }
95
- .rs-date-picker__value[data-v-82aed16d] {
95
+ .rs-date-picker__value[data-v-816760df] {
96
96
  min-width: 0;
97
97
  overflow: hidden;
98
98
  text-overflow: ellipsis;
@@ -1,6 +1,6 @@
1
+ import { RS_COMPONENT_SIZE_ICON_PX } from "../../../theme/types.js";
1
2
  import { useRsI18n } from "../../../composables/useRsI18n.js";
2
3
  import RsIcon_default from "../../icon/src/RsIcon.js";
3
- import { RS_COMPONENT_SIZE_ICON_PX } from "../../../theme/types.js";
4
4
  import { buildLocalInputRules, runFormFieldRules } from "../../form/src/form-rules.js";
5
5
  import { isRsFormItemBoundControl, useRsFormContext, useRsFormField, useRsFormItemContext } from "../../form/src/form-utils.js";
6
6
  import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
@@ -5,6 +5,6 @@ import RsDatePicker_vue_vue_type_script_setup_true_lang_default from "./RsDatePi
5
5
 
6
6
 
7
7
  //#region src/components/date-picker/src/RsDatePicker.vue
8
- var RsDatePicker_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsDatePicker_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-82aed16d"]]);
8
+ var RsDatePicker_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsDatePicker_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-816760df"]]);
9
9
  //#endregion
10
10
  export { RsDatePicker_default as default };
@@ -246,8 +246,7 @@ to {
246
246
  }
247
247
  .rs-dialog__resize-handle--n,
248
248
  .rs-dialog__resize-handle--s {
249
- left: 0.5rem;
250
- right: 0.5rem;
249
+ inset-inline: 0.5rem;
251
250
  height: 0.5rem;
252
251
  cursor: ns-resize;
253
252
  }
@@ -1,51 +1,51 @@
1
1
 
2
- .rs-divider[data-v-b8b44303] {
2
+ .rs-divider[data-v-f0cd895b] {
3
3
  flex-shrink: 0;
4
4
  box-sizing: border-box;
5
5
  border: 0;
6
6
  background: transparent;
7
7
  }
8
- .rs-divider--horizontal[data-v-b8b44303] {
8
+ .rs-divider--horizontal[data-v-f0cd895b] {
9
9
  display: flex;
10
10
  align-items: center;
11
11
  width: 100%;
12
12
  margin: var(--rs-space-md) 0;
13
13
  }
14
- .rs-divider--horizontal[data-v-b8b44303]:not(.rs-divider--with-label)::before {
14
+ .rs-divider--horizontal[data-v-f0cd895b]:not(.rs-divider--with-label)::before {
15
15
  content: '';
16
16
  display: block;
17
17
  width: 100%;
18
18
  border-top: 1px solid var(--rs-border);
19
19
  }
20
- .rs-divider--horizontal.rs-divider--dashed[data-v-b8b44303]:not(.rs-divider--with-label)::before {
20
+ .rs-divider--horizontal.rs-divider--dashed[data-v-f0cd895b]:not(.rs-divider--with-label)::before {
21
21
  border-top-style: dashed;
22
22
  }
23
- .rs-divider--horizontal.rs-divider--with-label[data-v-b8b44303]::before,
24
- .rs-divider--horizontal.rs-divider--with-label[data-v-b8b44303]::after {
23
+ .rs-divider--horizontal.rs-divider--with-label[data-v-f0cd895b]::before,
24
+ .rs-divider--horizontal.rs-divider--with-label[data-v-f0cd895b]::after {
25
25
  content: '';
26
26
  flex: 1 1 auto;
27
27
  border-top: 1px solid var(--rs-border);
28
28
  }
29
- .rs-divider--horizontal.rs-divider--dashed.rs-divider--with-label[data-v-b8b44303]::before,
30
- .rs-divider--horizontal.rs-divider--dashed.rs-divider--with-label[data-v-b8b44303]::after {
29
+ .rs-divider--horizontal.rs-divider--dashed.rs-divider--with-label[data-v-f0cd895b]::before,
30
+ .rs-divider--horizontal.rs-divider--dashed.rs-divider--with-label[data-v-f0cd895b]::after {
31
31
  border-top-style: dashed;
32
32
  }
33
- .rs-divider__label[data-v-b8b44303] {
33
+ .rs-divider__label[data-v-f0cd895b] {
34
34
  flex-shrink: 0;
35
35
  padding: 0 var(--rs-space-md);
36
36
  font-size: var(--rs-font-size-xs);
37
37
  color: var(--rs-muted);
38
38
  white-space: nowrap;
39
39
  }
40
- .rs-divider--vertical[data-v-b8b44303] {
40
+ .rs-divider--vertical[data-v-f0cd895b] {
41
41
  display: inline-block;
42
42
  align-self: stretch;
43
43
  width: 0;
44
44
  min-height: 1em;
45
45
  margin: 0 var(--rs-space-md);
46
- border-left: 1px solid var(--rs-border);
46
+ border-inline-start: 1px solid var(--rs-border);
47
47
  vertical-align: middle;
48
48
  }
49
- .rs-divider--vertical.rs-divider--dashed[data-v-b8b44303] {
50
- border-left-style: dashed;
49
+ .rs-divider--vertical.rs-divider--dashed[data-v-f0cd895b] {
50
+ border-inline-start-style: dashed;
51
51
  }
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
3
3
  import RsDivider_vue_vue_type_script_setup_true_lang_default from "./RsDivider.impl.js";
4
4
 
5
5
  //#region src/components/divider/src/RsDivider.vue
6
- var RsDivider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsDivider_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b8b44303"]]);
6
+ var RsDivider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsDivider_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-f0cd895b"]]);
7
7
  //#endregion
8
8
  export { RsDivider_default as default };
@@ -59,8 +59,7 @@
59
59
  }
60
60
  .rs-drawer__content--top > .rs-drawer__resize,
61
61
  .rs-drawer__content--bottom > .rs-drawer__resize {
62
- left: 0;
63
- right: 0;
62
+ inset-inline: 0;
64
63
  height: 6px;
65
64
  cursor: ns-resize;
66
65
  }
@@ -122,8 +121,7 @@
122
121
  }
123
122
  .rs-drawer__content--top,
124
123
  .rs-drawer__content--bottom {
125
- left: 0;
126
- right: 0;
124
+ inset-inline: 0;
127
125
  height: min(100vh, var(--rs-drawer-panel-size, 22rem));
128
126
  }
129
127
  .rs-drawer__content--contained:is(.rs-drawer__content--top, .rs-drawer__content--bottom) {
@@ -65,7 +65,7 @@
65
65
  .rs-dropdown__value {
66
66
  flex: 1;
67
67
  min-width: 0;
68
- text-align: left;
68
+ text-align: start;
69
69
  }
70
70
  .rs-dropdown__label {
71
71
  display: block;
@@ -111,7 +111,7 @@
111
111
  top: -0.55em;
112
112
  margin-bottom: 0.125rem;
113
113
  padding: 0 0.375rem;
114
- margin-left: var(--rs-space-md);
114
+ margin-inline-start: var(--rs-space-md);
115
115
  width: fit-content;
116
116
  max-width: calc(100% - var(--rs-space-md) * 2);
117
117
  background: var(--rs-surface-elevated);