From fd61ae7dfb3c0cf61a0cf70451fbf9e198ee2887 Mon Sep 17 00:00:00 2001 From: devin Date: Thu, 31 Jul 2025 10:00:24 +0800 Subject: [PATCH 01/17] [script]Release 1.0.0 --- packages/scripts/README.md | 4 ++++ packages/scripts/package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/scripts/README.md b/packages/scripts/README.md index a64179dd..f1d3cba1 100644 --- a/packages/scripts/README.md +++ b/packages/scripts/README.md @@ -1,5 +1,9 @@ # scripts for open-design +# 1.0.0 + +- 【fix】统一gen-icon在不同系统下生成path的分隔符风格 + # 0.0.20 - 【fix】修复图标路径兼容性、文件名转变量名兼容性、不同实例同 id 的相互影响 diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 59d90ace..0590b141 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@opensig/open-scripts", - "version": "0.0.23", + "version": "1.0.0", "description": "opendesign component Scripts", "license": "MIT", "main": "dist/index.js", -- Gitee From 384faccc5df69e8ff95870aa643f4780b1887977 Mon Sep 17 00:00:00 2001 From: devin Date: Thu, 31 Jul 2025 14:11:03 +0800 Subject: [PATCH 02/17] =?UTF-8?q?doc=EF=BC=9A=E6=9B=B4=E6=96=B0ReadMe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/ReleaesNote.scripts.md | 6 ++ packages/docs/public/opendesign-logo-dark.png | Bin 0 -> 4067 bytes .../docs/public/opendesign-logo-light.png | Bin 0 -> 6116 bytes packages/opendesign/README.md | 57 +++++++++++++++++- packages/scripts/README.md | 40 ++++++++++-- 5 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 packages/docs/public/opendesign-logo-dark.png create mode 100644 packages/docs/public/opendesign-logo-light.png diff --git a/packages/docs/ReleaesNote.scripts.md b/packages/docs/ReleaesNote.scripts.md index 27c9f58e..84f0a915 100644 --- a/packages/docs/ReleaesNote.scripts.md +++ b/packages/docs/ReleaesNote.scripts.md @@ -1,5 +1,11 @@ # [open-scripts] +# 1.0.0 + +- fix + +1. 统一gen-icon在不同系统下生成path的分隔符风格 + # 0.0.23 - fix diff --git a/packages/docs/public/opendesign-logo-dark.png b/packages/docs/public/opendesign-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9b90c7b1bfc792b20397106b0c720e1ae507c540 GIT binary patch literal 4067 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 I6^GdW0J$pz@&Et; literal 0 HcmV?d00001 diff --git a/packages/docs/public/opendesign-logo-light.png b/packages/docs/public/opendesign-logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..24633e626b911f5d9c172674a5783d18ecb9a2ec GIT binary patch literal 6116 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

+

opendesign

+

一个 Vue 3 组件库

+

皮肤可定制,使用 TypeScript

-- vue3 components for opendesign + +## 特性 + + +### 皮肤可定制 + +提供组件变量体系,可以快速定义一套新皮肤 + +### 使用 TypeScript + +opendesign 全量使用 TypeScript 编写,和你的 TypeScript 项目无缝衔接。 + + +## 安装 + +### npm + +使用 npm/pnpm 安装。 + +```bash +# npm +npm i @opensig/opendesign + +#pnpm +pnpm add @opensig/opendesign + +``` + + +## 使用 + +### 引入样式文件 +``` +import '@opensig/opendesign/es/index.scss' +``` + +### 使用组件 +``` + + +``` + + +## 许可 + +opendesign 使用 [MIT license](https://opensource.org/licenses/MIT) 许可证书。 \ No newline at end of file diff --git a/packages/scripts/README.md b/packages/scripts/README.md index f1d3cba1..dee5c4ed 100644 --- a/packages/scripts/README.md +++ b/packages/scripts/README.md @@ -1,9 +1,39 @@ -# scripts for open-design +

open-scripts

+

用于构件opendesign组件库、图标库

-# 1.0.0 +## 特性 -- 【fix】统一gen-icon在不同系统下生成path的分隔符风格 -# 0.0.20 +### 组件构建 -- 【fix】修复图标路径兼容性、文件名转变量名兼容性、不同实例同 id 的相互影响 +支持构建vue组件库,编译样式文件 + +### 图标构建 + +支持将svg文件构建为vue组件 + + +### token构建 + +支持基于配置文件生成token文件 + + +## 安装 + +### npm + +使用 npm/pnpm 安装。 + +```bash +# npm +npm i @opensig/open-scripts + +#pnpm +pnpm add @opensig/open-scripts + +``` + + +## 许可 + +opendesign 使用 [MIT license](https://opensource.org/licenses/MIT) 许可证书。 \ No newline at end of file -- Gitee From 01600aefa9504aebee9d85c4dfb07b45386cb0f7 Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Thu, 31 Jul 2025 15:43:23 +0800 Subject: [PATCH 03/17] =?UTF-8?q?feat[doc]:=20=E6=96=B0=E5=A2=9Eicon?= =?UTF-8?q?=E5=9B=BE=E6=A0=87out-link?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/icons/svgs/fill/out-link.svg | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/docs/icons/svgs/fill/out-link.svg diff --git a/packages/docs/icons/svgs/fill/out-link.svg b/packages/docs/icons/svgs/fill/out-link.svg new file mode 100644 index 00000000..ffe90d5c --- /dev/null +++ b/packages/docs/icons/svgs/fill/out-link.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file -- Gitee From f49ca6153b7ddf40f1286036d37b7ed502ad1824 Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Thu, 31 Jul 2025 15:48:56 +0800 Subject: [PATCH 04/17] =?UTF-8?q?feat[doc]:=20=E6=96=B0=E5=A2=9EDocLink?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=8F=8A=E5=AF=B9=E5=BA=94markdown=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=B0=86a=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E6=B8=B2=E6=9F=93=E4=B8=BAOLink=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=EF=BC=9B=E5=85=A8=E5=B1=80=E6=B3=A8=E5=86=8CDocIcon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/plugins/markdown/common.ts | 3 +- packages/docs/plugins/markdown/link.ts | 8 +++++ packages/docs/src/components/DocLink.vue | 37 ++++++++++++++++++++++++ packages/docs/src/main.ts | 6 ++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 packages/docs/plugins/markdown/link.ts create mode 100644 packages/docs/src/components/DocLink.vue diff --git a/packages/docs/plugins/markdown/common.ts b/packages/docs/plugins/markdown/common.ts index 0da8649b..ef2683f5 100644 --- a/packages/docs/plugins/markdown/common.ts +++ b/packages/docs/plugins/markdown/common.ts @@ -3,6 +3,7 @@ import lineNumber from './lineNumber'; import popover from './popover'; import wrapTable from './wrapTable'; import wrapCodeContainer from './wrapCodeContainer'; +import link from './link'; import { createHighlighter } from './highlight'; export const highlight = createHighlighter(); @@ -12,7 +13,7 @@ export const markdownItOptions: MarkdownItAsyncOptions = { typographer: true, highlight, }; -export const markdownItPlugins = [lineNumber, popover, wrapCodeContainer, wrapTable]; +export const markdownItPlugins = [lineNumber, popover, wrapCodeContainer, wrapTable, link]; /** * 引入项目中所有 markdown 插件,并导出 MarkdownItAsync 实例,以便在其他模块中调用 */ diff --git a/packages/docs/plugins/markdown/link.ts b/packages/docs/plugins/markdown/link.ts new file mode 100644 index 00000000..5bf27d72 --- /dev/null +++ b/packages/docs/plugins/markdown/link.ts @@ -0,0 +1,8 @@ +import { MarkdownItAsync } from 'markdown-it-async'; +export default function customLinkPlugin(md: MarkdownItAsync) { + md.renderer.rules.link_open = (tokens, idx) => { + const token = tokens[idx]; + return ` `${key}="${value}"`).join(' ')}>`; + }; + md.renderer.rules.link_close = () => ''; +} diff --git a/packages/docs/src/components/DocLink.vue b/packages/docs/src/components/DocLink.vue new file mode 100644 index 00000000..9055a79b --- /dev/null +++ b/packages/docs/src/components/DocLink.vue @@ -0,0 +1,37 @@ + + diff --git a/packages/docs/src/main.ts b/packages/docs/src/main.ts index 0258ae70..6291bf70 100644 --- a/packages/docs/src/main.ts +++ b/packages/docs/src/main.ts @@ -11,9 +11,11 @@ import { router } from '@/router/index'; import App from './App.vue'; import * as Opendesign from '@opensig/opendesign'; +import * as DocIcons from '@/icon-components'; import CodeContainer from './components/CodeContainer.vue'; import DemoContainer from './components/DemoContainer.vue'; import DemoUsage from './components/DemoUsage.vue'; +import DocLink from './components/DocLink.vue'; const app = createApp(App); const pinia = createPinia(); @@ -35,7 +37,11 @@ Object.entries(Opendesign).forEach(([name, value]) => { app.component(name, value as any); } }); +Object.entries(DocIcons).forEach(([name, value]) => { + app.component(name, value as any); +}); // 某些组件有问题,需要手动注册 app.component('OCarouselItem', Opendesign.OCarouselItem); app.component('OToggle', Opendesign.OToggle); +app.component('DocLink', DocLink); app.mount('#app'); -- Gitee From 16d96a0b551e995a7358240632e9eee966496f2d Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Thu, 31 Jul 2025 15:49:38 +0800 Subject: [PATCH 05/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96eslint=E8=A7=84?= =?UTF-8?q?=E5=88=99=EF=BC=8C=E4=B8=8D=E6=A3=80=E6=9F=A5=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index 335e5727..4aff6271 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -51,6 +51,7 @@ module.exports = { ignoreTemplateLiterals: true, ignoreStrings: true, ignorePattern: 'd="([\\s\\S]*?)"', + ignoreComments: true, }], 'default-param-last': 'off', 'no-param-reassign': ['error', { props: false }], -- Gitee From 4a648ca0c73129d2225d05527de8e8398c82c2bb Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Thu, 31 Jul 2025 15:51:00 +0800 Subject: [PATCH 06/17] =?UTF-8?q?fix[doc]:=20=E4=BC=98=E5=8C=96OperatorVie?= =?UTF-8?q?w=E7=BB=84=E4=BB=B6=EF=BC=8C=E5=88=A0=E9=99=A4=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8F=98=E9=87=8F=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/components/OperatorView.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/docs/src/components/OperatorView.ts b/packages/docs/src/components/OperatorView.ts index a6efd658..a694b937 100644 --- a/packages/docs/src/components/OperatorView.ts +++ b/packages/docs/src/components/OperatorView.ts @@ -1,4 +1,4 @@ -import { defineComponent, h, Fragment, type PropType, type VNode, computed } from 'vue'; +import { defineComponent, h, Fragment, type PropType, type VNode } from 'vue'; import { OSelect, OOption, OInput, OInputNumber, OCheckbox, OCheckboxGroup, OTextarea, ORadio, ORadioGroup } from '@opensig/opendesign'; type CheckboxScheme = { @@ -49,7 +49,7 @@ const createSelectorItem = (key: string, value: SelectorScheme, state: State) => OSelect, { modelValue: state[key], 'onUpdate:modelValue': (val) => (state[key] = val) }, { - default: () => value.list.map((item) => h(OOption, { value: item, label: item.toString() })), + default: () => value.list.map((item) => h(OOption, { value: item, label: `${item}` })), }, ), ]); -- Gitee From 50ff554a6958b8b4d6c81045cd40406c71af5e1c Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Thu, 31 Jul 2025 16:32:06 +0800 Subject: [PATCH 07/17] =?UTF-8?q?fix(doc):=20=E4=BF=AE=E5=A4=8D=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E4=B8=AD=E6=9C=89=E6=8D=A2=E8=A1=8C=E7=AC=A6=E7=A0=B4?= =?UTF-8?q?=E5=9D=8Fmarkdown=E8=A1=A8=E6=A0=BC=E7=BB=93=E6=9E=84=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/scripts/generateApi.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/docs/scripts/generateApi.ts b/packages/docs/scripts/generateApi.ts index cfb8894a..7924c489 100644 --- a/packages/docs/scripts/generateApi.ts +++ b/packages/docs/scripts/generateApi.ts @@ -25,12 +25,15 @@ const CELL_REPLACEMENTS = { "'": ''', // 竖线符号在markdown中会被解析为表格分隔符 '|': '|', + // 表格中有换行符破坏markdown表格结构 + '\r': '', + '\n': '
', }; function replaceCellChar(ch: string) { return CELL_REPLACEMENTS[ch]; } function escapeTableValue(value?: string) { - const CELL_ESCAPE_REPLACE_RE = /[<>"'|]/g; + const CELL_ESCAPE_REPLACE_RE = /[<>"'|\r\n]/g; return value ? value.replace(CELL_ESCAPE_REPLACE_RE, replaceCellChar) : ''; } function cleanTableData(table: any[][]) { -- Gitee From ac89960b2823b00c1ebd38c70fc26176ac913c62 Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Thu, 31 Jul 2025 16:41:38 +0800 Subject: [PATCH 08/17] =?UTF-8?q?feat(doc):=20=E6=96=B0=E5=A2=9Elayer?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/layer/OLayer.vue | 1 + .../layer/__docs__/__case__/LayerCustom.vue | 98 +++++++++++++++ .../layer/__docs__/__case__/LayerUsage.vue | 116 ++++++++++++++++++ .../src/layer/__docs__/index.en-US.md | 14 +++ .../src/layer/__docs__/index.zh-CN.md | 14 +++ packages/opendesign/src/layer/types.ts | 44 +++++-- 6 files changed, 274 insertions(+), 13 deletions(-) create mode 100644 packages/opendesign/src/layer/__docs__/__case__/LayerCustom.vue create mode 100644 packages/opendesign/src/layer/__docs__/__case__/LayerUsage.vue create mode 100644 packages/opendesign/src/layer/__docs__/index.en-US.md create mode 100644 packages/opendesign/src/layer/__docs__/index.zh-CN.md diff --git a/packages/opendesign/src/layer/OLayer.vue b/packages/opendesign/src/layer/OLayer.vue index c16679de..acbbd988 100644 --- a/packages/opendesign/src/layer/OLayer.vue +++ b/packages/opendesign/src/layer/OLayer.vue @@ -197,6 +197,7 @@ onUnmounted(() => { }); defineExpose({ + /** Toggle the OLayer */ toggle, }); diff --git a/packages/opendesign/src/layer/__docs__/__case__/LayerCustom.vue b/packages/opendesign/src/layer/__docs__/__case__/LayerCustom.vue new file mode 100644 index 00000000..67814a70 --- /dev/null +++ b/packages/opendesign/src/layer/__docs__/__case__/LayerCustom.vue @@ -0,0 +1,98 @@ + + + +### 自定义关闭按钮 + +可以通过 `close` 插槽自定义按钮,或完全自定义关闭按钮(通过双向绑定属性 `visible` 实现开关) + + + +### Custom Close Button + +The close button can be customized through the `close` slot, +or fully replaced by custom implementations using the `visible` two-way binding property for toggling. + + + + diff --git a/packages/opendesign/src/layer/__docs__/__case__/LayerUsage.vue b/packages/opendesign/src/layer/__docs__/__case__/LayerUsage.vue new file mode 100644 index 00000000..d118e5d6 --- /dev/null +++ b/packages/opendesign/src/layer/__docs__/__case__/LayerUsage.vue @@ -0,0 +1,116 @@ + + + +### 使用 + +`transitionOrign`:设置内容盒子缩放动画的原点,即设置 css 属性 `transform-origin` 的值。取值有: + +- `'mouse'`: 鼠标点击的位置(默认值) +- `'css'`: 通过 css 变量 `--layer-origin` 设置(`--layer-origin` 默认值为 `center`) + +`wrapper`:设置浮层渲染的父节点。取值有: + +- `'body'`: 渲染到 body 元素下(默认值),浮层的 `position` 属性为 `fixed` +- `string-selector`: 渲染到指定元素下,通过 `querySelector` 查询 +- `HTMLElement`: 渲染到指定元素下 +- `null`: 渲染到当前元素下,浮层的 `position` 属性为 `absolute`。 + **注**:若浮层元素的[包含块](https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_display/Containing_block)是 `body` 元素, + 则浮层仍然会全屏覆盖,通常将当前元素的`position` 属性设置为 `relative` 来避免此情况。 + +`mask`:设置是否渲染遮罩层 + +`maskClose`:点击遮罩层时是否关闭浮层 + +`buttonClose`:是否渲染关闭按钮 + + + +### Usage + +`transitionOrign`: Sets the origin point for the scaling animation of the content box, i.e., sets the value of the CSS property `transform-origin`. Values are: + +- `'mouse'`: The position where the mouse clicks (default value). +- `'css'`: Set via CSS variable `--layer-origin` (the default value of `--layer-origin` is `center`). + +`wrapper`: Sets the parent node for rendering the layer. Values are: + +- `'body'`: Render under the body element (default), the layer's `position` property is `fixed`. +- `string-selector`: Render under the specified element, queried via `querySelector`. +- `HTMLElement`: Render under the specified element. +- `null`: Render under the current element, the layer's `position` property is `absolute`. + **Note**: If the [containing block](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_display/Containing_block) of the layer element is the body element, + the layer will still cover the entire screen. Usually, set the `position` property of the current element to `relative` to avoid this situation. + +`mask`: Sets whether to render the mask layer. + +`maskClose`: Sets whether to close the layer when clicking the mask layer. + +`buttonClose`: Sets whether to render the close button. + + + + diff --git a/packages/opendesign/src/layer/__docs__/index.en-US.md b/packages/opendesign/src/layer/__docs__/index.en-US.md new file mode 100644 index 00000000..a48c5438 --- /dev/null +++ b/packages/opendesign/src/layer/__docs__/index.en-US.md @@ -0,0 +1,14 @@ +--- +sidebar: OLayer +--- + +# OLayer + +## Demo + + + + +## API + + diff --git a/packages/opendesign/src/layer/__docs__/index.zh-CN.md b/packages/opendesign/src/layer/__docs__/index.zh-CN.md new file mode 100644 index 00000000..eaf1ddaf --- /dev/null +++ b/packages/opendesign/src/layer/__docs__/index.zh-CN.md @@ -0,0 +1,14 @@ +--- +sidebar: OLayer 浮层 +--- + +# OLayer 浮层 + +## 示例 + + + + +## API + + diff --git a/packages/opendesign/src/layer/types.ts b/packages/opendesign/src/layer/types.ts index a8d78da0..97fb3ad4 100644 --- a/packages/opendesign/src/layer/types.ts +++ b/packages/opendesign/src/layer/types.ts @@ -2,84 +2,102 @@ import { ExtractPropTypes, PropType } from 'vue'; export const layerProps = { /** - * 控制对话框是否显示 - * v-model + * @zh-CN 控制浮层是否显示,双向绑定属性 + * @en-US Controls whether the layer is displayed, two-way binding property */ visible: { type: Boolean, default: false, }, /** - * 挂载容器,默认为body, null代表当前父元素 + * @zh-CN 浮层挂载的节点,值为 null 时挂载到父容器 + * @en-US The mount node for the overlay component. When set to null, it mounts to the parent container. + * @default 'body' */ wrapper: { type: [String, Object] as PropType, default: 'body', }, /** - * 是否在隐藏时unmout + * @zh-CN 是否在隐藏是卸载组件 + * @en-US Whether to unmounted the component when hidden */ unmountOnHide: { type: Boolean, default: true, }, /** - * body自定义class + * @zh-CN 默认插槽父容器的自定义类名 + * @en-US Custom class name for default slot's parent container */ mainClass: { type: [String, Array] as PropType, default: '', }, /** - * main过渡名称 + * @zh-CN 自定义内容盒子的过度动画 + * @en-US Custom transition for content box + * @default 'o-zoom-fade2' */ mainTransition: { type: String, default: 'o-zoom-fade2', }, /** - * mask过渡名称 + * @zh-CN 自定义遮罩层的过度动画 + * @en-US Custom transition for mask + * @default 'o-fade-in' */ maskTransition: { type: String, default: 'o-fade-in', }, /** - * mask过渡名称 + * @zh-CN 内容盒子缩放动画的 transform-origin 的值,'mouse' 表示鼠标点击的位置,'css' 表示使用 --layer-origin 变量(默认值 center) + * @en-US Set the value of transform-origin to main box scaling animation; 'mouse' indicates the mouse click position, 'css' indicates using the --layer-origin variable (default: center) + * @default 'mouse' */ transitionOrign: { type: String as PropType<'mouse' | 'css'>, default: 'mouse', }, /** - * 是否需要mask + * @zh-CN 是否渲染遮罩层 + * @en-US Whether to render the mask + * @default true */ mask: { type: Boolean, default: true, }, /** - * 点击mask关闭 + * @zh-CN 点击遮罩层时是否关闭浮层 + * @en-US Whether to close the layer when clicking the mask + * @default true */ maskClose: { type: Boolean, default: true, }, /** - * 点击关闭按钮关闭 + * @zh-CN 是否渲染浮层的关闭按钮 + * @en-US Whether to render the close button of the layer + * @default false */ buttonClose: { type: Boolean, default: false, }, /** - * 显示前回调,根据返回值判断是否显示, false: 不显示; true|undefined: 显示 + * @zh-CN 浮层打开前的回调,返回 false 表示取消打开浮层,否则打开浮层 + * @en-US Callback before the layer is opened, returning false means canceling the opening of the layer, otherwise opening the layer */ beforeShow: { type: Function as PropType<() => Promise | boolean>, }, /** - * 隐藏前回调,根据返回值判断是否隐藏,false: 不隐藏; true|undefined: 隐藏 + * @zh-CN 浮层关闭前的回调,返回 false 表示取消关闭浮层,否则关闭浮层 + * @en-US Callback before the layer is closed, returning false means canceling the closing of the layer, otherwise close the layer */ beforeHide: { type: Function as PropType<() => Promise | boolean>, -- Gitee From e1ff803dca6c35cacde9081c4a523f4392a8571d Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Fri, 1 Aug 2025 17:01:10 +0800 Subject: [PATCH 09/17] =?UTF-8?q?fix(doc):=20=E4=BC=98=E5=8C=96api?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=94=9F=E6=88=90=E5=87=BD=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=87=BA=E6=AD=A3=E7=A1=AE=E7=9A=84expose=20?= =?UTF-8?q?api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/scripts/generateApi.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/docs/scripts/generateApi.ts b/packages/docs/scripts/generateApi.ts index 7924c489..50dff716 100644 --- a/packages/docs/scripts/generateApi.ts +++ b/packages/docs/scripts/generateApi.ts @@ -133,6 +133,7 @@ const pathReg = /\/(O.*)\.vue/; const tagTypes = { deprecated: '(warning)', }; +const exposeDesReg = /^\s*expose:([\s\S]+)/; glob('*/O*.vue', { cwd: srcDir, posix: true }).then((files) => { files.forEach(async (file, index) => { const fullPath = join(srcDir, file); @@ -212,14 +213,14 @@ glob('*/O*.vue', { cwd: srcDir, posix: true }).then((files) => { mdContent = `${mdContent}\n\n#### slots\n\n${markdownTable(slotsData)}`; } // expose - const selfExposed = meta.exposed.filter((expose) => expose.description); + const selfExposed = meta.exposed.filter((expose) => expose.description && exposeDesReg.test(expose.description)); if (selfExposed.length) { const tableHeader = { 'zh-CN': ['名称', '类型', '说明'], 'en-US': ['Name', 'Type', 'Description'], }; - let exposeData =selfExposed.map((expose) => { - return [expose.name, expose.type, expose.description]; + let exposeData = selfExposed.map((expose) => { + return [expose.name, expose.type, (expose.description.match(exposeDesReg)?.[1] || '').trim()]; }); exposeData.unshift(tableHeader[lang]); exposeData = cleanTableData(exposeData); -- Gitee From 5325ee818fe5518004aef02127f8200fcda78f1b Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Fri, 1 Aug 2025 17:05:24 +0800 Subject: [PATCH 10/17] =?UTF-8?q?feat(doc):=20=E4=BC=98=E5=8C=96=E5=B0=86h?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=9A=84=E6=A0=87=E9=A2=98=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E4=B8=BA=E8=A7=84=E8=8C=83id=E7=9A=84=E5=87=BD=E6=95=B0getHead?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/utils/getHeads.ts | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/docs/src/utils/getHeads.ts b/packages/docs/src/utils/getHeads.ts index 4d8fbf65..c6b0b510 100644 --- a/packages/docs/src/utils/getHeads.ts +++ b/packages/docs/src/utils/getHeads.ts @@ -1,13 +1,20 @@ /** * 将h标签的标题转换为规范的id(该id会作为h标签的id以及a便签的href) - * @param title 待转换的标题 + * @param str 待转换的标题 * @returns id */ -function escapeTitle(title: string) { - return title +function slugify(str: string) { + return str + // 将驼峰转为中横线 + .replace(/(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])/g, '-$&') .toLowerCase() + // 将空白字符转为中横线 .replace(/\s+/g, '-') - // 转换特殊字符,但不转化 unicode 字符 + // 合并多个中横线 + .replace(/-+/g, '-') + // 移除首尾中横线 + .replace(/(^-|-$)/g, '') + // 转义特殊字符 .replace(/[;,/?:@&=+$#]/g, (char) => encodeURIComponent(char)); } /** @@ -16,11 +23,11 @@ function escapeTitle(title: string) { * @param minLevel 查找的最小级别,默认为2,即只查找h2到h6的标题 * @returns 查找结果,格式为[{title: string, level: number, id: string}] */ -export function getHeads(el: HTMLElement, minLevel = 2) { - let headerId: Record = {}; +export function getHeads(el: HTMLElement, _minLevel = 2) { + const headerId: Record = {}; const heads: Array<{ title: string; level: number; id: string }> = []; let levels = ''; - minLevel = Math.max(Math.floor(minLevel), 1); + const minLevel = Math.max(Math.floor(_minLevel), 1); if (minLevel > 6) { return heads; } @@ -38,7 +45,7 @@ export function getHeads(el: HTMLElement, minLevel = 2) { if (dom.id) { id = dom.id; } else { - id = escapeTitle(title); + id = slugify(title); } // 判断是否有重名id,如果有则加上数字编号;该id会作为锚点的href if (headerId[id]) { -- Gitee From 6c68c7b22d5e94c5f1d683ad4ce7eddd744c70d0 Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Fri, 1 Aug 2025 17:06:16 +0800 Subject: [PATCH 11/17] =?UTF-8?q?fix(doc):=20=E4=BC=98=E5=8C=96=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E6=A0=B7=E5=BC=8F=EF=BC=8C=E8=A1=A8=E6=A0=BC=E5=8F=AF?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E4=B8=94=E5=9B=BA=E5=AE=9A=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/assets/style/markdown.scss | 29 +++++++++++++++++++- packages/docs/src/assets/style/style.scss | 10 ------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/docs/src/assets/style/markdown.scss b/packages/docs/src/assets/style/markdown.scss index 65d65dda..89e5e369 100644 --- a/packages/docs/src/assets/style/markdown.scss +++ b/packages/docs/src/assets/style/markdown.scss @@ -12,7 +12,8 @@ [data-o-theme$='dark'] pre span { color: var(--shiki-dark); } -p + .code-container, p + .o-table { +p + .code-container, +p + .o-table { margin-top: 8px; } ol, @@ -81,3 +82,29 @@ li { } } } + +.markdown-body { + padding: 0 var(--o3-gap-5); + .markdown-body { + padding: 0; + } + .o-table-wrap { + overflow-x: auto; + th:first-child, + td:first-child { + position: sticky; + left: 0; + } + td:first-child { + background-color: var(--table-bg-color); + } + @media (hover: hover) { + tr:hover td { + background-color: var(--table-row-hover); + } + } + } + @include respond-to('<=pad_v') { + padding: 0; + } +} diff --git a/packages/docs/src/assets/style/style.scss b/packages/docs/src/assets/style/style.scss index 237e243f..daeb67f1 100644 --- a/packages/docs/src/assets/style/style.scss +++ b/packages/docs/src/assets/style/style.scss @@ -154,13 +154,3 @@ section { border-color: #aaa; } } - -.markdown-body { - padding: 0 var(--o3-gap-5); - .markdown-body { - padding: 0; - } - @include respond-to('<=pad_v') { - padding: 0; - } -} -- Gitee From 51369629e86c3ecd2da0f23c754f5ee8a40992a9 Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Fri, 1 Aug 2025 17:06:46 +0800 Subject: [PATCH 12/17] =?UTF-8?q?fix(doc):=20=E8=B0=83=E6=95=B4TheHeader?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=EF=BC=8C=E7=A7=BB=E5=8A=A8=E7=AB=AF=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BAheader=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/components/TheHeader.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/docs/src/components/TheHeader.vue b/packages/docs/src/components/TheHeader.vue index 167ce136..ad358389 100644 --- a/packages/docs/src/components/TheHeader.vue +++ b/packages/docs/src/components/TheHeader.vue @@ -128,6 +128,9 @@ watch(locale, (newLocale, oldLocale) => { left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0); + @include respond-to('phone') { + display: none; + } } .left { display: flex; -- Gitee From 59b3019ff72d78b07910d8e2f4769274d4e423f9 Mon Sep 17 00:00:00 2001 From: sakurayinfei <970412446@qq.com> Date: Fri, 1 Aug 2025 17:07:07 +0800 Subject: [PATCH 13/17] =?UTF-8?q?feat(doc):=20=E6=96=B0=E5=A2=9Edialog?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/dialog/ODialog.vue | 1 + .../__docs__/__case__/DialogActions.vue | 48 +++++++ .../__docs__/__case__/DialogSizeUsage.vue | 65 ++++++++++ .../dialog/__docs__/__case__/DialogSlot.vue | 119 ++++++++++++++++++ .../src/dialog/__docs__/index.en-US.md | 73 +++++++++++ .../src/dialog/__docs__/index.zh-CN.md | 74 +++++++++++ packages/opendesign/src/dialog/types.ts | 18 ++- 7 files changed, 392 insertions(+), 6 deletions(-) create mode 100644 packages/opendesign/src/dialog/__docs__/__case__/DialogActions.vue create mode 100644 packages/opendesign/src/dialog/__docs__/__case__/DialogSizeUsage.vue create mode 100644 packages/opendesign/src/dialog/__docs__/__case__/DialogSlot.vue create mode 100644 packages/opendesign/src/dialog/__docs__/index.en-US.md create mode 100644 packages/opendesign/src/dialog/__docs__/index.zh-CN.md diff --git a/packages/opendesign/src/dialog/ODialog.vue b/packages/opendesign/src/dialog/ODialog.vue index ca982b13..42d4a441 100644 --- a/packages/opendesign/src/dialog/ODialog.vue +++ b/packages/opendesign/src/dialog/ODialog.vue @@ -46,6 +46,7 @@ const scrollbarProps = computed(() => { }); defineExpose({ + /** expose: Toggle the ODialog */ toggle(show?: boolean) { layerRef.value?.toggle(show); }, diff --git a/packages/opendesign/src/dialog/__docs__/__case__/DialogActions.vue b/packages/opendesign/src/dialog/__docs__/__case__/DialogActions.vue new file mode 100644 index 00000000..c3220641 --- /dev/null +++ b/packages/opendesign/src/dialog/__docs__/__case__/DialogActions.vue @@ -0,0 +1,48 @@ + + + +### 底部操作按钮 + +`ODialog` 可以通过 `actions` 属性定义对话框底部的操作按钮。`actions` 属性的类型为 [DialogActionT\[\]](#dialog-action-t)。 + + + +### Bottom Action Buttons + +Bottom action buttons in `ODialog` can be defined via the `actions` prop. The `actions` prop is of type [DialogActionT\[\]](#dialog-action-t). + + + + diff --git a/packages/opendesign/src/dialog/__docs__/__case__/DialogSizeUsage.vue b/packages/opendesign/src/dialog/__docs__/__case__/DialogSizeUsage.vue new file mode 100644 index 00000000..c36d5847 --- /dev/null +++ b/packages/opendesign/src/dialog/__docs__/__case__/DialogSizeUsage.vue @@ -0,0 +1,65 @@ + + + +### 尺寸 + +ODialog 有不同的尺寸:`'exlarge'` `'large'` `'medium'` `'small'` `'auto'`,通过 `size` 属性设置 + +- 当尺寸为 `auto` 时,对话框的大小适应内容。 +- 当尺寸为其它值时,对话框的宽是相对固定的,高度会被钳制在对应值内。 + 当客户端视口尺寸变化时,对话框尺寸会根据 `size` 自动适配,这在大部分情况下都能获得较好的效果,否则您可以将 `noResponsive` 设置为 `true` 取消自动适配,或者通过 css 变量细颗粒地自定义尺寸。 +- 将 `phoneHalfFull` 设置为 `true`,移动端(视口宽度小于 600px)对话框的宽度会占满视口。**注**: + - 此时 `size` 只影响高度,不影响宽度 + - `noResponsive` 不能为 `true` + + + +### Size + +ODialog offers various size options: `'exlarge'`, `'large'`, `'medium'`, `'small'`, and `'auto'`, configured through the `size` prop. + +- When set to `auto`, the dialog adapts its dimensions to fit the content. +- For other size values, the dialog maintains a relatively fixed width while its height is clamped within the corresponding range. + When the viewport size changes, the dialog automatically adjusts based on the `size` setting. This generally provides optimal display results. + To disable this responsive behavior, set `noResponsive` to `true`. Alternatively, use CSS variables for granular customization. +- Setting `phoneHalfFull` to `true` enables full-width display on mobile devices (viewport width < 600px). **Notes**: + - In this mode, `size` only affects height and does not impact width + - `noResponsive` must not be set to `true` + + diff --git a/packages/opendesign/src/dialog/__docs__/__case__/DialogSlot.vue b/packages/opendesign/src/dialog/__docs__/__case__/DialogSlot.vue new file mode 100644 index 00000000..9fac140b --- /dev/null +++ b/packages/opendesign/src/dialog/__docs__/__case__/DialogSlot.vue @@ -0,0 +1,119 @@ + + + +### 插槽 + +对话框有四个插槽: + +- `header`: 头部,用于放置标题 +- `default`: 主体,用于放置内容。**注**:`default` 插槽中的内容有溢出滚动的功能(可通过 `scrollbar` 参数调整滚动条,参数类型[BaseScrollerPropsT](#base-scroller-props-t)),其余插槽位置固定不能滚动; +- `actions`: 按钮,用于自定义底部按钮 +- `footer`: 底部,用于防止底部内容。**注**:`footer` 插槽会覆盖 `actions` 插槽。 + + + + + + + \ No newline at end of file diff --git a/packages/opendesign/src/dialog/__docs__/index.en-US.md b/packages/opendesign/src/dialog/__docs__/index.en-US.md new file mode 100644 index 00000000..410634e0 --- /dev/null +++ b/packages/opendesign/src/dialog/__docs__/index.en-US.md @@ -0,0 +1,73 @@ +--- +sidebar: ODialog +--- + +# ODialog + +## Demo + + + + +## API + +### CSS Variables + +| CSS Variable | Description | +| --- | --- | +| --dlg-close-size | Size of the close button | +| --dlg-close-color | Color of the close button | +| --dlg-close-color-hover | Color of the close button when hovered | +| --dlg-close-color-active | Color of the close button when active | +| --dlg-color | Text color | +| --dlg-header-color | Header color, overrides `--dlg-color` | +| --dlg-bg-color | Background color | +| --dlg-radius | Border radius | +| --dlg-shadow | Box shadow | +| --dlg-max-height | Maximum height | +| --dlg-min-height | Minimum height | +| --dlg-min-width | Minimum width | +| --dlg-width | Width | +| --dlg-margin | Margin | +| --dlg-edge-gap | Padding | +| --dlg-inner-gap | Spacing between the default header and footer | +| --dlg-header-gap | Spacing between the header and default content, overrides `--dlg-inner-gap` | +| --actions-justify | Alignment of the action buttons at the bottom | + + + +### DialogActionT + +```ts +interface DialogActionT { + id: string | number; + color?: 'normal' | 'primary' | 'success' | 'warning' | 'danger'; + variant?: 'solid' | 'outline' | 'text'; + size?: 'large' | 'medium' | 'small'; + label?: string; + round?: 'pill' | (string & {}); + icon?: Component; + disabled?: boolean; + loading?: boolean; + // Button click event callback function + onClick: () => void; +} +``` + +See [OButton API Props](/en-US/components/button#props) + +### BaseScrollerPropsT + +```ts +type BaseScrollerPropsT = { + disabledX: boolean; + disabledY: boolean; + duration: number; + showType: 'auto' | 'always' | 'hover' | 'never'; + size: 'medium' | 'small'; + autoUpdateOnScrollSize: boolean; + barClass?: string | undefined; +}; +``` + +See [Scroller API Props](/en-US/components/scroller#props) diff --git a/packages/opendesign/src/dialog/__docs__/index.zh-CN.md b/packages/opendesign/src/dialog/__docs__/index.zh-CN.md new file mode 100644 index 00000000..2c6385a0 --- /dev/null +++ b/packages/opendesign/src/dialog/__docs__/index.zh-CN.md @@ -0,0 +1,74 @@ +--- +sidebar: ODialog 对话框 +--- + +# ODialog 对话框 + +## 示例 + + + + + +## API + +### CSS 变量 + +| CSS变量 | 描述 | +| --- | --- | +| --dlg-close-size | 关闭按钮大小 | +| --dlg-close-color | 关闭按钮颜色 | +| --dlg-close-color-hover | 鼠标悬停关闭按钮颜色 | +| --dlg-close-color-active | 鼠标按下关闭按钮颜色 | +| --dlg-color | 文字颜色 | +| --dlg-header-color | 标题颜色,覆盖 `--dlg-color` | +| --dlg-bg-color | 背景颜色 | +| --dlg-radius | 圆角 | +| --dlg-shadow | 阴影 | +| --dlg-max-height | 最大高度 | +| --dlg-min-height | 最小高度 | +| --dlg-min-width | 最小宽度 | +| --dlg-width | 宽度 | +| --dlg-margin | 外边距 | +| --dlg-edge-gap | 内边距 | +| --dlg-inner-gap | header default 和 footer 之间的间距 | +| --dlg-header-gap | header 和 default 之间的间距,覆盖 `--dlg-inner-gap` | +| --actions-justify | 底部操作按钮的对齐方式 | + + + +### DialogActionT + +```ts +interface DialogActionT { + id: string | number; + color?: 'normal' | 'primary' | 'success' | 'warning' | 'danger'; + variant?: 'solid' | 'outline' | 'text'; + size?: 'large' | 'medium' | 'small'; + label?: string; + round?: 'pill' | (string & {}); + icon?: Component; + disabled?: boolean; + loading?: boolean; + // 按钮点击事件回调函数 + onClick: () => void; +} +``` + +参考 [OButton API Props](/zh-CN/components/button#props) + +### BaseScrollerPropsT + +```ts +type BaseScrollerPropsT = { + disabledX: boolean; + disabledY: boolean; + duration: number; + showType: 'auto' | 'always' | 'hover' | 'never'; + size: 'medium' | 'small'; + autoUpdateOnScrollSize: boolean; + barClass?: string | undefined; +}; +``` + +参考 [Scroller API Props](/zh-CN/components/scroller#props) diff --git a/packages/opendesign/src/dialog/types.ts b/packages/opendesign/src/dialog/types.ts index 66e1383d..badf76e9 100644 --- a/packages/opendesign/src/dialog/types.ts +++ b/packages/opendesign/src/dialog/types.ts @@ -22,13 +22,15 @@ export interface DialogActionT { export const dialogProps = { ...layerProps, /** - * 是否隐藏可以关闭 + * @zh-CN 是否隐藏对话框的关闭按钮 + * @en-US Whether to hide the close button of the dialog */ hideClose: { type: Boolean, }, /** - * 弹窗尺寸 + * @zh-CN 对话框尺寸 + * @en-US Dialog size */ size: { type: String as PropType, @@ -36,25 +38,29 @@ export const dialogProps = { }, /** - * 弹窗底部按钮 + * @zh-CN 对话框底部按钮 + * @en-US Dialog bottom button */ actions: { type: Array as PropType, }, /** - * 是否响应式 + * @zh-CN 是否禁用响应式 + * @en-US Whether to disable responsive */ noResponsive: { type: Boolean, }, /** - * 移动端响应为半屏 + * @zh-CN 移动端是否渲染为半屏(宽度占满,高度占一半) + * @en-US Whether to render as half screen (width full, height half) on mobile phone */ phoneHalfFull: { type: Boolean, }, /** - * 是否使用scrollbar + * @zh-CN 是否使用scrollbar,值为 false 不使用,值为 true 或 scrollbar 的配置对象则使用 + * @en-US Whether to use scrollbar, value false not use, value true or scrollbar configuration object to use */ scrollbar: { type: [Boolean, Object] as PropType>, -- Gitee From d8400cf665c30e8e5539711e4dae40cd9fd88811 Mon Sep 17 00:00:00 2001 From: devin Date: Fri, 1 Aug 2025 11:31:47 +0800 Subject: [PATCH 14/17] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E6=89=B9=E6=89=A7=E8=A1=8C=E5=87=BD=E6=95=B0=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=80=97=E6=97=B6=E7=9A=84=E5=A4=A7=E9=87=8F?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/_utils/helper.ts | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/opendesign/src/_utils/helper.ts b/packages/opendesign/src/_utils/helper.ts index cc90a990..31b566d8 100644 --- a/packages/opendesign/src/_utils/helper.ts +++ b/packages/opendesign/src/_utils/helper.ts @@ -251,3 +251,40 @@ export function pick(source: Object, keys: string[]) { }); return result; } + + +/** + * 分批执行大量任务 + * tasks: 任务列表 Array<() => void> + * sheduler:调度器函数,用于分批执行任务 + * runChunk:分批执行函数 (toContinue:(currentTaskIndex: number)=>boolean)=>void + * toContinue:(currentTaskIndex: number)=>boolean 是否继续执行的条件 + */ +export function performTask(tasks: Array<() => void>, sheduler: (runChunk: (toContinue: (currentTaskIndex: number) => boolean) => void) => void) { + let runingIndex = 0; + function _runTask() { + sheduler((toContinue) => { + while (runingIndex < tasks.length && toContinue(runingIndex)) { + tasks[runingIndex++](); + } + if (runingIndex < tasks.length) { + _runTask(); + } + }); + } + _runTask(); +} + +/** + * 分时执行大量任务,使用requestIdleCallback + * tasks: 任务列表 Array<() => void> + */ +export function idlePerformTask(tasks: Array<() => void>) { + const sheduler = (runChunk: (toContinue: () => boolean) => void) => { + requestIdleCallback((idle) => { + runChunk(() => idle.timeRemaining() > 0); + }); + }; + + performTask(tasks, sheduler); +} \ No newline at end of file -- Gitee From fadd30b10619b489f051a8bd5134f989d92d693c Mon Sep 17 00:00:00 2001 From: devin Date: Mon, 4 Aug 2025 18:59:42 +0800 Subject: [PATCH 15/17] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=AF=8D=E6=9D=A1?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7=EF=BC=9B=E6=94=AF=E6=8C=81useI18n?= =?UTF-8?q?=E5=9C=A8=E9=9D=9E=E7=BB=84=E4=BB=B6=E4=B8=AD=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/lang/en-US.ts | 16 ++-- packages/docs/src/lang/index.ts | 20 ++--- packages/docs/src/lang/zh-CN.ts | 16 ++-- packages/docs/tsconfig.json | 3 + .../config-provider/__demo__/ConfigLink.vue | 21 +++++ .../config-provider/__demo__/ConfigLocale.vue | 60 +++++++++++++++ .../__demo__/ConfigProviderBasic.vue | 76 ------------------- .../src/config-provider/__demo__/TheChild.vue | 6 +- .../src/config-provider/__demo__/TheIndex.vue | 6 +- .../opendesign/src/config-provider/types.ts | 3 + .../src/locale/__demo__/LocaleBasic.vue | 49 ++++++++++++ .../src/locale/__demo__/TheIndex.vue | 9 +++ packages/opendesign/src/locale/index.ts | 45 ++++++++--- packages/opendesign/src/locale/lang/en-us.ts | 47 +++++------- packages/opendesign/src/locale/lang/zh-cn.ts | 47 +++++------- packages/opendesign/src/locale/types.ts | 50 ++++++------ .../opendesign/src/pagination/OPagination.vue | 10 ++- packages/portal/src/components/TheHeader.vue | 4 +- packages/portal/src/router.ts | 8 ++ 19 files changed, 282 insertions(+), 214 deletions(-) create mode 100644 packages/opendesign/src/config-provider/__demo__/ConfigLink.vue create mode 100644 packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue delete mode 100644 packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue create mode 100644 packages/opendesign/src/locale/__demo__/LocaleBasic.vue create mode 100644 packages/opendesign/src/locale/__demo__/TheIndex.vue diff --git a/packages/docs/src/lang/en-US.ts b/packages/docs/src/lang/en-US.ts index 9df6479b..2b83d673 100644 --- a/packages/docs/src/lang/en-US.ts +++ b/packages/docs/src/lang/en-US.ts @@ -1,13 +1,7 @@ export default { - components: { - component: 'Component', - }, - header: { - globalSettings: 'Global settings', - home: 'Home', - theme: 'Theme', - }, - dev: { - devEnv: 'Dev env' - } + locale: 'en-US', + 'components.component': 'component', + 'header.globalSettings': 'global settings', + 'header.home': 'home', + 'dev.devEnv': 'dev env' }; diff --git a/packages/docs/src/lang/index.ts b/packages/docs/src/lang/index.ts index 3cda6de2..dc104d90 100644 --- a/packages/docs/src/lang/index.ts +++ b/packages/docs/src/lang/index.ts @@ -1,22 +1,17 @@ import { useLocale, useI18n, addLocale } from '@opensig/opendesign'; import { computed } from 'vue'; // @opensig/opendesign 未暴露语言包,因此通过路径添加 -import zhCn from '@components/locale/lang/zh-cn'; import enUS from '@components/locale/lang/en-us'; import enUSPortal from './en-US'; import zhCNPortal from './zh-CN'; -export const messages = { - 'en-US': { - ...enUS, - ...enUSPortal, - }, - 'zh-CN': { - ...zhCn, - ...zhCNPortal, - }, -}; -export type LocaleT = keyof typeof messages; +addLocale(enUS, { overwrite: true }); +addLocale(enUSPortal, { overwrite: true }); +addLocale(zhCNPortal, { overwrite: true }); + + + +export type LocaleT = 'zh-CN' | 'en-US'; type LocaleItemT = { value: LocaleT; label: string }; export const locales: Array = [ { @@ -40,4 +35,3 @@ export const changeLocale = (l: LocaleT) => { document.cookie = `${LOCALE_COOKIE_KEY}=${l}; path=/`; }; -addLocale(messages, { overwrite: true }); diff --git a/packages/docs/src/lang/zh-CN.ts b/packages/docs/src/lang/zh-CN.ts index 461840e4..b1305974 100644 --- a/packages/docs/src/lang/zh-CN.ts +++ b/packages/docs/src/lang/zh-CN.ts @@ -1,13 +1,7 @@ export default { - components: { - component: '组件', - }, - header: { - globalSettings: '全局设置', - home: '首页', - theme: '主题', - }, - dev: { - devEnv: '开发环境', - }, + locale: 'zh-CN', + 'components.component': '组件', + 'header.globalSettings': '全局设置', + 'header.home': '首页', + 'dev.devEnv': '开发环境', }; diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json index 25426853..838e2ab8 100644 --- a/packages/docs/tsconfig.json +++ b/packages/docs/tsconfig.json @@ -22,6 +22,9 @@ ], "@components/*": [ "../opendesign/src/*" + ], + "@opensig/opendesign": [ + "../opendesign/src/index.ts" ] } }, diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue new file mode 100644 index 00000000..b1c76cfa --- /dev/null +++ b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue @@ -0,0 +1,21 @@ + + + diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue b/packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue new file mode 100644 index 00000000..bfe39a01 --- /dev/null +++ b/packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue @@ -0,0 +1,60 @@ + + + diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue b/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue deleted file mode 100644 index 913b48f4..00000000 --- a/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/packages/opendesign/src/config-provider/__demo__/TheChild.vue b/packages/opendesign/src/config-provider/__demo__/TheChild.vue index 5b5ad218..786f02a5 100644 --- a/packages/opendesign/src/config-provider/__demo__/TheChild.vue +++ b/packages/opendesign/src/config-provider/__demo__/TheChild.vue @@ -5,7 +5,9 @@ const { t, locale } = useI18n(); diff --git a/packages/opendesign/src/config-provider/__demo__/TheIndex.vue b/packages/opendesign/src/config-provider/__demo__/TheIndex.vue index a6286ff0..a91649d0 100644 --- a/packages/opendesign/src/config-provider/__demo__/TheIndex.vue +++ b/packages/opendesign/src/config-provider/__demo__/TheIndex.vue @@ -1,9 +1,11 @@ diff --git a/packages/opendesign/src/config-provider/types.ts b/packages/opendesign/src/config-provider/types.ts index 2d2035ee..eb52c612 100644 --- a/packages/opendesign/src/config-provider/types.ts +++ b/packages/opendesign/src/config-provider/types.ts @@ -14,6 +14,9 @@ export const configProviderProps = { locale: { type: Object as PropType, }, + /** + * Link组件全局配置 + */ link: { type: Object as PropType, }, diff --git a/packages/opendesign/src/locale/__demo__/LocaleBasic.vue b/packages/opendesign/src/locale/__demo__/LocaleBasic.vue new file mode 100644 index 00000000..377d2570 --- /dev/null +++ b/packages/opendesign/src/locale/__demo__/LocaleBasic.vue @@ -0,0 +1,49 @@ + + + + diff --git a/packages/opendesign/src/locale/__demo__/TheIndex.vue b/packages/opendesign/src/locale/__demo__/TheIndex.vue new file mode 100644 index 00000000..063e9fdd --- /dev/null +++ b/packages/opendesign/src/locale/__demo__/TheIndex.vue @@ -0,0 +1,9 @@ + + + diff --git a/packages/opendesign/src/locale/index.ts b/packages/opendesign/src/locale/index.ts index 556bfe5a..e85bf7aa 100644 --- a/packages/opendesign/src/locale/index.ts +++ b/packages/opendesign/src/locale/index.ts @@ -1,13 +1,12 @@ import { log } from '../_utils/log'; -import { getValueByPath } from '../_utils/helper'; -import { isString } from '../_utils/is'; +import { isArray, isString, isUndefined } from '../_utils/is'; import { configProviderInjectKey } from '../config-provider'; -import { computed, inject, ref } from 'vue'; +import { computed, inject, ref, getCurrentInstance } from 'vue'; import zhCN from './lang/zh-cn'; -import { LanguageT, i18nLanguages } from './types'; +import { OpendesignLanguageT, i18nLanguagesT } from './types'; const currentLocal = ref('zh-CN'); -const i18nLanguage = ref>({ +const i18nLanguage = ref>({ 'zh-CN': zhCN, }); @@ -17,15 +16,31 @@ const i18nLanguage = ref>({ * @param opts 配置 */ export function addLocale( - locale: i18nLanguages, + locale: i18nLanguagesT[], opts?: { overwrite?: boolean; } ) { - Object.keys(locale).forEach((key) => { - if (!i18nLanguage.value[key] || opts?.overwrite) { - i18nLanguage.value[key] = locale[key]; + const locales = isArray(locale) ? locale : [locale]; + + locales.forEach(lc => { + const currLocal = lc.locale; + if (!currLocal) { + return; + } + + if (!i18nLanguage.value[currLocal]) { + i18nLanguage.value[currLocal] = { + locale: lc.locale + }; } + + Object.keys(lc).forEach((key) => { + const k = key as keyof OpendesignLanguageT; + if (!i18nLanguage.value[currLocal][k] || opts?.overwrite) { + i18nLanguage.value[currLocal][k] = lc[key]; + } + }); }); } @@ -36,14 +51,16 @@ export function addLocale( */ export function useLocale(localeKey: string) { if (!i18nLanguage.value[localeKey]) { - log.warn(`no ${localeKey} languages found`); + log.warn(`no '${localeKey}' languages configed`); return; } currentLocal.value = localeKey; } export function useI18n() { - const configProvider = inject(configProviderInjectKey, {}); + const instance = getCurrentInstance(); + // 判断当前是否在组件环境下,如果是,则优先取configProvider的值 + const configProvider = instance ? inject(configProviderInjectKey, {}) : null; const languages = computed(() => { return configProvider?.locale ?? i18nLanguage.value[currentLocal.value]; }); @@ -54,7 +71,7 @@ export function useI18n() { log.warn('no languages configed'); return ''; } - const value = getValueByPath(languages.value, key); + const value = languages.value[key]; // 处理变量替换 if (args.length > 0 && isString(value)) { @@ -63,6 +80,10 @@ export function useI18n() { }); } + if (isUndefined(value)) { + log.warn(`Cannot translate the value of keypath '${key}'`); + } + return value; }; diff --git a/packages/opendesign/src/locale/lang/en-us.ts b/packages/opendesign/src/locale/lang/en-us.ts index 743ab8a1..ddddbc31 100644 --- a/packages/opendesign/src/locale/lang/en-us.ts +++ b/packages/opendesign/src/locale/lang/en-us.ts @@ -1,29 +1,24 @@ export default { locale: 'en-US', - common: { - empty: 'No Data', - loading: 'Loading...', - }, - pagination: { - goto: 'Go to', - page: 'Page', - countPerPage: '/page', - total: 'Total: {0}', - }, - upload: { - buttonLabel: 'Upload', - drag: 'Click or drag file to this area to upload', - dragHover: 'Release to upload', - retry: 'Click to retry', - delete: 'Delete', - preview: 'Preview', - edit: 'Edit', - }, - select: { - cancel: 'Cancel', - confirm: 'Ok', - }, - input: { - limit: '{0}/{1}', - }, + // common + 'common.empty': 'No Data', + 'common.loading': 'Loading...', + // pagination + 'pagination.goto': 'Go to', + 'pagination.page': 'Page', + 'pagination.countPerPage': '/page', + 'pagination.total': 'Total: {0}', + // upload + 'upload.buttonLabel': 'Upload', + 'upload.drag': 'Click or drag file to this area to upload', + 'upload.dragHover': 'Release to upload', + 'upload.retry': 'Click to retry', + 'upload.delete': 'Delete', + 'upload.preview': 'Preview', + 'upload.edit': 'Edit', + // select + 'select.cancel': 'Cancel', + 'select.confirm': 'Ok', + // input + 'input.limit': '{0}/{1}', }; diff --git a/packages/opendesign/src/locale/lang/zh-cn.ts b/packages/opendesign/src/locale/lang/zh-cn.ts index 5080395e..ee5809ca 100644 --- a/packages/opendesign/src/locale/lang/zh-cn.ts +++ b/packages/opendesign/src/locale/lang/zh-cn.ts @@ -1,29 +1,24 @@ export default { locale: 'zh-CN', - common: { - empty: '暂无数据', - loading: '加载中...', - }, - pagination: { - goto: '前往', - page: '页', - countPerPage: '条/页', - total: '共 {0} 条', - }, - upload: { - buttonLabel: '点击上传', - drag: '点击或拖拽文件到此处上传', - dragHover: '释放文件并开始上传', - retry: '点击重试', - delete: '删除', - preview: '预览', - edit: '编辑', - }, - select: { - cancel: '取消', - confirm: '确定', - }, - input: { - limit: '{0}/{1}', - }, + // common + 'common.empty': '暂无数据', + 'common.loading': '加载中...', + // pagination + 'pagination.goto': '前往', + 'pagination.page': '页', + 'pagination.countPerPage': '条/页', + 'pagination.total': '共 {0} 条', + // upload + 'upload.buttonLabel': '点击上传', + 'upload.drag': '点击或拖拽文件到此处上传', + 'upload.dragHover': '释放文件并开始上传', + 'upload.retry': '点击重试', + 'upload.delete': '删除', + 'upload.preview': '预览', + 'upload.edit': '编辑', + // select + 'select.cancel': '取消', + 'select.confirm': '确定', + // input + 'input.limit': '{0}/{1}', }; diff --git a/packages/opendesign/src/locale/types.ts b/packages/opendesign/src/locale/types.ts index 46606d31..a4bb0a6d 100644 --- a/packages/opendesign/src/locale/types.ts +++ b/packages/opendesign/src/locale/types.ts @@ -1,30 +1,24 @@ -export interface LanguageT { +export interface OpendesignLanguageT { locale: string; - common?: { - empty: string; - loading: string; - }; - pagination?: { - goto: string; - page: string; - countPerPage: string; - total: string; - }; - upload?: { - buttonLabel: string; - drag: string; - dragHover: string; - retry: string; - delete: string; - preview: string; - edit: string; - }; - select?: { - cancel: string; - confirm: string; - }; - input?: { - limit: string; - }; + 'common.empty'?: string; + 'common.loading'?: string; + 'pagination.goto'?: string; + 'pagination.page'?: string; + 'pagination.countPerPage'?: string; + 'pagination.total'?: string; + 'upload.buttonLabel'?: string; + 'upload.drag'?: string; + 'upload.dragHover'?: string; + 'upload.retry'?: string; + 'upload.delete'?: string; + 'upload.preview'?: string; + 'upload.edit'?: string; + 'select.cancel'?: string; + 'select.confirm'?: string; + 'input.limit'?: string; +} + +export interface i18nLanguagesT { + locale: string; + [k: string]: string } -export type i18nLanguages = Record; diff --git a/packages/opendesign/src/pagination/OPagination.vue b/packages/opendesign/src/pagination/OPagination.vue index d753599c..ebc5708e 100644 --- a/packages/opendesign/src/pagination/OPagination.vue +++ b/packages/opendesign/src/pagination/OPagination.vue @@ -94,6 +94,12 @@ const selectPage = (page: number | string) => { const clickPageBtn = (Increase: boolean) => { updatePageAndPageSize(Increase ? pageVal.value! + 1 : pageVal.value! - 1, pageSize.value!); }; + +const moreVisible = ref<{ left: boolean; right: boolean }>({ + left: false, + right: false, +}); + // 点击收起的更多箭头 const moreClick = (more: PagerItemT) => { const { value, list } = more; @@ -132,10 +138,6 @@ const selectPageSize = (val: SelectValueT) => { updatePageAndPageSize(newPage, size); }; -const moreVisible = ref<{ left: boolean; right: boolean }>({ - left: false, - right: false, -}); // 选择弹层中的页码 const onMoreItemClick = (item: number, value: number | 'left' | 'right') => { diff --git a/packages/portal/src/components/TheHeader.vue b/packages/portal/src/components/TheHeader.vue index ed11fbc5..a5ff2336 100644 --- a/packages/portal/src/components/TheHeader.vue +++ b/packages/portal/src/components/TheHeader.vue @@ -69,9 +69,7 @@ const locales = [ }, ]; -addLocale({ - 'en-US': enUS, -}); +addLocale(enUS); const { locale } = useI18n(); const currentLocale = computed(() => { diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index 098fc730..657cae2a 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -11,6 +11,14 @@ export const routes = [ title: '通用', }, }, + { + path: '/i18n', + name: 'i18n', + component: () => import('@opendesign-src/locale/__demo__/TheIndex.vue'), + meta: { + title: '多语言', + }, + }, { path: '/virtual-list', name: 'virtual-list', -- Gitee From 84a18196d1940ab823bd1b667e8b16c89c941c48 Mon Sep 17 00:00:00 2001 From: devin Date: Tue, 5 Aug 2025 10:37:47 +0800 Subject: [PATCH 16/17] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendesign/src/config-provider/__demo__/ConfigLink.vue | 4 ++-- .../opendesign/src/config-provider/__demo__/ConfigLocale.vue | 2 +- packages/opendesign/src/config-provider/__demo__/TheIndex.vue | 2 +- packages/opendesign/src/locale/__demo__/LocaleBasic.vue | 1 - packages/opendesign/src/locale/index.ts | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue index b1c76cfa..63e5f1e4 100644 --- a/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue +++ b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue @@ -11,9 +11,9 @@ const linkConfig: LinkConfigT = { };