niuma-ui 2.0.4 → 2.1.0
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.
- package/CHANGELOG.md +67 -0
- package/NOTICE +0 -1
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/dist/components/_shared/index.d.ts +2 -2
- package/dist/components/_shared/src/overlay-utils.d.ts +44 -1
- package/dist/components/_shared/src/overlay-utils.js +87 -2
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/alert/src/RsAlert.css +120 -65
- package/dist/components/alert/src/RsAlert.d.ts +24 -5
- package/dist/components/alert/src/RsAlert.impl.js +108 -36
- package/dist/components/alert/src/RsAlert.js +1 -1
- package/dist/components/alert/src/alert-utils.d.ts +37 -0
- package/dist/components/alert/src/alert-utils.js +71 -0
- package/dist/components/auto-complete/src/RsAutoComplete.d.ts +1 -1
- package/dist/components/button/src/RsButton.css +75 -72
- package/dist/components/button/src/RsButton.d.ts +1 -4
- package/dist/components/button/src/RsButton.impl.js +3 -7
- package/dist/components/button/src/RsButton.js +1 -1
- package/dist/components/card/src/RsCard.d.ts +1 -1
- package/dist/components/code-block/index.d.ts +1 -0
- package/dist/components/code-block/src/RsCodeBlock.css +93 -52
- package/dist/components/code-block/src/RsCodeBlock.d.ts +36 -9
- package/dist/components/code-block/src/RsCodeBlock.impl.js +203 -84
- package/dist/components/code-block/src/RsCodeBlock.js +1 -1
- package/dist/components/code-block/src/code-block-highlight.d.ts +4 -0
- package/dist/components/code-block/src/code-block-highlight.js +34 -0
- package/dist/components/code-block/src/code-block-utils.d.ts +23 -0
- package/dist/components/code-block/src/code-block-utils.js +71 -0
- package/dist/components/code-editor/index.d.ts +1 -1
- package/dist/components/code-editor/src/RsCodeEditor.css +118 -92
- package/dist/components/code-editor/src/RsCodeEditor.d.ts +14 -3
- package/dist/components/code-editor/src/RsCodeEditor.impl.js +261 -94
- package/dist/components/code-editor/src/RsCodeEditor.js +1 -1
- package/dist/components/code-editor/src/code-editor-utils.d.ts +15 -0
- package/dist/components/code-editor/src/code-editor-utils.js +36 -1
- package/dist/components/code-editor/src/code-mirror-completion.d.ts +1 -1
- package/dist/components/code-editor/src/code-mirror-completion.js +8 -5
- package/dist/components/code-editor/src/code-mirror-diagnostics.d.ts +2 -3
- package/dist/components/code-editor/src/code-mirror-diagnostics.js +3 -4
- package/dist/components/code-editor/src/code-mirror-ghost.d.ts +1 -1
- package/dist/components/code-editor/src/code-mirror-ghost.js +12 -3
- package/dist/components/code-editor/src/code-mirror-inline-edit.js +8 -3
- package/dist/components/code-editor/src/code-mirror-intel.d.ts +2 -2
- package/dist/components/code-editor/src/code-mirror-intel.js +50 -39
- package/dist/components/code-editor/src/code-mirror-lang.js +4 -0
- package/dist/components/code-editor/src/code-mirror-session.d.ts +13 -0
- package/dist/components/code-editor/src/code-mirror-session.js +30 -0
- package/dist/components/config-provider/src/RsConfigProvider.css +1 -1
- package/dist/components/config-provider/src/RsConfigProvider.d.ts +2 -2
- package/dist/components/config-provider/src/RsConfigProvider.impl.js +7 -16
- package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
- package/dist/components/context-menu/index.d.ts +1 -1
- package/dist/components/context-menu/src/RsContextMenu.css +115 -89
- package/dist/components/context-menu/src/RsContextMenu.d.ts +32 -11
- package/dist/components/context-menu/src/RsContextMenu.impl.js +795 -48
- package/dist/components/context-menu/src/RsContextMenuItems.d.ts +25 -1
- package/dist/components/context-menu/src/RsContextMenuItems.impl.js +110 -61
- package/dist/components/context-menu/src/context-menu-utils.d.ts +89 -3
- package/dist/components/context-menu/src/context-menu-utils.js +168 -3
- package/dist/components/date-picker/src/RsDatePicker.d.ts +2 -2
- package/dist/components/date-picker/src/RsDateTimePicker.d.ts +2 -2
- package/dist/components/descriptions/index.d.ts +1 -1
- package/dist/components/descriptions/src/RsDescriptions.css +38 -11
- package/dist/components/descriptions/src/RsDescriptions.d.ts +20 -4
- package/dist/components/descriptions/src/RsDescriptions.impl.js +89 -19
- package/dist/components/descriptions/src/RsDescriptionsItem.impl.js +13 -6
- package/dist/components/descriptions/src/descriptions-utils.d.ts +19 -0
- package/dist/components/descriptions/src/descriptions-utils.js +39 -1
- package/dist/components/dialog/index.d.ts +1 -1
- package/dist/components/dialog/src/RsConfirmDialog.css +47 -21
- package/dist/components/dialog/src/RsConfirmDialog.d.ts +19 -7
- package/dist/components/dialog/src/RsConfirmDialog.impl.js +349 -119
- package/dist/components/dialog/src/RsConfirmDialog.js +2 -1
- package/dist/components/dialog/src/RsDialog.css +102 -109
- package/dist/components/dialog/src/RsDialog.d.ts +34 -24
- package/dist/components/dialog/src/RsDialog.impl.js +410 -177
- package/dist/components/dialog/src/RsDialog.js +2 -1
- package/dist/components/dialog/src/dialog-utils.d.ts +40 -1
- package/dist/components/dialog/src/dialog-utils.js +152 -1
- package/dist/components/dialog/src/dialog-window.js +29 -8
- package/dist/components/drawer/index.d.ts +1 -1
- package/dist/components/drawer/src/RsDrawer.css +61 -29
- package/dist/components/drawer/src/RsDrawer.d.ts +37 -21
- package/dist/components/drawer/src/RsDrawer.impl.js +441 -223
- package/dist/components/drawer/src/drawer-utils.d.ts +35 -0
- package/dist/components/drawer/src/drawer-utils.js +131 -1
- package/dist/components/dropdown/index.d.ts +1 -1
- package/dist/components/dropdown/src/RsDropdown.css +140 -61
- package/dist/components/dropdown/src/RsDropdown.d.ts +39 -6
- package/dist/components/dropdown/src/RsDropdown.impl.js +693 -63
- package/dist/components/dropdown/src/RsDropdownItemView.impl.js +17 -7
- package/dist/components/dropdown/src/RsDropdownItems.d.ts +32 -3
- package/dist/components/dropdown/src/RsDropdownItems.impl.js +171 -59
- package/dist/components/dropdown/src/dropdown-utils.d.ts +50 -0
- package/dist/components/dropdown/src/dropdown-utils.js +103 -3
- package/dist/components/empty/index.d.ts +1 -0
- package/dist/components/empty/src/RsEmpty.css +105 -23
- package/dist/components/empty/src/RsEmpty.d.ts +27 -4
- package/dist/components/empty/src/RsEmpty.impl.js +154 -11
- package/dist/components/empty/src/RsEmpty.js +2 -1
- package/dist/components/empty/src/empty-utils.d.ts +28 -0
- package/dist/components/empty/src/empty-utils.js +55 -0
- package/dist/components/form/src/RsForm.d.ts +1 -1
- package/dist/components/input-number/src/RsInputNumber.d.ts +1 -1
- package/dist/components/label/src/RsLabel.d.ts +1 -1
- package/dist/components/loading/index.d.ts +1 -0
- package/dist/components/loading/src/RsLoading.css +13 -97
- package/dist/components/loading/src/RsLoading.d.ts +52 -2
- package/dist/components/loading/src/RsLoading.impl.js +216 -33
- package/dist/components/loading/src/RsLoading.js +2 -1
- package/dist/components/loading/src/loading-status.css +210 -0
- package/dist/components/loading/src/loading-status.d.ts +34 -0
- package/dist/components/loading/src/loading-status.impl.js +84 -0
- package/dist/components/loading/src/loading-status.js +8 -0
- package/dist/components/loading/src/loading-utils.d.ts +51 -4
- package/dist/components/loading/src/loading-utils.js +122 -0
- package/dist/components/loading-bar/index.d.ts +1 -0
- package/dist/components/loading-bar/src/RsLoadingBar.css +72 -8
- package/dist/components/loading-bar/src/RsLoadingBar.d.ts +55 -11
- package/dist/components/loading-bar/src/RsLoadingBar.impl.js +298 -57
- package/dist/components/loading-bar/src/RsLoadingBar.js +1 -1
- package/dist/components/loading-bar/src/loading-bar-utils.d.ts +69 -0
- package/dist/components/loading-bar/src/loading-bar-utils.js +97 -0
- package/dist/components/log/src/RsLog.css +52 -144
- package/dist/components/log/src/RsLog.d.ts +12 -11
- package/dist/components/log/src/RsLog.impl.js +181 -148
- package/dist/components/log/src/RsLog.js +1 -1
- package/dist/components/log/src/RsLogRow.css +152 -0
- package/dist/components/log/src/RsLogRow.d.ts +35 -0
- package/dist/components/log/src/RsLogRow.impl.js +91 -0
- package/dist/components/log/src/RsLogRow.js +8 -0
- package/dist/components/log/src/log-utils.d.ts +8 -0
- package/dist/components/log/src/log-utils.js +71 -10
- package/dist/components/markdown/index.d.ts +1 -1
- package/dist/components/markdown/src/RsMarkdown.css +75 -32
- package/dist/components/markdown/src/RsMarkdown.d.ts +6 -2
- package/dist/components/markdown/src/RsMarkdown.impl.js +185 -17
- package/dist/components/markdown/src/markdown-utils.d.ts +26 -0
- package/dist/components/markdown/src/markdown-utils.js +114 -12
- package/dist/components/mentions/src/RsMentions.d.ts +2 -2
- package/dist/components/menu/index.d.ts +1 -1
- package/dist/components/menu/src/RsMenu.css +70 -29
- package/dist/components/menu/src/RsMenu.d.ts +58 -4
- package/dist/components/menu/src/RsMenu.impl.js +93 -46
- package/dist/components/menu/src/RsMenuItems.d.ts +22 -5
- package/dist/components/menu/src/RsMenuItems.impl.js +506 -154
- package/dist/components/menu/src/menu-utils.d.ts +56 -0
- package/dist/components/menu/src/menu-utils.js +139 -6
- package/dist/components/monaco-editor/index.d.ts +1 -1
- package/dist/components/monaco-editor/src/RsMonacoEditor.css +28 -16
- package/dist/components/monaco-editor/src/RsMonacoEditor.d.ts +39 -41
- package/dist/components/monaco-editor/src/RsMonacoEditor.impl.js +212 -133
- package/dist/components/monaco-editor/src/RsMonacoEditor.js +1 -1
- package/dist/components/monaco-editor/src/monaco-editor-utils.d.ts +126 -0
- package/dist/components/monaco-editor/src/monaco-editor-utils.js +302 -0
- package/dist/components/pagination/index.d.ts +2 -2
- package/dist/components/pagination/src/RsPagination.css +93 -46
- package/dist/components/pagination/src/RsPagination.d.ts +68 -8
- package/dist/components/pagination/src/RsPagination.impl.js +229 -86
- package/dist/components/pagination/src/RsPagination.js +1 -1
- package/dist/components/pagination/src/pagination-utils.d.ts +59 -0
- package/dist/components/pagination/src/pagination-utils.js +105 -1
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/src/RsPopover.css +124 -14
- package/dist/components/popover/src/RsPopover.d.ts +38 -7
- package/dist/components/popover/src/RsPopover.impl.js +546 -35
- package/dist/components/popover/src/RsPopover.js +2 -1
- package/dist/components/popover/src/popover-utils.d.ts +24 -2
- package/dist/components/popover/src/popover-utils.js +55 -0
- package/dist/components/sidebar/index.d.ts +1 -0
- package/dist/components/sidebar/src/RsSidebar.css +91 -33
- package/dist/components/sidebar/src/RsSidebar.d.ts +17 -9
- package/dist/components/sidebar/src/RsSidebar.impl.js +124 -22
- package/dist/components/sidebar/src/RsSidebar.js +1 -1
- package/dist/components/sidebar/src/RsSidebarGroup.css +23 -6
- package/dist/components/sidebar/src/RsSidebarGroup.d.ts +6 -2
- package/dist/components/sidebar/src/RsSidebarGroup.impl.js +17 -4
- package/dist/components/sidebar/src/RsSidebarGroup.js +1 -1
- package/dist/components/sidebar/src/RsSidebarItem.css +50 -20
- package/dist/components/sidebar/src/RsSidebarItem.d.ts +21 -3
- package/dist/components/sidebar/src/RsSidebarItem.impl.js +71 -20
- package/dist/components/sidebar/src/RsSidebarItem.js +1 -1
- package/dist/components/sidebar/src/sidebar-utils.d.ts +47 -0
- package/dist/components/sidebar/src/sidebar-utils.js +72 -0
- package/dist/components/split-pane/index.d.ts +2 -2
- package/dist/components/split-pane/src/RsSplitPane.css +41 -30
- package/dist/components/split-pane/src/RsSplitPane.d.ts +6 -2
- package/dist/components/split-pane/src/RsSplitPane.impl.js +153 -45
- package/dist/components/split-pane/src/split-pane-utils.d.ts +23 -0
- package/dist/components/split-pane/src/split-pane-utils.js +18 -1
- package/dist/components/stat-card/index.d.ts +1 -0
- package/dist/components/stat-card/src/RsStatCard.css +129 -25
- package/dist/components/stat-card/src/RsStatCard.d.ts +40 -4
- package/dist/components/stat-card/src/RsStatCard.impl.js +106 -12
- package/dist/components/stat-card/src/RsStatCard.js +1 -1
- package/dist/components/stat-card/src/stat-card-utils.d.ts +39 -0
- package/dist/components/stat-card/src/stat-card-utils.js +113 -0
- package/dist/components/steps/index.d.ts +1 -1
- package/dist/components/steps/src/RsSteps.css +158 -37
- package/dist/components/steps/src/RsSteps.d.ts +69 -5
- package/dist/components/steps/src/RsSteps.impl.js +168 -28
- package/dist/components/steps/src/RsSteps.js +1 -1
- package/dist/components/steps/src/steps-utils.d.ts +51 -1
- package/dist/components/steps/src/steps-utils.js +67 -1
- package/dist/components/table/src/RsTable.impl.js +4 -2
- package/dist/components/table/src/composables/useRsTableContextMenu.d.ts +16 -0
- package/dist/components/table/src/composables/useRsTableContextMenu.js +1 -1
- package/dist/components/table/src/composables/useRsTableEngine.js +6 -2
- package/dist/components/table/src/composables/useRsTableScrollLayout.js +2 -0
- package/dist/components/table/src/composables/useRsTableShell.d.ts +16 -0
- package/dist/components/table/src/rs-table-props.d.ts +1 -1
- package/dist/components/table/src/rs-table-props.js +0 -1
- package/dist/components/table/src/table-body/RsTableBody.impl.js +1 -0
- package/dist/components/table/src/table-body/RsTableCell.impl.js +1 -1
- package/dist/components/table/src/table-body/RsTableCellEditor.impl.js +10 -2
- package/dist/components/table/src/table-body/RsTableColGroup.impl.js +1 -0
- package/dist/components/table/src/table-footer/RsTableSummaryRow.impl.js +1 -0
- package/dist/components/table/src/table-header/RsTableHeader.impl.js +1 -0
- package/dist/components/table/src/utils/table-utils.d.ts +10 -6
- package/dist/components/table/src/utils/table-utils.js +27 -25
- package/dist/components/table/style/rs-table.css +86 -28
- package/dist/components/tabs/index.d.ts +2 -2
- package/dist/components/tabs/src/RsTabs.css +225 -101
- package/dist/components/tabs/src/RsTabs.d.ts +37 -8
- package/dist/components/tabs/src/RsTabs.impl.js +400 -270
- package/dist/components/tabs/src/tabs-utils.d.ts +41 -2
- package/dist/components/tabs/src/tabs-utils.js +55 -1
- package/dist/components/terminal/index.d.ts +1 -1
- package/dist/components/terminal/src/RsTerminal.css +60 -37
- package/dist/components/terminal/src/RsTerminal.d.ts +36 -4
- package/dist/components/terminal/src/RsTerminal.impl.js +288 -68
- package/dist/components/terminal/src/RsTerminal.js +1 -1
- package/dist/components/terminal/src/terminal-utils.d.ts +42 -4
- package/dist/components/terminal/src/terminal-utils.js +113 -10
- package/dist/components/textarea/src/RsTextarea.d.ts +1 -1
- package/dist/components/time-picker/src/RsTimePicker.d.ts +2 -2
- package/dist/components/toaster/src/RsToaster.css +156 -203
- package/dist/components/toaster/src/RsToaster.d.ts +32 -2
- package/dist/components/toaster/src/RsToaster.impl.js +309 -34
- package/dist/components/toaster/src/toast-store.d.ts +95 -0
- package/dist/components/toaster/src/toast-store.js +177 -0
- package/dist/components/toaster/src/toast-utils.d.ts +60 -0
- package/dist/components/toaster/src/toast-utils.js +86 -0
- package/dist/components/toolbar/index.d.ts +1 -1
- package/dist/components/toolbar/src/RsToolbar.css +206 -32
- package/dist/components/toolbar/src/RsToolbar.d.ts +41 -16
- package/dist/components/toolbar/src/RsToolbar.impl.js +146 -18
- package/dist/components/toolbar/src/RsToolbar.js +2 -1
- package/dist/components/toolbar/src/toolbar-utils.d.ts +20 -0
- package/dist/components/toolbar/src/toolbar-utils.js +105 -0
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/src/RsTooltip.css +104 -26
- package/dist/components/tooltip/src/RsTooltip.d.ts +38 -16
- package/dist/components/tooltip/src/RsTooltip.impl.js +420 -51
- package/dist/components/tooltip/src/RsTooltip.js +2 -1
- package/dist/components/tooltip/src/RsTooltipProvider.d.ts +4 -4
- package/dist/components/tooltip/src/RsTooltipProvider.impl.js +51 -14
- package/dist/components/tooltip/src/tooltip-utils.d.ts +30 -0
- package/dist/components/tooltip/src/tooltip-utils.js +23 -0
- package/dist/components/tree/index.d.ts +2 -2
- package/dist/components/tree/src/RsTree.css +84 -75
- package/dist/components/tree/src/RsTree.d.ts +20 -20
- package/dist/components/tree/src/RsTree.impl.js +292 -66
- package/dist/components/tree/src/RsTree.js +1 -1
- package/dist/components/tree/src/tree-utils.d.ts +22 -0
- package/dist/components/tree/src/tree-utils.js +18 -4
- package/dist/components/tree-select/src/RsTreeSelect.d.ts +1 -1
- package/dist/components/virtual-list/index.d.ts +1 -1
- package/dist/components/virtual-list/src/RsVirtualList.css +64 -9
- package/dist/components/virtual-list/src/RsVirtualList.d.ts +31 -5
- package/dist/components/virtual-list/src/RsVirtualList.impl.js +425 -76
- package/dist/components/virtual-list/src/RsVirtualList.js +1 -1
- package/dist/components/virtual-list/src/virtual-list-utils.d.ts +64 -1
- package/dist/components/virtual-list/src/virtual-list-utils.js +215 -1
- package/dist/composables/useRsLoadingBar.d.ts +2 -5
- package/dist/composables/useRsLoadingBar.js +21 -5
- package/dist/composables/useRsTabsNav.d.ts +3 -1
- package/dist/composables/useRsTabsNav.js +96 -28
- package/dist/composables/useRsToast.d.ts +11 -13
- package/dist/composables/useRsToast.js +66 -17
- package/dist/index.d.ts +30 -21
- package/dist/index.js +14 -0
- package/dist/locale/apply.js +6 -1
- package/dist/locale/messages.js +128 -2
- package/dist/styles.css +465 -808
- package/dist/theme/brand.example.css +3 -2
- package/dist/vite-plugins/niuma-ui-host.js +1 -1
- package/package.json +2 -5
- package/dist/components/_shared/src/reka.d.ts +0 -2
- package/dist/components/_shared/src/reka.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,72 @@
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [2.1.0] - 2026-09-22
|
|
10
|
+
|
|
11
|
+
### 变更
|
|
12
|
+
|
|
13
|
+
- 去掉 `reka-ui`。`RsConfigProvider` 不再包一层 Reka `ConfigProvider`。`theme` / `locale` / `dir` / `controlSize` / `controlRadius` / `themeScope` 语义不变;语言和书写方向仍由 `applyLocale` 写到 `document` 或 Provider 根节点。
|
|
14
|
+
- 文档站版本改为读取 `package.json`。推送 `v*` 标签时与 npm 发布同一提交重新部署 GitHub Pages。
|
|
15
|
+
- `RsButton` 轮廓描边改跟 `--rs-input-border`。亮色不再用 `#6e6e73`,暗色不再用 `#a3a3a3`。
|
|
16
|
+
- `RsButton`:未传 `bordered` 回到 `false`(与 2.0.3 之前一致)。要描边须显式传 `bordered`。
|
|
17
|
+
|
|
18
|
+
## [2.0.9] - 2026-09-22
|
|
19
|
+
|
|
20
|
+
### 变更
|
|
21
|
+
|
|
22
|
+
- `RsTable`:原先就不引用 Reka。`data` / 排序 / 选择 / 虚拟滚动 / 编辑 / 树表 / 右键语义不变。补组件名。`nullLabel` 未传时走 `table.nullValue`。默认字符串排序和筛选跟当前 locale(`localeCompare` / `toLocaleLowerCase`);列上的 `sorter` 仍由宿主比较。颜色改跟 `--rs-surface` / `--rs-text-primary` / `--rs-border`,高对比会跟着走。选中色条、列拖放线和展开箭头在 RTL 转向。减少动态时外壳挂 `rs-motion-reduce`。单元格日期失焦提交的定时器在卸载时清掉;滚动布局卸载时作废尚未写回的帧并断开 ResizeObserver。列宽拖拽仍在松开和卸载时摘掉 document 监听。`subscribeAnalytics` 返回的取消函数不调用会留到表格卸载。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,并补排序、勾选、筛选、空态、虚拟、插槽、合计、分组、右键、实例 API、主题和键盘。
|
|
23
|
+
- `RsTree`:原先就不引用 Reka。`v-model` / `v-model:expandedKeys` / `v-model:checkedKeys` / `v-model:halfCheckedKeys` / 勾选、拖拽、过滤、懒加载、虚拟滚动与 `expandAll` / `collapseAll` / `expandNode` / `collapseNode` / `focusNode` 语义不变。补 `disabled`(含 Form.disabled)/ `ariaLabel` / `id`、`#icon` / `#empty`、`focus()` / `scrollToKey()` / `getSelectedKeys()` / `getCheckedKeys()` / `getExpandedKeys()` / `getHalfCheckedKeys()` 与公开类型 `RsTreeExpose` / `RsTreeInstance`。未传 `size` 跟 Form / ConfigProvider。树是一个 Tab 停靠点(`aria-activedescendant`);方向键在 RTL 对调;字符前缀跳转,输入法组合键不抢;`*` 展开当前层已加载的兄弟。`aria-setsize` / `aria-posinset` 按兄弟计。半选写到 checkbox 的 `indeterminate`。过滤与高亮用 `toLocaleLowerCase`。虚拟列表按行号滚动,不再依赖未挂载的行节点。`virtual` 开关时成对连接 / 断开 ResizeObserver;`loadData` 在卸载后不再改展开;输入跳转定时器卸载时清掉。行引用离开窗口就从 Map 删除。开发环境在虚拟滚动开启时 `console.info` 一行(节点数、视口高度),未开启不打印。名称走 `tree.*`。高亮、拖入和勾选标记走 `--rs-tree-highlight-bg` / `--rs-tree-drop-inside-bg` / `--rs-tree-check-fg`,间距用逻辑属性,减少动态时关掉过渡。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
24
|
+
- `RsMonacoEditor`:补 `contextMenu`(默认开,仍是 Monaco 原生右键)和 `contextmenu`(行、列、选中文本、指针坐标)。关掉后不再弹出原生菜单,并拦住浏览器菜单;事件仍发,监听随编辑器释放。`options.contextmenu` 不盖过这个开关。
|
|
25
|
+
- `RsContextMenu`:打开和子菜单先按实测尺寸摆好再淡入。未摆好前不显示,避免边缩放边改 `top` / `left` 时跳动。上下移动高亮只更新条目列表,不再重测面板,层节点的 ref 保持同一个函数。
|
|
26
|
+
- `RsTerminal`:原先就不引用 Reka。`data` / `write` / `resize` / 右键项 / `inputEnabled` / 搜索 / `copyOnSelect` / `minimumContrastRatio` 语义不变。补 `cursorStyle` / `screenReaderMode` / `openLinks` / `rescaleOverlappingGlyphs`(默认开,便于 GB18030 歧义宽度)/ `ariaLabel` / `id`,以及 `titleChange` / `bell` / `link`。http(s) 与 mailto 新开标签并带 noopener,`javascript:` 与 `data:` 忽略。`inputEnabled` 为 false 时关掉 stdin。画面 `dir=ltr`。`themeMode=auto` 跟最近的 `data-rs-theme`,颜色从宿主继承的 token 来。多个实例共用一个主题观察器,最后一个卸载才断开。卸载同时摘掉 ResizeObserver、滚轮、减少动态监听和 xterm 订阅;首次 fit 还在等字体时卸载,之后不再挂观察器。搜索插件只在 `searchEnabled` 时加载。没有匹配时搜索框说明走 `terminal.searchEmpty`,输入法组合中的 Enter 不跳下一条。名称走 `terminal.label`。外壳阴影走 `--rs-shadow-sm`,搜索焦点环走 `--rs-focus-*`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
27
|
+
|
|
28
|
+
## [2.0.8] - 2026-09-22
|
|
29
|
+
|
|
30
|
+
### 变更
|
|
31
|
+
|
|
32
|
+
- `RsLog`:原先就不引用 Reka。`v-model:lines` / `v-model:search` / `v-model:levels` / `text` / 高度、虚拟、折行、级别推断、`inferMarkers`、`maxLines`、`follow`、`live`、复制与 `append` / `clear` / `scrollTo*` 语义不变。补 `id`。展示、搜索、复制和级别推断去掉 ANSI,`getLines().text` 仍是源文本,并多了 `plain`。工具条跟页面书写方向,正文默认 `dir=ltr`。贴底被上滚或框选打断时出现「回到最新」,并带新增行数;搜索显示匹配条数,Enter / Shift+Enter 在匹配行之间移动(输入法组合键不抢)。级别名和时间也能被当前 locale 搜到。`Intl.DateTimeFormat` 与标识正则各最多缓存 24 / 64 个。字符串 `append` 只按行裁剪,不再为了 `maxLines` 整段归一化。虚拟列表用稳定 key,窗口滑动时同一行不换键。高亮每行只算一次。复制定时器在卸载时清掉,剪贴板若在卸载后返回不再排新定时器。没有 window 监听,也没有 ResizeObserver。名称走 `log.*`。描边、级别色和当前行色条走 `--rs-log-*`,色条在逻辑起点。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
33
|
+
- `RsMarkdown`:原先就不引用 Reka。`v-model` / `v-model:mode` / `readonly` / `height` / `placeholder` / `theme` / `rounded` / `showModeToggle` / `breaks` / `disabled` 语义不变;readonly 仍强制预览并隐藏模式条。补 `ariaLabel` / `id` 与 `focus()`。模式条是原生 tablist(方向键 / Home / End,RTL 左右对调)。外链(http(s)、mailto、tel)仍新开标签并带 noopener;锚点、站内路径和相对路径留在当前页。图片增加站内路径,并拒绝 SVG data URL。标题带稳定 id,代码块 `dir=ltr`。编辑模式不解析;预览击键约 32ms 合并,切模式立即解析,定时器在卸载和停用时清掉。主题岛上的 MutationObserver 同样在卸载和停用时断开。`theme=light|dark` 写到根的 `data-rs-theme`。描边与表面走 `--rs-markdown-*`,间距用逻辑属性。文案走 `markdown.*`。无 window 时 `renderMarkdown` 返回空字符串。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
34
|
+
- `RsMonacoEditor`:外框用 `overflow: hidden` 把 Monaco 画布裁进圆角。补 `radius`(默认 md,跟 ConfigProvider)。`embedded` 去掉自己的边框和底色,圆角改跟父级,不再用 `block-size: 100%` 盖掉 `height`。
|
|
35
|
+
- `RsMonacoEditor`:原先就不引用 Reka。`v-model` / `language` / `height` / `readonly` / `theme` / `minimap` / `glyphMargin` / `debugCurrentLine` / `debugBreakpoints` / `embedded` / `jsonSchema` / `snippets` / `completionRequest` / `completionTriggerCharacters` / `completionPrefixResolver` / `options` 与 `glyphMarginClick` / `format()` / `getEditor()` / `revealLine()` 语义不变。补 `disabled` / `placeholder` / `ariaLabel` / `id`、`focus` / `blur` / `ready` 与 `focus()` / `blur()`,公开类型增加 `RsMonacoEditorInstance` / `RsMonacoEditorTheme`。`theme="auto"` 在未写 `data-rs-theme` 时跟浅色(与全库一致);`light` / `vs-dark` 落到带 token 色的 `rs-light` / `rs-dark`(语法色仍继承 vs / vs-dark)。Monaco 的 `setTheme` 仍是进程级,同一页不能同时呈现两套主题。源码面 `dir=ltr`。减少动态时关掉平滑滚动和光标动画。多个实例共用一个主题观察器和每种语言一个补全 Provider;卸载摘掉内容 / 焦点 / glyph 监听、编辑器、Model、自己的 JSON Schema,并在最后一个实例离开时断开观察器。名称走 `monaco.label`。描边与表面走 `--rs-monaco-*`,Find Widget 层级用 `--rs-z-dropdown`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
36
|
+
- `RsCodeEditor`:原先就不引用 Reka。`v-model` / `language` / `theme` / `height` / `readonly` / `disabled` / `showToolbar` / `embedded` / `rounded` / `gutterWidth` / `foldGutter` / `diagnostics` / `placeholder` / `sqlConfig` / `filePath` / 悬停、定义、补全、行内编辑 / `goto-definition` / `ready` / `#toolbar` / `goToPosition` 语义不变。补 `wrap`(默认开)/ `autofocus` / `ariaLabel` / `id`、`focus()` 与公开类型 `RsCodeEditorExpose`。`theme=auto` 仍跟页面;`light` / `dark` 在根上写 `data-rs-theme`,语法色跟这一档。toml 有高亮。行内编辑、诊断和取消文案走 `codeEditor.*` / `common.cancel`。显式主题、占位、折行和只读不再整篇重建。悬停、定义、补全、行内编辑在下一次请求或卸载时 abort 可选 `signal`,销毁后不再 `dispatch`。多个编辑器共用一个主题监听,最后一个卸载才断开。诊断字段不再共用一个 CodeMirror compartment。SQL schema 变化仍重建,并尽量保住光标。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
37
|
+
|
|
38
|
+
## [2.0.7] - 2026-09-22
|
|
39
|
+
|
|
40
|
+
### 变更
|
|
41
|
+
|
|
42
|
+
- `RsCodeBlock`:原先就不引用 Reka。根仍是原生 `figure`,`code` / `lang` / `editable` / `showBar` / `downloadFilename` / 文案覆盖与 `update:code`、`getSelection()` 语义不变;只读仍藏光标,`showBar=false` 仍去掉语言条并取消最大高度。补 `filename` / `lineNumbers` / `wordWrap` / `highlightLines` / `maxHeight` / `ariaLabel` / `id` / `copyFailedLabel`、`#actions`、`copy` 与 `focus()`。复制改走 `copyTextToClipboard`(非安全上下文有兜底),失败文案走 `codeBlock.copyFailed`,结果用 `role=status` 播报。工具条名称走 `codeBlock.toolbar`。代码区 `dir=ltr`。主题只在明暗翻转时重配语法色(按最近的 `data-rs-theme`,深色岛不必改 documentElement),不销毁文档;多个实例共用一个 `data-rs-theme` 观察器,最后一个卸载才断开。语言包异步返回后若已卸载或已被更新的初始化取代,不再挂上编辑器。下载对象 URL 延迟回收,卸载时撤销。外部改 `code` 不再回声 `update:code`。描边与表面走 `--rs-code-block-*`,间距用逻辑属性,减少动态时关掉按钮过渡。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
43
|
+
- `RsVirtualList`:控件已是原生 overflow,无 Reka。`items` / `itemSize` / `height` / `overscan` / `activeIndex` / `layoutActive` / `radius` / 默认插槽 `{ item, index }` / `scrollToIndex(index, align = 'center')` 语义不变;`scroll` 仍把原生 `Event` 交给监听方(日志跟底靠 `target.scrollTop`)。`itemSize` 为函数时按索引变高(原先只用第 0 项的高度)。补 `itemSize="auto"` / `estimateSize` / `orientation` / `itemKey` / `keyboard` / `bordered` / `ariaLabel` / `id`、`#empty`、`change` 与 `scrollToOffset` / `getScrollOffset` / `getViewport` / `focus`。键盘默认关,避免抢走日志的方向键;打开后根是 listbox,方向键 / Home / End 移动当前项(横向在 RTL 对调)。滚动位置同一事件里更新窗口,避免慢一帧;`activeIndex` 的对齐、测量和 keep-alive 恢复仍走 rAF,卸载取消帧、断开 ResizeObserver、清掉滚动中的定时器。`auto` 只观察可见行,离开视口就 `unobserve`。总高度超过 800 万像素时压缩滚动条,行高仍是真实像素。当前项色条用逻辑起点。空态与 listbox 名称走 `virtualList.*`。描边与表面走 `--rs-virtual-list-*`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点定高、变高、当前项、横向、测量、空态、键盘、事件、无限滚动(滚近底部追加下一页,并显示已加载条数)与 `scrollToIndex()` / `scrollToOffset()` / `getScrollOffset()` / `getViewport()` / `focus()`。
|
|
44
|
+
- `RsDescriptions` / `RsDescriptionsItem`:原先就不引用 Reka。`title` / `items` / `columns` / `labelPlacement` / `bordered` / `size` / `radius` 与 `#title` / 默认插槽 / `item-${key}` 语义不变;空值仍只替换 null / undefined(默认 —,空字符串和 0 原样)。根改为包一层 `dl`,条目是 `dt` / `dd`。补 `colon`(走 `label.colon`,默认关)/ `labelWidth` / `labelAlign`(start / center / end,跟书写方向)/ `emptyText` / `ariaLabel` / `id`、`#extra` / `label-${key}` / `#label` 与公开类型 `RsDescriptionsLabelAlign`。未传 `size` 仍跟 Form / ConfigProvider。描边、标题、标签与值改走 `--rs-descriptions-*`(文字用 `--rs-text-primary` / `--rs-text-secondary`),间距用逻辑属性。无窗口监听、无定时器、无 ResizeObserver。不提供 `column` 别名、响应式列对象或 labelStyle。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
45
|
+
- `RsStatCard`:控件已是原生 `section`,无 Reka。`label` / `value` / `description` / `accent` / `loading` 与 `#value` / 默认插槽语义不变;未开 `format` 时数字仍是原文(12480 不会变成 12,480)。补 `prefix` / `suffix` / `trend` / `delta` / `trendTone` / `format` / `precision` / `size` / `id` / `ariaLabel`、`#prefix` / `#suffix` / `#icon` / `#trend` / `#description` 与公开类型 `RsStatAccent` / `RsStatTrend` / `RsStatTrendTone` / `RsStatSize` / `RsStatFormat`。涨跌方向与好坏分开,箭头对读屏隐藏,方向文案走 `statCard.trend.*`。加载态 `aria-busy`,文案走 `statCard.loading`,不设 live region。`Intl.NumberFormat` 最多缓存 24 个,非法选项回退原文。无窗口监听、无定时器、无 ResizeObserver。颜色走 `--rs-*`,间距用逻辑属性,骨架脉冲在减少动态时停住。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
46
|
+
|
|
47
|
+
## [2.0.6] - 2026-09-22
|
|
48
|
+
|
|
49
|
+
### 变更
|
|
50
|
+
|
|
51
|
+
- `RsToaster`:去掉 `vue-sonner`(该组件原先不引用 Reka)。`useRsToast` 的 success / error / info / warning、字符串或 `{ title, description, position, duration }`、`dismiss()` 语义不变,并返回 id。补 `message` / `loading` / `promise` / `update`、`action` / `cancel`、`onDismiss` / `onAutoClose`、`toasterId`,以及宿主上的 `duration` / `visibleToasts` / `offset` / `swipe` / `pauseOnHover` / `hotkey` / `ariaLabel` / `teleportTo` / `id` 与 `dismiss(id)`。错误是 `role=alert`,其余是 `role=status`。关闭文案走 `toaster.close`。悬停、焦点、页面隐藏暂停倒计时;滑动只在这一次手势上捕获指针。每个宿主最多留 24 条,定时器和 `visibilitychange` 在队列清空时摘掉,卸载摘掉快捷键。颜色走 `--rs-toast-*`,方位用物理角,条内间距用逻辑属性,减少动态时不做离场等待、也不模糊。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
52
|
+
- `RsConfirmDialog`:去掉 Reka `AlertDialog*`,改为原生 `dialog`(`role="alertdialog"`,带 `open`,不调用 `showModal`)+ Teleport。`v-model:open` / 文案 / `tone` / `icon` / `width` / 确认取消 / `confirmLoading` / `autoCloseOnConfirm` / `beforeClose` / `showOverlay` / `teleportTo` / `#icon` / `#extra` 与 `close` 语义不变。补 `closeOnEsc` / `lockScroll` / `zIndex` / `ariaLabel` / `id`、`focus()` 与公开类型 `RsConfirmDialogExpose` / `RsConfirmDialogInstance`。始终模态:焦点陷阱、Esc 只关最上层(与 Dialog 共用层栈)、关闭还焦点、透明层挡住点击;`showOverlay` 只负责涂暗,点遮罩不关闭。`lockScroll` 默认 true,引用计数并补滚动条宽度。父级把 `open` 设为 false 仍走 `beforeClose('programmatic')`,被拦住会重新打开。确认关闭不发 `cancel`。打开时才挂 keydown,卸载摘掉。面板抄触发处的 `data-rs-theme` / `dir` / `lang`。间距用逻辑属性,减少动态时关掉模糊。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点危险确认、色相、单按钮、拦截、附加内容、遮罩、挂载、叠加与 `close()` / `focus()`。
|
|
53
|
+
|
|
54
|
+
## [2.0.5] - 2026-09-22
|
|
55
|
+
|
|
56
|
+
### 变更
|
|
57
|
+
|
|
58
|
+
- `RsDrawer`:去掉 Reka `Dialog*`,改为原生 `dialog` + Teleport。`v-model:open` / `title` / `description` / `side` / `size` / `width` / `height` / `resizable` / `minSize` / `maxSize` / `modal` / `showOverlay` / `overlayOpacity` / `overlayBlur` / `showClose` / `closeOnOverlayClick` / `closeOnEsc` / `teleportTo` / `beforeClose` 与 `close` / `openDrawer`、`afterOpen` / `afterClose` / `resize` 语义不变。补 `destroyOnClose`(默认 true,与原先关闭后卸载一致)/ `forceRender` / `lockScroll` / `zIndex` / `ariaLabel` / `id`、`#extra` 与公开类型 `RsDrawerExpose` / `RsDrawerInstance`。模态锁焦点、Tab 循环、Esc 只关最上层,关闭后把焦点还回去;未传 `modal` 时仍跟随遮罩。挂到 body 的模态才锁滚动并补滚动条宽度,引用计数,卸载成对恢复。打开手势的指针监听多实例共用,卸载减到 0 才摘掉;外部点击、Esc、拖拽监听只在打开时挂上。拖拽仍先写 DOM,松手再提交。分隔条走 APG(方向键 / Home / End)。面板抄触发处的 `data-rs-theme` / `dir` / `lang`。`will-change` 只在滑动期间。正文在抽屉内滚动。描边与表面走 `--rs-drawer-*`,间距用逻辑属性,贴屏幕的一边留安全区,减少动态时不等待滑出。没有推开页面、没有手势甩关。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点方向、尺寸、模态、拖拽、插槽、beforeClose、深色岛、事件与 `openDrawer()` / `focus()` / `close()`。
|
|
59
|
+
- `RsDialog`:去掉 Reka `Dialog*`,改为原生 `dialog` + Teleport(带 `open`,不调用 `showModal`,以便拖拽、非模态和自定义遮罩)。`v-model:open` / `layout` / `width` / `height` / 拖拽缩放全屏 / `beforeClose` / 页脚 / `teleportTo` 语义不变。默认插槽现在会进主体(原先只有 `#body` 能显示,文档示例是空的)。补 `lockScroll` / `zIndex` / `id` / `ariaLabel`、`focus()` 与公开类型 `RsDialogExpose` / `RsDialogInstance`。模态走 APG:焦点陷阱、Esc 只关最上层、关闭还焦点、`aria-modal`;背后兄弟 `inert`,`lockScroll` 引用计数并补滚动条宽度。非模态不挡点击、不锁滚动。打开时才挂 keydown / 外部 pointerdown,卸载摘掉并取消 rAF / afterOpen 定时器。拖拽监听只绑一次,`pointercancel` 也会松手,并恢复原来的 `user-select` / `cursor`。`beforeClose` 抛错时保持打开。tone 描边走语义色。面板抄最近的 `data-rs-theme` / `dir` / `lang`。间距用逻辑属性,拖拽把手保持物理方向。减少动态时关掉遮罩和 form 的模糊。编辑器(Monaco / CodeMirror / xterm 或 `data-rs-dialog-tab-owner`)保留 Tab。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点表单、工作窗、模态、拦截、插槽、事件与 `openDialog()` / `close()` / `focus()`。
|
|
60
|
+
- `RsPopover`:去掉 Reka `Popover*`,改为把打开属性合并到默认插槽的触发器上,面板 Teleport + `placeAlignedPopup`。`v-model:open` / `side` / `align` / `sideOffset` / `modal` / `width` / `lazyMount` / `forceMount` / `popupClassName` / `#content` 语义不变。补 `alignOffset` / `trigger` / `disabled` / `title` / `arrow` / `showClose` / `closeOnEsc` / `closeOnOutside` / `mouseEnterDelay` / `mouseLeaveDelay` / `getPopupContainer` / `size` / `radius` / `ariaLabel` / `id`、`openChange`、`#title` 与公开类型 `RsPopoverExpose` / `RsPopoverInstance`。面板是 `role=dialog`,触发器带 `aria-expanded` / `aria-haspopup`。`modal` 只困 Tab,不锁页面滚动。打开时才挂 pointerdown / keydown / resize / scroll / ResizeObserver,卸载成对摘掉,悬停定时器有上限并在卸载时清掉。描边与文字改走 `--rs-popover-*`,间距用逻辑属性,减少动态时关闭过渡。深色岛抄 `data-rs-theme`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点方位、悬停、事件与 `open()` / `close()` / `focus()`。
|
|
61
|
+
- `RsTooltip` / `RsTooltipProvider`:去掉 Reka `Tooltip*`,改为原生触发器 + Teleport 气泡 + `placeAlignedPopup`。`content` / `side` / `align` / `sideOffset` / `disabled` / `ignoreNonKeyboardFocus` / `nowrap` / `icon` / `iconName` / `ariaLabel` / `#content` 与 Provider 的 `delayDuration` / `skipDelayDuration` / `ignoreNonKeyboardFocus` 语义不变。补 `v-model:open` / `delayDuration`(单条覆盖)/ `interactive` / `arrow` / `maxWidth` / `getContainer` / `id`、`openChange` 与 `open()` / `close()`。不包 Provider 也能用(延迟 300)。打开时才挂 scroll / resize / keydown / pointerdown / ResizeObserver,卸载成对摘掉并清定时器。Esc 关闭。贴边翻转;上下方向的 start / end 在 RTL 对调。层级用 `--rs-tooltip-z`(盖住 Dialog),颜色走 `--rs-tooltip-*`。帮助图标名称与正文不同时才挂 `aria-describedby`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ。
|
|
62
|
+
- `RsLoading`:控件已是原生 `div[role=status]`,无 Reka。`loading` / `variant` / `size` / `tone` / `label` / `showLabel` / `block` / `overlay` / `skeletonLines` 语义不变;`tone="default"` 现在用次级文字色(原先类名在、颜色未生效)。补 `neutral` / `success` / `warning` / `danger` / `info`、`ariaLabel` / `fullscreen` / `lock` / `delay` / `minDuration` / `blur` / `getContainer` / `id`、默认插槽(盖住内容并 `inert`)、`#indicator` / `#label` 与公开类型 `RsLoadingSize` / `RsLoadingTone` / `RsLoadingVariant`。圆点与骨架行高跟 `size`。骨架超过 12 行截断。`delay` / `minDuration` 上限 60 秒;定时器在状态变化和卸载时清除,服务端不注册。`lock` 只在全屏且可见时锁 `body` 滚动和点击,并给 `html` 标 `aria-busy`,引用计数恢复原值,重复释放无操作。扫光改走 `transform`。减少动态时圆环和圆点改为透明度脉冲,骨架扫光停住,模糊关掉。描边与遮罩改走 `--rs-loading-*`,间距用逻辑属性,全屏层级用 `--rs-z-modal`。没有 `spinning` / `tip` / 百分比 / 指令。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点形态、尺寸、色相、文案、开关、包裹、遮罩、延迟、骨架、插槽、全屏、深色岛与 inspect none。
|
|
63
|
+
- `RsLoadingBar`:控件已是原生 `div[role=progressbar]`,无 Reka。`progress` / `height` / `color` / `errorColor` 与 `start` / `finish` / `error`、`useRsLoadingBar` 空操作语义不变;未开 `nesting` 时重复 `start` 仍回到 `minimum`。补 `tone` / `position` / `attach` / `trickle` / `trickleSpeed` / `minimum` / `maximum` / `delay` / `finishDuration` / `errorDuration` / `nesting` / `indeterminate` / `ariaLabel` / `id`、`start` / `finish` / `error` / `change` 与 `set` / `inc` / `getProgress` / `isStarted`。传了 `progress` 时显隐只跟该值,到 100 后淡出(原先到 100 会因为 `progress > 0` 一直留着)。`finish` 期间再 `start` 会清掉上一次淡出定时器。trickle 到 `maximum` 后停表,卸载清 interval / timeout。无 window 不排定时器。颜色走 `--rs-loading-bar-*`,位置用逻辑属性,未知进度滑动在 RTL 下跟 `inset-inline-start`,减少动态时停住。读屏名称走 `loadingBar.*`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点壳层、事件、`set` / `inc`、重叠请求、受控、未知进度、贴边与 `delay`。
|
|
64
|
+
- `RsEmpty`:控件已是原生 `div[role=status]`,无 Reka。`title` / `description` / `fill` / `radius` / `iconRadius` 与 `#icon` / 默认插槽语义不变;`description` 改为可选,未传走 `empty.description`(`preset=search` 走 `empty.search`),显式空字符串隐藏说明。补 `preset` / `size` / `image` / `imageAlt` / `imageSize` / `showImage` / `ariaLabel` / `id`、`#image` / `#title` / `#description` 与公开类型 `RsEmptyPreset` / `RsEmptySize`。无插槽时画主题色线稿,不再留空徽章。描边与文字改走 `--rs-empty-*`,间距用逻辑属性。无窗口监听、无定时器、无 object URL。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点预设、尺寸、图标、插图、fill、圆角、插槽、场景与 inspect none。
|
|
65
|
+
- `RsAlert`:控件已是原生 `div[role=status|alert]`,无 Reka。`type` / `title` / `closable` / `bordered` / `close` / `#icon` / `#title` 语义不变。补 `tone`(与 `type` 同值,同时传时 `tone` 为准)/ `variant`(soft / outline / solid)/ `description` / `showIcon` / `banner` / `closeText` / `size` / `radius` / `ariaLabel` / `id`、`#action` / `#close` 与公开类型 `RsAlertExpose` / `RsAlertInstance` / `RsAlertTone` / `RsAlertVariant` / `RsAlertSize`。未传 `size` 跟 Form / ConfigProvider(`ssm` 落到 `sm`)。点关闭仍只发 `close`,不自己卸载。warning / danger 用 `role=alert`,其余用 `role=status`。描边与文字改走 `--rs-alert-*`,间距用逻辑属性,减少动态时关闭过渡。无窗口监听、无定时器。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点形态、关闭、图标、横幅、尺寸、插槽、事件与 `focus()`。
|
|
66
|
+
- `RsPagination`:控件已是原生 `nav` + `button`,无 Reka;跳转仍走 `RsInput`,每页条数仍走 `RsSelect`。`v-model:page` / `v-model:pageSize` / `total` / `siblingCount` / `showSummary` / `showPageSize` / `showQuickJumper` / `showJumpConfirm` / `pageSizeOptions` / `disabled` / `size` 语义不变。补 `showFirstLast` / `simple` / `hideOnSinglePage` / `align` / `ariaLabel` / `id`、`change` / `pageSizeChange`、`#item` / `#summary` 与公开类型 `RsPaginationExpose` / `RsPaginationInstance` / `RsPaginationAlign` / `RsPaginationItemSlot`。未传 `size` 跟 Form / ConfigProvider(`ssm` 落到 `sm`,不提供 ssm)。页码条左右键只移焦点(RTL 对调),改页走点击或 `goTo()` / `next()` / `prev()` / `first()` / `last()`。当前页 `aria-current="page"`。描边与文字改走 `--rs-pagination-*`,间距用逻辑属性,减少动态时关闭过渡。无窗口监听、无定时器。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点尺寸、省略号、跳转、每页条数、首页末页、简洁、单页隐藏、对齐、插槽、事件与 `goTo()` / `next()` / `focus()`。
|
|
67
|
+
- `RsSplitPane`:控件已是原生 `div[role=group]` + `hr` 分隔条,无 Reka。`panes` / `v-model:sizes` / `orientation` / `disabled` / `keyboardStep` / `withHandle` / `fill` 与 `#pane.key` 语义不变。补 `id` / `ariaLabel`、条目 `resizable` / `resizerAriaLabel`、`resize-start` 与公开类型 `RsSplitPaneSlot`;expose 增加 `focus()`。拖拽仍只写 DOM `flex-grow` 再在抬起时 commit,避免每帧重渲染;卸载取消 rAF、释放指针捕获并清折叠记忆。RTL 下横向指针与左右键取反,分隔条跟手。键盘走 APG Window Splitter(方向键 / Home / End / Enter);`aria-controls` / `aria-valuetext` 挂到缝上。描边与抓手改走 `--rs-split-*`,命中区用逻辑属性,减少动态时关闭过渡。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点纵向、约束、折叠、auto、fill、禁用、嵌套、事件与 `collapse()` / `expand()` / `reset()` / `getSizes()` / `focus()`。
|
|
68
|
+
- `RsToolbar`:无中间区时 start 占剩余宽度并裁切,end 按内容宽度贴在行尾(不再 `1fr / 1fr` 对半切)。有 `#center` 时为 `1fr / auto / 1fr`,缺一侧也占列,中间光学居中。竖排 start 在上、end 贴底,栏宽跟最宽的一项(`--rs-toolbar-rail-min` 默认 0)。密度对齐工作台 32 / 40 / 48;字重回到 regular;elevated 只用 `--rs-surface-elevated`;sticky 半透明 + `backdrop-filter`(减少透明时关闭)。
|
|
69
|
+
- `RsToolbar`:控件已是原生 `header` / `div`,无 Reka。`tag` / `size` / `border` / `elevated` / `compact` / `#left` / `#center` / `#right` / `label` 语义不变。补 `orientation` / `wrap` / `sticky` / `stickyOffset` / `disabled` / `keyboard` / `loop` / `ariaLabel` / `id`、`#start` / `#end` 与公开类型 `RsToolbarExpose` / `RsToolbarInstance` / `RsToolbarOrientation`。未传 `size` 跟 ConfigProvider(四档 `ssm`–`lg`)。默认 APG 键盘:方向键 / Home / End 在命令控件间移动(RTL 左右对调);输入框不拦截。无窗口监听、无定时器、无 MutationObserver,只在根上委托 `keydown` / `focusin`。描边与文字改走 `--rs-toolbar-*`,间距用逻辑属性。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点密度、竖排、换行、吸附、禁用、事件与 `focus()` / `blur()`。
|
|
70
|
+
- `RsDropdown`:去掉 Reka `DropdownMenu*`,改为原生 `button`(`aria-haspopup=menu`)+ Teleport 面板 + `placeDropdownPopup`。`v-model` / `items` / `showSelected` / `placeholder` / `size` / `contentWidth` / `#trigger` / `select` 语义不变。补 `v-model:open` / `trigger` / `placement` / `hideOnClick` / `getPopupContainer` / `popupClassName` / `maxHeight` / `radius` / `ariaLabel` / `id` / `destroyOnHide`、条目 `type=divider` / `tone` / `href` / `shortcut` / `children`、`change` / `openChange`、`#item` 与公开类型 `RsDropdownExpose` / `RsDropdownInstance`。键盘走 APG Menu(方向键 / Home / End / Esc / 首字母;RTL 子菜单左右对调)。打开时才挂 pointerdown / resize / scroll / ResizeObserver,卸载成对摘掉。描边与文字改走 `--rs-dropdown-*`,间距用逻辑属性,减少动态时关闭过渡。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点操作菜单、悬停、分组、危险项、子菜单、插槽、事件与 `open()` / `close()` / `focus()`。
|
|
71
|
+
- `RsSteps`:控件已是原生 `nav` + `ol`,无 Reka。`v-model` / `items` / `orientation` / `clickable` 语义不变。补 `labelPlacement` / `type` / `status` / `percent` / `ariaLabel` / `id`、条目 `icon`、`change` / `click` 与公开类型 `RsStepsExpose` / `RsStepsInstance` / `RsStepsLabelPlacement` / `RsStepsType` / `RsStepsItemSlot`。未传 `size` 跟 ConfigProvider(四档 `ssm`–`lg`)。可点时方向键只移焦点(RTL 左右对调),改当前步走点击或 `next()` / `prev()` / `goTo()`。完成步显示勾、错误显示叉;完成连线走 `--rs-steps-separator-finish`。描边与文字改走 `--rs-steps-*`,间距用逻辑属性,减少动态时关闭过渡。读屏用 `aria-current="step"` 与 `steps.*` 状态文案。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点尺寸、标题位置、状态、点状、图标、插槽、事件与 `next()` / `prev()` / `goTo()` / `focus()`。
|
|
72
|
+
- `RsTabs`:去掉 Reka `Tabs*` / `DropdownMenu*`,改为原生 `tablist` / `tab` / `tabpanel`。`v-model` / `items` / `closable` / `addable` / `renamable` / `draggable` / `overflow` / `contextMenu` / `beforeLeave` / `panelless` / `borderless` / `justify` / `contentGap` 语义不变。补 `tabPosition` / `activation` / `lazy` / `destroyInactive`(默认 true,与原 Reka 卸载一致)/ `ariaLabel` / `id` / `size=lg`、`change`、`#tab` 与公开类型 `RsTabsExpose` / `RsTabsInstance` / `RsTabsPosition` / `RsTabsActivation` / `RsTabsTabSlot`。键盘走 APG(方向键 / Home / End;RTL 左右对调;竖排只用上下)。溢出「更多」走 `RsDropdown`;`contextMenu=false` 时不挂 Reka。未传 `size` 跟 ConfigProvider。描边与文字改走 `--rs-tabs-*`,间距用逻辑属性,减少动态时关闭过渡。ResizeObserver / 非 passive `wheel` / rAF 卸载成对摘掉,激活项滚进视口不再调用 `scrollIntoView`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点形态、位置、溢出、工作台页签、懒挂载、插槽、事件与 `selectTab()` / `focus()`。
|
|
73
|
+
- `RsSidebar` / `RsSidebarGroup` / `RsSidebarItem`:控件已是原生 `aside` + `nav` + `button` / `a`,无 Reka。`title` / `subtitle` / `collapsible` / `width` / `orientation` / `placement` / `v-model:collapsed` 与 `#header` / `#footer` 语义不变。补 `hotkey` / `ariaLabel` / `id`、Item `href` / `to` / `target` / `rel` / `badge`、`change` 与公开类型 `RsSidebarExpose` / `RsSidebarInstance` / `RsSidebarOrientation` / `RsSidebarPlacement` / `RsSidebarWidth`。折叠态 provide/inject 下传,子组件不必再手传 `collapsed`。外链 `_blank` 补 `noopener noreferrer`。`hotkey` 打开时才挂 `keydown`,输入框内不触发,卸载成对摘掉。描边与文字改走 `--rs-sidebar-*`,间距用逻辑属性,减少动态时关闭过渡。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点宽度、左右、横向、链接、插槽、事件与 `expand()` / `collapse()` / `toggle()` / `focus()`。
|
|
74
|
+
|
|
9
75
|
## [2.0.4] - 2026-09-22
|
|
10
76
|
|
|
11
77
|
### 修复
|
|
@@ -14,6 +80,7 @@
|
|
|
14
80
|
|
|
15
81
|
### 变更
|
|
16
82
|
|
|
83
|
+
- `RsMenu`:去掉 Reka `Collapsible*` / `Popover*`,改为原生 `nav` + `button` / `a[href]`;垂直折叠子菜单是 Teleport + `placeSidePopup`。`v-model` / `openKeys` / `mode` / `collapsed` / `highlightParent` / `select` 语义不变。补 `accordion` / `triggerSubMenuAction` / `size` / `radius` / `indent` / `ariaLabel` / `id` / `getPopupContainer`、条目 `href` / `to` / `target` / `rel` / `extra` / `type=divider`、`click` / `openChange`、`#item` / `#icon` / `#extra` 与公开类型 `RsMenuExpose` / `RsMenuInstance`。键盘走披露式导航(方向键 / Home / End / Esc;不锁 Tab)。选中叶子时祖先已展开不再重写 `openKeys`。打开 flyout 才挂 pointerdown / keydown / resize / scroll / ResizeObserver,卸载成对摘掉。描边与文字改走 `--rs-menu-*`,间距用逻辑属性,减少动态时关闭过渡。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点嵌套、分组、横向、折叠、手风琴、链接、尺寸、插槽、事件与 `focus()` / `blur()`。
|
|
17
84
|
- `RsBreadcrumb`:控件已是原生 `nav` + `ol`,无 Reka。`items.label` / `href` / `to` 与末级当前页语义不变;只传 `to` 时现在会写到 `a[href]`。补 `separator` / `separatorIcon` / `maxItems` / `itemsBeforeCollapse` / `itemsAfterCollapse` / `ariaLabel` / `id`、条目 `icon` / `disabled` / `target` / `rel` / `key`、`click` 与 `#item` / `#separator` / `#more`。外链 `_blank` 补 `noopener noreferrer`。折叠用纯函数裁索引,点省略号展开,无 ResizeObserver / 定时器 / 窗口监听。描边与文字改走 `--rs-breadcrumb-*`,间距用逻辑属性,减少动态时关闭过渡;RTL 下分隔图标水平翻转。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点分隔符、图标、折叠、禁用、插槽与 `click`。
|
|
18
85
|
- `RsCalendarGrid`:控件已是原生 `table` + `button`,无 Reka。`viewYear` / `viewMonth` / `select` / `selected` / `rangeStart` / `rangeEnd` / `minDate` / `maxDate` / `disabledDates` / `disabledDate` / `weekStartsOn` 语义不变。补 `size` / `radius` / `disabled` / `highlightToday` / `showOutside` / `selectOutside` / `showWeekNumbers` / `ariaLabel` / `id`、`#title` / `#cell` 与公开类型 `RsCalendarGridExpose` / `RsCalendarGridInstance` / `RsCalendarGridCellSlot`。组禁用继承 Form.disabled。键盘走 APG(方向键 / Home / End / PageUp / PageDown / Enter;RTL 左右对调)。格子状态一次算完,禁用日用 Set;无窗口监听、无定时器。描边与文字改走 `--rs-calendar-grid-*`,间距用逻辑属性,减少动态时关闭过渡。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点范围、边界、周起始、周序号、插槽、事件与 `focus()` / `goToToday()`。
|
|
19
86
|
- `RsAnchor`:控件已是原生 `nav` + `a[href]`,无 Reka。`items` / `v-model` / `offset` / `targetOffset` / `bounds` / `affix` / `lineless` / `changeHash` / `getContainer` / `click` / `change` 语义不变。补 `direction` / `replace` / `scrollBehavior` / `affixOffset` / `getCurrentAnchor` / `ariaLabel` / `id`、条目 `disabled`、`#item` 与公开类型 `RsAnchorExpose` / `RsAnchorInstance` / `RsAnchorDirection`。`hrefToAnchorId` 解码 `%xx` / 非 ASCII。滚动用 `scrollY`/`nodeType` 判断 window,不用 `instanceof`。监听按容器节点而不是 `getContainer` 函数引用重绑;rAF / ResizeObserver / scroll / resize 卸载成对摘掉。墨点改 `getBoundingClientRect`,颜色走 `--rs-anchor-*`,减少动态时关闭过渡与平滑滚动。当前项 `aria-current="location"`。文档站按 site README 补全中英 props / events / slots / methods / tokens / FAQ,演示可点横向、偏移、插槽、事件与 `scrollTo()`。
|
package/NOTICE
CHANGED
|
@@ -17,7 +17,6 @@ Versions below are typical; the lockfile is authoritative.
|
|
|
17
17
|
| Project / 项目 | Typical license / 常见许可证 | Use / 用途 |
|
|
18
18
|
|----------------|------------------------------|------------|
|
|
19
19
|
| Vue | MIT | peer framework |
|
|
20
|
-
| Reka UI | MIT | accessible primitives |
|
|
21
20
|
| Lucide (@lucide/vue) | ISC | default icons |
|
|
22
21
|
| Monaco Editor | MIT | RsMonacoEditor |
|
|
23
22
|
| CodeMirror | MIT | RsCodeEditor |
|
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ Built for ops consoles, database workbenches, and internal admin UIs. Marketing
|
|
|
18
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
|
-
- **Accessibility** —
|
|
21
|
+
- **Accessibility** — native controls and ARIA; apps depend only on `niuma-ui`
|
|
22
22
|
- **i18n** — omitted `locale` follows the host language (`zh*` → `zh-CN`, `en*` → `en-US`); unknown tags fall back to `zh-CN`. Extra languages: `registerRsLocale` ([guide](./docs/locales.en.md))
|
|
23
23
|
- **Vite** — `import { RsButton } from 'niuma-ui'` is enough to bundle; `niumaUiHost` is local `pnpm dev` HMR only
|
|
24
24
|
|
|
@@ -71,7 +71,7 @@ Omit `locale` to follow the host language. Chinese systems stay on `zh-CN`. Comm
|
|
|
71
71
|
|
|
72
72
|
## Usage
|
|
73
73
|
|
|
74
|
-
1. Named-import from the package root only.
|
|
74
|
+
1. Named-import from the package root only. Do not `import *`.
|
|
75
75
|
2. Import `niuma-ui/styles.css` once, then your brand CSS.
|
|
76
76
|
3. Wrap the app with `RsConfigProvider` (theme, locale, default control size).
|
|
77
77
|
4. Light sites re-export used symbols from their own `ui.ts`. Do not alias the package to this repo’s `src/index.ts`.
|
|
@@ -116,7 +116,7 @@ Stable publishes set npm dist-tag **`latest`**; prereleases use **`next`**. Ther
|
|
|
116
116
|
|
|
117
117
|
[Apache License 2.0](./LICENSE). Attribution: [NOTICE](./NOTICE).
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
Icons: [Lucide](https://lucide.dev/). Editors: [Monaco](https://microsoft.github.io/monaco-editor/), [CodeMirror](https://codemirror.net/). Terminal: [xterm.js](https://xtermjs.org/).
|
|
120
120
|
|
|
121
121
|
- Docs: https://blair-shang.github.io/niuma-ui/
|
|
122
122
|
- npm: https://www.npmjs.com/package/niuma-ui
|
package/README.zh-CN.md
CHANGED
|
@@ -18,7 +18,7 @@ Vue 3 **工作台**设计系统:一致的 `Rs*` 组件与 `--rs-*` Token,以
|
|
|
18
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
|
+
- **无障碍**:原生控件与 ARIA,应用只依赖 `niuma-ui`
|
|
22
22
|
- **国际化**:未设 `locale` 时跟本机语言(中文系统就是 `zh-CN`);认不出回退中文。第三方语言用 `registerRsLocale`,见 [docs/locales.md](./docs/locales.md)
|
|
23
23
|
- **Vite**:`import { RsButton } from 'niuma-ui'` 即可打包;`niumaUiHost` 仅本机 `pnpm dev` 联调源码
|
|
24
24
|
|
|
@@ -71,7 +71,7 @@ import { RsConfigProvider, RsButton } from 'niuma-ui'
|
|
|
71
71
|
|
|
72
72
|
## 使用约定
|
|
73
73
|
|
|
74
|
-
1. 只从包根具名导入:`import { RsButton } from 'niuma-ui'
|
|
74
|
+
1. 只从包根具名导入:`import { RsButton } from 'niuma-ui'`。不要 `import *`。
|
|
75
75
|
2. 样式只引一次 `niuma-ui/styles.css`,再加载你的品牌 CSS。
|
|
76
76
|
3. 根节点包 `RsConfigProvider`(主题、语言、默认控件尺寸)。
|
|
77
77
|
4. 轻量站点在自己的 `ui.ts` 里再导出用到的符号。不要把包名别名到本仓库的 `src/index.ts`。
|
|
@@ -122,7 +122,7 @@ pnpm build # 库 → dist/
|
|
|
122
122
|
|
|
123
123
|
[Apache License 2.0](./LICENSE)。版权与第三方声明见 [NOTICE](./NOTICE)。
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
图标:[Lucide](https://lucide.dev/)。编辑器:[Monaco](https://microsoft.github.io/monaco-editor/)、[CodeMirror](https://codemirror.net/)。终端:[xterm.js](https://xtermjs.org/)。
|
|
126
126
|
|
|
127
127
|
- 文档站:https://blair-shang.github.io/niuma-ui/
|
|
128
128
|
- npm:https://www.npmjs.com/package/niuma-ui
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { RsFeedbackTone, RsToastPosition, RsToastType, RsOverlayAnchorBox, RsOverlayBox } from './src/overlay-utils';
|
|
2
|
-
export { RS_TOAST_DEFAULT_GAP, RS_TOAST_DEFAULT_POSITION, rsToastPositions, rsFeedbackIconClass, placeAnchoredPopup, stepEnabledIndex } from './src/overlay-utils';
|
|
1
|
+
export type { RsFeedbackTone, RsToastPosition, RsToastType, RsOverlayAnchorBox, RsOverlayBox, RsSideOverlayBox, RsOverlaySide, RsOverlayAlign, RsAlignedOverlayOptions, RsAlignedOverlayBox } from './src/overlay-utils';
|
|
2
|
+
export { RS_TOAST_DEFAULT_GAP, RS_TOAST_DEFAULT_POSITION, rsToastPositions, rsFeedbackIconClass, placeAnchoredPopup, placeSidePopup, placeAlignedPopup, toContainerPoint, stepEnabledIndex } from './src/overlay-utils';
|
|
3
3
|
export { useResolvedRsComponentSize, resolveRsComponentSize } from './src/resolve-size';
|
|
4
4
|
export { useResolvedRsRadius, rsRadiusCss } from './src/resolve-radius';
|
|
@@ -17,7 +17,7 @@ export type RsFeedbackTone = 'default' | 'info' | 'success' | 'warning' | 'dange
|
|
|
17
17
|
export type RsToastType = 'success' | 'error' | 'info' | 'warning';
|
|
18
18
|
export type RsToastPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center';
|
|
19
19
|
export declare const RS_TOAST_DEFAULT_POSITION: RsToastPosition;
|
|
20
|
-
/** 多条 Toast 之间的垂直间距(px
|
|
20
|
+
/** 多条 Toast 之间的垂直间距(px) */
|
|
21
21
|
export declare const RS_TOAST_DEFAULT_GAP = 4;
|
|
22
22
|
export declare const rsToastPositions: readonly ["top-center", "top-left", "top-right", "bottom-center", "bottom-left", "bottom-right"];
|
|
23
23
|
export declare function rsFeedbackIconClass(tone: RsFeedbackTone): string;
|
|
@@ -43,11 +43,54 @@ export interface RsOverlayBox {
|
|
|
43
43
|
width: number;
|
|
44
44
|
placement: 'top' | 'bottom';
|
|
45
45
|
}
|
|
46
|
+
/** 侧向浮层(折叠菜单 flyout 等)。placement 为翻转后的左右。 */
|
|
47
|
+
export interface RsSideOverlayBox {
|
|
48
|
+
top: number;
|
|
49
|
+
left: number;
|
|
50
|
+
width: number;
|
|
51
|
+
placement: 'left' | 'right';
|
|
52
|
+
}
|
|
46
53
|
/**
|
|
47
54
|
* 把浮层贴到锚点:优先下方,视口不够则翻到上方,左右夹进窗口。
|
|
48
55
|
* 对齐 WAI-ARIA APG 浮层惯例与 CSS overflow 避让,不跟某一家组件库的 API。
|
|
49
56
|
*/
|
|
50
57
|
export declare function placeAnchoredPopup(anchor: RsOverlayAnchorBox, popup: RsOverlayPopupSize, viewport: RsOverlayViewport, gap?: number): RsOverlayBox;
|
|
58
|
+
/**
|
|
59
|
+
* 把浮层贴到锚点侧面:默认右侧,视口不够则翻到左侧,上下夹进窗口。
|
|
60
|
+
* 折叠导航 flyout 用;不要在各组件再写一套 left/top。
|
|
61
|
+
*/
|
|
62
|
+
export declare function placeSidePopup(anchor: RsOverlayAnchorBox, popup: RsOverlayPopupSize, viewport: RsOverlayViewport, gap?: number, preferred?: 'left' | 'right'): RsSideOverlayBox;
|
|
63
|
+
/** 四向浮层(Popover 等)。side 为翻转后的物理方向。 */
|
|
64
|
+
export type RsOverlaySide = 'top' | 'right' | 'bottom' | 'left';
|
|
65
|
+
/** 交叉轴对齐。start / end 在横向且 RTL 时对调。 */
|
|
66
|
+
export type RsOverlayAlign = 'start' | 'center' | 'end';
|
|
67
|
+
export interface RsAlignedOverlayOptions {
|
|
68
|
+
side?: RsOverlaySide;
|
|
69
|
+
align?: RsOverlayAlign;
|
|
70
|
+
sideOffset?: number;
|
|
71
|
+
alignOffset?: number;
|
|
72
|
+
padding?: number;
|
|
73
|
+
rtl?: boolean;
|
|
74
|
+
}
|
|
75
|
+
export interface RsAlignedOverlayBox {
|
|
76
|
+
top: number;
|
|
77
|
+
left: number;
|
|
78
|
+
side: RsOverlaySide;
|
|
79
|
+
align: RsOverlayAlign;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 把浮层贴到锚点四侧:主轴放不下就翻到对侧,交叉轴按 start / center / end,再夹进视口。
|
|
83
|
+
* 横向的 start / end 在 RTL 对调;left / right 是物理方向,不跟书写方向对调。
|
|
84
|
+
*/
|
|
85
|
+
export declare function placeAlignedPopup(anchor: RsOverlayAnchorBox, popup: RsOverlayPopupSize, viewport: RsOverlayViewport, options?: RsAlignedOverlayOptions): RsAlignedOverlayBox;
|
|
86
|
+
/** 视口坐标换成容器内坐标。容器是 body / 文档根时保持视口坐标(position: fixed)。 */
|
|
87
|
+
export declare function toContainerPoint(top: number, left: number, origin: {
|
|
88
|
+
top: number;
|
|
89
|
+
left: number;
|
|
90
|
+
} | null): {
|
|
91
|
+
top: number;
|
|
92
|
+
left: number;
|
|
93
|
+
};
|
|
51
94
|
/** 在可选项里按方向跳过 disabled,供 combobox / listbox 方向键与 Home / End。 */
|
|
52
95
|
export declare function stepEnabledIndex<T extends {
|
|
53
96
|
disabled?: boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/components/_shared/src/overlay-utils.ts
|
|
2
2
|
var RS_TOAST_DEFAULT_POSITION = "top-center";
|
|
3
|
-
/** 多条 Toast 之间的垂直间距(px
|
|
3
|
+
/** 多条 Toast 之间的垂直间距(px) */
|
|
4
4
|
var RS_TOAST_DEFAULT_GAP = 4;
|
|
5
5
|
var rsToastPositions = [
|
|
6
6
|
"top-center",
|
|
@@ -31,6 +31,91 @@ function placeAnchoredPopup(anchor, popup, viewport, gap = 4) {
|
|
|
31
31
|
placement
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* 把浮层贴到锚点侧面:默认右侧,视口不够则翻到左侧,上下夹进窗口。
|
|
36
|
+
* 折叠导航 flyout 用;不要在各组件再写一套 left/top。
|
|
37
|
+
*/
|
|
38
|
+
function placeSidePopup(anchor, popup, viewport, gap = 8, preferred = "right") {
|
|
39
|
+
const anchorWidth = anchor.width ?? 0;
|
|
40
|
+
const right = anchor.left + anchorWidth + gap;
|
|
41
|
+
const leftPos = anchor.left - popup.width - gap;
|
|
42
|
+
const roomRight = right + popup.width <= viewport.width - gap;
|
|
43
|
+
const roomLeft = leftPos >= gap;
|
|
44
|
+
let placement = preferred;
|
|
45
|
+
if (preferred === "right" && !roomRight && roomLeft) placement = "left";
|
|
46
|
+
if (preferred === "left" && !roomLeft && roomRight) placement = "right";
|
|
47
|
+
const width = Math.min(popup.width, Math.max(0, viewport.width - gap * 2));
|
|
48
|
+
const rawLeft = placement === "right" ? right : leftPos;
|
|
49
|
+
const maxLeft = Math.max(gap, viewport.width - width - gap);
|
|
50
|
+
const left = Math.min(Math.max(gap, rawLeft), maxLeft);
|
|
51
|
+
const maxTop = Math.max(gap, viewport.height - popup.height - gap);
|
|
52
|
+
return {
|
|
53
|
+
top: Math.min(Math.max(gap, anchor.top), maxTop),
|
|
54
|
+
left,
|
|
55
|
+
width,
|
|
56
|
+
placement
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
var RS_OVERLAY_OPPOSITE = {
|
|
60
|
+
top: "bottom",
|
|
61
|
+
bottom: "top",
|
|
62
|
+
left: "right",
|
|
63
|
+
right: "left"
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* 把浮层贴到锚点四侧:主轴放不下就翻到对侧,交叉轴按 start / center / end,再夹进视口。
|
|
67
|
+
* 横向的 start / end 在 RTL 对调;left / right 是物理方向,不跟书写方向对调。
|
|
68
|
+
*/
|
|
69
|
+
function placeAlignedPopup(anchor, popup, viewport, options = {}) {
|
|
70
|
+
const side = options.side ?? "bottom";
|
|
71
|
+
const align = options.align ?? "start";
|
|
72
|
+
const sideOffset = options.sideOffset ?? 6;
|
|
73
|
+
const alignOffset = options.alignOffset ?? 0;
|
|
74
|
+
const padding = options.padding ?? 8;
|
|
75
|
+
const rtl = options.rtl ?? false;
|
|
76
|
+
const anchorWidth = anchor.width ?? 0;
|
|
77
|
+
const popupWidth = Math.max(0, popup.width);
|
|
78
|
+
const popupHeight = Math.max(0, popup.height);
|
|
79
|
+
const fits = (candidate) => {
|
|
80
|
+
if (candidate === "bottom") return anchor.top + anchor.height + sideOffset + popupHeight <= viewport.height - padding;
|
|
81
|
+
if (candidate === "top") return anchor.top - sideOffset - popupHeight >= padding;
|
|
82
|
+
if (candidate === "right") return anchor.left + anchorWidth + sideOffset + popupWidth <= viewport.width - padding;
|
|
83
|
+
return anchor.left - sideOffset - popupWidth >= padding;
|
|
84
|
+
};
|
|
85
|
+
const resolved = !fits(side) && fits(RS_OVERLAY_OPPOSITE[side]) ? RS_OVERLAY_OPPOSITE[side] : side;
|
|
86
|
+
const cross = (resolved === "top" || resolved === "bottom") && rtl && align !== "center" ? align === "start" ? "end" : "start" : align;
|
|
87
|
+
let top = anchor.top;
|
|
88
|
+
let left = anchor.left;
|
|
89
|
+
if (resolved === "bottom") top = anchor.top + anchor.height + sideOffset;
|
|
90
|
+
else if (resolved === "top") top = anchor.top - popupHeight - sideOffset;
|
|
91
|
+
else if (resolved === "right") left = anchor.left + anchorWidth + sideOffset;
|
|
92
|
+
else left = anchor.left - popupWidth - sideOffset;
|
|
93
|
+
if (resolved === "top" || resolved === "bottom") if (cross === "end") left = anchor.left + anchorWidth - popupWidth - alignOffset;
|
|
94
|
+
else if (cross === "center") left = anchor.left + (anchorWidth - popupWidth) / 2 + alignOffset;
|
|
95
|
+
else left = anchor.left + alignOffset;
|
|
96
|
+
else if (cross === "end") top = anchor.top + anchor.height - popupHeight - alignOffset;
|
|
97
|
+
else if (cross === "center") top = anchor.top + (anchor.height - popupHeight) / 2 + alignOffset;
|
|
98
|
+
else top = anchor.top + alignOffset;
|
|
99
|
+
const maxLeft = Math.max(padding, viewport.width - popupWidth - padding);
|
|
100
|
+
const maxTop = Math.max(padding, viewport.height - popupHeight - padding);
|
|
101
|
+
return {
|
|
102
|
+
top: Math.min(Math.max(padding, top), maxTop),
|
|
103
|
+
left: Math.min(Math.max(padding, left), maxLeft),
|
|
104
|
+
side: resolved,
|
|
105
|
+
align
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** 视口坐标换成容器内坐标。容器是 body / 文档根时保持视口坐标(position: fixed)。 */
|
|
109
|
+
function toContainerPoint(top, left, origin) {
|
|
110
|
+
if (!origin) return {
|
|
111
|
+
top,
|
|
112
|
+
left
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
top: top - origin.top,
|
|
116
|
+
left: left - origin.left
|
|
117
|
+
};
|
|
118
|
+
}
|
|
34
119
|
/** 在可选项里按方向跳过 disabled,供 combobox / listbox 方向键与 Home / End。 */
|
|
35
120
|
function stepEnabledIndex(options, current, delta) {
|
|
36
121
|
if (!options.length) return 0;
|
|
@@ -42,4 +127,4 @@ function stepEnabledIndex(options, current, delta) {
|
|
|
42
127
|
return Math.max(0, current);
|
|
43
128
|
}
|
|
44
129
|
//#endregion
|
|
45
|
-
export { RS_TOAST_DEFAULT_GAP, RS_TOAST_DEFAULT_POSITION, placeAnchoredPopup, rsFeedbackIconClass, rsToastPositions, stepEnabledIndex };
|
|
130
|
+
export { RS_TOAST_DEFAULT_GAP, RS_TOAST_DEFAULT_POSITION, placeAlignedPopup, placeAnchoredPopup, placeSidePopup, rsFeedbackIconClass, rsToastPositions, stepEnabledIndex, toContainerPoint };
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
|
|
2
|
-
.rs-alert[data-v-
|
|
2
|
+
.rs-alert[data-v-8c18fdd0] {
|
|
3
|
+
--rs-alert-icon-offset: 0.125rem;
|
|
4
|
+
--rs-alert-content-alpha: 78%;
|
|
5
|
+
--rs-alert-close-opacity: 0.7;
|
|
6
|
+
--rs-alert-tone: var(--rs-border);
|
|
7
|
+
--rs-alert-tone-container: var(--rs-surface-hover);
|
|
8
|
+
--rs-alert-on-container: var(--rs-text-primary);
|
|
3
9
|
display: flex;
|
|
4
10
|
align-items: flex-start;
|
|
5
11
|
gap: var(--rs-alert-gap, var(--rs-space-sm));
|
|
@@ -7,105 +13,154 @@
|
|
|
7
13
|
var(--rs-alert-padding-x, var(--rs-space-lg));
|
|
8
14
|
border-radius: var(--rs-alert-radius, var(--rs-radius));
|
|
9
15
|
box-sizing: border-box;
|
|
16
|
+
color: var(--rs-alert-on-container);
|
|
17
|
+
outline: none;
|
|
10
18
|
}
|
|
11
|
-
.rs-alert--bordered[data-v-
|
|
19
|
+
.rs-alert--bordered[data-v-8c18fdd0] {
|
|
12
20
|
border: 1px solid transparent;
|
|
13
21
|
}
|
|
14
|
-
.rs-
|
|
22
|
+
.rs-alert--sm[data-v-8c18fdd0] {
|
|
23
|
+
--rs-alert-padding-y: var(--rs-space-sm);
|
|
24
|
+
--rs-alert-padding-x: var(--rs-space-md);
|
|
25
|
+
}
|
|
26
|
+
.rs-alert--lg[data-v-8c18fdd0] {
|
|
27
|
+
--rs-alert-padding-y: var(--rs-space-lg);
|
|
28
|
+
--rs-alert-padding-x: var(--rs-space-lg);
|
|
29
|
+
}
|
|
30
|
+
.rs-alert--banner[data-v-8c18fdd0] {
|
|
31
|
+
width: 100%;
|
|
32
|
+
border-radius: 0;
|
|
33
|
+
}
|
|
34
|
+
.rs-alert--soft[data-v-8c18fdd0] {
|
|
35
|
+
background: var(--rs-alert-tone-container);
|
|
36
|
+
border-color: color-mix(
|
|
37
|
+
in srgb,
|
|
38
|
+
var(--rs-alert-tone) var(--rs-alert-border-alpha, 35%),
|
|
39
|
+
transparent
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
.rs-alert--outline[data-v-8c18fdd0] {
|
|
43
|
+
background: transparent;
|
|
44
|
+
border-color: color-mix(in srgb, var(--rs-alert-tone) 55%, transparent);
|
|
45
|
+
}
|
|
46
|
+
.rs-alert--solid[data-v-8c18fdd0] {
|
|
47
|
+
background: var(--rs-alert-tone);
|
|
48
|
+
color: var(--rs-text-inverse);
|
|
49
|
+
border-color: var(--rs-alert-tone);
|
|
50
|
+
}
|
|
51
|
+
.rs-alert--default[data-v-8c18fdd0] {
|
|
52
|
+
--rs-alert-tone: var(--rs-border);
|
|
53
|
+
--rs-alert-tone-container: var(--rs-surface-hover);
|
|
54
|
+
--rs-alert-on-container: var(--rs-text-primary);
|
|
55
|
+
}
|
|
56
|
+
.rs-alert--info[data-v-8c18fdd0] {
|
|
57
|
+
--rs-alert-tone: var(--rs-info);
|
|
58
|
+
--rs-alert-tone-container: var(--rs-info-container);
|
|
59
|
+
--rs-alert-on-container: var(--rs-on-info-container);
|
|
60
|
+
}
|
|
61
|
+
.rs-alert--success[data-v-8c18fdd0] {
|
|
62
|
+
--rs-alert-tone: var(--rs-success);
|
|
63
|
+
--rs-alert-tone-container: var(--rs-success-container);
|
|
64
|
+
--rs-alert-on-container: var(--rs-on-success-container);
|
|
65
|
+
}
|
|
66
|
+
.rs-alert--warning[data-v-8c18fdd0] {
|
|
67
|
+
--rs-alert-tone: var(--rs-warning);
|
|
68
|
+
--rs-alert-tone-container: var(--rs-warning-container);
|
|
69
|
+
--rs-alert-on-container: var(--rs-on-warning-container);
|
|
70
|
+
}
|
|
71
|
+
.rs-alert--danger[data-v-8c18fdd0] {
|
|
72
|
+
--rs-alert-tone: var(--rs-danger);
|
|
73
|
+
--rs-alert-tone-container: var(--rs-danger-container);
|
|
74
|
+
--rs-alert-on-container: var(--rs-on-danger-container);
|
|
75
|
+
}
|
|
76
|
+
.rs-alert__icon[data-v-8c18fdd0] {
|
|
15
77
|
display: inline-flex;
|
|
16
78
|
flex-shrink: 0;
|
|
17
|
-
margin-
|
|
79
|
+
margin-block-start: var(--rs-alert-icon-offset);
|
|
18
80
|
}
|
|
19
|
-
.rs-alert__body[data-v-
|
|
81
|
+
.rs-alert__body[data-v-8c18fdd0] {
|
|
20
82
|
flex: 1 1 auto;
|
|
21
83
|
min-width: 0;
|
|
22
84
|
}
|
|
23
|
-
.rs-alert__title[data-v-
|
|
85
|
+
.rs-alert__title[data-v-8c18fdd0] {
|
|
24
86
|
font-size: var(--rs-font-size-sm);
|
|
25
87
|
font-weight: var(--rs-font-weight-semibold);
|
|
26
88
|
line-height: var(--rs-line-height-tight);
|
|
27
89
|
color: inherit;
|
|
28
90
|
}
|
|
29
|
-
.rs-
|
|
30
|
-
|
|
91
|
+
.rs-alert--lg .rs-alert__title[data-v-8c18fdd0] {
|
|
92
|
+
font-size: var(--rs-font-size-base);
|
|
93
|
+
}
|
|
94
|
+
.rs-alert__content[data-v-8c18fdd0] {
|
|
95
|
+
margin-block-start: var(--rs-space-xs);
|
|
31
96
|
font-size: var(--rs-font-size-sm);
|
|
32
97
|
line-height: var(--rs-line-height-normal);
|
|
33
|
-
color: var(--rs-alert-content-fg, var(--rs-
|
|
98
|
+
color: var(--rs-alert-content-fg, var(--rs-text-secondary));
|
|
34
99
|
}
|
|
35
|
-
.rs-
|
|
100
|
+
.rs-alert--default .rs-alert__content[data-v-8c18fdd0] {
|
|
101
|
+
color: var(--rs-alert-content-fg, var(--rs-text-secondary));
|
|
102
|
+
}
|
|
103
|
+
.rs-alert--info .rs-alert__content[data-v-8c18fdd0],
|
|
104
|
+
.rs-alert--success .rs-alert__content[data-v-8c18fdd0],
|
|
105
|
+
.rs-alert--warning .rs-alert__content[data-v-8c18fdd0],
|
|
106
|
+
.rs-alert--danger .rs-alert__content[data-v-8c18fdd0] {
|
|
107
|
+
color: color-mix(
|
|
108
|
+
in srgb,
|
|
109
|
+
var(--rs-alert-on-container) var(--rs-alert-content-alpha, 78%),
|
|
110
|
+
transparent
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
.rs-alert--solid .rs-alert__content[data-v-8c18fdd0] {
|
|
114
|
+
color: color-mix(in srgb, var(--rs-text-inverse) var(--rs-alert-content-alpha, 78%), transparent);
|
|
115
|
+
}
|
|
116
|
+
.rs-alert__action[data-v-8c18fdd0] {
|
|
117
|
+
display: inline-flex;
|
|
118
|
+
flex-shrink: 0;
|
|
119
|
+
align-items: center;
|
|
120
|
+
gap: var(--rs-space-xs);
|
|
121
|
+
margin-inline-start: auto;
|
|
122
|
+
}
|
|
123
|
+
.rs-alert__close[data-v-8c18fdd0] {
|
|
36
124
|
display: inline-flex;
|
|
37
125
|
align-items: center;
|
|
38
126
|
justify-content: center;
|
|
39
127
|
margin: 0;
|
|
40
|
-
padding:
|
|
128
|
+
padding: var(--rs-alert-icon-offset);
|
|
41
129
|
border: 0;
|
|
42
130
|
border-radius: var(--rs-radius-sm);
|
|
43
131
|
background: transparent;
|
|
44
132
|
color: inherit;
|
|
45
133
|
cursor: pointer;
|
|
46
|
-
opacity:
|
|
134
|
+
opacity: var(--rs-alert-close-opacity);
|
|
47
135
|
outline: none;
|
|
136
|
+
font: inherit;
|
|
137
|
+
line-height: 1;
|
|
138
|
+
}
|
|
139
|
+
.rs-alert__close--text[data-v-8c18fdd0] {
|
|
140
|
+
padding-block: var(--rs-space-xs);
|
|
141
|
+
padding-inline: var(--rs-space-sm);
|
|
142
|
+
font-size: var(--rs-font-size-xs);
|
|
143
|
+
font-weight: var(--rs-font-weight-medium);
|
|
48
144
|
}
|
|
49
|
-
.rs-alert__close[data-v-
|
|
145
|
+
.rs-alert__close[data-v-8c18fdd0]:hover {
|
|
50
146
|
opacity: 1;
|
|
51
147
|
background: color-mix(in srgb, currentColor 10%, transparent);
|
|
52
148
|
}
|
|
53
|
-
.rs-alert__close[data-v-
|
|
149
|
+
.rs-alert__close[data-v-8c18fdd0]:focus-visible {
|
|
54
150
|
box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
|
|
55
151
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
border-color: var(--rs-border);
|
|
152
|
+
@media (prefers-reduced-motion: reduce) {
|
|
153
|
+
.rs-alert__close[data-v-8c18fdd0] {
|
|
154
|
+
transition: none;
|
|
60
155
|
}
|
|
61
|
-
.rs-alert--default .rs-alert__content[data-v-2fd45305] {
|
|
62
|
-
color: var(--rs-alert-content-fg, var(--rs-muted));
|
|
63
156
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
in srgb,
|
|
69
|
-
var(--rs-info) var(--rs-alert-border-alpha, 35%),
|
|
70
|
-
transparent
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
.rs-alert--info .rs-alert__content[data-v-2fd45305] {
|
|
74
|
-
color: color-mix(in srgb, var(--rs-on-info-container) 78%, transparent);
|
|
75
|
-
}
|
|
76
|
-
.rs-alert--success[data-v-2fd45305] {
|
|
77
|
-
background: var(--rs-success-container);
|
|
78
|
-
color: var(--rs-on-success-container);
|
|
79
|
-
border-color: color-mix(
|
|
80
|
-
in srgb,
|
|
81
|
-
var(--rs-success) var(--rs-alert-border-alpha, 35%),
|
|
82
|
-
transparent
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
.rs-alert--success .rs-alert__content[data-v-2fd45305] {
|
|
86
|
-
color: color-mix(in srgb, var(--rs-on-success-container) 78%, transparent);
|
|
157
|
+
@media (forced-colors: active) {
|
|
158
|
+
.rs-alert[data-v-8c18fdd0] {
|
|
159
|
+
border: 1px solid CanvasText;
|
|
160
|
+
forced-color-adjust: none;
|
|
87
161
|
}
|
|
88
|
-
.rs-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
border-color: color-mix(
|
|
92
|
-
in srgb,
|
|
93
|
-
var(--rs-warning) var(--rs-alert-border-alpha, 35%),
|
|
94
|
-
transparent
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
.rs-alert--warning .rs-alert__content[data-v-2fd45305] {
|
|
98
|
-
color: color-mix(in srgb, var(--rs-on-warning-container) 78%, transparent);
|
|
99
|
-
}
|
|
100
|
-
.rs-alert--danger[data-v-2fd45305] {
|
|
101
|
-
background: var(--rs-danger-container);
|
|
102
|
-
color: var(--rs-on-danger-container);
|
|
103
|
-
border-color: color-mix(
|
|
104
|
-
in srgb,
|
|
105
|
-
var(--rs-danger) var(--rs-alert-border-alpha, 35%),
|
|
106
|
-
transparent
|
|
107
|
-
);
|
|
162
|
+
.rs-alert__close[data-v-8c18fdd0]:focus-visible {
|
|
163
|
+
outline: 2px solid Highlight;
|
|
164
|
+
box-shadow: none;
|
|
108
165
|
}
|
|
109
|
-
.rs-alert--danger .rs-alert__content[data-v-2fd45305] {
|
|
110
|
-
color: color-mix(in srgb, var(--rs-on-danger-container) 78%, transparent);
|
|
111
166
|
}
|