naive-ui
Version:
A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast
91 lines • 2.87 kB
JavaScript
import { computed, defineComponent, h, mergeProps } from 'vue';
import { useConfig, useTheme, useThemeClass } from "../../_mixins/index.mjs";
import { formatLength, warn } from "../../_utils/index.mjs";
import { iconLight } from "../styles/index.mjs";
import style from "./styles/index.cssr.mjs";
export const iconProps = Object.assign(Object.assign({}, useTheme.props), {
depth: [String, Number],
size: [Number, String],
color: String,
component: [Object, Function]
});
export const NIcon = defineComponent({
_n_icon__: true,
name: 'Icon',
inheritAttrs: false,
props: iconProps,
setup(props) {
const {
mergedClsPrefixRef,
inlineThemeDisabled
} = useConfig(props);
const themeRef = useTheme('Icon', '-icon', style, iconLight, props, mergedClsPrefixRef);
const cssVarsRef = computed(() => {
const {
depth
} = props;
const {
common: {
cubicBezierEaseInOut
},
self
} = themeRef.value;
if (depth !== undefined) {
const {
color,
[`opacity${depth}Depth`]: opacity
} = self;
return {
'--n-bezier': cubicBezierEaseInOut,
'--n-color': color,
'--n-opacity': opacity
};
}
return {
'--n-bezier': cubicBezierEaseInOut,
'--n-color': '',
'--n-opacity': ''
};
});
const themeClassHandle = inlineThemeDisabled ? useThemeClass('icon', computed(() => `${props.depth || 'd'}`), cssVarsRef, props) : undefined;
return {
mergedClsPrefix: mergedClsPrefixRef,
mergedStyle: computed(() => {
const {
size,
color
} = props;
return {
fontSize: formatLength(size),
color
};
}),
cssVars: inlineThemeDisabled ? undefined : cssVarsRef,
themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass,
onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender
};
},
render() {
var _a;
const {
$parent,
depth,
mergedClsPrefix,
component,
onRender,
themeClass
} = this;
if ((_a = $parent === null || $parent === void 0 ? void 0 : $parent.$options) === null || _a === void 0 ? void 0 : _a._n_icon__) {
warn('icon', 'don\'t wrap `n-icon` inside `n-icon`');
}
onRender === null || onRender === void 0 ? void 0 : onRender();
return h('i', mergeProps(this.$attrs, {
role: 'img',
class: [`${mergedClsPrefix}-icon`, themeClass, {
[`${mergedClsPrefix}-icon--depth`]: depth,
[`${mergedClsPrefix}-icon--color-transition`]: depth !== undefined
}],
style: [this.cssVars, this.mergedStyle]
}), component ? h(component) : this.$slots);
}
});