@nuxt/devtools-ui-kit 0.8.5 → 1.0.0-beta.1
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/dist/components/NBadge.vue +5 -0
- package/dist/components/NButton.vue +12 -4
- package/dist/components/NCheckbox.vue +1 -1
- package/dist/components/NDarkToggle.vue +0 -2
- package/dist/components/NDrawer.vue +77 -0
- package/dist/components/NLink.vue +17 -9
- package/dist/components/NNavbar.vue +33 -0
- package/dist/components/NSelect.vue +3 -2
- package/dist/components/NSplitPane.vue +82 -0
- package/dist/components/NTextInput.vue +1 -0
- package/dist/module.json +1 -1
- package/dist/unocss.mjs +16 -5
- package/package.json +21 -20
- package/dist/components/NIconButton.vue +0 -25
- package/dist/components/NTextExternalLink.vue +0 -24
|
@@ -3,10 +3,14 @@
|
|
|
3
3
|
// @ts-ignore tsconfig
|
|
4
4
|
import { NuxtLink } from '#components'
|
|
5
5
|
|
|
6
|
-
defineProps<{
|
|
6
|
+
withDefaults(defineProps<{
|
|
7
7
|
to?: string
|
|
8
8
|
icon?: string
|
|
9
|
-
|
|
9
|
+
border?: boolean
|
|
10
|
+
disabled?: boolean
|
|
11
|
+
}>(), {
|
|
12
|
+
border: true,
|
|
13
|
+
})
|
|
10
14
|
</script>
|
|
11
15
|
|
|
12
16
|
<template>
|
|
@@ -14,10 +18,14 @@ defineProps<{
|
|
|
14
18
|
:is="to ? NuxtLink : 'button'"
|
|
15
19
|
:to="to"
|
|
16
20
|
v-bind="$attrs"
|
|
17
|
-
class="
|
|
21
|
+
:class="[
|
|
22
|
+
{ 'n-button-base active:n-button-active focus-visible:n-focus-base hover:n-button-hover': border },
|
|
23
|
+
{ 'n-icon-button': !$slots.default },
|
|
24
|
+
]"
|
|
25
|
+
class="n-button n-transition n-disabled:n-disabled"
|
|
18
26
|
>
|
|
19
27
|
<slot name="icon">
|
|
20
|
-
<NIcon v-if="icon" :icon="icon" class="n-button-icon" />
|
|
28
|
+
<NIcon v-if="icon" :icon="icon" :class="{ 'n-button-icon': $slots.default }" />
|
|
21
29
|
</slot>
|
|
22
30
|
<slot />
|
|
23
31
|
</Component>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
import { onClickOutside, useElementSize } from '@vueuse/core'
|
|
4
|
+
|
|
5
|
+
const props = withDefaults(defineProps<{
|
|
6
|
+
modelValue?: boolean
|
|
7
|
+
top?: HTMLElement | string
|
|
8
|
+
left?: HTMLElement | string
|
|
9
|
+
autoClose?: boolean
|
|
10
|
+
transition?: 'right' | 'bottom' | 'top'
|
|
11
|
+
}>(), {
|
|
12
|
+
transition: 'right',
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
const emit = defineEmits<{
|
|
16
|
+
(e: 'close'): void
|
|
17
|
+
}>()
|
|
18
|
+
|
|
19
|
+
const el = ref<HTMLElement>()
|
|
20
|
+
|
|
21
|
+
const { height } = useElementSize(() => props.top as HTMLElement, undefined, { box: 'border-box' })
|
|
22
|
+
|
|
23
|
+
const width = typeof props.left === 'string' && props.left.startsWith('#')
|
|
24
|
+
? document.querySelector(props.left)?.getBoundingClientRect().width
|
|
25
|
+
: useElementSize(() => props.left as HTMLElement, undefined, { box: 'border-box' }).width
|
|
26
|
+
|
|
27
|
+
onClickOutside(el, () => {
|
|
28
|
+
if (props.modelValue && props.autoClose)
|
|
29
|
+
emit('close')
|
|
30
|
+
}, {
|
|
31
|
+
ignore: ['a', 'button', 'summary', '[role="dialog"]'],
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
const transitionType = {
|
|
35
|
+
right: {
|
|
36
|
+
'enter-from-class': 'transform translate-x-1/1',
|
|
37
|
+
'leave-to-class': 'transform translate-x-1/1',
|
|
38
|
+
},
|
|
39
|
+
top: {
|
|
40
|
+
'enter-from-class': 'transform translate-y--1/1',
|
|
41
|
+
'leave-to-class': 'transform translate-y--1/1',
|
|
42
|
+
},
|
|
43
|
+
bottom: {
|
|
44
|
+
'enter-from-class': 'transform translate-y-1/1',
|
|
45
|
+
'leave-to-class': 'transform translate-y-1/1',
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<template>
|
|
51
|
+
<Transition
|
|
52
|
+
v-bind="transitionType[transition]"
|
|
53
|
+
enter-active-class="duration-200 ease-in"
|
|
54
|
+
enter-to-class="opacity-100"
|
|
55
|
+
leave-active-class="duration-200 ease-out"
|
|
56
|
+
leave-from-class="opacity-100"
|
|
57
|
+
>
|
|
58
|
+
<div
|
|
59
|
+
v-if="modelValue"
|
|
60
|
+
ref="el"
|
|
61
|
+
:border="`${transition === 'right' ? 'l' : transition === 'bottom' ? 't' : 'b'} base`"
|
|
62
|
+
flex="~ col gap-1"
|
|
63
|
+
:class="{ 'right-0': transition === 'right' || transition === 'bottom' }"
|
|
64
|
+
absolute bottom-0 z-10 z-20 of-auto text-sm n-glass-effect
|
|
65
|
+
:style="{
|
|
66
|
+
top: transition === 'bottom' ? 'auto' : `${height}px`,
|
|
67
|
+
left: transition === 'right' && !width ? 'auto' : `${width}px`,
|
|
68
|
+
}"
|
|
69
|
+
v-bind="$attrs"
|
|
70
|
+
>
|
|
71
|
+
<NButton absolute right-2 top-2 z-20 text-xl icon="carbon-close" :border="false" @click="$emit('close')" />
|
|
72
|
+
<div relative h-full w-full of-auto>
|
|
73
|
+
<slot />
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</Transition>
|
|
77
|
+
</template>
|
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
|
|
3
|
-
// @ts-ignore tsconfig
|
|
4
|
-
import { NuxtLink } from '#components'
|
|
2
|
+
import { computed } from 'vue'
|
|
5
3
|
|
|
6
|
-
defineProps<{
|
|
4
|
+
const props = defineProps<{
|
|
7
5
|
to?: string
|
|
8
6
|
href?: string
|
|
9
7
|
target?: string
|
|
8
|
+
underline?: boolean
|
|
10
9
|
}>()
|
|
10
|
+
|
|
11
|
+
const link = computed(() => props.href || props.to)
|
|
11
12
|
</script>
|
|
12
13
|
|
|
13
14
|
<template>
|
|
14
|
-
<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
<NuxtLink
|
|
16
|
+
v-bind="link ? {
|
|
17
|
+
href: link,
|
|
18
|
+
target,
|
|
19
|
+
rel: target === '_blank' ? 'noopener noreferrer' : null,
|
|
20
|
+
} : {}"
|
|
21
|
+
:class="{ 'n-link n-transition hover:n-link-hover n-link-base': link || underline }"
|
|
18
22
|
>
|
|
19
23
|
<slot />
|
|
20
|
-
|
|
24
|
+
<div
|
|
25
|
+
v-if="link && target === '_blank'"
|
|
26
|
+
i-carbon:arrow-up-right translate-y--1 text-xs op50
|
|
27
|
+
/>
|
|
28
|
+
</NuxtLink>
|
|
21
29
|
</template>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
defineProps<{
|
|
3
|
+
search?: string
|
|
4
|
+
noPadding?: boolean
|
|
5
|
+
}>()
|
|
6
|
+
|
|
7
|
+
const emit = defineEmits<{
|
|
8
|
+
(event: 'update:search', value: string): void
|
|
9
|
+
}>()
|
|
10
|
+
|
|
11
|
+
function update(event: any) {
|
|
12
|
+
emit('update:search', event.target.value)
|
|
13
|
+
}
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<div flex="~ col gap2" border="b base" flex-1 n-navbar-glass :class="[{ p4: !noPadding }]">
|
|
18
|
+
<div flex="~ gap4" items-center>
|
|
19
|
+
<slot v-if="search !== undefined" name="search">
|
|
20
|
+
<NTextInput
|
|
21
|
+
placeholder="Search..."
|
|
22
|
+
icon="carbon-search"
|
|
23
|
+
n="primary" flex-auto
|
|
24
|
+
:class="{ 'px-5 py-2': !noPadding }"
|
|
25
|
+
:value="search"
|
|
26
|
+
@input="update"
|
|
27
|
+
/>
|
|
28
|
+
</slot>
|
|
29
|
+
<slot name="actions" />
|
|
30
|
+
</div>
|
|
31
|
+
<slot />
|
|
32
|
+
</div>
|
|
33
|
+
</template>
|
|
@@ -21,12 +21,13 @@ const input = useVModel(props, 'modelValue', emit, { passive: true })
|
|
|
21
21
|
|
|
22
22
|
<template>
|
|
23
23
|
<div
|
|
24
|
-
class="n-select flex flex items-center border
|
|
24
|
+
class="n-select flex flex items-center border rounded px-2 py-1 focus-within:n-focus-base focus-within:border-context n-bg-base"
|
|
25
|
+
:class="disabled ? 'border-gray:10' : 'n-border-base'"
|
|
25
26
|
>
|
|
26
27
|
<slot name="icon">
|
|
27
28
|
<NIcon v-if="icon" :icon="icon" class="mr-0.4em text-1.1em op50" />
|
|
28
29
|
</slot>
|
|
29
|
-
<select v-model="input" :disabled="disabled" class="w-full flex-auto n-bg-base !outline-none">
|
|
30
|
+
<select v-model="input" :disabled="disabled" class="w-full flex-auto n-bg-base !outline-none" :class="disabled ? 'appearance-none' : ''">
|
|
30
31
|
<option v-if="placeholder" value="" disabled hidden>
|
|
31
32
|
{{ placeholder }}
|
|
32
33
|
</option>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, ref } from 'vue'
|
|
3
|
+
import { useLocalStorage } from '@vueuse/core'
|
|
4
|
+
import { Pane, Splitpanes } from 'splitpanes'
|
|
5
|
+
|
|
6
|
+
import 'splitpanes/dist/splitpanes.css'
|
|
7
|
+
|
|
8
|
+
const props = withDefaults(defineProps<{
|
|
9
|
+
/**
|
|
10
|
+
* The key to use for storing the pane sizes in localStorage.
|
|
11
|
+
*/
|
|
12
|
+
storageKey?: string
|
|
13
|
+
stateKey?: string
|
|
14
|
+
leftSize?: number
|
|
15
|
+
minSize?: number
|
|
16
|
+
horizontal?: boolean
|
|
17
|
+
}>(), {
|
|
18
|
+
stateKey: 'nuxt-devtools-panels-state',
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
const state = useLocalStorage<Record<string, number>>(props.stateKey, {} as any, { listenToStorageChanges: false })
|
|
22
|
+
|
|
23
|
+
const DEFAULT = 30
|
|
24
|
+
|
|
25
|
+
const key = props.storageKey
|
|
26
|
+
const size = key
|
|
27
|
+
? computed({
|
|
28
|
+
get: () => state.value[key] || props.leftSize || DEFAULT,
|
|
29
|
+
set: (v) => { state.value[key] = v },
|
|
30
|
+
})
|
|
31
|
+
: ref(props.leftSize || DEFAULT)
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<template>
|
|
35
|
+
<Splitpanes :horizontal="horizontal" h-full of-hidden @resize="size = $event[0].size">
|
|
36
|
+
<Pane h-full class="of-auto!" :size="size" :min-size="$slots.right ? (minSize || 10) : 100">
|
|
37
|
+
<slot name="left" />
|
|
38
|
+
</Pane>
|
|
39
|
+
<Pane v-if="$slots.right" relative h-full class="of-auto!" :min-size="minSize || 10">
|
|
40
|
+
<slot name="right" />
|
|
41
|
+
</Pane>
|
|
42
|
+
</Splitpanes>
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<style>
|
|
46
|
+
.splitpanes__splitter {
|
|
47
|
+
position: relative;
|
|
48
|
+
}
|
|
49
|
+
.splitpanes__splitter:before {
|
|
50
|
+
position: absolute;
|
|
51
|
+
left: 0;
|
|
52
|
+
top: 0;
|
|
53
|
+
transition: .2s ease;
|
|
54
|
+
content: '';
|
|
55
|
+
transition: opacity 0.4s;
|
|
56
|
+
z-index: 1;
|
|
57
|
+
}
|
|
58
|
+
.splitpanes__splitter:hover:before {
|
|
59
|
+
background: #8881;
|
|
60
|
+
opacity: 1;
|
|
61
|
+
}
|
|
62
|
+
.splitpanes--vertical>.splitpanes__splitter {
|
|
63
|
+
min-width: 0 !important;
|
|
64
|
+
width: 0 !important;
|
|
65
|
+
@apply border-r border-base
|
|
66
|
+
}
|
|
67
|
+
.splitpanes--horizontal>.splitpanes__splitter {
|
|
68
|
+
min-height: 0 !important;
|
|
69
|
+
height: 0 !important;
|
|
70
|
+
@apply border-t border-base
|
|
71
|
+
}
|
|
72
|
+
.splitpanes--vertical>.splitpanes__splitter:before {
|
|
73
|
+
left: -5px;
|
|
74
|
+
right: -4px;
|
|
75
|
+
height: 100%;
|
|
76
|
+
}
|
|
77
|
+
.splitpanes--horizontal>.splitpanes__splitter:before {
|
|
78
|
+
top: -5px;
|
|
79
|
+
bottom: -4px;
|
|
80
|
+
width: 100%;
|
|
81
|
+
}
|
|
82
|
+
</style>
|
package/dist/module.json
CHANGED
package/dist/unocss.mjs
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { parseColor } from '@unocss/preset-mini/utils';
|
|
2
2
|
import { theme } from '@unocss/preset-mini';
|
|
3
3
|
import { fonts } from '@unocss/preset-mini/rules';
|
|
4
|
-
import { mergeDeep, presetUno, presetAttributify, presetTypography, presetIcons, transformerDirectives, transformerVariantGroup } from 'unocss';
|
|
4
|
+
import { mergeDeep, presetUno, presetAttributify, presetTypography, presetIcons, presetWebFonts, transformerDirectives, transformerVariantGroup } from 'unocss';
|
|
5
5
|
|
|
6
6
|
function unocssPreset() {
|
|
7
7
|
return {
|
|
8
8
|
name: "@nuxt/devtools-ui-kit",
|
|
9
9
|
theme: mergeDeep(theme, {
|
|
10
10
|
colors: {
|
|
11
|
+
brand: "#00DC82",
|
|
12
|
+
primary: "#099e61",
|
|
11
13
|
context: "rgba(var(--nui-c-context),%alpha)"
|
|
12
|
-
},
|
|
13
|
-
fontFamily: {
|
|
14
|
-
sans: "Avenir, Helvetica, Arial, sans-serif"
|
|
15
14
|
}
|
|
16
15
|
}),
|
|
17
16
|
rules: [
|
|
@@ -120,10 +119,16 @@ function unocssPreset() {
|
|
|
120
119
|
"n-code-block": "dark:bg-[#121212] bg-white",
|
|
121
120
|
// icon-button
|
|
122
121
|
"n-icon-button": "aspect-1/1 w-1.6em h-1.6em flex items-center justify-center rounded op50 hover:op100 hover:n-bg-active",
|
|
122
|
+
// badge
|
|
123
|
+
"n-badge-base": "bg-context/10 text-context rounded whitespace-nowrap select-none",
|
|
124
|
+
"n-badge": "n-badge-base mx-0.5 px-1.5 py-0.5 text-xs",
|
|
123
125
|
// loading
|
|
124
126
|
"n-loading": "flex h-full w-full justify-center items-center",
|
|
125
127
|
"n-panel-grids": "n-panel-grids-light dark:n-panel-grids-dark",
|
|
126
|
-
"n-panel-grids-center": "n-panel-grids flex flex-col h-full gap-2 items-center justify-center"
|
|
128
|
+
"n-panel-grids-center": "n-panel-grids flex flex-col h-full gap-2 items-center justify-center",
|
|
129
|
+
// glass
|
|
130
|
+
"n-glass-effect": "backdrop-blur-6 bg-white/80 dark:bg-[#151515]/90",
|
|
131
|
+
"n-navbar-glass": "sticky z-10 top-0 n-glass-effect"
|
|
127
132
|
}
|
|
128
133
|
};
|
|
129
134
|
}
|
|
@@ -144,6 +149,12 @@ function extendUnocssOptions(user = {}) {
|
|
|
144
149
|
}
|
|
145
150
|
// ...(user?.icons || {})
|
|
146
151
|
}),
|
|
152
|
+
presetWebFonts({
|
|
153
|
+
fonts: {
|
|
154
|
+
sans: "DM Sans",
|
|
155
|
+
mono: "DM Mono"
|
|
156
|
+
}
|
|
157
|
+
}),
|
|
147
158
|
unocssPreset(),
|
|
148
159
|
...user.presets || []
|
|
149
160
|
],
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nuxt/devtools-ui-kit",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "1.0.0-beta.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "nuxt/devtools",
|
|
7
7
|
"exports": {
|
|
@@ -23,40 +23,41 @@
|
|
|
23
23
|
"dist"
|
|
24
24
|
],
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@nuxt/devtools": "0.
|
|
26
|
+
"@nuxt/devtools": "1.0.0-beta.1"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@iconify-json/carbon": "^1.1.21",
|
|
30
30
|
"@iconify-json/logos": "^1.1.37",
|
|
31
31
|
"@iconify-json/ri": "^1.1.12",
|
|
32
|
-
"@iconify-json/tabler": "^1.1.
|
|
33
|
-
"@nuxt/kit": "^3.7.
|
|
32
|
+
"@iconify-json/tabler": "^1.1.94",
|
|
33
|
+
"@nuxt/kit": "^3.7.4",
|
|
34
34
|
"@nuxtjs/color-mode": "^3.3.0",
|
|
35
|
-
"@unocss/core": "^0.56.
|
|
36
|
-
"@unocss/nuxt": "^0.56.
|
|
37
|
-
"@unocss/preset-attributify": "^0.56.
|
|
38
|
-
"@unocss/preset-icons": "^0.56.
|
|
39
|
-
"@unocss/preset-mini": "^0.56.
|
|
40
|
-
"@unocss/reset": "^0.56.
|
|
41
|
-
"@vueuse/core": "^10.
|
|
42
|
-
"@vueuse/integrations": "^10.
|
|
43
|
-
"@vueuse/nuxt": "^10.
|
|
35
|
+
"@unocss/core": "^0.56.5",
|
|
36
|
+
"@unocss/nuxt": "^0.56.5",
|
|
37
|
+
"@unocss/preset-attributify": "^0.56.5",
|
|
38
|
+
"@unocss/preset-icons": "^0.56.5",
|
|
39
|
+
"@unocss/preset-mini": "^0.56.5",
|
|
40
|
+
"@unocss/reset": "^0.56.5",
|
|
41
|
+
"@vueuse/core": "^10.5.0",
|
|
42
|
+
"@vueuse/integrations": "^10.5.0",
|
|
43
|
+
"@vueuse/nuxt": "^10.5.0",
|
|
44
44
|
"defu": "^6.1.2",
|
|
45
|
-
"focus-trap": "^7.5.
|
|
46
|
-
"
|
|
45
|
+
"focus-trap": "^7.5.3",
|
|
46
|
+
"splitpanes": "^3.1.5",
|
|
47
|
+
"unocss": "^0.56.5",
|
|
47
48
|
"v-lazy-show": "^0.2.3",
|
|
48
|
-
"@nuxt/devtools-kit": "0.
|
|
49
|
+
"@nuxt/devtools-kit": "1.0.0-beta.1"
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
|
-
"nuxt": "^3.7.
|
|
52
|
-
"@nuxt/devtools": "0.
|
|
52
|
+
"nuxt": "^3.7.4",
|
|
53
|
+
"@nuxt/devtools": "1.0.0-beta.1"
|
|
53
54
|
},
|
|
54
55
|
"publishConfig": {
|
|
55
56
|
"access": "public"
|
|
56
57
|
},
|
|
57
58
|
"scripts": {
|
|
58
|
-
"build": "nuxt-build-module",
|
|
59
|
-
"stub": "nuxt-build-module --stub",
|
|
59
|
+
"build": "nuxt-build-module build",
|
|
60
|
+
"stub": "nuxt-build-module build --stub",
|
|
60
61
|
"dev": "nuxi dev playground",
|
|
61
62
|
"playground:build": "nuxi generate playground"
|
|
62
63
|
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
// eslint-disable-next-line ts/prefer-ts-expect-error
|
|
3
|
-
// @ts-ignore tsconfig
|
|
4
|
-
import { NuxtLink } from '#components'
|
|
5
|
-
|
|
6
|
-
const props = defineProps<{
|
|
7
|
-
to?: string
|
|
8
|
-
icon: string
|
|
9
|
-
disabled?: boolean
|
|
10
|
-
}>()
|
|
11
|
-
</script>
|
|
12
|
-
|
|
13
|
-
<template>
|
|
14
|
-
<Component
|
|
15
|
-
:is="to ? NuxtLink : 'button'"
|
|
16
|
-
:to="to"
|
|
17
|
-
v-bind="$attrs"
|
|
18
|
-
class="n-transition n-icon-button"
|
|
19
|
-
:class="{
|
|
20
|
-
'n-disabled op10!': props.disabled,
|
|
21
|
-
}"
|
|
22
|
-
>
|
|
23
|
-
<NIcon :icon="props.icon" />
|
|
24
|
-
</Component>
|
|
25
|
-
</template>
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import NLink from './NLink.vue'
|
|
3
|
-
|
|
4
|
-
defineProps<{
|
|
5
|
-
link?: string
|
|
6
|
-
}>()
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<template>
|
|
10
|
-
<component
|
|
11
|
-
:is="link ? NLink : 'div'"
|
|
12
|
-
v-bind="link ? {
|
|
13
|
-
href: link,
|
|
14
|
-
target: '_blank',
|
|
15
|
-
rel: 'noopener noreferrer',
|
|
16
|
-
} : {}"
|
|
17
|
-
>
|
|
18
|
-
<slot />
|
|
19
|
-
<div
|
|
20
|
-
v-if="link"
|
|
21
|
-
i-carbon:arrow-up-right translate-y--1 text-xs op50
|
|
22
|
-
/>
|
|
23
|
-
</component>
|
|
24
|
-
</template>
|