diff --git a/README.md b/README.md index 840afd6f9..43cb40d4a 100644 --- a/README.md +++ b/README.md @@ -53,19 +53,19 @@ Soybean Admin 是一个基于 Vue3、Vite、TypeScript、Naive UI 的免费中 - [x] 引入ECharts替换AntV G2Plot - [ ] 多页签:同一页面支持多个Tab(应用场景:不同query参数的详情页面在不同tab展示) - [ ] 缓存主题配置 -- [ ] 最近功能的有关文档更新 +- [ ] 添加锁屏组件、全局Iframe组件 - [ ] 性能优化(优化递归函数) - [ ] 精简版(新分支thin) +- [ ] 文档完善 - [ ] 表单、表格示例 -- [ ] 添加锁屏组件、全局Iframe组件 - [ ] 示例页面完善 -- [ ] 其他UI版本 - [ ] element-plus版本 +- [ ] 其他UI版本 - [ ] soybean-admin cli工具(选择不同UI) -- [ ] 前端可视化创建路由页面 - [ ] soybean-admin 后台服务java版: [soybean-admin-java](https://github.com/honghuangdc/soybean-admin-java) - [ ] soybean-admin 后台服务go版: [soybean-admin-go](https://github.com/honghuangdc/soybean-admin-go) - [ ] soybean-admin 后台服务nodejs版: [soybean-admin-nestjs](https://github.com/honghuangdc/soybean-admin-nestjs) +- [ ] 前端可视化创建路由页面 ## 安装使用 diff --git a/package.json b/package.json index 4dd19a722..bac1006c4 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "@better-scroll/core": "^2.4.2", - "@soybeanjs/vue-admin-layout": "^1.0.3", + "@soybeanjs/vue-admin-layout": "^1.0.4", "@soybeanjs/vue-admin-tab": "^1.0.1", "@vueuse/core": "^8.4.2", "axios": "^0.27.2", @@ -54,15 +54,15 @@ "@amap/amap-jsapi-types": "^0.0.8", "@commitlint/cli": "^16.2.4", "@commitlint/config-conventional": "^16.2.4", - "@iconify/json": "^2.1.39", + "@iconify/json": "^2.1.40", "@iconify/vue": "^3.2.1", "@types/bmapgl": "^0.0.5", "@types/crypto-js": "^4.1.1", "@types/node": "^17.0.31", "@types/qs": "^6.9.7", "@types/ua-parser-js": "^0.7.36", - "@typescript-eslint/eslint-plugin": "^5.22.0", - "@typescript-eslint/parser": "^5.22.0", + "@typescript-eslint/eslint-plugin": "^5.23.0", + "@typescript-eslint/parser": "^5.23.0", "@vitejs/plugin-vue": "^2.3.2", "@vitejs/plugin-vue-jsx": "^1.3.10", "@vue/eslint-config-prettier": "^7.0.0", @@ -95,7 +95,7 @@ "vite-plugin-compression": "^0.5.1", "vite-plugin-html": "^3.2.0", "vite-plugin-mock": "^2.9.6", - "vue-tsc": "^0.34.11", + "vue-tsc": "^0.34.12", "vueuc": "^0.4.32" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5978e4798..8e629fd5f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,17 +5,17 @@ specifiers: '@better-scroll/core': ^2.4.2 '@commitlint/cli': ^16.2.4 '@commitlint/config-conventional': ^16.2.4 - '@iconify/json': ^2.1.39 + '@iconify/json': ^2.1.40 '@iconify/vue': ^3.2.1 - '@soybeanjs/vue-admin-layout': ^1.0.3 + '@soybeanjs/vue-admin-layout': ^1.0.4 '@soybeanjs/vue-admin-tab': ^1.0.1 '@types/bmapgl': ^0.0.5 '@types/crypto-js': ^4.1.1 '@types/node': ^17.0.31 '@types/qs': ^6.9.7 '@types/ua-parser-js': ^0.7.36 - '@typescript-eslint/eslint-plugin': ^5.22.0 - '@typescript-eslint/parser': ^5.22.0 + '@typescript-eslint/eslint-plugin': ^5.23.0 + '@typescript-eslint/parser': ^5.23.0 '@vitejs/plugin-vue': ^2.3.2 '@vitejs/plugin-vue-jsx': ^1.3.10 '@vue/eslint-config-prettier': ^7.0.0 @@ -66,14 +66,14 @@ specifiers: vite-plugin-mock: ^2.9.6 vue: 3.2.33 vue-router: ^4.0.15 - vue-tsc: ^0.34.11 + vue-tsc: ^0.34.12 vueuc: ^0.4.32 wangeditor: ^4.7.15 xgplayer: ^2.31.6 dependencies: '@better-scroll/core': 2.4.2 - '@soybeanjs/vue-admin-layout': 1.0.3_vue@3.2.33 + '@soybeanjs/vue-admin-layout': 1.0.4_vue@3.2.33 '@soybeanjs/vue-admin-tab': 1.0.1_vue@3.2.33 '@vueuse/core': 8.4.2_vue@3.2.33 axios: 0.27.2 @@ -100,15 +100,15 @@ devDependencies: '@amap/amap-jsapi-types': 0.0.8 '@commitlint/cli': 16.2.4 '@commitlint/config-conventional': 16.2.4 - '@iconify/json': 2.1.39 + '@iconify/json': 2.1.40 '@iconify/vue': 3.2.1_vue@3.2.33 '@types/bmapgl': 0.0.5 '@types/crypto-js': 4.1.1 '@types/node': 17.0.31 '@types/qs': 6.9.7 '@types/ua-parser-js': 0.7.36 - '@typescript-eslint/eslint-plugin': 5.22.0_9817cbad956b8aa5d1e3d9ec99e4a1e4 - '@typescript-eslint/parser': 5.22.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/eslint-plugin': 5.23.0_17b6d2ce7129f0b36f2c30ae592c16e7 + '@typescript-eslint/parser': 5.23.0_eslint@8.15.0+typescript@4.6.4 '@vitejs/plugin-vue': 2.3.2_vite@2.9.8+vue@3.2.33 '@vitejs/plugin-vue-jsx': 1.3.10 '@vue/eslint-config-prettier': 7.0.0_eslint@8.15.0+prettier@2.6.2 @@ -141,7 +141,7 @@ devDependencies: vite-plugin-compression: 0.5.1_vite@2.9.8 vite-plugin-html: 3.2.0_vite@2.9.8 vite-plugin-mock: 2.9.6_mockjs@1.1.0+vite@2.9.8 - vue-tsc: 0.34.11_typescript@4.6.4 + vue-tsc: 0.34.12_typescript@4.6.4 vueuc: 0.4.32_vue@3.2.33 packages: @@ -706,8 +706,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@iconify/json/2.1.39: - resolution: {integrity: sha512-iz5ZpJJ8e6s9H+6ZS+JJ8PSZOblDTsT6XFAnzF+kDavuixmWGsS+RJab2Vg4FGXogrrPqlcUmeV2fMgM9gSvKA==} + /@iconify/json/2.1.40: + resolution: {integrity: sha512-2G5zYwr4Fl9jQpjzmd+j/+u81pmvJ6SkxVjk+Al1UM4EyE+ByuODHSE2Srp85cEiM9v4YAzkkgVSkleufgPLeQ==} dependencies: '@iconify/types': 1.1.0 pathe: 0.2.0 @@ -828,8 +828,8 @@ packages: picomatch: 2.3.1 dev: true - /@soybeanjs/vue-admin-layout/1.0.3_vue@3.2.33: - resolution: {integrity: sha512-ech9q8XOkQ2rIxF5D2p4ikzV/S5yk08N2sWuQWC6QSzF3c8seG89i+Pl+k0NZRkKlnD3ntz9Ai0VqxET/jhMdw==} + /@soybeanjs/vue-admin-layout/1.0.4_vue@3.2.33: + resolution: {integrity: sha512-G+Kh2XHYH1I0PgEmOXsBjO68VJLqPi5DnSeao+ZuLLTXIT3cuEFwtp7XNraOWzSLsqipmIHzemHuVxVsWU83cw==} peerDependencies: '@vue/composition-api': ^1.4.6 vue: ^2.0.0 || >=3.0.0 @@ -837,7 +837,7 @@ packages: '@vue/composition-api': optional: true dependencies: - '@unocss/reset': 0.31.17 + '@unocss/reset': 0.33.2 colord: 2.9.2 css-render: 0.15.9 vue: 3.2.33 @@ -944,8 +944,8 @@ packages: resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} dev: true - /@typescript-eslint/eslint-plugin/5.22.0_9817cbad956b8aa5d1e3d9ec99e4a1e4: - resolution: {integrity: sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg==} + /@typescript-eslint/eslint-plugin/5.23.0_17b6d2ce7129f0b36f2c30ae592c16e7: + resolution: {integrity: sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -955,10 +955,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.22.0_eslint@8.15.0+typescript@4.6.4 - '@typescript-eslint/scope-manager': 5.22.0 - '@typescript-eslint/type-utils': 5.22.0_eslint@8.15.0+typescript@4.6.4 - '@typescript-eslint/utils': 5.22.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/parser': 5.23.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/scope-manager': 5.23.0 + '@typescript-eslint/type-utils': 5.23.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/utils': 5.23.0_eslint@8.15.0+typescript@4.6.4 debug: 4.3.4 eslint: 8.15.0 functional-red-black-tree: 1.0.1 @@ -971,8 +971,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.22.0_eslint@8.15.0+typescript@4.6.4: - resolution: {integrity: sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==} + /@typescript-eslint/parser/5.23.0_eslint@8.15.0+typescript@4.6.4: + resolution: {integrity: sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -981,9 +981,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.22.0 - '@typescript-eslint/types': 5.22.0 - '@typescript-eslint/typescript-estree': 5.22.0_typescript@4.6.4 + '@typescript-eslint/scope-manager': 5.23.0 + '@typescript-eslint/types': 5.23.0 + '@typescript-eslint/typescript-estree': 5.23.0_typescript@4.6.4 debug: 4.3.4 eslint: 8.15.0 typescript: 4.6.4 @@ -991,16 +991,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.22.0: - resolution: {integrity: sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA==} + /@typescript-eslint/scope-manager/5.23.0: + resolution: {integrity: sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.22.0 - '@typescript-eslint/visitor-keys': 5.22.0 + '@typescript-eslint/types': 5.23.0 + '@typescript-eslint/visitor-keys': 5.23.0 dev: true - /@typescript-eslint/type-utils/5.22.0_eslint@8.15.0+typescript@4.6.4: - resolution: {integrity: sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA==} + /@typescript-eslint/type-utils/5.23.0_eslint@8.15.0+typescript@4.6.4: + resolution: {integrity: sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1009,7 +1009,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.22.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/utils': 5.23.0_eslint@8.15.0+typescript@4.6.4 debug: 4.3.4 eslint: 8.15.0 tsutils: 3.21.0_typescript@4.6.4 @@ -1018,13 +1018,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.22.0: - resolution: {integrity: sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw==} + /@typescript-eslint/types/5.23.0: + resolution: {integrity: sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.22.0_typescript@4.6.4: - resolution: {integrity: sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==} + /@typescript-eslint/typescript-estree/5.23.0_typescript@4.6.4: + resolution: {integrity: sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1032,8 +1032,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.22.0 - '@typescript-eslint/visitor-keys': 5.22.0 + '@typescript-eslint/types': 5.23.0 + '@typescript-eslint/visitor-keys': 5.23.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1044,16 +1044,16 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.22.0_eslint@8.15.0+typescript@4.6.4: - resolution: {integrity: sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ==} + /@typescript-eslint/utils/5.23.0_eslint@8.15.0+typescript@4.6.4: + resolution: {integrity: sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.22.0 - '@typescript-eslint/types': 5.22.0 - '@typescript-eslint/typescript-estree': 5.22.0_typescript@4.6.4 + '@typescript-eslint/scope-manager': 5.23.0 + '@typescript-eslint/types': 5.23.0 + '@typescript-eslint/typescript-estree': 5.23.0_typescript@4.6.4 eslint: 8.15.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.15.0 @@ -1062,11 +1062,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.22.0: - resolution: {integrity: sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg==} + /@typescript-eslint/visitor-keys/5.23.0: + resolution: {integrity: sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.22.0 + '@typescript-eslint/types': 5.23.0 eslint-visitor-keys: 3.3.0 dev: true @@ -1155,13 +1155,8 @@ packages: '@unocss/preset-mini': 0.33.2 dev: true - /@unocss/reset/0.31.17: - resolution: {integrity: sha512-g3+bqtM6LetSEJ5NYhi2P4vdP8yVLUQLbNZUdMtggcmHXTY08ISWaJKWmnHptrO13rtRoQ+l9gFc4Y7kRpD7NA==} - dev: false - /@unocss/reset/0.33.2: resolution: {integrity: sha512-ArrkGVr8OEfCHZ5p3IiCi2sv5qXRJZ45zzhCr6vuwP+7+RbgMiyDKhV5oYqIGu7oxFesgXxeD+nRe/v4tKL33g==} - dev: true /@unocss/scope/0.33.2: resolution: {integrity: sha512-Pt267ptQwvdefq16dJxxCKTsWEiIdSfUfYv1KLsr7BQB/AFiiJLuRNn1rjUCrdYrLlA7riav9zdVk85x/u0PAg==} @@ -1226,32 +1221,32 @@ packages: vue: 3.2.33 dev: true - /@volar/code-gen/0.34.11: - resolution: {integrity: sha512-A4w+y+zP8qCDFyZ0KIm2oydRerp14a+IAYXro9wLt0LLvvqUGHEu/6y87uAj6TDqiX4OL/W8r1cEdhOJqFrBlA==} + /@volar/code-gen/0.34.12: + resolution: {integrity: sha512-5GAPsSjScnfMmMoh9qLW7CWQjjnT0fTUsPWnDMMjKIOqQF9J5mOyo7rprt1VzX63zwayqFfx7V8W3EVNhUCE3w==} dependencies: - '@volar/source-map': 0.34.11 + '@volar/source-map': 0.34.12 dev: true - /@volar/source-map/0.34.11: - resolution: {integrity: sha512-ZsNZqFPUDDL1y6hK0ok7EriFb3CnCeapTLQrziTAbi3yOhcE4yM4G59XtRzc1i9EB+RXscm9a6Q6TgzD5KvoeA==} + /@volar/source-map/0.34.12: + resolution: {integrity: sha512-07imKws1cz9g3eo0VWXdioNfc1eCjqwK7GsxVuYSc7OCzKASt9PywUW+F39QGB9g2Kewof+PjCVIPeGqGRECTA==} dev: true - /@volar/vue-code-gen/0.34.11: - resolution: {integrity: sha512-r/tnLd1eyy/PI0fBUYU7hKXkCyHb0JqBidTiADrazzkYMraRcwL6JNLOj/D7Pk75W0ObzlMUfHJdrAuxKvAHRg==} + /@volar/vue-code-gen/0.34.12: + resolution: {integrity: sha512-PFcft62eIvQvcB6H2Z88fouTu2JmYwimORziFGr3LlGriQUEVmyDtqddtb+E+j2wGChtLkh6hf1py94C5VpI/Q==} dependencies: - '@volar/code-gen': 0.34.11 - '@volar/source-map': 0.34.11 + '@volar/code-gen': 0.34.12 + '@volar/source-map': 0.34.12 '@vue/compiler-core': 3.2.33 '@vue/compiler-dom': 3.2.33 '@vue/shared': 3.2.33 dev: true - /@volar/vue-typescript/0.34.11: - resolution: {integrity: sha512-pZkIeCPIjRRc/Oj9uxyOk6UvE43ecD71B/CSbmtiMU9sqrSwpP8cdDr/B/cqm1jwebkChTaa1gLodNHS8BOLuw==} + /@volar/vue-typescript/0.34.12: + resolution: {integrity: sha512-mY5cZ2OFOKt1HcCuoX1ViEsccltX3mdACk/FAjrSZTrilTdVHI1zkmQlrpCSnjmE1qowd8I6YoVt7THCaVrHdg==} dependencies: - '@volar/code-gen': 0.34.11 - '@volar/source-map': 0.34.11 - '@volar/vue-code-gen': 0.34.11 + '@volar/code-gen': 0.34.12 + '@volar/source-map': 0.34.12 + '@volar/vue-code-gen': 0.34.12 '@vue/compiler-sfc': 3.2.33 '@vue/reactivity': 3.2.33 dev: true @@ -1334,8 +1329,8 @@ packages: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 eslint-plugin-vue: ^8.0.1 dependencies: - '@typescript-eslint/eslint-plugin': 5.22.0_9817cbad956b8aa5d1e3d9ec99e4a1e4 - '@typescript-eslint/parser': 5.22.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/eslint-plugin': 5.23.0_17b6d2ce7129f0b36f2c30ae592c16e7 + '@typescript-eslint/parser': 5.23.0_eslint@8.15.0+typescript@4.6.4 eslint: 8.15.0 eslint-plugin-vue: 8.7.1_eslint@8.15.0 vue-eslint-parser: 8.3.0_eslint@8.15.0 @@ -6203,13 +6198,13 @@ packages: vue: 3.2.33 dev: false - /vue-tsc/0.34.11_typescript@4.6.4: - resolution: {integrity: sha512-5NM4oR8U/c3mTlJ9aNXbXkAGT2bhq+FJpCgZDqOKPpCjW5QDx1BXPC+nrBXNMwg8TRL6pK4fl+x+hrK97Siq/Q==} + /vue-tsc/0.34.12_typescript@4.6.4: + resolution: {integrity: sha512-CmuqLXHEW5UvS8UpT2RYom5MzOWBD142PLXxDX0ARdZ/u1oLobA3od4XY2XZACQYCFCzjTvfD1H5wrWwiGwoUA==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/vue-typescript': 0.34.11 + '@volar/vue-typescript': 0.34.12 typescript: 4.6.4 dev: true diff --git a/src/layouts/BasicLayout/index.vue b/src/layouts/BasicLayout/index.vue index 010e975c6..4813f442b 100644 --- a/src/layouts/BasicLayout/index.vue +++ b/src/layouts/BasicLayout/index.vue @@ -10,6 +10,7 @@ :sider-width="siderWidth" :sider-collapsed-width="siderCollapsedWidth" :sider-collapse="app.siderCollapse" + :add-main-overflow-hidden="addMainOverflowHidden" :fixed-footer="theme.footer.fixed" >