niuma-ui 2.0.1 → 2.0.3

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 (87) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.en.md +1 -118
  3. package/README.md +60 -62
  4. package/README.zh-CN.md +130 -0
  5. package/dist/components/_shared/src/reka.d.ts +1 -1
  6. package/dist/components/_shared/src/reka.js +2 -2
  7. package/dist/components/avatar/src/RsAvatar.impl.js +1 -1
  8. package/dist/components/badge/index.d.ts +1 -0
  9. package/dist/components/badge/src/RsBadge.css +61 -8
  10. package/dist/components/badge/src/RsBadge.d.ts +19 -3
  11. package/dist/components/badge/src/RsBadge.impl.js +46 -3
  12. package/dist/components/badge/src/RsBadge.js +1 -1
  13. package/dist/components/badge/src/badge-utils.d.ts +11 -0
  14. package/dist/components/badge/src/badge-utils.js +32 -0
  15. package/dist/components/button/src/RsButton.css +87 -71
  16. package/dist/components/button/src/RsButton.d.ts +7 -3
  17. package/dist/components/button/src/RsButton.impl.js +43 -31
  18. package/dist/components/button/src/RsButton.js +1 -1
  19. package/dist/components/button/src/button-utils.d.ts +17 -0
  20. package/dist/components/button/src/button-utils.js +14 -1
  21. package/dist/components/card/src/RsCard.impl.js +1 -1
  22. package/dist/components/cascader/src/RsCascader.d.ts +1 -1
  23. package/dist/components/config-provider/src/RsConfigProvider.css +1 -1
  24. package/dist/components/config-provider/src/RsConfigProvider.d.ts +2 -3
  25. package/dist/components/config-provider/src/RsConfigProvider.impl.js +20 -11
  26. package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
  27. package/dist/components/context-menu/src/RsContextMenuItems.impl.js +1 -1
  28. package/dist/components/date-picker/src/RsDatePicker.impl.js +1 -1
  29. package/dist/components/dialog/src/RsConfirmDialog.impl.js +1 -1
  30. package/dist/components/dialog/src/RsDialog.impl.js +1 -1
  31. package/dist/components/divider/index.d.ts +1 -0
  32. package/dist/components/divider/src/RsDivider.css +37 -22
  33. package/dist/components/divider/src/RsDivider.d.ts +4 -2
  34. package/dist/components/divider/src/RsDivider.impl.js +26 -12
  35. package/dist/components/divider/src/RsDivider.js +1 -1
  36. package/dist/components/divider/src/divider-utils.d.ts +4 -0
  37. package/dist/components/drawer/src/RsDrawer.impl.js +1 -1
  38. package/dist/components/dropdown/src/RsDropdown.impl.js +1 -1
  39. package/dist/components/dynamic-tags/src/RsDynamicTags.css +23 -23
  40. package/dist/components/dynamic-tags/src/RsDynamicTags.d.ts +1 -1
  41. package/dist/components/dynamic-tags/src/RsDynamicTags.js +1 -1
  42. package/dist/components/form/src/form-rules.js +2 -2
  43. package/dist/components/icon/src/RsIcon.css +9 -4
  44. package/dist/components/icon/src/RsIcon.d.ts +4 -3
  45. package/dist/components/icon/src/RsIcon.impl.js +9 -32
  46. package/dist/components/icon/src/RsIcon.js +1 -1
  47. package/dist/components/icon/src/icon-utils.d.ts +17 -0
  48. package/dist/components/icon/src/icon-utils.js +39 -0
  49. package/dist/components/input/src/input-rules.js +3 -3
  50. package/dist/components/link/index.d.ts +1 -0
  51. package/dist/components/link/src/RsLink.css +58 -17
  52. package/dist/components/link/src/RsLink.d.ts +12 -4
  53. package/dist/components/link/src/RsLink.impl.js +26 -25
  54. package/dist/components/link/src/RsLink.js +2 -1
  55. package/dist/components/link/src/link-utils.d.ts +9 -0
  56. package/dist/components/link/src/link-utils.js +15 -0
  57. package/dist/components/loading/src/RsLoading.d.ts +2 -2
  58. package/dist/components/menu/src/RsMenuItems.impl.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.impl.js +1 -1
  62. package/dist/components/switch/src/RsSwitch.impl.js +1 -1
  63. package/dist/components/tabs/src/RsTabs.impl.js +1 -1
  64. package/dist/components/tag/index.d.ts +1 -1
  65. package/dist/components/tag/src/RsTag.css +42 -38
  66. package/dist/components/tag/src/RsTag.d.ts +3 -2
  67. package/dist/components/tag/src/RsTag.impl.js +18 -9
  68. package/dist/components/tag/src/RsTag.js +1 -1
  69. package/dist/components/tag/src/tag-utils.d.ts +8 -0
  70. package/dist/components/terminal/src/RsTerminal.d.ts +1 -1
  71. package/dist/components/time-picker/src/RsTimePicker.impl.js +1 -1
  72. package/dist/components/tooltip/src/RsTooltip.impl.js +1 -1
  73. package/dist/composables/createRsDialog.js +3 -3
  74. package/dist/composables/useRsConfig.js +2 -2
  75. package/dist/composables/useRsI18n.d.ts +1 -1
  76. package/dist/composables/useRsI18n.js +3 -3
  77. package/dist/index.d.ts +5 -1
  78. package/dist/index.js +3 -0
  79. package/dist/locale/interpolate.js +15 -3
  80. package/dist/locale/messages.d.ts +2 -0
  81. package/dist/locale/messages.js +3 -1
  82. package/dist/locale/registry-public.d.ts +1 -0
  83. package/dist/locale/resolve-host.d.ts +7 -0
  84. package/dist/locale/resolve-host.js +46 -0
  85. package/dist/locale/types.d.ts +2 -0
  86. package/dist/locale/types.js +2 -0
  87. package/package.json +10 -8
@@ -1,11 +1,11 @@
1
1
  import { RS_COMPONENT_SIZE_ICON_PX } from "../../../theme/types.js";
2
+ import { ComboboxAnchor, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxItemIndicator, ComboboxLabel, ComboboxPortal, ComboboxRoot, ComboboxTrigger, ComboboxViewport, ComboboxVirtualizer } from "../../_shared/src/reka.js";
2
3
  import { useRsI18n } from "../../../composables/useRsI18n.js";
3
4
  import RsIcon_default from "../../icon/src/RsIcon.js";
4
5
  import { buildLocalInputRules, runFormFieldRules } from "../../form/src/form-rules.js";
5
6
  import { isRsFormItemBoundControl, useRsFormContext, useRsFormField, useRsFormItemContext } from "../../form/src/form-utils.js";
6
7
  import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
7
8
  import { rsRadiusCss, useResolvedRsRadius } from "../../_shared/src/resolve-radius.js";
8
- import { ComboboxAnchor, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxItemIndicator, ComboboxLabel, ComboboxPortal, ComboboxRoot, ComboboxTrigger, ComboboxViewport, ComboboxVirtualizer } from "../../_shared/src/reka.js";
9
9
  import { isSelectOptionGroup, splitSelectLabelHighlight, toComboboxValue } from "./select-utils.js";
10
10
  import { useRsSelect } from "./use-rs-select.js";
11
11
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, isRef, mergeModels, mergeProps, nextTick, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useAttrs, useModel, watch, withCtx, withModifiers } from "vue";
@@ -1,5 +1,5 @@
1
- import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
2
1
  import { SwitchRoot, SwitchThumb } from "../../_shared/src/reka.js";
2
+ import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
3
3
  import { computed, createCommentVNode, createElementBlock, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderSlot, unref, useId, useModel, withCtx } from "vue";
4
4
  //#region src/components/switch/src/RsSwitch.vue?vue&type=script&setup=true&lang.ts
5
5
  var _hoisted_1 = ["for"];
@@ -1,6 +1,6 @@
1
+ import { DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuRoot, DropdownMenuTrigger, TabsContent, TabsList, TabsRoot, TabsTrigger } from "../../_shared/src/reka.js";
1
2
  import { useRsI18n } from "../../../composables/useRsI18n.js";
2
3
  import RsIcon_default from "../../icon/src/RsIcon.js";
3
- import { DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuRoot, DropdownMenuTrigger, TabsContent, TabsList, TabsRoot, TabsTrigger } from "../../_shared/src/reka.js";
4
4
  import { buildTabContextMenuItems, getNextTabAfterBatchClose, getNextTabAfterClose, isTabClosable, isTabFixed, isTabRenamable, resolveTabsToClose } from "./tabs-utils.js";
5
5
  import { useRsTabsNav } from "../../../composables/useRsTabsNav.js";
6
6
  import RsContextMenu_default from "../../context-menu/src/RsContextMenu.js";
@@ -1,2 +1,2 @@
1
1
  export { default as RsTag } from './src/RsTag.js';
2
- export type { RsTagVariant } from './src/RsTag.js';
2
+ export type { RsTagVariant } from './src/tag-utils';
@@ -1,5 +1,9 @@
1
1
 
2
- .rs-tag[data-v-0140d810] {
2
+ .rs-tag[data-v-d8327085] {
3
+ --rs-tag-pad-y-sm: 0.0625rem;
4
+ --rs-tag-pad-y-md: 0.125rem;
5
+ --rs-tag-disabled-opacity: 0.55;
6
+ --rs-tag-close-opacity: 0.75;
3
7
  display: inline-flex;
4
8
  align-items: center;
5
9
  gap: var(--rs-space-xs);
@@ -10,85 +14,85 @@
10
14
  box-sizing: border-box;
11
15
  vertical-align: middle;
12
16
  }
13
- .rs-tag--ssm[data-v-0140d810] {
14
- padding: 0 var(--rs-space-xs);
17
+ .rs-tag--ssm[data-v-d8327085] {
18
+ padding-block: 0;
19
+ padding-inline: var(--rs-space-xs);
15
20
  font-size: var(--rs-font-size-xs);
16
21
  }
17
- .rs-tag--sm[data-v-0140d810] {
18
- padding: 0.0625rem var(--rs-space-xs);
22
+ .rs-tag--sm[data-v-d8327085] {
23
+ padding-block: var(--rs-tag-pad-y-sm);
24
+ padding-inline: var(--rs-space-xs);
19
25
  font-size: var(--rs-font-size-xs);
20
26
  }
21
- .rs-tag--md[data-v-0140d810] {
22
- padding: 0.125rem var(--rs-space-sm);
27
+ .rs-tag--md[data-v-d8327085] {
28
+ padding-block: var(--rs-tag-pad-y-md);
29
+ padding-inline: var(--rs-space-sm);
23
30
  font-size: var(--rs-font-size-xs);
24
31
  }
25
- .rs-tag--lg[data-v-0140d810] {
26
- padding: var(--rs-space-xs) var(--rs-space-sm);
32
+ .rs-tag--lg[data-v-d8327085] {
33
+ padding-block: var(--rs-space-xs);
34
+ padding-inline: var(--rs-space-sm);
27
35
  font-size: var(--rs-font-size-sm);
28
36
  }
29
- .rs-tag--round[data-v-0140d810] {
37
+ .rs-tag--round[data-v-d8327085] {
30
38
  border-radius: var(--rs-radius-full);
31
39
  }
32
- .rs-tag--disabled[data-v-0140d810] {
33
- opacity: 0.55;
40
+ .rs-tag--disabled[data-v-d8327085] {
41
+ opacity: var(--rs-tag-disabled-opacity);
34
42
  cursor: not-allowed;
35
43
  }
36
- .rs-tag__content[data-v-0140d810] {
44
+ .rs-tag__content[data-v-d8327085] {
37
45
  overflow: hidden;
38
46
  text-overflow: ellipsis;
39
47
  white-space: nowrap;
40
48
  }
41
- .rs-tag__close[data-v-0140d810] {
42
- display: inline-flex;
43
- align-items: center;
44
- justify-content: center;
45
- margin: 0;
49
+ .rs-tag__close[data-v-d8327085] {
50
+ min-width: 0;
51
+ min-height: 0;
52
+ width: 1em;
53
+ height: 1em;
46
54
  padding: 0;
47
- border: 0;
48
- border-radius: var(--rs-radius-full);
49
- background: transparent;
50
55
  color: inherit;
51
- cursor: pointer;
52
- opacity: 0.75;
53
- outline: none;
56
+ opacity: var(--rs-tag-close-opacity);
54
57
  }
55
- .rs-tag__close[data-v-0140d810]:hover:not(:disabled) {
58
+ .rs-tag__close[data-v-d8327085]:hover:not(:disabled) {
56
59
  opacity: 1;
60
+ color: inherit;
57
61
  background: color-mix(in srgb, currentColor 12%, transparent);
58
62
  }
59
- .rs-tag__close[data-v-0140d810]:focus-visible {
60
- box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
61
- }
62
- .rs-tag__close[data-v-0140d810]:disabled {
63
- cursor: not-allowed;
64
- }
65
- .rs-tag--default[data-v-0140d810] {
63
+ .rs-tag--default[data-v-d8327085] {
66
64
  background: var(--rs-surface-hover);
67
- color: var(--rs-text);
65
+ color: var(--rs-text-primary);
68
66
  border: 1px solid var(--rs-border);
69
67
  }
70
- .rs-tag--primary[data-v-0140d810] {
68
+ .rs-tag--primary[data-v-d8327085] {
71
69
  background: var(--rs-primary-container);
72
70
  color: var(--rs-on-primary-container);
73
71
  border: 1px solid color-mix(in srgb, var(--rs-primary) var(--rs-tag-border-alpha, 40%), transparent);
74
72
  }
75
- .rs-tag--success[data-v-0140d810] {
73
+ .rs-tag--success[data-v-d8327085] {
76
74
  background: var(--rs-success-container);
77
75
  color: var(--rs-on-success-container);
78
76
  border: 1px solid color-mix(in srgb, var(--rs-success) var(--rs-tag-border-alpha, 40%), transparent);
79
77
  }
80
- .rs-tag--warning[data-v-0140d810] {
78
+ .rs-tag--warning[data-v-d8327085] {
81
79
  background: var(--rs-warning-container);
82
80
  color: var(--rs-on-warning-container);
83
81
  border: 1px solid color-mix(in srgb, var(--rs-warning) var(--rs-tag-border-alpha, 40%), transparent);
84
82
  }
85
- .rs-tag--danger[data-v-0140d810] {
83
+ .rs-tag--danger[data-v-d8327085] {
86
84
  background: var(--rs-danger-container);
87
85
  color: var(--rs-on-danger-container);
88
86
  border: 1px solid color-mix(in srgb, var(--rs-danger) var(--rs-tag-border-alpha, 40%), transparent);
89
87
  }
90
- .rs-tag--info[data-v-0140d810] {
88
+ .rs-tag--info[data-v-d8327085] {
91
89
  background: var(--rs-info-container);
92
90
  color: var(--rs-on-info-container);
93
91
  border: 1px solid color-mix(in srgb, var(--rs-info) var(--rs-tag-border-alpha, 40%), transparent);
94
92
  }
93
+ @media (forced-colors: active) {
94
+ .rs-tag[data-v-d8327085] {
95
+ border: 1px solid CanvasText;
96
+ forced-color-adjust: none;
97
+ }
98
+ }
@@ -1,5 +1,6 @@
1
- import type { RsComponentSize, RsRadius } from '../../../theme/types';
2
- export type RsTagVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info';
1
+ import { type RsComponentSize, type RsRadius } from '../../../theme/types';
2
+ import type { RsTagVariant } from './tag-utils';
3
+ export type { RsTagVariant };
3
4
  type __VLS_Props = {
4
5
  variant?: RsTagVariant;
5
6
  closable?: boolean;
@@ -1,12 +1,13 @@
1
+ import { RS_COMPONENT_SIZE_ICON_PX } from "../../../theme/types.js";
1
2
  import { useRsI18n } from "../../../composables/useRsI18n.js";
2
- import RsIcon_default from "../../icon/src/RsIcon.js";
3
3
  import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
4
4
  import { rsRadiusCss, useResolvedRsRadius } from "../../_shared/src/resolve-radius.js";
5
- import { computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderSlot, unref } from "vue";
5
+ import RsButton_default from "../../button/src/RsButton.js";
6
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderSlot, unref } from "vue";
6
7
  //#region src/components/tag/src/RsTag.vue?vue&type=script&setup=true&lang.ts
7
8
  var _hoisted_1 = { class: "rs-tag__content" };
8
- var _hoisted_2 = ["disabled", "aria-label"];
9
9
  var RsTag_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
10
+ name: "RsTag",
10
11
  __name: "RsTag",
11
12
  props: {
12
13
  variant: { default: "default" },
@@ -32,6 +33,7 @@ var RsTag_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
32
33
  const { t } = useRsI18n();
33
34
  const resolvedSize = useResolvedRsComponentSize(() => props.size);
34
35
  const resolvedRadius = useResolvedRsRadius(() => props.round ? "full" : props.radius, "sm");
36
+ const closeIconSize = RS_COMPONENT_SIZE_ICON_PX.ssm;
35
37
  const rootClass = computed(() => [
36
38
  "rs-tag",
37
39
  `rs-tag--${props.variant}`,
@@ -52,17 +54,24 @@ var RsTag_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
52
54
  return openBlock(), createElementBlock("span", {
53
55
  class: normalizeClass(rootClass.value),
54
56
  style: normalizeStyle(rootStyle.value)
55
- }, [createElementVNode("span", _hoisted_1, [renderSlot(_ctx.$slots, "default", {}, void 0, true)]), __props.closable ? (openBlock(), createElementBlock("button", {
57
+ }, [createElementVNode("span", _hoisted_1, [renderSlot(_ctx.$slots, "default", {}, void 0, true)]), __props.closable ? (openBlock(), createBlock(RsButton_default, {
56
58
  key: 0,
57
- type: "button",
58
59
  class: "rs-tag__close",
60
+ variant: "text",
61
+ bordered: false,
62
+ size: "ssm",
63
+ radius: "full",
64
+ icon: "x",
65
+ "icon-size": unref(closeIconSize),
66
+ "icon-only": "",
59
67
  disabled: __props.disabled,
60
68
  "aria-label": unref(t)("tag.close"),
61
69
  onClick: onClose
62
- }, [createVNode(RsIcon_default, {
63
- name: "x",
64
- size: 12
65
- })], 8, _hoisted_2)) : createCommentVNode("", true)], 6);
70
+ }, null, 8, [
71
+ "icon-size",
72
+ "disabled",
73
+ "aria-label"
74
+ ])) : createCommentVNode("", true)], 6);
66
75
  };
67
76
  }
68
77
  });
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
3
3
  import RsTag_vue_vue_type_script_setup_true_lang_default from "./RsTag.impl.js";
4
4
 
5
5
  //#region src/components/tag/src/RsTag.vue
6
- var RsTag_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTag_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0140d810"]]);
6
+ var RsTag_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTag_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d8327085"]]);
7
7
  //#endregion
8
8
  export { RsTag_default as default };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * RsTag 语义色。只有色相、没有形态轴,不另开 tone。
3
+ * 可增删的一组标签请用 RsDynamicTags。
4
+ */
5
+ export declare const RS_TAG_VARIANTS: readonly ["default", "primary", "success", "warning", "danger", "info"];
6
+ export type RsTagVariant = (typeof RS_TAG_VARIANTS)[number];
7
+ export declare function isRsTagVariant(value: unknown): value is RsTagVariant;
8
+ export declare function resolveRsTagVariant(variant?: RsTagVariant | null): RsTagVariant;
@@ -87,8 +87,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, RsTerminalE
87
87
  onExtraSelect?: ((key: string) => any) | undefined;
88
88
  }>, {
89
89
  theme: Partial<ITheme>;
90
- loading: boolean;
91
90
  overlay: string;
91
+ loading: boolean;
92
92
  contextMenu: boolean;
93
93
  shortcuts: boolean;
94
94
  inputEnabled: boolean;
@@ -1,9 +1,9 @@
1
1
  import { RS_COMPONENT_SIZE_ICON_PX } from "../../../theme/types.js";
2
+ import { PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from "../../_shared/src/reka.js";
2
3
  import { useRsI18n } from "../../../composables/useRsI18n.js";
3
4
  import RsIcon_default from "../../icon/src/RsIcon.js";
4
5
  import { isRsFormItemBoundControl, useRsFormItemContext } from "../../form/src/form-utils.js";
5
6
  import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
6
- import { PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from "../../_shared/src/reka.js";
7
7
  import { EMPTY_TIME_RANGE, formatTimeFromParts, formatTimeRangeDisplay, getCurrentTime, isTimeRangeEmpty, isTimeRangeOrderedValues, isTimeWithinBounds, parseTimeValue, pickEarlierTime, pickLaterTime } from "./time-picker-utils.js";
8
8
  import RsTimePickerColumns_default from "./RsTimePickerColumns.js";
9
9
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, mergeProps, nextTick, normalizeClass, openBlock, ref, resolveComponent, toDisplayString, unref, useAttrs, useId, useModel, useTemplateRef, watch, withCtx } from "vue";
@@ -1,6 +1,6 @@
1
+ import { TooltipContent, TooltipPortal, TooltipRoot, TooltipTrigger } from "../../_shared/src/reka.js";
1
2
  import { useRsI18n } from "../../../composables/useRsI18n.js";
2
3
  import RsIcon_default from "../../icon/src/RsIcon.js";
3
- import { TooltipContent, TooltipPortal, TooltipRoot, TooltipTrigger } from "../../_shared/src/reka.js";
4
4
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref, useSlots, withCtx } from "vue";
5
5
  //#region src/components/tooltip/src/RsTooltip.vue?vue&type=script&setup=true&lang.ts
6
6
  var _hoisted_1 = {
@@ -1,5 +1,5 @@
1
- import { defaultLocale } from "../locale/types.js";
2
1
  import { isRsLocaleRegistered } from "../locale/registry.js";
2
+ import { resolveHostLocale } from "../locale/resolve-host.js";
3
3
  import { readResolvedTheme } from "../theme/apply.js";
4
4
  import RsConfigProvider_default from "../components/config-provider/src/RsConfigProvider.js";
5
5
  import RsDialog_default from "../components/dialog/src/RsDialog.js";
@@ -10,9 +10,9 @@ function readDomTheme() {
10
10
  return readResolvedTheme();
11
11
  }
12
12
  function readDomLocale() {
13
- if (typeof document === "undefined") return defaultLocale;
13
+ if (typeof document === "undefined") return resolveHostLocale();
14
14
  const value = document.documentElement.getAttribute("data-rs-locale");
15
- return value && isRsLocaleRegistered(value) ? value : defaultLocale;
15
+ return value && isRsLocaleRegistered(value) ? value : resolveHostLocale();
16
16
  }
17
17
  /** 命令式实例的销毁函数;测试收尾用 destroyAllRsDialogHosts 走正规 unmount。 */
18
18
  var liveHosts = /* @__PURE__ */ new Set();
@@ -1,6 +1,6 @@
1
1
  import { interpolateRsMessage, resolveRsTranslateArgs } from "../locale/interpolate.js";
2
- import { defaultLocale } from "../locale/types.js";
3
2
  import { resolveRsMessage } from "../locale/registry.js";
3
+ import { resolveHostLocale } from "../locale/resolve-host.js";
4
4
  import { resolveThemeMode } from "../theme/apply.js";
5
5
  import { inject, provide, ref } from "vue";
6
6
  //#region src/composables/useRsConfig.ts
@@ -14,7 +14,7 @@ function useRsConfig() {
14
14
  function useRsConfigOptional() {
15
15
  return inject(rsConfigKey, null);
16
16
  }
17
- function createRsConfigState(initialTheme = "light", initialLocale = defaultLocale, initialControlSize = "md", initialControlRadius, initialDir = "auto") {
17
+ function createRsConfigState(initialTheme = "light", initialLocale = resolveHostLocale(), initialControlSize = "md", initialControlRadius, initialDir = "auto") {
18
18
  const theme = ref(initialTheme);
19
19
  const resolvedTheme = ref(resolveThemeMode(initialTheme));
20
20
  const locale = ref(initialLocale);
@@ -1,7 +1,7 @@
1
1
  import { type RsI18nVars, type RsTranslateFn } from '../locale/interpolate';
2
2
  import { type RsLocale } from '../locale/types';
3
3
  export type { RsI18nVars, RsTranslateFn };
4
- /** 组件内安全取文案:Provider 内跟随 locale,否则回退 defaultLocale */
4
+ /** 组件内安全取文案:Provider 内跟随 locale,否则按本机语言,再回退 zh-CN */
5
5
  export declare function useRsI18n(): {
6
6
  t: RsTranslateFn;
7
7
  locale: import("vue").ComputedRef<RsLocale>;
@@ -1,6 +1,6 @@
1
1
  import { interpolateRsMessage, resolveRsTranslateArgs } from "../locale/interpolate.js";
2
- import "../locale/types.js";
3
2
  import { resolveRsMessage } from "../locale/registry.js";
3
+ import { resolveHostLocale } from "../locale/resolve-host.js";
4
4
  import { rsConfigKey } from "./useRsConfig.js";
5
5
  import { computed, inject } from "vue";
6
6
  //#region src/composables/useRsI18n.ts
@@ -8,10 +8,10 @@ function translate(locale, key, fallbackOrVars, vars) {
8
8
  const parsed = resolveRsTranslateArgs(fallbackOrVars, vars);
9
9
  return interpolateRsMessage(resolveRsMessage(locale, key) ?? parsed.fallback ?? key, parsed.vars, locale);
10
10
  }
11
- /** 组件内安全取文案:Provider 内跟随 locale,否则回退 defaultLocale */
11
+ /** 组件内安全取文案:Provider 内跟随 locale,否则按本机语言,再回退 zh-CN */
12
12
  function useRsI18n() {
13
13
  const ctx = inject(rsConfigKey, null);
14
- const locale = computed(() => ctx?.locale.value ?? "zh-CN");
14
+ const locale = computed(() => ctx?.locale.value ?? resolveHostLocale());
15
15
  const t = (key, fallbackOrVars, vars) => translate(locale.value, key, fallbackOrVars, vars);
16
16
  return {
17
17
  t,
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { RsConfigProvider } from './components/config-provider';
2
2
  export { RsBadge } from './components/badge';
3
+ export type { RsBadgeVariant } from './components/badge';
3
4
  export { RsContainer } from './components/container';
4
5
  export { RsBreadcrumb } from './components/breadcrumb';
5
6
  export { RsAnchor } from './components/anchor';
@@ -21,6 +22,7 @@ export { RsDynamicTags } from './components/dynamic-tags';
21
22
  export type { RsDynamicTagsInputMode, RsDynamicTagsRejectReason, } from './components/dynamic-tags';
22
23
  export { RsAlert } from './components/alert';
23
24
  export { RsDivider } from './components/divider';
25
+ export type { RsDividerOrientation } from './components/divider';
24
26
  export { RsDescriptions } from './components/descriptions';
25
27
  export { RsDescriptionsItem } from './components/descriptions';
26
28
  export type { RsDescriptionsItem as RsDescriptionsItemData, RsDescriptionsLabelPlacement, RsDescriptionsSize, } from './components/descriptions';
@@ -38,6 +40,7 @@ export type { RsInputNumberValue } from './components/input-number';
38
40
  export { clampNumber, formatNumberValue, fromModelValue, isNumberInputInterim, normalizeCommittedNumber, parseNumberInput, resolveNumberPrecision, roundToPrecision, stepNumberValue, toModelValue, } from './components/input-number';
39
41
  export { RsLabel } from './components/label';
40
42
  export { RsLink } from './components/link';
43
+ export type { RsLinkTone, RsLinkUnderline } from './components/link';
41
44
  export { RsMenu } from './components/menu';
42
45
  export { RsSelect } from './components/select';
43
46
  export { RsAutoComplete } from './components/auto-complete';
@@ -220,7 +223,8 @@ export type { RsThemeMode, RsResolvedTheme, RsThemeTokens, RsComponentSize, RsRa
220
223
  export { RS_COMPONENT_SIZES, RS_COMPONENT_SIZE_ICON_PX, RS_RADII, RS_RADIUS_CSS, RS_FONT_SIZES, RS_FONT_SIZE_CSS, RS_FONT_WEIGHTS, RS_FONT_WEIGHT_CSS, } from './theme/types';
221
224
  export type { RsBuiltinLocale, RsDirMode, RsLocale, RsLocaleMessages, RsTextDirection, } from './locale/types';
222
225
  export { defaultLocale, fallbackLocale } from './locale/types';
223
- export { applyLocale, inferRsLocaleDir, isRsLocaleRegistered, listRsLocales, registerRsLocale, resolveRsLocaleDir, resolveRsMessage, } from './locale/registry-public';
226
+ export { rsLocaleMessageKeys } from './locale/messages';
227
+ export { applyLocale, inferRsLocaleDir, isRsLocaleRegistered, listRsLocales, registerRsLocale, resolveDirMode, resolveHostLocale, resolveRsLocaleDir, resolveRsMessage, } from './locale/registry-public';
224
228
  export { useRsConfig, useRsConfigOptional, createRsConfigState } from './composables/useRsConfig';
225
229
  export { useResolvedRsComponentSize, resolveRsComponentSize } from './components/_shared';
226
230
  export { useResolvedRsRadius, rsRadiusCss } from './components/_shared';
package/dist/index.js CHANGED
@@ -346,11 +346,13 @@ export { resolveCodeEditorTheme } from './components/code-editor/src/code-editor
346
346
  export { resolveCodeMirrorLanguage } from './components/code-editor/src/code-mirror-lang.js'
347
347
  export { resolveColumnOrder } from './components/table/src/utils/table-utils.js'
348
348
  export { resolveDialogOverlayStyle } from './components/dialog/src/dialog-utils.js'
349
+ export { resolveDirMode } from './locale/apply.js'
349
350
  export { resolveDrawerOverlayStyle } from './components/drawer/src/drawer-utils.js'
350
351
  export { resolveEntryKey } from './components/table/src/utils/table-utils.js'
351
352
  export { resolveFieldRules } from './components/form/src/form-utils.js'
352
353
  export { resolveFixedColumnStyles } from './components/table/src/utils/table-utils.js'
353
354
  export { resolveGridNavDirection } from './components/table/src/utils/rs-table-grid-nav.js'
355
+ export { resolveHostLocale } from './locale/resolve-host.js'
354
356
  export { resolveInstanceFeatures } from './components/table/src/context/rs-table-module-registry.js'
355
357
  export { resolveItemSize } from './components/virtual-list/src/virtual-list-utils.js'
356
358
  export { resolveLogCopyText } from './components/log/src/log-utils.js'
@@ -400,6 +402,7 @@ export { rsBrandIconNames } from './icons/brand.js'
400
402
  export { rsCommonIconNames } from './icons/registry.js'
401
403
  export { rsConfirm } from './composables/createRsDialog.js'
402
404
  export { rsFeedbackIconClass } from './components/_shared/src/overlay-utils.js'
405
+ export { rsLocaleMessageKeys } from './locale/messages.js'
403
406
  export { rsRadiusCss } from './components/_shared/src/resolve-radius.js'
404
407
  export { rsToastPositions } from './components/_shared/src/overlay-utils.js'
405
408
  export { runFormFieldRules } from './components/form/src/form-rules.js'
@@ -89,15 +89,27 @@ function readBalanced(source, open) {
89
89
  }
90
90
  return null;
91
91
  }
92
+ var pluralRulesByLocale = /* @__PURE__ */ new Map();
93
+ function pluralRulesFor(locale) {
94
+ const cached = pluralRulesByLocale.get(locale);
95
+ if (cached) return cached;
96
+ try {
97
+ const rules = new Intl.PluralRules(locale);
98
+ pluralRulesByLocale.set(locale, rules);
99
+ return rules;
100
+ } catch {
101
+ return;
102
+ }
103
+ }
92
104
  function pickPluralClause(locale, n, clauses) {
93
105
  if (Number.isFinite(n)) {
94
106
  const exact = clauses.get(`=${n}`);
95
107
  if (exact != null) return exact;
96
- try {
97
- const category = new Intl.PluralRules(locale).select(n);
108
+ const category = pluralRulesFor(locale)?.select(n);
109
+ if (category) {
98
110
  const matched = clauses.get(category);
99
111
  if (matched != null) return matched;
100
- } catch {}
112
+ }
101
113
  }
102
114
  return clauses.get("other") ?? "";
103
115
  }
@@ -1,3 +1,5 @@
1
1
  import type { RsLocaleMessages } from './types';
2
2
  export declare const zhCN: RsLocaleMessages;
3
3
  export declare const enUS: RsLocaleMessages;
4
+ /** 社区语言包应对齐的 key 清单(与 en-US 表相同)。 */
5
+ export declare const rsLocaleMessageKeys: string[];
@@ -465,5 +465,7 @@ var enUS = {
465
465
  "markdown.placeholder": "Markdown supported (headings, lists, links, code…)",
466
466
  "markdown.empty": "Nothing to preview"
467
467
  };
468
+ /** 社区语言包应对齐的 key 清单(与 en-US 表相同)。 */
469
+ var rsLocaleMessageKeys = Object.keys(enUS);
468
470
  //#endregion
469
- export { enUS, zhCN };
471
+ export { enUS, rsLocaleMessageKeys, zhCN };
@@ -1,2 +1,3 @@
1
1
  export { applyLocale, readDocumentLocale, resolveDirMode } from './apply';
2
+ export { resolveHostLocale } from './resolve-host';
2
3
  export { inferRsLocaleDir, isRsLocaleRegistered, listRsLocales, registerRsLocale, resolveRsLocaleDir, resolveRsLocalePack, resolveRsMessage, } from './registry';
@@ -0,0 +1,7 @@
1
+ import { type RsLocale } from './types';
2
+ /**
3
+ * 未设 locale 时按本机语言选已登记的包。
4
+ * `zh*` → zh-CN,`en*` → en-US,其它按已登记码的语言前缀匹配。
5
+ * 没有 navigator(SSR)或无法识别时回退 `defaultLocale`(zh-CN)。
6
+ */
7
+ export declare function resolveHostLocale(): RsLocale;
@@ -0,0 +1,46 @@
1
+ import { defaultLocale } from "./types.js";
2
+ import { isRsLocaleRegistered, listRsLocales } from "./registry.js";
3
+ //#region src/locale/resolve-host.ts
4
+ /**
5
+ * 未设 locale 时按本机语言选已登记的包。
6
+ * `zh*` → zh-CN,`en*` → en-US,其它按已登记码的语言前缀匹配。
7
+ * 没有 navigator(SSR)或无法识别时回退 `defaultLocale`(zh-CN)。
8
+ */
9
+ function resolveHostLocale() {
10
+ for (const tag of readHostLanguageTags()) {
11
+ const matched = matchRegisteredLocale(tag);
12
+ if (matched) return matched;
13
+ }
14
+ return defaultLocale;
15
+ }
16
+ function readHostLanguageTags() {
17
+ const tags = [];
18
+ if (typeof navigator !== "undefined") {
19
+ if (Array.isArray(navigator.languages)) tags.push(...navigator.languages);
20
+ if (navigator.language) tags.push(navigator.language);
21
+ }
22
+ const seen = /* @__PURE__ */ new Set();
23
+ const unique = [];
24
+ for (const tag of tags) {
25
+ const normalized = tag.trim();
26
+ if (!normalized) continue;
27
+ const key = normalized.toLowerCase();
28
+ if (seen.has(key)) continue;
29
+ seen.add(key);
30
+ unique.push(normalized);
31
+ }
32
+ return unique;
33
+ }
34
+ function matchRegisteredLocale(tag) {
35
+ const normalized = tag.trim().replace(/_/g, "-");
36
+ if (!normalized) return void 0;
37
+ if (isRsLocaleRegistered(normalized)) return normalized;
38
+ const lower = normalized.toLowerCase();
39
+ for (const code of listRsLocales()) if (code.toLowerCase() === lower) return code;
40
+ const base = lower.split("-")[0] ?? "";
41
+ if (base === "zh" && isRsLocaleRegistered("zh-CN")) return "zh-CN";
42
+ if (base === "en" && isRsLocaleRegistered("en-US")) return "en-US";
43
+ for (const code of listRsLocales()) if (code.toLowerCase().split(/[-_]/)[0] === base) return code;
44
+ }
45
+ //#endregion
46
+ export { resolveHostLocale };
@@ -6,7 +6,9 @@ export type RsLocaleMessages = Record<string, string>;
6
6
  export type RsTextDirection = 'ltr' | 'rtl';
7
7
  /** 书写方向:auto 跟当前 locale 的 dir。 */
8
8
  export type RsDirMode = RsTextDirection | 'auto';
9
+ /** 无法从本机语言识别时的回退。当前用户以中文为主,回退 zh-CN。 */
9
10
  export declare const defaultLocale: RsBuiltinLocale;
11
+ /** 缺 key 时先回退到该语言,再回退 zh-CN。 */
10
12
  export declare const fallbackLocale: RsBuiltinLocale;
11
13
  export declare const localeAttribute = "data-rs-locale";
12
14
  export declare const dirAttribute = "data-rs-dir";
@@ -1,5 +1,7 @@
1
1
  //#region src/locale/types.ts
2
+ /** 无法从本机语言识别时的回退。当前用户以中文为主,回退 zh-CN。 */
2
3
  var defaultLocale = "zh-CN";
4
+ /** 缺 key 时先回退到该语言,再回退 zh-CN。 */
3
5
  var fallbackLocale = "en-US";
4
6
  var localeAttribute = "data-rs-locale";
5
7
  var dirAttribute = "data-rs-dir";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "niuma-ui",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "description": "Vue 3 workbench design system — Rs* components, --rs-* tokens, optional Monaco / CodeMirror / xterm",
@@ -68,6 +68,7 @@
68
68
  "LICENSE",
69
69
  "NOTICE",
70
70
  "README.md",
71
+ "README.zh-CN.md",
71
72
  "README.en.md",
72
73
  "CHANGELOG.md"
73
74
  ],
@@ -76,8 +77,8 @@
76
77
  "**/*.scss"
77
78
  ],
78
79
  "peerDependencies": {
79
- "vue": "^3.5.0",
80
- "vite": ">=5"
80
+ "vite": ">=5",
81
+ "vue": "^3.5.0"
81
82
  },
82
83
  "peerDependenciesMeta": {
83
84
  "vite": {
@@ -105,18 +106,18 @@
105
106
  "@codemirror/theme-one-dark": "^6.1.3",
106
107
  "@codemirror/view": "^6.43.1",
107
108
  "@lucide/vue": "^1.31.0",
109
+ "@rollup/pluginutils": "^5.3.0",
108
110
  "@xterm/addon-fit": "^0.11.0",
109
111
  "@xterm/addon-search": "^0.16.0",
110
112
  "@xterm/xterm": "^6.0.0",
111
113
  "codemirror": "^6.0.2",
112
114
  "dayjs": "^1.11.21",
113
115
  "dompurify": "^3.4.13",
116
+ "es-module-lexer": "^1.7.0",
117
+ "magic-string": "^0.30.17",
114
118
  "marked": "^18.0.9",
115
119
  "monaco-editor": "^0.55.1",
116
120
  "monaco-sql-languages": "^1.2.0",
117
- "@rollup/pluginutils": "^5.3.0",
118
- "es-module-lexer": "^1.7.0",
119
- "magic-string": "^0.30.17",
120
121
  "reka-ui": "^2.9.10",
121
122
  "vue-sonner": "^2.0.9"
122
123
  },
@@ -131,8 +132,9 @@
131
132
  "vite": "^8.1.3",
132
133
  "vitest": "^4.1.9",
133
134
  "vue": "^3.5.39",
134
- "vue-tsc": "^3.3.6",
135
- "vue-router": "^5.1.0"
135
+ "vue-i18n": "^11.4.12",
136
+ "vue-router": "^5.1.0",
137
+ "vue-tsc": "^3.3.6"
136
138
  },
137
139
  "engines": {
138
140
  "node": ">=20"