diff --git a/package.json b/package.json index 707e901a86a50ab57f3c549b74c194045170387b..349efb9d7ef84306e1feb60c59adabe605de0f55 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,7 @@ "dependencies": { "normalize.css": "catalog:css", "vue": "catalog:vue", - "vue-router": "catalog:vue", - "@opensig/opendesign": "workspace:^" + "vue-router": "catalog:vue" }, "devDependencies": { "@rushstack/eslint-patch": "catalog:lint", diff --git a/packages/docs/plugins/markdown/popover.ts b/packages/docs/plugins/markdown/popover.ts index 047a17a09bb41e5b457fb1c78349828f1de927e4..bc6f5cde9e6fb5586a5438f325e2e8c96b3ba8c8 100644 --- a/packages/docs/plugins/markdown/popover.ts +++ b/packages/docs/plugins/markdown/popover.ts @@ -1,25 +1,33 @@ import { MarkdownItAsync } from 'markdown-it-async'; -import { escapeHtml } from 'markdown-it/lib/common/utils.mjs'; +const HTML_REPLACEMENTS = { + // 避免xss注入 + '<': '<', + '>': '>', + '"': '"', + "'": ''', +}; +function replaceCellChar(ch: string) { + return HTML_REPLACEMENTS[ch]; +} +function escapeHtml(value?: string) { + const HTML_ESCAPE_REPLACE_RE = /[<>"']/g; + return value ? value.replace(HTML_ESCAPE_REPLACE_RE, replaceCellChar) : ''; +} /** * markdown插件,通过 ^[标题]`内容` 语法,渲染popover,popover组件的target为 标题 * @param md markdown-it 实例 */ export default function popover(md: MarkdownItAsync) { // 定义正则表达式,匹配 ^[内容]`提示信息` 语法 - const popoverRegExp = /^\^\[([^\]]*)\](\(normal|primary|success|warning|danger\))?(`[^`]*`)?/; + const popoverRegExp = /^\^\[([^\]]*)\](?:\((normal|primary|success|warning|danger)\))?(`[^`]*`)?/; md.renderer.rules.popover = function (tokens, idx) { const token = tokens[idx]; const content = escapeHtml(token.content); const info = escapeHtml(token.info); - const target = (icon?: boolean) => - `${icon ? '' : ''}${content}`; - if (!info) { - return target(); - } return ` - + ${info} `; }; diff --git a/packages/docs/plugins/markdown/wrapCodeContainer.ts b/packages/docs/plugins/markdown/wrapCodeContainer.ts index 1f979b74836c05bc8086f9bb28887b8fddb60905..290a3507d42c1ffeedbd1b0397df89a0fa0c7e85 100644 --- a/packages/docs/plugins/markdown/wrapCodeContainer.ts +++ b/packages/docs/plugins/markdown/wrapCodeContainer.ts @@ -8,8 +8,10 @@ export default function wrapCodeContainer(md: MarkdownItAsync) { const fence = md.renderer.rules.fence; md.renderer.rules.fence = (tokens, idx, options, env, self) => { const token = tokens[idx]; + if (!token.attrGet('v-pre')) { + token.attrSet('v-pre', ''); + } const preCode = fence(tokens, idx, options, env, self); - return ` ${preCode} diff --git a/packages/docs/public/HarmonyOS_Hans_Medium.Bmj-cXYg.woff2 b/packages/docs/public/HarmonyOS_Hans_Medium.Bmj-cXYg.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..205ef04d277578649e63fc3be05f7e8933bcdfd4 Binary files /dev/null and b/packages/docs/public/HarmonyOS_Hans_Medium.Bmj-cXYg.woff2 differ diff --git a/packages/docs/public/HarmonyOS_Sans_Bold_Italic.Bvb9oWs-.woff2 b/packages/docs/public/HarmonyOS_Sans_Bold_Italic.Bvb9oWs-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5dbbba7a8923c7c2729b2acb3963a25b8d0f3eee Binary files /dev/null and b/packages/docs/public/HarmonyOS_Sans_Bold_Italic.Bvb9oWs-.woff2 differ diff --git a/packages/docs/scripts/generateApi.ts b/packages/docs/scripts/generateApi.ts index 8759d400c06268d651bad772f46248dac7e8402b..ca1ea2d6bc6c094458654e7938c8ae79605948be 100644 --- a/packages/docs/scripts/generateApi.ts +++ b/packages/docs/scripts/generateApi.ts @@ -16,7 +16,6 @@ const checker = createChecker(tsConfigPath, { noDeclarations: true, printer: { newLine: 1 }, }); -const CELL_ESCAPE_REPLACE_RE = /[<>"'\|]/g; const CELL_REPLACEMENTS = { // 避免xss注入 '<': '<', @@ -31,6 +30,7 @@ function replaceCellChar(ch: string) { return CELL_REPLACEMENTS[ch]; } function escapeTableValue(value?: string) { + const CELL_ESCAPE_REPLACE_RE = /[<>"'\|]/g; return value ? value.replace(CELL_ESCAPE_REPLACE_RE, replaceCellChar) : ''; } function cleanTableData(table: any[][]) { @@ -128,6 +128,9 @@ async function applyTempFixForSlot(filename: string, componentMeta: ComponentMet const terminalWidth = process.stdout.columns || 80; const progressBarLength = Math.min(Math.floor(terminalWidth / 4), 30); const pathReg = /\/(O.*)\.vue/; +const tagTypes = { + deprecated: '(warning)' +} glob('*/O*.vue', { cwd: srcDir, posix: true }).then((files) => { files.forEach(async (file, index) => { const fullPath = join(srcDir, file); @@ -163,7 +166,7 @@ glob('*/O*.vue', { cwd: srcDir, posix: true }).then((files) => { prop.tags.find((tag) => tag.name === lang)?.text || prop.description || '', prop.tags .filter((tag) => !excludeTag.includes(tag.name)) - .map((tag) => `^[${tag.name}]${tag.text ? `\`${tag.text}\`` : ''}`) + .map((tag) => `^[${tag.name}]${tagTypes[tag.name] || ''}${tag.text ? `\`${tag.text}\`` : ''}`) .join(' '), ]; }); @@ -185,7 +188,7 @@ glob('*/O*.vue', { cwd: srcDir, posix: true }).then((files) => { event.tags.find((tag) => tag.name === lang)?.text || event.description || '', event.tags .filter((tag) => !excludeTag.includes(tag.name)) - .map((tag) => `^[${tag.name}]${tag.text ? `\`${tag.text}\`` : ''}`) + .map((tag) => `^[${tag.name}]${tagTypes[tag.name] || ''}${tag.text ? `\`${tag.text}\`` : ''}`) .join(' '), ]; }); diff --git a/packages/docs/src/assets/style/markdown.scss b/packages/docs/src/assets/style/markdown.scss index 58a1309ace12169f3e3e45aa40f71e5f774d7242..65d65ddaa23e45316cbb18b843c6a3b3692764b6 100644 --- a/packages/docs/src/assets/style/markdown.scss +++ b/packages/docs/src/assets/style/markdown.scss @@ -12,7 +12,7 @@ [data-o-theme$='dark'] pre span { color: var(--shiki-dark); } -p + .code-container { +p + .code-container, p + .o-table { margin-top: 8px; } ol, diff --git a/packages/docs/src/components/DemoUsage.vue b/packages/docs/src/components/DemoUsage.vue index ae94c22a3ca94c51b2cb6b41c913feeb59de4d5e..5f591a093f843522291479b16c7c9f61802d0a43 100644 --- a/packages/docs/src/components/DemoUsage.vue +++ b/packages/docs/src/components/DemoUsage.vue @@ -266,12 +266,21 @@ Demo.DemoSource = () => { ); } }; -const docs = shallowReactive>({}); +const docs = shallowReactive>({}); watchEffect(() => { showcaseComponent.value = createShowcaseComponent(state, props.style); if (props.docs) { Object.keys(props.docs).forEach((key) => { - docs[key] = md.render(props.docs![key]); + const htmlCode = md.render(props.docs![key]); + try { + docs[key] = compileComponent(htmlCode); + } catch (e) { + docs[key] = htmlCode; + if (process.env.NODE_ENV === 'development') { + console.warn(e); + console.warn(`${key}:\n${htmlCode}`); + } + } }); } else { Object.keys(docs).forEach((key) => { diff --git a/packages/docs/src/main.ts b/packages/docs/src/main.ts index d2a82c5608857f23702d4719711994ff46c15e3a..0258ae706f3d593767cc0238685a74c381988cff 100644 --- a/packages/docs/src/main.ts +++ b/packages/docs/src/main.ts @@ -2,9 +2,9 @@ import { createApp } from 'vue'; import { createPinia } from 'pinia'; import 'normalize.css'; -import '@opensig/opendesign/es/index.css'; -import '@opensig/opendesign/es/_styles/light.token.css'; -import '@opensig/opendesign/es/_styles/dark.token.css'; +import '@opensig/opendesign/index.scss'; +import '@opensig/opendesign/_styles/light.token.css'; +import '@opensig/opendesign/_styles/dark.token.css'; import '@/assets/style/index'; import { router } from '@/router/index'; diff --git a/packages/docs/src/utils/compileComponent.ts b/packages/docs/src/utils/compileComponent.ts index 9f1a10ff912612a90f32d5adee8b1a1a9da8e730..61fb54d02b0cd95566bd611a780608f0855c6cf9 100644 --- a/packages/docs/src/utils/compileComponent.ts +++ b/packages/docs/src/utils/compileComponent.ts @@ -8,7 +8,7 @@ import { compile, type CompilerOptions } from '@vue/compiler-dom'; * @param options * @returns 组件 */ -export function compileComponent(template: string, ctx: any, options: Omit = {}): Vue.Component { +export function compileComponent(template: string, ctx: any = {}, options: Omit = {}): Vue.Component { const { code } = compile(template, { ...options, mode: 'function', diff --git a/packages/docs/vite.config.ts b/packages/docs/vite.config.ts index 888ba4740534cc941494a94661381ba83ec5eda6..7a6c99f3ae40a94be33826b46fe71e61411de77b 100644 --- a/packages/docs/vite.config.ts +++ b/packages/docs/vite.config.ts @@ -31,6 +31,7 @@ export default defineConfig({ '@/': `${path.resolve(__dirname, './src')}/`, '@components': path.resolve(__dirname, '../opendesign/src'), '@assets': path.resolve(__dirname, './src/assets'), + '@opensig/opendesign': path.resolve(__dirname, '../opendesign/src'), }, }, server: { diff --git a/packages/opendesign/src/_utils/types.ts b/packages/opendesign/src/_utils/types.ts index bbef724f589ceeb2c866df219544e5e5fee2eec9..ac7cdca8e4e88271d3342517e47ed1c8b2f3e820 100644 --- a/packages/opendesign/src/_utils/types.ts +++ b/packages/opendesign/src/_utils/types.ts @@ -21,8 +21,7 @@ export const SizeTypes = ['large', 'medium', 'small'] as const; export type SizeT = (typeof SizeTypes)[number]; // 圆角 -export type RoundT = 'pill' | string; - +export type RoundT = 'pill' | (string & {}); // 方向 export const DirectionTypes = ['h', 'v'] as const; export type DirectionT = (typeof DirectionTypes)[number]; diff --git a/packages/opendesign/tsconfig.json b/packages/opendesign/tsconfig.json index a70af1174bd54e822dc8048aacab8e6311f9867c..1e52bd19c2a608b0de6b8c260b5986ce801f2551 100644 --- a/packages/opendesign/tsconfig.json +++ b/packages/opendesign/tsconfig.json @@ -22,7 +22,9 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "baseUrl": "./", - "paths": {} + "paths": { + "@opensig/opendesign": ["./src"] + } }, "include": [ "src/**/*.ts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e59c68fde7e6bb690dddf7d9cc3a8bc8b8c7f6e3..d1c6c364e00d3a602d3c94cb6e418f6588c79f1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,9 +144,6 @@ importers: .: dependencies: - '@opensig/opendesign': - specifier: workspace:^ - version: link:packages/opendesign normalize.css: specifier: catalog:css version: 8.0.1