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
@@ -0,0 +1,26 @@
1
+ //#region src/icons/brand.ts
2
+ /** 内置品牌 mark(工作台数据源)。Lucide 线标不在此列。 */
3
+ var rsBrandIconNames = [
4
+ "ftp",
5
+ "redis",
6
+ "mongodb",
7
+ "vastbase",
8
+ "mysql",
9
+ "sqlite",
10
+ "dameng",
11
+ "oracle",
12
+ "clickhouse",
13
+ "kingbase",
14
+ "sqlserver",
15
+ "postgres"
16
+ ];
17
+ var brandIconNameSet = new Set(rsBrandIconNames);
18
+ function isRsBrandIconName(name) {
19
+ return brandIconNameSet.has(name);
20
+ }
21
+ /** 品牌 mark 填充色变量,如 `--rs-icon-mysql-accent`。 */
22
+ function rsBrandIconAccentVar(name) {
23
+ return `--rs-icon-${name}-accent`;
24
+ }
25
+ //#endregion
26
+ export { isRsBrandIconName, rsBrandIconAccentVar, rsBrandIconNames };
@@ -1,3 +1,5 @@
1
1
  export { LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, isRsIconName, lucideIconCount, resolveLucideIcon, } from './lucide';
2
+ export { isRsBrandIconName, rsBrandIconAccentVar, rsBrandIconNames, } from './brand';
3
+ export type { RsBrandIconName } from './brand';
2
4
  /** Playground / 文档常用图标(Lucide 全库约 1600+;kebab-case,如 `house`、`trash-2`) */
3
5
  export declare const rsCommonIconNames: readonly ["house", "settings", "user", "search", "plus", "x", "check", "message-square", "folder", "chevron-right", "chevron-down", "loader", "trash-2", "pencil", "bell", "cloud", "download", "upload", "link", "copy", "external-link", "layout-dashboard", "credit-card", "shield-check"];
@@ -1,4 +1,5 @@
1
1
  import { LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, isRsIconName, lucideIconCount, resolveLucideIcon } from "./lucide.js";
2
+ import { isRsBrandIconName, rsBrandIconAccentVar, rsBrandIconNames } from "./brand.js";
2
3
  //#region src/icons/registry.ts
3
4
  /** Playground / 文档常用图标(Lucide 全库约 1600+;kebab-case,如 `house`、`trash-2`) */
4
5
  var rsCommonIconNames = [
@@ -28,4 +29,4 @@ var rsCommonIconNames = [
28
29
  "shield-check"
29
30
  ];
30
31
  //#endregion
31
- export { LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, isRsIconName, lucideIconCount, resolveLucideIcon, rsCommonIconNames };
32
+ export { LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, isRsBrandIconName, isRsIconName, lucideIconCount, resolveLucideIcon, rsBrandIconAccentVar, rsBrandIconNames, rsCommonIconNames };
package/dist/index.d.ts CHANGED
@@ -214,13 +214,17 @@ export { useRsI18n, createTranslator } from './composables/useRsI18n';
214
214
  export type { RsTranslateFn } from './composables/useRsI18n';
215
215
  export { useRsToast } from './composables/useRsToast';
216
216
  export type { RsToastInput } from './composables/useRsToast';
217
- export { rsCommonIconNames, LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, lucideIconCount, isRsIconName, } from './icons/registry';
218
- export type { RsThemeMode, RsThemeTokens, RsComponentSize, RsRadius, RsFontSize, RsFontWeight, } from './theme/types';
217
+ export { rsCommonIconNames, rsBrandIconNames, rsBrandIconAccentVar, LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, lucideIconCount, isRsIconName, isRsBrandIconName, } from './icons/registry';
218
+ export type { RsBrandIconName } from './icons/registry';
219
+ export type { RsThemeMode, RsResolvedTheme, RsThemeTokens, RsComponentSize, RsRadius, RsFontSize, RsFontWeight, } from './theme/types';
219
220
  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';
220
- export type { RsLocale } from './locale/types';
221
+ export type { RsBuiltinLocale, RsDirMode, RsLocale, RsLocaleMessages, RsTextDirection, } from './locale/types';
222
+ export { defaultLocale, fallbackLocale } from './locale/types';
223
+ export { rsLocaleMessageKeys } from './locale/messages';
224
+ export { applyLocale, inferRsLocaleDir, isRsLocaleRegistered, listRsLocales, registerRsLocale, resolveDirMode, resolveHostLocale, resolveRsLocaleDir, resolveRsMessage, } from './locale/registry-public';
221
225
  export { useRsConfig, useRsConfigOptional, createRsConfigState } from './composables/useRsConfig';
222
226
  export { useResolvedRsComponentSize, resolveRsComponentSize } from './components/_shared';
223
227
  export { useResolvedRsRadius, rsRadiusCss } from './components/_shared';
224
228
  export { themePresets } from './theme/presets';
225
- export { applyTheme } from './theme/apply';
229
+ export { applyTheme, prefersColorSchemeDark, readResolvedTheme, resolveThemeMode, subscribePreferredColorScheme, } from './theme/apply';
226
230
  export { parseCssLengthToPx, readCodeFontFamily, readCodeFontSizePx, readCssLengthPx, readCssVar, readRootFontSizePx, readTerminalFontFamily, readTerminalFontSizePx, readTerminalFontWeight, readTerminalFontWeightBold, } from './theme/css-token';
package/dist/index.js CHANGED
@@ -129,6 +129,7 @@ export { default as RsVirtualList } from './components/virtual-list/src/RsVirtua
129
129
  export { TIME_HOUR_OPTIONS } from './components/time-picker/src/time-picker-utils.js'
130
130
  export { TIME_SECOND_OPTIONS } from './components/time-picker/src/time-picker-utils.js'
131
131
  export { aggregateColumnSummary } from './components/table/src/utils/table-summary-utils.js'
132
+ export { applyLocale } from './locale/apply.js'
132
133
  export { applyMonacoDebugDecorations } from './monaco/debug-decorations2.js'
133
134
  export { applySplitResize } from './components/split-pane/src/split-pane-utils.js'
134
135
  export { applyTheme } from './theme/apply.js'
@@ -182,11 +183,13 @@ export { createRsTableViewContext } from './components/table/src/context/rs-tabl
182
183
  export { createToolbarTableFeature } from './components/table/src/features/table-features.js'
183
184
  export { createTranslator } from './composables/useRsI18n.js'
184
185
  export { createUploadFileFromContent } from './components/upload/src/upload-utils.js'
186
+ export { defaultLocale } from './locale/types.js'
185
187
  export { defaultTreeFilterNode } from './components/tree/src/tree-utils.js'
186
188
  export { downloadUploadFile } from './components/upload/src/upload-utils.js'
187
189
  export { ensureMongodbShellLanguage } from './monaco/languages/mongodb-shell.js'
188
190
  export { escapeHtml } from './components/markdown/src/markdown-utils.js'
189
191
  export { expandSplitPane } from './components/split-pane/src/split-pane-utils.js'
192
+ export { fallbackLocale } from './locale/types.js'
190
193
  export { filterLogLines } from './components/log/src/log-utils.js'
191
194
  export { filterTableRows } from './components/table/src/utils/table-utils.js'
192
195
  export { filterTableTreeRows } from './components/table/src/utils/table-utils.js'
@@ -239,6 +242,7 @@ export { hasTableTreeChildren } from './components/table/src/utils/table-utils.j
239
242
  export { hasTreeChildren } from './components/tree/src/tree-utils.js'
240
243
  export { hrefToAnchorId } from './components/anchor/src/anchor-utils.js'
241
244
  export { inferLogLevel } from './components/log/src/log-utils.js'
245
+ export { inferRsLocaleDir } from './locale/registry.js'
242
246
  export { injectExpandRows } from './components/table/src/utils/table-utils.js'
243
247
  export { inputRuleMessageKeys } from './components/input/src/input-rules.js'
244
248
  export { isCodeMirrorLightTheme } from './components/code-editor/src/code-mirror-lang.js'
@@ -250,10 +254,12 @@ export { isIndexSegment } from './components/form/src/form-path.js'
250
254
  export { isNearScrollBottom } from './components/table/src/utils/table-utils.js'
251
255
  export { isNullDraft } from './components/table/src/utils/table-edit-utils.js'
252
256
  export { isNumberInputInterim } from './components/input-number/src/input-number-utils.js'
257
+ export { isRsBrandIconName } from './icons/brand.js'
253
258
  export { isRsButtonFilledVariant } from './components/button/src/button-utils.js'
254
259
  export { isRsDialogWidthPreset } from './components/dialog/src/dialog-utils.js'
255
260
  export { isRsFormItemBoundControl } from './components/form/src/form-utils.js'
256
261
  export { isRsIconName } from './icons/lucide.js'
262
+ export { isRsLocaleRegistered } from './locale/registry.js'
257
263
  export { isRsLogLevel } from './components/log/src/log-utils.js'
258
264
  export { isRsSplitPaneAutoSize } from './components/split-pane/src/split-pane-utils.js'
259
265
  export { isRsTableApi } from './components/table/src/rs-table-api.js'
@@ -273,6 +279,7 @@ export { isTreeAncestorKey } from './components/tree/src/tree-utils.js'
273
279
  export { joinLogLines } from './components/log/src/log-utils.js'
274
280
  export { listBatchColumnTargets } from './components/table/src/utils/table-edit-utils.js'
275
281
  export { listEditableCells } from './components/table/src/utils/table-edit-utils.js'
282
+ export { listRsLocales } from './locale/registry.js'
276
283
  export { looksLikeIsoDateTimeWithTz } from './utils/iso-local-datetime.js'
277
284
  export { lucideIconCount } from './icons/lucide.js'
278
285
  export { mapRsTableSeriesToEChartsOption } from './components/table/src/utils/rs-table-echarts-adapter.js'
@@ -305,6 +312,7 @@ export { parseRsLogLevel } from './components/log/src/log-utils.js'
305
312
  export { parseTimeValue } from './components/time-picker/src/time-picker-utils.js'
306
313
  export { pickActiveAnchorHref } from './components/anchor/src/anchor-utils.js'
307
314
  export { placeAnchoredPopup } from './components/_shared/src/overlay-utils.js'
315
+ export { prefersColorSchemeDark } from './theme/apply.js'
308
316
  export { prefetchClipboardText } from './utils/rs-clipboard.js'
309
317
  export { prewarmCodeMirrorEditor } from './components/code-editor/src/code-mirror-lang.js'
310
318
  export { provideRsFormItemContext } from './components/form/src/form-utils.js'
@@ -316,12 +324,14 @@ export { readCodeFontSizePx } from './theme/css-token.js'
316
324
  export { readCssLengthPx } from './theme/css-token.js'
317
325
  export { readCssVar } from './theme/css-token.js'
318
326
  export { readDocumentTheme } from './components/code-editor/src/code-editor-utils.js'
327
+ export { readResolvedTheme } from './theme/apply.js'
319
328
  export { readRootFontSizePx } from './theme/css-token.js'
320
329
  export { readTerminalFontFamily } from './theme/css-token.js'
321
330
  export { readTerminalFontSizePx } from './theme/css-token.js'
322
331
  export { readTerminalFontWeight } from './theme/css-token.js'
323
332
  export { readTerminalFontWeightBold } from './theme/css-token.js'
324
333
  export { readTerminalThemeFromCss } from './components/terminal/src/terminal-utils.js'
334
+ export { registerRsLocale } from './locale/registry.js'
325
335
  export { removeUploadFileAt } from './components/upload/src/upload-utils.js'
326
336
  export { renderMarkdown } from './components/markdown/src/markdown-utils.js'
327
337
  export { renderMarkdownInline } from './components/markdown/src/markdown-utils.js'
@@ -336,11 +346,13 @@ export { resolveCodeEditorTheme } from './components/code-editor/src/code-editor
336
346
  export { resolveCodeMirrorLanguage } from './components/code-editor/src/code-mirror-lang.js'
337
347
  export { resolveColumnOrder } from './components/table/src/utils/table-utils.js'
338
348
  export { resolveDialogOverlayStyle } from './components/dialog/src/dialog-utils.js'
349
+ export { resolveDirMode } from './locale/apply.js'
339
350
  export { resolveDrawerOverlayStyle } from './components/drawer/src/drawer-utils.js'
340
351
  export { resolveEntryKey } from './components/table/src/utils/table-utils.js'
341
352
  export { resolveFieldRules } from './components/form/src/form-utils.js'
342
353
  export { resolveFixedColumnStyles } from './components/table/src/utils/table-utils.js'
343
354
  export { resolveGridNavDirection } from './components/table/src/utils/rs-table-grid-nav.js'
355
+ export { resolveHostLocale } from './locale/resolve-host.js'
344
356
  export { resolveInstanceFeatures } from './components/table/src/context/rs-table-module-registry.js'
345
357
  export { resolveItemSize } from './components/virtual-list/src/virtual-list-utils.js'
346
358
  export { resolveLogCopyText } from './components/log/src/log-utils.js'
@@ -358,6 +370,8 @@ export { resolveRsDialogWidthPx } from './components/dialog/src/dialog-utils.js'
358
370
  export { resolveRsDrawerDimensionCss } from './components/drawer/src/drawer-utils.js'
359
371
  export { resolveRsDrawerSizeCss } from './components/drawer/src/drawer-utils.js'
360
372
  export { resolveRsDrawerSizePx } from './components/drawer/src/drawer-utils.js'
373
+ export { resolveRsLocaleDir } from './locale/registry.js'
374
+ export { resolveRsMessage } from './locale/registry.js'
361
375
  export { resolveRuleMessage } from './components/form/src/form-rules.js'
362
376
  export { resolveSelectAllState } from './components/table/src/utils/table-utils.js'
363
377
  export { resolveSelectableRowKeys } from './components/table/src/utils/table-utils.js'
@@ -371,6 +385,7 @@ export { resolveTableTreeRowKey } from './components/table/src/utils/table-utils
371
385
  export { resolveTableVirtualEnabled } from './components/table/src/utils/table-utils.js'
372
386
  export { resolveTabsToClose } from './components/tabs/src/tabs-utils.js'
373
387
  export { resolveTerminalTheme } from './components/terminal/src/terminal-utils.js'
388
+ export { resolveThemeMode } from './theme/apply.js'
374
389
  export { resolveTreeCheckState } from './components/tree/src/tree-utils.js'
375
390
  export { resolveTreeFieldNames } from './components/tree/src/tree-utils.js'
376
391
  export { resolveTreeFocusKey } from './components/tree/src/tree-utils.js'
@@ -382,9 +397,12 @@ export { resolveVirtualListHeight } from './components/virtual-list/src/virtual-
382
397
  export { resolveVisibleTabValues } from './components/tabs/src/tabs-utils.js'
383
398
  export { restoreSelectValue } from './components/select/src/select-utils.js'
384
399
  export { roundToPrecision } from './components/input-number/src/input-number-utils.js'
400
+ export { rsBrandIconAccentVar } from './icons/brand.js'
401
+ export { rsBrandIconNames } from './icons/brand.js'
385
402
  export { rsCommonIconNames } from './icons/registry.js'
386
403
  export { rsConfirm } from './composables/createRsDialog.js'
387
404
  export { rsFeedbackIconClass } from './components/_shared/src/overlay-utils.js'
405
+ export { rsLocaleMessageKeys } from './locale/messages.js'
388
406
  export { rsRadiusCss } from './components/_shared/src/resolve-radius.js'
389
407
  export { rsToastPositions } from './components/_shared/src/overlay-utils.js'
390
408
  export { runFormFieldRules } from './components/form/src/form-rules.js'
@@ -411,6 +429,7 @@ export { splitSizesEqual } from './components/split-pane/src/split-pane-utils.js
411
429
  export { splitTreeLabelHighlight } from './components/tree/src/tree-utils.js'
412
430
  export { stepEnabledIndex } from './components/_shared/src/overlay-utils.js'
413
431
  export { stepNumberValue } from './components/input-number/src/input-number-utils.js'
432
+ export { subscribePreferredColorScheme } from './theme/apply.js'
414
433
  export { supportsRsButtonTone } from './components/button/src/button-utils.js'
415
434
  export { syslogSeverityOf } from './components/log/src/log-utils.js'
416
435
  export { terminalShortcutLabel } from './components/terminal/src/terminal-utils.js'
@@ -0,0 +1,8 @@
1
+ import { type RsDirMode, type RsLocale, type RsTextDirection } from './types';
2
+ export declare function resolveDirMode(mode: RsDirMode, locale: RsLocale): RsTextDirection;
3
+ /**
4
+ * 写入语言与书写方向。色值不在这里。
5
+ * `dir` 同时写元素的 HTML `dir` 与 `data-rs-dir`,Portal 跟 document 时才能翻。
6
+ */
7
+ export declare function applyLocale(locale: RsLocale, dir?: RsDirMode, el?: HTMLElement): void;
8
+ export declare function readDocumentLocale(el?: HTMLElement | null): RsLocale;
@@ -0,0 +1,20 @@
1
+ import { dirAttribute, localeAttribute } from "./types.js";
2
+ import { resolveRsLocaleDir } from "./registry.js";
3
+ //#region src/locale/apply.ts
4
+ function resolveDirMode(mode, locale) {
5
+ if (mode === "ltr" || mode === "rtl") return mode;
6
+ return resolveRsLocaleDir(locale);
7
+ }
8
+ /**
9
+ * 写入语言与书写方向。色值不在这里。
10
+ * `dir` 同时写元素的 HTML `dir` 与 `data-rs-dir`,Portal 跟 document 时才能翻。
11
+ */
12
+ function applyLocale(locale, dir = "auto", el = document.documentElement) {
13
+ const resolvedDir = resolveDirMode(dir, locale);
14
+ el.setAttribute(localeAttribute, locale);
15
+ el.setAttribute("lang", locale);
16
+ el.setAttribute("dir", resolvedDir);
17
+ el.setAttribute(dirAttribute, resolvedDir);
18
+ }
19
+ //#endregion
20
+ export { applyLocale, resolveDirMode };
@@ -1,10 +1,11 @@
1
1
  export type RsI18nVars = Record<string, string | number>;
2
2
  export type RsTranslateFn = (key: string, fallbackOrVars?: string | RsI18nVars, vars?: RsI18nVars) => string;
3
3
  /**
4
- * 将文案中的 `{name}` 替换为 vars。
5
- * 对标 Ant Design / vue-i18n 的命名插值。
4
+ * 插值:`{name}` 换成 vars。
5
+ * 复数(ICU 子集):`{count, plural, one {# item} other {# items}}`,
6
+ * 可用 `=0` / `=1`。`#` 换成数字。类别由 `Intl.PluralRules(locale)` 决定。
6
7
  */
7
- export declare function interpolateRsMessage(template: string, vars?: RsI18nVars): string;
8
+ export declare function interpolateRsMessage(template: string, vars?: RsI18nVars, locale?: string): string;
8
9
  /**
9
10
  * 解析 t() 的第 2、3 参:既兼容 `t(key, fallback)`,也支持 `t(key, vars)`。
10
11
  */
@@ -1,15 +1,118 @@
1
1
  //#region src/locale/interpolate.ts
2
+ var PLURAL_HEAD = /^\{(\w+),\s*plural\s*,/;
2
3
  /**
3
- * 将文案中的 `{name}` 替换为 vars。
4
- * 对标 Ant Design / vue-i18n 的命名插值。
4
+ * 插值:`{name}` 换成 vars。
5
+ * 复数(ICU 子集):`{count, plural, one {# item} other {# items}}`,
6
+ * 可用 `=0` / `=1`。`#` 换成数字。类别由 `Intl.PluralRules(locale)` 决定。
5
7
  */
6
- function interpolateRsMessage(template, vars) {
7
- if (!vars) return template;
8
- return template.replace(/\{(\w+)\}/g, (matched, key) => {
8
+ function interpolateRsMessage(template, vars, locale = "en-US") {
9
+ const withPlural = expandPluralBlocks(template, vars, locale);
10
+ if (!vars) return withPlural;
11
+ return withPlural.replace(/\{(\w+)\}/g, (matched, key) => {
9
12
  const value = vars[key];
10
13
  return value == null ? matched : String(value);
11
14
  });
12
15
  }
16
+ function expandPluralBlocks(template, vars, locale) {
17
+ let i = 0;
18
+ let out = "";
19
+ while (i < template.length) {
20
+ if (template[i] !== "{") {
21
+ out += template[i];
22
+ i += 1;
23
+ continue;
24
+ }
25
+ const parsed = parsePluralBlock(template, i);
26
+ if (!parsed) {
27
+ const end = template.indexOf("}", i);
28
+ if (end === -1) {
29
+ out += template.slice(i);
30
+ break;
31
+ }
32
+ out += template.slice(i, end + 1);
33
+ i = end + 1;
34
+ continue;
35
+ }
36
+ const raw = vars?.[parsed.name];
37
+ const n = typeof raw === "number" ? raw : Number(raw);
38
+ const clause = pickPluralClause(locale, n, parsed.clauses);
39
+ const numeral = Number.isFinite(n) ? String(n) : raw == null ? "" : String(raw);
40
+ out += clause.replace(/#/g, numeral);
41
+ i = parsed.end;
42
+ }
43
+ return out;
44
+ }
45
+ function parsePluralBlock(source, start) {
46
+ const head = PLURAL_HEAD.exec(source.slice(start));
47
+ if (!head) return null;
48
+ let i = start + head[0].length;
49
+ const clauses = /* @__PURE__ */ new Map();
50
+ while (i < source.length) {
51
+ while (source[i] === " " || source[i] === "\n" || source[i] === " ") i += 1;
52
+ if (source[i] === "}") return {
53
+ name: head[1],
54
+ clauses,
55
+ end: i + 1
56
+ };
57
+ let selector = "";
58
+ if (source[i] === "=") {
59
+ let j = i + 1;
60
+ while (j < source.length && source[j] >= "0" && source[j] <= "9") j += 1;
61
+ selector = source.slice(i, j);
62
+ i = j;
63
+ } else {
64
+ let j = i;
65
+ while (j < source.length && source[j] >= "a" && source[j] <= "z") j += 1;
66
+ selector = source.slice(i, j);
67
+ i = j;
68
+ }
69
+ if (!selector) return null;
70
+ while (source[i] === " " || source[i] === " ") i += 1;
71
+ if (source[i] !== "{") return null;
72
+ const inner = readBalanced(source, i);
73
+ if (!inner) return null;
74
+ clauses.set(selector, inner.text);
75
+ i = inner.end;
76
+ }
77
+ return null;
78
+ }
79
+ function readBalanced(source, open) {
80
+ if (source[open] !== "{") return null;
81
+ let depth = 0;
82
+ for (let i = open; i < source.length; i += 1) if (source[i] === "{") depth += 1;
83
+ else if (source[i] === "}") {
84
+ depth -= 1;
85
+ if (depth === 0) return {
86
+ text: source.slice(open + 1, i),
87
+ end: i + 1
88
+ };
89
+ }
90
+ return null;
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
+ }
104
+ function pickPluralClause(locale, n, clauses) {
105
+ if (Number.isFinite(n)) {
106
+ const exact = clauses.get(`=${n}`);
107
+ if (exact != null) return exact;
108
+ const category = pluralRulesFor(locale)?.select(n);
109
+ if (category) {
110
+ const matched = clauses.get(category);
111
+ if (matched != null) return matched;
112
+ }
113
+ }
114
+ return clauses.get("other") ?? "";
115
+ }
13
116
  /**
14
117
  * 解析 t() 的第 2、3 参:既兼容 `t(key, fallback)`,也支持 `t(key, vars)`。
15
118
  */
@@ -1,7 +1,5 @@
1
1
  import type { RsLocaleMessages } from './types';
2
2
  export declare const zhCN: RsLocaleMessages;
3
3
  export declare const enUS: RsLocaleMessages;
4
- export declare const localeMap: {
5
- readonly 'zh-CN': RsLocaleMessages;
6
- readonly 'en-US': RsLocaleMessages;
7
- };
4
+ /** 社区语言包应对齐的 key 清单(与 en-US 表相同)。 */
5
+ export declare const rsLocaleMessageKeys: string[];
@@ -70,7 +70,7 @@ var zhCN = {
70
70
  "pagination.prev": "上一页",
71
71
  "pagination.next": "下一页",
72
72
  "pagination.page": "页",
73
- "pagination.summary": "共 {total} 条",
73
+ "pagination.summary": "{total, plural, other {共 # 条}}",
74
74
  "pagination.jumpTo": "跳至",
75
75
  "pagination.jumpPageSuffix": "页",
76
76
  "pagination.jumpConfirm": "确定",
@@ -167,7 +167,7 @@ var zhCN = {
167
167
  "log.copied": "已复制",
168
168
  "log.copyFailed": "复制失败,请用 HTTPS 或手动选择正文",
169
169
  "log.filter": "按级别过滤",
170
- "log.newLines": "新增 {count} 行",
170
+ "log.newLines": "{count, plural, other {新增 # 行}}",
171
171
  "log.lineNo": "第 {n} 行",
172
172
  "log.level.trace": "跟踪",
173
173
  "log.level.debug": "调试",
@@ -303,7 +303,7 @@ var enUS = {
303
303
  "pagination.prev": "Previous",
304
304
  "pagination.next": "Next",
305
305
  "pagination.page": "page",
306
- "pagination.summary": "Total {total} items",
306
+ "pagination.summary": "{total, plural, one {# item} other {# items}}",
307
307
  "pagination.jumpTo": "Go to",
308
308
  "pagination.jumpPageSuffix": "page",
309
309
  "pagination.jumpConfirm": "Go",
@@ -400,7 +400,7 @@ var enUS = {
400
400
  "log.copied": "Copied",
401
401
  "log.copyFailed": "Copy failed. Use HTTPS or select the log text.",
402
402
  "log.filter": "Filter levels",
403
- "log.newLines": "{count} new lines",
403
+ "log.newLines": "{count, plural, one {# new line} other {# new lines}}",
404
404
  "log.lineNo": "Line {n}",
405
405
  "log.level.trace": "Trace",
406
406
  "log.level.debug": "Debug",
@@ -465,9 +465,7 @@ var enUS = {
465
465
  "markdown.placeholder": "Markdown supported (headings, lists, links, code…)",
466
466
  "markdown.empty": "Nothing to preview"
467
467
  };
468
- var localeMap = {
469
- "zh-CN": zhCN,
470
- "en-US": enUS
471
- };
468
+ /** 社区语言包应对齐的 key 清单(与 en-US 表相同)。 */
469
+ var rsLocaleMessageKeys = Object.keys(enUS);
472
470
  //#endregion
473
- export { enUS, localeMap, zhCN };
471
+ export { enUS, rsLocaleMessageKeys, zhCN };
@@ -0,0 +1,3 @@
1
+ export { applyLocale, readDocumentLocale, resolveDirMode } from './apply';
2
+ export { resolveHostLocale } from './resolve-host';
3
+ export { inferRsLocaleDir, isRsLocaleRegistered, listRsLocales, registerRsLocale, resolveRsLocaleDir, resolveRsLocalePack, resolveRsMessage, } from './registry';
@@ -0,0 +1,19 @@
1
+ import { type RsLocale, type RsLocaleMessages, type RsTextDirection } from './types';
2
+ export interface RsLocalePack {
3
+ messages: RsLocaleMessages;
4
+ dir: RsTextDirection;
5
+ }
6
+ export declare function inferRsLocaleDir(code: string): RsTextDirection;
7
+ /**
8
+ * 登记或合并一种语言。第二次调用同码会覆盖已给的 key,并保留未改的 dir(除非这次传了 dir)。
9
+ * 内置 `zh-CN` / `en-US` 启动时已登记;第三方只调这一次即可被 `RsConfigProvider.locale` 使用。
10
+ */
11
+ export declare function registerRsLocale(code: RsLocale, messages: RsLocaleMessages, options?: {
12
+ dir?: RsTextDirection;
13
+ }): void;
14
+ export declare function isRsLocaleRegistered(code: string): boolean;
15
+ export declare function listRsLocales(): string[];
16
+ export declare function resolveRsLocalePack(code: string): RsLocalePack;
17
+ export declare function resolveRsLocaleDir(code: string): RsTextDirection;
18
+ /** 缺 key:当前语言 → en-US → zh-CN。 */
19
+ export declare function resolveRsMessage(code: string, key: string): string | undefined;
@@ -0,0 +1,50 @@
1
+ import { enUS, zhCN } from "./messages.js";
2
+ import "./types.js";
3
+ //#region src/locale/registry.ts
4
+ var packs = /* @__PURE__ */ new Map();
5
+ var RTL_LANG = /* @__PURE__ */ new Set([
6
+ "ar",
7
+ "he",
8
+ "fa",
9
+ "ur",
10
+ "ps",
11
+ "sd",
12
+ "yi"
13
+ ]);
14
+ function inferRsLocaleDir(code) {
15
+ const base = code.trim().split(/[-_]/)[0]?.toLowerCase() ?? "";
16
+ return RTL_LANG.has(base) ? "rtl" : "ltr";
17
+ }
18
+ /**
19
+ * 登记或合并一种语言。第二次调用同码会覆盖已给的 key,并保留未改的 dir(除非这次传了 dir)。
20
+ * 内置 `zh-CN` / `en-US` 启动时已登记;第三方只调这一次即可被 `RsConfigProvider.locale` 使用。
21
+ */
22
+ function registerRsLocale(code, messages, options) {
23
+ const id = code.trim();
24
+ if (!id) throw new Error("registerRsLocale: code is required");
25
+ const prev = packs.get(id);
26
+ packs.set(id, {
27
+ messages: prev ? {
28
+ ...prev.messages,
29
+ ...messages
30
+ } : { ...messages },
31
+ dir: options?.dir ?? prev?.dir ?? inferRsLocaleDir(id)
32
+ });
33
+ }
34
+ function isRsLocaleRegistered(code) {
35
+ return packs.has(code);
36
+ }
37
+ function listRsLocales() {
38
+ return [...packs.keys()];
39
+ }
40
+ function resolveRsLocaleDir(code) {
41
+ return packs.get(code)?.dir ?? inferRsLocaleDir(code);
42
+ }
43
+ /** 缺 key:当前语言 → en-US → zh-CN。 */
44
+ function resolveRsMessage(code, key) {
45
+ return packs.get(code)?.messages[key] ?? packs.get("en-US")?.messages[key] ?? packs.get("zh-CN")?.messages[key];
46
+ }
47
+ registerRsLocale("zh-CN", zhCN, { dir: "ltr" });
48
+ registerRsLocale("en-US", enUS, { dir: "ltr" });
49
+ //#endregion
50
+ export { inferRsLocaleDir, isRsLocaleRegistered, listRsLocales, registerRsLocale, resolveRsLocaleDir, resolveRsMessage };
@@ -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 };
@@ -1,3 +1,14 @@
1
- export type RsLocale = 'zh-CN' | 'en-US';
1
+ /** 内置语言。第三方用 `registerRsLocale` 加 BCP-47 码。 */
2
+ export type RsBuiltinLocale = 'zh-CN' | 'en-US';
3
+ /** BCP-47。内置码可自动补全;注册后的任意码也合法。 */
4
+ export type RsLocale = RsBuiltinLocale | (string & {});
2
5
  export type RsLocaleMessages = Record<string, string>;
3
- export declare const defaultLocale: RsLocale;
6
+ export type RsTextDirection = 'ltr' | 'rtl';
7
+ /** 书写方向:auto 跟当前 locale 的 dir。 */
8
+ export type RsDirMode = RsTextDirection | 'auto';
9
+ /** 无法从本机语言识别时的回退。当前用户以中文为主,回退 zh-CN。 */
10
+ export declare const defaultLocale: RsBuiltinLocale;
11
+ /** 缺 key 时先回退到该语言,再回退 zh-CN。 */
12
+ export declare const fallbackLocale: RsBuiltinLocale;
13
+ export declare const localeAttribute = "data-rs-locale";
14
+ export declare const dirAttribute = "data-rs-dir";
@@ -1,4 +1,9 @@
1
1
  //#region src/locale/types.ts
2
+ /** 无法从本机语言识别时的回退。当前用户以中文为主,回退 zh-CN。 */
2
3
  var defaultLocale = "zh-CN";
4
+ /** 缺 key 时先回退到该语言,再回退 zh-CN。 */
5
+ var fallbackLocale = "en-US";
6
+ var localeAttribute = "data-rs-locale";
7
+ var dirAttribute = "data-rs-dir";
3
8
  //#endregion
4
- export { defaultLocale };
9
+ export { defaultLocale, dirAttribute, fallbackLocale, localeAttribute };