diff --git a/packages/docs/icons/svgs/fill/copy.svg b/packages/docs/icons/svgs/fill/copy.svg index d701b8b81385c43b3579bba4ee9dd68a88e99d0c..e549a76b6c52acef178d1536aff585888824b00a 100644 --- a/packages/docs/icons/svgs/fill/copy.svg +++ b/packages/docs/icons/svgs/fill/copy.svg @@ -1,4 +1,4 @@ - - + + + \ No newline at end of file diff --git a/packages/docs/plugins/injectDemoAndApi.ts b/packages/docs/plugins/injectDemoAndApi.ts index 97fdd90acce96ee4fab41746f70b75e713cb54c4..d122393b0d372de75394bb5dcaf6a168a6ceb2c1 100644 --- a/packages/docs/plugins/injectDemoAndApi.ts +++ b/packages/docs/plugins/injectDemoAndApi.ts @@ -127,6 +127,8 @@ const transformMdEntry = async ( path: string; }[] = []; const lang = getLangByFileName(id); + // 避免引入同一个文件出现同名符号 + let importedId = 0; // 将 注释替换成 // 将 注释替换成 let newCode = await asyncReplace(code, //gi, async (match) => { @@ -144,24 +146,26 @@ const transformMdEntry = async ( } const demoFile = join(dirname(id), ...dirs, `./__case__/${fileName}.vue`); if (await fsp.stat(demoFile).catch(() => false)) { + importedId++; + const importedName = `AutoInject${fileName}${importedId}`; if (directive === 'case') { imported.push({ - default: `AutoInject${fileName}`, + default: importedName, path: demoFile, }); - return ``; + return ``; } else { // 此处只导入 usage 指令指定的 vue 模块。该 vue 模块的还需在 transformVueDemo 函数中转换 imported.push({ path: demoFile, - default: `AutoInject${fileName}`, + default: importedName, }); const usageFileId = demoFile.replace(/\\/g, '/'); if (mode === 'dev' && viteDevServer) { viteDevServer.watcher.emit('change', usageFileId); } usageFiles.set(usageFileId, activeThemes); - return ``; + return `<${importedName} />`; } } return match[0]; diff --git a/packages/docs/src/components/CodeContainer.vue b/packages/docs/src/components/CodeContainer.vue index ec3cd215acfc31a0c87857a647d9ac53abad23bd..87b772f0dba5b42c1e0a0240af9517f5755749e8 100644 --- a/packages/docs/src/components/CodeContainer.vue +++ b/packages/docs/src/components/CodeContainer.vue @@ -28,14 +28,14 @@ const docConfig = inject('docs-config'); -
{{ props.lang }}
- - - - + + + + + {{ props.lang }}
@@ -45,78 +45,75 @@ const docConfig = inject('docs-config'); background-color: var(--o-color-fill2); position: relative; - .lang-mark, .operation-block { position: absolute; z-index: 2; color: var(--o-color-info3); - } - .lang-mark { - top: var(--o3-gap-3); - right: var(--o3-gap-4); - } - .operation-block { - display: none; top: var(--o3-gap-2); right: var(--o3-gap-4); - :deep(.o-btn) { + display: flex; + align-items: center; + .operation-btn { --btn-height: var(--o3-icon_size-l); - --btn-icon-size: var(--o3-icon_size-m); - & + .o-btn { - margin-left: var(--o3-gap-2); - } - } - } - - &:hover { - .lang-mark { - display: none; - } - .operation-block { - display: block; + --btn-icon-size: calc(var(--btn-height) - 8px); + background-color: var(--o-color-fill2); + margin-right: var(--o3-gap-2); } } :deep(pre) { padding: var(--o3-gap-3) var(--o3-gap-5); margin: 0; - width: max-content; + } +} +@media (hover: hover) { + .operation-btn { + display: none; + } + .code-container:hover { + .operation-btn { + display: inline-flex; + } + .lang-mark { + display: none; + } } } .code-container-scroller { max-height: 70vh; } -:deep(pre[data-linenumber-start]) { - position: relative; - padding-left: calc(2em + var(--o3-gap-4)); - white-space: pre-wrap; - width: auto; - counter-reset: line-number var(--linenumber-start, 1); - &::before { - content: ''; - position: absolute; - top: 0; - bottom: 0; - left: calc(2em + var(--o3-gap-4) - 4px); - width: 1px; - background-color: var(--o-color-control1); - } - .line { - counter-increment: line-number; - &:first-child { - counter-increment: none; - } +@include respond-to('>pad_v') { + :deep(pre[data-linenumber-start]) { + position: relative; + padding-left: calc(2em + var(--o3-gap-4)); + white-space: pre-wrap; + counter-reset: line-number var(--linenumber-start, 1); &::before { - content: counter(line-number); + content: ''; position: absolute; - left: 2em; - color: var(--o-color-info2); - transform: translateX(-100%); - user-select: none; - white-space: nowrap; + top: 0; + bottom: 0; + left: calc(2em + var(--o3-gap-4) - 4px); + width: 1px; + background-color: var(--o-color-control1); } - &:last-child::before { - content: none; + .line { + counter-increment: line-number; + &:first-child { + counter-increment: none; + } + &::before { + content: counter(line-number); + position: absolute; + left: 2em; + color: var(--o-color-info2); + transform: translate(-100%); + user-select: none; + white-space: nowrap; + } + &:last-child::before { + content: none; + } } } } diff --git a/packages/docs/src/components/DocConfigProvide.vue b/packages/docs/src/components/DocConfigProvide.vue index 816287a2b9e8ea6582ea4fec93002065a1aba435..6e202e4ca746e470ed695c62d1ffb54e5bb69b80 100644 --- a/packages/docs/src/components/DocConfigProvide.vue +++ b/packages/docs/src/components/DocConfigProvide.vue @@ -1,8 +1,32 @@ diff --git a/packages/docs/src/components/TheHeader.vue b/packages/docs/src/components/TheHeader.vue index d150590a48388f1d68e18de8f3eeae0fc2f820bc..12e7ca88d4734d3dabe99efb65fad3c29ffe42a4 100644 --- a/packages/docs/src/components/TheHeader.vue +++ b/packages/docs/src/components/TheHeader.vue @@ -99,7 +99,7 @@ watch(locale, (newLocale, oldLocale) => { padding: 0 calc((100vw - var(--grid-full)) / 2); font-size: var(--o3-font_size-h3); line-height: var(--o3-line_height-h3); - background-color: rgba(var(--o-mixedgray-1), 0.9); + background-color: rgba(var(--o-mixedgray-1, var(--o-gray-1)), 0.9); box-shadow: var(--o-shadow-1); backdrop-filter: blur(5px); } diff --git a/packages/docs/src/utils/named.ts b/packages/docs/src/utils/named.ts new file mode 100644 index 0000000000000000000000000000000000000000..54e82ff07d921f5024a1554f4072da4e3374c7bb --- /dev/null +++ b/packages/docs/src/utils/named.ts @@ -0,0 +1,8 @@ +const hyphenateRE = /\B([A-Z])/g; +export function hyphenate(str: string) { + return str.replace(hyphenateRE, '-$1').toLowerCase(); +} +const camelizeRE = /-(\w)/g; +export function camelize(str: string) { + return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : '')); +} diff --git a/packages/docs/src/utils/theme.ts b/packages/docs/src/utils/theme.ts deleted file mode 100644 index 994f7727a7ca526216db9ac51c2f9bd67cfac8b1..0000000000000000000000000000000000000000 --- a/packages/docs/src/utils/theme.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ref, watchEffect } from 'vue'; -const THEME_KEY = '__theme__'; - -// 全局状态 -export const theme = ref(localStorage.getItem(THEME_KEY) || 'light'); -watchEffect(() => { - document.documentElement.dataset.oTheme = theme.value; - localStorage.setItem(THEME_KEY, theme.value); -}); diff --git a/packages/opendesign/src/card/OCard.vue b/packages/opendesign/src/card/OCard.vue index bbfcf4ff27cbb1f47f2962f28e95e4995f77c669..95ab9390b766d051cb766dfe4ce493c3f6194ea1 100644 --- a/packages/opendesign/src/card/OCard.vue +++ b/packages/opendesign/src/card/OCard.vue @@ -29,6 +29,10 @@ const isTitleLimited = computed(() => { const isDetailLimited = computed(() => { return !isUndefined(props.detailMaxRow); }); + +const hasCover = computed(() => { + return Boolean(slots.cover || props.cover); +});